ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDA4NzYKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTM4IEBACitHSVQtVkVSU0lPTi1GSUxFCitnaXQKK2dpdC1hZGQKK2dpdC1hbQorZ2l0LWFubm90YXRlCitnaXQtYXBwbHkKK2dpdC1hcHBseW1ib3gKK2dpdC1hcHBseXBhdGNoCitnaXQtYXJjaGltcG9ydAorZ2l0LWJpc2VjdAorZ2l0LWJyYW5jaAorZ2l0LWNhdC1maWxlCitnaXQtY2hlY2stcmVmLWZvcm1hdAorZ2l0LWNoZWNrb3V0CitnaXQtY2hlY2tvdXQtaW5kZXgKK2dpdC1jaGVycnkKK2dpdC1jaGVycnktcGljaworZ2l0LWNsZWFuCitnaXQtY2xvbmUKK2dpdC1jbG9uZS1wYWNrCitnaXQtY29tbWl0CitnaXQtY29tbWl0LXRyZWUKK2dpdC1jb252ZXJ0LW9iamVjdHMKK2dpdC1jb3VudC1vYmplY3RzCitnaXQtY3ZzZXhwb3J0Y29tbWl0CitnaXQtY3ZzaW1wb3J0CitnaXQtY3Zzc2VydmVyCitnaXQtZGFlbW9uCitnaXQtZGlmZgorZ2l0LWRpZmYtZmlsZXMKK2dpdC1kaWZmLWluZGV4CitnaXQtZGlmZi1zdGFnZXMKK2dpdC1kaWZmLXRyZWUKK2dpdC1kZXNjcmliZQorZ2l0LWZldGNoCitnaXQtZmV0Y2gtcGFjaworZ2l0LWZpbmR0YWdzCitnaXQtZm10LW1lcmdlLW1zZworZ2l0LWZvcm1hdC1wYXRjaAorZ2l0LWZzY2stb2JqZWN0cworZ2l0LWdldC10YXItY29tbWl0LWlkCitnaXQtZ3JlcAorZ2l0LWhhc2gtb2JqZWN0CitnaXQtaHR0cC1mZXRjaAorZ2l0LWh0dHAtcHVzaAorZ2l0LWltYXAtc2VuZAorZ2l0LWluZGV4LXBhY2sKK2dpdC1pbml0LWRiCitnaXQtbG9jYWwtZmV0Y2gKK2dpdC1sb2cKK2dpdC1sb3N0LWZvdW5kCitnaXQtbHMtZmlsZXMKK2dpdC1scy1yZW1vdGUKK2dpdC1scy10cmVlCitnaXQtbWFpbGluZm8KK2dpdC1tYWlsc3BsaXQKK2dpdC1tZXJnZQorZ2l0LW1lcmdlLWJhc2UKK2dpdC1tZXJnZS1pbmRleAorZ2l0LW1lcmdlLXRyZWUKK2dpdC1tZXJnZS1vY3RvcHVzCitnaXQtbWVyZ2Utb25lLWZpbGUKK2dpdC1tZXJnZS1vdXJzCitnaXQtbWVyZ2UtcmVjdXJzaXZlCitnaXQtbWVyZ2UtcmVzb2x2ZQorZ2l0LW1lcmdlLXN0dXBpZAorZ2l0LW1rdGFnCitnaXQtbWt0cmVlCitnaXQtbmFtZS1yZXYKK2dpdC1tdgorZ2l0LXBhY2stcmVkdW5kYW50CitnaXQtcGFjay1vYmplY3RzCitnaXQtcGFyc2UtcmVtb3RlCitnaXQtcGF0Y2gtaWQKK2dpdC1wZWVrLXJlbW90ZQorZ2l0LXBydW5lCitnaXQtcHJ1bmUtcGFja2VkCitnaXQtcHVsbAorZ2l0LXB1c2gKK2dpdC1xdWlsdGltcG9ydAorZ2l0LXJlYWQtdHJlZQorZ2l0LXJlYmFzZQorZ2l0LXJlY2VpdmUtcGFjaworZ2l0LXJlbGluaworZ2l0LXJlcGFjaworZ2l0LXJlcG8tY29uZmlnCitnaXQtcmVxdWVzdC1wdWxsCitnaXQtcmVyZXJlCitnaXQtcmVzZXQKK2dpdC1yZXNvbHZlCitnaXQtcmV2LWxpc3QKK2dpdC1yZXYtcGFyc2UKK2dpdC1yZXZlcnQKK2dpdC1ybQorZ2l0LXNlbmQtZW1haWwKK2dpdC1zZW5kLXBhY2sKK2dpdC1zaC1zZXR1cAorZ2l0LXNoZWxsCitnaXQtc2hvcnRsb2cKK2dpdC1zaG93CitnaXQtc2hvdy1icmFuY2gKK2dpdC1zaG93LWluZGV4CitnaXQtc3NoLWZldGNoCitnaXQtc3NoLXB1bGwKK2dpdC1zc2gtcHVzaAorZ2l0LXNzaC11cGxvYWQKK2dpdC1zdGF0dXMKK2dpdC1zdHJpcHNwYWNlCitnaXQtc3ZuaW1wb3J0CitnaXQtc3ltYm9saWMtcmVmCitnaXQtdGFnCitnaXQtdGFyLXRyZWUKK2dpdC11bnBhY2stZmlsZQorZ2l0LXVucGFjay1vYmplY3RzCitnaXQtdXBkYXRlLWluZGV4CitnaXQtdXBkYXRlLXJlZgorZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbworZ2l0LXVwbG9hZC1wYWNrCitnaXQtdXBsb2FkLXRhcgorZ2l0LXZhcgorZ2l0LXZlcmlmeS1wYWNrCitnaXQtdmVyaWZ5LXRhZworZ2l0LXdoYXRjaGFuZ2VkCitnaXQtd3JpdGUtdHJlZQorZ2l0LWNvcmUtKi8/KgordGVzdC1kYXRlCit0ZXN0LWRlbHRhCit0ZXN0LWR1bXAtY2FjaGUtdHJlZQorY29tbW9uLWNtZHMuaAorKi50YXIuZ3oKKyouZHNjCisqLmRlYgorZ2l0LWNvcmUuc3BlYworKi5leGUKKyouW2FvXQorKi5weVtjb10KK2NvbmZpZy5tYWsKK2dpdC1ibGFtZQpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmODdjNAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcKQEAgLTAsMCArMSwzNjEgQEAKKworIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorIGlzIGNvbmNlcm5lZCBpcyBfdGhpc18gcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlIChpZSB2Miwgbm90CisgdjIuMiBvciB2My54IG9yIHdoYXRldmVyKSwgdW5sZXNzIGV4cGxpY2l0bHkgb3RoZXJ3aXNlIHN0YXRlZC4KKworIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorIGEgZ29vZCBpZGVhLCBJIGFsc28gYXNrIHRoYXQgcGVvcGxlIGludm9sdmVkIHdpdGggdGhlIHByb2plY3QgbWFrZQorIHRoZWlyIHByZWZlcmVuY2VzIGtub3duLiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgdHJ1c3QgbWUgdG8gbWFrZSB0aGF0CisgZGVjaXNpb24sIHlvdSBtaWdodCBub3RlIHNvIGluIHlvdXIgY29weXJpZ2h0IG1lc3NhZ2UsIGllIHNvbWV0aGluZworIGxpa2UKKworCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKwlhdCB0aGUgZGlzY3JldGlvbiBvZiBMaW51cy4KKworICBtaWdodCBhdm9pZCBpc3N1ZXMuIEJ1dCB3ZSBjYW4gYWxzbyBqdXN0IGRlY2lkZSB0byBzeW5jaHJvbml6ZSBhbmQKKyAgY29udGFjdCBhbGwgY29weXJpZ2h0IGhvbGRlcnMgb24gcmVjb3JkIGlmL3doZW4gdGhlIG9jY2FzaW9uIGFyaXNlcy4KKworCQkJTGludXMgVG9ydmFsZHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4N2M2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uLy5naXRpZ25vcmUKQEAgLTAsMCArMSw3IEBACisqLnhtbAorKi5odG1sCisqLjEKKyouNworaG93dG8taW5kZXgudHh0Citkb2MuZGVwCitSRUFETUUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMGVmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsMTExIEBACitNQU4xX1RYVD0gXAorCSQoZmlsdGVyLW91dCAkKGFkZHN1ZmZpeCAudHh0LCAkKEFSVElDTEVTKSAkKFNQX0FSVElDTEVTKSksIFwKKwkJJCh3aWxkY2FyZCBnaXQtKi50eHQpKSBcCisJZ2l0ay50eHQKK01BTjdfVFhUPWdpdC50eHQKKworRE9DX0hUTUw9JChwYXRzdWJzdCAlLnR4dCwlLmh0bWwsJChNQU4xX1RYVCkgJChNQU43X1RYVCkpCisKK0FSVElDTEVTID0gdHV0b3JpYWwKK0FSVElDTEVTICs9IHR1dG9yaWFsLTIKK0FSVElDTEVTICs9IGNvcmUtdHV0b3JpYWwKK0FSVElDTEVTICs9IGN2cy1taWdyYXRpb24KK0FSVElDTEVTICs9IGRpZmZjb3JlCitBUlRJQ0xFUyArPSBob3d0by1pbmRleAorQVJUSUNMRVMgKz0gcmVwb3NpdG9yeS1sYXlvdXQKK0FSVElDTEVTICs9IGhvb2tzCitBUlRJQ0xFUyArPSBldmVyeWRheQorQVJUSUNMRVMgKz0gZ2l0LXRvb2xzCisjIHdpdGggdGhlaXIgb3duIGZvcm1hdHRpbmcgcnVsZXMuCitTUF9BUlRJQ0xFUyA9IGdsb3NzYXJ5IGhvd3RvL3JldmVydC1icmFuY2gtcmViYXNlCisKK0RPQ19IVE1MICs9ICQocGF0c3Vic3QgJSwlLmh0bWwsJChBUlRJQ0xFUykgJChTUF9BUlRJQ0xFUykpCisKK0RPQ19NQU4xPSQocGF0c3Vic3QgJS50eHQsJS4xLCQoTUFOMV9UWFQpKQorRE9DX01BTjc9JChwYXRzdWJzdCAlLnR4dCwlLjcsJChNQU43X1RYVCkpCisKK3ByZWZpeD89JChIT01FKQorYmluPSQocHJlZml4KS9iaW4KK21hbmRpcj0kKHByZWZpeCkvbWFuCittYW4xPSQobWFuZGlyKS9tYW4xCittYW43PSQobWFuZGlyKS9tYW43CisjIERFU1RESVI9CisKK0lOU1RBTEw/PWluc3RhbGwKKworIworIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWlub3IgYnVnIGluIGFzY2lpZG9jLgorIyBUaGUgdmVyc2lvbiBhZnRlciA2LjAuMyBfd2lsbF8gaW5jbHVkZSB0aGUgcGF0Y2ggZm91bmQgaGVyZToKKyMgICBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWdpdCZtPTExMTU1ODc1NzIwMjI0MyZ3PTIKKyMKKyMgVW50aWwgdGhhdCB2ZXJzaW9uIGlzIHJlbGVhc2VkIHlvdSBtYXkgaGF2ZSB0byBhcHBseSB0aGUgcGF0Y2gKKyMgeW91cnNlbGYgLSB5ZXMsIGFsbCA2IGNoYXJhY3RlcnMgb2YgaXQhCisjCisKK2FsbDogaHRtbCBtYW4KKworaHRtbDogJChET0NfSFRNTCkKKworCittYW46IG1hbjEgbWFuNworbWFuMTogJChET0NfTUFOMSkKK21hbjc6ICQoRE9DX01BTjcpCisKK2luc3RhbGw6IG1hbgorCSQoSU5TVEFMTCkgLWQgLW03NTUgJChERVNURElSKSQobWFuMSkgJChERVNURElSKSQobWFuNykKKwkkKElOU1RBTEwpICQoRE9DX01BTjEpICQoREVTVERJUikkKG1hbjEpCisJJChJTlNUQUxMKSAkKERPQ19NQU43KSAkKERFU1RESVIpJChtYW43KQorCisKKyMKKyMgRGV0ZXJtaW5lICJpbmNsdWRlOjoiIGZpbGUgcmVmZXJlbmNlcyBpbiBhc2NpaWRvYyBmaWxlcy4KKyMKK2RvYy5kZXAgOiAkKHdpbGRjYXJkICoudHh0KSBidWlsZC1kb2NkZXAucGVybAorCXJtIC1mICRAKyAkQAorCXBlcmwgLi9idWlsZC1kb2NkZXAucGVybCA+JEArCisJbXYgJEArICRACisKKy1pbmNsdWRlIGRvYy5kZXAKKworZ2l0Ljc6IFJFQURNRQorCitSRUFETUU6IC4uL1JFQURNRQorCWNwICQ8ICRACisKKworY2xlYW46CisJcm0gLWYgKi54bWwgKi5odG1sICouMSAqLjcgaG93dG8taW5kZXgudHh0IGhvd3RvLyouaHRtbCBkb2MuZGVwIFJFQURNRQorCislLmh0bWwgOiAlLnR4dAorCWFzY2lpZG9jIC1iIHhodG1sMTEgLWQgbWFucGFnZSAtZiBhc2NpaWRvYy5jb25mICQ8CisKKyUuMSAlLjcgOiAlLnhtbAorCXhtbHRvIC1tIGNhbGxvdXRzLnhzbCBtYW4gJDwKKworJS54bWwgOiAlLnR4dAorCWFzY2lpZG9jIC1iIGRvY2Jvb2sgLWQgbWFucGFnZSAtZiBhc2NpaWRvYy5jb25mICQ8CisKK2dpdC5odG1sOiBnaXQudHh0IFJFQURNRQorCitnbG9zc2FyeS5odG1sIDogZ2xvc3NhcnkudHh0IHNvcnRfZ2xvc3NhcnkucGwKKwljYXQgJDwgfCBcCisJcGVybCBzb3J0X2dsb3NzYXJ5LnBsIHwgXAorCWFzY2lpZG9jIC1iIHhodG1sMTEgLSA+IGdsb3NzYXJ5Lmh0bWwKKworaG93dG8taW5kZXgudHh0OiBob3d0by1pbmRleC5zaCAkKHdpbGRjYXJkIGhvd3RvLyoudHh0KQorCXJtIC1mICRAKyAkQAorCXNoIC4vaG93dG8taW5kZXguc2ggJCh3aWxkY2FyZCBob3d0by8qLnR4dCkgPiRAKworCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUsJS5odG1sLCQoQVJUSUNMRVMpKSA6ICUuaHRtbCA6ICUudHh0CisJYXNjaWlkb2MgLWIgeGh0bWwxMSAkKi50eHQKKworV0VCRE9DX0RFU1QgPSAvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcworCiskKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKHdpbGRjYXJkIGhvd3RvLyoudHh0KSk6ICUuaHRtbCA6ICUudHh0CisJcm0gLWYgJEArICRACisJc2VkIC1lICcxLC9eJCQvZCcgJD8gfCBhc2NpaWRvYyAtYiB4aHRtbDExIC0gPiRAKworCW12ICRAKyAkQAorCitpbnN0YWxsLXdlYmRvYyA6IGh0bWwKKwlzaCAuL2luc3RhbGwtd2ViZG9jLnNoICQoV0VCRE9DX0RFU1QpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAxOTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwpAQCAtMCwwICsxLDMwNiBAQAorSSBzdGFydGVkIHJlYWRpbmcgb3ZlciB0aGUgU3VibWl0dGluZ1BhdGNoZXMgZG9jdW1lbnQgZm9yIExpbnV4CitrZXJuZWwsIHByaW1hcmlseSBiZWNhdXNlIEkgd2FudGVkIHRvIGhhdmUgYSBkb2N1bWVudCBzaW1pbGFyIHRvCitpdCBmb3IgdGhlIGNvcmUgR0lUIHRvIG1ha2Ugc3VyZSBwZW9wbGUgdW5kZXJzdGFuZCB3aGF0IHRoZXkgYXJlCitkb2luZyB3aGVuIHRoZXkgd3JpdGUgIlNpZ25lZC1vZmYtYnkiIGxpbmUuCisKK0J1dCB0aGUgcGF0Y2ggc3VibWlzc2lvbiByZXF1aXJlbWVudHMgYXJlIGEgbG90IG1vcmUgcmVsYXhlZAoraGVyZSBvbiB0aGUgdGVjaG5pY2FsL2NvbnRlbnRzIGZyb250LCBiZWNhdXNlIHRoZSBjb3JlIEdJVCBpcwordGhvdXNhbmQgdGltZXMgc21hbGxlciA7LSkuICBTbyBoZXJlIGlzIG9ubHkgdGhlIHJlbGV2YW50IGJpdHMuCisKKworKDEpIE1ha2Ugc2VwYXJhdGUgY29tbWl0cyBmb3IgbG9naWNhbGx5IHNlcGFyYXRlIGNoYW5nZXMuCisKK1VubGVzcyB5b3VyIHBhdGNoIGlzIHJlYWxseSB0cml2aWFsLCB5b3Ugc2hvdWxkIG5vdCBiZSBzZW5kaW5nCitvdXQgYSBwYXRjaCB0aGF0IHdhcyBnZW5lcmF0ZWQgYmV0d2VlbiB5b3VyIHdvcmtpbmcgdHJlZSBhbmQKK3lvdXIgY29tbWl0IGhlYWQuICBJbnN0ZWFkLCBhbHdheXMgbWFrZSBhIGNvbW1pdCB3aXRoIGNvbXBsZXRlCitjb21taXQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgYSBzZXJpZXMgb2YgcGF0Y2hlcyBmcm9tIHlvdXIKK3JlcG9zaXRvcnkuICBJdCBpcyBhIGdvb2QgZGlzY2lwbGluZS4KKworRGVzY3JpYmUgdGhlIHRlY2huaWNhbCBkZXRhaWwgb2YgdGhlIGNoYW5nZShzKS4KKworSWYgeW91ciBkZXNjcmlwdGlvbiBzdGFydHMgdG8gZ2V0IHRvbyBsb25nLCB0aGF0J3MgYSBzaWduIHRoYXQgeW91Citwcm9iYWJseSBuZWVkIHRvIHNwbGl0IHVwIHlvdXIgY29tbWl0IHRvIGZpbmVyIGdyYWluZWQgcGllY2VzLgorCitPaCwgYW5vdGhlciB0aGluZy4gIEkgYW0gcGlja3kgYWJvdXQgd2hpdGVzcGFjZXMuICBNYWtlIHN1cmUgeW91cgorY2hhbmdlcyBkbyBub3QgdHJpZ2dlciBlcnJvcnMgd2l0aCB0aGUgc2FtcGxlIHByZS1jb21taXQgaG9vayBzaGlwcGVkCitpbiB0ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQuCisKKworKDIpIEdlbmVyYXRlIHlvdXIgcGF0Y2ggdXNpbmcgZ2l0IHRvb2xzIG91dCBvZiB5b3VyIGNvbW1pdHMuCisKK2dpdCBiYXNlZCBkaWZmIHRvb2xzIChnaXQsIENvZ2l0bywgYW5kIFN0R0lUIGluY2x1ZGVkKSBnZW5lcmF0ZQordW5pZGlmZiB3aGljaCBpcyB0aGUgcHJlZmVycmVkIGZvcm1hdC4KKworWW91IGRvIG5vdCBoYXZlIHRvIGJlIGFmcmFpZCB0byB1c2UgLU0gb3B0aW9uIHRvICJnaXQgZGlmZiIgb3IKKyJnaXQgZm9ybWF0LXBhdGNoIiwgaWYgeW91ciBwYXRjaCBpbnZvbHZlcyBmaWxlIHJlbmFtZXMuICBUaGUKK3JlY2VpdmluZyBlbmQgY2FuIGhhbmRsZSB0aGVtIGp1c3QgZmluZS4KKworUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIHBhdGNoIGRvZXMgbm90IGluY2x1ZGUgYW55IGV4dHJhIGZpbGVzCit3aGljaCBkbyBub3QgYmVsb25nIGluIGEgcGF0Y2ggc3VibWlzc2lvbi4gIE1ha2Ugc3VyZSB0byByZXZpZXcKK3lvdXIgcGF0Y2ggYWZ0ZXIgZ2VuZXJhdGluZyBpdCwgdG8gZW5zdXJlIGFjY3VyYWN5LiAgQmVmb3JlCitzZW5kaW5nIG91dCwgcGxlYXNlIG1ha2Ugc3VyZSBpdCBjbGVhbmx5IGFwcGxpZXMgdG8gdGhlICJtYXN0ZXIiCiticmFuY2ggaGVhZC4gIElmIHlvdSBhcmUgcHJlcGFyaW5nIGEgd29yayBiYXNlZCBvbiAibmV4dCIgYnJhbmNoLAordGhhdCBpcyBmaW5lLCBidXQgcGxlYXNlIG1hcmsgaXQgYXMgc3VjaC4KKworCisoMykgU2VuZGluZyB5b3VyIHBhdGNoZXMuCisKK1Blb3BsZSBvbiB0aGUgZ2l0IG1haWxpbmcgbGlzdCBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCBhbmQKK2NvbW1lbnQgb24gdGhlIGNoYW5nZXMgeW91IGFyZSBzdWJtaXR0aW5nLiAgSXQgaXMgaW1wb3J0YW50IGZvcgorYSBkZXZlbG9wZXIgdG8gYmUgYWJsZSB0byAicXVvdGUiIHlvdXIgY2hhbmdlcywgdXNpbmcgc3RhbmRhcmQKK2UtbWFpbCB0b29scywgc28gdGhhdCB0aGV5IG1heSBjb21tZW50IG9uIHNwZWNpZmljIHBvcnRpb25zIG9mCit5b3VyIGNvZGUuICBGb3IgdGhpcyByZWFzb24sIGFsbCBwYXRjaGVzIHNob3VsZCBiZSBzdWJtaXRlZAorImlubGluZSIuICBXQVJOSU5HOiBCZSB3YXJ5IG9mIHlvdXIgTVVBcyB3b3JkLXdyYXAKK2NvcnJ1cHRpbmcgeW91ciBwYXRjaC4gIERvIG5vdCBjdXQtbi1wYXN0ZSB5b3VyIHBhdGNoOyB5b3UgY2FuCitsb3NlIHRhYnMgdGhhdCB3YXkgaWYgeW91IGFyZSBub3QgY2FyZWZ1bC4KKworSXQgaXMgYSBjb21tb24gY29udmVudGlvbiB0byBwcmVmaXggeW91ciBzdWJqZWN0IGxpbmUgd2l0aAorW1BBVENIXS4gIFRoaXMgbGV0cyBwZW9wbGUgZWFzaWx5IGRpc3Rpbmd1aXNoIHBhdGNoZXMgZnJvbSBvdGhlcgorZS1tYWlsIGRpc2N1c3Npb25zLgorCisiZ2l0IGZvcm1hdC1wYXRjaCIgY29tbWFuZCBmb2xsb3dzIHRoZSBiZXN0IGN1cnJlbnQgcHJhY3RpY2UgdG8KK2Zvcm1hdCB0aGUgYm9keSBvZiBhbiBlLW1haWwgbWVzc2FnZS4gIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCitwYXRjaCBzaG91bGQgY29tZSB5b3VyIGNvbW1pdCBtZXNzYWdlLCBlbmRpbmcgd2l0aCB0aGUKK1NpZ25lZC1vZmYtYnk6IGxpbmVzLCBhbmQgYSBsaW5lIHRoYXQgY29uc2lzdHMgb2YgdGhyZWUgZGFzaGVzLAorZm9sbG93ZWQgYnkgdGhlIGRpZmZzdGF0IGluZm9ybWF0aW9uIGFuZCB0aGUgcGF0Y2ggaXRzZWxmLiAgSWYKK3lvdSBhcmUgZm9yd2FyZGluZyBhIHBhdGNoIGZyb20gc29tZWJvZHkgZWxzZSwgb3B0aW9uYWxseSwgYXQKK3RoZSBiZWdpbm5pbmcgb2YgdGhlIGUtbWFpbCBtZXNzYWdlIGp1c3QgYmVmb3JlIHRoZSBjb21taXQKK21lc3NhZ2Ugc3RhcnRzLCB5b3UgY2FuIHB1dCBhICJGcm9tOiAiIGxpbmUgdG8gbmFtZSB0aGF0IHBlcnNvbi4KKworWW91IG9mdGVuIHdhbnQgdG8gYWRkIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gYWJvdXQgdGhlIHBhdGNoLAorb3RoZXIgdGhhbiB0aGUgY29tbWl0IG1lc3NhZ2UgaXRzZWxmLiAgUGxhY2Ugc3VjaCAiY292ZXIgbGV0dGVyIgorbWF0ZXJpYWwgYmV0d2VlbiB0aGUgdGhyZWUgZGFzaCBsaW5lcyBhbmQgdGhlIGRpZmZzdGF0LgorCitEbyBub3QgYXR0YWNoIHRoZSBwYXRjaCBhcyBhIE1JTUUgYXR0YWNobWVudCwgY29tcHJlc3NlZCBvciBub3QuCitEbyBub3QgbGV0IHlvdXIgZS1tYWlsIGNsaWVudCBzZW5kIHF1b3RlZC1wcmludGFibGUuICBNYW55Citwb3B1bGFyIGUtbWFpbCBhcHBsaWNhdGlvbnMgd2lsbCBub3QgYWx3YXlzIHRyYW5zbWl0IGEgTUlNRQorYXR0YWNobWVudCBhcyBwbGFpbiB0ZXh0LCBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBjb21tZW50IG9uCit5b3VyIGNvZGUuICBBIE1JTUUgYXR0YWNobWVudCBhbHNvIHRha2VzIGEgYml0IG1vcmUgdGltZSB0bworcHJvY2Vzcy4gIFRoaXMgZG9lcyBub3QgZGVjcmVhc2UgdGhlIGxpa2VsaWhvb2Qgb2YgeW91cgorTUlNRS1hdHRhY2hlZCBjaGFuZ2UgYmVpbmcgYWNjZXB0ZWQsIGJ1dCBpdCBtYWtlcyBpdCBtb3JlIGxpa2VseQordGhhdCBpdCB3aWxsIGJlIHBvc3Rwb25lZC4KKworRXhjZXB0aW9uOiAgSWYgeW91ciBtYWlsZXIgaXMgbWFuZ2xpbmcgcGF0Y2hlcyB0aGVuIHNvbWVvbmUgbWF5IGFzaworeW91IHRvIHJlLXNlbmQgdGhlbSB1c2luZyBNSU1FLCB0aGF0IGlzIE9LLgorCitEbyBub3QgUEdQIHNpZ24geW91ciBwYXRjaCwgYXQgbGVhc3QgZm9yIG5vdy4gIE1vc3QgbGlrZWx5LCB5b3VyCittYWludGFpbmVyIG9yIG90aGVyIHBlb3BsZSBvbiB0aGUgbGlzdCB3b3VsZCBub3QgaGF2ZSB5b3VyIFBHUAora2V5IGFuZCB3b3VsZCBub3QgYm90aGVyIG9idGFpbmluZyBpdCBhbnl3YXkuICBZb3VyIHBhdGNoIGlzIG5vdAoranVkZ2VkIGJ5IHdobyB5b3UgYXJlOyBhIGdvb2QgcGF0Y2ggZnJvbSBhbiB1bmtub3duIG9yaWdpbiBoYXMgYQorZmFyIGJldHRlciBjaGFuY2Ugb2YgYmVpbmcgYWNjZXB0ZWQgdGhhbiBhIHBhdGNoIGZyb20gYSBrbm93biwKK3Jlc3BlY3RlZCBvcmlnaW4gdGhhdCBpcyBkb25lIHBvb3JseSBvciBkb2VzIGluY29ycmVjdCB0aGluZ3MuCisKK0lmIHlvdSByZWFsbHkgcmVhbGx5IHJlYWxseSByZWFsbHkgd2FudCB0byBkbyBhIFBHUCBzaWduZWQKK3BhdGNoLCBmb3JtYXQgaXQgYXMgIm11bHRpcGFydC9zaWduZWQiLCBub3QgYSB0ZXh0L3BsYWluIG1lc3NhZ2UKK3RoYXQgc3RhcnRzIHdpdGggJy0tLS0tQkVHSU4gUEdQIFNJR05FRCBNRVNTQUdFLS0tLS0nLiAgVGhhdCBpcworbm90IGEgdGV4dC9wbGFpbiwgaXQncyBzb21ldGhpbmcgZWxzZS4KKworTm90ZSB0aGF0IHlvdXIgbWFpbnRhaW5lciBkb2VzIG5vdCBuZWNlc3NhcmlseSByZWFkIGV2ZXJ5dGhpbmcKK29uIHRoZSBnaXQgbWFpbGluZyBsaXN0LiAgSWYgeW91ciBwYXRjaCBpcyBmb3IgZGlzY3Vzc2lvbiBmaXJzdCwKK3NlbmQgaXQgIlRvOiIgdGhlIG1haWxpbmcgbGlzdCwgYW5kIG9wdGlvbmFsbHkgImNjOiIgaGltLiAgSWYgaXQKK2lzIHRyaXZpYWxseSBjb3JyZWN0IG9yIGFmdGVyIHRoZSBsaXN0IHJlYWNoZWQgYSBjb25zZW5zdXMsIHNlbmQKK2l0ICJUbzoiIHRoZSBtYWludGFpbmVyIGFuZCBvcHRpb25hbGx5ICJjYzoiIHRoZSBsaXN0LgorCisKKyg2KSBTaWduIHlvdXIgd29yaworCitUbyBpbXByb3ZlIHRyYWNraW5nIG9mIHdobyBkaWQgd2hhdCwgd2UndmUgYm9ycm93ZWQgdGhlCisic2lnbi1vZmYiIHByb2NlZHVyZSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgcHJvamVjdCBvbiBwYXRjaGVzCit0aGF0IGFyZSBiZWluZyBlbWFpbGVkIGFyb3VuZC4gIEFsdGhvdWdoIGNvcmUgR0lUIGlzIGEgbG90CitzbWFsbGVyIHByb2plY3QgaXQgaXMgYSBnb29kIGRpc2NpcGxpbmUgdG8gZm9sbG93IGl0LgorCitUaGUgc2lnbi1vZmYgaXMgYSBzaW1wbGUgbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBleHBsYW5hdGlvbiBmb3IKK3RoZSBwYXRjaCwgd2hpY2ggY2VydGlmaWVzIHRoYXQgeW91IHdyb3RlIGl0IG9yIG90aGVyd2lzZSBoYXZlCit0aGUgcmlnaHQgdG8gcGFzcyBpdCBvbiBhcyBhIG9wZW4tc291cmNlIHBhdGNoLiAgVGhlIHJ1bGVzIGFyZQorcHJldHR5IHNpbXBsZTogaWYgeW91IGNhbiBjZXJ0aWZ5IHRoZSBiZWxvdzoKKworICAgICAgICBEZXZlbG9wZXIncyBDZXJ0aWZpY2F0ZSBvZiBPcmlnaW4gMS4xCisKKyAgICAgICAgQnkgbWFraW5nIGEgY29udHJpYnV0aW9uIHRvIHRoaXMgcHJvamVjdCwgSSBjZXJ0aWZ5IHRoYXQ6CisKKyAgICAgICAgKGEpIFRoZSBjb250cmlidXRpb24gd2FzIGNyZWF0ZWQgaW4gd2hvbGUgb3IgaW4gcGFydCBieSBtZSBhbmQgSQorICAgICAgICAgICAgaGF2ZSB0aGUgcmlnaHQgdG8gc3VibWl0IGl0IHVuZGVyIHRoZSBvcGVuIHNvdXJjZSBsaWNlbnNlCisgICAgICAgICAgICBpbmRpY2F0ZWQgaW4gdGhlIGZpbGU7IG9yCisKKyAgICAgICAgKGIpIFRoZSBjb250cmlidXRpb24gaXMgYmFzZWQgdXBvbiBwcmV2aW91cyB3b3JrIHRoYXQsIHRvIHRoZSBiZXN0CisgICAgICAgICAgICBvZiBteSBrbm93bGVkZ2UsIGlzIGNvdmVyZWQgdW5kZXIgYW4gYXBwcm9wcmlhdGUgb3BlbiBzb3VyY2UKKyAgICAgICAgICAgIGxpY2Vuc2UgYW5kIEkgaGF2ZSB0aGUgcmlnaHQgdW5kZXIgdGhhdCBsaWNlbnNlIHRvIHN1Ym1pdCB0aGF0CisgICAgICAgICAgICB3b3JrIHdpdGggbW9kaWZpY2F0aW9ucywgd2hldGhlciBjcmVhdGVkIGluIHdob2xlIG9yIGluIHBhcnQKKyAgICAgICAgICAgIGJ5IG1lLCB1bmRlciB0aGUgc2FtZSBvcGVuIHNvdXJjZSBsaWNlbnNlICh1bmxlc3MgSSBhbQorICAgICAgICAgICAgcGVybWl0dGVkIHRvIHN1Ym1pdCB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlKSwgYXMgaW5kaWNhdGVkCisgICAgICAgICAgICBpbiB0aGUgZmlsZTsgb3IKKworICAgICAgICAoYykgVGhlIGNvbnRyaWJ1dGlvbiB3YXMgcHJvdmlkZWQgZGlyZWN0bHkgdG8gbWUgYnkgc29tZSBvdGhlcgorICAgICAgICAgICAgcGVyc29uIHdobyBjZXJ0aWZpZWQgKGEpLCAoYikgb3IgKGMpIGFuZCBJIGhhdmUgbm90IG1vZGlmaWVkCisgICAgICAgICAgICBpdC4KKworCShkKSBJIHVuZGVyc3RhbmQgYW5kIGFncmVlIHRoYXQgdGhpcyBwcm9qZWN0IGFuZCB0aGUgY29udHJpYnV0aW9uCisJICAgIGFyZSBwdWJsaWMgYW5kIHRoYXQgYSByZWNvcmQgb2YgdGhlIGNvbnRyaWJ1dGlvbiAoaW5jbHVkaW5nIGFsbAorCSAgICBwZXJzb25hbCBpbmZvcm1hdGlvbiBJIHN1Ym1pdCB3aXRoIGl0LCBpbmNsdWRpbmcgbXkgc2lnbi1vZmYpIGlzCisJICAgIG1haW50YWluZWQgaW5kZWZpbml0ZWx5IGFuZCBtYXkgYmUgcmVkaXN0cmlidXRlZCBjb25zaXN0ZW50IHdpdGgKKwkgICAgdGhpcyBwcm9qZWN0IG9yIHRoZSBvcGVuIHNvdXJjZSBsaWNlbnNlKHMpIGludm9sdmVkLgorCit0aGVuIHlvdSBqdXN0IGFkZCBhIGxpbmUgc2F5aW5nCisKKwlTaWduZWQtb2ZmLWJ5OiBSYW5kb20gSiBEZXZlbG9wZXIgPHJhbmRvbUBkZXZlbG9wZXIuZXhhbXBsZS5vcmc+CisKK1NvbWUgcGVvcGxlIGFsc28gcHV0IGV4dHJhIHRhZ3MgYXQgdGhlIGVuZC4gIFRoZXknbGwganVzdCBiZSBpZ25vcmVkIGZvcgorbm93LCBidXQgeW91IGNhbiBkbyB0aGlzIHRvIG1hcmsgaW50ZXJuYWwgY29tcGFueSBwcm9jZWR1cmVzIG9yIGp1c3QKK3BvaW50IG91dCBzb21lIHNwZWNpYWwgZGV0YWlsIGFib3V0IHRoZSBzaWduLW9mZi4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01VQSBzcGVjaWZpYyBoaW50cworCitTb21lIG9mIHBhdGNoZXMgSSByZWNlaXZlIG9yIHBpY2sgdXAgZnJvbSB0aGUgbGlzdCBzaGFyZSBjb21tb24KK3BhdHRlcm5zIG9mIGJyZWFrYWdlLiAgUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIE1VQSBpcyBzZXQgdXAKK3Byb3Blcmx5IG5vdCB0byBjb3JydXB0IHdoaXRlc3BhY2VzLiAgSGVyZSBhcmUgdHdvIGNvbW1vbiBvbmVzCitJIGhhdmUgc2VlbjoKKworKiBFbXB0eSBjb250ZXh0IGxpbmVzIHRoYXQgZG8gbm90IGhhdmUgX2FueV8gd2hpdGVzcGFjZS4KKworKiBOb24gZW1wdHkgY29udGV4dCBsaW5lcyB0aGF0IGhhdmUgb25lIGV4dHJhIHdoaXRlc3BhY2UgYXQgdGhlCisgIGJlZ2lubmluZy4KKworT25lIHRlc3QgeW91IGNvdWxkIGRvIHlvdXJzZWxmIGlmIHlvdXIgTVVBIGlzIHNldCB1cCBjb3JyZWN0bHkgaXM6CisKKyogU2VuZCB0aGUgcGF0Y2ggdG8geW91cnNlbGYsIGV4YWN0bHkgdGhlIHdheSB5b3Ugd291bGQsIGV4Y2VwdAorICBUbzogYW5kIENjOiBsaW5lcywgd2hpY2ggd291bGQgbm90IGNvbnRhaW4gdGhlIGxpc3QgYW5kCisgIG1haW50YWluZXIgYWRkcmVzcy4KKworKiBTYXZlIHRoYXQgcGF0Y2ggdG8gYSBmaWxlIGluIFVOSVggbWFpbGJveCBmb3JtYXQuICBDYWxsIGl0IHNheQorICBhLnBhdGNoLgorCisqIFRyeSB0byBhcHBseSB0byB0aGUgdGlwIG9mIHRoZSAibWFzdGVyIiBicmFuY2ggZnJvbSB0aGUKKyAgZ2l0LmdpdCBwdWJsaWMgcmVwb3NpdG9yeToKKworICAgICQgZ2l0IGZldGNoIGh0dHA6Ly9rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQgbWFzdGVyOnRlc3QtYXBwbHkKKyAgICAkIGdpdCBjaGVja291dCB0ZXN0LWFwcGx5CisgICAgJCBnaXQgcmVzZXQgLS1oYXJkCisgICAgJCBnaXQgYXBwbHltYm94IGEucGF0Y2gKKworSWYgaXQgZG9lcyBub3QgYXBwbHkgY29ycmVjdGx5LCB0aGVyZSBjYW4gYmUgdmFyaW91cyByZWFzb25zLgorCisqIFlvdXIgcGF0Y2ggaXRzZWxmIGRvZXMgbm90IGFwcGx5IGNsZWFubHkuICBUaGF0IGlzIF9iYWRfIGJ1dAorICBkb2VzIG5vdCBoYXZlIG11Y2ggdG8gZG8gd2l0aCB5b3VyIE1VQS4gIFBsZWFzZSByZWJhc2UgdGhlCisgIHBhdGNoIGFwcHJvcHJpYXRlbHkuCisKKyogWW91ciBNVUEgY29ycnVwdGVkIHlvdXIgcGF0Y2g7IGFwcGx5bWJveCB3b3VsZCBjb21wbGFpbiB0aGF0CisgIHRoZSBwYXRjaCBkb2VzIG5vdCBhcHBseS4gIExvb2sgYXQgLmRvdGVzdC8gc3ViZGlyZWN0b3J5IGFuZAorICBzZWUgd2hhdCAncGF0Y2gnIGZpbGUgY29udGFpbnMgYW5kIGNoZWNrIGZvciB0aGUgY29tbW9uCisgIGNvcnJ1cHRpb24gcGF0dGVybnMgbWVudGlvbmVkIGFib3ZlLgorCisqIFdoaWxlIHlvdSBhcmUgYXQgaXQsIGNoZWNrIHdoYXQgYXJlIGluICdpbmZvJyBhbmQKKyAgJ2ZpbmFsLWNvbW1pdCcgZmlsZXMgYXMgd2VsbC4gIElmIHdoYXQgaXMgaW4gJ2ZpbmFsLWNvbW1pdCcgaXMKKyAgbm90IGV4YWN0bHkgd2hhdCB5b3Ugd291bGQgd2FudCB0byBzZWUgaW4gdGhlIGNvbW1pdCBsb2cKKyAgbWVzc2FnZSwgaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCB5b3VyIG1haW50YWluZXIgd291bGQgZW5kIHVwCisgIGhhbmQgZWRpdGluZyB0aGUgbG9nIG1lc3NhZ2Ugd2hlbiBoZSBhcHBsaWVzIHlvdXIgcGF0Y2guCisgIFRoaW5ncyBsaWtlICJIaSwgdGhpcyBpcyBteSBmaXJzdCBwYXRjaC5cbiIsIGlmIHlvdSByZWFsbHkKKyAgd2FudCB0byBwdXQgaW4gdGhlIHBhdGNoIGUtbWFpbCwgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlCisgIHRocmVlLWRhc2ggbGluZSB0aGF0IHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKworUGluZQorLS0tLQorCisoSm9oYW5uZXMgU2NoaW5kZWxpbikKKworSSBkb24ndCBrbm93IGhvdyBtYW55IHBlb3BsZSBzdGlsbCB1c2UgcGluZSwgYnV0IGZvciB0aG9zZSBwb29yCitzb3VscyBpdCBtYXkgYmUgZ29vZCB0byBtZW50aW9uIHRoYXQgdGhlIHF1ZWxsLWZsb3dlZC10ZXh0IGlzCituZWVkZWQgZm9yIHJlY2VudCB2ZXJzaW9ucy4KKworLi4uIHRoZSAibm8tc3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCIgb3B0aW9uLCB0b28uIEFGQUlLIGl0Cit3YXMgaW50cm9kdWNlZCBpbiA0LjYwLgorCisoTGludXMgVG9ydmFsZHMpCisKK0FuZCA0LjU4IG5lZWRzIGF0IGxlYXN0IHRoaXMuCisKKy0tLQorZGlmZi10cmVlIDgzMjZkZDgzNTBiZTY0YWM3ZmM4MDVmNjU2M2ExZDYxYWQxMGQzMmMgKGZyb20gZTg4NmE2MWY3NmVkZjU0MTA1NzNlOTJlMzhjZTIyOTc0ZjljNDBmMSkKK0F1dGhvcjogTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQGc1Lm9zZGwub3JnPgorRGF0ZTogICBNb24gQXVnIDE1IDE3OjIzOjUxIDIwMDUgLTA3MDAKKworICAgIEZpeCBwaW5lIHdoaXRlc3BhY2UtY29ycnVwdGlvbiBidWcKKworICAgIFRoZXJlJ3Mgbm8gZXhjdXNlIGZvciB1bmNvbmRpdGlvbmFsbHkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBmcm9tCisgICAgdGhlIHBpY28gYnVmZmVycyBvbiBjbG9zZS4KKworZGlmZiAtLWdpdCBhL3BpY28vcGljby5jIGIvcGljby9waWNvLmMKKy0tLSBhL3BpY28vcGljby5jCisrKysgYi9waWNvL3BpY28uYworQEAgLTIxOSw3ICsyMTksOSBAQCBQSUNPICpwbTsKKyAJICAgIHN3aXRjaChwaWNvX2FsbF9kb25lKXsJLyogcHJlcGFyZSBmb3IvaGFuZGxlIGZpbmFsIGV2ZW50cyAqLworIAkgICAgICBjYXNlIENPTVBfRVhJVCA6CQkvKiBhbHJlYWR5IGNvbmZpcm1lZCAqLworIAkJcGFja2hlYWRlcigpOworKyNpZiAwCisgCQlzdHJpcHdoaXRlc3BhY2UoKTsKKysjZW5kaWYKKyAJCWMgfD0gQ09NUF9FWElUOworIAkJYnJlYWs7CisgCisKKyhEYW5pZWwgQmFya2Fsb3cpCisKKz4gQSBwYXRjaCB0byBTdWJtaXR0aW5nUGF0Y2hlcywgTVVBIHNwZWNpZmljIGhlbHAgc2VjdGlvbiBmb3IKKz4gdXNlcnMgb2YgUGluZSA0LjYzIHdvdWxkIGJlIHZlcnkgbXVjaCBhcHByZWNpYXRlZC4KKworQWgsIGl0IGxvb2tzIGxpa2UgYSByZWNlbnQgdmVyc2lvbiBjaGFuZ2VkIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHRvIGRvIHRoZQorcmlnaHQgdGhpbmcsIGFuZCBpbnZlcnRlZCB0aGUgc2Vuc2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiAoRWl0aGVyCit0aGF0IG9yIEdlbnRvbyBkaWQgaXQuKSBTbyB5b3UgbmVlZCB0byBzZXQgdGhlCisibm8tc3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCIgb3B0aW9uLCB1bmxlc3MgdGhlIG9wdGlvbiB5b3UgaGF2ZSBpcworInN0cmlwLXdoaXRlc3BhY2UtYmVmb3JlLXNlbmQiLCBpbiB3aGljaCBjYXNlIHlvdSBzaG91bGQgYXZvaWQgY2hlY2tpbmcKK2l0LgorCisKK1RodW5kZXJiaXJkCistLS0tLS0tLS0tLQorCisoQSBMYXJnZSBBbmdyeSBTQ00pCisKK0hlcmUgYXJlIHNvbWUgaGludHMgb24gaG93IHRvIHN1Y2Nlc3NmdWxseSBzdWJtaXQgcGF0Y2hlcyBpbmxpbmUgdXNpbmcKK1RodW5kZXJiaXJkLgorCitUaGlzIHJlY2lwZSBhcHBlYXJzIHRvIHdvcmsgd2l0aCB0aGUgY3VycmVudCBbKjEqXSBUaHVuZGVyYmlyZCBmcm9tIFN1c2UuCisKK1RoZSBmb2xsb3dpbmcgVGh1bmRlcmJpcmQgZXh0ZW5zaW9ucyBhcmUgbmVlZGVkOgorCUFib3V0Q29uZmlnIDAuNQorCQlodHRwOi8vYWJvdXRjb25maWcubW96ZGV2Lm9yZy8KKwlFeHRlcm5hbCBFZGl0b3IgMC43LjIKKwkJaHR0cDovL2dsb2JzLm9yZy9hcnRpY2xlcy5waHA/bG5nPWVuJnBnPTgKKworMSkgUHJlcGFyZSB0aGUgcGF0Y2ggYXMgYSB0ZXh0IGZpbGUgdXNpbmcgeW91ciBtZXRob2Qgb2YgY2hvaWNlLgorCisyKSBCZWZvcmUgb3BlbmluZyBhIGNvbXBvc2Ugd2luZG93LCB1c2UgRWRpdC0+QWNjb3VudCBTZXR0aW5ncyB0bwordW5jaGVjayB0aGUgIkNvbXBvc2UgbWVzc2FnZXMgaW4gSFRNTCBmb3JtYXQiIHNldHRpbmcgaW4gdGhlCisiQ29tcG9zaXRpb24gJiBBZGRyZXNzaW5nIiBwYW5lbCBvZiB0aGUgYWNjb3VudCB0byBiZSB1c2VkIHRvIHNlbmQgdGhlCitwYXRjaC4gWyoyKl0KKworMykgSW4gdGhlIG1haW4gVGh1bmRlcmJpcmQgd2luZG93LCBfYmVmb3JlXyB5b3Ugb3BlbiB0aGUgY29tcG9zZSB3aW5kb3cKK2ZvciB0aGUgcGF0Y2gsIHVzZSBUb29scy0+YWJvdXQ6Y29uZmlnIHRvIHNldCB0aGUgZm9sbG93aW5nIHRvIHRoZQoraW5kaWNhdGVkIHZhbHVlczoKKwltYWlsbmV3cy5zZW5kX3BsYWludGV4dF9mbG93ZWQJPT4gZmFsc2UKKwltYWlsbmV3cy53cmFwbGVuZ3RoCQk9PiAwCisKKzQpIE9wZW4gYSBjb21wb3NlIHdpbmRvdyBhbmQgY2xpY2sgdGhlIGV4dGVybmFsIGVkaXRvciBpY29uLgorCis1KSBJbiB0aGUgZXh0ZXJuYWwgZWRpdG9yIHdpbmRvdywgcmVhZCBpbiB0aGUgcGF0Y2ggZmlsZSBhbmQgZXhpdCB0aGUKK2VkaXRvciBub3JtYWxseS4KKworNikgQmFjayBpbiB0aGUgY29tcG9zZSB3aW5kb3c6IEFkZCB3aGF0ZXZlciBvdGhlciB0ZXh0IHlvdSB3aXNoIHRvIHRoZQorbWVzc2FnZSwgY29tcGxldGUgdGhlIGFkZHJlc3NpbmcgYW5kIHN1YmplY3QgZmllbGRzLCBhbmQgcHJlc3Mgc2VuZC4KKworNykgT3B0aW9uYWxseSwgdW5kbyB0aGUgYWJvdXQ6Y29uZmlnL2FjY291bnQgc2V0dGluZ3MgY2hhbmdlcyBtYWRlIGluCitzdGVwcyAyICYgMy4KKworCitbRm9vdG5vdGVzXQorKjEqIFZlcnNpb24gMS4wICgyMDA0MTIwNykgZnJvbSB0aGUgTW96aWxsYVRodW5kZXJiaXJkLTEuMC01IHJwbSBvZiBTdXNlCis5LjMgcHJvZmVzc2lvbmFsIHVwZGF0ZXMuCisKKyoyKiBJdCBtYXkgYmUgcG9zc2libGUgdG8gZG8gdGhpcyB3aXRoIGFib3V0OmNvbmZpZyBhbmQgdGhlIGZvbGxvd2luZworc2V0dGluZ3MgYnV0IEkgaGF2ZW4ndCB0cmllZCwgeWV0LgorCW1haWwuaHRtbF9jb21wb3NlCQkJPT4gZmFsc2UKKwltYWlsLmlkZW50aXR5LmRlZmF1bHQuY29tcG9zZV9odG1sCT0+IGZhbHNlCisJbWFpbC5pZGVudGl0eS5pZD8uY29tcG9zZV9odG1sCQk9PiBmYWxzZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYgYi9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlNzE1MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZgpAQCAtMCwwICsxLDM2IEBACisjIyBnaXRsaW5rOiBtYWNybworIworIyBVc2FnZTogZ2l0bGluazpjb21tYW5kW21hbnBhZ2Utc2VjdGlvbl0KKyMKKyMgTm90ZSwgezB9IGlzIHRoZSBtYW5wYWdlIHNlY3Rpb24sIHdoaWxlIHt0YXJnZXR9IGlzIHRoZSBjb21tYW5kLgorIworIyBTaG93IEdJVCBsaW5rIGFzOiA8Y29tbWFuZD4oPHNlY3Rpb24+KTsgaWYgc2VjdGlvbiBpcyBkZWZpbmVkLCBlbHNlIGp1c3Qgc2hvdworIyB0aGUgY29tbWFuZC4KKworW2F0dHJpYnV0ZXNdCitjYXJldD1eCisKK2lmZGVmOjpiYWNrZW5kLWRvY2Jvb2tbXQorW2dpdGxpbmstaW5saW5lbWFjcm9dCit7MCV7dGFyZ2V0fX0KK3swIzxjaXRlcmVmZW50cnk+fQorezAjPHJlZmVudHJ5dGl0bGU+e3RhcmdldH08L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT57MH08L21hbnZvbG51bT59Cit7MCM8L2NpdGVyZWZlbnRyeT59CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KKworaWZkZWY6OmJhY2tlbmQtZG9jYm9va1tdCisjICJ1bmJyZWFrIiBkb2Nib29rLXhzbCB2MS42OCBmb3IgbWFucGFnZXMuIHYxLjY5IHdvcmtzIHdpdGggb3Igd2l0aG91dCB0aGlzLgorW2xpc3RpbmdibG9ja10KKzxleGFtcGxlPjx0aXRsZT57dGl0bGV9PC90aXRsZT4KKzxsaXRlcmFsbGF5b3V0PgorfAorPC9saXRlcmFsbGF5b3V0Pgore3RpdGxlI308L2V4YW1wbGU+CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KKworaWZkZWY6OmJhY2tlbmQteGh0bWwxMVtdCitbZ2l0bGluay1pbmxpbmVtYWNyb10KKzxhIGhyZWY9Int0YXJnZXR9Lmh0bWwiPnt0YXJnZXR9ezA/KHswfSl9PC9hPgorZW5kaWY6OmJhY2tlbmQteGh0bWwxMVtdCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9idWlsZC1kb2NkZXAucGVybCBiL0RvY3VtZW50YXRpb24vYnVpbGQtZG9jZGVwLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg5Mzg5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYnVpbGQtZG9jZGVwLnBlcmwKQEAgLTAsMCArMSw1MCBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK215ICVpbmNsdWRlID0gKCk7CitteSAlaW5jbHVkZWQgPSAoKTsKKworZm9yIG15ICR0ZXh0ICg8Ki50eHQ+KSB7CisgICAgb3BlbiBJLCAnPCcsICR0ZXh0IHx8IGRpZSAiY2Fubm90IHJlYWQ6ICR0ZXh0IjsKKyAgICB3aGlsZSAoPEk+KSB7CisJaWYgKC9eaW5jbHVkZTo6LykgeworCSAgICBjaG9tcDsKKwkgICAgcy9eaW5jbHVkZTo6XHMqLy87CisJICAgIHMvXFtcXS8vOworCSAgICAkaW5jbHVkZXskdGV4dH17JF99ID0gMTsKKwkgICAgJGluY2x1ZGVkeyRffSA9IDE7CisJfQorICAgIH0KKyAgICBjbG9zZSBJOworfQorCisjIERvIHdlIGNhcmUgYWJvdXQgY2hhaW5lZCBpbmNsdWRlcz8/PworbXkgJGNoYW5nZWQgPSAxOword2hpbGUgKCRjaGFuZ2VkKSB7CisgICAgJGNoYW5nZWQgPSAwOworICAgIHdoaWxlIChteSAoJHRleHQsICRpbmNsdWRlZCkgPSBlYWNoICVpbmNsdWRlKSB7CisJZm9yIG15ICRpIChrZXlzICUkaW5jbHVkZWQpIHsKKwkgICAgIyAkdGV4dCBoYXMgaW5jbHVkZTo6JGk7IGlmICRpIGluY2x1ZGVzICRqCisJICAgICMgJHRleHQgaW5kaXJlY3RseSBpbmNsdWRlcyAkai4KKwkgICAgaWYgKGV4aXN0cyAkaW5jbHVkZXskaX0pIHsKKwkJZm9yIG15ICRqIChrZXlzICV7JGluY2x1ZGV7JGl9fSkgeworCQkgICAgaWYgKCFleGlzdHMgJGluY2x1ZGV7JHRleHR9eyRqfSkgeworCQkJJGluY2x1ZGV7JHRleHR9eyRqfSA9IDE7CisJCQkkaW5jbHVkZWR7JGp9ID0gMTsKKwkJCSRjaGFuZ2VkID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKword2hpbGUgKG15ICgkdGV4dCwgJGluY2x1ZGVkKSA9IGVhY2ggJWluY2x1ZGUpIHsKKyAgICBpZiAoISBleGlzdHMgJGluY2x1ZGVkeyR0ZXh0fSAmJgorCShteSAkYmFzZSA9ICR0ZXh0KSA9fiBzL1wudHh0JC8vKSB7CisJbXkgKCRzdWZmaXgpID0gJzEnOworCWlmICgkYmFzZSBlcSAnZ2l0JykgeworCSAgICAkc3VmZml4ID0gJzcnOyAjIHl1Y2suLi4KKwl9CisJcHJpbnQgIiRiYXNlLmh0bWwgJGJhc2UuJHN1ZmZpeCA6ICIsIGpvaW4oIiAiLCBrZXlzICUkaW5jbHVkZWQpLCAiXG4iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2FsbG91dHMueHNsIGIvRG9jdW1lbnRhdGlvbi9jYWxsb3V0cy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwMzc1NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY2FsbG91dHMueHNsCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0gY2FsbG91dC54c2w6IGNvbnZlcnRzIGFzY2lpZG9jIGNhbGxvdXRzIHRvIG1hbiBwYWdlIGZvcm1hdCAtLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvIj4KKwk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdcZkIoJyxzdWJzdHJpbmctYWZ0ZXIoQGlkLCctJyksJylcZlInKSIvPgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjYWxsb3V0bGlzdCI+CisJPHhzbDp0ZXh0Pi5zcCYjMTA7PC94c2w6dGV4dD4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisJPHhzbDp0ZXh0PiYjMTA7PC94c2w6dGV4dD4KKzwveHNsOnRlbXBsYXRlPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2FsbG91dCI+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgnXGZCJyxzdWJzdHJpbmctYWZ0ZXIoQGFyZWFyZWZzLCctJyksJy4gXGZSJykiLz4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisJPHhzbDp0ZXh0Pi5iciYjMTA7PC94c2w6dGV4dD4KKzwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29uZmlnLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDRjNWFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jb25maWcudHh0CkBAIC0wLDAgKzEsMjAwIEBACitDT05GSUdVUkFUSU9OIEZJTEUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZ2l0IGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWlucyBhIG51bWJlciBvZiB2YXJpYWJsZXMgdGhhdCBhZmZlY3QKK3RoZSBnaXQgY29tbWFuZCdzIGJlaGF2aW9yLiBUaGV5IGNhbiBiZSB1c2VkIGJ5IGJvdGggdGhlIGdpdCBwbHVtYmluZworYW5kIHRoZSBwb3JjZWxhaW5zLiBUaGUgdmFyaWFibGVzIGFyZSBkaXZpZGVkIGludG8gc2VjdGlvbnMsIHdoZXJlCitpbiB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhcmlhYmxlIG5hbWUgdGhlIHZhcmlhYmxlIGl0c2VsZiBpcyB0aGUgbGFzdAorZG90LXNlcGFyYXRlZCBzZWdtZW50IGFuZCB0aGUgc2VjdGlvbiBuYW1lIGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBsYXN0Citkb3QuIFRoZSB2YXJpYWJsZSBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgb25seSBhbHBoYW51bWVyaWMKK2NoYXJhY3RlcnMgYXJlIGFsbG93ZWQuIFNvbWUgdmFyaWFibGVzIG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMuCisKK1RoZSBzeW50YXggaXMgZmFpcmx5IGZsZXhpYmxlIGFuZCBwZXJtaXNzaXZlOyB3aGl0ZXNwYWNlcyBhcmUgbW9zdGx5CitpZ25vcmVkLiBUaGUgJyMnIGFuZCAnOycgY2hhcmFjdGVycyBiZWdpbiBjb21tZW50cyB0byB0aGUgZW5kIG9mIGxpbmUsCitibGFuayBsaW5lcyBhcmUgaWdub3JlZCwgbGluZXMgY29udGFpbmluZyBzdHJpbmdzIGVuY2xvc2VkIGluIHNxdWFyZQorYnJhY2tldHMgc3RhcnQgc2VjdGlvbnMgYW5kIGFsbCB0aGUgb3RoZXIgbGluZXMgYXJlIHJlY29nbml6ZWQKK2FzIHNldHRpbmcgdmFyaWFibGVzLCBpbiB0aGUgZm9ybSAnbmFtZSA9IHZhbHVlJy4gSWYgdGhlcmUgaXMgbm8gZXF1YWwKK3NpZ24gb24gdGhlIGxpbmUsIHRoZSBlbnRpcmUgbGluZSBpcyB0YWtlbiBhcyAnbmFtZScgYW5kIHRoZSB2YXJpYWJsZQoraXMgcmVjb2duaXplZCBhcyBib29sZWFuICJ0cnVlIi4gU3RyaW5nIHZhbHVlcyBtYXkgYmUgZW50aXJlbHkgb3IgcGFydGlhbGx5CitlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzOyBzb21lIHZhcmlhYmxlcyBtYXkgcmVxdWlyZSBzcGVjaWFsIHZhbHVlIGZvcm1hdC4KKworRXhhbXBsZQorfn5+fn5+fgorCisJIyBDb3JlIHZhcmlhYmxlcworCVtjb3JlXQorCQk7IERvbid0IHRydXN0IGZpbGUgbW9kZXMKKwkJZmlsZW1vZGUgPSBmYWxzZQorCisJIyBPdXIgZGlmZiBhbGdvcml0aG0KKwlbZGlmZl0KKwkJZXh0ZXJuYWwgPSAiL3Vzci9sb2NhbC9iaW4vZ251LWRpZmYgLXUiCisJCXJlbmFtZXMgPSB0cnVlCisKK1ZhcmlhYmxlcworfn5+fn5+fn5+CisKK05vdGUgdGhhdCB0aGlzIGxpc3QgaXMgbm9uLWNvbXByZWhlbnNpdmUgYW5kIG5vdCBuZWNlc3NhcmlseSBjb21wbGV0ZS4KK0ZvciBjb21tYW5kLXNwZWNpZmljIHZhcmlhYmxlcywgeW91IHdpbGwgZmluZCBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24KK2luIHRoZSBhcHByb3ByaWF0ZSBtYW51YWwgcGFnZS4gWW91IHdpbGwgZmluZCBhIGRlc2NyaXB0aW9uIG9mIG5vbi1jb3JlCitwb3JjZWxhaW4gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4gdGhlIHJlc3BlY3RpdmUgcG9yY2VsYWluIGRvY3VtZW50YXRpb24uCisKK2NvcmUuZmlsZU1vZGU6OgorCUlmIGZhbHNlLCB0aGUgZXhlY3V0YWJsZSBiaXQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgaW5kZXggYW5kCisJdGhlIHdvcmtpbmcgY29weSBhcmUgaWdub3JlZDsgdXNlZnVsIG9uIGJyb2tlbiBmaWxlc3lzdGVtcyBsaWtlIEZBVC4KKwlTZWUgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdLiBUcnVlIGJ5IGRlZmF1bHQuCisKK2NvcmUuZ2l0UHJveHk6OgorCUEgInByb3h5IGNvbW1hbmQiIHRvIGV4ZWN1dGUgKGFzICdjb21tYW5kIGhvc3QgcG9ydCcpIGluc3RlYWQKKwlvZiBlc3RhYmxpc2hpbmcgZGlyZWN0IGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgd2hlbgorCXVzaW5nIHRoZSBnaXQgcHJvdG9jb2wgZm9yIGZldGNoaW5nLiBJZiB0aGUgdmFyaWFibGUgdmFsdWUgaXMKKwlpbiB0aGUgIkNPTU1BTkQgZm9yIERPTUFJTiIgZm9ybWF0LCB0aGUgY29tbWFuZCBpcyBhcHBsaWVkIG9ubHkKKwlvbiBob3N0bmFtZXMgZW5kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkb21haW4gc3RyaW5nLiBUaGlzIHZhcmlhYmxlCisJbWF5IGJlIHNldCBtdWx0aXBsZSB0aW1lcyBhbmQgaXMgbWF0Y2hlZCBpbiB0aGUgZ2l2ZW4gb3JkZXI7CisJdGhlIGZpcnN0IG1hdGNoIHdpbnMuCisrCitDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9QUk9YWV9DT01NQU5EJyBlbnZpcm9ubWVudCB2YXJpYWJsZQorKHdoaWNoIGFsd2F5cyBhcHBsaWVzIHVuaXZlcnNhbGx5LCB3aXRob3V0IHRoZSBzcGVjaWFsICJmb3IiCitoYW5kbGluZykuCisKK2NvcmUuaWdub3JlU3RhdDo6CisJVGhlIHdvcmtpbmcgY29weSBmaWxlcyBhcmUgYXNzdW1lZCB0byBzdGF5IHVuY2hhbmdlZCB1bnRpbCB5b3UKKwltYXJrIHRoZW0gb3RoZXJ3aXNlIG1hbnVhbGx5IC0gR2l0IHdpbGwgbm90IGRldGVjdCB0aGUgZmlsZSBjaGFuZ2VzCisJYnkgbHN0YXQoKSBjYWxscy4gVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyB3aGVyZSB0aG9zZSBhcmUgdmVyeQorCXNsb3csIHN1Y2ggYXMgTWljcm9zb2Z0IFdpbmRvd3MuICBTZWUgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdLgorCUZhbHNlIGJ5IGRlZmF1bHQuCisKK2NvcmUucHJlZmVyU3ltbGlua1JlZnM6OgorCUluc3RlYWQgb2YgdGhlIGRlZmF1bHQgInN5bXJlZiIgZm9ybWF0IGZvciBIRUFECisJYW5kIG90aGVyIHN5bWJvbGljIHJlZmVyZW5jZSBmaWxlcywgdXNlIHN5bWJvbGljIGxpbmtzLgorCVRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCB0byB3b3JrIHdpdGggb2xkIHNjcmlwdHMgdGhhdAorCWV4cGVjdCBIRUFEIHRvIGJlIGEgc3ltYm9saWMgbGluay4KKworY29yZS5sb2dBbGxSZWZVcGRhdGVzOjoKKwlJZiB0cnVlLCBgZ2l0LXVwZGF0ZS1yZWZgIHdpbGwgYXBwZW5kIGEgbGluZSB0bworCSIkR0lUX0RJUi9sb2dzLzxyZWY+IiBsaXN0aW5nIHRoZSBuZXcgU0hBMSBhbmQgdGhlIGRhdGUvdGltZQorCW9mIHRoZSB1cGRhdGUuCUlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGl0IHdpbGwgYmUKKwljcmVhdGVkIGF1dG9tYXRpY2FsbHkuCVRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8KKwlkZXRlcm1pbmUgd2hhdCBjb21taXQgd2FzIHRoZSB0aXAgb2YgYSBicmFuY2ggIjIgZGF5cyBhZ28iLgorCVRoaXMgdmFsdWUgaXMgZmFsc2UgYnkgZGVmYXVsdCAobm8gbG9nZ2luZykuCisKK2NvcmUucmVwb3NpdG9yeUZvcm1hdFZlcnNpb246OgorCUludGVybmFsIHZhcmlhYmxlIGlkZW50aWZ5aW5nIHRoZSByZXBvc2l0b3J5IGZvcm1hdCBhbmQgbGF5b3V0CisJdmVyc2lvbi4KKworY29yZS5zaGFyZWRSZXBvc2l0b3J5OjoKKwlJZiB0cnVlLCB0aGUgcmVwb3NpdG9yeSBpcyBtYWRlIHNoYXJlYWJsZSBiZXR3ZWVuIHNldmVyYWwgdXNlcnMKKwlpbiBhIGdyb3VwIChtYWtpbmcgc3VyZSBhbGwgdGhlIGZpbGVzIGFuZCBvYmplY3RzIGFyZSBncm91cC13cml0YWJsZSkuCisJU2VlIGdpdGxpbms6Z2l0LWluaXQtZGJbMV0uIEZhbHNlIGJ5IGRlZmF1bHQuCisKK2NvcmUud2FybkFtYmlndW91c1JlZnM6OgorCUlmIHRydWUsIGdpdCB3aWxsIHdhcm4geW91IGlmIHRoZSByZWYgbmFtZSB5b3UgcGFzc2VkIGl0IGlzIGFtYmlndW91cworCWFuZCBtaWdodCBtYXRjaCBtdWx0aXBsZSByZWZzIGluIHRoZSAuZ2l0L3JlZnMvIHRyZWUuIFRydWUgYnkgZGVmYXVsdC4KKworYWxpYXMuKjo6CisJQ29tbWFuZCBhbGlhc2VzIGZvciB0aGUgZ2l0bGluazpnaXRbMV0gY29tbWFuZCB3cmFwcGVyIC0gZS5nLgorCWFmdGVyIGRlZmluaW5nICJhbGlhcy5sYXN0ID0gY2F0LWZpbGUgY29tbWl0IEhFQUQiLCB0aGUgaW52b2NhdGlvbgorCSJnaXQgbGFzdCIgaXMgZXF1aXZhbGVudCB0byAiZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEIi4gVG8gYXZvaWQKKwljb25mdXNpb24gYW5kIHRyb3VibGVzIHdpdGggc2NyaXB0IHVzYWdlLCBhbGlhc2VzIHRoYXQKKwloaWRlIGV4aXN0aW5nIGdpdCBjb21tYW5kcyBhcmUgaWdub3JlZC4gQXJndW1lbnRzIGFyZSBzcGxpdCBieQorCXNwYWNlcywgdGhlIHVzdWFsIHNoZWxsIHF1b3RpbmcgYW5kIGVzY2FwaW5nIGlzIHN1cHBvcnRlZC4KKwlxdW90ZSBwYWlyIGFuZCBhIGJhY2tzbGFzaCBjYW4gYmUgdXNlZCB0byBxdW90ZSB0aGVtLgorCithcHBseS53aGl0ZXNwYWNlOjoKKwlUZWxscyBgZ2l0LWFwcGx5YCBob3cgdG8gaGFuZGxlIHdoaXRlc3BhY2VzLCBpbiB0aGUgc2FtZSB3YXkKKwlhcyB0aGUgJy0td2hpdGVzcGFjZScgb3B0aW9uLiBTZWUgZ2l0bGluazpnaXQtYXBwbHlbMV0uCisKK2RpZmYucmVuYW1lTGltaXQ6OgorCVRoZSBudW1iZXIgb2YgZmlsZXMgdG8gY29uc2lkZXIgd2hlbiBwZXJmb3JtaW5nIHRoZSBjb3B5L3JlbmFtZQorCWRldGVjdGlvbjsgZXF1aXZhbGVudCB0byB0aGUgZ2l0IGRpZmYgb3B0aW9uICctbCcuCisKK2Zvcm1hdC5oZWFkZXJzOjoKKwlBZGRpdGlvbmFsIGVtYWlsIGhlYWRlcnMgdG8gaW5jbHVkZSBpbiBhIHBhdGNoIHRvIGJlIHN1Ym1pdHRlZAorCWJ5IG1haWwuICBTZWUgZ2l0bGluazpnaXQtZm9ybWF0LXBhdGNoWzFdLgorCitnaXRjdnMuZW5hYmxlZDo6CisJV2hldGhlciB0aGUgY3ZzIHBzZXJ2ZXIgaW50ZXJmYWNlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcmVwb3NpdG9yeS4KKwlTZWUgZ2l0bGluazpnaXQtY3Zzc2VydmVyWzFdLgorCitnaXRjdnMubG9nZmlsZTo6CisJUGF0aCB0byBhIGxvZyBmaWxlIHdoZXJlIHRoZSBjdnMgcHNlcnZlciBpbnRlcmZhY2Ugd2VsbC4uLiBsb2dzCisJdmFyaW91cyBzdHVmZi4gU2VlIGdpdGxpbms6Z2l0LWN2c3NlcnZlclsxXS4KKworaHR0cC5zc2xWZXJpZnk6OgorCVdoZXRoZXIgdG8gdmVyaWZ5IHRoZSBTU0wgY2VydGlmaWNhdGUgd2hlbiBmZXRjaGluZyBvciBwdXNoaW5nCisJb3ZlciBIVFRQUy4gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfU1NMX05PX1ZFUklGWScgZW52aXJvbm1lbnQKKwl2YXJpYWJsZS4KKworaHR0cC5zc2xDZXJ0OjoKKwlGaWxlIGNvbnRhaW5pbmcgdGhlIFNTTCBjZXJ0aWZpY2F0ZSB3aGVuIGZldGNoaW5nIG9yIHB1c2hpbmcKKwlvdmVyIEhUVFBTLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9TU0xfQ0VSVCcgZW52aXJvbm1lbnQKKwl2YXJpYWJsZS4KKworaHR0cC5zc2xLZXk6OgorCUZpbGUgY29udGFpbmluZyB0aGUgU1NMIHByaXZhdGUga2V5IHdoZW4gZmV0Y2hpbmcgb3IgcHVzaGluZworCW92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX1NTTF9LRVknIGVudmlyb25tZW50CisJdmFyaWFibGUuCisKK2h0dHAuc3NsQ0FJbmZvOjoKKwlGaWxlIGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlcyB0byB2ZXJpZnkgdGhlIHBlZXIgd2l0aCB3aGVuCisJZmV0Y2hpbmcgb3IgcHVzaGluZyBvdmVyIEhUVFBTLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUKKwknR0lUX1NTTF9DQUlORk8nIGVudmlyb25tZW50IHZhcmlhYmxlLgorCitodHRwLnNzbENBUGF0aDo6CisJUGF0aCBjb250YWluaW5nIGZpbGVzIHdpdGggdGhlIENBIGNlcnRpZmljYXRlcyB0byB2ZXJpZnkgdGhlIHBlZXIKKwl3aXRoIHdoZW4gZmV0Y2hpbmcgb3IgcHVzaGluZyBvdmVyIEhUVFBTLiBDYW4gYmUgb3ZlcnJpZGRlbgorCWJ5IHRoZSAnR0lUX1NTTF9DQVBBVEgnIGVudmlyb25tZW50IHZhcmlhYmxlLgorCitodHRwLm1heFJlcXVlc3RzOjoKKwlIb3cgbWFueSBIVFRQIHJlcXVlc3RzIHRvIGxhdW5jaCBpbiBwYXJhbGxlbC4gQ2FuIGJlIG92ZXJyaWRkZW4KKwlieSB0aGUgJ0dJVF9IVFRQX01BWF9SRVFVRVNUUycgZW52aXJvbm1lbnQgdmFyaWFibGUuIERlZmF1bHQgaXMgNS4KKworaHR0cC5sb3dTcGVlZExpbWl0LCBodHRwLmxvd1NwZWVkVGltZTo6CisJSWYgdGhlIEhUVFAgdHJhbnNmZXIgc3BlZWQgaXMgbGVzcyB0aGFuICdodHRwLmxvd1NwZWVkTGltaXQnCisJZm9yIGxvbmdlciB0aGFuICdodHRwLmxvd1NwZWVkVGltZScgc2Vjb25kcywgdGhlIHRyYW5zZmVyIGlzIGFib3J0ZWQuCisJQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfSFRUUF9MT1dfU1BFRURfTElNSVQnIGFuZAorCSdHSVRfSFRUUF9MT1dfU1BFRURfVElNRScgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitpMThuLmNvbW1pdEVuY29kaW5nOjoKKwlDaGFyYWN0ZXIgZW5jb2RpbmcgdGhlIGNvbW1pdCBtZXNzYWdlcyBhcmUgc3RvcmVkIGluOyBnaXQgaXRzZWxmCisJZG9lcyBub3QgY2FyZSBwZXIgc2UsIGJ1dCB0aGlzIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeSBlLmcuIHdoZW4KKwlpbXBvcnRpbmcgY29tbWl0cyBmcm9tIGVtYWlscyBvciBpbiB0aGUgZ2l0ayBncmFwaGljYWwgaGlzdG9yeQorCWJyb3dzZXIgKGFuZCBwb3NzaWJseSBhdCBvdGhlciBwbGFjZXMgaW4gdGhlIGZ1dHVyZSBvciBpbiBvdGhlcgorCXBvcmNlbGFpbnMpLiBTZWUgZS5nLiBnaXRsaW5rOmdpdC1tYWlsaW5mb1sxXS4gRGVmYXVsdHMgdG8gJ3V0Zi04Jy4KKworbWVyZ2Uuc3VtbWFyeTo6CisJV2hldGhlciB0byBpbmNsdWRlIHN1bW1hcmllcyBvZiBtZXJnZWQgY29tbWl0cyBpbiBuZXdseSBjcmVhdGVkCisJbWVyZ2UgY29tbWl0IG1lc3NhZ2VzLiBGYWxzZSBieSBkZWZhdWx0LgorCitwdWxsLm9jdG9wdXM6OgorCVRoZSBkZWZhdWx0IG1lcmdlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIHB1bGxpbmcgbXVsdGlwbGUgYnJhbmNoZXMKKwlhdCBvbmNlLgorCitwdWxsLnR3b2hlYWQ6OgorCVRoZSBkZWZhdWx0IG1lcmdlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIHB1bGxpbmcgYSBzaW5nbGUgYnJhbmNoLgorCitzaG93LmRpZmZ0cmVlOjoKKwlUaGUgZGVmYXVsdCBnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0gYXJndW1lbnRzIHRvIGJlIHVzZWQKKwlmb3IgZ2l0bGluazpnaXQtc2hvd1sxXS4KKworc2hvd2JyYW5jaC5kZWZhdWx0OjoKKwlUaGUgZGVmYXVsdCBzZXQgb2YgYnJhbmNoZXMgZm9yIGdpdGxpbms6Z2l0LXNob3ctYnJhbmNoWzFdLgorCVNlZSBnaXRsaW5rOmdpdC1zaG93LWJyYW5jaFsxXS4KKwordXNlci5lbWFpbDo6CisJWW91ciBlbWFpbCBhZGRyZXNzIHRvIGJlIHJlY29yZGVkIGluIGFueSBuZXdseSBjcmVhdGVkIGNvbW1pdHMuCisJQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfQVVUSE9SX0VNQUlMJyBhbmQgJ0dJVF9DT01NSVRURVJfRU1BSUwnCisJZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgU2VlIGdpdGxpbms6Z2l0LWNvbW1pdC10cmVlWzFdLgorCit1c2VyLm5hbWU6OgorCVlvdXIgZnVsbCBuYW1lIHRvIGJlIHJlY29yZGVkIGluIGFueSBuZXdseSBjcmVhdGVkIGNvbW1pdHMuCisJQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfQVVUSE9SX05BTUUnIGFuZCAnR0lUX0NPTU1JVFRFUl9OQU1FJworCWVudmlyb25tZW50IHZhcmlhYmxlcy4gIFNlZSBnaXRsaW5rOmdpdC1jb21taXQtdHJlZVsxXS4KKword2hhdGNoYW5nZWQuZGlmZnRyZWU6OgorCVRoZSBkZWZhdWx0IGdpdGxpbms6Z2l0LWRpZmYtdHJlZVsxXSBhcmd1bWVudHMgdG8gYmUgdXNlZAorCWZvciBnaXRsaW5rOmdpdC13aGF0Y2hhbmdlZFsxXS4KKworaW1hcDo6CisJVGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGluIHRoZSAnaW1hcCcgc2VjdGlvbiBhcmUgZGVzY3JpYmVkCisJaW4gZ2l0bGluazpnaXQtaW1hcC1zZW5kWzFdLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLXR1dG9yaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vY29yZS10dXRvcmlhbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NTg5NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29yZS10dXRvcmlhbC50eHQKQEAgLTAsMCArMSwxNzIyIEBACitBIGdpdCBjb3JlIHR1dG9yaWFsIGZvciBkZXZlbG9wZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdHJ5aW5nIHRvIGJlIGEgc2hvcnQgdHV0b3JpYWwgb24gc2V0dGluZyB1cCBhbmQgdXNpbmcgYSBnaXQKK3JlcG9zaXRvcnksIG1haW5seSBiZWNhdXNlIGJlaW5nIGhhbmRzLW9uIGFuZCB1c2luZyBleHBsaWNpdCBleGFtcGxlcyBpcworb2Z0ZW4gdGhlIGJlc3Qgd2F5IG9mIGV4cGxhaW5pbmcgd2hhdCBpcyBnb2luZyBvbi4KKworSW4gbm9ybWFsIGxpZmUsIG1vc3QgcGVvcGxlIHdvdWxkbid0IHVzZSB0aGUgImNvcmUiIGdpdCBwcm9ncmFtcworZGlyZWN0bHksIGJ1dCByYXRoZXIgc2NyaXB0IGFyb3VuZCB0aGVtIHRvIG1ha2UgdGhlbSBtb3JlIHBhbGF0YWJsZS4gCitVbmRlcnN0YW5kaW5nIHRoZSBjb3JlIGdpdCBzdHVmZiBtYXkgaGVscCBzb21lIHBlb3BsZSBnZXQgdGhvc2Ugc2NyaXB0cworZG9uZSwgdGhvdWdoLCBhbmQgaXQgbWF5IGFsc28gYmUgaW5zdHJ1Y3RpdmUgaW4gaGVscGluZyBwZW9wbGUKK3VuZGVyc3RhbmQgd2hhdCBpdCBpcyB0aGF0IHRoZSBoaWdoZXItbGV2ZWwgaGVscGVyIHNjcmlwdHMgYXJlIGFjdHVhbGx5Citkb2luZy4gCisKK1RoZSBjb3JlIGdpdCBpcyBvZnRlbiBjYWxsZWQgInBsdW1iaW5nIiwgd2l0aCB0aGUgcHJldHRpZXIgdXNlcgoraW50ZXJmYWNlcyBvbiB0b3Agb2YgaXQgY2FsbGVkICJwb3JjZWxhaW4iLiBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSB0aGUKK3BsdW1iaW5nIGRpcmVjdGx5IHZlcnkgb2Z0ZW4sIGJ1dCBpdCBjYW4gYmUgZ29vZCB0byBrbm93IHdoYXQgdGhlCitwbHVtYmluZyBkb2VzIGZvciB3aGVuIHRoZSBwb3JjZWxhaW4gaXNuJ3QgZmx1c2hpbmcuCisKK1RoZSBtYXRlcmlhbCBwcmVzZW50ZWQgaGVyZSBvZnRlbiBnb2VzIGRlZXAgZGVzY3JpYmluZyBob3cgdGhpbmdzCit3b3JrIGludGVybmFsbHkuICBJZiB5b3UgYXJlIG1vc3RseSBpbnRlcmVzdGVkIGluIHVzaW5nIGdpdCBhcyBhCitTQ00sIHlvdSBjYW4gc2tpcCB0aGVtIGR1cmluZyB5b3VyIGZpcnN0IHBhc3MuCisKK1tOT1RFXQorQW5kIHRob3NlICJ0b28gZGVlcCIgZGVzY3JpcHRpb25zIGFyZSBvZnRlbiBtYXJrZWQgYXMgTm90ZS4KKworW05PVEVdCitJZiB5b3UgYXJlIGFscmVhZHkgZmFtaWxpYXIgd2l0aCBhbm90aGVyIHZlcnNpb24gY29udHJvbCBzeXN0ZW0sCitsaWtlIENWUywgeW91IG1heSB3YW50IHRvIHRha2UgYSBsb29rIGF0CitsaW5rOmV2ZXJ5ZGF5Lmh0bWxbRXZlcnlkYXkgR0lUIGluIDIwIGNvbW1hbmRzIG9yIHNvXSBmaXJzdAorYmVmb3JlIHJlYWRpbmcgdGhpcy4KKworCitDcmVhdGluZyBhIGdpdCByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NyZWF0aW5nIGEgbmV3IGdpdCByZXBvc2l0b3J5IGNvdWxkbid0IGJlIGVhc2llcjogYWxsIGdpdCByZXBvc2l0b3JpZXMgc3RhcnQKK291dCBlbXB0eSwgYW5kIHRoZSBvbmx5IHRoaW5nIHlvdSBuZWVkIHRvIGRvIGlzIGZpbmQgeW91cnNlbGYgYQorc3ViZGlyZWN0b3J5IHRoYXQgeW91IHdhbnQgdG8gdXNlIGFzIGEgd29ya2luZyB0cmVlIC0gZWl0aGVyIGFuIGVtcHR5CitvbmUgZm9yIGEgdG90YWxseSBuZXcgcHJvamVjdCwgb3IgYW4gZXhpc3Rpbmcgd29ya2luZyB0cmVlIHRoYXQgeW91IHdhbnQKK3RvIGltcG9ydCBpbnRvIGdpdC4gCisKK0ZvciBvdXIgZmlyc3QgZXhhbXBsZSwgd2UncmUgZ29pbmcgdG8gc3RhcnQgYSB0b3RhbGx5IG5ldyByZXBvc2l0b3J5IGZyb20KK3NjcmF0Y2gsIHdpdGggbm8gcHJlLWV4aXN0aW5nIGZpbGVzLCBhbmQgd2UnbGwgY2FsbCBpdCBgZ2l0LXR1dG9yaWFsYC4KK1RvIHN0YXJ0IHVwLCBjcmVhdGUgYSBzdWJkaXJlY3RvcnkgZm9yIGl0LCBjaGFuZ2UgaW50byB0aGF0CitzdWJkaXJlY3RvcnksIGFuZCBpbml0aWFsaXplIHRoZSBnaXQgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBgZ2l0LWluaXQtZGJgOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgZ2l0LXR1dG9yaWFsCiskIGNkIGdpdC10dXRvcmlhbAorJCBnaXQtaW5pdC1kYgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHdoaWNoIGdpdCB3aWxsIHJlcGx5CisKKy0tLS0tLS0tLS0tLS0tLS0KK2RlZmF1bHRpbmcgdG8gbG9jYWwgc3RvcmFnZSBhcmVhCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGlzIGp1c3QgZ2l0J3Mgd2F5IG9mIHNheWluZyB0aGF0IHlvdSBoYXZlbid0IGJlZW4gZG9pbmcgYW55dGhpbmcKK3N0cmFuZ2UsIGFuZCB0aGF0IGl0IHdpbGwgaGF2ZSBjcmVhdGVkIGEgbG9jYWwgYC5naXRgIGRpcmVjdG9yeSBzZXR1cCBmb3IKK3lvdXIgbmV3IHByb2plY3QuIFlvdSB3aWxsIG5vdyBoYXZlIGEgYC5naXRgIGRpcmVjdG9yeSwgYW5kIHlvdSBjYW4KK2luc3BlY3QgdGhhdCB3aXRoIGBsc2AuIEZvciB5b3VyIG5ldyBlbXB0eSBwcm9qZWN0LCBpdCBzaG91bGQgc2hvdyB5b3UKK3RocmVlIGVudHJpZXMsIGFtb25nIG90aGVyIHRoaW5nczoKKworIC0gYSBmaWxlIGNhbGxlZCBgSEVBRGAsIHRoYXQgaGFzIGByZWY6IHJlZnMvaGVhZHMvbWFzdGVyYCBpbiBpdC4KKyAgIFRoaXMgaXMgc2ltaWxhciB0byBhIHN5bWJvbGljIGxpbmsgYW5kIHBvaW50cyBhdAorICAgYHJlZnMvaGVhZHMvbWFzdGVyYCByZWxhdGl2ZSB0byB0aGUgYEhFQURgIGZpbGUuCisrCitEb24ndCB3b3JyeSBhYm91dCB0aGUgZmFjdCB0aGF0IHRoZSBmaWxlIHRoYXQgdGhlIGBIRUFEYCBsaW5rIHBvaW50cyB0bworZG9lc24ndCBldmVuIGV4aXN0IHlldCAtLSB5b3UgaGF2ZW4ndCBjcmVhdGVkIHRoZSBjb21taXQgdGhhdCB3aWxsCitzdGFydCB5b3VyIGBIRUFEYCBkZXZlbG9wbWVudCBicmFuY2ggeWV0LgorCisgLSBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgYG9iamVjdHNgLCB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIHRoZQorICAgb2JqZWN0cyBvZiB5b3VyIHByb2plY3QuIFlvdSBzaG91bGQgbmV2ZXIgaGF2ZSBhbnkgcmVhbCByZWFzb24gdG8KKyAgIGxvb2sgYXQgdGhlIG9iamVjdHMgZGlyZWN0bHksIGJ1dCB5b3UgbWlnaHQgd2FudCB0byBrbm93IHRoYXQgdGhlc2UKKyAgIG9iamVjdHMgYXJlIHdoYXQgY29udGFpbnMgYWxsIHRoZSByZWFsICdkYXRhJyBpbiB5b3VyIHJlcG9zaXRvcnkuCisKKyAtIGEgc3ViZGlyZWN0b3J5IGNhbGxlZCBgcmVmc2AsIHdoaWNoIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb2JqZWN0cy4KKworSW4gcGFydGljdWxhciwgdGhlIGByZWZzYCBzdWJkaXJlY3Rvcnkgd2lsbCBjb250YWluIHR3byBvdGhlcgorc3ViZGlyZWN0b3JpZXMsIG5hbWVkIGBoZWFkc2AgYW5kIGB0YWdzYCByZXNwZWN0aXZlbHkuIFRoZXkgZG8KK2V4YWN0bHkgd2hhdCB0aGVpciBuYW1lcyBpbXBseTogdGhleSBjb250YWluIHJlZmVyZW5jZXMgdG8gYW55IG51bWJlcgorb2YgZGlmZmVyZW50ICdoZWFkcycgb2YgZGV2ZWxvcG1lbnQgKGFrYSAnYnJhbmNoZXMnKSwgYW5kIHRvIGFueQorJ3RhZ3MnIHRoYXQgeW91IGhhdmUgY3JlYXRlZCB0byBuYW1lIHNwZWNpZmljIHZlcnNpb25zIGluIHlvdXIKK3JlcG9zaXRvcnkuCisKK09uZSBub3RlOiB0aGUgc3BlY2lhbCBgbWFzdGVyYCBoZWFkIGlzIHRoZSBkZWZhdWx0IGJyYW5jaCwgd2hpY2ggaXMKK3doeSB0aGUgYC5naXQvSEVBRGAgZmlsZSB3YXMgY3JlYXRlZCBwb2ludHMgdG8gaXQgZXZlbiBpZiBpdAorZG9lc24ndCB5ZXQgZXhpc3QuIEJhc2ljYWxseSwgdGhlIGBIRUFEYCBsaW5rIGlzIHN1cHBvc2VkIHRvIGFsd2F5cworcG9pbnQgdG8gdGhlIGJyYW5jaCB5b3UgYXJlIHdvcmtpbmcgb24gcmlnaHQgbm93LCBhbmQgeW91IGFsd2F5cworc3RhcnQgb3V0IGV4cGVjdGluZyB0byB3b3JrIG9uIHRoZSBgbWFzdGVyYCBicmFuY2guCisKK0hvd2V2ZXIsIHRoaXMgaXMgb25seSBhIGNvbnZlbnRpb24sIGFuZCB5b3UgY2FuIG5hbWUgeW91ciBicmFuY2hlcworYW55dGhpbmcgeW91IHdhbnQsIGFuZCBkb24ndCBoYXZlIHRvIGV2ZXIgZXZlbiAnaGF2ZScgYSBgbWFzdGVyYAorYnJhbmNoLiBBIG51bWJlciBvZiB0aGUgZ2l0IHRvb2xzIHdpbGwgYXNzdW1lIHRoYXQgYC5naXQvSEVBRGAgaXMKK3ZhbGlkLCB0aG91Z2guCisKK1tOT1RFXQorQW4gJ29iamVjdCcgaXMgaWRlbnRpZmllZCBieSBpdHMgMTYwLWJpdCBTSEExIGhhc2gsIGFrYSAnb2JqZWN0IG5hbWUnLAorYW5kIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpcyBhbHdheXMgdGhlIDQwLWJ5dGUgaGV4CityZXByZXNlbnRhdGlvbiBvZiB0aGF0IFNIQTEgbmFtZS4gVGhlIGZpbGVzIGluIHRoZSBgcmVmc2AKK3N1YmRpcmVjdG9yeSBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbiB0aGVzZSBoZXggcmVmZXJlbmNlcworKHVzdWFsbHkgd2l0aCBhIGZpbmFsIGBcJ1xuXCdgIGF0IHRoZSBlbmQpLCBhbmQgeW91IHNob3VsZCB0aHVzCitleHBlY3QgdG8gc2VlIGEgbnVtYmVyIG9mIDQxLWJ5dGUgZmlsZXMgY29udGFpbmluZyB0aGVzZQorcmVmZXJlbmNlcyBpbiB0aGVzZSBgcmVmc2Agc3ViZGlyZWN0b3JpZXMgd2hlbiB5b3UgYWN0dWFsbHkgc3RhcnQKK3BvcHVsYXRpbmcgeW91ciB0cmVlLgorCitbTk9URV0KK0FuIGFkdmFuY2VkIHVzZXIgbWF5IHdhbnQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlCitsaW5rOnJlcG9zaXRvcnktbGF5b3V0Lmh0bWxbcmVwb3NpdG9yeSBsYXlvdXRdIGRvY3VtZW50CithZnRlciBmaW5pc2hpbmcgdGhpcyB0dXRvcmlhbC4KKworWW91IGhhdmUgbm93IGNyZWF0ZWQgeW91ciBmaXJzdCBnaXQgcmVwb3NpdG9yeS4gT2YgY291cnNlLCBzaW5jZSBpdCdzCitlbXB0eSwgdGhhdCdzIG5vdCB2ZXJ5IHVzZWZ1bCwgc28gbGV0J3Mgc3RhcnQgcG9wdWxhdGluZyBpdCB3aXRoIGRhdGEuCisKKworUG9wdWxhdGluZyBhIGdpdCByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2UnbGwga2VlcCB0aGlzIHNpbXBsZSBhbmQgc3R1cGlkLCBzbyB3ZSdsbCBzdGFydCBvZmYgd2l0aCBwb3B1bGF0aW5nIGEKK2ZldyB0cml2aWFsIGZpbGVzIGp1c3QgdG8gZ2V0IGEgZmVlbCBmb3IgaXQuCisKK1N0YXJ0IG9mZiB3aXRoIGp1c3QgY3JlYXRpbmcgYW55IHJhbmRvbSBmaWxlcyB0aGF0IHlvdSB3YW50IHRvIG1haW50YWluCitpbiB5b3VyIGdpdCByZXBvc2l0b3J5LiBXZSdsbCBzdGFydCBvZmYgd2l0aCBhIGZldyBiYWQgZXhhbXBsZXMsIGp1c3QgdG8KK2dldCBhIGZlZWwgZm9yIGhvdyB0aGlzIHdvcmtzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZWNobyAiSGVsbG8gV29ybGQiID5oZWxsbworJCBlY2hvICJTaWxseSBleGFtcGxlIiA+ZXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3lvdSBoYXZlIG5vdyBjcmVhdGVkIHR3byBmaWxlcyBpbiB5b3VyIHdvcmtpbmcgdHJlZSAoYWthICd3b3JraW5nIGRpcmVjdG9yeScpLAorYnV0IHRvIGFjdHVhbGx5IGNoZWNrIGluIHlvdXIgaGFyZCB3b3JrLCB5b3Ugd2lsbCBoYXZlIHRvIGdvIHRocm91Z2ggdHdvIHN0ZXBzOgorCisgLSBmaWxsIGluIHRoZSAnaW5kZXgnIGZpbGUgKGFrYSAnY2FjaGUnKSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB5b3VyCisgICB3b3JraW5nIHRyZWUgc3RhdGUuCisKKyAtIGNvbW1pdCB0aGF0IGluZGV4IGZpbGUgYXMgYW4gb2JqZWN0LgorCitUaGUgZmlyc3Qgc3RlcCBpcyB0cml2aWFsOiB3aGVuIHlvdSB3YW50IHRvIHRlbGwgZ2l0IGFib3V0IGFueSBjaGFuZ2VzCit0byB5b3VyIHdvcmtpbmcgdHJlZSwgeW91IHVzZSB0aGUgYGdpdC11cGRhdGUtaW5kZXhgIHByb2dyYW0uIFRoYXQKK3Byb2dyYW0gbm9ybWFsbHkganVzdCB0YWtlcyBhIGxpc3Qgb2YgZmlsZW5hbWVzIHlvdSB3YW50IHRvIHVwZGF0ZSwgYnV0Cit0byBhdm9pZCB0cml2aWFsIG1pc3Rha2VzLCBpdCByZWZ1c2VzIHRvIGFkZCBuZXcgZW50cmllcyB0byB0aGUgaW5kZXgKKyhvciByZW1vdmUgZXhpc3Rpbmcgb25lcykgdW5sZXNzIHlvdSBleHBsaWNpdGx5IHRlbGwgaXQgdGhhdCB5b3UncmUKK2FkZGluZyBhIG5ldyBlbnRyeSB3aXRoIHRoZSBgXC0tYWRkYCBmbGFnIChvciByZW1vdmluZyBhbiBlbnRyeSB3aXRoIHRoZQorYFwtLXJlbW92ZWApIGZsYWcuCisKK1NvIHRvIHBvcHVsYXRlIHRoZSBpbmRleCB3aXRoIHRoZSB0d28gZmlsZXMgeW91IGp1c3QgY3JlYXRlZCwgeW91IGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBoZWxsbyBleGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHlvdSBoYXZlIG5vdyB0b2xkIGdpdCB0byB0cmFjayB0aG9zZSB0d28gZmlsZXMuCisKK0luIGZhY3QsIGFzIHlvdSBkaWQgdGhhdCwgaWYgeW91IG5vdyBsb29rIGludG8geW91ciBvYmplY3QgZGlyZWN0b3J5LAoreW91J2xsIG5vdGljZSB0aGF0IGdpdCB3aWxsIGhhdmUgYWRkZWQgdHdvIG5ldyBvYmplY3RzIHRvIHRoZSBvYmplY3QKK2RhdGFiYXNlLiBJZiB5b3UgZGlkIGV4YWN0bHkgdGhlIHN0ZXBzIGFib3ZlLCB5b3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvCisKKworLS0tLS0tLS0tLS0tLS0tLQorJCBscyAuZ2l0L29iamVjdHMvPz8vKgorLS0tLS0tLS0tLS0tLS0tLQorCithbmQgc2VlIHR3byBmaWxlczoKKworLS0tLS0tLS0tLS0tLS0tLQorLmdpdC9vYmplY3RzLzU1LzdkYjAzZGU5OTdjODZhNGEwMjhlMWViZDNhMWNlYjIyNWJlMjM4IAorLmdpdC9vYmplY3RzL2YyLzRjNzRhMmU1MDBmNWVlMTMzMmM4NmI5NDE5OWY1MmIxZDFkOTYyCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGNvcnJlc3BvbmQgd2l0aCB0aGUgb2JqZWN0cyB3aXRoIG5hbWVzIG9mIGA1NTdkYi4uLmAgYW5kCitgZjI0YzcuLi5gIHJlc3BlY3RpdmVseS4KKworSWYgeW91IHdhbnQgdG8sIHlvdSBjYW4gdXNlIGBnaXQtY2F0LWZpbGVgIHRvIGxvb2sgYXQgdGhvc2Ugb2JqZWN0cywgYnV0Cit5b3UnbGwgaGF2ZSB0byB1c2UgdGhlIG9iamVjdCBuYW1lLCBub3QgdGhlIGZpbGVuYW1lIG9mIHRoZSBvYmplY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNhdC1maWxlIC10IDU1N2RiMDNkZTk5N2M4NmE0YTAyOGUxZWJkM2ExY2ViMjI1YmUyMzgKKy0tLS0tLS0tLS0tLS0tLS0KKword2hlcmUgdGhlIGAtdGAgdGVsbHMgYGdpdC1jYXQtZmlsZWAgdG8gdGVsbCB5b3Ugd2hhdCB0aGUgInR5cGUiIG9mIHRoZQorb2JqZWN0IGlzLiBnaXQgd2lsbCB0ZWxsIHlvdSB0aGF0IHlvdSBoYXZlIGEgImJsb2IiIG9iamVjdCAoaS5lLiwganVzdCBhCityZWd1bGFyIGZpbGUpLCBhbmQgeW91IGNhbiBzZWUgdGhlIGNvbnRlbnRzIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgImJsb2IiIDU1N2RiMDMKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBwcmludCBvdXQgIkhlbGxvIFdvcmxkIi4gVGhlIG9iamVjdCBgNTU3ZGIwM2AgaXMgbm90aGluZworbW9yZSB0aGFuIHRoZSBjb250ZW50cyBvZiB5b3VyIGZpbGUgYGhlbGxvYC4KKworW05PVEVdCitEb24ndCBjb25mdXNlIHRoYXQgb2JqZWN0IHdpdGggdGhlIGZpbGUgYGhlbGxvYCBpdHNlbGYuIFRoZQorb2JqZWN0IGlzIGxpdGVyYWxseSBqdXN0IHRob3NlIHNwZWNpZmljICpjb250ZW50cyogb2YgdGhlIGZpbGUsIGFuZAoraG93ZXZlciBtdWNoIHlvdSBsYXRlciBjaGFuZ2UgdGhlIGNvbnRlbnRzIGluIGZpbGUgYGhlbGxvYCwgdGhlIG9iamVjdAord2UganVzdCBsb29rZWQgYXQgd2lsbCBuZXZlciBjaGFuZ2UuIE9iamVjdHMgYXJlIGltbXV0YWJsZS4KKworW05PVEVdCitUaGUgc2Vjb25kIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoYXQgeW91IGNhbgorYWJicmV2aWF0ZSB0aGUgb2JqZWN0IG5hbWUgdG8gb25seSB0aGUgZmlyc3Qgc2V2ZXJhbAoraGV4YWRlY2ltYWwgZGlnaXRzIGluIG1vc3QgcGxhY2VzLgorCitBbnl3YXksIGFzIHdlIG1lbnRpb25lZCBwcmV2aW91c2x5LCB5b3Ugbm9ybWFsbHkgbmV2ZXIgYWN0dWFsbHkgdGFrZSBhCitsb29rIGF0IHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGFuZCB0eXBpbmcgbG9uZyA0MC1jaGFyYWN0ZXIgaGV4CituYW1lcyBpcyBub3Qgc29tZXRoaW5nIHlvdSdkIG5vcm1hbGx5IHdhbnQgdG8gZG8uIFRoZSBhYm92ZSBkaWdyZXNzaW9uCit3YXMganVzdCB0byBzaG93IHRoYXQgYGdpdC11cGRhdGUtaW5kZXhgIGRpZCBzb21ldGhpbmcgbWFnaWNhbCwgYW5kCithY3R1YWxseSBzYXZlZCBhd2F5IHRoZSBjb250ZW50cyBvZiB5b3VyIGZpbGVzIGludG8gdGhlIGdpdCBvYmplY3QKK2RhdGFiYXNlLgorCitVcGRhdGluZyB0aGUgaW5kZXggZGlkIHNvbWV0aGluZyBlbHNlIHRvbzogaXQgY3JlYXRlZCBhIGAuZ2l0L2luZGV4YAorZmlsZS4gVGhpcyBpcyB0aGUgaW5kZXggdGhhdCBkZXNjcmliZXMgeW91ciBjdXJyZW50IHdvcmtpbmcgdHJlZSwgYW5kCitzb21ldGhpbmcgeW91IHNob3VsZCBiZSB2ZXJ5IGF3YXJlIG9mLiBBZ2FpbiwgeW91IG5vcm1hbGx5IG5ldmVyIHdvcnJ5CithYm91dCB0aGUgaW5kZXggZmlsZSBpdHNlbGYsIGJ1dCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQKK3lvdSBoYXZlIG5vdCBhY3R1YWxseSByZWFsbHkgImNoZWNrZWQgaW4iIHlvdXIgZmlsZXMgaW50byBnaXQgc28gZmFyLAoreW91J3ZlIG9ubHkgKnRvbGQqIGdpdCBhYm91dCB0aGVtLgorCitIb3dldmVyLCBzaW5jZSBnaXQga25vd3MgYWJvdXQgdGhlbSwgeW91IGNhbiBub3cgc3RhcnQgdXNpbmcgc29tZSBvZiB0aGUKK21vc3QgYmFzaWMgZ2l0IGNvbW1hbmRzIHRvIG1hbmlwdWxhdGUgdGhlIGZpbGVzIG9yIGxvb2sgYXQgdGhlaXIgc3RhdHVzLiAKKworSW4gcGFydGljdWxhciwgbGV0J3Mgbm90IGV2ZW4gY2hlY2sgaW4gdGhlIHR3byBmaWxlcyBpbnRvIGdpdCB5ZXQsIHdlJ2xsCitzdGFydCBvZmYgYnkgYWRkaW5nIGFub3RoZXIgbGluZSB0byBgaGVsbG9gIGZpcnN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZWNobyAiSXQncyBhIG5ldyBkYXkgZm9yIGdpdCIgPj5oZWxsbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3UgY2FuIG5vdywgc2luY2UgeW91IHRvbGQgZ2l0IGFib3V0IHRoZSBwcmV2aW91cyBzdGF0ZSBvZiBgaGVsbG9gLCBhc2sKK2dpdCB3aGF0IGhhcyBjaGFuZ2VkIGluIHRoZSB0cmVlIGNvbXBhcmVkIHRvIHlvdXIgb2xkIGluZGV4LCB1c2luZyB0aGUKK2BnaXQtZGlmZi1maWxlc2AgY29tbWFuZDoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1kaWZmLWZpbGVzCistLS0tLS0tLS0tLS0KKworT29wcy4gVGhhdCB3YXNuJ3QgdmVyeSByZWFkYWJsZS4gSXQganVzdCBzcGl0IG91dCBpdHMgb3duIGludGVybmFsCit2ZXJzaW9uIG9mIGEgYGRpZmZgLCBidXQgdGhhdCBpbnRlcm5hbCB2ZXJzaW9uIHJlYWxseSBqdXN0IHRlbGxzIHlvdQordGhhdCBpdCBoYXMgbm90aWNlZCB0aGF0ICJoZWxsbyIgaGFzIGJlZW4gbW9kaWZpZWQsIGFuZCB0aGF0IHRoZSBvbGQgb2JqZWN0Citjb250ZW50cyBpdCBoYWQgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nIGVsc2UuCisKK1RvIG1ha2UgaXQgcmVhZGFibGUsIHdlIGNhbiB0ZWxsIGdpdC1kaWZmLWZpbGVzIHRvIG91dHB1dCB0aGUKK2RpZmZlcmVuY2VzIGFzIGEgcGF0Y2gsIHVzaW5nIHRoZSBgLXBgIGZsYWc6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtZGlmZi1maWxlcyAtcAorZGlmZiAtLWdpdCBhL2hlbGxvIGIvaGVsbG8KK2luZGV4IDU1N2RiMDMuLjI2MzQxNGYgMTAwNjQ0CistLS0gYS9oZWxsbworKysrIGIvaGVsbG8KK0BAIC0xICsxLDIgQEAKKyBIZWxsbyBXb3JsZAorK0l0J3MgYSBuZXcgZGF5IGZvciBnaXQKKy0tLS0KKworaS5lLiB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlIHdlIGNhdXNlZCBieSBhZGRpbmcgYW5vdGhlciBsaW5lIHRvIGBoZWxsb2AuCisKK0luIG90aGVyIHdvcmRzLCBgZ2l0LWRpZmYtZmlsZXNgIGFsd2F5cyBzaG93cyB1cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCit3aGF0IGlzIHJlY29yZGVkIGluIHRoZSBpbmRleCwgYW5kIHdoYXQgaXMgY3VycmVudGx5IGluIHRoZSB3b3JraW5nCit0cmVlLiBUaGF0J3MgdmVyeSB1c2VmdWwuCisKK0EgY29tbW9uIHNob3J0aGFuZCBmb3IgYGdpdC1kaWZmLWZpbGVzIC1wYCBpcyB0byBqdXN0IHdyaXRlIGBnaXQKK2RpZmZgLCB3aGljaCB3aWxsIGRvIHRoZSBzYW1lIHRoaW5nLgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYKK2RpZmYgLS1naXQgYS9oZWxsbyBiL2hlbGxvCitpbmRleCA1NTdkYjAzLi4yNjM0MTRmIDEwMDY0NAorLS0tIGEvaGVsbG8KKysrKyBiL2hlbGxvCitAQCAtMSArMSwyIEBACisgSGVsbG8gV29ybGQKKytJdCdzIGEgbmV3IGRheSBmb3IgZ2l0CistLS0tLS0tLS0tLS0KKworCitDb21taXR0aW5nIGdpdCBzdGF0ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93LCB3ZSB3YW50IHRvIGdvIHRvIHRoZSBuZXh0IHN0YWdlIGluIGdpdCwgd2hpY2ggaXMgdG8gdGFrZSB0aGUgZmlsZXMKK3RoYXQgZ2l0IGtub3dzIGFib3V0IGluIHRoZSBpbmRleCwgYW5kIGNvbW1pdCB0aGVtIGFzIGEgcmVhbCB0cmVlLiBXZSBkbwordGhhdCBpbiB0d28gcGhhc2VzOiBjcmVhdGluZyBhICd0cmVlJyBvYmplY3QsIGFuZCBjb21taXR0aW5nIHRoYXQgJ3RyZWUnCitvYmplY3QgYXMgYSAnY29tbWl0JyBvYmplY3QgdG9nZXRoZXIgd2l0aCBhbiBleHBsYW5hdGlvbiBvZiB3aGF0IHRoZQordHJlZSB3YXMgYWxsIGFib3V0LCBhbG9uZyB3aXRoIGluZm9ybWF0aW9uIG9mIGhvdyB3ZSBjYW1lIHRvIHRoYXQgc3RhdGUuCisKK0NyZWF0aW5nIGEgdHJlZSBvYmplY3QgaXMgdHJpdmlhbCwgYW5kIGlzIGRvbmUgd2l0aCBgZ2l0LXdyaXRlLXRyZWVgLgorVGhlcmUgYXJlIG5vIG9wdGlvbnMgb3Igb3RoZXIgaW5wdXQ6IGdpdC13cml0ZS10cmVlIHdpbGwgdGFrZSB0aGUKK2N1cnJlbnQgaW5kZXggc3RhdGUsIGFuZCB3cml0ZSBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhhdCB3aG9sZQoraW5kZXguIEluIG90aGVyIHdvcmRzLCB3ZSdyZSBub3cgdHlpbmcgdG9nZXRoZXIgYWxsIHRoZSBkaWZmZXJlbnQKK2ZpbGVuYW1lcyB3aXRoIHRoZWlyIGNvbnRlbnRzIChhbmQgdGhlaXIgcGVybWlzc2lvbnMpLCBhbmQgd2UncmUKK2NyZWF0aW5nIHRoZSBlcXVpdmFsZW50IG9mIGEgZ2l0ICJkaXJlY3RvcnkiIG9iamVjdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC13cml0ZS10cmVlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoaXMgd2lsbCBqdXN0IG91dHB1dCB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIHRyZWUsIGluIHRoaXMgY2FzZQorKGlmIHlvdSBoYXZlIGRvbmUgZXhhY3RseSBhcyBJJ3ZlIGRlc2NyaWJlZCkgaXQgc2hvdWxkIGJlCisKKy0tLS0tLS0tLS0tLS0tLS0KKzg5ODhkYTE1ZDA3N2Q0ODI5ZmM1MWQ4NTQ0YzA5N2RlZjY2NDRkYmIKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggaXMgYW5vdGhlciBpbmNvbXByZWhlbnNpYmxlIG9iamVjdCBuYW1lLiBBZ2FpbiwgaWYgeW91IHdhbnQgdG8sCit5b3UgY2FuIHVzZSBgZ2l0LWNhdC1maWxlIC10IDg5ODhkXC4uLmAgdG8gc2VlIHRoYXQgdGhpcyB0aW1lIHRoZSBvYmplY3QKK2lzIG5vdCBhICJibG9iIiBvYmplY3QsIGJ1dCBhICJ0cmVlIiBvYmplY3QgKHlvdSBjYW4gYWxzbyB1c2UKK2BnaXQtY2F0LWZpbGVgIHRvIGFjdHVhbGx5IG91dHB1dCB0aGUgcmF3IG9iamVjdCBjb250ZW50cywgYnV0IHlvdSdsbCBzZWUKK21haW5seSBhIGJpbmFyeSBtZXNzLCBzbyB0aGF0J3MgbGVzcyBpbnRlcmVzdGluZykuCisKK0hvd2V2ZXIgLS0gbm9ybWFsbHkgeW91J2QgbmV2ZXIgdXNlIGBnaXQtd3JpdGUtdHJlZWAgb24gaXRzIG93biwgYmVjYXVzZQorbm9ybWFsbHkgeW91IGFsd2F5cyBjb21taXQgYSB0cmVlIGludG8gYSBjb21taXQgb2JqZWN0IHVzaW5nIHRoZQorYGdpdC1jb21taXQtdHJlZWAgY29tbWFuZC4gSW4gZmFjdCwgaXQncyBlYXNpZXIgdG8gbm90IGFjdHVhbGx5IHVzZQorYGdpdC13cml0ZS10cmVlYCBvbiBpdHMgb3duIGF0IGFsbCwgYnV0IHRvIGp1c3QgcGFzcyBpdHMgcmVzdWx0IGluIGFzIGFuCithcmd1bWVudCB0byBgZ2l0LWNvbW1pdC10cmVlYC4KKworYGdpdC1jb21taXQtdHJlZWAgbm9ybWFsbHkgdGFrZXMgc2V2ZXJhbCBhcmd1bWVudHMgLS0gaXQgd2FudHMgdG8ga25vdword2hhdCB0aGUgJ3BhcmVudCcgb2YgYSBjb21taXQgd2FzLCBidXQgc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgY29tbWl0CitldmVyIGluIHRoaXMgbmV3IHJlcG9zaXRvcnksIGFuZCBpdCBoYXMgbm8gcGFyZW50cywgd2Ugb25seSBuZWVkIHRvIHBhc3MgaW4KK3RoZSBvYmplY3QgbmFtZSBvZiB0aGUgdHJlZS4gSG93ZXZlciwgYGdpdC1jb21taXQtdHJlZWAKK2Fsc28gd2FudHMgdG8gZ2V0IGEgY29tbWl0IG1lc3NhZ2UKK29uIGl0cyBzdGFuZGFyZCBpbnB1dCwgYW5kIGl0IHdpbGwgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcgb2JqZWN0IG5hbWUgZm9yIHRoZQorY29tbWl0IHRvIGl0cyBzdGFuZGFyZCBvdXRwdXQuCisKK0FuZCB0aGlzIGlzIHdoZXJlIHdlIGNyZWF0ZSB0aGUgYC5naXQvcmVmcy9oZWFkcy9tYXN0ZXJgIGZpbGUKK3doaWNoIGlzIHBvaW50ZWQgYXQgYnkgYEhFQURgLiBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gY29udGFpbgordGhlIHJlZmVyZW5jZSB0byB0aGUgdG9wLW9mLXRyZWUgb2YgdGhlIG1hc3RlciBicmFuY2gsIGFuZCBzaW5jZQordGhhdCdzIGV4YWN0bHkgd2hhdCBgZ2l0LWNvbW1pdC10cmVlYCBzcGl0cyBvdXQsIHdlIGNhbiBkbyB0aGlzCithbGwgd2l0aCBhIHNlcXVlbmNlIG9mIHNpbXBsZSBzaGVsbCBjb21tYW5kczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkKKyQgY29tbWl0PSQoZWNobyAnSW5pdGlhbCBjb21taXQnIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlKQorJCBnaXQtdXBkYXRlLXJlZiBIRUFEICRjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHNheToKKworLS0tLS0tLS0tLS0tLS0tLQorQ29tbWl0dGluZyBpbml0aWFsIHRyZWUgODk4OGRhMTVkMDc3ZDQ4MjlmYzUxZDg1NDRjMDk3ZGVmNjY0NGRiYgorLS0tLS0tLS0tLS0tLS0tLQorCitqdXN0IHRvIHdhcm4geW91IGFib3V0IHRoZSBmYWN0IHRoYXQgaXQgY3JlYXRlZCBhIHRvdGFsbHkgbmV3IGNvbW1pdAordGhhdCBpcyBub3QgcmVsYXRlZCB0byBhbnl0aGluZyBlbHNlLiBOb3JtYWxseSB5b3UgZG8gdGhpcyBvbmx5ICpvbmNlKgorZm9yIGEgcHJvamVjdCBldmVyLCBhbmQgYWxsIGxhdGVyIGNvbW1pdHMgd2lsbCBiZSBwYXJlbnRlZCBvbiB0b3Agb2YgYW4KK2VhcmxpZXIgY29tbWl0LCBhbmQgeW91J2xsIG5ldmVyIHNlZSB0aGlzICJDb21taXR0aW5nIGluaXRpYWwgdHJlZSIKK21lc3NhZ2UgZXZlciBhZ2Fpbi4KKworQWdhaW4sIG5vcm1hbGx5IHlvdSdkIG5ldmVyIGFjdHVhbGx5IGRvIHRoaXMgYnkgaGFuZC4gVGhlcmUgaXMgYQoraGVscGZ1bCBzY3JpcHQgY2FsbGVkIGBnaXQgY29tbWl0YCB0aGF0IHdpbGwgZG8gYWxsIG9mIHRoaXMgZm9yIHlvdS4gU28KK3lvdSBjb3VsZCBoYXZlIGp1c3Qgd3JpdHRlbiBgZ2l0IGNvbW1pdGAKK2luc3RlYWQsIGFuZCBpdCB3b3VsZCBoYXZlIGRvbmUgdGhlIGFib3ZlIG1hZ2ljIHNjcmlwdGluZyBmb3IgeW91LgorCisKK01ha2luZyBhIGNoYW5nZQorLS0tLS0tLS0tLS0tLS0tCisKK1JlbWVtYmVyIGhvdyB3ZSBkaWQgdGhlIGBnaXQtdXBkYXRlLWluZGV4YCBvbiBmaWxlIGBoZWxsb2AgYW5kIHRoZW4gd2UKK2NoYW5nZWQgYGhlbGxvYCBhZnRlcndhcmQsIGFuZCBjb3VsZCBjb21wYXJlIHRoZSBuZXcgc3RhdGUgb2YgYGhlbGxvYCB3aXRoIHRoZQorc3RhdGUgd2Ugc2F2ZWQgaW4gdGhlIGluZGV4IGZpbGU/IAorCitGdXJ0aGVyLCByZW1lbWJlciBob3cgSSBzYWlkIHRoYXQgYGdpdC13cml0ZS10cmVlYCB3cml0ZXMgdGhlIGNvbnRlbnRzCitvZiB0aGUgKmluZGV4KiBmaWxlIHRvIHRoZSB0cmVlLCBhbmQgdGh1cyB3aGF0IHdlIGp1c3QgY29tbWl0dGVkIHdhcyBpbgorZmFjdCB0aGUgKm9yaWdpbmFsKiBjb250ZW50cyBvZiB0aGUgZmlsZSBgaGVsbG9gLCBub3QgdGhlIG5ldyBvbmVzLiBXZSBkaWQKK3RoYXQgb24gcHVycG9zZSwgdG8gc2hvdyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBpbmRleCBzdGF0ZSwgYW5kIHRoZQorc3RhdGUgaW4gdGhlIHdvcmtpbmcgdHJlZSwgYW5kIGhvdyB0aGV5IGRvbid0IGhhdmUgdG8gbWF0Y2gsIGV2ZW4KK3doZW4gd2UgY29tbWl0IHRoaW5ncy4KKworQXMgYmVmb3JlLCBpZiB3ZSBkbyBgZ2l0LWRpZmYtZmlsZXMgLXBgIGluIG91ciBnaXQtdHV0b3JpYWwgcHJvamVjdCwKK3dlJ2xsIHN0aWxsIHNlZSB0aGUgc2FtZSBkaWZmZXJlbmNlIHdlIHNhdyBsYXN0IHRpbWU6IHRoZSBpbmRleCBmaWxlCitoYXNuJ3QgY2hhbmdlZCBieSB0aGUgYWN0IG9mIGNvbW1pdHRpbmcgYW55dGhpbmcuIEhvd2V2ZXIsIG5vdyB0aGF0IHdlCitoYXZlIGNvbW1pdHRlZCBzb21ldGhpbmcsIHdlIGNhbiBhbHNvIGxlYXJuIHRvIHVzZSBhIG5ldyBjb21tYW5kOgorYGdpdC1kaWZmLWluZGV4YC4KKworVW5saWtlIGBnaXQtZGlmZi1maWxlc2AsIHdoaWNoIHNob3dlZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBpbmRleAorZmlsZSBhbmQgdGhlIHdvcmtpbmcgdHJlZSwgYGdpdC1kaWZmLWluZGV4YCBzaG93cyB0aGUgZGlmZmVyZW5jZXMKK2JldHdlZW4gYSBjb21taXR0ZWQgKnRyZWUqIGFuZCBlaXRoZXIgdGhlIGluZGV4IGZpbGUgb3IgdGhlIHdvcmtpbmcKK3RyZWUuIEluIG90aGVyIHdvcmRzLCBgZ2l0LWRpZmYtaW5kZXhgIHdhbnRzIGEgdHJlZSB0byBiZSBkaWZmZWQKK2FnYWluc3QsIGFuZCBiZWZvcmUgd2UgZGlkIHRoZSBjb21taXQsIHdlIGNvdWxkbid0IGRvIHRoYXQsIGJlY2F1c2Ugd2UKK2RpZG4ndCBoYXZlIGFueXRoaW5nIHRvIGRpZmYgYWdhaW5zdC4gCisKK0J1dCBub3cgd2UgY2FuIGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYtaW5kZXggLXAgSEVBRAorLS0tLS0tLS0tLS0tLS0tLQorCisod2hlcmUgYC1wYCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpdCBkaWQgaW4gYGdpdC1kaWZmLWZpbGVzYCksIGFuZCBpdAord2lsbCBzaG93IHVzIHRoZSBzYW1lIGRpZmZlcmVuY2UsIGJ1dCBmb3IgYSB0b3RhbGx5IGRpZmZlcmVudCByZWFzb24uIAorTm93IHdlJ3JlIGNvbXBhcmluZyB0aGUgd29ya2luZyB0cmVlIG5vdCBhZ2FpbnN0IHRoZSBpbmRleCBmaWxlLAorYnV0IGFnYWluc3QgdGhlIHRyZWUgd2UganVzdCB3cm90ZS4gSXQganVzdCBzbyBoYXBwZW5zIHRoYXQgdGhvc2UgdHdvCithcmUgb2J2aW91c2x5IHRoZSBzYW1lLCBzbyB3ZSBnZXQgdGhlIHNhbWUgcmVzdWx0LgorCitBZ2FpbiwgYmVjYXVzZSB0aGlzIGlzIGEgY29tbW9uIG9wZXJhdGlvbiwgeW91IGNhbiBhbHNvIGp1c3Qgc2hvcnRoYW5kCitpdCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgSEVBRAorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBlbmRzIHVwIGRvaW5nIHRoZSBhYm92ZSBmb3IgeW91LgorCitJbiBvdGhlciB3b3JkcywgYGdpdC1kaWZmLWluZGV4YCBub3JtYWxseSBjb21wYXJlcyBhIHRyZWUgYWdhaW5zdCB0aGUKK3dvcmtpbmcgdHJlZSwgYnV0IHdoZW4gZ2l2ZW4gdGhlIGBcLS1jYWNoZWRgIGZsYWcsIGl0IGlzIHRvbGQgdG8KK2luc3RlYWQgY29tcGFyZSBhZ2FpbnN0IGp1c3QgdGhlIGluZGV4IGNhY2hlIGNvbnRlbnRzLCBhbmQgaWdub3JlIHRoZQorY3VycmVudCB3b3JraW5nIHRyZWUgc3RhdGUgZW50aXJlbHkuIFNpbmNlIHdlIGp1c3Qgd3JvdGUgdGhlIGluZGV4CitmaWxlIHRvIEhFQUQsIGRvaW5nIGBnaXQtZGlmZi1pbmRleCBcLS1jYWNoZWQgLXAgSEVBRGAgc2hvdWxkIHRodXMgcmV0dXJuCithbiBlbXB0eSBzZXQgb2YgZGlmZmVyZW5jZXMsIGFuZCB0aGF0J3MgZXhhY3RseSB3aGF0IGl0IGRvZXMuIAorCitbTk9URV0KKz09PT09PT09PT09PT09PT0KK2BnaXQtZGlmZi1pbmRleGAgcmVhbGx5IGFsd2F5cyB1c2VzIHRoZSBpbmRleCBmb3IgaXRzCitjb21wYXJpc29ucywgYW5kIHNheWluZyB0aGF0IGl0IGNvbXBhcmVzIGEgdHJlZSBhZ2FpbnN0IHRoZSB3b3JraW5nCit0cmVlIGlzIHRodXMgbm90IHN0cmljdGx5IGFjY3VyYXRlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgbGlzdCBvZgorZmlsZXMgdG8gY29tcGFyZSAodGhlICJtZXRhLWRhdGEiKSAqYWx3YXlzKiBjb21lcyBmcm9tIHRoZSBpbmRleCBmaWxlLAorcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBgXC0tY2FjaGVkYCBmbGFnIGlzIHVzZWQgb3Igbm90LiBUaGUgYFwtLWNhY2hlZGAKK2ZsYWcgcmVhbGx5IG9ubHkgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWxlICpjb250ZW50cyogdG8gYmUgY29tcGFyZWQKK2NvbWUgZnJvbSB0aGUgd29ya2luZyB0cmVlIG9yIG5vdC4KKworVGhpcyBpcyBub3QgaGFyZCB0byB1bmRlcnN0YW5kLCBhcyBzb29uIGFzIHlvdSByZWFsaXplIHRoYXQgZ2l0IHNpbXBseQorbmV2ZXIga25vd3MgKG9yIGNhcmVzKSBhYm91dCBmaWxlcyB0aGF0IGl0IGlzIG5vdCB0b2xkIGFib3V0CitleHBsaWNpdGx5LiBnaXQgd2lsbCBuZXZlciBnbyAqbG9va2luZyogZm9yIGZpbGVzIHRvIGNvbXBhcmUsIGl0CitleHBlY3RzIHlvdSB0byB0ZWxsIGl0IHdoYXQgdGhlIGZpbGVzIGFyZSwgYW5kIHRoYXQncyB3aGF0IHRoZSBpbmRleAoraXMgdGhlcmUgZm9yLgorPT09PT09PT09PT09PT09PQorCitIb3dldmVyLCBvdXIgbmV4dCBzdGVwIGlzIHRvIGNvbW1pdCB0aGUgKmNoYW5nZSogd2UgZGlkLCBhbmQgYWdhaW4sIHRvCit1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiwga2VlcCBpbiBtaW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIndvcmtpbmcKK3RyZWUgY29udGVudHMiLCAiaW5kZXggZmlsZSIgYW5kICJjb21taXR0ZWQgdHJlZSIuIFdlIGhhdmUgY2hhbmdlcworaW4gdGhlIHdvcmtpbmcgdHJlZSB0aGF0IHdlIHdhbnQgdG8gY29tbWl0LCBhbmQgd2UgYWx3YXlzIGhhdmUgdG8KK3dvcmsgdGhyb3VnaCB0aGUgaW5kZXggZmlsZSwgc28gdGhlIGZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgdG8KK3VwZGF0ZSB0aGUgaW5kZXggY2FjaGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtdXBkYXRlLWluZGV4IGhlbGxvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKG5vdGUgaG93IHdlIGRpZG4ndCBuZWVkIHRoZSBgXC0tYWRkYCBmbGFnIHRoaXMgdGltZSwgc2luY2UgZ2l0IGtuZXcKK2Fib3V0IHRoZSBmaWxlIGFscmVhZHkpLgorCitOb3RlIHdoYXQgaGFwcGVucyB0byB0aGUgZGlmZmVyZW50IGBnaXQtZGlmZi1cKmAgdmVyc2lvbnMgaGVyZS4gQWZ0ZXIKK3dlJ3ZlIHVwZGF0ZWQgYGhlbGxvYCBpbiB0aGUgaW5kZXgsIGBnaXQtZGlmZi1maWxlcyAtcGAgbm93IHNob3dzIG5vCitkaWZmZXJlbmNlcywgYnV0IGBnaXQtZGlmZi1pbmRleCAtcCBIRUFEYCBzdGlsbCAqZG9lcyogc2hvdyB0aGF0IHRoZQorY3VycmVudCBzdGF0ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3RhdGUgd2UgY29tbWl0dGVkLiBJbiBmYWN0LCBub3cKK2BnaXQtZGlmZi1pbmRleGAgc2hvd3MgdGhlIHNhbWUgZGlmZmVyZW5jZSB3aGV0aGVyIHdlIHVzZSB0aGUgYC0tY2FjaGVkYAorZmxhZyBvciBub3QsIHNpbmNlIG5vdyB0aGUgaW5kZXggaXMgY29oZXJlbnQgd2l0aCB0aGUgd29ya2luZyB0cmVlLgorCitOb3csIHNpbmNlIHdlJ3ZlIHVwZGF0ZWQgYGhlbGxvYCBpbiB0aGUgaW5kZXgsIHdlIGNhbiBjb21taXQgdGhlIG5ldwordmVyc2lvbi4gV2UgY291bGQgZG8gaXQgYnkgd3JpdGluZyB0aGUgdHJlZSBieSBoYW5kIGFnYWluLCBhbmQKK2NvbW1pdHRpbmcgdGhlIHRyZWUgKHRoaXMgdGltZSB3ZSdkIGhhdmUgdG8gdXNlIHRoZSBgLXAgSEVBRGAgZmxhZyB0bwordGVsbCBjb21taXQgdGhhdCB0aGUgSEVBRCB3YXMgdGhlICpwYXJlbnQqIG9mIHRoZSBuZXcgY29tbWl0LCBhbmQgdGhhdAordGhpcyB3YXNuJ3QgYW4gaW5pdGlhbCBjb21taXQgYW55IG1vcmUpLCBidXQgeW91J3ZlIGRvbmUgdGhhdCBvbmNlCithbHJlYWR5LCBzbyBsZXQncyBqdXN0IHVzZSB0aGUgaGVscGZ1bCBzY3JpcHQgdGhpcyB0aW1lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHN0YXJ0cyBhbiBlZGl0b3IgZm9yIHlvdSB0byB3cml0ZSB0aGUgY29tbWl0IG1lc3NhZ2UgYW5kIHRlbGxzIHlvdQorYSBiaXQgYWJvdXQgd2hhdCB5b3UgaGF2ZSBkb25lLgorCitXcml0ZSB3aGF0ZXZlciBtZXNzYWdlIHlvdSB3YW50LCBhbmQgYWxsIHRoZSBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggJyMnCit3aWxsIGJlIHBydW5lZCBvdXQsIGFuZCB0aGUgcmVzdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlIGZvcgordGhlIGNoYW5nZS4gSWYgeW91IGRlY2lkZSB5b3UgZG9uJ3Qgd2FudCB0byBjb21taXQgYW55dGhpbmcgYWZ0ZXIgYWxsIGF0Cit0aGlzIHBvaW50ICh5b3UgY2FuIGNvbnRpbnVlIHRvIGVkaXQgdGhpbmdzIGFuZCB1cGRhdGUgdGhlIGluZGV4KSwgeW91CitjYW4ganVzdCBsZWF2ZSBhbiBlbXB0eSBtZXNzYWdlLiBPdGhlcndpc2UgYGdpdCBjb21taXRgIHdpbGwgY29tbWl0Cit0aGUgY2hhbmdlIGZvciB5b3UuCisKK1lvdSd2ZSBub3cgbWFkZSB5b3VyIGZpcnN0IHJlYWwgZ2l0IGNvbW1pdC4gQW5kIGlmIHlvdSdyZSBpbnRlcmVzdGVkIGluCitsb29raW5nIGF0IHdoYXQgYGdpdCBjb21taXRgIHJlYWxseSBkb2VzLCBmZWVsIGZyZWUgdG8gaW52ZXN0aWdhdGU6CitpdCdzIGEgZmV3IHZlcnkgc2ltcGxlIHNoZWxsIHNjcmlwdHMgdG8gZ2VuZXJhdGUgdGhlIGhlbHBmdWwgKD8pIGNvbW1pdAorbWVzc2FnZSBoZWFkZXJzLCBhbmQgYSBmZXcgb25lLWxpbmVycyB0aGF0IGFjdHVhbGx5IGRvIHRoZQorY29tbWl0IGl0c2VsZiAoYGdpdC1jb21taXRgKS4KKworCitJbnNwZWN0aW5nIENoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGlsZSBjcmVhdGluZyBjaGFuZ2VzIGlzIHVzZWZ1bCwgaXQncyBldmVuIG1vcmUgdXNlZnVsIGlmIHlvdSBjYW4gdGVsbAorbGF0ZXIgd2hhdCBjaGFuZ2VkLiBUaGUgbW9zdCB1c2VmdWwgY29tbWFuZCBmb3IgdGhpcyBpcyBhbm90aGVyIG9mIHRoZQorYGRpZmZgIGZhbWlseSwgbmFtZWx5IGBnaXQtZGlmZi10cmVlYC4KKworYGdpdC1kaWZmLXRyZWVgIGNhbiBiZSBnaXZlbiB0d28gYXJiaXRyYXJ5IHRyZWVzLCBhbmQgaXQgd2lsbCB0ZWxsIHlvdSB0aGUKK2RpZmZlcmVuY2VzIGJldHdlZW4gdGhlbS4gUGVyaGFwcyBldmVuIG1vcmUgY29tbW9ubHksIHRob3VnaCwgeW91IGNhbgorZ2l2ZSBpdCBqdXN0IGEgc2luZ2xlIGNvbW1pdCBvYmplY3QsIGFuZCBpdCB3aWxsIGZpZ3VyZSBvdXQgdGhlIHBhcmVudAorb2YgdGhhdCBjb21taXQgaXRzZWxmLCBhbmQgc2hvdyB0aGUgZGlmZmVyZW5jZSBkaXJlY3RseS4gVGh1cywgdG8gZ2V0Cit0aGUgc2FtZSBkaWZmIHRoYXQgd2UndmUgYWxyZWFkeSBzZWVuIHNldmVyYWwgdGltZXMsIHdlIGNhbiBub3cgZG8KKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtZGlmZi10cmVlIC1wIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKworKGFnYWluLCBgLXBgIG1lYW5zIHRvIHNob3cgdGhlIGRpZmZlcmVuY2UgYXMgYSBodW1hbi1yZWFkYWJsZSBwYXRjaCksCithbmQgaXQgd2lsbCBzaG93IHdoYXQgdGhlIGxhc3QgY29tbWl0IChpbiBgSEVBRGApIGFjdHVhbGx5IGNoYW5nZWQuCisKK1tOT1RFXQorPT09PT09PT09PT09CitIZXJlIGlzIGFuIEFTQ0lJIGFydCBieSBKb24gTG9lbGlnZXIgdGhhdCBpbGx1c3RyYXRlcyBob3cKK3ZhcmlvdXMgZGlmZi1cKiBjb21tYW5kcyBjb21wYXJlIHRoaW5ncy4KKworICAgICAgICAgICAgICAgICAgICAgIGRpZmYtdHJlZQorICAgICAgICAgICAgICAgICAgICAgICArLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBWICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8IE9iamVjdCBEQiB8CisgICAgICAgICAgICAgICAgICAgIHwgIEJhY2tpbmcgIHwKKyAgICAgICAgICAgICAgICAgICAgfCAgIFN0b3JlICAgfAorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgXiAgICBeCisgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgfCAgICB8ICBkaWZmLWluZGV4IC0tY2FjaGVkCisgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgZGlmZi1pbmRleCAgfCAgICBWCisgICAgICAgICAgICAgICAgICAgICAgfCAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgIHwgIHwgICBJbmRleCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICB8ICB8ICAiY2FjaGUiICB8CisgICAgICAgICAgICAgICAgICAgICAgfCAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgIHwgICAgXgorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfCAgZGlmZi1maWxlcworICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgIFYgICAgVgorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgIHwgIFdvcmtpbmcgIHwKKyAgICAgICAgICAgICAgICAgICAgfCBEaXJlY3RvcnkgfAorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCis9PT09PT09PT09PT0KKworTW9yZSBpbnRlcmVzdGluZ2x5LCB5b3UgY2FuIGFsc28gZ2l2ZSBgZ2l0LWRpZmYtdHJlZWAgdGhlIGAtLXByZXR0eWAgZmxhZywKK3doaWNoIHRlbGxzIGl0IHRvIGFsc28gc2hvdyB0aGUgY29tbWl0IG1lc3NhZ2UgYW5kIGF1dGhvciBhbmQgZGF0ZSBvZiB0aGUKK2NvbW1pdCwgYW5kIHlvdSBjYW4gdGVsbCBpdCB0byBzaG93IGEgd2hvbGUgc2VyaWVzIG9mIGRpZmZzLgorQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB0ZWxsIGl0IHRvIGJlICJzaWxlbnQiLCBhbmQgbm90IHNob3cgdGhlIGRpZmZzIGF0CithbGwsIGJ1dCBqdXN0IHNob3cgdGhlIGFjdHVhbCBjb21taXQgbWVzc2FnZS4KKworSW4gZmFjdCwgdG9nZXRoZXIgd2l0aCB0aGUgYGdpdC1yZXYtbGlzdGAgcHJvZ3JhbSAod2hpY2ggZ2VuZXJhdGVzIGEKK2xpc3Qgb2YgcmV2aXNpb25zKSwgYGdpdC1kaWZmLXRyZWVgIGVuZHMgdXAgYmVpbmcgYSB2ZXJpdGFibGUgZm91bnQgb2YKK2NoYW5nZXMuIEEgdHJpdmlhbCAoYnV0IHZlcnkgdXNlZnVsKSBzY3JpcHQgY2FsbGVkIGBnaXQtd2hhdGNoYW5nZWRgIGlzCitpbmNsdWRlZCB3aXRoIGdpdCB3aGljaCBkb2VzIGV4YWN0bHkgdGhpcywgYW5kIHNob3dzIGEgbG9nIG9mIHJlY2VudAorYWN0aXZpdGllcy4KKworVG8gc2VlIHRoZSB3aG9sZSBoaXN0b3J5IG9mIG91ciBwaXRpZnVsIGxpdHRsZSBnaXQtdHV0b3JpYWwgcHJvamVjdCwgeW91CitjYW4gZG8KKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHNob3dzIGp1c3QgdGhlIGxvZyBtZXNzYWdlcywgb3IgaWYgd2Ugd2FudCB0byBzZWUgdGhlIGxvZyB0b2dldGhlcgord2l0aCB0aGUgYXNzb2NpYXRlZCBwYXRjaGVzIHVzZSB0aGUgbW9yZSBjb21wbGV4IChhbmQgbXVjaCBtb3JlCitwb3dlcmZ1bCkKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtd2hhdGNoYW5nZWQgLXAgLS1yb290CistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3Ugd2lsbCBzZWUgZXhhY3RseSB3aGF0IGhhcyBjaGFuZ2VkIGluIHRoZSByZXBvc2l0b3J5IG92ZXIgaXRzCitzaG9ydCBoaXN0b3J5LiAKKworW05PVEVdCitUaGUgYFwtLXJvb3RgIGZsYWcgaXMgYSBmbGFnIHRvIGBnaXQtZGlmZi10cmVlYCB0byB0ZWxsIGl0IHRvCitzaG93IHRoZSBpbml0aWFsIGFrYSAncm9vdCcgY29tbWl0IHRvby4gTm9ybWFsbHkgeW91J2QgcHJvYmFibHkgbm90Cit3YW50IHRvIHNlZSB0aGUgaW5pdGlhbCBpbXBvcnQgZGlmZiwgYnV0IHNpbmNlIHRoZSB0dXRvcmlhbCBwcm9qZWN0Cit3YXMgc3RhcnRlZCBmcm9tIHNjcmF0Y2ggYW5kIGlzIHNvIHNtYWxsLCB3ZSB1c2UgaXQgdG8gbWFrZSB0aGUgcmVzdWx0CithIGJpdCBtb3JlIGludGVyZXN0aW5nLgorCitXaXRoIHRoYXQsIHlvdSBzaG91bGQgbm93IGJlIGhhdmluZyBzb21lIGlua2xpbmcgb2Ygd2hhdCBnaXQgZG9lcywgYW5kCitjYW4gZXhwbG9yZSBvbiB5b3VyIG93bi4KKworW05PVEVdCitNb3N0IGxpa2VseSwgeW91IGFyZSBub3QgZGlyZWN0bHkgdXNpbmcgdGhlIGNvcmUKK2dpdCBQbHVtYmluZyBjb21tYW5kcywgYnV0IHVzaW5nIFBvcmNlbGFpbiBsaWtlIENvZ2l0byBvbiB0b3AKK29mIGl0LiBDb2dpdG8gd29ya3MgYSBiaXQgZGlmZmVyZW50bHkgYW5kIHlvdSB1c3VhbGx5IGRvIG5vdAoraGF2ZSB0byBydW4gYGdpdC11cGRhdGUtaW5kZXhgIHlvdXJzZWxmIGZvciBjaGFuZ2VkIGZpbGVzICh5b3UKK2RvIHRlbGwgdW5kZXJseWluZyBnaXQgYWJvdXQgYWRkaXRpb25zIGFuZCByZW1vdmFscyB2aWEKK2BjZy1hZGRgIGFuZCBgY2ctcm1gIGNvbW1hbmRzKS4gSnVzdCBiZWZvcmUgeW91IG1ha2UgYSBjb21taXQKK3dpdGggYGNnLWNvbW1pdGAsIENvZ2l0byBmaWd1cmVzIG91dCB3aGljaCBmaWxlcyB5b3UgbW9kaWZpZWQsCithbmQgcnVucyBgZ2l0LXVwZGF0ZS1pbmRleGAgb24gdGhlbSBmb3IgeW91LgorCisKK1RhZ2dpbmcgYSB2ZXJzaW9uCistLS0tLS0tLS0tLS0tLS0tLQorCitJbiBnaXQsIHRoZXJlIGFyZSB0d28ga2luZHMgb2YgdGFncywgYSAibGlnaHQiIG9uZSwgYW5kIGFuICJhbm5vdGF0ZWQgdGFnIi4KKworQSAibGlnaHQiIHRhZyBpcyB0ZWNobmljYWxseSBub3RoaW5nIG1vcmUgdGhhbiBhIGJyYW5jaCwgZXhjZXB0IHdlIHB1dAoraXQgaW4gdGhlIGAuZ2l0L3JlZnMvdGFncy9gIHN1YmRpcmVjdG9yeSBpbnN0ZWFkIG9mIGNhbGxpbmcgaXQgYSBgaGVhZGAuCitTbyB0aGUgc2ltcGxlc3QgZm9ybSBvZiB0YWcgaW52b2x2ZXMgbm90aGluZyBtb3JlIHRoYW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCB0YWcgbXktZmlyc3QtdGFnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2gganVzdCB3cml0ZXMgdGhlIGN1cnJlbnQgYEhFQURgIGludG8gdGhlIGAuZ2l0L3JlZnMvdGFncy9teS1maXJzdC10YWdgCitmaWxlLCBhZnRlciB3aGljaCBwb2ludCB5b3UgY2FuIHRoZW4gdXNlIHRoaXMgc3ltYm9saWMgbmFtZSBmb3IgdGhhdAorcGFydGljdWxhciBzdGF0ZS4gWW91IGNhbiwgZm9yIGV4YW1wbGUsIGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgbXktZmlyc3QtdGFnCistLS0tLS0tLS0tLS0tLS0tCisKK3RvIGRpZmYgeW91ciBjdXJyZW50IHN0YXRlIGFnYWluc3QgdGhhdCB0YWcgKHdoaWNoIGF0IHRoaXMgcG9pbnQgd2lsbAorb2J2aW91c2x5IGJlIGFuIGVtcHR5IGRpZmYsIGJ1dCBpZiB5b3UgY29udGludWUgdG8gZGV2ZWxvcCBhbmQgY29tbWl0CitzdHVmZiwgeW91IGNhbiB1c2UgeW91ciB0YWcgYXMgYW4gImFuY2hvci1wb2ludCIgdG8gc2VlIHdoYXQgaGFzIGNoYW5nZWQKK3NpbmNlIHlvdSB0YWdnZWQgaXQuCisKK0FuICJhbm5vdGF0ZWQgdGFnIiBpcyBhY3R1YWxseSBhIHJlYWwgZ2l0IG9iamVjdCwgYW5kIGNvbnRhaW5zIG5vdCBvbmx5IGEKK3BvaW50ZXIgdG8gdGhlIHN0YXRlIHlvdSB3YW50IHRvIHRhZywgYnV0IGFsc28gYSBzbWFsbCB0YWcgbmFtZSBhbmQKK21lc3NhZ2UsIGFsb25nIHdpdGggb3B0aW9uYWxseSBhIFBHUCBzaWduYXR1cmUgdGhhdCBzYXlzIHRoYXQgeWVzLAoreW91IHJlYWxseSBkaWQKK3RoYXQgdGFnLiBZb3UgY3JlYXRlIHRoZXNlIGFubm90YXRlZCB0YWdzIHdpdGggZWl0aGVyIHRoZSBgLWFgIG9yCitgLXNgIGZsYWcgdG8gYGdpdCB0YWdgOgorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCB0YWcgLXMgPHRhZ25hbWU+CistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgc2lnbiB0aGUgY3VycmVudCBgSEVBRGAgKGJ1dCB5b3UgY2FuIGFsc28gZ2l2ZSBpdCBhbm90aGVyCithcmd1bWVudCB0aGF0IHNwZWNpZmllcyB0aGUgdGhpbmcgdG8gdGFnLCBpLmUuLCB5b3UgY291bGQgaGF2ZSB0YWdnZWQgdGhlCitjdXJyZW50IGBteWJyYW5jaGAgcG9pbnQgYnkgdXNpbmcgYGdpdCB0YWcgPHRhZ25hbWU+IG15YnJhbmNoYCkuCisKK1lvdSBub3JtYWxseSBvbmx5IGRvIHNpZ25lZCB0YWdzIGZvciBtYWpvciByZWxlYXNlcyBvciB0aGluZ3MKK2xpa2UgdGhhdCwgd2hpbGUgdGhlIGxpZ2h0LXdlaWdodCB0YWdzIGFyZSB1c2VmdWwgZm9yIGFueSBtYXJraW5nIHlvdQord2FudCB0byBkbyAtLSBhbnkgdGltZSB5b3UgZGVjaWRlIHRoYXQgeW91IHdhbnQgdG8gcmVtZW1iZXIgYSBjZXJ0YWluCitwb2ludCwganVzdCBjcmVhdGUgYSBwcml2YXRlIHRhZyBmb3IgaXQsIGFuZCB5b3UgaGF2ZSBhIG5pY2Ugc3ltYm9saWMKK25hbWUgZm9yIHRoZSBzdGF0ZSBhdCB0aGF0IHBvaW50LgorCisKK0NvcHlpbmcgcmVwb3NpdG9yaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitnaXQgcmVwb3NpdG9yaWVzIGFyZSBub3JtYWxseSB0b3RhbGx5IHNlbGYtc3VmZmljaWVudCBhbmQgcmVsb2NhdGFibGUKK1VubGlrZSBDVlMsIGZvciBleGFtcGxlLCB0aGVyZSBpcyBubyBzZXBhcmF0ZSBub3Rpb24gb2YKKyJyZXBvc2l0b3J5IiBhbmQgIndvcmtpbmcgdHJlZSIuIEEgZ2l0IHJlcG9zaXRvcnkgbm9ybWFsbHkgKmlzKiB0aGUKK3dvcmtpbmcgdHJlZSwgd2l0aCB0aGUgbG9jYWwgZ2l0IGluZm9ybWF0aW9uIGhpZGRlbiBpbiB0aGUgYC5naXRgCitzdWJkaXJlY3RvcnkuIFRoZXJlIGlzIG5vdGhpbmcgZWxzZS4gV2hhdCB5b3Ugc2VlIGlzIHdoYXQgeW91IGdvdC4KKworW05PVEVdCitZb3UgY2FuIHRlbGwgZ2l0IHRvIHNwbGl0IHRoZSBnaXQgaW50ZXJuYWwgaW5mb3JtYXRpb24gZnJvbQordGhlIGRpcmVjdG9yeSB0aGF0IGl0IHRyYWNrcywgYnV0IHdlJ2xsIGlnbm9yZSB0aGF0IGZvciBub3c6IGl0J3Mgbm90Citob3cgbm9ybWFsIHByb2plY3RzIHdvcmssIGFuZCBpdCdzIHJlYWxseSBvbmx5IG1lYW50IGZvciBzcGVjaWFsIHVzZXMuCitTbyB0aGUgbWVudGFsIG1vZGVsIG9mICJ0aGUgZ2l0IGluZm9ybWF0aW9uIGlzIGFsd2F5cyB0aWVkIGRpcmVjdGx5IHRvCit0aGUgd29ya2luZyB0cmVlIHRoYXQgaXQgZGVzY3JpYmVzIiBtYXkgbm90IGJlIHRlY2huaWNhbGx5IDEwMCUKK2FjY3VyYXRlLCBidXQgaXQncyBhIGdvb2QgbW9kZWwgZm9yIGFsbCBub3JtYWwgdXNlLgorCitUaGlzIGhhcyB0d28gaW1wbGljYXRpb25zOiAKKworIC0gaWYgeW91IGdyb3cgYm9yZWQgd2l0aCB0aGUgdHV0b3JpYWwgcmVwb3NpdG9yeSB5b3UgY3JlYXRlZCAob3IgeW91J3ZlCisgICBtYWRlIGEgbWlzdGFrZSBhbmQgd2FudCB0byBzdGFydCBhbGwgb3ZlciksIHlvdSBjYW4ganVzdCBkbyBzaW1wbGUKKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgcm0gLXJmIGdpdC10dXRvcmlhbAorLS0tLS0tLS0tLS0tLS0tLQorKworYW5kIGl0IHdpbGwgYmUgZ29uZS4gVGhlcmUncyBubyBleHRlcm5hbCByZXBvc2l0b3J5LCBhbmQgdGhlcmUncyBubworaGlzdG9yeSBvdXRzaWRlIHRoZSBwcm9qZWN0IHlvdSBjcmVhdGVkLgorCisgLSBpZiB5b3Ugd2FudCB0byBtb3ZlIG9yIGR1cGxpY2F0ZSBhIGdpdCByZXBvc2l0b3J5LCB5b3UgY2FuIGRvIHNvLiBUaGVyZQorICAgaXMgYGdpdCBjbG9uZWAgY29tbWFuZCwgYnV0IGlmIGFsbCB5b3Ugd2FudCB0byBkbyBpcyBqdXN0IHRvCisgICBjcmVhdGUgYSBjb3B5IG9mIHlvdXIgcmVwb3NpdG9yeSAod2l0aCBhbGwgdGhlIGZ1bGwgaGlzdG9yeSB0aGF0CisgICB3ZW50IGFsb25nIHdpdGggaXQpLCB5b3UgY2FuIGRvIHNvIHdpdGggYSByZWd1bGFyCisgICBgY3AgLWEgZ2l0LXR1dG9yaWFsIG5ldy1naXQtdHV0b3JpYWxgLgorKworTm90ZSB0aGF0IHdoZW4geW91J3ZlIG1vdmVkIG9yIGNvcGllZCBhIGdpdCByZXBvc2l0b3J5LCB5b3VyIGdpdCBpbmRleAorZmlsZSAod2hpY2ggY2FjaGVzIHZhcmlvdXMgaW5mb3JtYXRpb24sIG5vdGFibHkgc29tZSBvZiB0aGUgInN0YXQiCitpbmZvcm1hdGlvbiBmb3IgdGhlIGZpbGVzIGludm9sdmVkKSB3aWxsIGxpa2VseSBuZWVkIHRvIGJlIHJlZnJlc2hlZC4KK1NvIGFmdGVyIHlvdSBkbyBhIGBjcCAtYWAgdG8gY3JlYXRlIGEgbmV3IGNvcHksIHlvdSdsbCB3YW50IHRvIGRvCisrCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoCistLS0tLS0tLS0tLS0tLS0tCisrCitpbiB0aGUgbmV3IHJlcG9zaXRvcnkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGluZGV4IGZpbGUgaXMgdXAtdG8tZGF0ZS4KKworTm90ZSB0aGF0IHRoZSBzZWNvbmQgcG9pbnQgaXMgdHJ1ZSBldmVuIGFjcm9zcyBtYWNoaW5lcy4gWW91IGNhbgorZHVwbGljYXRlIGEgcmVtb3RlIGdpdCByZXBvc2l0b3J5IHdpdGggKmFueSogcmVndWxhciBjb3B5IG1lY2hhbmlzbSwgYmUgaXQKK2BzY3BgLCBgcnN5bmNgIG9yIGB3Z2V0YC4KKworV2hlbiBjb3B5aW5nIGEgcmVtb3RlIHJlcG9zaXRvcnksIHlvdSdsbCB3YW50IHRvIGF0IGEgbWluaW11bSB1cGRhdGUgdGhlCitpbmRleCBjYWNoZSB3aGVuIHlvdSBkbyB0aGlzLCBhbmQgZXNwZWNpYWxseSB3aXRoIG90aGVyIHBlb3BsZXMnCityZXBvc2l0b3JpZXMgeW91IG9mdGVuIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGluZGV4IGNhY2hlIGlzIGluIHNvbWUKK2tub3duIHN0YXRlICh5b3UgZG9uJ3Qga25vdyAqd2hhdCogdGhleSd2ZSBkb25lIGFuZCBub3QgeWV0IGNoZWNrZWQgaW4pLAorc28gdXN1YWxseSB5b3UnbGwgcHJlY2VkZSB0aGUgYGdpdC11cGRhdGUtaW5kZXhgIHdpdGggYQorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1yZWFkLXRyZWUgLS1yZXNldCBIRUFECiskIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgZm9yY2UgYSB0b3RhbCBpbmRleCByZS1idWlsZCBmcm9tIHRoZSB0cmVlIHBvaW50ZWQgdG8gYnkgYEhFQURgLgorSXQgcmVzZXRzIHRoZSBpbmRleCBjb250ZW50cyB0byBgSEVBRGAsIGFuZCB0aGVuIHRoZSBgZ2l0LXVwZGF0ZS1pbmRleGAKK21ha2VzIHN1cmUgdG8gbWF0Y2ggdXAgYWxsIGluZGV4IGVudHJpZXMgd2l0aCB0aGUgY2hlY2tlZC1vdXQgZmlsZXMuCitJZiB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yeSBoYWQgdW5jb21taXR0ZWQgY2hhbmdlcyBpbiBpdHMKK3dvcmtpbmcgdHJlZSwgYGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoYCBub3RpY2VzIHRoZW0gYW5kCit0ZWxscyB5b3UgdGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQuCisKK1RoZSBhYm92ZSBjYW4gYWxzbyBiZSB3cml0dGVuIGFzIHNpbXBseQorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZXNldAorLS0tLS0tLS0tLS0tLS0tLQorCithbmQgaW4gZmFjdCBhIGxvdCBvZiB0aGUgY29tbW9uIGdpdCBjb21tYW5kIGNvbWJpbmF0aW9ucyBjYW4gYmUgc2NyaXB0ZWQKK3dpdGggdGhlIGBnaXQgeHl6YCBpbnRlcmZhY2VzLiAgWW91IGNhbiBsZWFybiB0aGluZ3MgYnkganVzdCBsb29raW5nCithdCB3aGF0IHRoZSB2YXJpb3VzIGdpdCBzY3JpcHRzIGRvLiAgRm9yIGV4YW1wbGUsIGBnaXQgcmVzZXRgIGlzIHRoZQorYWJvdmUgdHdvIGxpbmVzIGltcGxlbWVudGVkIGluIGBnaXQtcmVzZXRgLCBidXQgc29tZSB0aGluZ3MgbGlrZQorYGdpdCBzdGF0dXNgIGFuZCBgZ2l0IGNvbW1pdGAgYXJlIHNsaWdodGx5IG1vcmUgY29tcGxleCBzY3JpcHRzIGFyb3VuZAordGhlIGJhc2ljIGdpdCBjb21tYW5kcy4KKworTWFueSAobW9zdD8pIHB1YmxpYyByZW1vdGUgcmVwb3NpdG9yaWVzIHdpbGwgbm90IGNvbnRhaW4gYW55IG9mCit0aGUgY2hlY2tlZCBvdXQgZmlsZXMgb3IgZXZlbiBhbiBpbmRleCBmaWxlLCBhbmQgd2lsbCAqb25seSogY29udGFpbiB0aGUKK2FjdHVhbCBjb3JlIGdpdCBmaWxlcy4gU3VjaCBhIHJlcG9zaXRvcnkgdXN1YWxseSBkb2Vzbid0IGV2ZW4gaGF2ZSB0aGUKK2AuZ2l0YCBzdWJkaXJlY3RvcnksIGJ1dCBoYXMgYWxsIHRoZSBnaXQgZmlsZXMgZGlyZWN0bHkgaW4gdGhlCityZXBvc2l0b3J5LiAKKworVG8gY3JlYXRlIHlvdXIgb3duIGxvY2FsIGxpdmUgY29weSBvZiBzdWNoIGEgInJhdyIgZ2l0IHJlcG9zaXRvcnksIHlvdSdkCitmaXJzdCBjcmVhdGUgeW91ciBvd24gc3ViZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdCwgYW5kIHRoZW4gY29weSB0aGUKK3JhdyByZXBvc2l0b3J5IGNvbnRlbnRzIGludG8gdGhlIGAuZ2l0YCBkaXJlY3RvcnkuIEZvciBleGFtcGxlLCB0bworY3JlYXRlIHlvdXIgb3duIGNvcHkgb2YgdGhlIGdpdCByZXBvc2l0b3J5LCB5b3UnZCBkbyB0aGUgZm9sbG93aW5nCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgbXktZ2l0CiskIGNkIG15LWdpdAorJCByc3luYyAtckwgcnN5bmM6Ly9yc3luYy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQvIC5naXQKKy0tLS0tLS0tLS0tLS0tLS0KKworZm9sbG93ZWQgYnkgCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSBIRUFECistLS0tLS0tLS0tLS0tLS0tCisKK3RvIHBvcHVsYXRlIHRoZSBpbmRleC4gSG93ZXZlciwgbm93IHlvdSBoYXZlIHBvcHVsYXRlZCB0aGUgaW5kZXgsIGFuZAoreW91IGhhdmUgYWxsIHRoZSBnaXQgaW50ZXJuYWwgZmlsZXMsIGJ1dCB5b3Ugd2lsbCBub3RpY2UgdGhhdCB5b3UgZG9uJ3QKK2FjdHVhbGx5IGhhdmUgYW55IG9mIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMgdG8gd29yayBvbi4gVG8gZ2V0Cit0aG9zZSwgeW91J2QgY2hlY2sgdGhlbSBvdXQgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jaGVja291dC1pbmRleCAtdSAtYQorLS0tLS0tLS0tLS0tLS0tLQorCit3aGVyZSB0aGUgYC11YCBmbGFnIG1lYW5zIHRoYXQgeW91IHdhbnQgdGhlIGNoZWNrb3V0IHRvIGtlZXAgdGhlIGluZGV4Cit1cC10by1kYXRlIChzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIHJlZnJlc2ggaXQgYWZ0ZXJ3YXJkKSwgYW5kIHRoZQorYC1hYCBmbGFnIG1lYW5zICJjaGVjayBvdXQgYWxsIGZpbGVzIiAoaWYgeW91IGhhdmUgYSBzdGFsZSBjb3B5IG9yIGFuCitvbGRlciB2ZXJzaW9uIG9mIGEgY2hlY2tlZCBvdXQgdHJlZSB5b3UgbWF5IGFsc28gbmVlZCB0byBhZGQgdGhlIGAtZmAKK2ZsYWcgZmlyc3QsIHRvIHRlbGwgZ2l0LWNoZWNrb3V0LWluZGV4IHRvICpmb3JjZSogb3ZlcndyaXRpbmcgb2YgYW55IG9sZAorZmlsZXMpLiAKKworQWdhaW4sIHRoaXMgY2FuIGFsbCBiZSBzaW1wbGlmaWVkIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgcnN5bmM6Ly9yc3luYy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQvIG15LWdpdAorJCBjZCBteS1naXQKKyQgZ2l0IGNoZWNrb3V0CistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgZW5kIHVwIGRvaW5nIGFsbCBvZiB0aGUgYWJvdmUgZm9yIHlvdS4KKworWW91IGhhdmUgbm93IHN1Y2Nlc3NmdWxseSBjb3BpZWQgc29tZWJvZHkgZWxzZSdzIChtaW5lKSByZW1vdGUKK3JlcG9zaXRvcnksIGFuZCBjaGVja2VkIGl0IG91dC4gCisKKworQ3JlYXRpbmcgYSBuZXcgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnJhbmNoZXMgaW4gZ2l0IGFyZSByZWFsbHkgbm90aGluZyBtb3JlIHRoYW4gcG9pbnRlcnMgaW50byB0aGUgZ2l0CitvYmplY3QgZGF0YWJhc2UgZnJvbSB3aXRoaW4gdGhlIGAuZ2l0L3JlZnMvYCBzdWJkaXJlY3RvcnksIGFuZCBhcyB3ZQorYWxyZWFkeSBkaXNjdXNzZWQsIHRoZSBgSEVBRGAgYnJhbmNoIGlzIG5vdGhpbmcgYnV0IGEgc3ltbGluayB0byBvbmUgb2YKK3RoZXNlIG9iamVjdCBwb2ludGVycy4gCisKK1lvdSBjYW4gYXQgYW55IHRpbWUgY3JlYXRlIGEgbmV3IGJyYW5jaCBieSBqdXN0IHBpY2tpbmcgYW4gYXJiaXRyYXJ5Citwb2ludCBpbiB0aGUgcHJvamVjdCBoaXN0b3J5LCBhbmQganVzdCB3cml0aW5nIHRoZSBTSEExIG5hbWUgb2YgdGhhdAorb2JqZWN0IGludG8gYSBmaWxlIHVuZGVyIGAuZ2l0L3JlZnMvaGVhZHMvYC4gWW91IGNhbiB1c2UgYW55IGZpbGVuYW1lIHlvdQord2FudCAoYW5kIGluZGVlZCwgc3ViZGlyZWN0b3JpZXMpLCBidXQgdGhlIGNvbnZlbnRpb24gaXMgdGhhdCB0aGUKKyJub3JtYWwiIGJyYW5jaCBpcyBjYWxsZWQgYG1hc3RlcmAuIFRoYXQncyBqdXN0IGEgY29udmVudGlvbiwgdGhvdWdoLAorYW5kIG5vdGhpbmcgZW5mb3JjZXMgaXQuIAorCitUbyBzaG93IHRoYXQgYXMgYW4gZXhhbXBsZSwgbGV0J3MgZ28gYmFjayB0byB0aGUgZ2l0LXR1dG9yaWFsIHJlcG9zaXRvcnkgd2UKK3VzZWQgZWFybGllciwgYW5kIGNyZWF0ZSBhIGJyYW5jaCBpbiBpdC4gWW91IGRvIHRoYXQgYnkgc2ltcGx5IGp1c3QKK3NheWluZyB0aGF0IHlvdSB3YW50IHRvIGNoZWNrIG91dCBhIG5ldyBicmFuY2g6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2gKKy0tLS0tLS0tLS0tLQorCit3aWxsIGNyZWF0ZSBhIG5ldyBicmFuY2ggYmFzZWQgYXQgdGhlIGN1cnJlbnQgYEhFQURgIHBvc2l0aW9uLCBhbmQgc3dpdGNoCit0byBpdC4gCisKK1tOT1RFXQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJZiB5b3UgbWFrZSB0aGUgZGVjaXNpb24gdG8gc3RhcnQgeW91ciBuZXcgYnJhbmNoIGF0IHNvbWUKK290aGVyIHBvaW50IGluIHRoZSBoaXN0b3J5IHRoYW4gdGhlIGN1cnJlbnQgYEhFQURgLCB5b3UgY2FuIGRvIHNvIGJ5CitqdXN0IHRlbGxpbmcgYGdpdCBjaGVja291dGAgd2hhdCB0aGUgYmFzZSBvZiB0aGUgY2hlY2tvdXQgd291bGQgYmUuCitJbiBvdGhlciB3b3JkcywgaWYgeW91IGhhdmUgYW4gZWFybGllciB0YWcgb3IgYnJhbmNoLCB5b3UnZCBqdXN0IGRvCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2ggZWFybGllci1jb21taXQKKy0tLS0tLS0tLS0tLQorCithbmQgaXQgd291bGQgY3JlYXRlIHRoZSBuZXcgYnJhbmNoIGBteWJyYW5jaGAgYXQgdGhlIGVhcmxpZXIgY29tbWl0LAorYW5kIGNoZWNrIG91dCB0aGUgc3RhdGUgYXQgdGhhdCB0aW1lLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBjYW4gYWx3YXlzIGp1c3QganVtcCBiYWNrIHRvIHlvdXIgb3JpZ2luYWwgYG1hc3RlcmAgYnJhbmNoIGJ5IGRvaW5nCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCistLS0tLS0tLS0tLS0KKworKG9yIGFueSBvdGhlciBicmFuY2gtbmFtZSwgZm9yIHRoYXQgbWF0dGVyKSBhbmQgaWYgeW91IGZvcmdldCB3aGljaAorYnJhbmNoIHlvdSBoYXBwZW4gdG8gYmUgb24sIGEgc2ltcGxlCisKKy0tLS0tLS0tLS0tLQorJCBjYXQgLmdpdC9IRUFECistLS0tLS0tLS0tLS0KKword2lsbCB0ZWxsIHlvdSB3aGVyZSBpdCdzIHBvaW50aW5nLiAgVG8gZ2V0IHRoZSBsaXN0IG9mIGJyYW5jaGVzCit5b3UgaGF2ZSwgeW91IGNhbiBzYXkKKworLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2gKKy0tLS0tLS0tLS0tLQorCit3aGljaCBpcyBub3RoaW5nIG1vcmUgdGhhbiBhIHNpbXBsZSBzY3JpcHQgYXJvdW5kIGBscyAuZ2l0L3JlZnMvaGVhZHNgLgorVGhlcmUgd2lsbCBiZSBhc3RlcmlzayBpbiBmcm9udCBvZiB0aGUgYnJhbmNoIHlvdSBhcmUgY3VycmVudGx5IG9uLgorCitTb21ldGltZXMgeW91IG1heSB3aXNoIHRvIGNyZWF0ZSBhIG5ldyBicmFuY2ggX3dpdGhvdXRfIGFjdHVhbGx5CitjaGVja2luZyBpdCBvdXQgYW5kIHN3aXRjaGluZyB0byBpdC4gSWYgc28sIGp1c3QgdXNlIHRoZSBjb21tYW5kCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIDxicmFuY2huYW1lPiBbc3RhcnRpbmdwb2ludF0KKy0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHNpbXBseSBfY3JlYXRlXyB0aGUgYnJhbmNoLCBidXQgd2lsbCBub3QgZG8gYW55dGhpbmcgZnVydGhlci4gCitZb3UgY2FuIHRoZW4gbGF0ZXIgLS0gb25jZSB5b3UgZGVjaWRlIHRoYXQgeW91IHdhbnQgdG8gYWN0dWFsbHkgZGV2ZWxvcAorb24gdGhhdCBicmFuY2ggLS0gc3dpdGNoIHRvIHRoYXQgYnJhbmNoIHdpdGggYSByZWd1bGFyIGBnaXQgY2hlY2tvdXRgCit3aXRoIHRoZSBicmFuY2huYW1lIGFzIHRoZSBhcmd1bWVudC4KKworCitNZXJnaW5nIHR3byBicmFuY2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT25lIG9mIHRoZSBpZGVhcyBvZiBoYXZpbmcgYSBicmFuY2ggaXMgdGhhdCB5b3UgZG8gc29tZSAocG9zc2libHkKK2V4cGVyaW1lbnRhbCkgd29yayBpbiBpdCwgYW5kIGV2ZW50dWFsbHkgbWVyZ2UgaXQgYmFjayB0byB0aGUgbWFpbgorYnJhbmNoLiBTbyBhc3N1bWluZyB5b3UgY3JlYXRlZCB0aGUgYWJvdmUgYG15YnJhbmNoYCB0aGF0IHN0YXJ0ZWQgb3V0CitiZWluZyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgYG1hc3RlcmAgYnJhbmNoLCBsZXQncyBtYWtlIHN1cmUgd2UncmUgaW4KK3RoYXQgYnJhbmNoLCBhbmQgZG8gc29tZSB3b3JrIHRoZXJlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15YnJhbmNoCiskIGVjaG8gIldvcmssIHdvcmssIHdvcmsiID4+aGVsbG8KKyQgZ2l0IGNvbW1pdCAtbSAnU29tZSB3b3JrLicgLWkgaGVsbG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIZXJlLCB3ZSBqdXN0IGFkZGVkIGFub3RoZXIgbGluZSB0byBgaGVsbG9gLCBhbmQgd2UgdXNlZCBhIHNob3J0aGFuZCBmb3IKK2RvaW5nIGJvdGggYGdpdC11cGRhdGUtaW5kZXggaGVsbG9gIGFuZCBgZ2l0IGNvbW1pdGAgYnkganVzdCBnaXZpbmcgdGhlCitmaWxlbmFtZSBkaXJlY3RseSB0byBgZ2l0IGNvbW1pdGAsIHdpdGggYW4gYC1pYCBmbGFnIChpdCB0ZWxscworZ2l0IHRvICdpbmNsdWRlJyB0aGF0IGZpbGUgaW4gYWRkaXRpb24gdG8gd2hhdCB5b3UgaGF2ZSBkb25lIHRvCit0aGUgaW5kZXggZmlsZSBzbyBmYXIgd2hlbiBtYWtpbmcgdGhlIGNvbW1pdCkuICBUaGUgYC1tYCBmbGFnIGlzIHRvIGdpdmUgdGhlCitjb21taXQgbG9nIG1lc3NhZ2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCitOb3csIHRvIG1ha2UgaXQgYSBiaXQgbW9yZSBpbnRlcmVzdGluZywgbGV0J3MgYXNzdW1lIHRoYXQgc29tZWJvZHkgZWxzZQorZG9lcyBzb21lIHdvcmsgaW4gdGhlIG9yaWdpbmFsIGJyYW5jaCwgYW5kIHNpbXVsYXRlIHRoYXQgYnkgZ29pbmcgYmFjawordG8gdGhlIG1hc3RlciBicmFuY2gsIGFuZCBlZGl0aW5nIHRoZSBzYW1lIGZpbGUgZGlmZmVyZW50bHkgdGhlcmU6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCistLS0tLS0tLS0tLS0KKworSGVyZSwgdGFrZSBhIG1vbWVudCB0byBsb29rIGF0IHRoZSBjb250ZW50cyBvZiBgaGVsbG9gLCBhbmQgbm90aWNlIGhvdyB0aGV5Citkb24ndCBjb250YWluIHRoZSB3b3JrIHdlIGp1c3QgZGlkIGluIGBteWJyYW5jaGAgLS0gYmVjYXVzZSB0aGF0IHdvcmsKK2hhc24ndCBoYXBwZW5lZCBpbiB0aGUgYG1hc3RlcmAgYnJhbmNoIGF0IGFsbC4gVGhlbiBkbworCistLS0tLS0tLS0tLS0KKyQgZWNobyAiUGxheSwgcGxheSwgcGxheSIgPj5oZWxsbworJCBlY2hvICJMb3RzIG9mIGZ1biIgPj5leGFtcGxlCiskIGdpdCBjb21taXQgLW0gJ1NvbWUgZnVuLicgLWkgaGVsbG8gZXhhbXBsZQorLS0tLS0tLS0tLS0tCisKK3NpbmNlIHRoZSBtYXN0ZXIgYnJhbmNoIGlzIG9idmlvdXNseSBpbiBhIG11Y2ggYmV0dGVyIG1vb2QuCisKK05vdywgeW91J3ZlIGdvdCB0d28gYnJhbmNoZXMsIGFuZCB5b3UgZGVjaWRlIHRoYXQgeW91IHdhbnQgdG8gbWVyZ2UgdGhlCit3b3JrIGRvbmUuIEJlZm9yZSB3ZSBkbyB0aGF0LCBsZXQncyBpbnRyb2R1Y2UgYSBjb29sIGdyYXBoaWNhbCB0b29sIHRoYXQKK2hlbHBzIHlvdSB2aWV3IHdoYXQncyBnb2luZyBvbjoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXRrIC0tYWxsCistLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB5b3UgZ3JhcGhpY2FsbHkgYm90aCBvZiB5b3VyIGJyYW5jaGVzICh0aGF0J3Mgd2hhdCB0aGUgYFwtLWFsbGAKK21lYW5zOiBub3JtYWxseSBpdCB3aWxsIGp1c3Qgc2hvdyB5b3UgeW91ciBjdXJyZW50IGBIRUFEYCkgYW5kIHRoZWlyCitoaXN0b3JpZXMuIFlvdSBjYW4gYWxzbyBzZWUgZXhhY3RseSBob3cgdGhleSBjYW1lIHRvIGJlIGZyb20gYSBjb21tb24KK3NvdXJjZS4gCisKK0FueXdheSwgbGV0J3MgZXhpdCBgZ2l0a2AgKGBeUWAgb3IgdGhlIEZpbGUgbWVudSksIGFuZCBkZWNpZGUgdGhhdCB3ZSB3YW50Cit0byBtZXJnZSB0aGUgd29yayB3ZSBkaWQgb24gdGhlIGBteWJyYW5jaGAgYnJhbmNoIGludG8gdGhlIGBtYXN0ZXJgCiticmFuY2ggKHdoaWNoIGlzIGN1cnJlbnRseSBvdXIgYEhFQURgIHRvbykuIFRvIGRvIHRoYXQsIHRoZXJlJ3MgYSBuaWNlCitzY3JpcHQgY2FsbGVkIGBnaXQgbWVyZ2VgLCB3aGljaCB3YW50cyB0byBrbm93IHdoaWNoIGJyYW5jaGVzIHlvdSB3YW50Cit0byByZXNvbHZlIGFuZCB3aGF0IHRoZSBtZXJnZSBpcyBhbGwgYWJvdXQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgbWVyZ2UgIk1lcmdlIHdvcmsgaW4gbXlicmFuY2giIEhFQUQgbXlicmFuY2gKKy0tLS0tLS0tLS0tLQorCit3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQgaXMgZ29pbmcgdG8gYmUgdXNlZCBhcyB0aGUgY29tbWl0IG1lc3NhZ2UgaWYKK3RoZSBtZXJnZSBjYW4gYmUgcmVzb2x2ZWQgYXV0b21hdGljYWxseS4KKworTm93LCBpbiB0aGlzIGNhc2Ugd2UndmUgaW50ZW50aW9uYWxseSBjcmVhdGVkIGEgc2l0dWF0aW9uIHdoZXJlIHRoZQorbWVyZ2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkIHVwIGJ5IGhhbmQsIHRob3VnaCwgc28gZ2l0IHdpbGwgZG8gYXMgbXVjaAorb2YgaXQgYXMgaXQgY2FuIGF1dG9tYXRpY2FsbHkgKHdoaWNoIGluIHRoaXMgY2FzZSBpcyBqdXN0IG1lcmdlIHRoZSBgZXhhbXBsZWAKK2ZpbGUsIHdoaWNoIGhhZCBubyBkaWZmZXJlbmNlcyBpbiB0aGUgYG15YnJhbmNoYCBicmFuY2gpLCBhbmQgc2F5OgorCistLS0tLS0tLS0tLS0tLS0tCisJVHJ5aW5nIHJlYWxseSB0cml2aWFsIGluLWluZGV4IG1lcmdlLi4uCisJZmF0YWw6IE1lcmdlIHJlcXVpcmVzIGZpbGUtbGV2ZWwgbWVyZ2luZworCU5vcGUuCisJLi4uCisJQXV0by1tZXJnaW5nIGhlbGxvIAorCUNPTkZMSUNUIChjb250ZW50KTogTWVyZ2UgY29uZmxpY3QgaW4gaGVsbG8gCisJQXV0b21hdGljIG1lcmdlIGZhaWxlZDsgZml4IHVwIGJ5IGhhbmQKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggaXMgd2F5IHRvbyB2ZXJib3NlLCBidXQgaXQgYmFzaWNhbGx5IHRlbGxzIHlvdSB0aGF0IGl0IGZhaWxlZCB0aGUKK3JlYWxseSB0cml2aWFsIG1lcmdlICgiU2ltcGxlIG1lcmdlIikgYW5kIGRpZCBhbiAiQXV0b21hdGljIG1lcmdlIgoraW5zdGVhZCwgYnV0IHRoYXQgdG9vIGZhaWxlZCBkdWUgdG8gY29uZmxpY3RzIGluIGBoZWxsb2AuCisKK05vdCB0byB3b3JyeS4gSXQgbGVmdCB0aGUgKHRyaXZpYWwpIGNvbmZsaWN0IGluIGBoZWxsb2AgaW4gdGhlIHNhbWUgZm9ybSB5b3UKK3Nob3VsZCBhbHJlYWR5IGJlIHdlbGwgdXNlZCB0byBpZiB5b3UndmUgZXZlciB1c2VkIENWUywgc28gbGV0J3MganVzdAorb3BlbiBgaGVsbG9gIGluIG91ciBlZGl0b3IgKHdoYXRldmVyIHRoYXQgbWF5IGJlKSwgYW5kIGZpeCBpdCB1cCBzb21laG93LgorSSdkIHN1Z2dlc3QganVzdCBtYWtpbmcgaXQgc28gdGhhdCBgaGVsbG9gIGNvbnRhaW5zIGFsbCBmb3VyIGxpbmVzOgorCistLS0tLS0tLS0tLS0KK0hlbGxvIFdvcmxkCitJdCdzIGEgbmV3IGRheSBmb3IgZ2l0CitQbGF5LCBwbGF5LCBwbGF5CitXb3JrLCB3b3JrLCB3b3JrCistLS0tLS0tLS0tLS0KKworYW5kIG9uY2UgeW91J3JlIGhhcHB5IHdpdGggeW91ciBtYW51YWwgbWVyZ2UsIGp1c3QgZG8gYQorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtaSBoZWxsbworLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgdmVyeSBsb3VkbHkgd2FybiB5b3UgdGhhdCB5b3UncmUgbm93IGNvbW1pdHRpbmcgYSBtZXJnZQorKHdoaWNoIGlzIGNvcnJlY3QsIHNvIG5ldmVyIG1pbmQpLCBhbmQgeW91IGNhbiB3cml0ZSBhIHNtYWxsIG1lcmdlCittZXNzYWdlIGFib3V0IHlvdXIgYWR2ZW50dXJlcyBpbiBnaXQtbWVyZ2UtbGFuZC4KKworQWZ0ZXIgeW91J3JlIGRvbmUsIHN0YXJ0IHVwIGBnaXRrIFwtLWFsbGAgdG8gc2VlIGdyYXBoaWNhbGx5IHdoYXQgdGhlCitoaXN0b3J5IGxvb2tzIGxpa2UuIE5vdGljZSB0aGF0IGBteWJyYW5jaGAgc3RpbGwgZXhpc3RzLCBhbmQgeW91IGNhbgorc3dpdGNoIHRvIGl0LCBhbmQgY29udGludWUgdG8gd29yayB3aXRoIGl0IGlmIHlvdSB3YW50IHRvLiBUaGUKK2BteWJyYW5jaGAgYnJhbmNoIHdpbGwgbm90IGNvbnRhaW4gdGhlIG1lcmdlLCBidXQgbmV4dCB0aW1lIHlvdSBtZXJnZSBpdAorZnJvbSB0aGUgYG1hc3RlcmAgYnJhbmNoLCBnaXQgd2lsbCBrbm93IGhvdyB5b3UgbWVyZ2VkIGl0LCBzbyB5b3UnbGwgbm90CitoYXZlIHRvIGRvIF90aGF0XyBtZXJnZSBhZ2Fpbi4KKworQW5vdGhlciB1c2VmdWwgdG9vbCwgZXNwZWNpYWxseSBpZiB5b3UgZG8gbm90IGFsd2F5cyB3b3JrIGluIFgtV2luZG93CitlbnZpcm9ubWVudCwgaXMgYGdpdCBzaG93LWJyYW5jaGAuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS10b3BvLW9yZGVyIG1hc3RlciBteWJyYW5jaAorKiBbbWFzdGVyXSBNZXJnZSB3b3JrIGluIG15YnJhbmNoCisgISBbbXlicmFuY2hdIFNvbWUgd29yay4KKy0tCistICBbbWFzdGVyXSBNZXJnZSB3b3JrIGluIG15YnJhbmNoCisqKyBbbXlicmFuY2hdIFNvbWUgd29yay4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlyc3QgdHdvIGxpbmVzIGluZGljYXRlIHRoYXQgaXQgaXMgc2hvd2luZyB0aGUgdHdvIGJyYW5jaGVzCithbmQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBmcm9tIHRoZWlyCit0b3Atb2YtdGhlLXRyZWUgY29tbWl0cywgeW91IGFyZSBjdXJyZW50bHkgb24gYG1hc3RlcmAgYnJhbmNoCisobm90aWNlIHRoZSBhc3RlcmlzayBgXCpgIGNoYXJhY3RlciksIGFuZCB0aGUgZmlyc3QgY29sdW1uIGZvcgordGhlIGxhdGVyIG91dHB1dCBsaW5lcyBpcyB1c2VkIHRvIHNob3cgY29tbWl0cyBjb250YWluZWQgaW4gdGhlCitgbWFzdGVyYCBicmFuY2gsIGFuZCB0aGUgc2Vjb25kIGNvbHVtbiBmb3IgdGhlIGBteWJyYW5jaGAKK2JyYW5jaC4gVGhyZWUgY29tbWl0cyBhcmUgc2hvd24gYWxvbmcgd2l0aCB0aGVpciBsb2cgbWVzc2FnZXMuCitBbGwgb2YgdGhlbSBoYXZlIG5vbiBibGFuayBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdCBjb2x1bW4gKGAqYAorc2hvd3MgYW4gb3JkaW5hcnkgY29tbWl0IG9uIHRoZSBjdXJyZW50IGJyYW5jaCwgYC5gIGlzIGEgbWVyZ2UgY29tbWl0KSwgd2hpY2gKK21lYW5zIHRoZXkgYXJlIG5vdyBwYXJ0IG9mIHRoZSBgbWFzdGVyYCBicmFuY2guIE9ubHkgdGhlICJTb21lCit3b3JrIiBjb21taXQgaGFzIHRoZSBwbHVzIGArYCBjaGFyYWN0ZXIgaW4gdGhlIHNlY29uZCBjb2x1bW4sCitiZWNhdXNlIGBteWJyYW5jaGAgaGFzIG5vdCBiZWVuIG1lcmdlZCB0byBpbmNvcnBvcmF0ZSB0aGVzZQorY29tbWl0cyBmcm9tIHRoZSBtYXN0ZXIgYnJhbmNoLiAgVGhlIHN0cmluZyBpbnNpZGUgYnJhY2tldHMKK2JlZm9yZSB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGlzIGEgc2hvcnQgbmFtZSB5b3UgY2FuIHVzZSB0bworbmFtZSB0aGUgY29tbWl0LiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsICdtYXN0ZXInIGFuZCAnbXlicmFuY2gnCithcmUgYnJhbmNoIGhlYWRzLiAgJ21hc3Rlcn4xJyBpcyB0aGUgZmlyc3QgcGFyZW50IG9mICdtYXN0ZXInCiticmFuY2ggaGVhZC4gIFBsZWFzZSBzZWUgJ2dpdC1yZXYtcGFyc2UnIGRvY3VtZW50YXRpb24gaWYgeW91CitzZWUgbW9yZSBjb21wbGV4IGNhc2VzLgorCitOb3csIGxldCdzIHByZXRlbmQgeW91IGFyZSB0aGUgb25lIHdobyBkaWQgYWxsIHRoZSB3b3JrIGluCitgbXlicmFuY2hgLCBhbmQgdGhlIGZydWl0IG9mIHlvdXIgaGFyZCB3b3JrIGhhcyBmaW5hbGx5IGJlZW4gbWVyZ2VkCit0byB0aGUgYG1hc3RlcmAgYnJhbmNoLiBMZXQncyBnbyBiYWNrIHRvIGBteWJyYW5jaGAsIGFuZCBydW4KK3Jlc29sdmUgdG8gZ2V0IHRoZSAidXBzdHJlYW0gY2hhbmdlcyIgYmFjayB0byB5b3VyIGJyYW5jaC4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBteWJyYW5jaAorJCBnaXQgbWVyZ2UgIk1lcmdlIHVwc3RyZWFtIGNoYW5nZXMuIiBIRUFEIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK1RoaXMgb3V0cHV0cyBzb21ldGhpbmcgbGlrZSB0aGlzICh0aGUgYWN0dWFsIGNvbW1pdCBvYmplY3QgbmFtZXMKK3dvdWxkIGJlIGRpZmZlcmVudCkKKworLS0tLS0tLS0tLS0tLS0tLQorVXBkYXRpbmcgZnJvbSBhZTNhMmRhLi4uIHRvIGE4MGI0YWEuLi4uCitGYXN0IGZvcndhcmQKKyBleGFtcGxlIHwgICAgMSArCisgaGVsbG8gICB8ICAgIDEgKworIDIgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorLS0tLS0tLS0tLS0tLS0tLQorCitCZWNhdXNlIHlvdXIgYnJhbmNoIGRpZCBub3QgY29udGFpbiBhbnl0aGluZyBtb3JlIHRoYW4gd2hhdCBhcmUKK2FscmVhZHkgbWVyZ2VkIGludG8gdGhlIGBtYXN0ZXJgIGJyYW5jaCwgdGhlIHJlc29sdmUgb3BlcmF0aW9uIGRpZAorbm90IGFjdHVhbGx5IGRvIGEgbWVyZ2UuIEluc3RlYWQsIGl0IGp1c3QgdXBkYXRlZCB0aGUgdG9wIG9mCit0aGUgdHJlZSBvZiB5b3VyIGJyYW5jaCB0byB0aGF0IG9mIHRoZSBgbWFzdGVyYCBicmFuY2guIFRoaXMgaXMKK29mdGVuIGNhbGxlZCAnZmFzdCBmb3J3YXJkJyBtZXJnZS4KKworWW91IGNhbiBydW4gYGdpdGsgXC0tYWxsYCBhZ2FpbiB0byBzZWUgaG93IHRoZSBjb21taXQgYW5jZXN0cnkKK2xvb2tzIGxpa2UsIG9yIHJ1biBgc2hvdy1icmFuY2hgLCB3aGljaCB0ZWxscyB5b3UgdGhpcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaCBtYXN0ZXIgbXlicmFuY2gKKyEgW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorICogW215YnJhbmNoXSBNZXJnZSB3b3JrIGluIG15YnJhbmNoCistLQorLS0gW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworTWVyZ2luZyBleHRlcm5hbCB3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQncyB1c3VhbGx5IG11Y2ggbW9yZSBjb21tb24gdGhhdCB5b3UgbWVyZ2Ugd2l0aCBzb21lYm9keSBlbHNlIHRoYW4KK21lcmdpbmcgd2l0aCB5b3VyIG93biBicmFuY2hlcywgc28gaXQncyB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCBnaXQKK21ha2VzIHRoYXQgdmVyeSBlYXN5IHRvbywgYW5kIGluIGZhY3QsIGl0J3Mgbm90IHRoYXQgZGlmZmVyZW50IGZyb20KK2RvaW5nIGEgYGdpdCBtZXJnZWAuIEluIGZhY3QsIGEgcmVtb3RlIG1lcmdlIGVuZHMgdXAgYmVpbmcgbm90aGluZworbW9yZSB0aGFuICJmZXRjaCB0aGUgd29yayBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgaW50byBhIHRlbXBvcmFyeSB0YWciCitmb2xsb3dlZCBieSBhIGBnaXQgbWVyZ2VgLgorCitGZXRjaGluZyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgaXMgZG9uZSBieSwgdW5zdXJwcmlzaW5nbHksCitgZ2l0IGZldGNoYDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggPHJlbW90ZS1yZXBvc2l0b3J5PgorLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGZvbGxvd2luZyB0cmFuc3BvcnRzIGNhbiBiZSB1c2VkIHRvIG5hbWUgdGhlCityZXBvc2l0b3J5IHRvIGRvd25sb2FkIGZyb206CisKK1JzeW5jOjoKKwlgcnN5bmM6Ly9yZW1vdGUubWFjaGluZS9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1JzeW5jIHRyYW5zcG9ydCBpcyB1c2FibGUgZm9yIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZywKK2J1dCBpcyBjb21wbGV0ZWx5IHVuYXdhcmUgb2Ygd2hhdCBnaXQgZG9lcywgYW5kIGNhbiBwcm9kdWNlCit1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiB5b3UgZG93bmxvYWQgZnJvbSB0aGUgcHVibGljIHJlcG9zaXRvcnkKK3doaWxlIHRoZSByZXBvc2l0b3J5IG93bmVyIGlzIHVwbG9hZGluZyBpbnRvIGl0IHZpYSBgcnN5bmNgCit0cmFuc3BvcnQuICBNb3N0IG5vdGFibHksIGl0IGNvdWxkIHVwZGF0ZSB0aGUgZmlsZXMgdW5kZXIKK2ByZWZzL2Agd2hpY2ggaG9sZHMgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSB0b3Btb3N0IGNvbW1pdHMKK2JlZm9yZSB1cGxvYWRpbmcgdGhlIGZpbGVzIGluIGBvYmplY3RzL2AgLS0gdGhlIGRvd25sb2FkZXIgd291bGQKK29idGFpbiBoZWFkIGNvbW1pdCBvYmplY3QgbmFtZSB3aGlsZSB0aGF0IG9iamVjdCBpdHNlbGYgaXMgc3RpbGwKK25vdCBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnkuICBGb3IgdGhpcyByZWFzb24sIGl0IGlzCitjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCisKK1NTSDo6CisJYHJlbW90ZS5tYWNoaW5lOi9wYXRoL3RvL3JlcG8uZ2l0L2Agb3IKKysKK2Bzc2g6Ly9yZW1vdGUubWFjaGluZS9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1RoaXMgdHJhbnNwb3J0IGNhbiBiZSB1c2VkIGZvciBib3RoIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcsCithbmQgcmVxdWlyZXMgeW91IHRvIGhhdmUgYSBsb2ctaW4gcHJpdmlsZWdlIG92ZXIgYHNzaGAgdG8gdGhlCityZW1vdGUgbWFjaGluZS4gIEl0IGZpbmRzIG91dCB0aGUgc2V0IG9mIG9iamVjdHMgdGhlIG90aGVyIHNpZGUKK2xhY2tzIGJ5IGV4Y2hhbmdpbmcgdGhlIGhlYWQgY29tbWl0cyBib3RoIGVuZHMgaGF2ZSBhbmQKK3RyYW5zZmVycyAoY2xvc2UgdG8pIG1pbmltdW0gc2V0IG9mIG9iamVjdHMuICBJdCBpcyBieSBmYXIgdGhlCittb3N0IGVmZmljaWVudCB3YXkgdG8gZXhjaGFuZ2UgZ2l0IG9iamVjdHMgYmV0d2VlbiByZXBvc2l0b3JpZXMuCisKK0xvY2FsIGRpcmVjdG9yeTo6CisJYC9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1RoaXMgdHJhbnNwb3J0IGlzIHRoZSBzYW1lIGFzIFNTSCB0cmFuc3BvcnQgYnV0IHVzZXMgYHNoYCB0byBydW4KK2JvdGggZW5kcyBvbiB0aGUgbG9jYWwgbWFjaGluZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgb3RoZXIgZW5kIG9uCit0aGUgcmVtb3RlIG1hY2hpbmUgdmlhIGBzc2hgLgorCitnaXQgTmF0aXZlOjoKKwlgZ2l0Oi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitUaGlzIHRyYW5zcG9ydCB3YXMgZGVzaWduZWQgZm9yIGFub255bW91cyBkb3dubG9hZGluZy4gIExpa2UgU1NICit0cmFuc3BvcnQsIGl0IGZpbmRzIG91dCB0aGUgc2V0IG9mIG9iamVjdHMgdGhlIGRvd25zdHJlYW0gc2lkZQorbGFja3MgYW5kIHRyYW5zZmVycyAoY2xvc2UgdG8pIG1pbmltdW0gc2V0IG9mIG9iamVjdHMuCisKK0hUVFAoUyk6OgorCWBodHRwOi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitEb3dubG9hZGVyIGZyb20gaHR0cCBhbmQgaHR0cHMgVVJMCitmaXJzdCBvYnRhaW5zIHRoZSB0b3Btb3N0IGNvbW1pdCBvYmplY3QgbmFtZSBmcm9tIHRoZSByZW1vdGUgc2l0ZQorYnkgbG9va2luZyBhdCB0aGUgc3BlY2lmaWVkIHJlZm5hbWUgdW5kZXIgYHJlcG8uZ2l0L3JlZnMvYCBkaXJlY3RvcnksCithbmQgdGhlbiB0cmllcyB0byBvYnRhaW4gdGhlCitjb21taXQgb2JqZWN0IGJ5IGRvd25sb2FkaW5nIGZyb20gYHJlcG8uZ2l0L29iamVjdHMveHgveHh4XC4uLmAKK3VzaW5nIHRoZSBvYmplY3QgbmFtZSBvZiB0aGF0IGNvbW1pdCBvYmplY3QuICBUaGVuIGl0IHJlYWRzIHRoZQorY29tbWl0IG9iamVjdCB0byBmaW5kIG91dCBpdHMgcGFyZW50IGNvbW1pdHMgYW5kIHRoZSBhc3NvY2lhdGUKK3RyZWUgb2JqZWN0OyBpdCByZXBlYXRzIHRoaXMgcHJvY2VzcyB1bnRpbCBpdCBnZXRzIGFsbCB0aGUKK25lY2Vzc2FyeSBvYmplY3RzLiAgQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW9yLCB0aGV5IGFyZQorc29tZXRpbWVzIGFsc28gY2FsbGVkICdjb21taXQgd2Fsa2VycycuCisrCitUaGUgJ2NvbW1pdCB3YWxrZXJzJyBhcmUgc29tZXRpbWVzIGFsc28gY2FsbGVkICdkdW1iCit0cmFuc3BvcnRzJywgYmVjYXVzZSB0aGV5IGRvIG5vdCByZXF1aXJlIGFueSBnaXQgYXdhcmUgc21hcnQKK3NlcnZlciBsaWtlIGdpdCBOYXRpdmUgdHJhbnNwb3J0IGRvZXMuICBBbnkgc3RvY2sgSFRUUCBzZXJ2ZXIKK3RoYXQgZG9lcyBub3QgZXZlbiBzdXBwb3J0IGRpcmVjdG9yeSBpbmRleCB3b3VsZCBzdWZmaWNlLiAgQnV0Cit5b3UgbXVzdCBwcmVwYXJlIHlvdXIgcmVwb3NpdG9yeSB3aXRoIGBnaXQtdXBkYXRlLXNlcnZlci1pbmZvYAordG8gaGVscCBkdW1iIHRyYW5zcG9ydCBkb3dubG9hZGVycy4KKysKK1RoZXJlIGFyZSAoY29uZnVzaW5nbHkgZW5vdWdoKSBgZ2l0LXNzaC1mZXRjaGAgYW5kIGBnaXQtc3NoLXVwbG9hZGAKK3Byb2dyYW1zLCB3aGljaCBhcmUgJ2NvbW1pdCB3YWxrZXJzJzsgdGhleSBvdXRsaXZlZCB0aGVpcgordXNlZnVsbmVzcyB3aGVuIGdpdCBOYXRpdmUgYW5kIFNTSCB0cmFuc3BvcnRzIHdlcmUgaW50cm9kdWNlZCwKK2FuZCBub3QgdXNlZCBieSBgZ2l0IHB1bGxgIG9yIGBnaXQgcHVzaGAgc2NyaXB0cy4KKworT25jZSB5b3UgZmV0Y2ggZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnksIHlvdSBgcmVzb2x2ZWAgdGhhdAord2l0aCB5b3VyIGN1cnJlbnQgYnJhbmNoLgorCitIb3dldmVyIC0tIGl0J3Mgc3VjaCBhIGNvbW1vbiB0aGluZyB0byBgZmV0Y2hgIGFuZCB0aGVuCitpbW1lZGlhdGVseSBgcmVzb2x2ZWAsIHRoYXQgaXQncyBjYWxsZWQgYGdpdCBwdWxsYCwgYW5kIHlvdSBjYW4KK3NpbXBseSBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsIDxyZW1vdGUtcmVwb3NpdG9yeT4KKy0tLS0tLS0tLS0tLS0tLS0KKworYW5kIG9wdGlvbmFsbHkgZ2l2ZSBhIGJyYW5jaC1uYW1lIGZvciB0aGUgcmVtb3RlIGVuZCBhcyBhIHNlY29uZAorYXJndW1lbnQuCisKK1tOT1RFXQorWW91IGNvdWxkIGRvIHdpdGhvdXQgdXNpbmcgYW55IGJyYW5jaGVzIGF0IGFsbCwgYnkKK2tlZXBpbmcgYXMgbWFueSBsb2NhbCByZXBvc2l0b3JpZXMgYXMgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZQorYnJhbmNoZXMsIGFuZCBtZXJnaW5nIGJldHdlZW4gdGhlbSB3aXRoIGBnaXQgcHVsbGAsIGp1c3QgbGlrZQoreW91IG1lcmdlIGJldHdlZW4gYnJhbmNoZXMuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBhcHByb2FjaCBpcwordGhhdCBpdCBsZXRzIHlvdSBrZWVwIHNldCBvZiBmaWxlcyBmb3IgZWFjaCBgYnJhbmNoYCBjaGVja2VkCitvdXQgYW5kIHlvdSBtYXkgZmluZCBpdCBlYXNpZXIgdG8gc3dpdGNoIGJhY2sgYW5kIGZvcnRoIGlmIHlvdQoranVnZ2xlIG11bHRpcGxlIGxpbmVzIG9mIGRldmVsb3BtZW50IHNpbXVsdGFuZW91c2x5LiBPZgorY291cnNlLCB5b3Ugd2lsbCBwYXkgdGhlIHByaWNlIG9mIG1vcmUgZGlzayB1c2FnZSB0byBob2xkCittdWx0aXBsZSB3b3JraW5nIHRyZWVzLCBidXQgZGlzayBzcGFjZSBpcyBjaGVhcCB0aGVzZSBkYXlzLgorCitbTk9URV0KK1lvdSBjb3VsZCBldmVuIHB1bGwgZnJvbSB5b3VyIG93biByZXBvc2l0b3J5IGJ5CitnaXZpbmcgJy4nIGFzIDxyZW1vdGUtcmVwb3NpdG9yeT4gcGFyYW1ldGVyIHRvIGBnaXQgcHVsbGAuICBUaGlzCitpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBtZXJnZSBhIGxvY2FsIGJyYW5jaCAob3IgbW9yZSwgaWYgeW91CithcmUgbWFraW5nIGFuIE9jdG9wdXMpIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLgorCitJdCBpcyBsaWtlbHkgdGhhdCB5b3Ugd2lsbCBiZSBwdWxsaW5nIGZyb20gdGhlIHNhbWUgcmVtb3RlCityZXBvc2l0b3J5IGZyb20gdGltZSB0byB0aW1lLiBBcyBhIHNob3J0IGhhbmQsIHlvdSBjYW4gc3RvcmUKK3RoZSByZW1vdGUgcmVwb3NpdG9yeSBVUkwgaW4gYSBmaWxlIHVuZGVyIC5naXQvcmVtb3Rlcy8KK2RpcmVjdG9yeSwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgLXAgLmdpdC9yZW1vdGVzLworJCBjYXQgPi5naXQvcmVtb3Rlcy9saW51cyA8PFxFT0YKK1VSTDogaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQvCitFT0YKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdXNlIHRoZSBmaWxlbmFtZSB0byBgZ2l0IHB1bGxgIGluc3RlYWQgb2YgdGhlIGZ1bGwgVVJMLgorVGhlIFVSTCBzcGVjaWZpZWQgaW4gc3VjaCBmaWxlIGNhbiBldmVuIGJlIGEgcHJlZml4CitvZiBhIGZ1bGwgVVJMLCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjYXQgPi5naXQvcmVtb3Rlcy9qZ2FyemlrIDw8XEVPRgorVVJMOiBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9naXQvamdhcnppay8KK0VPRgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworRXhhbXBsZXMuCisKKy4gYGdpdCBwdWxsIGxpbnVzYAorLiBgZ2l0IHB1bGwgbGludXMgdGFnIHYwLjk5LjFgCisuIGBnaXQgcHVsbCBqZ2FyemlrL25ldGRldi0yLjYuZ2l0LyBlMTAwYAorCit0aGUgYWJvdmUgYXJlIGVxdWl2YWxlbnQgdG86CisKKy4gYGdpdCBwdWxsIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LyBIRUFEYAorLiBgZ2l0IHB1bGwgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQvIHRhZyB2MC45OS4xYAorLiBgZ2l0IHB1bGwgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi8uLi4vamdhcnppay9uZXRkZXYtMi42LmdpdCBlMTAwYAorCisKK0hvdyBkb2VzIHRoZSBtZXJnZSB3b3JrPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHNhaWQgdGhpcyB0dXRvcmlhbCBzaG93cyB3aGF0IHBsdW1iaW5nIGRvZXMgdG8gaGVscCB5b3UgY29wZQord2l0aCB0aGUgcG9yY2VsYWluIHRoYXQgaXNuJ3QgZmx1c2hpbmcsIGJ1dCB3ZSBzbyBmYXIgZGlkIG5vdAordGFsayBhYm91dCBob3cgdGhlIG1lcmdlIHJlYWxseSB3b3Jrcy4gIElmIHlvdSBhcmUgZm9sbG93aW5nCit0aGlzIHR1dG9yaWFsIHRoZSBmaXJzdCB0aW1lLCBJJ2Qgc3VnZ2VzdCB0byBza2lwIHRvICJQdWJsaXNoaW5nCit5b3VyIHdvcmsiIHNlY3Rpb24gYW5kIGNvbWUgYmFjayBoZXJlIGxhdGVyLgorCitPSywgc3RpbGwgd2l0aCBtZT8gIFRvIGdpdmUgdXMgYW4gZXhhbXBsZSB0byBsb29rIGF0LCBsZXQncyBnbworYmFjayB0byB0aGUgZWFybGllciByZXBvc2l0b3J5IHdpdGggImhlbGxvIiBhbmQgImV4YW1wbGUiIGZpbGUsCithbmQgYnJpbmcgb3Vyc2VsdmVzIGJhY2sgdG8gdGhlIHByZS1tZXJnZSBzdGF0ZToKKworLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaCAtLW1vcmU9MyBtYXN0ZXIgbXlicmFuY2gKKyEgW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorICogW215YnJhbmNoXSBNZXJnZSB3b3JrIGluIG15YnJhbmNoCistLQorLS0gW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorKyogW21hc3Rlcl4yXSBTb21lIHdvcmsuCisrKiBbbWFzdGVyXl0gU29tZSBmdW4uCistLS0tLS0tLS0tLS0KKworUmVtZW1iZXIsIGJlZm9yZSBydW5uaW5nIGBnaXQgbWVyZ2VgLCBvdXIgYG1hc3RlcmAgaGVhZCB3YXMgYXQKKyJTb21lIGZ1bi4iIGNvbW1pdCwgd2hpbGUgb3VyIGBteWJyYW5jaGAgaGVhZCB3YXMgYXQgIlNvbWUKK3dvcmsuIiBjb21taXQuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXlicmFuY2gKKyQgZ2l0IHJlc2V0IC0taGFyZCBtYXN0ZXJeMgorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCByZXNldCAtLWhhcmQgbWFzdGVyXgorLS0tLS0tLS0tLS0tCisKK0FmdGVyIHJld2luZGluZywgdGhlIGNvbW1pdCBzdHJ1Y3R1cmUgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoCisqIFttYXN0ZXJdIFNvbWUgZnVuLgorICEgW215YnJhbmNoXSBTb21lIHdvcmsuCistLQorICsgW215YnJhbmNoXSBTb21lIHdvcmsuCisqICBbbWFzdGVyXSBTb21lIGZ1bi4KKyorIFtteWJyYW5jaF5dIE5ldyBkYXkuCistLS0tLS0tLS0tLS0KKworTm93IHdlIGFyZSByZWFkeSB0byBleHBlcmltZW50IHdpdGggdGhlIG1lcmdlIGJ5IGhhbmQuCisKK2BnaXQgbWVyZ2VgIGNvbW1hbmQsIHdoZW4gbWVyZ2luZyB0d28gYnJhbmNoZXMsIHVzZXMgMy13YXkgbWVyZ2UKK2FsZ29yaXRobS4gIEZpcnN0LCBpdCBmaW5kcyB0aGUgY29tbW9uIGFuY2VzdG9yIGJldHdlZW4gdGhlbS4KK1RoZSBjb21tYW5kIGl0IHVzZXMgaXMgYGdpdC1tZXJnZS1iYXNlYDoKKworLS0tLS0tLS0tLS0tCiskIG1iPSQoZ2l0LW1lcmdlLWJhc2UgSEVBRCBteWJyYW5jaCkKKy0tLS0tLS0tLS0tLQorCitUaGUgY29tbWFuZCB3cml0ZXMgdGhlIGNvbW1pdCBvYmplY3QgbmFtZSBvZiB0aGUgY29tbW9uIGFuY2VzdG9yCit0byB0aGUgc3RhbmRhcmQgb3V0cHV0LCBzbyB3ZSBjYXB0dXJlZCBpdHMgb3V0cHV0IHRvIGEgdmFyaWFibGUsCitiZWNhdXNlIHdlIHdpbGwgYmUgdXNpbmcgaXQgaW4gdGhlIG5leHQgc3RlcC4gIEJUVywgdGhlIGNvbW1vbgorYW5jZXN0b3IgY29tbWl0IGlzIHRoZSAiTmV3IGRheS4iIGNvbW1pdCBpbiB0aGlzIGNhc2UuICBZb3UgY2FuCit0ZWxsIGl0IGJ5OgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LW5hbWUtcmV2ICRtYgorbXktZmlyc3QtdGFnCistLS0tLS0tLS0tLS0KKworQWZ0ZXIgZmluZGluZyBvdXQgYSBjb21tb24gYW5jZXN0b3IgY29tbWl0LCB0aGUgc2Vjb25kIHN0ZXAgaXMKK3RoaXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tIC11ICRtYiBIRUFEIG15YnJhbmNoCistLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0aGUgc2FtZSBgZ2l0LXJlYWQtdHJlZWAgY29tbWFuZCB3ZSBoYXZlIGFscmVhZHkgc2VlbiwKK2J1dCBpdCB0YWtlcyB0aHJlZSB0cmVlcywgdW5saWtlIHByZXZpb3VzIGV4YW1wbGVzLiAgVGhpcyByZWFkcwordGhlIGNvbnRlbnRzIG9mIGVhY2ggdHJlZSBpbnRvIGRpZmZlcmVudCAnc3RhZ2UnIGluIHRoZSBpbmRleAorZmlsZSAodGhlIGZpcnN0IHRyZWUgZ29lcyB0byBzdGFnZSAxLCB0aGUgc2Vjb25kIHN0YWdlIDIsCitldGMuKS4gIEFmdGVyIHJlYWRpbmcgdGhyZWUgdHJlZXMgaW50byB0aHJlZSBzdGFnZXMsIHRoZSBwYXRocwordGhhdCBhcmUgdGhlIHNhbWUgaW4gYWxsIHRocmVlIHN0YWdlcyBhcmUgJ2NvbGxhcHNlZCcgaW50byBzdGFnZQorMC4gIEFsc28gcGF0aHMgdGhhdCBhcmUgdGhlIHNhbWUgaW4gdHdvIG9mIHRocmVlIHN0YWdlcyBhcmUKK2NvbGxhcHNlZCBpbnRvIHN0YWdlIDAsIHRha2luZyB0aGUgU0hBMSBmcm9tIGVpdGhlciBzdGFnZSAyIG9yCitzdGFnZSAzLCB3aGljaGV2ZXIgaXMgZGlmZmVyZW50IGZyb20gc3RhZ2UgMSAoaS5lLiBvbmx5IG9uZSBzaWRlCitjaGFuZ2VkIGZyb20gdGhlIGNvbW1vbiBhbmNlc3RvcikuCisKK0FmdGVyICdjb2xsYXBzaW5nJyBvcGVyYXRpb24sIHBhdGhzIHRoYXQgYXJlIGRpZmZlcmVudCBpbiB0aHJlZQordHJlZXMgYXJlIGxlZnQgaW4gbm9uLXplcm8gc3RhZ2VzLiAgQXQgdGhpcyBwb2ludCwgeW91IGNhbgoraW5zcGVjdCB0aGUgaW5kZXggZmlsZSB3aXRoIHRoaXMgY29tbWFuZDoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1scy1maWxlcyAtLXN0YWdlCisxMDA2NDQgN2Y4YjE0MWI2NWZkY2VlNDczMjFlMzk5YTI1OThhMjM1YTAzMjQyMiAwCWV4YW1wbGUKKzEwMDY0NCAyNjM0MTRmNDIzZDBlNGQ3MGRhZThmZTUzZmEzNDYxNGZmM2UyODYwIDEJaGVsbG8KKzEwMDY0NCAwNmZhNmEyNDI1NmRjN2U1NjBlZmE1Njg3ZmE4NGI1MWYwMjYzYzNhIDIJaGVsbG8KKzEwMDY0NCBjYzQ0YzczZWI3ODM1NjVkYTU4MzFiNGQ4MjBjOTYyOTU0MDE5YjY5IDMJaGVsbG8KKy0tLS0tLS0tLS0tLQorCitJbiBvdXIgZXhhbXBsZSBvZiBvbmx5IHR3byBmaWxlcywgd2UgZGlkIG5vdCBoYXZlIHVuY2hhbmdlZAorZmlsZXMgc28gb25seSAnZXhhbXBsZScgcmVzdWx0ZWQgaW4gY29sbGFwc2luZywgYnV0IGluIHJlYWwtbGlmZQorbGFyZ2UgcHJvamVjdHMsIG9ubHkgc21hbGwgbnVtYmVyIG9mIGZpbGVzIGNoYW5nZSBpbiBvbmUgY29tbWl0LAorYW5kIHRoaXMgJ2NvbGxhcHNpbmcnIHRlbmRzIHRvIHRyaXZpYWxseSBtZXJnZSBtb3N0IG9mIHRoZSBwYXRocworZmFpcmx5IHF1aWNrbHksIGxlYXZpbmcgb25seSBhIGhhbmRmdWwgdGhlIHJlYWwgY2hhbmdlcyBpbiBub24temVybworc3RhZ2VzLgorCitUbyBsb29rIGF0IG9ubHkgbm9uLXplcm8gc3RhZ2VzLCB1c2UgYFwtLXVubWVyZ2VkYCBmbGFnOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQKKzEwMDY0NCAyNjM0MTRmNDIzZDBlNGQ3MGRhZThmZTUzZmEzNDYxNGZmM2UyODYwIDEJaGVsbG8KKzEwMDY0NCAwNmZhNmEyNDI1NmRjN2U1NjBlZmE1Njg3ZmE4NGI1MWYwMjYzYzNhIDIJaGVsbG8KKzEwMDY0NCBjYzQ0YzczZWI3ODM1NjVkYTU4MzFiNGQ4MjBjOTYyOTU0MDE5YjY5IDMJaGVsbG8KKy0tLS0tLS0tLS0tLQorCitUaGUgbmV4dCBzdGVwIG9mIG1lcmdpbmcgaXMgdG8gbWVyZ2UgdGhlc2UgdGhyZWUgdmVyc2lvbnMgb2YgdGhlCitmaWxlLCB1c2luZyAzLXdheSBtZXJnZS4gIFRoaXMgaXMgZG9uZSBieSBnaXZpbmcKK2BnaXQtbWVyZ2Utb25lLWZpbGVgIGNvbW1hbmQgYXMgb25lIG9mIHRoZSBhcmd1bWVudHMgdG8KK2BnaXQtbWVyZ2UtaW5kZXhgIGNvbW1hbmQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtbWVyZ2UtaW5kZXggZ2l0LW1lcmdlLW9uZS1maWxlIGhlbGxvCitBdXRvLW1lcmdpbmcgaGVsbG8uCittZXJnZTogd2FybmluZzogY29uZmxpY3RzIGR1cmluZyBtZXJnZQorRVJST1I6IE1lcmdlIGNvbmZsaWN0IGluIGhlbGxvLgorZmF0YWw6IG1lcmdlIHByb2dyYW0gZmFpbGVkCistLS0tLS0tLS0tLS0KKworYGdpdC1tZXJnZS1vbmUtZmlsZWAgc2NyaXB0IGlzIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnMgdG8KK2Rlc2NyaWJlIHRob3NlIHRocmVlIHZlcnNpb25zLCBhbmQgaXMgcmVzcG9uc2libGUgdG8gbGVhdmUgdGhlCittZXJnZSByZXN1bHRzIGluIHRoZSB3b3JraW5nIHRyZWUuCitJdCBpcyBhIGZhaXJseSBzdHJhaWdodGZvcndhcmQgc2hlbGwgc2NyaXB0LCBhbmQKK2V2ZW50dWFsbHkgY2FsbHMgYG1lcmdlYCBwcm9ncmFtIGZyb20gUkNTIHN1aXRlIHRvIHBlcmZvcm0gYQorZmlsZS1sZXZlbCAzLXdheSBtZXJnZS4gIEluIHRoaXMgY2FzZSwgYG1lcmdlYCBkZXRlY3RzCitjb25mbGljdHMsIGFuZCB0aGUgbWVyZ2UgcmVzdWx0IHdpdGggY29uZmxpY3QgbWFya3MgaXMgbGVmdCBpbgordGhlIHdvcmtpbmcgdHJlZS4uICBUaGlzIGNhbiBiZSBzZWVuIGlmIHlvdSBydW4gYGxzLWZpbGVzCistLXN0YWdlYCBhZ2FpbiBhdCB0aGlzIHBvaW50OgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UKKzEwMDY0NCA3ZjhiMTQxYjY1ZmRjZWU0NzMyMWUzOTlhMjU5OGEyMzVhMDMyNDIyIDAJZXhhbXBsZQorMTAwNjQ0IDI2MzQxNGY0MjNkMGU0ZDcwZGFlOGZlNTNmYTM0NjE0ZmYzZTI4NjAgMQloZWxsbworMTAwNjQ0IDA2ZmE2YTI0MjU2ZGM3ZTU2MGVmYTU2ODdmYTg0YjUxZjAyNjNjM2EgMgloZWxsbworMTAwNjQ0IGNjNDRjNzNlYjc4MzU2NWRhNTgzMWI0ZDgyMGM5NjI5NTQwMTliNjkgMwloZWxsbworLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdGhlIHN0YXRlIG9mIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUgd29ya2luZyBmaWxlIGFmdGVyCitgZ2l0IG1lcmdlYCByZXR1cm5zIGNvbnRyb2wgYmFjayB0byB5b3UsIGxlYXZpbmcgdGhlIGNvbmZsaWN0aW5nCittZXJnZSBmb3IgeW91IHRvIHJlc29sdmUuICBOb3RpY2UgdGhhdCB0aGUgcGF0aCBgaGVsbG9gIGlzIHN0aWxsCit1bm1lcmdlZCwgYW5kIHdoYXQgeW91IHNlZSB3aXRoIGBnaXQgZGlmZmAgYXQgdGhpcyBwb2ludCBpcworZGlmZmVyZW5jZXMgc2luY2Ugc3RhZ2UgMiAoaS5lLiB5b3VyIHZlcnNpb24pLgorCisKK1B1Ymxpc2hpbmcgeW91ciB3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyB3ZSBjYW4gdXNlIHNvbWVib2R5IGVsc2UncyB3b3JrIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeTsgYnV0Citob3cgY2FuICp5b3UqIHByZXBhcmUgYSByZXBvc2l0b3J5IHRvIGxldCBvdGhlciBwZW9wbGUgcHVsbCBmcm9tCitpdD8KKworWW91ciBkbyB5b3VyIHJlYWwgd29yayBpbiB5b3VyIHdvcmtpbmcgdHJlZSB0aGF0IGhhcyB5b3VyCitwcmltYXJ5IHJlcG9zaXRvcnkgaGFuZ2luZyB1bmRlciBpdCBhcyBpdHMgYC5naXRgIHN1YmRpcmVjdG9yeS4KK1lvdSAqY291bGQqIG1ha2UgdGhhdCByZXBvc2l0b3J5IGFjY2Vzc2libGUgcmVtb3RlbHkgYW5kIGFzaworcGVvcGxlIHRvIHB1bGwgZnJvbSBpdCwgYnV0IGluIHByYWN0aWNlIHRoYXQgaXMgbm90IHRoZSB3YXkKK3RoaW5ncyBhcmUgdXN1YWxseSBkb25lLiBBIHJlY29tbWVuZGVkIHdheSBpcyB0byBoYXZlIGEgcHVibGljCityZXBvc2l0b3J5LCBtYWtlIGl0IHJlYWNoYWJsZSBieSBvdGhlciBwZW9wbGUsIGFuZCB3aGVuIHRoZQorY2hhbmdlcyB5b3UgbWFkZSBpbiB5b3VyIHByaW1hcnkgd29ya2luZyB0cmVlIGFyZSBpbiBnb29kIHNoYXBlLAordXBkYXRlIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSBmcm9tIGl0LiBUaGlzIGlzIG9mdGVuIGNhbGxlZAorJ3B1c2hpbmcnLgorCitbTk9URV0KK1RoaXMgcHVibGljIHJlcG9zaXRvcnkgY291bGQgZnVydGhlciBiZSBtaXJyb3JlZCwgYW5kIHRoYXQgaXMKK2hvdyBnaXQgcmVwb3NpdG9yaWVzIGF0IGBrZXJuZWwub3JnYCBhcmUgbWFuYWdlZC4KKworUHVibGlzaGluZyB0aGUgY2hhbmdlcyBmcm9tIHlvdXIgbG9jYWwgKHByaXZhdGUpIHJlcG9zaXRvcnkgdG8KK3lvdXIgcmVtb3RlIChwdWJsaWMpIHJlcG9zaXRvcnkgcmVxdWlyZXMgYSB3cml0ZSBwcml2aWxlZ2Ugb24KK3RoZSByZW1vdGUgbWFjaGluZS4gWW91IG5lZWQgdG8gaGF2ZSBhbiBTU0ggYWNjb3VudCB0aGVyZSB0bworcnVuIGEgc2luZ2xlIGNvbW1hbmQsIGBnaXQtcmVjZWl2ZS1wYWNrYC4KKworRmlyc3QsIHlvdSBuZWVkIHRvIGNyZWF0ZSBhbiBlbXB0eSByZXBvc2l0b3J5IG9uIHRoZSByZW1vdGUKK21hY2hpbmUgdGhhdCB3aWxsIGhvdXNlIHlvdXIgcHVibGljIHJlcG9zaXRvcnkuIFRoaXMgZW1wdHkKK3JlcG9zaXRvcnkgd2lsbCBiZSBwb3B1bGF0ZWQgYW5kIGJlIGtlcHQgdXAtdG8tZGF0ZSBieSBwdXNoaW5nCitpbnRvIGl0IGxhdGVyLiBPYnZpb3VzbHksIHRoaXMgcmVwb3NpdG9yeSBjcmVhdGlvbiBuZWVkcyB0byBiZQorZG9uZSBvbmx5IG9uY2UuCisKK1tOT1RFXQorYGdpdCBwdXNoYCB1c2VzIGEgcGFpciBvZiBwcm9ncmFtcywKK2BnaXQtc2VuZC1wYWNrYCBvbiB5b3VyIGxvY2FsIG1hY2hpbmUsIGFuZCBgZ2l0LXJlY2VpdmUtcGFja2AKK29uIHRoZSByZW1vdGUgbWFjaGluZS4gVGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgdHdvIG92ZXIKK3RoZSBuZXR3b3JrIGludGVybmFsbHkgdXNlcyBhbiBTU0ggY29ubmVjdGlvbi4KKworWW91ciBwcml2YXRlIHJlcG9zaXRvcnkncyBnaXQgZGlyZWN0b3J5IGlzIHVzdWFsbHkgYC5naXRgLCBidXQKK3lvdXIgcHVibGljIHJlcG9zaXRvcnkgaXMgb2Z0ZW4gbmFtZWQgYWZ0ZXIgdGhlIHByb2plY3QgbmFtZSwKK2kuZS4gYDxwcm9qZWN0Pi5naXRgLiBMZXQncyBjcmVhdGUgc3VjaCBhIHB1YmxpYyByZXBvc2l0b3J5IGZvcgorcHJvamVjdCBgbXktZ2l0YC4gQWZ0ZXIgbG9nZ2luZyBpbnRvIHRoZSByZW1vdGUgbWFjaGluZSwgY3JlYXRlCithbiBlbXB0eSBkaXJlY3Rvcnk6CisKKy0tLS0tLS0tLS0tLQorJCBta2RpciBteS1naXQuZ2l0CistLS0tLS0tLS0tLS0KKworVGhlbiwgbWFrZSB0aGF0IGRpcmVjdG9yeSBpbnRvIGEgZ2l0IHJlcG9zaXRvcnkgYnkgcnVubmluZworYGdpdCBpbml0LWRiYCwgYnV0IHRoaXMgdGltZSwgc2luY2UgaXRzIG5hbWUgaXMgbm90IHRoZSB1c3VhbAorYC5naXRgLCB3ZSBkbyB0aGluZ3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHk6CisKKy0tLS0tLS0tLS0tLQorJCBHSVRfRElSPW15LWdpdC5naXQgZ2l0LWluaXQtZGIKKy0tLS0tLS0tLS0tLQorCitNYWtlIHN1cmUgdGhpcyBkaXJlY3RvcnkgaXMgYXZhaWxhYmxlIGZvciBvdGhlcnMgeW91IHdhbnQgeW91cgorY2hhbmdlcyB0byBiZSBwdWxsZWQgYnkgdmlhIHRoZSB0cmFuc3BvcnQgb2YgeW91ciBjaG9pY2UuIEFsc28KK3lvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBgZ2l0LXJlY2VpdmUtcGFja2AKK3Byb2dyYW0gb24gdGhlIGAkUEFUSGAuCisKK1tOT1RFXQorTWFueSBpbnN0YWxsYXRpb25zIG9mIHNzaGQgZG8gbm90IGludm9rZSB5b3VyIHNoZWxsIGFzIHRoZSBsb2dpbgorc2hlbGwgd2hlbiB5b3UgZGlyZWN0bHkgcnVuIHByb2dyYW1zOyB3aGF0IHRoaXMgbWVhbnMgaXMgdGhhdCBpZgoreW91ciBsb2dpbiBzaGVsbCBpcyBgYmFzaGAsIG9ubHkgYC5iYXNocmNgIGlzIHJlYWQgYW5kIG5vdAorYC5iYXNoX3Byb2ZpbGVgLiBBcyBhIHdvcmthcm91bmQsIG1ha2Ugc3VyZSBgLmJhc2hyY2Agc2V0cyB1cAorYCRQQVRIYCBzbyB0aGF0IHlvdSBjYW4gcnVuIGBnaXQtcmVjZWl2ZS1wYWNrYCBwcm9ncmFtLgorCitbTk9URV0KK0lmIHlvdSBwbGFuIHRvIHB1Ymxpc2ggdGhpcyByZXBvc2l0b3J5IHRvIGJlIGFjY2Vzc2VkIG92ZXIgaHR0cCwKK3lvdSBzaG91bGQgZG8gYGNobW9kICt4IG15LWdpdC5naXQvaG9va3MvcG9zdC11cGRhdGVgIGF0IHRoaXMKK3BvaW50LiAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgZXZlcnkgdGltZSB5b3UgcHVzaCBpbnRvIHRoaXMKK3JlcG9zaXRvcnksIGBnaXQtdXBkYXRlLXNlcnZlci1pbmZvYCBpcyBydW4uCisKK1lvdXIgInB1YmxpYyByZXBvc2l0b3J5IiBpcyBub3cgcmVhZHkgdG8gYWNjZXB0IHlvdXIgY2hhbmdlcy4KK0NvbWUgYmFjayB0byB0aGUgbWFjaGluZSB5b3UgaGF2ZSB5b3VyIHByaXZhdGUgcmVwb3NpdG9yeS4gRnJvbQordGhlcmUsIHJ1biB0aGlzIGNvbW1hbmQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcHVzaCA8cHVibGljLWhvc3Q+Oi9wYXRoL3RvL215LWdpdC5naXQgbWFzdGVyCistLS0tLS0tLS0tLS0KKworVGhpcyBzeW5jaHJvbml6ZXMgeW91ciBwdWJsaWMgcmVwb3NpdG9yeSB0byBtYXRjaCB0aGUgbmFtZWQKK2JyYW5jaCBoZWFkIChpLmUuIGBtYXN0ZXJgIGluIHRoaXMgY2FzZSkgYW5kIG9iamVjdHMgcmVhY2hhYmxlCitmcm9tIHRoZW0gaW4geW91ciBjdXJyZW50IHJlcG9zaXRvcnkuCisKK0FzIGEgcmVhbCBleGFtcGxlLCB0aGlzIGlzIGhvdyBJIHVwZGF0ZSBteSBwdWJsaWMgZ2l0CityZXBvc2l0b3J5LiBLZXJuZWwub3JnIG1pcnJvciBuZXR3b3JrIHRha2VzIGNhcmUgb2YgdGhlCitwcm9wYWdhdGlvbiB0byBvdGhlciBwdWJsaWNseSB2aXNpYmxlIG1hY2hpbmVzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggbWFzdGVyLmtlcm5lbC5vcmc6L3B1Yi9zY20vZ2l0L2dpdC5naXQvIAorLS0tLS0tLS0tLS0tCisKKworUGFja2luZyB5b3VyIHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VhcmxpZXIsIHdlIHNhdyB0aGF0IG9uZSBmaWxlIHVuZGVyIGAuZ2l0L29iamVjdHMvPz8vYCBkaXJlY3RvcnkKK2lzIHN0b3JlZCBmb3IgZWFjaCBnaXQgb2JqZWN0IHlvdSBjcmVhdGUuIFRoaXMgcmVwcmVzZW50YXRpb24KK2lzIGVmZmljaWVudCB0byBjcmVhdGUgYXRvbWljYWxseSBhbmQgc2FmZWx5LCBidXQKK25vdCBzbyBjb252ZW5pZW50IHRvIHRyYW5zcG9ydCBvdmVyIHRoZSBuZXR3b3JrLiBTaW5jZSBnaXQgb2JqZWN0cyBhcmUKK2ltbXV0YWJsZSBvbmNlIHRoZXkgYXJlIGNyZWF0ZWQsIHRoZXJlIGlzIGEgd2F5IHRvIG9wdGltaXplIHRoZQorc3RvcmFnZSBieSAicGFja2luZyB0aGVtIHRvZ2V0aGVyIi4gVGhlIGNvbW1hbmQKKworLS0tLS0tLS0tLS0tCiskIGdpdCByZXBhY2sKKy0tLS0tLS0tLS0tLQorCit3aWxsIGRvIGl0IGZvciB5b3UuIElmIHlvdSBmb2xsb3dlZCB0aGUgdHV0b3JpYWwgZXhhbXBsZXMsIHlvdQord291bGQgaGF2ZSBhY2N1bXVsYXRlZCBhYm91dCAxNyBvYmplY3RzIGluIGAuZ2l0L29iamVjdHMvPz8vYAorZGlyZWN0b3JpZXMgYnkgbm93LiBgZ2l0IHJlcGFja2AgdGVsbHMgeW91IGhvdyBtYW55IG9iamVjdHMgaXQKK3BhY2tlZCwgYW5kIHN0b3JlcyB0aGUgcGFja2VkIGZpbGUgaW4gYC5naXQvb2JqZWN0cy9wYWNrYAorZGlyZWN0b3J5LgorCitbTk9URV0KK1lvdSB3aWxsIHNlZSB0d28gZmlsZXMsIGBwYWNrLVwqLnBhY2tgIGFuZCBgcGFjay1cKi5pZHhgLAoraW4gYC5naXQvb2JqZWN0cy9wYWNrYCBkaXJlY3RvcnkuIFRoZXkgYXJlIGNsb3NlbHkgcmVsYXRlZCB0bworZWFjaCBvdGhlciwgYW5kIGlmIHlvdSBldmVyIGNvcHkgdGhlbSBieSBoYW5kIHRvIGEgZGlmZmVyZW50CityZXBvc2l0b3J5IGZvciB3aGF0ZXZlciByZWFzb24sIHlvdSBzaG91bGQgbWFrZSBzdXJlIHlvdSBjb3B5Cit0aGVtIHRvZ2V0aGVyLiBUaGUgZm9ybWVyIGhvbGRzIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBvYmplY3RzCitpbiB0aGUgcGFjaywgYW5kIHRoZSBsYXR0ZXIgaG9sZHMgdGhlIGluZGV4IGZvciByYW5kb20KK2FjY2Vzcy4KKworSWYgeW91IGFyZSBwYXJhbm9pZCwgcnVubmluZyBgZ2l0LXZlcmlmeS1wYWNrYCBjb21tYW5kIHdvdWxkCitkZXRlY3QgaWYgeW91IGhhdmUgYSBjb3JydXB0IHBhY2ssIGJ1dCBkbyBub3Qgd29ycnkgdG9vIG11Y2guCitPdXIgcHJvZ3JhbXMgYXJlIGFsd2F5cyBwZXJmZWN0IDstKS4KKworT25jZSB5b3UgaGF2ZSBwYWNrZWQgb2JqZWN0cywgeW91IGRvIG5vdCBuZWVkIHRvIGxlYXZlIHRoZQordW5wYWNrZWQgb2JqZWN0cyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhlIHBhY2sgZmlsZSBhbnltb3JlLgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHBydW5lLXBhY2tlZAorLS0tLS0tLS0tLS0tCisKK3dvdWxkIHJlbW92ZSB0aGVtIGZvciB5b3UuCisKK1lvdSBjYW4gdHJ5IHJ1bm5pbmcgYGZpbmQgLmdpdC9vYmplY3RzIC10eXBlIGZgIGJlZm9yZSBhbmQgYWZ0ZXIKK3lvdSBydW4gYGdpdCBwcnVuZS1wYWNrZWRgIGlmIHlvdSBhcmUgY3VyaW91cy4gIEFsc28gYGdpdAorY291bnQtb2JqZWN0c2Agd291bGQgdGVsbCB5b3UgaG93IG1hbnkgdW5wYWNrZWQgb2JqZWN0cyBhcmUgaW4KK3lvdXIgcmVwb3NpdG9yeSBhbmQgaG93IG11Y2ggc3BhY2UgdGhleSBhcmUgY29uc3VtaW5nLgorCitbTk9URV0KK2BnaXQgcHVsbGAgaXMgc2xpZ2h0bHkgY3VtYmVyc29tZSBmb3IgSFRUUCB0cmFuc3BvcnQsIGFzIGEKK3BhY2tlZCByZXBvc2l0b3J5IG1heSBjb250YWluIHJlbGF0aXZlbHkgZmV3IG9iamVjdHMgaW4gYQorcmVsYXRpdmVseSBsYXJnZSBwYWNrLiBJZiB5b3UgZXhwZWN0IG1hbnkgSFRUUCBwdWxscyBmcm9tIHlvdXIKK3B1YmxpYyByZXBvc2l0b3J5IHlvdSBtaWdodCB3YW50IHRvIHJlcGFjayAmIHBydW5lIG9mdGVuLCBvcgorbmV2ZXIuCisKK0lmIHlvdSBydW4gYGdpdCByZXBhY2tgIGFnYWluIGF0IHRoaXMgcG9pbnQsIGl0IHdpbGwgc2F5CisiTm90aGluZyB0byBwYWNrIi4gT25jZSB5b3UgY29udGludWUgeW91ciBkZXZlbG9wbWVudCBhbmQKK2FjY3VtdWxhdGUgdGhlIGNoYW5nZXMsIHJ1bm5pbmcgYGdpdCByZXBhY2tgIGFnYWluIHdpbGwgY3JlYXRlIGEKK25ldyBwYWNrLCB0aGF0IGNvbnRhaW5zIG9iamVjdHMgY3JlYXRlZCBzaW5jZSB5b3UgcGFja2VkIHlvdXIKK3JlcG9zaXRvcnkgdGhlIGxhc3QgdGltZS4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHBhY2sgeW91ciBwcm9qZWN0Citzb29uIGFmdGVyIHRoZSBpbml0aWFsIGltcG9ydCAodW5sZXNzIHlvdSBhcmUgc3RhcnRpbmcgeW91cgorcHJvamVjdCBmcm9tIHNjcmF0Y2gpLCBhbmQgdGhlbiBydW4gYGdpdCByZXBhY2tgIGV2ZXJ5IG9uY2UgaW4gYQord2hpbGUsIGRlcGVuZGluZyBvbiBob3cgYWN0aXZlIHlvdXIgcHJvamVjdCBpcy4KKworV2hlbiBhIHJlcG9zaXRvcnkgaXMgc3luY2hyb25pemVkIHZpYSBgZ2l0IHB1c2hgIGFuZCBgZ2l0IHB1bGxgCitvYmplY3RzIHBhY2tlZCBpbiB0aGUgc291cmNlIHJlcG9zaXRvcnkgYXJlIHVzdWFsbHkgc3RvcmVkCit1bnBhY2tlZCBpbiB0aGUgZGVzdGluYXRpb24sIHVubGVzcyByc3luYyB0cmFuc3BvcnQgaXMgdXNlZC4KK1doaWxlIHRoaXMgYWxsb3dzIHlvdSB0byB1c2UgZGlmZmVyZW50IHBhY2tpbmcgc3RyYXRlZ2llcyBvbgorYm90aCBlbmRzLCBpdCBhbHNvIG1lYW5zIHlvdSBtYXkgbmVlZCB0byByZXBhY2sgYm90aAorcmVwb3NpdG9yaWVzIGV2ZXJ5IG9uY2UgaW4gYSB3aGlsZS4KKworCitXb3JraW5nIHdpdGggT3RoZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsdGhvdWdoIGdpdCBpcyBhIHRydWx5IGRpc3RyaWJ1dGVkIHN5c3RlbSwgaXQgaXMgb2Z0ZW4KK2NvbnZlbmllbnQgdG8gb3JnYW5pemUgeW91ciBwcm9qZWN0IHdpdGggYW4gaW5mb3JtYWwgaGllcmFyY2h5CitvZiBkZXZlbG9wZXJzLiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgaXMgcnVuIHRoaXMgd2F5LiBUaGVyZQoraXMgYSBuaWNlIGlsbHVzdHJhdGlvbiAocGFnZSAxNywgIk1lcmdlcyB0byBNYWlubGluZSIpIGluIFJhbmR5CitEdW5sYXAncyBwcmVzZW50YXRpb24gKGBodHRwOi8vdGlueXVybC5jb20vYTJqZGdgKS4KKworSXQgc2hvdWxkIGJlIHN0cmVzc2VkIHRoYXQgdGhpcyBoaWVyYXJjaHkgaXMgcHVyZWx5ICppbmZvcm1hbCouCitUaGVyZSBpcyBub3RoaW5nIGZ1bmRhbWVudGFsIGluIGdpdCB0aGF0IGVuZm9yY2VzIHRoZSAiY2hhaW4gb2YKK3BhdGNoIGZsb3ciIHRoaXMgaGllcmFyY2h5IGltcGxpZXMuIFlvdSBkbyBub3QgaGF2ZSB0byBwdWxsCitmcm9tIG9ubHkgb25lIHJlbW90ZSByZXBvc2l0b3J5LgorCitBIHJlY29tbWVuZGVkIHdvcmtmbG93IGZvciBhICJwcm9qZWN0IGxlYWQiIGdvZXMgbGlrZSB0aGlzOgorCisxLiBQcmVwYXJlIHlvdXIgcHJpbWFyeSByZXBvc2l0b3J5IG9uIHlvdXIgbG9jYWwgbWFjaGluZS4gWW91cgorICAgd29yayBpcyBkb25lIHRoZXJlLgorCisyLiBQcmVwYXJlIGEgcHVibGljIHJlcG9zaXRvcnkgYWNjZXNzaWJsZSB0byBvdGhlcnMuCisrCitJZiBvdGhlciBwZW9wbGUgYXJlIHB1bGxpbmcgZnJvbSB5b3VyIHJlcG9zaXRvcnkgb3ZlciBkdW1iCit0cmFuc3BvcnQgcHJvdG9jb2xzIChIVFRQKSwgeW91IG5lZWQgdG8ga2VlcCB0aGlzIHJlcG9zaXRvcnkKKydkdW1iIHRyYW5zcG9ydCBmcmllbmRseScuICBBZnRlciBgZ2l0IGluaXQtZGJgLAorYCRHSVRfRElSL2hvb2tzL3Bvc3QtdXBkYXRlYCBjb3BpZWQgZnJvbSB0aGUgc3RhbmRhcmQgdGVtcGxhdGVzCit3b3VsZCBjb250YWluIGEgY2FsbCB0byBgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AgYnV0IHRoZQorYHBvc3QtdXBkYXRlYCBob29rIGl0c2VsZiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IC0tIGVuYWJsZSBpdAord2l0aCBgY2htb2QgK3ggcG9zdC11cGRhdGVgLiAgVGhpcyBtYWtlcyBzdXJlIGBnaXQtdXBkYXRlLXNlcnZlci1pbmZvYAora2VlcHMgdGhlIG5lY2Vzc2FyeSBmaWxlcyB1cC10by1kYXRlLgorCiszLiBQdXNoIGludG8gdGhlIHB1YmxpYyByZXBvc2l0b3J5IGZyb20geW91ciBwcmltYXJ5CisgICByZXBvc2l0b3J5LgorCis0LiBgZ2l0IHJlcGFja2AgdGhlIHB1YmxpYyByZXBvc2l0b3J5LiBUaGlzIGVzdGFibGlzaGVzIGEgYmlnCisgICBwYWNrIHRoYXQgY29udGFpbnMgdGhlIGluaXRpYWwgc2V0IG9mIG9iamVjdHMgYXMgdGhlCisgICBiYXNlbGluZSwgYW5kIHBvc3NpYmx5IGBnaXQgcHJ1bmVgIGlmIHRoZSB0cmFuc3BvcnQKKyAgIHVzZWQgZm9yIHB1bGxpbmcgZnJvbSB5b3VyIHJlcG9zaXRvcnkgc3VwcG9ydHMgcGFja2VkCisgICByZXBvc2l0b3JpZXMuCisKKzUuIEtlZXAgd29ya2luZyBpbiB5b3VyIHByaW1hcnkgcmVwb3NpdG9yeS4gWW91ciBjaGFuZ2VzCisgICBpbmNsdWRlIG1vZGlmaWNhdGlvbnMgb2YgeW91ciBvd24sIHBhdGNoZXMgeW91IHJlY2VpdmUgdmlhCisgICBlLW1haWxzLCBhbmQgbWVyZ2VzIHJlc3VsdGluZyBmcm9tIHB1bGxpbmcgdGhlICJwdWJsaWMiCisgICByZXBvc2l0b3JpZXMgb2YgeW91ciAic3Vic3lzdGVtIG1haW50YWluZXJzIi4KKysKK1lvdSBjYW4gcmVwYWNrIHRoaXMgcHJpdmF0ZSByZXBvc2l0b3J5IHdoZW5ldmVyIHlvdSBmZWVsIGxpa2UuCisKKzYuIFB1c2ggeW91ciBjaGFuZ2VzIHRvIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSwgYW5kIGFubm91bmNlIGl0CisgICB0byB0aGUgcHVibGljLgorCis3LiBFdmVyeSBvbmNlIGluIGEgd2hpbGUsICJnaXQgcmVwYWNrIiB0aGUgcHVibGljIHJlcG9zaXRvcnkuCisgICBHbyBiYWNrIHRvIHN0ZXAgNS4gYW5kIGNvbnRpbnVlIHdvcmtpbmcuCisKKworQSByZWNvbW1lbmRlZCB3b3JrIGN5Y2xlIGZvciBhICJzdWJzeXN0ZW0gbWFpbnRhaW5lciIgd2hvIHdvcmtzCitvbiB0aGF0IHByb2plY3QgYW5kIGhhcyBhbiBvd24gInB1YmxpYyByZXBvc2l0b3J5IiBnb2VzIGxpa2UgdGhpczoKKworMS4gUHJlcGFyZSB5b3VyIHdvcmsgcmVwb3NpdG9yeSwgYnkgYGdpdCBjbG9uZWAgdGhlIHB1YmxpYworICAgcmVwb3NpdG9yeSBvZiB0aGUgInByb2plY3QgbGVhZCIuIFRoZSBVUkwgdXNlZCBmb3IgdGhlCisgICBpbml0aWFsIGNsb25pbmcgaXMgc3RvcmVkIGluIGAuZ2l0L3JlbW90ZXMvb3JpZ2luYC4KKworMi4gUHJlcGFyZSBhIHB1YmxpYyByZXBvc2l0b3J5IGFjY2Vzc2libGUgdG8gb3RoZXJzLCBqdXN0IGxpa2UKKyAgIHRoZSAicHJvamVjdCBsZWFkIiBwZXJzb24gZG9lcy4KKworMy4gQ29weSBvdmVyIHRoZSBwYWNrZWQgZmlsZXMgZnJvbSAicHJvamVjdCBsZWFkIiBwdWJsaWMKKyAgIHJlcG9zaXRvcnkgdG8geW91ciBwdWJsaWMgcmVwb3NpdG9yeSwgdW5sZXNzIHRoZSAicHJvamVjdAorICAgbGVhZCIgcmVwb3NpdG9yeSBsaXZlcyBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIHlvdXJzLiAgSW4gdGhlCisgICBsYXR0ZXIgY2FzZSwgeW91IGNhbiB1c2UgYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBmaWxlIHRvCisgICBwb2ludCBhdCB0aGUgcmVwb3NpdG9yeSB5b3UgYXJlIGJvcnJvd2luZyBmcm9tLgorCis0LiBQdXNoIGludG8gdGhlIHB1YmxpYyByZXBvc2l0b3J5IGZyb20geW91ciBwcmltYXJ5CisgICByZXBvc2l0b3J5LiBSdW4gYGdpdCByZXBhY2tgLCBhbmQgcG9zc2libHkgYGdpdCBwcnVuZWAgaWYgdGhlCisgICB0cmFuc3BvcnQgdXNlZCBmb3IgcHVsbGluZyBmcm9tIHlvdXIgcmVwb3NpdG9yeSBzdXBwb3J0cworICAgcGFja2VkIHJlcG9zaXRvcmllcy4KKworNS4gS2VlcCB3b3JraW5nIGluIHlvdXIgcHJpbWFyeSByZXBvc2l0b3J5LiBZb3VyIGNoYW5nZXMKKyAgIGluY2x1ZGUgbW9kaWZpY2F0aW9ucyBvZiB5b3VyIG93biwgcGF0Y2hlcyB5b3UgcmVjZWl2ZSB2aWEKKyAgIGUtbWFpbHMsIGFuZCBtZXJnZXMgcmVzdWx0aW5nIGZyb20gcHVsbGluZyB0aGUgInB1YmxpYyIKKyAgIHJlcG9zaXRvcmllcyBvZiB5b3VyICJwcm9qZWN0IGxlYWQiIGFuZCBwb3NzaWJseSB5b3VyCisgICAic3ViLXN1YnN5c3RlbSBtYWludGFpbmVycyIuCisrCitZb3UgY2FuIHJlcGFjayB0aGlzIHByaXZhdGUgcmVwb3NpdG9yeSB3aGVuZXZlciB5b3UgZmVlbAorbGlrZS4KKworNi4gUHVzaCB5b3VyIGNoYW5nZXMgdG8geW91ciBwdWJsaWMgcmVwb3NpdG9yeSwgYW5kIGFzayB5b3VyCisgICAicHJvamVjdCBsZWFkIiBhbmQgcG9zc2libHkgeW91ciAic3ViLXN1YnN5c3RlbQorICAgbWFpbnRhaW5lcnMiIHRvIHB1bGwgZnJvbSBpdC4KKworNy4gRXZlcnkgb25jZSBpbiBhIHdoaWxlLCBgZ2l0IHJlcGFja2AgdGhlIHB1YmxpYyByZXBvc2l0b3J5LgorICAgR28gYmFjayB0byBzdGVwIDUuIGFuZCBjb250aW51ZSB3b3JraW5nLgorCisKK0EgcmVjb21tZW5kZWQgd29yayBjeWNsZSBmb3IgYW4gImluZGl2aWR1YWwgZGV2ZWxvcGVyIiB3aG8gZG9lcworbm90IGhhdmUgYSAicHVibGljIiByZXBvc2l0b3J5IGlzIHNvbWV3aGF0IGRpZmZlcmVudC4gSXQgZ29lcworbGlrZSB0aGlzOgorCisxLiBQcmVwYXJlIHlvdXIgd29yayByZXBvc2l0b3J5LCBieSBgZ2l0IGNsb25lYCB0aGUgcHVibGljCisgICByZXBvc2l0b3J5IG9mIHRoZSAicHJvamVjdCBsZWFkIiAob3IgYSAic3Vic3lzdGVtCisgICBtYWludGFpbmVyIiwgaWYgeW91IHdvcmsgb24gYSBzdWJzeXN0ZW0pLiBUaGUgVVJMIHVzZWQgZm9yCisgICB0aGUgaW5pdGlhbCBjbG9uaW5nIGlzIHN0b3JlZCBpbiBgLmdpdC9yZW1vdGVzL29yaWdpbmAuCisKKzIuIERvIHlvdXIgd29yayBpbiB5b3VyIHJlcG9zaXRvcnkgb24gJ21hc3RlcicgYnJhbmNoLgorCiszLiBSdW4gYGdpdCBmZXRjaCBvcmlnaW5gIGZyb20gdGhlIHB1YmxpYyByZXBvc2l0b3J5IG9mIHlvdXIKKyAgIHVwc3RyZWFtIGV2ZXJ5IG9uY2UgaW4gYSB3aGlsZS4gVGhpcyBkb2VzIG9ubHkgdGhlIGZpcnN0CisgICBoYWxmIG9mIGBnaXQgcHVsbGAgYnV0IGRvZXMgbm90IG1lcmdlLiBUaGUgaGVhZCBvZiB0aGUKKyAgIHB1YmxpYyByZXBvc2l0b3J5IGlzIHN0b3JlZCBpbiBgLmdpdC9yZWZzL2hlYWRzL29yaWdpbmAuCisKKzQuIFVzZSBgZ2l0IGNoZXJyeSBvcmlnaW5gIHRvIHNlZSB3aGljaCBvbmVzIG9mIHlvdXIgcGF0Y2hlcworICAgd2VyZSBhY2NlcHRlZCwgYW5kL29yIHVzZSBgZ2l0IHJlYmFzZSBvcmlnaW5gIHRvIHBvcnQgeW91cgorICAgdW5tZXJnZWQgY2hhbmdlcyBmb3J3YXJkIHRvIHRoZSB1cGRhdGVkIHVwc3RyZWFtLgorCis1LiBVc2UgYGdpdCBmb3JtYXQtcGF0Y2ggb3JpZ2luYCB0byBwcmVwYXJlIHBhdGNoZXMgZm9yIGUtbWFpbAorICAgc3VibWlzc2lvbiB0byB5b3VyIHVwc3RyZWFtIGFuZCBzZW5kIGl0IG91dC4gR28gYmFjayB0bworICAgc3RlcCAyLiBhbmQgY29udGludWUuCisKKworV29ya2luZyB3aXRoIE90aGVycywgU2hhcmVkIFJlcG9zaXRvcnkgU3R5bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBhcmUgY29taW5nIGZyb20gQ1ZTIGJhY2tncm91bmQsIHRoZSBzdHlsZSBvZiBjb29wZXJhdGlvbgorc3VnZ2VzdGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIG1heSBiZSBuZXcgdG8geW91LiBZb3UgZG8gbm90CitoYXZlIHRvIHdvcnJ5LiBnaXQgc3VwcG9ydHMgInNoYXJlZCBwdWJsaWMgcmVwb3NpdG9yeSIgc3R5bGUgb2YKK2Nvb3BlcmF0aW9uIHlvdSBhcmUgcHJvYmFibHkgbW9yZSBmYW1pbGlhciB3aXRoIGFzIHdlbGwuCisKK1NlZSBsaW5rOmN2cy1taWdyYXRpb24udHh0W2dpdCBmb3IgQ1ZTIHVzZXJzXSBmb3IgdGhlIGRldGFpbHMuCisKK0J1bmRsaW5nIHlvdXIgd29yayB0b2dldGhlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIGxpa2VseSB0aGF0IHlvdSB3aWxsIGJlIHdvcmtpbmcgb24gbW9yZSB0aGFuIG9uZSB0aGluZyBhdAorYSB0aW1lLiAgSXQgaXMgZWFzeSB0byBtYW5hZ2UgdGhvc2UgbW9yZS1vci1sZXNzIGluZGVwZW5kZW50IHRhc2tzCit1c2luZyBicmFuY2hlcyB3aXRoIGdpdC4KKworV2UgaGF2ZSBhbHJlYWR5IHNlZW4gaG93IGJyYW5jaGVzIHdvcmsgcHJldmlvdXNseSwKK3dpdGggImZ1biBhbmQgd29yayIgZXhhbXBsZSB1c2luZyB0d28gYnJhbmNoZXMuICBUaGUgaWRlYSBpcyB0aGUKK3NhbWUgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d28gYnJhbmNoZXMuICBMZXQncyBzYXkgeW91IHN0YXJ0ZWQKK291dCBmcm9tICJtYXN0ZXIiIGhlYWQsIGFuZCBoYXZlIHNvbWUgbmV3IGNvZGUgaW4gdGhlICJtYXN0ZXIiCiticmFuY2gsIGFuZCB0d28gaW5kZXBlbmRlbnQgZml4ZXMgaW4gdGhlICJjb21taXQtZml4IiBhbmQKKyJkaWZmLWZpeCIgYnJhbmNoZXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2gKKyEgW2NvbW1pdC1maXhdIEZpeCBjb21taXQgbWVzc2FnZSBub3JtYWxpemF0aW9uLgorICEgW2RpZmYtZml4XSBGaXggcmVuYW1lIGRldGVjdGlvbi4KKyAgKiBbbWFzdGVyXSBSZWxlYXNlIGNhbmRpZGF0ZSAjMQorLS0tCisgKyAgW2RpZmYtZml4XSBGaXggcmVuYW1lIGRldGVjdGlvbi4KKyArICBbZGlmZi1maXh+MV0gQmV0dGVyIGNvbW1vbiBzdWJzdHJpbmcgYWxnb3JpdGhtLgorKyAgIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAgKiBbbWFzdGVyXSBSZWxlYXNlIGNhbmRpZGF0ZSAjMQorKysqIFtkaWZmLWZpeH4yXSBQcmV0dHktcHJpbnQgbWVzc2FnZXMuCistLS0tLS0tLS0tLS0KKworQm90aCBmaXhlcyBhcmUgdGVzdGVkIHdlbGwsIGFuZCBhdCB0aGlzIHBvaW50LCB5b3Ugd2FudCB0byBtZXJnZQoraW4gYm90aCBvZiB0aGVtLiAgWW91IGNvdWxkIG1lcmdlIGluICdkaWZmLWZpeCcgZmlyc3QgYW5kIHRoZW4KKydjb21taXQtZml4JyBuZXh0LCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgbWVyZ2UgJ01lcmdlIGZpeCBpbiBkaWZmLWZpeCcgbWFzdGVyIGRpZmYtZml4CiskIGdpdCBtZXJnZSAnTWVyZ2UgZml4IGluIGNvbW1pdC1maXgnIG1hc3RlciBjb21taXQtZml4CistLS0tLS0tLS0tLS0KKworV2hpY2ggd291bGQgcmVzdWx0IGluOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoCishIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAhIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgICogW21hc3Rlcl0gTWVyZ2UgZml4IGluIGNvbW1pdC1maXgKKy0tLQorICAtIFttYXN0ZXJdIE1lcmdlIGZpeCBpbiBjb21taXQtZml4CisrICogW2NvbW1pdC1maXhdIEZpeCBjb21taXQgbWVzc2FnZSBub3JtYWxpemF0aW9uLgorICAtIFttYXN0ZXJ+MV0gTWVyZ2UgZml4IGluIGRpZmYtZml4CisgKyogW2RpZmYtZml4XSBGaXggcmVuYW1lIGRldGVjdGlvbi4KKyArKiBbZGlmZi1maXh+MV0gQmV0dGVyIGNvbW1vbiBzdWJzdHJpbmcgYWxnb3JpdGhtLgorICAqIFttYXN0ZXJ+Ml0gUmVsZWFzZSBjYW5kaWRhdGUgIzEKKysrKiBbbWFzdGVyfjNdIFByZXR0eS1wcmludCBtZXNzYWdlcy4KKy0tLS0tLS0tLS0tLQorCitIb3dldmVyLCB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB0byBtZXJnZSBpbiBvbmUgYnJhbmNoCitmaXJzdCBhbmQgdGhlIG90aGVyIG5leHQsIHdoZW4gd2hhdCB5b3UgaGF2ZSBhcmUgYSBzZXQgb2YgdHJ1bHkKK2luZGVwZW5kZW50IGNoYW5nZXMgKGlmIHRoZSBvcmRlciBtYXR0ZXJlZCwgdGhlbiB0aGV5IGFyZSBub3QKK2luZGVwZW5kZW50IGJ5IGRlZmluaXRpb24pLiAgWW91IGNvdWxkIGluc3RlYWQgbWVyZ2UgdGhvc2UgdHdvCiticmFuY2hlcyBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCBhdCBvbmNlLiAgRmlyc3QgbGV0J3MgdW5kbyB3aGF0Cit3ZSBqdXN0IGRpZCBhbmQgc3RhcnQgb3Zlci4gIFdlIHdvdWxkIHdhbnQgdG8gZ2V0IHRoZSBtYXN0ZXIKK2JyYW5jaCBiZWZvcmUgdGhlc2UgdHdvIG1lcmdlcyBieSByZXNldHRpbmcgaXQgdG8gJ21hc3Rlcn4yJzoKKworLS0tLS0tLS0tLS0tCiskIGdpdCByZXNldCAtLWhhcmQgbWFzdGVyfjIKKy0tLS0tLS0tLS0tLQorCitZb3UgY2FuIG1ha2Ugc3VyZSAnZ2l0IHNob3ctYnJhbmNoJyBtYXRjaGVzIHRoZSBzdGF0ZSBiZWZvcmUKK3Rob3NlIHR3byAnZ2l0IG1lcmdlJyB5b3UganVzdCBkaWQuICBUaGVuLCBpbnN0ZWFkIG9mIHJ1bm5pbmcKK3R3byAnZ2l0IG1lcmdlJyBjb21tYW5kcyBpbiBhIHJvdywgeW91IHdvdWxkIHB1bGwgdGhlc2UgdHdvCiticmFuY2ggaGVhZHMgKHRoaXMgaXMga25vd24gYXMgJ21ha2luZyBhbiBPY3RvcHVzJyk6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbCAuIGNvbW1pdC1maXggZGlmZi1maXgKKyQgZ2l0IHNob3ctYnJhbmNoCishIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAhIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgICogW21hc3Rlcl0gT2N0b3B1cyBtZXJnZSBvZiBicmFuY2hlcyAnZGlmZi1maXgnIGFuZCAnY29tbWl0LWZpeCcKKy0tLQorICAtIFttYXN0ZXJdIE9jdG9wdXMgbWVyZ2Ugb2YgYnJhbmNoZXMgJ2RpZmYtZml4JyBhbmQgJ2NvbW1pdC1maXgnCisrICogW2NvbW1pdC1maXhdIEZpeCBjb21taXQgbWVzc2FnZSBub3JtYWxpemF0aW9uLgorICsqIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgKyogW2RpZmYtZml4fjFdIEJldHRlciBjb21tb24gc3Vic3RyaW5nIGFsZ29yaXRobS4KKyAgKiBbbWFzdGVyfjFdIFJlbGVhc2UgY2FuZGlkYXRlICMxCisrKyogW21hc3Rlcn4yXSBQcmV0dHktcHJpbnQgbWVzc2FnZXMuCistLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHlvdSBzaG91bGQgbm90IGRvIE9jdG9wdXMgYmVjYXVzZSB5b3UgY2FuLiAgQW4gb2N0b3B1cworaXMgYSB2YWxpZCB0aGluZyB0byBkbyBhbmQgb2Z0ZW4gbWFrZXMgaXQgZWFzaWVyIHRvIHZpZXcgdGhlCitjb21taXQgaGlzdG9yeSBpZiB5b3UgYXJlIHB1bGxpbmcgbW9yZSB0aGFuIHR3byBpbmRlcGVuZGVudAorY2hhbmdlcyBhdCB0aGUgc2FtZSB0aW1lLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgbWVyZ2UgY29uZmxpY3RzCit3aXRoIGFueSBvZiB0aGUgYnJhbmNoZXMgeW91IGFyZSBtZXJnaW5nIGluIGFuZCBuZWVkIHRvIGhhbmQKK3Jlc29sdmUsIHRoYXQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBkZXZlbG9wbWVudCBoYXBwZW5lZCBpbgordGhvc2UgYnJhbmNoZXMgd2VyZSBub3QgaW5kZXBlbmRlbnQgYWZ0ZXIgYWxsLCBhbmQgeW91IHNob3VsZAorbWVyZ2UgdHdvIGF0IGEgdGltZSwgZG9jdW1lbnRpbmcgaG93IHlvdSByZXNvbHZlZCB0aGUgY29uZmxpY3RzLAorYW5kIHRoZSByZWFzb24gd2h5IHlvdSBwcmVmZXJyZWQgY2hhbmdlcyBtYWRlIGluIG9uZSBzaWRlIG92ZXIKK3RoZSBvdGhlci4gIE90aGVyd2lzZSBpdCB3b3VsZCBtYWtlIHRoZSBwcm9qZWN0IGhpc3RvcnkgaGFyZGVyCit0byBmb2xsb3csIG5vdCBlYXNpZXIuCisKK1sgdG8gYmUgY29udGludWVkLi4gY3ZzaW1wb3J0cyBdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2N2cy1taWdyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9jdnMtbWlncmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjYTgzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jdnMtbWlncmF0aW9uLnR4dApAQCAtMCwwICsxLDMwNCBAQAorZ2l0IGZvciBDVlMgdXNlcnMKKz09PT09PT09PT09PT09PT09CisKK1NvIHlvdSdyZSBhIENWUyB1c2VyLiBUaGF0J3MgT0ssIGl0J3MgYSB0cmVhdGFibGUgY29uZGl0aW9uLiAgVGhlIGpvYiBvZgordGhpcyBkb2N1bWVudCBpcyB0byBwdXQgeW91IG9uIHRoZSByb2FkIHRvIHJlY292ZXJ5LCBieSBoZWxwaW5nIHlvdQorY29udmVydCBhbiBleGlzdGluZyBjdnMgcmVwb3NpdG9yeSB0byBnaXQsIGFuZCBieSBzaG93aW5nIHlvdSBob3cgdG8gdXNlIGEKK2dpdCByZXBvc2l0b3J5IGluIGEgY3ZzLWxpa2UgZmFzaGlvbi4KKworU29tZSBiYXNpYyBmYW1pbGlhcml0eSB3aXRoIGdpdCBpcyByZXF1aXJlZC4gIFRoaXMKK2xpbms6dHV0b3JpYWwuaHRtbFt0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gZ2l0XSBzaG91bGQgYmUgc3VmZmljaWVudC4KKworRmlyc3QsIG5vdGUgc29tZSB3YXlzIHRoYXQgZ2l0IGRpZmZlcnMgZnJvbSBDVlM6CisKKyAgKiBDb21taXRzIGFyZSBhdG9taWMgYW5kIHByb2plY3Qtd2lkZSwgbm90IHBlci1maWxlIGFzIGluIENWUy4KKworICAqIE9mZmxpbmUgd29yayBpcyBzdXBwb3J0ZWQ6IHlvdSBjYW4gbWFrZSBtdWx0aXBsZSBjb21taXRzIGxvY2FsbHksCisgICAgdGhlbiBzdWJtaXQgdGhlbSB3aGVuIHlvdSdyZSByZWFkeS4KKworICAqIEJyYW5jaGluZyBpcyBmYXN0IGFuZCBlYXN5LgorCisgICogRXZlcnkgd29ya2luZyB0cmVlIGNvbnRhaW5zIGEgcmVwb3NpdG9yeSB3aXRoIGEgZnVsbCBjb3B5IG9mIHRoZQorICAgIHByb2plY3QgaGlzdG9yeSwgYW5kIG5vIHJlcG9zaXRvcnkgaXMgaW5oZXJlbnRseSBtb3JlIGltcG9ydGFudCB0aGFuCisgICAgYW55IG90aGVyLiAgSG93ZXZlciwgeW91IGNhbiBlbXVsYXRlIHRoZSBDVlMgbW9kZWwgYnkgZGVzaWduYXRpbmcgYQorICAgIHNpbmdsZSBzaGFyZWQgcmVwb3NpdG9yeSB3aGljaCBwZW9wbGUgY2FuIHN5bmNocm9uaXplIHdpdGg7IHNlZSBiZWxvdworICAgIGZvciBkZXRhaWxzLgorCitJbXBvcnRpbmcgYSBDVlMgYXJjaGl2ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmlyc3QsIGluc3RhbGwgdmVyc2lvbiAyLjEgb3IgaGlnaGVyIG9mIGN2c3BzIGZyb20KK2xpbms6aHR0cDovL3d3dy5jb2JpdGUuY29tL2N2c3BzL1todHRwOi8vd3d3LmNvYml0ZS5jb20vY3ZzcHMvXSBhbmQgbWFrZQorc3VyZSBpdCBpcyBpbiB5b3VyIHBhdGguICBUaGUgbWFnaWMgY29tbWFuZCBsaW5lIGlzIHRoZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY3ZzaW1wb3J0IC12IC1kIDxjdnNyb290PiAtQyA8ZGVzdGluYXRpb24+IDxtb2R1bGU+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcHV0cyBhIGdpdCBhcmNoaXZlIG9mIHRoZSBuYW1lZCBDVlMgbW9kdWxlIGluIHRoZSBkaXJlY3RvcnkKKzxkZXN0aW5hdGlvbj4sIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkuICBUaGUgLXYgb3B0aW9uIG1ha2VzCit0aGUgY29udmVyc2lvbiBzY3JpcHQgdmVyeSBjaGF0dHkuCisKK1RoZSBpbXBvcnQgY2hlY2tzIG91dCBmcm9tIENWUyBldmVyeSByZXZpc2lvbiBvZiBldmVyeSBmaWxlLiAgUmVwb3J0ZWRseQorY3ZzaW1wb3J0IGNhbiBhdmVyYWdlIHNvbWUgdHdlbnR5IHJldmlzaW9ucyBwZXIgc2Vjb25kLCBzbyBmb3IgYQorbWVkaXVtLXNpemVkIHByb2plY3QgdGhpcyBzaG91bGQgbm90IHRha2UgbW9yZSB0aGFuIGEgY291cGxlIG9mIG1pbnV0ZXMuCitMYXJnZXIgcHJvamVjdHMgb3IgcmVtb3RlIHJlcG9zaXRvcmllcyBtYXkgdGFrZSBsb25nZXIuCisKK1RoZSBtYWluIHRydW5rIGlzIHN0b3JlZCBpbiB0aGUgZ2l0IGJyYW5jaCBuYW1lZCBgb3JpZ2luYCwgYW5kIGFkZGl0aW9uYWwKK0NWUyBicmFuY2hlcyBhcmUgc3RvcmVkIGluIGdpdCBicmFuY2hlcyB3aXRoIHRoZSBzYW1lIG5hbWVzLiAgVGhlIG1vc3QKK3JlY2VudCB2ZXJzaW9uIG9mIHRoZSBtYWluIHRydW5rIGlzIGFsc28gbGVmdCBjaGVja2VkIG91dCBvbiB0aGUgYG1hc3RlcmAKK2JyYW5jaCwgc28geW91IGNhbiBzdGFydCBhZGRpbmcgeW91ciBvd24gY2hhbmdlcyByaWdodCBhd2F5LgorCitUaGUgaW1wb3J0IGlzIGluY3JlbWVudGFsLCBzbyBpZiB5b3UgY2FsbCBpdCBhZ2FpbiBuZXh0IG1vbnRoIGl0IHdpbGwKK2ZldGNoIGFueSBDVlMgdXBkYXRlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIHRoZSBtZWFudGltZS4gIEZvciB0aGlzIHRvCit3b3JrLCB5b3UgbXVzdCBub3QgbW9kaWZ5IHRoZSBpbXBvcnRlZCBicmFuY2hlczsgaW5zdGVhZCwgY3JlYXRlIG5ldworYnJhbmNoZXMgZm9yIHlvdXIgb3duIGNoYW5nZXMsIGFuZCBtZXJnZSBpbiB0aGUgaW1wb3J0ZWQgYnJhbmNoZXMgYXMKK25lY2Vzc2FyeS4KKworRGV2ZWxvcG1lbnQgTW9kZWxzCistLS0tLS0tLS0tLS0tLS0tLS0KKworQ1ZTIHVzZXJzIGFyZSBhY2N1c3RvbWVkIHRvIGdpdmluZyBhIGdyb3VwIG9mIGRldmVsb3BlcnMgY29tbWl0IGFjY2VzcyB0bworYSBjb21tb24gcmVwb3NpdG9yeS4gIEluIHRoZSBuZXh0IHNlY3Rpb24gd2UnbGwgZXhwbGFpbiBob3cgdG8gZG8gdGhpcword2l0aCBnaXQuICBIb3dldmVyLCB0aGUgZGlzdHJpYnV0ZWQgbmF0dXJlIG9mIGdpdCBhbGxvd3Mgb3RoZXIgZGV2ZWxvcG1lbnQKK21vZGVscywgYW5kIHlvdSBtYXkgd2FudCB0byBmaXJzdCBjb25zaWRlciB3aGV0aGVyIG9uZSBvZiB0aGVtIG1pZ2h0IGJlIGEKK2JldHRlciBmaXQgZm9yIHlvdXIgcHJvamVjdC4KKworRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2hvb3NlIGEgc2luZ2xlIHBlcnNvbiB0byBtYWludGFpbiB0aGUgcHJvamVjdCdzCitwcmltYXJ5IHB1YmxpYyByZXBvc2l0b3J5LiAgT3RoZXIgZGV2ZWxvcGVycyB0aGVuIGNsb25lIHRoaXMgcmVwb3NpdG9yeQorYW5kIGVhY2ggd29yayBpbiB0aGVpciBvd24gY2xvbmUuICBXaGVuIHRoZXkgaGF2ZSBhIHNlcmllcyBvZiBjaGFuZ2VzIHRoYXQKK3RoZXkncmUgaGFwcHkgd2l0aCwgdGhleSBhc2sgdGhlIG1haW50YWluZXIgdG8gcHVsbCBmcm9tIHRoZSBicmFuY2gKK2NvbnRhaW5pbmcgdGhlIGNoYW5nZXMuICBUaGUgbWFpbnRhaW5lciByZXZpZXdzIHRoZWlyIGNoYW5nZXMgYW5kIHB1bGxzCit0aGVtIGludG8gdGhlIHByaW1hcnkgcmVwb3NpdG9yeSwgd2hpY2ggb3RoZXIgZGV2ZWxvcGVycyBwdWxsIGZyb20gYXMKK25lY2Vzc2FyeSB0byBzdGF5IGNvb3JkaW5hdGVkLiAgVGhlIExpbnV4IGtlcm5lbCBhbmQgb3RoZXIgcHJvamVjdHMgdXNlCit2YXJpYW50cyBvZiB0aGlzIG1vZGVsLgorCitXaXRoIGEgc21hbGwgZ3JvdXAsIGRldmVsb3BlcnMgbWF5IGp1c3QgcHVsbCBjaGFuZ2VzIGZyb20gZWFjaCBvdGhlcidzCityZXBvc2l0b3JpZXMgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBjZW50cmFsIG1haW50YWluZXIuCisKK0VtdWxhdGluZyB0aGUgQ1ZTIERldmVsb3BtZW50IE1vZGVsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdGFydCB3aXRoIGFuIG9yZGluYXJ5IGdpdCB3b3JraW5nIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcm9qZWN0LCBhbmQKK3JlbW92ZSB0aGUgY2hlY2tlZC1vdXQgZmlsZXMsIGtlZXBpbmcganVzdCB0aGUgYmFyZSAuZ2l0IGRpcmVjdG9yeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG12IHByb2plY3QvLmdpdCAvcHViL3JlcG8uZ2l0CiskIHJtIC1yIHByb2plY3QvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmV4dCwgZ2l2ZSBldmVyeSB0ZWFtIG1lbWJlciByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGlzIHJlcG9zaXRvcnkuICBPbmUKK2Vhc3kgd2F5IHRvIGRvIHRoaXMgaXMgdG8gZ2l2ZSBhbGwgdGhlIHRlYW0gbWVtYmVycyBzc2ggYWNjZXNzIHRvIHRoZQorbWFjaGluZSB3aGVyZSB0aGUgcmVwb3NpdG9yeSBpcyBob3N0ZWQuICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBnaXZlIHRoZW0gYQorZnVsbCBzaGVsbCBvbiB0aGUgbWFjaGluZSwgdGhlcmUgaXMgYSByZXN0cmljdGVkIHNoZWxsIHdoaWNoIG9ubHkgYWxsb3dzCit1c2VycyB0byBkbyBnaXQgcHVzaGVzIGFuZCBwdWxsczsgc2VlIGdpdGxpbms6Z2l0LXNoZWxsWzFdLgorCitQdXQgYWxsIHRoZSBjb21taXR0ZXJzIHNob3VsZCBpbiB0aGUgc2FtZSBncm91cCwgYW5kIG1ha2UgdGhlIHJlcG9zaXRvcnkKK3dyaXRhYmxlIGJ5IHRoYXQgZ3JvdXA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjaGdycCAtUiAkZ3JvdXAgcmVwby5naXQKKyQgZmluZCByZXBvLmdpdCAtbWluZGVwdGggMSAtdHlwZSBkIHx4YXJncyBjaG1vZCB1Zytyd3gsZytzCiskIEdJVF9ESVI9cmVwby5naXQgZ2l0IHJlcG8tY29uZmlnIGNvcmUuc2hhcmVkcmVwb3NpdG9yeSB0cnVlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFrZSBzdXJlIGNvbW1pdHRlcnMgaGF2ZSBhIHVtYXNrIG9mIGF0IG1vc3QgMDI3LCBzbyB0aGF0IHRoZSBkaXJlY3RvcmllcwordGhleSBjcmVhdGUgYXJlIHdyaXRhYmxlIGFuZCBzZWFyY2hhYmxlIGJ5IG90aGVyIGdyb3VwIG1lbWJlcnMuCisKK1N1cHBvc2UgdGhpcyByZXBvc2l0b3J5IGlzIG5vdyBzZXQgdXAgaW4gL3B1Yi9yZXBvLmdpdCBvbiB0aGUgaG9zdAorZm9vLmNvbS4gIFRoZW4gYXMgYW4gaW5kaXZpZHVhbCBjb21taXR0ZXIgeW91IGNhbiBjbG9uZSB0aGUgc2hhcmVkCityZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGZvby5jb206L3B1Yi9yZXBvLmdpdC8gbXktcHJvamVjdAorJCBjZCBteS1wcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGhhY2sgYXdheS4gIFRoZSBlcXVpdmFsZW50IG9mIGBjdnMgdXBkYXRlYCBpcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggbWVyZ2VzIGluIGFueSB3b3JrIHRoYXQgb3RoZXJzIG1pZ2h0IGhhdmUgZG9uZSBzaW5jZSB0aGUgY2xvbmUKK29wZXJhdGlvbi4KKworW05PVEVdCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIGZpcnN0IGBnaXQgY2xvbmVgIHBsYWNlcyB0aGUgZm9sbG93aW5nIGluIHRoZQorYG15LXByb2plY3QvLmdpdC9yZW1vdGVzL29yaWdpbmAgZmlsZSwgYW5kIHRoYXQncyB3aHkgdGhlIHByZXZpb3VzIHN0ZXAKK2FuZCB0aGUgbmV4dCBzdGVwIGJvdGggd29yay4KKy0tLS0tLS0tLS0tLQorVVJMOiBmb28uY29tOi9wdWIvcHJvamVjdC5naXQvIG15LXByb2plY3QKK1B1bGw6IG1hc3RlcjpvcmlnaW4KKy0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiB1cGRhdGUgdGhlIHNoYXJlZCByZXBvc2l0b3J5IHdpdGggeW91ciBjaGFuZ2VzIHVzaW5nOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHNvbWVvbmUgZWxzZSBoYXMgdXBkYXRlZCB0aGUgcmVwb3NpdG9yeSBtb3JlIHJlY2VudGx5LCBgZ2l0IHB1c2hgLCBsaWtlCitgY3ZzIGNvbW1pdGAsIHdpbGwgY29tcGxhaW4sIGluIHdoaWNoIGNhc2UgeW91IG11c3QgcHVsbCBhbnkgY2hhbmdlcworYmVmb3JlIGF0dGVtcHRpbmcgdGhlIHB1c2ggYWdhaW4uCisKK0luIHRoZSBgZ2l0IHB1c2hgIGNvbW1hbmQgYWJvdmUgd2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGJyYW5jaAordG8gdXBkYXRlIChgbWFzdGVyYCkuICBJZiB3ZSBsZWF2ZSB0aGF0IG91dCwgYGdpdCBwdXNoYCB0cmllcyB0byB1cGRhdGUKK2FueSBicmFuY2hlcyBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSBicmFuY2gKK2luIHRoZSBsb2NhbCByZXBvc2l0b3J5LiAgU28gdGhlIGxhc3QgYHB1c2hgIGNhbiBiZSBkb25lIHdpdGggZWl0aGVyIG9mOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggb3JpZ2luCiskIGdpdCBwdXNoIHJlcG8uc2hhcmVkLnh6Oi9wdWIvc2NtL3Byb2plY3QuZ2l0LworLS0tLS0tLS0tLS0tCisKK2FzIGxvbmcgYXMgdGhlIHNoYXJlZCByZXBvc2l0b3J5IGRvZXMgbm90IGhhdmUgYW55IGJyYW5jaGVzCitvdGhlciB0aGFuIGBtYXN0ZXJgLgorCitbTk9URV0KKz09PT09PT09PT09PQorQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW9yLCBpZiB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgYW5kIHRoZSBkZXZlbG9wZXIncworcmVwb3NpdG9yeSBib3RoIGhhdmUgYnJhbmNoZXMgbmFtZWQgYG9yaWdpbmAsIHRoZW4gYSBwdXNoIGxpa2UgdGhlIGFib3ZlCithdHRlbXB0cyB0byB1cGRhdGUgdGhlIGBvcmlnaW5gIGJyYW5jaCBpbiB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgZnJvbSB0aGUKK2RldmVsb3BlcidzIGBvcmlnaW5gIGJyYW5jaC4gIFRoZSByZXN1bHRzIG1heSBiZSB1bmV4cGVjdGVkLCBzbyBpdCdzCit1c3VhbGx5IGJlc3QgdG8gcmVtb3ZlIGFueSBicmFuY2ggbmFtZWQgYG9yaWdpbmAgZnJvbSB0aGUgc2hhcmVkCityZXBvc2l0b3J5LgorPT09PT09PT09PT09CisKK0FkdmFuY2VkIFNoYXJlZCBSZXBvc2l0b3J5IE1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBzY3JpcHRzIGNhbGxlZCAiaG9va3MiIHRvIGJlIHJ1biBhdCBjZXJ0YWluCitwb2ludHMuICBZb3UgY2FuIHVzZSB0aGVzZSwgZm9yIGV4YW1wbGUsIHRvIHNlbmQgYWxsIGNvbW1pdHMgdG8gdGhlIHNoYXJlZAorcmVwb3NpdG9yeSB0byBhIG1haWxpbmcgbGlzdC4gIFNlZSBsaW5rOmhvb2tzLnR4dFtIb29rcyB1c2VkIGJ5IGdpdF0uCisKK1lvdSBjYW4gZW5mb3JjZSBmaW5lciBncmFpbmVkIHBlcm1pc3Npb25zIHVzaW5nIHVwZGF0ZSBob29rcy4gIFNlZQorbGluazpob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dFtDb250cm9sbGluZyBhY2Nlc3MgdG8gYnJhbmNoZXMgdXNpbmcKK3VwZGF0ZSBob29rc10uCisKK0NWUyBhbm5vdGF0ZQorLS0tLS0tLS0tLS0tCisKK1NvLCBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcsIGFuZCB5b3UgZG9uJ3Qga25vdyB3aG9tIHRvIGJsYW1lLCBhbmQKK3lvdSdyZSBhbiBleC1DVlMgdXNlciBhbmQgdXNlZCB0byBkbyAiY3ZzIGFubm90YXRlIiB0byBzZWUgd2hvIGNhdXNlZAordGhlIGJyZWFrYWdlLiBZb3UncmUgbG9va2luZyBmb3IgdGhlICJnaXQgYW5ub3RhdGUiLCBhbmQgaXQncyBqdXN0CitjbGFpbWluZyBub3QgdG8gZmluZCBzdWNoIGEgc2NyaXB0LiBZb3UncmUgYW5ub3llZC4KKworWWVzLCB0aGF0J3MgcmlnaHQuICBDb3JlIGdpdCBkb2Vzbid0IGRvICJhbm5vdGF0ZSIsIGFsdGhvdWdoIGl0J3MKK3RlY2huaWNhbGx5IHBvc3NpYmxlLCBhbmQgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBzcGVjaWFsaXplZCBzY3JpcHRzIG91dAordGhlcmUgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgZXF1aXZhbGVudCBpbmZvcm1hdGlvbiAoc2VlIHRoZSBnaXQKK21haWxpbmcgbGlzdCBhcmNoaXZlcyBmb3IgZGV0YWlscykuIAorCitnaXQgaGFzIGEgY291cGxlIG9mIGFsdGVybmF0aXZlcywgdGhvdWdoLCB0aGF0IHlvdSBtYXkgZmluZCBzdWZmaWNpZW50CitvciBldmVuIHN1cGVyaW9yIGRlcGVuZGluZyBvbiB5b3VyIHVzZS4gIE9uZSBpcyBjYWxsZWQgImdpdC13aGF0Y2hhbmdlZCIKKyhmb3Igb2J2aW91cyByZWFzb25zKSBhbmQgdGhlIG90aGVyIG9uZSBpcyBjYWxsZWQgInBpY2theGUiICgiYSB0b29sIGZvcgordGhlIHNvZnR3YXJlIGFyY2hhZW9sb2dpc3QiKS4gCisKK1RoZSAiZ2l0LXdoYXRjaGFuZ2VkIiBzY3JpcHQgaXMgYSB0cnVseSB0cml2aWFsIHNjcmlwdCB0aGF0IGNhbiBnaXZlIHlvdQorYSBnb29kIG92ZXJ2aWV3IG9mIHdoYXQgaGFzIGNoYW5nZWQgaW4gYSBmaWxlIG9yIGEgZGlyZWN0b3J5IChvciBhbgorYXJiaXRyYXJ5IGxpc3Qgb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMpLiAgVGhlICJwaWNrYXhlIiBzdXBwb3J0IGlzIGFuCithZGRpdGlvbmFsIGxheWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZnVydGhlciBzcGVjaWZ5IGV4YWN0bHkgd2hhdCB5b3UncmUKK2xvb2tpbmcgZm9yLCBpZiB5b3UgYWxyZWFkeSBrbm93IHRoZSBzcGVjaWZpYyBhcmVhIHRoYXQgY2hhbmdlZC4KKworTGV0J3Mgc3RlcCBiYWNrIGEgYml0IGFuZCB0aGluayBhYm91dCB0aGUgcmVhc29uIHdoeSB5b3Ugd291bGQKK3dhbnQgdG8gZG8gImN2cyBhbm5vdGF0ZSBhLWZpbGUuYyIgdG8gYmVnaW4gd2l0aC4KKworWW91IHdvdWxkIHVzZSAiY3ZzIGFubm90YXRlIiBvbiBhIGZpbGUgd2hlbiB5b3UgaGF2ZSB0cm91YmxlCit3aXRoIGEgZnVuY3Rpb24gKG9yIGV2ZW4gYSBzaW5nbGUgImlmIiBzdGF0ZW1lbnQgaW4gYSBmdW5jdGlvbikKK3RoYXQgaGFwcGVucyB0byBiZSBkZWZpbmVkIGluIHRoZSBmaWxlLCB3aGljaCBkb2VzIG5vdCBkbyB3aGF0Cit5b3Ugd2FudCBpdCB0byBkby4gIEFuZCB5b3Ugd291bGQgd2FudCB0byBmaW5kIG91dCB3aHkgaXQgd2FzCit3cml0dGVuIHRoYXQgd2F5LCBiZWNhdXNlIHlvdSBhcmUgYWJvdXQgdG8gbW9kaWZ5IGl0IHRvIHN1aXQKK3lvdXIgbmVlZHMsIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHlvdSBkbyBub3Qgd2FudCB0byBicmVhayBpdHMKK2N1cnJlbnQgY2FsbGVycy4gIEZvciB0aGF0LCB5b3UgYXJlIHRyeWluZyB0byBmaW5kIG91dCB3aHkgdGhlCitvcmlnaW5hbCBhdXRob3IgZGlkIHRoaW5ncyB0aGF0IHdheSBpbiB0aGUgb3JpZ2luYWwgY29udGV4dC4KKworTWFueSB0aW1lcywgaXQgbWF5IGJlIGVub3VnaCB0byBzZWUgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZXMgb2YKK2NvbW1pdHMgdGhhdCB0b3VjaCB0aGUgZmlsZSBpbiBxdWVzdGlvbiwgcG9zc2libHkgYWxvbmcgd2l0aCB0aGUKK3BhdGNoZXMgdGhlbXNlbHZlcywgbGlrZSB0aGlzOgorCisJJCBnaXQtd2hhdGNoYW5nZWQgLXAgYS1maWxlLmMKKworVGhpcyB3aWxsIHNob3cgbG9nIG1lc3NhZ2VzIGFuZCBwYXRjaGVzIGZvciBlYWNoIGNvbW1pdCB0aGF0Cit0b3VjaGVzIGEtZmlsZS4KKworVGhpcywgaG93ZXZlciwgbWF5IG5vdCBiZSB2ZXJ5IHVzZWZ1bCB3aGVuIHRoaXMgZmlsZSBoYXMgbWFueQorbW9kaWZpY2F0aW9ucyB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byB0aGUgcGllY2Ugb2YgY29kZSB5b3UgYXJlCitpbnRlcmVzdGVkIGluLiAgWW91IHdvdWxkIHNlZSBtYW55IGxvZyBtZXNzYWdlcyBhbmQgcGF0Y2hlcyB0aGF0CitkbyBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSBwaWVjZSBvZiBjb2RlIHlvdSBhcmUKK2ludGVyZXN0ZWQgaW4uICBBcyBhbiBleGFtcGxlLCBhc3N1bWluZyB0aGF0IHlvdSBoYXZlIHRoaXMgcGllY2UKK29mIGNvZGUgdGhhdCB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaW4gdGhlIEhFQUQgdmVyc2lvbjoKKworCWlmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9CisKK3lvdSB3b3VsZCB1c2UgZ2l0LXJldi1saXN0IGFuZCBnaXQtZGlmZi10cmVlIGxpa2UgdGhpczoKKworCSQgZ2l0LXJldi1saXN0IEhFQUQgfAorCSAgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC12IC1wIC1TJ2lmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9JworCitXZSBoYXZlIGFscmVhZHkgdGFsa2VkIGFib3V0IHRoZSAiXC0tc3RkaW4iIGZvcm0gb2YgZ2l0LWRpZmYtdHJlZQorY29tbWFuZCB0aGF0IHJlYWRzIHRoZSBsaXN0IG9mIGNvbW1pdHMgYW5kIGNvbXBhcmVzIGVhY2ggY29tbWl0Cit3aXRoIGl0cyBwYXJlbnRzIChvdGhlcndpc2UgeW91IHNob3VsZCBnbyBiYWNrIGFuZCByZWFkIHRoZSB0dXRvcmlhbCkuCitUaGUgZ2l0LXdoYXRjaGFuZ2VkIGNvbW1hbmQgaW50ZXJuYWxseSBydW5zCit0aGUgZXF1aXZhbGVudCBvZiB0aGUgYWJvdmUgY29tbWFuZCwgYW5kIGNhbiBiZSB1c2VkIGxpa2UgdGhpczoKKworCSQgZ2l0LXdoYXRjaGFuZ2VkIC1wIC1TJ2lmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9JworCitXaGVuIHRoZSAtUyBvcHRpb24gaXMgdXNlZCwgZ2l0LWRpZmYtdHJlZSBjb21tYW5kIG91dHB1dHMKK2RpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNvbW1pdHMgb25seSBpZiBvbmUgdHJlZSBoYXMgdGhlCitzcGVjaWZpZWQgc3RyaW5nIGluIGEgZmlsZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBpbiB0aGUKK290aGVyIHRyZWUgZG9lcyBub3QuICBUaGUgYWJvdmUgZXhhbXBsZSBsb29rcyBmb3IgYSBjb21taXQgdGhhdAoraGFzIHRoZSAiaWYiIHN0YXRlbWVudCBpbiBpdCBpbiBhIGZpbGUsIGJ1dCBpdHMgcGFyZW50IGNvbW1pdAorZG9lcyBub3QgaGF2ZSBpdCBpbiB0aGUgc2FtZSBzaGFwZSBpbiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIChvcgordGhlIG90aGVyIHdheSBhcm91bmQsIHdoZXJlIHRoZSBwYXJlbnQgaGFzIGl0IGFuZCB0aGUgY29tbWl0Citkb2VzIG5vdCksIGFuZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVtIGFyZSBzaG93biwgYWxvbmcKK3dpdGggdGhlIGNvbW1pdCBtZXNzYWdlICh0aGFua3MgdG8gdGhlIC12IGZsYWcpLiAgSXQgZG9lcyBub3QKK3Nob3cgYW55dGhpbmcgZm9yIGNvbW1pdHMgdGhhdCBkbyBub3QgdG91Y2ggdGhpcyAiaWYiIHN0YXRlbWVudC4KKworQWxzbywgaW4gdGhlIG9yaWdpbmFsIGNvbnRleHQsIHRoZSBzYW1lIHN0YXRlbWVudCBtaWdodCBoYXZlCithcHBlYXJlZCBhdCBmaXJzdCBpbiBhIGRpZmZlcmVudCBmaWxlIGFuZCBsYXRlciB0aGUgZmlsZSB3YXMKK3JlbmFtZWQgdG8gImEtZmlsZS5jIi4gIENWUyBhbm5vdGF0ZSB3b3VsZCBub3QgaGVscCB5b3UgdG8gZ28KK2JhY2sgYWNyb3NzIHN1Y2ggYSByZW5hbWUsIGJ1dCBnaXQgd291bGQgc3RpbGwgaGVscCB5b3UgaW4gc3VjaAorYSBzaXR1YXRpb24uICBGb3IgdGhhdCwgeW91IGNhbiBnaXZlIHRoZSAtQyBmbGFnIHRvCitnaXQtZGlmZi10cmVlLCBsaWtlIHRoaXM6CisKKwkkIGdpdC13aGF0Y2hhbmdlZCAtcCAtQyAtUydpZiAoZnJvdHopIHsKKwkJbml0Zm9sKCk7CisJfScKKworV2hlbiB0aGUgLUMgZmxhZyBpcyB1c2VkLCBmaWxlIHJlbmFtZXMgYW5kIGNvcGllcyBhcmUgZm9sbG93ZWQuCitTbyBpZiB0aGUgImlmIiBzdGF0ZW1lbnQgaW4gcXVlc3Rpb24gaGFwcGVucyB0byBiZSBpbiAiYS1maWxlLmMiCitpbiB0aGUgY3VycmVudCBIRUFEIGNvbW1pdCwgZXZlbiBpZiB0aGUgZmlsZSB3YXMgb3JpZ2luYWxseQorY2FsbGVkICJvLWZpbGUuYyIgYW5kIHRoZW4gcmVuYW1lZCBpbiBhbiBlYXJsaWVyIGNvbW1pdCwgb3IgaWYKK3RoZSBmaWxlIHdhcyBjcmVhdGVkIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgIm8tZmlsZS5jIiBpbiBhbgorZWFybGllciBjb21taXQsIHlvdSB3aWxsIG5vdCBsb3NlIHRyYWNrLiAgSWYgdGhlICJpZiIgc3RhdGVtZW50CitkaWQgbm90IGNoYW5nZSBhY3Jvc3Mgc3VjaCBhIHJlbmFtZSBvciBjb3B5LCB0aGVuIHRoZSBjb21taXQgdGhhdAorZG9lcyByZW5hbWUgb3IgY29weSB3b3VsZCBub3Qgc2hvdyBpbiB0aGUgb3V0cHV0LCBhbmQgaWYgdGhlCisiaWYiIHN0YXRlbWVudCB3YXMgbW9kaWZpZWQgd2hpbGUgdGhlIGZpbGUgd2FzIHN0aWxsIGNhbGxlZAorIm8tZmlsZS5jIiwgaXQgd291bGQgZmluZCB0aGUgY29tbWl0IHRoYXQgY2hhbmdlZCB0aGUgc3RhdGVtZW50Cit3aGVuIGl0IHdhcyBpbiAiby1maWxlLmMiLgorCitOT1RFOiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mICJnaXQtZGlmZi10cmVlIC1DIiBpcyBub3QgZWFnZXIKKyAgZW5vdWdoIHRvIGZpbmQgY29waWVzLCBhbmQgaXQgd2lsbCBtaXNzIHRoZSBmYWN0IHRoYXQgYS1maWxlLmMKKyAgd2FzIGNyZWF0ZWQgYnkgY29weWluZyBvLWZpbGUuYyB1bmxlc3Mgby1maWxlLmMgd2FzIHNvbWVob3cKKyAgY2hhbmdlZCBpbiB0aGUgc2FtZSBjb21taXQuCisKK1lvdSBjYW4gdXNlIHRoZSAtLXBpY2theGUtYWxsIGZsYWcgaW4gYWRkaXRpb24gdG8gdGhlIC1TIGZsYWcuCitUaGlzIGNhdXNlcyB0aGUgZGlmZmVyZW5jZXMgZnJvbSBhbGwgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbgordGhvc2UgdHdvIGNvbW1pdHMsIG5vdCBqdXN0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBmaWxlcwordGhhdCBjb250YWluIHRoaXMgY2hhbmdlZCAiaWYiIHN0YXRlbWVudDoKKworCSQgZ2l0LXdoYXRjaGFuZ2VkIC1wIC1DIC1TJ2lmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9JyAtLXBpY2theGUtYWxsCisKK05PVEU6IFRoaXMgb3B0aW9uIGlzIGNhbGxlZCAiLS1waWNrYXhlLWFsbCIgYmVjYXVzZSAtUworICBvcHRpb24gaXMgaW50ZXJuYWxseSBjYWxsZWQgInBpY2theGUiLCBhIHRvb2wgZm9yIHNvZnR3YXJlCisgIGFyY2hhZW9sb2dpc3RzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kaWZmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdkOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kaWZmLWZvcm1hdC50eHQKQEAgLTAsMCArMSwxOTcgQEAKK1RoZSBvdXRwdXQgZm9ybWF0IGZyb20gImdpdC1kaWZmLWluZGV4IiwgImdpdC1kaWZmLXRyZWUiIGFuZAorImdpdC1kaWZmLWZpbGVzIiBhcmUgdmVyeSBzaW1pbGFyLgorCitUaGVzZSBjb21tYW5kcyBhbGwgY29tcGFyZSB0d28gc2V0cyBvZiB0aGluZ3M7IHdoYXQgaXMgCitjb21wYXJlZCBkaWZmZXJzOgorCitnaXQtZGlmZi1pbmRleCA8dHJlZS1pc2g+OjoKKyAgICAgICAgY29tcGFyZXMgdGhlIDx0cmVlLWlzaD4gYW5kIHRoZSBmaWxlcyBvbiB0aGUgZmlsZXN5c3RlbS4KKworZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgPHRyZWUtaXNoPjo6CisgICAgICAgIGNvbXBhcmVzIHRoZSA8dHJlZS1pc2g+IGFuZCB0aGUgaW5kZXguCisKK2dpdC1kaWZmLXRyZWUgWy1yXSA8dHJlZS1pc2gtMT4gPHRyZWUtaXNoLTI+IFs8cGF0dGVybj4uLi5dOjoKKyAgICAgICAgY29tcGFyZXMgdGhlIHRyZWVzIG5hbWVkIGJ5IHRoZSB0d28gYXJndW1lbnRzLgorCitnaXQtZGlmZi1maWxlcyBbPHBhdHRlcm4+Li4uXTo6CisgICAgICAgIGNvbXBhcmVzIHRoZSBpbmRleCBhbmQgdGhlIGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtLgorCisKK0FuIG91dHB1dCBsaW5lIGlzIGZvcm1hdHRlZCB0aGlzIHdheToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbi1wbGFjZSBlZGl0ICA6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBmaWxlMAorY29weS1lZGl0ICAgICAgOjEwMDY0NCAxMDA2NDQgYWJjZDEyMy4uLiAxMjM0NTY3Li4uIEM2OCBmaWxlMSBmaWxlMgorcmVuYW1lLWVkaXQgICAgOjEwMDY0NCAxMDA2NDQgYWJjZDEyMy4uLiAxMjM0NTY3Li4uIFI4NiBmaWxlMSBmaWxlMworY3JlYXRlICAgICAgICAgOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAxMjM0NTY3Li4uIEEgZmlsZTQKK2RlbGV0ZSAgICAgICAgIDoxMDA2NDQgMDAwMDAwIDEyMzQ1NjcuLi4gMDAwMDAwMC4uLiBEIGZpbGU1Cit1bm1lcmdlZCAgICAgICA6MDAwMDAwIDAwMDAwMCAwMDAwMDAwLi4uIDAwMDAwMDAuLi4gVSBmaWxlNgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoYXQgaXMsIGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0OgorCisuIGEgY29sb24uCisuIG1vZGUgZm9yICJzcmMiOyAwMDAwMDAgaWYgY3JlYXRpb24gb3IgdW5tZXJnZWQuCisuIGEgc3BhY2UuCisuIG1vZGUgZm9yICJkc3QiOyAwMDAwMDAgaWYgZGVsZXRpb24gb3IgdW5tZXJnZWQuCisuIGEgc3BhY2UuCisuIHNoYTEgZm9yICJzcmMiOyAwXHs0MFx9IGlmIGNyZWF0aW9uIG9yIHVubWVyZ2VkLgorLiBhIHNwYWNlLgorLiBzaGExIGZvciAiZHN0IjsgMFx7NDBcfSBpZiBjcmVhdGlvbiwgdW5tZXJnZWQgb3IgImxvb2sgYXQgd29yayB0cmVlIi4KKy4gYSBzcGFjZS4KKy4gc3RhdHVzLCBmb2xsb3dlZCBieSBvcHRpb25hbCAic2NvcmUiIG51bWJlci4KKy4gYSB0YWIgb3IgYSBOVUwgd2hlbiAnLXonIG9wdGlvbiBpcyB1c2VkLgorLiBwYXRoIGZvciAic3JjIgorLiBhIHRhYiBvciBhIE5VTCB3aGVuICcteicgb3B0aW9uIGlzIHVzZWQ7IG9ubHkgZXhpc3RzIGZvciBDIG9yIFIuCisuIHBhdGggZm9yICJkc3QiOyBvbmx5IGV4aXN0cyBmb3IgQyBvciBSLgorLiBhbiBMRiBvciBhIE5VTCB3aGVuICcteicgb3B0aW9uIGlzIHVzZWQsIHRvIHRlcm1pbmF0ZSB0aGUgcmVjb3JkLgorCis8c2hhMT4gaXMgc2hvd24gYXMgYWxsIDAncyBpZiBhIGZpbGUgaXMgbmV3IG9uIHRoZSBmaWxlc3lzdGVtCithbmQgaXQgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgaW5kZXguCisKK0V4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgNWJlNGE0Li4uLi4uIDAwMDAwMC4uLi4uLiBNIGZpbGUuYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwKK3Jlc3BlY3RpdmVseS4KKworCitHZW5lcmF0aW5nIHBhdGNoZXMgd2l0aCAtcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiAiZ2l0LWRpZmYtaW5kZXgiLCAiZ2l0LWRpZmYtdHJlZSIsIG9yICJnaXQtZGlmZi1maWxlcyIgYXJlIHJ1bgord2l0aCBhICctcCcgb3B0aW9uLCB0aGV5IGRvIG5vdCBwcm9kdWNlIHRoZSBvdXRwdXQgZGVzY3JpYmVkIGFib3ZlOworaW5zdGVhZCB0aGV5IHByb2R1Y2UgYSBwYXRjaCBmaWxlLgorCitUaGUgcGF0Y2ggZ2VuZXJhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBhdCB0d28gbGV2ZWxzLgorCisxLiBXaGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIG5vdCBzZXQsCisgICB0aGVzZSBjb21tYW5kcyBpbnRlcm5hbGx5IGludm9rZSAiZGlmZiIgbGlrZSB0aGlzOgorCisgICAgICBkaWZmIC1MIGEvPHBhdGg+IC1MIGIvPHBhdGg+IC1wdSA8b2xkPiA8bmV3PgorKworRm9yIGFkZGVkIGZpbGVzLCBgL2Rldi9udWxsYCBpcyB1c2VkIGZvciA8b2xkPi4gIEZvciByZW1vdmVkCitmaWxlcywgYC9kZXYvbnVsbGAgaXMgdXNlZCBmb3IgPG5ldz4KKysKK1RoZSAiZGlmZiIgZm9ybWF0dGluZyBvcHRpb25zIGNhbiBiZSBjdXN0b21pemVkIHZpYSB0aGUKK2Vudmlyb25tZW50IHZhcmlhYmxlICdHSVRfRElGRl9PUFRTJy4gIEZvciBleGFtcGxlLCBpZiB5b3UKK3ByZWZlciBjb250ZXh0IGRpZmY6CisKKyAgICAgIEdJVF9ESUZGX09QVFM9LWMgZ2l0LWRpZmYtaW5kZXggLXAgSEVBRAorCisKKzIuIFdoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdHSVRfRVhURVJOQUxfRElGRicgaXMgc2V0LCB0aGUKKyAgIHByb2dyYW0gbmFtZWQgYnkgaXQgaXMgY2FsbGVkLCBpbnN0ZWFkIG9mIHRoZSBkaWZmIGludm9jYXRpb24KKyAgIGRlc2NyaWJlZCBhYm92ZS4KKysKK0ZvciBhIHBhdGggdGhhdCBpcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQsCisnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIGNhbGxlZCB3aXRoIDcgcGFyYW1ldGVyczoKKworICAgICBwYXRoIG9sZC1maWxlIG9sZC1oZXggb2xkLW1vZGUgbmV3LWZpbGUgbmV3LWhleCBuZXctbW9kZQorKword2hlcmU6CisKKyAgICAgPG9sZHxuZXc+LWZpbGU6OiBhcmUgZmlsZXMgR0lUX0VYVEVSTkFMX0RJRkYgY2FuIHVzZSB0byByZWFkIHRoZQorCQkgICAgICBjb250ZW50cyBvZiA8b2xkfG5ldz4sCisgICAgIDxvbGR8bmV3Pi1oZXg6OiBhcmUgdGhlIDQwLWhleGRpZ2l0IFNIQTEgaGFzaGVzLAorICAgICA8b2xkfG5ldz4tbW9kZTo6IGFyZSB0aGUgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpbGUgbW9kZXMuCisKKysgCitUaGUgZmlsZSBwYXJhbWV0ZXJzIGNhbiBwb2ludCBhdCB0aGUgdXNlcidzIHdvcmtpbmcgZmlsZQorKGUuZy4gYG5ldy1maWxlYCBpbiAiZ2l0LWRpZmYtZmlsZXMiKSwgYC9kZXYvbnVsbGAgKGUuZy4gYG9sZC1maWxlYAord2hlbiBhIG5ldyBmaWxlIGlzIGFkZGVkKSwgb3IgYSB0ZW1wb3JhcnkgZmlsZSAoZS5nLiBgb2xkLWZpbGVgIGluIHRoZQoraW5kZXgpLiAgJ0dJVF9FWFRFUk5BTF9ESUZGJyBzaG91bGQgbm90IHdvcnJ5IGFib3V0IHVubGlua2luZyB0aGUKK3RlbXBvcmFyeSBmaWxlIC0tLSBpdCBpcyByZW1vdmVkIHdoZW4gJ0dJVF9FWFRFUk5BTF9ESUZGJyBleGl0cy4KKworRm9yIGEgcGF0aCB0aGF0IGlzIHVubWVyZ2VkLCAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIGNhbGxlZCB3aXRoIDEKK3BhcmFtZXRlciwgPHBhdGg+LgorCisKK2dpdCBzcGVjaWZpYyBleHRlbnNpb24gdG8gZGlmZiBmb3JtYXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdCAtcCBvcHRpb24gcHJvZHVjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlCit0cmFkaXRpb25hbCBkaWZmIGZvcm1hdC4KKworMS4gICBJdCBpcyBwcmVjZWRlZCB3aXRoIGEgImdpdCBkaWZmIiBoZWFkZXIsIHRoYXQgbG9va3MgbGlrZQorICAgICB0aGlzOgorCisgICAgIGRpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUyCisrCitUaGUgYGEvYCBhbmQgYGIvYCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lIHVubGVzcyByZW5hbWUvY29weSBpcworaW52b2x2ZWQuICBFc3BlY2lhbGx5LCBldmVuIGZvciBhIGNyZWF0aW9uIG9yIGEgZGVsZXRpb24sCitgL2Rldi9udWxsYCBpcyBfbm90XyB1c2VkIGluIHBsYWNlIG9mIGBhL2Agb3IgYGIvYCBmaWxlbmFtZXMuCisrCitXaGVuIHJlbmFtZS9jb3B5IGlzIGludm9sdmVkLCBgZmlsZTFgIGFuZCBgZmlsZTJgIHNob3cgdGhlCituYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBvZiB0aGUgcmVuYW1lL2NvcHkgYW5kIHRoZSBuYW1lIG9mCit0aGUgZmlsZSB0aGF0IHJlbmFtZS9jb3B5IHByb2R1Y2VzLCByZXNwZWN0aXZlbHkuCisKKzIuICAgSXQgaXMgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZXh0ZW5kZWQgaGVhZGVyIGxpbmVzOgorCisgICAgICAgb2xkIG1vZGUgPG1vZGU+CisgICAgICAgbmV3IG1vZGUgPG1vZGU+CisgICAgICAgZGVsZXRlZCBmaWxlIG1vZGUgPG1vZGU+CisgICAgICAgbmV3IGZpbGUgbW9kZSA8bW9kZT4KKyAgICAgICBjb3B5IGZyb20gPHBhdGg+CisgICAgICAgY29weSB0byA8cGF0aD4KKyAgICAgICByZW5hbWUgZnJvbSA8cGF0aD4KKyAgICAgICByZW5hbWUgdG8gPHBhdGg+CisgICAgICAgc2ltaWxhcml0eSBpbmRleCA8bnVtYmVyPgorICAgICAgIGRpc3NpbWlsYXJpdHkgaW5kZXggPG51bWJlcj4KKyAgICAgICBpbmRleCA8aGFzaD4uLjxoYXNoPiA8bW9kZT4KKworMy4gIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycyBpbiBwYXRobmFtZXMgYXJlCisgICAgcmVwcmVzZW50ZWQgYXMgYFx0YCwgYFxuYCwgYW5kIGBcXGAsIHJlc3BlY3RpdmVseS4KKworCitjb21iaW5lZCBkaWZmIGZvcm1hdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0LWRpZmYtdHJlZSBhbmQgZ2l0LWRpZmYtZmlsZXMgY2FuIHRha2UgJy1jJyBvciAnLS1jYycgb3B0aW9uCit0byBwcm9kdWNlICdjb21iaW5lZCBkaWZmJywgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KK2RpZmYgLS1jb21iaW5lZCBkZXNjcmliZS5jCitAQEAgKzk4LDcgQEBACisgICByZXR1cm4gKGFfZGF0ZSA+IGJfZGF0ZSkgPyAtMSA6IChhX2RhdGUgPT0gYl9kYXRlKSA/IDAgOiAxOworICB9CisKKy0gc3RhdGljIHZvaWQgZGVzY3JpYmUoY2hhciAqYXJnKQorIC1zdGF0aWMgdm9pZCBkZXNjcmliZShzdHJ1Y3QgY29tbWl0ICpjbWl0LCBpbnQgbGFzdF9vbmUpCisrK3N0YXRpYyB2b2lkIGRlc2NyaWJlKGNoYXIgKmFyZywgaW50IGxhc3Rfb25lKQorICB7CisgKyAgICAgdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKyArICAgICBzdHJ1Y3QgY29tbWl0ICpjbWl0OworLS0tLS0tLS0tLS0tCisKK1VubGlrZSB0aGUgdHJhZGl0aW9uYWwgJ3VuaWZpZWQnIGRpZmYgZm9ybWF0LCB3aGljaCBzaG93cyB0d28KK2ZpbGVzIEEgYW5kIEIgd2l0aCBhIHNpbmdsZSBjb2x1bW4gdGhhdCBoYXMgYC1gIChtaW51cyAtLQorYXBwZWFycyBpbiBBIGJ1dCByZW1vdmVkIGluIEIpLCBgK2AgKHBsdXMgLS0gbWlzc2luZyBpbiBBIGJ1dAorYWRkZWQgdG8gQiksIG9yIGAgYCAoc3BhY2UgLS0gdW5jaGFuZ2VkKSBwcmVmaXgsIHRoaXMgZm9ybWF0Citjb21wYXJlcyB0d28gb3IgbW9yZSBmaWxlcyBmaWxlMSwgZmlsZTIsLi4uIHdpdGggb25lIGZpbGUgWCwgYW5kCitzaG93cyBob3cgWCBkaWZmZXJzIGZyb20gZWFjaCBvZiBmaWxlTi4gIE9uZSBjb2x1bW4gZm9yIGVhY2ggb2YKK2ZpbGVOIGlzIHByZXBlbmRlZCB0byB0aGUgb3V0cHV0IGxpbmUgdG8gbm90ZSBob3cgWCdzIGxpbmUgaXMKK2RpZmZlcmVudCBmcm9tIGl0LgorCitBIGAtYCBjaGFyYWN0ZXIgaW4gdGhlIGNvbHVtbiBOIG1lYW5zIHRoYXQgdGhlIGxpbmUgYXBwZWFycyBpbgorZmlsZU4gYnV0IGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgbGFzdCBmaWxlLiAgQSBgK2AgY2hhcmFjdGVyCitpbiB0aGUgY29sdW1uIE4gbWVhbnMgdGhhdCB0aGUgbGluZSBhcHBlYXJzIGluIHRoZSBsYXN0IGZpbGUsCithbmQgZmlsZU4gZG9lcyBub3QgaGF2ZSB0aGF0IGxpbmUuCisKK0luIHRoZSBhYm92ZSBleGFtcGxlIG91dHB1dCwgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB3YXMgY2hhbmdlZAorZnJvbSBib3RoIGZpbGVzIChoZW5jZSB0d28gYC1gIHJlbW92YWxzIGZyb20gYm90aCBmaWxlMSBhbmQKK2ZpbGUyLCBwbHVzIGArK2AgdG8gbWVhbiBvbmUgbGluZSB0aGF0IHdhcyBhZGRlZCBkb2VzIG5vdCBhcHBlYXIKK2luIGVpdGhlciBmaWxlMSBub3IgZmlsZTIpLiAgQWxzbyB0d28gb3RoZXIgbGluZXMgYXJlIHRoZSBzYW1lCitmcm9tIGZpbGUxIGJ1dCBkbyBub3QgYXBwZWFyIGluIGZpbGUyIChoZW5jZSBwcmVmaXhlZCB3aXRoIGAgK2ApLgorCitXaGVuIHNob3duIGJ5IGBnaXQgZGlmZi10cmVlIC1jYCwgaXQgY29tcGFyZXMgdGhlIHBhcmVudHMgb2YgYQorbWVyZ2UgY29tbWl0IHdpdGggdGhlIG1lcmdlIHJlc3VsdCAoaS5lLiBmaWxlMS4uZmlsZU4gYXJlIHRoZQorcGFyZW50cykuICBXaGVuIHNob3duIGJ5IGBnaXQgZGlmZi1maWxlcyAtY2AsIGl0IGNvbXBhcmVzIHRoZQordHdvIHVucmVzb2x2ZWQgbWVyZ2UgcGFyZW50cyB3aXRoIHRoZSB3b3JraW5nIHRyZWUgZmlsZQorKGkuZS4gZmlsZTEgaXMgc3RhZ2UgMiBha2EgIm91ciB2ZXJzaW9uIiwgZmlsZTIgaXMgc3RhZ2UgMyBha2EKKyJ0aGVpciB2ZXJzaW9uIikuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGlmZi1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vZGlmZi1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTIzZWMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kaWZmLW9wdGlvbnMudHh0CkBAIC0wLDAgKzEsOTggQEAKKy1wOjoKKwlHZW5lcmF0ZSBwYXRjaCAoc2VlIHNlY3Rpb24gb24gZ2VuZXJhdGluZyBwYXRjaGVzKQorCistdTo6CisJU3lub255bSBmb3IgIi1wIi4KKworLS1wYXRjaC13aXRoLXJhdzo6CisJR2VuZXJhdGUgcGF0Y2ggYnV0IGtlZXAgYWxzbyB0aGUgZGVmYXVsdCByYXcgZGlmZiBvdXRwdXQuCisKKy0tc3RhdDo6CisJR2VuZXJhdGUgYSBkaWZmc3RhdCBpbnN0ZWFkIG9mIGEgcGF0Y2guCisKKy0tc3VtbWFyeTo6CisJT3V0cHV0IGEgY29uZGVuc2VkIHN1bW1hcnkgb2YgZXh0ZW5kZWQgaGVhZGVyIGluZm9ybWF0aW9uCisJc3VjaCBhcyBjcmVhdGlvbnMsIHJlbmFtZXMgYW5kIG1vZGUgY2hhbmdlcy4KKworLS1wYXRjaC13aXRoLXN0YXQ6OgorCUdlbmVyYXRlIHBhdGNoIGFuZCBwcmVwZW5kIGl0cyBkaWZmc3RhdC4KKworLXo6OgorCVwwIGxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0CisKKy0tbmFtZS1vbmx5OjoKKwlTaG93IG9ubHkgbmFtZXMgb2YgY2hhbmdlZCBmaWxlcy4KKworLS1uYW1lLXN0YXR1czo6CisJU2hvdyBvbmx5IG5hbWVzIGFuZCBzdGF0dXMgb2YgY2hhbmdlZCBmaWxlcy4KKworLS1mdWxsLWluZGV4OjoKKwlJbnN0ZWFkIG9mIHRoZSBmaXJzdCBoYW5kZnVsIGNoYXJhY3RlcnMsIHNob3cgZnVsbAorCW9iamVjdCBuYW1lIG9mIHByZS0gYW5kIHBvc3QtaW1hZ2UgYmxvYiBvbiB0aGUgImluZGV4IgorCWxpbmUgd2hlbiBnZW5lcmF0aW5nIGEgcGF0Y2ggZm9ybWF0IG91dHB1dC4JCisKKy0tYWJicmV2Wz08bj5dOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZ1bGwgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QKKwluYW1lIGluIGRpZmYtcmF3IGZvcm1hdCBvdXRwdXQgYW5kIGRpZmYtdHJlZSBoZWFkZXIKKwlsaW5lcywgc2hvdyBvbmx5IGhhbmRmdWwgaGV4ZGlnaXRzIHByZWZpeC4gIFRoaXMgaXMKKwlpbmRlcGVuZGVudCBvZiAtLWZ1bGwtaW5kZXggb3B0aW9uIGFib3ZlLCB3aGljaCBjb250cm9scworCXRoZSBkaWZmLXBhdGNoIG91dHB1dCBmb3JtYXQuICBOb24gZGVmYXVsdCBudW1iZXIgb2YKKwlkaWdpdHMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIC0tYWJicmV2PTxuPi4KKworLUI6OgorCUJyZWFrIGNvbXBsZXRlIHJld3JpdGUgY2hhbmdlcyBpbnRvIHBhaXJzIG9mIGRlbGV0ZSBhbmQgY3JlYXRlLgorCistTTo6CisJRGV0ZWN0IHJlbmFtZXMuCisKKy1DOjoKKwlEZXRlY3QgY29waWVzIGFzIHdlbGwgYXMgcmVuYW1lcy4KKworLS1kaWZmLWZpbHRlcj1bQUNETVJUVVhCKl06OgorCVNlbGVjdCBvbmx5IGZpbGVzIHRoYXQgYXJlIEFkZGVkIChgQWApLCBDb3BpZWQgKGBDYCksCisJRGVsZXRlZCAoYERgKSwgTW9kaWZpZWQgKGBNYCksIFJlbmFtZWQgKGBSYCksIGhhdmUgdGhlaXIKKwl0eXBlIChtb2RlKSBjaGFuZ2VkIChgVGApLCBhcmUgVW5tZXJnZWQgKGBVYCksIGFyZQorCVVua25vd24gKGBYYCksIG9yIGhhdmUgaGFkIHRoZWlyIHBhaXJpbmcgQnJva2VuIChgQmApLgorCUFueSBjb21iaW5hdGlvbiBvZiB0aGUgZmlsdGVyIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQuCisJV2hlbiBgKmAgKEFsbC1vci1ub25lKSBpcyBhZGRlZCB0byB0aGUgY29tYmluYXRpb24sIGFsbAorCXBhdGhzIGFyZSBzZWxlY3RlZCBpZiB0aGVyZSBpcyBhbnkgZmlsZSB0aGF0IG1hdGNoZXMKKwlvdGhlciBjcml0ZXJpYSBpbiB0aGUgY29tcGFyaXNvbjsgaWYgdGhlcmUgaXMgbm8gZmlsZQorCXRoYXQgbWF0Y2hlcyBvdGhlciBjcml0ZXJpYSwgbm90aGluZyBpcyBzZWxlY3RlZC4KKworLS1maW5kLWNvcGllcy1oYXJkZXI6OgorCUZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBieSBkZWZhdWx0LCAtQyBvcHRpb24gZmluZHMgY29waWVzIG9ubHkgCisJaWYgdGhlIG9yaWdpbmFsIGZpbGUgb2YgdGhlIGNvcHkgd2FzIG1vZGlmaWVkIGluIHRoZSBzYW1lIAorCWNoYW5nZXNldC4gIFRoaXMgZmxhZyBtYWtlcyB0aGUgY29tbWFuZAorCWluc3BlY3QgdW5tb2RpZmllZCBmaWxlcyBhcyBjYW5kaWRhdGVzIGZvciB0aGUgc291cmNlIG9mCisJY29weS4gIFRoaXMgaXMgYSB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gZm9yIGxhcmdlCisJcHJvamVjdHMsIHNvIHVzZSBpdCB3aXRoIGNhdXRpb24uCisKKy1sPG51bT46OgorCS1NIGFuZCAtQyBvcHRpb25zIHJlcXVpcmUgTyhuXjIpIHByb2Nlc3NpbmcgdGltZSB3aGVyZSBuCisJaXMgdGhlIG51bWJlciBvZiBwb3RlbnRpYWwgcmVuYW1lL2NvcHkgdGFyZ2V0cy4gIFRoaXMKKwlvcHRpb24gcHJldmVudHMgcmVuYW1lL2NvcHkgZGV0ZWN0aW9uIGZyb20gcnVubmluZyBpZgorCXRoZSBudW1iZXIgb2YgcmVuYW1lL2NvcHkgdGFyZ2V0cyBleGNlZWRzIHRoZSBzcGVjaWZpZWQKKwludW1iZXIuCisKKy1TPHN0cmluZz46OgorCUxvb2sgZm9yIGRpZmZlcmVuY2VzIHRoYXQgY29udGFpbiB0aGUgY2hhbmdlIGluIDxzdHJpbmc+LgorCistLXBpY2theGUtYWxsOjoKKwlXaGVuIC1TIGZpbmRzIGEgY2hhbmdlLCBzaG93IGFsbCB0aGUgY2hhbmdlcyBpbiB0aGF0CisJY2hhbmdlc2V0LCBub3QganVzdCB0aGUgZmlsZXMgdGhhdCBjb250YWluIHRoZSBjaGFuZ2UKKwlpbiA8c3RyaW5nPi4KKworLS1waWNrYXhlLXJlZ2V4OjoKKwlNYWtlIHRoZSA8c3RyaW5nPiBub3QgYSBwbGFpbiBzdHJpbmcgYnV0IGFuIGV4dGVuZGVkIFBPU0lYCisJcmVnZXggdG8gbWF0Y2guCisKKy1PPG9yZGVyZmlsZT46OgorCU91dHB1dCB0aGUgcGF0Y2ggaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBpbiB0aGUKKwk8b3JkZXJmaWxlPiwgd2hpY2ggaGFzIG9uZSBzaGVsbCBnbG9iIHBhdHRlcm4gcGVyIGxpbmUuCisKKy1SOjoKKwlTd2FwIHR3byBpbnB1dHM7IHRoYXQgaXMsIHNob3cgZGlmZmVyZW5jZXMgZnJvbSBpbmRleCBvcgorCW9uLWRpc2sgZmlsZSB0byB0cmVlIGNvbnRlbnRzLgorCitGb3IgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiB0aGVzZSBjb21tb24gb3B0aW9ucywgc2VlIGFsc28KK2xpbms6ZGlmZmNvcmUuaHRtbFtkaWZmY29yZSBkb2N1bWVudGF0aW9uXS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGlmZmNvcmUudHh0IGIvRG9jdW1lbnRhdGlvbi9kaWZmY29yZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0ZTU2MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGlmZmNvcmUudHh0CkBAIC0wLDAgKzEsMjc1IEBACitUd2Vha2luZyBkaWZmIG91dHB1dAorPT09PT09PT09PT09PT09PT09PT0KK0p1bmUgMjAwNQorCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK1RoZSBkaWZmIGNvbW1hbmRzIGdpdC1kaWZmLWluZGV4LCBnaXQtZGlmZi1maWxlcywgZ2l0LWRpZmYtdHJlZSwgYW5kCitnaXQtZGlmZi1zdGFnZXMgY2FuIGJlIHRvbGQgdG8gbWFuaXB1bGF0ZSBkaWZmZXJlbmNlcyB0aGV5IGZpbmQgaW4KK3VuY29udmVudGlvbmFsIHdheXMgYmVmb3JlIHNob3dpbmcgZGlmZigxKSBvdXRwdXQuICBUaGUgbWFuaXB1bGF0aW9uCitpcyBjb2xsZWN0aXZlbHkgY2FsbGVkICJkaWZmY29yZSB0cmFuc2Zvcm1hdGlvbiIuICBUaGlzIHNob3J0IG5vdGUKK2Rlc2NyaWJlcyB3aGF0IHRoZXkgYXJlIGFuZCBob3cgdG8gdXNlIHRoZW0gdG8gcHJvZHVjZSBkaWZmIG91dHB1dHMKK3RoYXQgYXJlIGVhc2llciB0byB1bmRlcnN0YW5kIHRoYW4gdGhlIGNvbnZlbnRpb25hbCBraW5kLgorCisKK1RoZSBjaGFpbiBvZiBvcGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGdpdC1kaWZmLSogZmFtaWx5IHdvcmtzIGJ5IGZpcnN0IGNvbXBhcmluZyB0d28gc2V0cyBvZgorZmlsZXM6CisKKyAtIGdpdC1kaWZmLWluZGV4IGNvbXBhcmVzIGNvbnRlbnRzIG9mIGEgInRyZWUiIG9iamVjdCBhbmQgdGhlCisgICB3b3JraW5nIGRpcmVjdG9yeSAod2hlbiAnXC0tY2FjaGVkJyBmbGFnIGlzIG5vdCB1c2VkKSBvciBhCisgICAidHJlZSIgb2JqZWN0IGFuZCB0aGUgaW5kZXggZmlsZSAod2hlbiAnXC0tY2FjaGVkJyBmbGFnIGlzCisgICB1c2VkKTsKKworIC0gZ2l0LWRpZmYtZmlsZXMgY29tcGFyZXMgY29udGVudHMgb2YgdGhlIGluZGV4IGZpbGUgYW5kIHRoZQorICAgd29ya2luZyBkaXJlY3Rvcnk7CisKKyAtIGdpdC1kaWZmLXRyZWUgY29tcGFyZXMgY29udGVudHMgb2YgdHdvICJ0cmVlIiBvYmplY3RzOworCisgLSBnaXQtZGlmZi1zdGFnZXMgY29tcGFyZXMgY29udGVudHMgb2YgYmxvYnMgYXQgdHdvIHN0YWdlcyBpbiBhbgorICAgdW5tZXJnZWQgaW5kZXggZmlsZS4KKworSW4gYWxsIG9mIHRoZXNlIGNhc2VzLCB0aGUgY29tbWFuZHMgdGhlbXNlbHZlcyBjb21wYXJlCitjb3JyZXNwb25kaW5nIHBhdGhzIGluIHRoZSB0d28gc2V0cyBvZiBmaWxlcy4gIFRoZSByZXN1bHQgb2YKK2NvbXBhcmlzb24gaXMgcGFzc2VkIGZyb20gdGhlc2UgY29tbWFuZHMgdG8gd2hhdCBpcyBpbnRlcm5hbGx5CitjYWxsZWQgImRpZmZjb3JlIiwgaW4gYSBmb3JtYXQgc2ltaWxhciB0byB3aGF0IGlzIG91dHB1dCB3aGVuCit0aGUgLXAgb3B0aW9uIGlzIG5vdCB1c2VkLiAgRS5nLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luLXBsYWNlIGVkaXQgIDoxMDA2NDQgMTAwNjQ0IGJjZDEyMzQuLi4gMDEyMzQ1Ni4uLiBNIGZpbGUwCitjcmVhdGUgICAgICAgICA6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDEyMzQ1NjcuLi4gQSBmaWxlNAorZGVsZXRlICAgICAgICAgOjEwMDY0NCAwMDAwMDAgMTIzNDU2Ny4uLiAwMDAwMDAwLi4uIEQgZmlsZTUKK3VubWVyZ2VkICAgICAgIDowMDAwMDAgMDAwMDAwIDAwMDAwMDAuLi4gMDAwMDAwMC4uLiBVIGZpbGU2CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGRpZmZjb3JlIG1lY2hhbmlzbSBpcyBmZWQgYSBsaXN0IG9mIHN1Y2ggY29tcGFyaXNvbiByZXN1bHRzCisoZWFjaCBvZiB3aGljaCBpcyBjYWxsZWQgImZpbGVwYWlyIiwgYWx0aG91Z2ggYXQgdGhpcyBwb2ludCBlYWNoCitvZiB0aGVtIHRhbGtzIGFib3V0IGEgc2luZ2xlIGZpbGUpLCBhbmQgdHJhbnNmb3JtcyBzdWNoIGEgbGlzdAoraW50byBhbm90aGVyIGxpc3QuICBUaGVyZSBhcmUgY3VycmVudGx5IDYgc3VjaCB0cmFuc2Zvcm1hdGlvbnM6CisKKy0gZGlmZmNvcmUtcGF0aHNwZWMKKy0gZGlmZmNvcmUtYnJlYWsKKy0gZGlmZmNvcmUtcmVuYW1lCistIGRpZmZjb3JlLW1lcmdlLWJyb2tlbgorLSBkaWZmY29yZS1waWNrYXhlCistIGRpZmZjb3JlLW9yZGVyCisKK1RoZXNlIGFyZSBhcHBsaWVkIGluIHNlcXVlbmNlLiAgVGhlIHNldCBvZiBmaWxlcGFpcnMgZ2l0LWRpZmYtXCoKK2NvbW1hbmRzIGZpbmQgYXJlIHVzZWQgYXMgdGhlIGlucHV0IHRvIGRpZmZjb3JlLXBhdGhzcGVjLCBhbmQKK3RoZSBvdXRwdXQgZnJvbSBkaWZmY29yZS1wYXRoc3BlYyBpcyB1c2VkIGFzIHRoZSBpbnB1dCB0byB0aGUKK25leHQgdHJhbnNmb3JtYXRpb24uICBUaGUgZmluYWwgcmVzdWx0IGlzIHRoZW4gcGFzc2VkIHRvIHRoZQorb3V0cHV0IHJvdXRpbmUgYW5kIGdlbmVyYXRlcyBlaXRoZXIgZGlmZi1yYXcgZm9ybWF0IChzZWUgT3V0cHV0Citmb3JtYXQgc2VjdGlvbnMgb2YgdGhlIG1hbnVhbCBmb3IgZ2l0LWRpZmYtXCogY29tbWFuZHMpIG9yCitkaWZmLXBhdGNoIGZvcm1hdC4KKworCitkaWZmY29yZS1wYXRoc3BlYzogRm9yIElnbm9yaW5nIEZpbGVzIE91dHNpZGUgT3VyIENvbnNpZGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlyc3QgdHJhbnNmb3JtYXRpb24gaW4gdGhlIGNoYWluIGlzIGRpZmZjb3JlLXBhdGhzcGVjLCBhbmQKK2lzIGNvbnRyb2xsZWQgYnkgZ2l2aW5nIHRoZSBwYXRobmFtZSBwYXJhbWV0ZXJzIHRvIHRoZQorZ2l0LWRpZmYtKiBjb21tYW5kcyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhlIHBhdGhzcGVjIGlzIHVzZWQKK3RvIGxpbWl0IHRoZSB3b3JsZCBkaWZmIG9wZXJhdGVzIGluLiAgSXQgcmVtb3ZlcyB0aGUgZmlsZXBhaXJzCitvdXRzaWRlIHRoZSBzcGVjaWZpZWQgc2V0IG9mIHBhdGhuYW1lcy4gIEUuZy4gSWYgdGhlIGlucHV0IHNldCAKK29mIGZpbGVwYWlycyBpbmNsdWRlZDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBqdW5rZmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2J1dCB0aGUgY29tbWFuZCBpbnZvY2F0aW9uIHdhcyAiZ2l0LWRpZmYtZmlsZXMgbXlmaWxlIiwgdGhlbiB0aGUKK2p1bmtmaWxlIGVudHJ5IHdvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBiZWNhdXNlIG9ubHkgIm15ZmlsZSIKK2lzIHVuZGVyIGNvbnNpZGVyYXRpb24uCisKK0ltcGxlbWVudGF0aW9uIG5vdGUuICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgZ2l0LWRpZmYtdHJlZQordXNlcyB0aGUgcGF0aG5hbWUgcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIGN1bGwgc2V0IG9mCitmaWxlcGFpcnMgaXQgZmVlZHMgdGhlIGRpZmZjb3JlIG1lY2hhbmlzbSBpdHNlbGYsIGFuZCBkb2VzIG5vdAordXNlIGRpZmZjb3JlLXBhdGhzcGVjLCBidXQgdGhlIGVuZCByZXN1bHQgaXMgdGhlIHNhbWUuCisKKworZGlmZmNvcmUtYnJlYWs6IEZvciBTcGxpdHRpbmcgVXAgIkNvbXBsZXRlIFJld3JpdGVzIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgc2Vjb25kIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBjaGFpbiBpcyBkaWZmY29yZS1icmVhaywgYW5kIGlzCitjb250cm9sbGVkIGJ5IHRoZSAtQiBvcHRpb24gdG8gdGhlIGdpdC1kaWZmLSogY29tbWFuZHMuICBUaGlzIGlzCit1c2VkIHRvIGRldGVjdCBhIGZpbGVwYWlyIHRoYXQgcmVwcmVzZW50cyAiY29tcGxldGUgcmV3cml0ZSIgYW5kCiticmVhayBzdWNoIGZpbGVwYWlyIGludG8gdHdvIGZpbGVwYWlycyB0aGF0IHJlcHJlc2VudCBkZWxldGUgYW5kCitjcmVhdGUuICBFLmcuICBJZiB0aGUgaW5wdXQgY29udGFpbmVkIHRoaXMgZmlsZXBhaXI6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgYmNkMTIzNC4uLiAwMTIzNDU2Li4uIE0gZmlsZTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSBmaWxlICJmaWxlMCIgaXMgY29tcGxldGVseSByZXdyaXR0ZW4sCitpdCBjaGFuZ2VzIGl0IHRvOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMDAwMDAwIGJjZDEyMzQuLi4gMDAwMDAwMC4uLiBEIGZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxMjM0NTYuLi4gQSBmaWxlMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvciB0aGUgcHVycG9zZSBvZiBicmVha2luZyBhIGZpbGVwYWlyLCBkaWZmY29yZS1icmVhayBleGFtaW5lcwordGhlIGV4dGVudCBvZiBjaGFuZ2VzIGJldHdlZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBiZWZvcmUKK2FuZCBhZnRlciBtb2RpZmljYXRpb24gKGkuZS4gdGhlIGNvbnRlbnRzIHRoYXQgaGF2ZSAiYmNkMTIzNC4uLiIKK2FuZCAiMDEyMzQ1Ni4uLiIgYXMgdGhlaXIgU0hBMSBjb250ZW50IElELCBpbiB0aGUgYWJvdmUKK2V4YW1wbGUpLiAgVGhlIGFtb3VudCBvZiBkZWxldGlvbiBvZiBvcmlnaW5hbCBjb250ZW50cyBhbmQKK2luc2VydGlvbiBvZiBuZXcgbWF0ZXJpYWwgYXJlIGFkZGVkIHRvZ2V0aGVyLCBhbmQgaWYgaXQgZXhjZWVkcwordGhlICJicmVhayBzY29yZSIsIHRoZSBmaWxlcGFpciBpcyBicm9rZW4gaW50byB0d28uICBUaGUgYnJlYWsKK3Njb3JlIGRlZmF1bHRzIHRvIDUwJSBvZiB0aGUgc2l6ZSBvZiB0aGUgc21hbGxlciBvZiB0aGUgb3JpZ2luYWwKK2FuZCB0aGUgcmVzdWx0IChpLmUuIGlmIHRoZSBlZGl0IHNocmlua3MgdGhlIGZpbGUsIHRoZSBzaXplIG9mCit0aGUgcmVzdWx0IGlzIHVzZWQ7IGlmIHRoZSBlZGl0IGxlbmd0aGVucyB0aGUgZmlsZSwgdGhlIHNpemUgb2YKK3RoZSBvcmlnaW5hbCBpcyB1c2VkKSwgYW5kIGNhbiBiZSBjdXN0b21pemVkIGJ5IGdpdmluZyBhIG51bWJlcgorYWZ0ZXIgIi1CIiBvcHRpb24gKGUuZy4gIi1CNzUiIHRvIHRlbGwgaXQgdG8gdXNlIDc1JSkuCisKKworZGlmZmNvcmUtcmVuYW1lOiBGb3IgRGV0ZWN0aW9uIFJlbmFtZXMgYW5kIENvcGllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHJlbmFtZXMgYW5kIGNvcGllcywgYW5kIGlzCitjb250cm9sbGVkIGJ5IHRoZSAtTSBvcHRpb24gKHRvIGRldGVjdCByZW5hbWVzKSBhbmQgdGhlIC1DIG9wdGlvbgorKHRvIGRldGVjdCBjb3BpZXMgYXMgd2VsbCkgdG8gdGhlIGdpdC1kaWZmLSogY29tbWFuZHMuICBJZiB0aGUKK2lucHV0IGNvbnRhaW5lZCB0aGVzZSBmaWxlcGFpcnM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAwMDAwMDAgMDEyMzQ1Ni4uLiAwMDAwMDAwLi4uIEQgZmlsZVgKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMDEyMzQ1Ni4uLiBBIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZGVsZXRlZCBmaWxlIGZpbGVYIGlzIHNpbWlsYXIgZW5vdWdoIHRvCit0aGUgY29udGVudHMgb2YgdGhlIGNyZWF0ZWQgZmlsZSBmaWxlMCwgdGhlbiByZW5hbWUgZGV0ZWN0aW9uCittZXJnZXMgdGhlc2UgZmlsZXBhaXJzIGFuZCBjcmVhdGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMTAwNjQ0IDAxMjM0NTYuLi4gMDEyMzQ1Ni4uLiBSMTAwIGZpbGVYIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB0aGUgIi1DIiBvcHRpb24gaXMgdXNlZCwgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIG1vZGlmaWVkIGZpbGVzLAorYW5kIGRlbGV0ZWQgZmlsZXMgKGFuZCBhbHNvIHVubW9kaWZpZWQgZmlsZXMsIGlmIHRoZQorIlwtLWZpbmQtY29waWVzLWhhcmRlciIgb3B0aW9uIGlzIHVzZWQpIGFyZSBjb25zaWRlcmVkIGFzIGNhbmRpZGF0ZXMKK29mIHRoZSBzb3VyY2UgZmlsZXMgaW4gcmVuYW1lL2NvcHkgb3BlcmF0aW9uLiAgSWYgdGhlIGlucHV0IHdlcmUgbGlrZQordGhlc2UgZmlsZXBhaXJzLCB0aGF0IHRhbGsgYWJvdXQgYSBtb2RpZmllZCBmaWxlIGZpbGVZIGFuZCBhIG5ld2x5CitjcmVhdGVkIGZpbGUgZmlsZTA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgMDEyMzQ1Ni4uLiAxMjM0NTY3Li4uIE0gZmlsZVkKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gYmNkMzQ1Ni4uLiBBIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIGZpbGVZIGFuZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRzIG9mCitmaWxlMCBhcmUgY29tcGFyZWQsIGFuZCBpZiB0aGV5IGFyZSBzaW1pbGFyIGVub3VnaCwgdGhleSBhcmUKK2NoYW5nZWQgdG86CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgMDEyMzQ1Ni4uLiAxMjM0NTY3Li4uIE0gZmlsZVkKKzoxMDA2NDQgMTAwNjQ0IDAxMjM0NTYuLi4gYmNkMzQ1Ni4uLiBDMTAwIGZpbGVZIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gYm90aCByZW5hbWUgYW5kIGNvcHkgZGV0ZWN0aW9uLCB0aGUgc2FtZSAiZXh0ZW50IG9mIGNoYW5nZXMiCithbGdvcml0aG0gdXNlZCBpbiBkaWZmY29yZS1icmVhayBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0d28KK2ZpbGVzIGFyZSAic2ltaWxhciBlbm91Z2giLCBhbmQgY2FuIGJlIGN1c3RvbWl6ZWQgdG8gdXNlCithIHNpbWlsYXJpdHkgc2NvcmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgb2YgNTAlIGJ5IGdpdmluZyBhCitudW1iZXIgYWZ0ZXIgdGhlICItTSIgb3IgIi1DIiBvcHRpb24gKGUuZy4gIi1NOCIgdG8gdGVsbCBpdCB0byB1c2UKKzgvMTAgPSA4MCUpLgorCitOb3RlLiAgV2hlbiB0aGUgIi1DIiBvcHRpb24gaXMgdXNlZCB3aXRoIGBcLS1maW5kLWNvcGllcy1oYXJkZXJgCitvcHRpb24sIGdpdC1kaWZmLVwqIGNvbW1hbmRzIGZlZWQgdW5tb2RpZmllZCBmaWxlcGFpcnMgdG8KK2RpZmZjb3JlIG1lY2hhbmlzbSBhcyB3ZWxsIGFzIG1vZGlmaWVkIG9uZXMuICBUaGlzIGxldHMgdGhlIGNvcHkKK2RldGVjdG9yIGNvbnNpZGVyIHVubW9kaWZpZWQgZmlsZXMgYXMgY29weSBzb3VyY2UgY2FuZGlkYXRlcyBhdAordGhlIGV4cGVuc2Ugb2YgbWFraW5nIGl0IHNsb3dlci4gIFdpdGhvdXQgYFwtLWZpbmQtY29waWVzLWhhcmRlcmAsCitnaXQtZGlmZi1cKiBjb21tYW5kcyBjYW4gZGV0ZWN0IGNvcGllcyBvbmx5IGlmIHRoZSBmaWxlIHRoYXQgd2FzCitjb3BpZWQgaGFwcGVuZWQgdG8gaGF2ZSBiZWVuIG1vZGlmaWVkIGluIHRoZSBzYW1lIGNoYW5nZXNldC4KKworCitkaWZmY29yZS1tZXJnZS1icm9rZW46IEZvciBQdXR0aW5nICJDb21wbGV0ZSBSZXdyaXRlcyIgQmFjayBUb2dldGhlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB1c2VkIHRvIG1lcmdlIGZpbGVwYWlycyBicm9rZW4gYnkKK2RpZmZjb3JlLWJyZWFrLCBhbmQgbm90IHRyYW5zZm9ybWVkIGludG8gcmVuYW1lL2NvcHkgYnkKK2RpZmZjb3JlLXJlbmFtZSwgYmFjayBpbnRvIGEgc2luZ2xlIG1vZGlmaWNhdGlvbi4gIFRoaXMgYWx3YXlzCitydW5zIHdoZW4gZGlmZmNvcmUtYnJlYWsgaXMgdXNlZC4KKworRm9yIHRoZSBwdXJwb3NlIG9mIG1lcmdpbmcgYnJva2VuIGZpbGVwYWlycyBiYWNrLCBpdCB1c2VzIGEKK2RpZmZlcmVudCAiZXh0ZW50IG9mIGNoYW5nZXMiIGNvbXB1dGF0aW9uIGZyb20gdGhlIG9uZXMgdXNlZCBieQorZGlmZmNvcmUtYnJlYWsgYW5kIGRpZmZjb3JlLXJlbmFtZS4gIEl0IGNvdW50cyBvbmx5IHRoZSBkZWxldGlvbgorZnJvbSB0aGUgb3JpZ2luYWwsIGFuZCBkb2VzIG5vdCBjb3VudCBpbnNlcnRpb24uICBJZiB5b3UgcmVtb3ZlZAorb25seSAxMCBsaW5lcyBmcm9tIGEgMTAwLWxpbmUgZG9jdW1lbnQsIGV2ZW4gaWYgeW91IGFkZGVkIDkxMAorbmV3IGxpbmVzIHRvIG1ha2UgYSBuZXcgMTAwMC1saW5lIGRvY3VtZW50LCB5b3UgZGlkIG5vdCBkbyBhCitjb21wbGV0ZSByZXdyaXRlLiAgZGlmZmNvcmUtYnJlYWsgYnJlYWtzIHN1Y2ggYSBjYXNlIGluIG9yZGVyIHRvCitoZWxwIGRpZmZjb3JlLXJlbmFtZSB0byBjb25zaWRlciBzdWNoIGZpbGVwYWlycyBhcyBjYW5kaWRhdGUgb2YKK3JlbmFtZS9jb3B5IGRldGVjdGlvbiwgYnV0IGlmIGZpbGVwYWlycyBicm9rZW4gdGhhdCB3YXkgd2VyZSBub3QKK21hdGNoZWQgd2l0aCBvdGhlciBmaWxlcGFpcnMgdG8gY3JlYXRlIHJlbmFtZS9jb3B5LCB0aGVuIHRoaXMKK3RyYW5zZm9ybWF0aW9uIG1lcmdlcyB0aGVtIGJhY2sgaW50byB0aGUgb3JpZ2luYWwKKyJtb2RpZmljYXRpb24iLgorCitUaGUgImV4dGVudCBvZiBjaGFuZ2VzIiBwYXJhbWV0ZXIgY2FuIGJlIHR3ZWFrZWQgZnJvbSB0aGUKK2RlZmF1bHQgODAlICh0aGF0IGlzLCB1bmxlc3MgbW9yZSB0aGFuIDgwJSBvZiB0aGUgb3JpZ2luYWwKK21hdGVyaWFsIGlzIGRlbGV0ZWQsIHRoZSBicm9rZW4gcGFpcnMgYXJlIG1lcmdlZCBiYWNrIGludG8gYQorc2luZ2xlIG1vZGlmaWNhdGlvbikgYnkgZ2l2aW5nIGEgc2Vjb25kIG51bWJlciB0byAtQiBvcHRpb24sCitsaWtlIHRoZXNlOgorCisqIC1CNTAvNjAgKGdpdmUgNTAlICJicmVhayBzY29yZSIgdG8gZGlmZmNvcmUtYnJlYWssIHVzZSA2MCUKKyAgZm9yIGRpZmZjb3JlLW1lcmdlLWJyb2tlbikuCisKKyogLUIvNjAgKHRoZSBzYW1lIGFzIGFib3ZlLCBzaW5jZSBkaWZmY29yZS1icmVhayBkZWZhdWx0cyB0byA1MCUpLgorCitOb3RlIHRoYXQgZWFybGllciBpbXBsZW1lbnRhdGlvbiBsZWZ0IGEgYnJva2VuIHBhaXIgYXMgYSBzZXBhcmF0ZQorY3JlYXRpb24gYW5kIGRlbGV0aW9uIHBhdGNoZXMuICBUaGlzIHdhcyBhbiB1bm5lY2Vzc2FyeSBoYWNrIGFuZAordGhlIGxhdGVzdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgbWVyZ2VzIGFsbCB0aGUgYnJva2VuIHBhaXJzCitiYWNrIGludG8gbW9kaWZpY2F0aW9ucywgYnV0IHRoZSByZXN1bHRpbmcgcGF0Y2ggb3V0cHV0IGlzCitmb3JtYXR0ZWQgZGlmZmVyZW50bHkgZm9yIGVhc2llciByZXZpZXcgaW4gY2FzZSBvZiBzdWNoCithIGNvbXBsZXRlIHJld3JpdGUgYnkgc2hvd2luZyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIG9sZCB2ZXJzaW9uCitwcmVmaXhlZCB3aXRoICctJywgZm9sbG93ZWQgYnkgdGhlIGVudGlyZSBjb250ZW50cyBvZiBuZXcKK3ZlcnNpb24gcHJlZml4ZWQgd2l0aCAnKycuCisKKworZGlmZmNvcmUtcGlja2F4ZTogRm9yIERldGVjdGluZyBBZGRpdGlvbi9EZWxldGlvbiBvZiBTcGVjaWZpZWQgU3RyaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB1c2VkIHRvIGZpbmQgZmlsZXBhaXJzIHRoYXQgcmVwcmVzZW50CitjaGFuZ2VzIHRoYXQgdG91Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLCBhbmQgaXMgY29udHJvbGxlZCBieSB0aGUKKy1TIG9wdGlvbiBhbmQgdGhlIGBcLS1waWNrYXhlLWFsbGAgb3B0aW9uIHRvIHRoZSBnaXQtZGlmZi0qCitjb21tYW5kcy4KKworV2hlbiBkaWZmY29yZS1waWNrYXhlIGlzIGluIHVzZSwgaXQgY2hlY2tzIGlmIHRoZXJlIGFyZQorZmlsZXBhaXJzIHdob3NlICJvcmlnaW5hbCIgc2lkZSBoYXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kCit3aG9zZSAicmVzdWx0IiBzaWRlIGRvZXMgbm90LiAgU3VjaCBhIGZpbGVwYWlyIHJlcHJlc2VudHMgInRoZQorc3RyaW5nIGFwcGVhcmVkIGluIHRoaXMgY2hhbmdlc2V0Ii4gIEl0IGFsc28gY2hlY2tzIGZvciB0aGUKK29wcG9zaXRlIGNhc2UgdGhhdCBsb3NlcyB0aGUgc3BlY2lmaWVkIHN0cmluZy4KKworV2hlbiBgXC0tcGlja2F4ZS1hbGxgIGlzIG5vdCBpbiBlZmZlY3QsIGRpZmZjb3JlLXBpY2theGUgbGVhdmVzCitvbmx5IHN1Y2ggZmlsZXBhaXJzIHRoYXQgdG91Y2ggdGhlIHNwZWNpZmllZCBzdHJpbmcgaW4gaXRzCitvdXRwdXQuICBXaGVuIGBcLS1waWNrYXhlLWFsbGAgaXMgdXNlZCwgZGlmZmNvcmUtcGlja2F4ZSBsZWF2ZXMgYWxsCitmaWxlcGFpcnMgaW50YWN0IGlmIHRoZXJlIGlzIHN1Y2ggYSBmaWxlcGFpciwgb3IgbWFrZXMgdGhlCitvdXRwdXQgZW1wdHkgb3RoZXJ3aXNlLiAgVGhlIGxhdHRlciBiZWhhdmlvdXIgaXMgZGVzaWduZWQgdG8KK21ha2UgcmV2aWV3aW5nIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBjb250ZXh0IG9mIHRoZSB3aG9sZQorY2hhbmdlc2V0IGVhc2llci4KKworCitkaWZmY29yZS1vcmRlcjogRm9yIFNvcnRpbmcgdGhlIE91dHB1dCBCYXNlZCBvbiBGaWxlbmFtZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHVzZWQgdG8gcmVvcmRlciB0aGUgZmlsZXBhaXJzIGFjY29yZGluZyB0byB0aGUgdXNlcidzCisob3IgcHJvamVjdCdzKSB0YXN0ZSwgYW5kIGlzIGNvbnRyb2xsZWQgYnkgdGhlIC1PIG9wdGlvbiB0byB0aGUKK2dpdC1kaWZmLSogY29tbWFuZHMuCisKK1RoaXMgdGFrZXMgYSB0ZXh0IGZpbGUgZWFjaCBvZiB3aG9zZSBsaW5lcyBpcyBhIHNoZWxsIGdsb2IKK3BhdHRlcm4uICBGaWxlcGFpcnMgdGhhdCBtYXRjaCBhIGdsb2IgcGF0dGVybiBvbiBhbiBlYXJsaWVyIGxpbmUKK2luIHRoZSBmaWxlIGFyZSBvdXRwdXQgYmVmb3JlIG9uZXMgdGhhdCBtYXRjaCBhIGxhdGVyIGxpbmUsIGFuZAorZmlsZXBhaXJzIHRoYXQgZG8gbm90IG1hdGNoIGFueSBnbG9iIHBhdHRlcm4gYXJlIG91dHB1dCBsYXN0LgorCitBcyBhbiBleGFtcGxlLCBhIHR5cGljYWwgb3JkZXJmaWxlIGZvciB0aGUgY29yZSBnaXQgcHJvYmFibHkKK3dvdWxkIGxvb2sgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JFQURNRQorTWFrZWZpbGUKK0RvY3VtZW50YXRpb24KKyouaAorKi5jCit0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ldmVyeWRheS50eHQgYi9Eb2N1bWVudGF0aW9uL2V2ZXJ5ZGF5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTM1YzE4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ldmVyeWRheS50eHQKQEAgLTAsMCArMSw0NjggQEAKK0V2ZXJ5ZGF5IEdJVCBXaXRoIDIwIENvbW1hbmRzIE9yIFNvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitHSVQgc3VpdGUgaGFzIG92ZXIgMTAwIGNvbW1hbmRzLCBhbmQgdGhlIG1hbnVhbCBwYWdlIGZvciBlYWNoIG9mCit0aGVtIGRpc2N1c3NlcyB3aGF0IHRoZSBjb21tYW5kIGRvZXMgYW5kIGhvdyBpdCBpcyB1c2VkIGluCitkZXRhaWwsIGJ1dCB1bnRpbCB5b3Uga25vdyB3aGF0IGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgaW4gb3JkZXIKK3RvIGFjaGlldmUgd2hhdCB5b3Ugd2FudCB0byBkbywgeW91IGNhbm5vdCB0ZWxsIHdoaWNoIG1hbnVhbAorcGFnZSB0byBsb29rIGF0LCBhbmQgaWYgeW91IGtub3cgdGhhdCBhbHJlYWR5IHlvdSBkbyBub3QgbmVlZAordGhlIG1hbnVhbC4KKworRG9lcyB0aGF0IG1lYW4geW91IG5lZWQgdG8ga25vdyBhbGwgb2YgdGhlbSBiZWZvcmUgeW91IGNhbiB1c2UKK2dpdD8gIE5vdCBhdCBhbGwuICBEZXBlbmRpbmcgb24gdGhlIHJvbGUgeW91IHBsYXksIHRoZSBzZXQgb2YKK2NvbW1hbmRzIHlvdSBuZWVkIHRvIGtub3cgaXMgc2xpZ2h0bHkgZGlmZmVyZW50LCBidXQgaW4gYW55IGNhc2UKK3doYXQgeW91IG5lZWQgdG8gbGVhcm4gaXMgZmFyIHNtYWxsZXIgdGhhbiB0aGUgZnVsbCBzZXQgb2YKK2NvbW1hbmRzIHRvIGNhcnJ5IG91dCB5b3VyIGRheS10by1kYXkgd29yay4gIFRoaXMgZG9jdW1lbnQgaXMgdG8KK3NlcnZlIGFzIGEgY2hlYXQtc2hlZXQgYW5kIGEgc2V0IG9mIHBvaW50ZXJzIGZvciBwZW9wbGUgcGxheWluZwordmFyaW91cyByb2xlcy4KKworPDxCYXNpYyBSZXBvc2l0b3J5Pj4gY29tbWFuZHMgYXJlIG5lZWRlZCBieSBwZW9wbGUgd2hvIGhhcyBhCityZXBvc2l0b3J5IC0tLSB0aGF0IGlzIGV2ZXJ5Ym9keSwgYmVjYXVzZSBldmVyeSB3b3JraW5nIHRyZWUgb2YKK2dpdCBpcyBhIHJlcG9zaXRvcnkuCisKK0luIGFkZGl0aW9uLCA8PEluZGl2aWR1YWwgRGV2ZWxvcGVyIChTdGFuZGFsb25lKT4+IGNvbW1hbmRzIGFyZQorZXNzZW50aWFsIGZvciBhbnlib2R5IHdobyBtYWtlcyBhIGNvbW1pdCwgZXZlbiBmb3Igc29tZWJvZHkgd2hvCit3b3JrcyBhbG9uZS4KKworSWYgeW91IHdvcmsgd2l0aCBvdGhlciBwZW9wbGUsIHlvdSB3aWxsIG5lZWQgY29tbWFuZHMgbGlzdGVkIGluCis8PEluZGl2aWR1YWwgRGV2ZWxvcGVyIChQYXJ0aWNpcGFudCk+PiBzZWN0aW9uIGFzIHdlbGwuCisKK1Blb3BsZSB3aG8gcGxheSA8PEludGVncmF0b3I+PiByb2xlIG5lZWQgdG8gbGVhcm4gc29tZSBtb3JlCitjb21tYW5kcyBpbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUuCisKKzw8UmVwb3NpdG9yeSBBZG1pbmlzdHJhdGlvbj4+IGNvbW1hbmRzIGFyZSBmb3Igc3lzdGVtCithZG1pbmlzdHJhdG9ycyB3aG8gYXJlIHJlc3BvbnNpYmxlIHRvIGNhcmUgYW5kIGZlZWQgZ2l0CityZXBvc2l0b3JpZXMgdG8gc3VwcG9ydCBkZXZlbG9wZXJzLgorCisKK0Jhc2ljIFJlcG9zaXRvcnlbW0Jhc2ljIFJlcG9zaXRvcnldXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZXJ5Ym9keSB1c2VzIHRoZXNlIGNvbW1hbmRzIHRvIGZlZWQgYW5kIGNhcmUgZ2l0IHJlcG9zaXRvcmllcy4KKworICAqIGdpdGxpbms6Z2l0LWluaXQtZGJbMV0gb3IgZ2l0bGluazpnaXQtY2xvbmVbMV0gdG8gY3JlYXRlIGEKKyAgICBuZXcgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LWZzY2stb2JqZWN0c1sxXSB0byB2YWxpZGF0ZSB0aGUgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LXBydW5lWzFdIHRvIGdhcmJhZ2UgY29sbGVjdCBjcnVmdCBpbiB0aGUKKyAgICByZXBvc2l0b3J5LgorCisgICogZ2l0bGluazpnaXQtcmVwYWNrWzFdIHRvIHBhY2sgbG9vc2Ugb2JqZWN0cyBmb3IgZWZmaWNpZW5jeS4KKworRXhhbXBsZXMKK35+fn5+fn5+CisKK0NoZWNrIGhlYWx0aCBhbmQgcmVtb3ZlIGNydWZ0Ljo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGZzY2stb2JqZWN0cyA8MT4KKyQgZ2l0IHBydW5lCiskIGdpdCBjb3VudC1vYmplY3RzIDwyPgorJCBnaXQgcmVwYWNrIDwzPgorJCBnaXQgcHJ1bmUgPDQ+CistLS0tLS0tLS0tLS0KKysKKzwxPiBydW5uaW5nIHdpdGhvdXQgIi0tZnVsbCIgaXMgdXN1YWxseSBjaGVhcCBhbmQgYXNzdXJlcyB0aGUKK3JlcG9zaXRvcnkgaGVhbHRoIHJlYXNvbmFibHkgd2VsbC4KKzwyPiBjaGVjayBob3cgbWFueSBsb29zZSBvYmplY3RzIHRoZXJlIGFyZSBhbmQgaG93IG11Y2gKK2Rpc2sgc3BhY2UgaXMgd2FzdGVkIGJ5IG5vdCByZXBhY2tpbmcuCis8Mz4gd2l0aG91dCAiLWEiIHJlcGFja3MgaW5jcmVtZW50YWxseS4gIHJlcGFja2luZyBldmVyeSA0LTVNQgorb2YgbG9vc2Ugb2JqZWN0cyBhY2N1bXVsYXRpb24gbWF5IGJlIGEgZ29vZCBydWxlIG9mIHRodW1iLgorPDQ+IGFmdGVyIHJlcGFjaywgcHJ1bmUgcmVtb3ZlcyB0aGUgZHVwbGljYXRlIGxvb3NlIG9iamVjdHMuCisKK1JlcGFjayBhIHNtYWxsIHByb2plY3QgaW50byBzaW5nbGUgcGFjay46OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCByZXBhY2sgLWEgLWQgPDE+CiskIGdpdCBwcnVuZQorLS0tLS0tLS0tLS0tCisrCis8MT4gcGFjayBhbGwgdGhlIG9iamVjdHMgcmVhY2hhYmxlIGZyb20gdGhlIHJlZnMgaW50byBvbmUgcGFjaworYW5kIHJlbW92ZSB1bm5lZWRlZCBvdGhlciBwYWNrcworCisKK0luZGl2aWR1YWwgRGV2ZWxvcGVyIChTdGFuZGFsb25lKVtbSW5kaXZpZHVhbCBEZXZlbG9wZXIgKFN0YW5kYWxvbmUpXV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBzdGFuZGFsb25lIGluZGl2aWR1YWwgZGV2ZWxvcGVyIGRvZXMgbm90IGV4Y2hhbmdlIHBhdGNoZXMgd2l0aAorb3RoZXIgcGVvcGxlLCBhbmQgd29ya3MgYWxvbmUgaW4gYSBzaW5nbGUgcmVwb3NpdG9yeSwgdXNpbmcgdGhlCitmb2xsb3dpbmcgY29tbWFuZHMuCisKKyAgKiBnaXRsaW5rOmdpdC1zaG93LWJyYW5jaFsxXSB0byBzZWUgd2hlcmUgeW91IGFyZS4KKworICAqIGdpdGxpbms6Z2l0LWxvZ1sxXSB0byBzZWUgd2hhdCBoYXBwZW5lZC4KKworICAqIGdpdGxpbms6Z2l0LXdoYXRjaGFuZ2VkWzFdIHRvIGZpbmQgb3V0IHdoZXJlIHRoaW5ncyBoYXZlCisgICAgY29tZSBmcm9tLgorCisgICogZ2l0bGluazpnaXQtY2hlY2tvdXRbMV0gYW5kIGdpdGxpbms6Z2l0LWJyYW5jaFsxXSB0byBzd2l0Y2gKKyAgICBicmFuY2hlcy4KKworICAqIGdpdGxpbms6Z2l0LWFkZFsxXSBhbmQgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdIHRvIG1hbmFnZQorICAgIHRoZSBpbmRleCBmaWxlLgorCisgICogZ2l0bGluazpnaXQtZGlmZlsxXSBhbmQgZ2l0bGluazpnaXQtc3RhdHVzWzFdIHRvIHNlZSB3aGF0CisgICAgeW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGRvaW5nLgorCisgICogZ2l0bGluazpnaXQtY29tbWl0WzFdIHRvIGFkdmFuY2UgdGhlIGN1cnJlbnQgYnJhbmNoLgorCisgICogZ2l0bGluazpnaXQtcmVzZXRbMV0gYW5kIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdICh3aXRoCisgICAgcGF0aG5hbWUgcGFyYW1ldGVycykgdG8gdW5kbyBjaGFuZ2VzLgorCisgICogZ2l0bGluazpnaXQtcHVsbFsxXSB3aXRoICIuIiBhcyB0aGUgcmVtb3RlIHRvIG1lcmdlIGJldHdlZW4KKyAgICBsb2NhbCBicmFuY2hlcy4KKworICAqIGdpdGxpbms6Z2l0LXJlYmFzZVsxXSB0byBtYWludGFpbiB0b3BpYyBicmFuY2hlcy4KKworICAqIGdpdGxpbms6Z2l0LXRhZ1sxXSB0byBtYXJrIGtub3duIHBvaW50LgorCitFeGFtcGxlcworfn5+fn5+fn4KKworRXh0cmFjdCBhIHRhcmJhbGwgYW5kIGNyZWF0ZSBhIHdvcmtpbmcgdHJlZSBhbmQgYSBuZXcgcmVwb3NpdG9yeSB0byBrZWVwIHRyYWNrIG9mIGl0Ljo6CisrCistLS0tLS0tLS0tLS0KKyQgdGFyIHp4ZiBmcm90ei50YXIuZ3oKKyQgY2QgZnJvdHoKKyQgZ2l0LWluaXQtZGIKKyQgZ2l0IGFkZCAuIDwxPgorJCBnaXQgY29tbWl0IC1tICdpbXBvcnQgb2YgZnJvdHogc291cmNlIHRyZWUuJworJCBnaXQgdGFnIHYyLjQzIDwyPgorLS0tLS0tLS0tLS0tCisrCis8MT4gYWRkIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorPDI+IG1ha2UgYSBsaWdodHdlaWdodCwgdW5hbm5vdGF0ZWQgdGFnLgorCitDcmVhdGUgYSB0b3BpYyBicmFuY2ggYW5kIGRldmVsb3AuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgYWxzYS1hdWRpbyA8MT4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IGNoZWNrb3V0IC0tIGN1cnNlcy91eF9hdWRpb19vc3MuYyA8Mj4KKyQgZ2l0IGFkZCBjdXJzZXMvdXhfYXVkaW9fYWxzYS5jIDwzPgorJCBlZGl0L2NvbXBpbGUvdGVzdAorJCBnaXQgZGlmZiA8ND4KKyQgZ2l0IGNvbW1pdCAtYSAtcyA8NT4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IHJlc2V0IC0tc29mdCBIRUFEXiA8Nj4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IGRpZmYgT1JJR19IRUFEIDw3PgorJCBnaXQgY29tbWl0IC1hIC1jIE9SSUdfSEVBRCA8OD4KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlciA8OT4KKyQgZ2l0IHB1bGwgLiBhbHNhLWF1ZGlvIDwxMD4KKyQgZ2l0IGxvZyAtLXNpbmNlPSczIGRheXMgYWdvJyA8MTE+CiskIGdpdCBsb2cgdjIuNDMuLiBjdXJzZXMvIDwxMj4KKy0tLS0tLS0tLS0tLQorKworPDE+IGNyZWF0ZSBhIG5ldyB0b3BpYyBicmFuY2guCis8Mj4gcmV2ZXJ0IHlvdXIgYm90Y2hlZCBjaGFuZ2VzIGluICJjdXJzZXMvdXhfYXVkaW9fb3NzLmMiLgorPDM+IHlvdSBuZWVkIHRvIHRlbGwgZ2l0IGlmIHlvdSBhZGRlZCBhIG5ldyBmaWxlOyByZW1vdmFsIGFuZAorbW9kaWZpY2F0aW9uIHdpbGwgYmUgY2F1Z2h0IGlmIHlvdSBkbyAiY29tbWl0IC1hIiBsYXRlci4KKzw0PiB0byBzZWUgd2hhdCBjaGFuZ2VzIHlvdSBhcmUgY29tbWl0dGluZy4KKzw1PiBjb21taXQgZXZlcnl0aGluZyBhcyB5b3UgaGF2ZSB0ZXN0ZWQsIHdpdGggeW91ciBzaWduLW9mZi4KKzw2PiB0YWtlIHRoZSBsYXN0IGNvbW1pdCBiYWNrLCBrZWVwaW5nIHdoYXQgaXMgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKzw3PiBsb29rIGF0IHRoZSBjaGFuZ2VzIHNpbmNlIHRoZSBwcmVtYXR1cmUgY29tbWl0IHdlIHRvb2sgYmFjay4KKzw4PiByZWRvIHRoZSBjb21taXQgdW5kb25lIGluIHRoZSBwcmV2aW91cyBzdGVwLCB1c2luZyB0aGUgbWVzc2FnZQoreW91IG9yaWdpbmFsbHkgd3JvdGUuCis8OT4gc3dpdGNoIHRvIHRoZSBtYXN0ZXIgYnJhbmNoLgorPDEwPiBtZXJnZSBhIHRvcGljIGJyYW5jaCBpbnRvIHlvdXIgbWFzdGVyIGJyYW5jaAorPDExPiByZXZpZXcgY29tbWl0IGxvZ3M7IG90aGVyIGZvcm1zIHRvIGxpbWl0IG91dHB1dCBjYW4gYmUKK2NvbWJpbmVkIGFuZCBpbmNsdWRlIC0tbWF4LWNvdW50PTEwIChzaG93IDEwIGNvbW1pdHMpLCAtLXVudGlsPScyMDA1LTEyLTEwJy4KKzwxMj4gdmlldyBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgdG91Y2ggd2hhdCdzIGluIGN1cnNlcy8KK2RpcmVjdG9yeSwgc2luY2UgdjIuNDMgdGFnLgorCisKK0luZGl2aWR1YWwgRGV2ZWxvcGVyIChQYXJ0aWNpcGFudClbW0luZGl2aWR1YWwgRGV2ZWxvcGVyIChQYXJ0aWNpcGFudCldXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgZGV2ZWxvcGVyIHdvcmtpbmcgYXMgYSBwYXJ0aWNpcGFudCBpbiBhIGdyb3VwIHByb2plY3QgbmVlZHMgdG8KK2xlYXJuIGhvdyB0byBjb21tdW5pY2F0ZSB3aXRoIG90aGVycywgYW5kIHVzZXMgdGhlc2UgY29tbWFuZHMgaW4KK2FkZGl0aW9uIHRvIHRoZSBvbmVzIG5lZWRlZCBieSBhIHN0YW5kYWxvbmUgZGV2ZWxvcGVyLgorCisgICogZ2l0bGluazpnaXQtY2xvbmVbMV0gZnJvbSB0aGUgdXBzdHJlYW0gdG8gcHJpbWUgeW91ciBsb2NhbAorICAgIHJlcG9zaXRvcnkuCisKKyAgKiBnaXRsaW5rOmdpdC1wdWxsWzFdIGFuZCBnaXRsaW5rOmdpdC1mZXRjaFsxXSBmcm9tICJvcmlnaW4iCisgICAgdG8ga2VlcCB1cC10by1kYXRlIHdpdGggdGhlIHVwc3RyZWFtLgorCisgICogZ2l0bGluazpnaXQtcHVzaFsxXSB0byBzaGFyZWQgcmVwb3NpdG9yeSwgaWYgeW91IGFkb3B0IENWUworICAgIHN0eWxlIHNoYXJlZCByZXBvc2l0b3J5IHdvcmtmbG93LgorCisgICogZ2l0bGluazpnaXQtZm9ybWF0LXBhdGNoWzFdIHRvIHByZXBhcmUgZS1tYWlsIHN1Ym1pc3Npb24sIGlmCisgICAgeW91IGFkb3B0IExpbnV4IGtlcm5lbC1zdHlsZSBwdWJsaWMgZm9ydW0gd29ya2Zsb3cuCisKK0V4YW1wbGVzCit+fn5+fn5+fgorCitDbG9uZSB0aGUgdXBzdHJlYW0gYW5kIHdvcmsgb24gaXQuICBGZWVkIGNoYW5nZXMgdG8gdXBzdHJlYW0uOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS8uLi4vdG9ydmFsZHMvbGludXgtMi42IG15Mi42CiskIGNkIG15Mi42CiskIGVkaXQvY29tcGlsZS90ZXN0OyBnaXQgY29tbWl0IC1hIC1zIDwxPgorJCBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbiA8Mj4KKyQgZ2l0IHB1bGwgPDM+CiskIGdpdCB3aGF0Y2hhbmdlZCAtcCBPUklHX0hFQUQuLiBhcmNoL2kzODYgaW5jbHVkZS9hc20taTM4NiA8ND4KKyQgZ2l0IHB1bGwgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViLy4uLi9qZ2FyemlrL2xpYmF0YS1kZXYuZ2l0IEFMTCA8NT4KKyQgZ2l0IHJlc2V0IC0taGFyZCBPUklHX0hFQUQgPDY+CiskIGdpdCBwcnVuZSA8Nz4KKyQgZ2l0IGZldGNoIC0tdGFncyA8OD4KKy0tLS0tLS0tLS0tLQorKworPDE+IHJlcGVhdCBhcyBuZWVkZWQuCis8Mj4gZXh0cmFjdCBwYXRjaGVzIGZyb20geW91ciBicmFuY2ggZm9yIGUtbWFpbCBzdWJtaXNzaW9uLgorPDM+ICJwdWxsIiBmZXRjaGVzIGZyb20gIm9yaWdpbiIgYnkgZGVmYXVsdCBhbmQgbWVyZ2VzIGludG8gdGhlCitjdXJyZW50IGJyYW5jaC4KKzw0PiBpbW1lZGlhdGVseSBhZnRlciBwdWxsaW5nLCBsb29rIGF0IHRoZSBjaGFuZ2VzIGRvbmUgdXBzdHJlYW0KK3NpbmNlIGxhc3QgdGltZSB3ZSBjaGVja2VkLCBvbmx5IGluIHRoZQorYXJlYSB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKzw1PiBmZXRjaCBmcm9tIGEgc3BlY2lmaWMgYnJhbmNoIGZyb20gYSBzcGVjaWZpYyByZXBvc2l0b3J5IGFuZCBtZXJnZS4KKzw2PiByZXZlcnQgdGhlIHB1bGwuCis8Nz4gZ2FyYmFnZSBjb2xsZWN0IGxlZnRvdmVyIG9iamVjdHMgZnJvbSByZXZlcnRlZCBwdWxsLgorPDg+IGZyb20gdGltZSB0byB0aW1lLCBvYnRhaW4gb2ZmaWNpYWwgdGFncyBmcm9tIHRoZSAib3JpZ2luIgorYW5kIHN0b3JlIHRoZW0gdW5kZXIgLmdpdC9yZWZzL3RhZ3MvLgorCisKK1B1c2ggaW50byBhbm90aGVyIHJlcG9zaXRvcnkuOjoKKysKKy0tLS0tLS0tLS0tLQorc2F0ZWxsaXRlJCBnaXQgY2xvbmUgbW90aGVyc2hpcDpmcm90ei8uZ2l0IGZyb3R6IDwxPgorc2F0ZWxsaXRlJCBjZCBmcm90egorc2F0ZWxsaXRlJCBjYXQgLmdpdC9yZW1vdGVzL29yaWdpbiA8Mj4KK1VSTDogbW90aGVyc2hpcDpmcm90ei8uZ2l0CitQdWxsOiBtYXN0ZXI6b3JpZ2luCitzYXRlbGxpdGUkIGVjaG8gJ1B1c2g6IG1hc3RlcjpzYXRlbGxpdGUnID4+LmdpdC9yZW1vdGVzL29yaWdpbiA8Mz4KK3NhdGVsbGl0ZSQgZWRpdC9jb21waWxlL3Rlc3QvY29tbWl0CitzYXRlbGxpdGUkIGdpdCBwdXNoIG9yaWdpbiA8ND4KKworbW90aGVyc2hpcCQgY2QgZnJvdHoKK21vdGhlcnNoaXAkIGdpdCBjaGVja291dCBtYXN0ZXIKK21vdGhlcnNoaXAkIGdpdCBwdWxsIC4gc2F0ZWxsaXRlIDw1PgorLS0tLS0tLS0tLS0tCisrCis8MT4gbW90aGVyc2hpcCBtYWNoaW5lIGhhcyBhIGZyb3R6IHJlcG9zaXRvcnkgdW5kZXIgeW91ciBob21lCitkaXJlY3Rvcnk7IGNsb25lIGZyb20gaXQgdG8gc3RhcnQgYSByZXBvc2l0b3J5IG9uIHRoZSBzYXRlbGxpdGUKK21hY2hpbmUuCis8Mj4gY2xvbmUgY3JlYXRlcyB0aGlzIGZpbGUgYnkgZGVmYXVsdC4gIEl0IGFycmFuZ2VzICJnaXQgcHVsbCIKK3RvIGZldGNoIGFuZCBzdG9yZSB0aGUgbWFzdGVyIGJyYW5jaCBoZWFkIG9mIG1vdGhlcnNoaXAgbWFjaGluZQordG8gbG9jYWwgIm9yaWdpbiIgYnJhbmNoLgorPDM+IGFycmFuZ2UgImdpdCBwdXNoIiB0byBwdXNoIGxvY2FsICJtYXN0ZXIiIGJyYW5jaCB0bworInNhdGVsbGl0ZSIgYnJhbmNoIG9mIHRoZSBtb3RoZXJzaGlwIG1hY2hpbmUuCis8ND4gcHVzaCB3aWxsIHN0YXNoIG91ciB3b3JrIGF3YXkgb24gInNhdGVsbGl0ZSIgYnJhbmNoIG9uIHRoZQorbW90aGVyc2hpcCBtYWNoaW5lLiAgWW91IGNvdWxkIHVzZSB0aGlzIGFzIGEgYmFjay11cCBtZXRob2QuCis8NT4gb24gbW90aGVyc2hpcCBtYWNoaW5lLCBtZXJnZSB0aGUgd29yayBkb25lIG9uIHRoZSBzYXRlbGxpdGUKK21hY2hpbmUgaW50byB0aGUgbWFzdGVyIGJyYW5jaC4KKworQnJhbmNoIG9mZiBvZiBhIHNwZWNpZmljIHRhZy46OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtYiBwcml2YXRlMi42LjE0IHYyLjYuMTQgPDE+CiskIGVkaXQvY29tcGlsZS90ZXN0OyBnaXQgY29tbWl0IC1hCiskIGdpdCBjaGVja291dCBtYXN0ZXIKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtayAtbSAtLXN0ZG91dCB2Mi42LjE0Li5wcml2YXRlMi42LjE0IHwKKyAgZ2l0IGFtIC0zIC1rIDwyPgorLS0tLS0tLS0tLS0tCisrCis8MT4gY3JlYXRlIGEgcHJpdmF0ZSBicmFuY2ggYmFzZWQgb24gYSB3ZWxsIGtub3duIChidXQgc29tZXdoYXQgYmVoaW5kKQordGFnLgorPDI+IGZvcndhcmQgcG9ydCBhbGwgY2hhbmdlcyBpbiBwcml2YXRlMi42LjE0IGJyYW5jaCB0byBtYXN0ZXIgYnJhbmNoCit3aXRob3V0IGEgZm9ybWFsICJtZXJnaW5nIi4KKworCitJbnRlZ3JhdG9yW1tJbnRlZ3JhdG9yXV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGZhaXJseSBjZW50cmFsIHBlcnNvbiBhY3RpbmcgYXMgdGhlIGludGVncmF0b3IgaW4gYSBncm91cAorcHJvamVjdCByZWNlaXZlcyBjaGFuZ2VzIG1hZGUgYnkgb3RoZXJzLCByZXZpZXdzIGFuZCBpbnRlZ3JhdGVzCit0aGVtIGFuZCBwdWJsaXNoZXMgdGhlIHJlc3VsdCBmb3Igb3RoZXJzIHRvIHVzZSwgdXNpbmcgdGhlc2UKK2NvbW1hbmRzIGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIG5lZWRlZCBieSBwYXJ0aWNpcGFudHMuCisKKyAgKiBnaXRsaW5rOmdpdC1hbVsxXSB0byBhcHBseSBwYXRjaGVzIGUtbWFpbGVkIGluIGZyb20geW91cgorICAgIGNvbnRyaWJ1dG9ycy4KKworICAqIGdpdGxpbms6Z2l0LXB1bGxbMV0gdG8gbWVyZ2UgZnJvbSB5b3VyIHRydXN0ZWQgbGlldXRlbmFudHMuCisKKyAgKiBnaXRsaW5rOmdpdC1mb3JtYXQtcGF0Y2hbMV0gdG8gcHJlcGFyZSBhbmQgc2VuZCBzdWdnZXN0ZWQKKyAgICBhbHRlcm5hdGl2ZSB0byBjb250cmlidXRvcnMuCisKKyAgKiBnaXRsaW5rOmdpdC1yZXZlcnRbMV0gdG8gdW5kbyBib3RjaGVkIGNvbW1pdHMuCisKKyAgKiBnaXRsaW5rOmdpdC1wdXNoWzFdIHRvIHB1Ymxpc2ggdGhlIGJsZWVkaW5nIGVkZ2UuCisKKworRXhhbXBsZXMKK35+fn5+fn5+CisKK015IHR5cGljYWwgR0lUIGRheS46OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBzdGF0dXMgPDE+CiskIGdpdCBzaG93LWJyYW5jaCA8Mj4KKyQgbWFpbHggPDM+CismIHMgMiAzIDQgNSAuLyt0by1hcHBseQorJiBzIDcgOCAuLytob2xkLWxpbnVzCismIHEKKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgYW0gLTMgLWkgLXMgLXUgLi8rdG8tYXBwbHkgPDQ+CiskIGNvbXBpbGUvdGVzdAorJCBnaXQgY2hlY2tvdXQgLWIgaG9sZC9saW51cyAmJiBnaXQgYW0gLTMgLWkgLXMgLXUgLi8raG9sZC1saW51cyA8NT4KKyQgZ2l0IGNoZWNrb3V0IHRvcGljL29uZSAmJiBnaXQgcmViYXNlIG1hc3RlciA8Nj4KKyQgZ2l0IGNoZWNrb3V0IHB1ICYmIGdpdCByZXNldCAtLWhhcmQgbWFzdGVyIDw3PgorJCBnaXQgcHVsbCAuIHRvcGljL29uZSB0b3BpYy90d28gJiYgZ2l0IHB1bGwgLiBob2xkL2xpbnVzIDw4PgorJCBnaXQgY2hlY2tvdXQgbWFpbnQKKyQgZ2l0IGNoZXJyeS1waWNrIG1hc3Rlcn40IDw5PgorJCBjb21waWxlL3Rlc3QKKyQgZ2l0IHRhZyAtcyAtbSAnR0lUIDAuOTkuOXgnIHYwLjk5Ljl4IDwxMD4KKyQgZ2l0IGZldGNoIGtvICYmIGdpdCBzaG93LWJyYW5jaCBtYXN0ZXIgbWFpbnQgJ3RhZ3Mva28tKicgPDExPgorJCBnaXQgcHVzaCBrbyA8MTI+CiskIGdpdCBwdXNoIGtvIHYwLjk5Ljl4IDwxMz4KKy0tLS0tLS0tLS0tLQorKworPDE+IHNlZSB3aGF0IEkgd2FzIGluIHRoZSBtaWRkbGUgb2YgZG9pbmcsIGlmIGFueS4KKzwyPiBzZWUgd2hhdCB0b3BpYyBicmFuY2hlcyBJIGhhdmUgYW5kIHRoaW5rIGFib3V0IGhvdyByZWFkeQordGhleSBhcmUuCis8Mz4gcmVhZCBtYWlscywgc2F2ZSBvbmVzIHRoYXQgYXJlIGFwcGxpY2FibGUsIGFuZCBzYXZlIG90aGVycwordGhhdCBhcmUgbm90IHF1aXRlIHJlYWR5LgorPDQ+IGFwcGx5IHRoZW0sIGludGVyYWN0aXZlbHksIHdpdGggbXkgc2lnbi1vZmZzLgorPDU+IGNyZWF0ZSB0b3BpYyBicmFuY2ggYXMgbmVlZGVkIGFuZCBhcHBseSwgYWdhaW4gd2l0aCBteQorc2lnbi1vZmZzLiAKKzw2PiByZWJhc2UgaW50ZXJuYWwgdG9waWMgYnJhbmNoIHRoYXQgaGFzIG5vdCBiZWVuIG1lcmdlZCB0byB0aGUKK21hc3Rlciwgbm9yIGV4cG9zZWQgYXMgYSBwYXJ0IG9mIGEgc3RhYmxlIGJyYW5jaC4KKzw3PiByZXN0YXJ0ICJwdSIgZXZlcnkgdGltZSBmcm9tIHRoZSBtYXN0ZXIuCis8OD4gYW5kIGJ1bmRsZSB0b3BpYyBicmFuY2hlcyBzdGlsbCBjb29raW5nLgorPDk+IGJhY2twb3J0IGEgY3JpdGljYWwgZml4LgorPDEwPiBjcmVhdGUgYSBzaWduZWQgdGFnLgorPDExPiBtYWtlIHN1cmUgSSBkaWQgbm90IGFjY2lkZW50YWxseSByZXdpbmQgbWFzdGVyIGJleW9uZCB3aGF0IEkKK2FscmVhZHkgcHVzaGVkIG91dC4gICJrbyIgc2hvcnRoYW5kIHBvaW50cyBhdCB0aGUgcmVwb3NpdG9yeSBJIGhhdmUKK2F0IGtlcm5lbC5vcmcsIGFuZCBsb29rcyBsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvcmVtb3Rlcy9rbworVVJMOiBrZXJuZWwub3JnOi9wdWIvc2NtL2dpdC9naXQuZ2l0CitQdWxsOiBtYXN0ZXI6cmVmcy90YWdzL2tvLW1hc3RlcgorUHVsbDogbWFpbnQ6cmVmcy90YWdzL2tvLW1haW50CitQdXNoOiBtYXN0ZXIKK1B1c2g6ICtwdQorUHVzaDogbWFpbnQKKy0tLS0tLS0tLS0tLQorKworSW4gdGhlIG91dHB1dCBmcm9tICJnaXQgc2hvdy1icmFuY2giLCAibWFzdGVyIiBzaG91bGQgaGF2ZQorZXZlcnl0aGluZyAia28tbWFzdGVyIiBoYXMuCisKKzwxMj4gcHVzaCBvdXQgdGhlIGJsZWVkaW5nIGVkZ2UuCis8MTM+IHB1c2ggdGhlIHRhZyBvdXQsIHRvby4KKworCitSZXBvc2l0b3J5IEFkbWluaXN0cmF0aW9uW1tSZXBvc2l0b3J5IEFkbWluaXN0cmF0aW9uXV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHJlcG9zaXRvcnkgYWRtaW5pc3RyYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgdG9vbHMgdG8gc2V0IHVwCithbmQgbWFpbnRhaW4gYWNjZXNzIHRvIHRoZSByZXBvc2l0b3J5IGJ5IGRldmVsb3BlcnMuCisKKyAgKiBnaXRsaW5rOmdpdC1kYWVtb25bMV0gdG8gYWxsb3cgYW5vbnltb3VzIGRvd25sb2FkIGZyb20KKyAgICByZXBvc2l0b3J5LgorCisgICogZ2l0bGluazpnaXQtc2hlbGxbMV0gY2FuIGJlIHVzZWQgYXMgYSAncmVzdHJpY3RlZCBsb2dpbiBzaGVsbCcKKyAgICBmb3Igc2hhcmVkIGNlbnRyYWwgcmVwb3NpdG9yeSB1c2Vycy4KKworbGluazpob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dFt1cGRhdGUgaG9vayBob3d0b10gaGFzIGEgZ29vZAorZXhhbXBsZSBvZiBtYW5hZ2luZyBhIHNoYXJlZCBjZW50cmFsIHJlcG9zaXRvcnkuCisKKworRXhhbXBsZXMKK35+fn5+fn5+CitSdW4gZ2l0LWRhZW1vbiB0byBzZXJ2ZSAvcHViL3NjbSBmcm9tIGluZXRkLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCBnaXQgL2V0Yy9pbmV0ZC5jb25mCitnaXQJc3RyZWFtCXRjcAlub3dhaXQJbm9ib2R5IFwKKyAgL3Vzci9iaW4vZ2l0LWRhZW1vbiBnaXQtZGFlbW9uIC0taW5ldGQgLS1zeXNsb2cgLS1leHBvcnQtYWxsIC9wdWIvc2NtCistLS0tLS0tLS0tLS0KKysKK1RoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBsaW5lIHNob3VsZCBiZSBvbiBvbmUgbGluZS4KKworUnVuIGdpdC1kYWVtb24gdG8gc2VydmUgL3B1Yi9zY20gZnJvbSB4aW5ldGQuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBjYXQgL2V0Yy94aW5ldGQuZC9naXQtZGFlbW9uCisjIGRlZmF1bHQ6IG9mZgorIyBkZXNjcmlwdGlvbjogVGhlIGdpdCBzZXJ2ZXIgb2ZmZXJzIGFjY2VzcyB0byBnaXQgcmVwb3NpdG9yaWVzCitzZXJ2aWNlIGdpdAoreworICAgICAgICBkaXNhYmxlID0gbm8KKyAgICAgICAgdHlwZSAgICAgICAgICAgID0gVU5MSVNURUQKKyAgICAgICAgcG9ydCAgICAgICAgICAgID0gOTQxOAorICAgICAgICBzb2NrZXRfdHlwZSAgICAgPSBzdHJlYW0KKyAgICAgICAgd2FpdCAgICAgICAgICAgID0gbm8KKyAgICAgICAgdXNlciAgICAgICAgICAgID0gbm9ib2R5CisgICAgICAgIHNlcnZlciAgICAgICAgICA9IC91c3IvYmluL2dpdC1kYWVtb24KKyAgICAgICAgc2VydmVyX2FyZ3MgICAgID0gLS1pbmV0ZCAtLXN5c2xvZyAtLWV4cG9ydC1hbGwgLS1iYXNlLXBhdGg9L3B1Yi9zY20KKyAgICAgICAgbG9nX29uX2ZhaWx1cmUgICs9IFVTRVJJRAorfQorLS0tLS0tLS0tLS0tCisrCitDaGVjayB5b3VyIHhpbmV0ZCg4KSBkb2N1bWVudGF0aW9uIGFuZCBzZXR1cCwgdGhpcyBpcyBmcm9tIGEgRmVkb3JhIHN5c3RlbS4KK090aGVycyBtaWdodCBiZSBkaWZmZXJlbnQuCisKK0dpdmUgcHVzaC9wdWxsIG9ubHkgYWNjZXNzIHRvIGRldmVsb3BlcnMuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBncmVwIGdpdCAvZXRjL3Bhc3N3ZCA8MT4KK2FsaWNlOng6MTAwMDoxMDAwOjovaG9tZS9hbGljZTovdXNyL2Jpbi9naXQtc2hlbGwKK2JvYjp4OjEwMDE6MTAwMTo6L2hvbWUvYm9iOi91c3IvYmluL2dpdC1zaGVsbAorY2luZHk6eDoxMDAyOjEwMDI6Oi9ob21lL2NpbmR5Oi91c3IvYmluL2dpdC1zaGVsbAorZGF2aWQ6eDoxMDAzOjEwMDM6Oi9ob21lL2RhdmlkOi91c3IvYmluL2dpdC1zaGVsbAorJCBncmVwIGdpdCAvZXRjL3NoZWxscyA8Mj4KKy91c3IvYmluL2dpdC1zaGVsbAorLS0tLS0tLS0tLS0tCisrCis8MT4gbG9nLWluIHNoZWxsIGlzIHNldCB0byAvdXNyL2Jpbi9naXQtc2hlbGwsIHdoaWNoIGRvZXMgbm90CithbGxvdyBhbnl0aGluZyBidXQgImdpdCBwdXNoIiBhbmQgImdpdCBwdWxsIi4gIFRoZSB1c2VycyBzaG91bGQKK2dldCBhbiBzc2ggYWNjZXNzIHRvIHRoZSBtYWNoaW5lLgorPDI+IGluIG1hbnkgZGlzdHJpYnV0aW9ucyAvZXRjL3NoZWxscyBuZWVkcyB0byBsaXN0IHdoYXQgaXMgdXNlZAorYXMgdGhlIGxvZ2luIHNoZWxsLgorCitDVlMtc3R5bGUgc2hhcmVkIHJlcG9zaXRvcnkuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBncmVwIGdpdCAvZXRjL2dyb3VwIDwxPgorZ2l0Ong6OTQxODphbGljZSxib2IsY2luZHksZGF2aWQKKyQgY2QgL2hvbWUvZGV2by5naXQKKyQgbHMgLWwgPDI+CisgIGxyd3hyd3hyd3ggICAxIGRhdmlkIGdpdCAgICAxNyBEZWMgIDQgMjI6NDAgSEVBRCAtPiByZWZzL2hlYWRzL21hc3RlcgorICBkcnd4cndzci14ICAgMiBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIGJyYW5jaGVzCisgIC1ydy1ydy1yLS0gICAxIGRhdmlkIGdpdCAgICA4NCBEZWMgIDQgMjI6NDAgY29uZmlnCisgIC1ydy1ydy1yLS0gICAxIGRhdmlkIGdpdCAgICA1OCBEZWMgIDQgMjI6NDAgZGVzY3JpcHRpb24KKyAgZHJ3eHJ3c3IteCAgIDIgZGF2aWQgZ2l0ICA0MDk2IERlYyAgNCAyMjo0MCBob29rcworICAtcnctcnctci0tICAgMSBkYXZpZCBnaXQgMzc1MDQgRGVjICA0IDIyOjQwIGluZGV4CisgIGRyd3hyd3NyLXggICAyIGRhdmlkIGdpdCAgNDA5NiBEZWMgIDQgMjI6NDAgaW5mbworICBkcnd4cndzci14ICAgNCBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIG9iamVjdHMKKyAgZHJ3eHJ3c3IteCAgIDQgZGF2aWQgZ2l0ICA0MDk2IE5vdiAgNyAxNDo1OCByZWZzCisgIGRyd3hyd3NyLXggICAyIGRhdmlkIGdpdCAgNDA5NiBEZWMgIDQgMjI6NDAgcmVtb3RlcworJCBscyAtbCBob29rcy91cGRhdGUgPDM+CisgIC1yLXhyLXhyLXggICAxIGRhdmlkIGdpdCAgMzUzNiBEZWMgIDQgMjI6NDAgdXBkYXRlCiskIGNhdCBpbmZvL2FsbG93ZWQtdXNlcnMgPDQ+CityZWZzL2hlYWRzL21hc3RlcglhbGljZVx8Y2luZHkKK3JlZnMvaGVhZHMvZG9jLXVwZGF0ZQlib2IKK3JlZnMvdGFncy92WzAtOV0qCWRhdmlkCistLS0tLS0tLS0tLS0KKysKKzwxPiBwbGFjZSB0aGUgZGV2ZWxvcGVycyBpbnRvIHRoZSBzYW1lIGdpdCBncm91cC4KKzwyPiBhbmQgbWFrZSB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgd3JpdGFibGUgYnkgdGhlIGdyb3VwLgorPDM+IHVzZSB1cGRhdGUtaG9vayBleGFtcGxlIGJ5IENhcmwgZnJvbSBEb2N1bWVudGF0aW9uL2hvd3RvLworZm9yIGJyYW5jaCBwb2xpY3kgY29udHJvbC4KKzw0PiBhbGljZSBhbmQgY2luZHkgY2FuIHB1c2ggaW50byBtYXN0ZXIsIG9ubHkgYm9iIGNhbiBwdXNoIGludG8gZG9jLXVwZGF0ZS4KK2RhdmlkIGlzIHRoZSByZWxlYXNlIG1hbmFnZXIgYW5kIGlzIHRoZSBvbmx5IHBlcnNvbiB3aG8gY2FuCitjcmVhdGUgYW5kIHB1c2ggdmVyc2lvbiB0YWdzLgorCitIVFRQIHNlcnZlciB0byBzdXBwb3J0IGR1bWIgcHJvdG9jb2wgdHJhbnNmZXIuOjoKKysKKy0tLS0tLS0tLS0tLQorZGV2JCBnaXQgdXBkYXRlLXNlcnZlci1pbmZvIDwxPgorZGV2JCBmdHAgdXNlckBpc3AuZXhhbXBsZS5jb20gPDI+CitmdHA+IGNwIC1yIC5naXQgL2hvbWUvdXNlci9teXByb2plY3QuZ2l0CistLS0tLS0tLS0tLS0KKysKKzwxPiBtYWtlIHN1cmUgeW91ciBpbmZvL3JlZnMgYW5kIG9iamVjdHMvaW5mby9wYWNrcyBhcmUgdXAtdG8tZGF0ZQorPDI+IHVwbG9hZCB0byBwdWJsaWMgSFRUUCBzZXJ2ZXIgaG9zdGVkIGJ5IHlvdXIgSVNQLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZXRjaC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vZmV0Y2gtb3B0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmMzRkMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmV0Y2gtb3B0aW9ucy50eHQKQEAgLTAsMCArMSw0MSBAQAorLWEsIFwtLWFwcGVuZDo6CisJQXBwZW5kIHJlZiBuYW1lcyBhbmQgb2JqZWN0IG5hbWVzIG9mIGZldGNoZWQgcmVmcyB0byB0aGUKKwlleGlzdGluZyBjb250ZW50cyBvZiBgLmdpdC9GRVRDSF9IRUFEYC4gIFdpdGhvdXQgdGhpcworCW9wdGlvbiBvbGQgZGF0YSBpbiBgLmdpdC9GRVRDSF9IRUFEYCB3aWxsIGJlIG92ZXJ3cml0dGVuLgorCitcLS11cGxvYWQtcGFjayA8dXBsb2FkLXBhY2s+OjoKKyAgICAgICAgV2hlbiBnaXZlbiwgYW5kIHRoZSByZXBvc2l0b3J5IHRvIGZldGNoIGZyb20gaXMgaGFuZGxlZAorICAgICAgICBieSAnZ2l0LWZldGNoLXBhY2snLCAnLS1leGVjPTx1cGxvYWQtcGFjaz4nIGlzIHBhc3NlZCB0bworICAgICAgICB0aGUgY29tbWFuZCB0byBzcGVjaWZ5IG5vbi1kZWZhdWx0IHBhdGggZm9yIHRoZSBjb21tYW5kCisgICAgICAgIHJ1biBvbiB0aGUgb3RoZXIgZW5kLgorCistZiwgXC0tZm9yY2U6OgorCVdoZW4gYGdpdC1mZXRjaGAgaXMgdXNlZCB3aXRoIGA8cmJyYW5jaD46PGxicmFuY2g+YAorCXJlZnNwZWMsIGl0IHJlZnVzZXMgdG8gdXBkYXRlIHRoZSBsb2NhbCBicmFuY2gKKwlgPGxicmFuY2g+YCB1bmxlc3MgdGhlIHJlbW90ZSBicmFuY2ggYDxyYnJhbmNoPmAgaXQKKwlmZXRjaGVzIGlzIGEgZGVzY2VuZGFudCBvZiBgPGxicmFuY2g+YC4gIFRoaXMgb3B0aW9uCisJb3ZlcnJpZGVzIHRoYXQgY2hlY2suCisKK1wtLW5vLXRhZ3M6OgorCUJ5IGRlZmF1bHQsIGBnaXQtZmV0Y2hgIGZldGNoZXMgdGFncyB0aGF0IHBvaW50IGF0CisJb2JqZWN0cyB0aGF0IGFyZSBkb3dubG9hZGVkIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5CisJYW5kIHN0b3JlcyB0aGVtIGxvY2FsbHkuICBUaGlzIG9wdGlvbiBkaXNhYmxlcyB0aGlzCisJYXV0b21hdGljIHRhZyBmb2xsb3dpbmcuCisKKy10LCBcLS10YWdzOjoKKwlNb3N0IG9mIHRoZSB0YWdzIGFyZSBmZXRjaGVkIGF1dG9tYXRpY2FsbHkgYXMgYnJhbmNoCisJaGVhZHMgYXJlIGRvd25sb2FkZWQsIGJ1dCB0YWdzIHRoYXQgZG8gbm90IHBvaW50IGF0CisJb2JqZWN0cyByZWFjaGFibGUgZnJvbSB0aGUgYnJhbmNoIGhlYWRzIHRoYXQgYXJlIGJlaW5nCisJdHJhY2tlZCB3aWxsIG5vdCBiZSBmZXRjaGVkIGJ5IHRoaXMgbWVjaGFuaXNtLiAgVGhpcworCWZsYWcgbGV0cyBhbGwgdGFncyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvYmplY3RzIGJlCisJZG93bmxvYWRlZC4KKworLWssIFwtLWtlZXA6OgorCUtlZXAgZG93bmxvYWRlZCBwYWNrLgorCistdSwgXC0tdXBkYXRlLWhlYWQtb2s6OgorCUJ5IGRlZmF1bHQgYGdpdC1mZXRjaGAgcmVmdXNlcyB0byB1cGRhdGUgdGhlIGhlYWQgd2hpY2gKKwljb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBicmFuY2guICBUaGlzIGZsYWcgZGlzYWJsZXMgdGhlCisJY2hlY2suICBOb3RlIHRoYXQgZmV0Y2hpbmcgaW50byB0aGUgY3VycmVudCBicmFuY2ggd2lsbCBub3QKKwl1cGRhdGUgdGhlIGluZGV4IGFuZCB3b3JraW5nIGRpcmVjdG9yeSwgc28gdXNlIGl0IHdpdGggY2FyZS4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYWRkLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWFkZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0MmVhMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFkZC50eHQKQEAgLTAsMCArMSw4NiBAQAorZ2l0LWFkZCgxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYWRkIC0gQWRkIGZpbGVzIHRvIHRoZSBpbmRleCBmaWxlCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1hZGQnIFstbl0gWy12XSBbLS1dIDxmaWxlPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0Egc2ltcGxlIHdyYXBwZXIgZm9yIGdpdC11cGRhdGUtaW5kZXggdG8gYWRkIGZpbGVzIHRvIHRoZSBpbmRleCwKK2ZvciBwZW9wbGUgdXNlZCB0byBkbyAiY3ZzIGFkZCIuCisKK0l0IG9ubHkgYWRkcyBub24taWdub3JlZCBmaWxlcywgdG8gYWRkIGlnbm9yZWQgZmlsZXMgdXNlCisiZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCIuCisKK09QVElPTlMKKy0tLS0tLS0KKzxmaWxlPi4uLjo6CisJRmlsZXMgdG8gYWRkIHRvIHRoZSBpbmRleCAoc2VlIGdpdGxpbms6Z2l0LWxzLWZpbGVzWzFdKS4KKworLW46OgorICAgICAgICBEb24ndCBhY3R1YWxseSBhZGQgdGhlIGZpbGUocyksIGp1c3Qgc2hvdyBpZiB0aGV5IGV4aXN0LgorCistdjo6CisgICAgICAgIEJlIHZlcmJvc2UuCisKK1wtLTo6CisJVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgY29tbWFuZC1saW5lIG9wdGlvbnMgZnJvbQorCXRoZSBsaXN0IG9mIGZpbGVzLCAodXNlZnVsIHdoZW4gZmlsZW5hbWVzIG1pZ2h0IGJlIG1pc3Rha2VuCisJZm9yIGNvbW1hbmQtbGluZSBvcHRpb25zKS4KKworCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK1RoZSBsaXN0IG9mIDxmaWxlPiBnaXZlbiB0byB0aGUgY29tbWFuZCBpcyBmZWQgdG8gYGdpdC1scy1maWxlc2AKK2NvbW1hbmQgdG8gbGlzdCBmaWxlcyB0aGF0IGFyZSBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgaW5kZXggYW5kCithcmUgbm90IGlnbm9yZWQvZXhjbHVkZWQgYnkgYCRHSVRfRElSL2luZm8vZXhjbHVkZWAgZmlsZSBvcgorYC5naXRpZ25vcmVgIGZpbGUgaW4gZWFjaCBkaXJlY3RvcnkuICBUaGlzIG1lYW5zIHR3byB0aGluZ3M6CisKKy4gWW91IGNhbiBwdXQgdGhlIG5hbWUgb2YgYSBkaXJlY3Rvcnkgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kCisgIHRoZSBjb21tYW5kIHdpbGwgYWRkIGFsbCBmaWxlcyBpbiBpdCBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzOworCisuIEdpdmluZyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGluIGluZGV4IGRvZXMgbm90CisgIHJ1biBgZ2l0LXVwZGF0ZS1pbmRleGAgb24gdGhhdCBwYXRoLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorZ2l0LWFkZCBEb2N1bWVudGF0aW9uL1xcKi50eHQ6OgorCisJQWRkcyBhbGwgYFwqLnR4dGAgZmlsZXMgdGhhdCBhcmUgbm90IGluIHRoZSBpbmRleCB1bmRlcgorCWBEb2N1bWVudGF0aW9uYCBkaXJlY3RvcnkgYW5kIGl0cyBzdWJkaXJlY3Rvcmllcy4KKysKK05vdGUgdGhhdCB0aGUgYXN0ZXJpc2sgYFwqYCBpcyBxdW90ZWQgZnJvbSB0aGUgc2hlbGwgaW4gdGhpcworZXhhbXBsZTsgdGhpcyBsZXRzIHRoZSBjb21tYW5kIHRvIGluY2x1ZGUgdGhlIGZpbGVzIGZyb20KK3N1YmRpcmVjdG9yaWVzIG9mIGBEb2N1bWVudGF0aW9uL2AgZGlyZWN0b3J5LgorCitnaXQtYWRkIGdpdC0qLnNoOjoKKworCUFkZHMgYWxsIGdpdC0qLnNoIHNjcmlwdHMgdGhhdCBhcmUgbm90IGluIHRoZSBpbmRleC4KKwlCZWNhdXNlIHRoaXMgZXhhbXBsZSBsZXRzIHNoZWxsIGV4cGFuZCB0aGUgYXN0ZXJpc2sKKwkoaS5lLiB5b3UgYXJlIGxpc3RpbmcgdGhlIGZpbGVzIGV4cGxpY2l0bHkpLCBpdCBkb2VzIG5vdAorCWFkZCBgc3ViZGlyL2dpdC1mb28uc2hgIHRvIHRoZSBpbmRleC4KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1ybVsxXQorZ2l0bGluazpnaXQtbHMtZmlsZXNbMV0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFtLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWFtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTA0NTdkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYW0udHh0CkBAIC0wLDAgKzEsMTAyIEBACitnaXQtYW0oMSkKKz09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYW0gLSBBcHBseSBhIHNlcmllcyBvZiBwYXRjaGVzIGluIGEgbWFpbGJveAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1hbScgWy0tc2lnbm9mZl0gWy0tZG90ZXN0PTxkaXI+XSBbLS11dGY4XSBbLS1iaW5hcnldIFstLTN3YXldCisgICAgICAgICBbLS1pbnRlcmFjdGl2ZV0gWy0td2hpdGVzcGFjZT08b3B0aW9uPl0gPG1ib3g+Li4uCisnZ2l0LWFtJyBbLS1za2lwIHwgLS1yZXNvbHZlZF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTcGxpdHMgbWFpbCBtZXNzYWdlcyBpbiBhIG1haWxib3ggaW50byBjb21taXQgbG9nIG1lc3NhZ2UsCithdXRob3JzaGlwIGluZm9ybWF0aW9uIGFuZCBwYXRjaGVzLCBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZQorY3VycmVudCBicmFuY2guCisKK09QVElPTlMKKy0tLS0tLS0KKy0tc2lnbm9mZjo6CisJQWRkIGBTaWduZWQtb2ZmLWJ5OmAgbGluZSB0byB0aGUgY29tbWl0IG1lc3NhZ2UsIHVzaW5nCisJdGhlIGNvbW1pdHRlciBpZGVudGl0eSBvZiB5b3Vyc2VsZi4KKworLS1kb3Rlc3Q9PGRpcj46OgorCUluc3RlYWQgb2YgYC5kb3Rlc3RgIGRpcmVjdG9yeSwgdXNlIDxkaXI+IGFzIGEgd29ya2luZworCWFyZWEgdG8gc3RvcmUgZXh0cmFjdGVkIHBhdGNoZXMuCisKKy0tdXRmOCwgLS1rZWVwOjoKKwlQYXNzIGAtdWAgYW5kIGAta2AgZmxhZ3MgdG8gYGdpdC1tYWlsaW5mb2AgKHNlZQorCWdpdGxpbms6Z2l0LW1haWxpbmZvWzFdKS4KKworLS1iaW5hcnk6OgorCVBhc3MgYC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50YCBmbGFnIHRvIGBnaXQtYXBwbHlgCisJKHNlZSBnaXRsaW5rOmdpdC1hcHBseVsxXSkuCisKKy0tM3dheTo6CisJV2hlbiB0aGUgcGF0Y2ggZG9lcyBub3QgYXBwbHkgY2xlYW5seSwgZmFsbCBiYWNrIG9uCisJMy13YXkgbWVyZ2UsIGlmIHRoZSBwYXRjaCByZWNvcmRzIHRoZSBpZGVudGl0eSBvZiBibG9icworCWl0IGlzIHN1cHBvc2VkIHRvIGFwcGx5IHRvLCBhbmQgd2UgaGF2ZSB0aG9zZSBibG9icworCWxvY2FsbHkuCisKKy0tc2tpcDo6CisJU2tpcCB0aGUgY3VycmVudCBwYXRjaC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4KKwlyZXN0YXJ0aW5nIGFuIGFib3J0ZWQgcGF0Y2guCisKKy0td2hpdGVzcGFjZT08b3B0aW9uPjo6CisJVGhpcyBmbGFnIGlzIHBhc3NlZCB0byB0aGUgYGdpdC1hcHBseWAgcHJvZ3JhbSB0aGF0IGFwcGxpZXMKKwl0aGUgcGF0Y2guCisKKy0taW50ZXJhY3RpdmU6OgorCVJ1biBpbnRlcmFjdGl2ZWx5LCBqdXN0IGxpa2UgZ2l0LWFwcGx5bWJveC4KKworLS1yZXNvbHZlZDo6CisJQWZ0ZXIgYSBwYXRjaCBmYWlsdXJlIChlLmcuIGF0dGVtcHRpbmcgdG8gYXBwbHkKKwljb25mbGljdGluZyBwYXRjaCksIHRoZSB1c2VyIGhhcyBhcHBsaWVkIGl0IGJ5IGhhbmQgYW5kCisJdGhlIGluZGV4IGZpbGUgc3RvcmVzIHRoZSByZXN1bHQgb2YgdGhlIGFwcGxpY2F0aW9uLgorCU1ha2UgYSBjb21taXQgdXNpbmcgdGhlIGF1dGhvcnNoaXAgYW5kIGNvbW1pdCBsb2cKKwlleHRyYWN0ZWQgZnJvbSB0aGUgZS1tYWlsIG1lc3NhZ2UgYW5kIHRoZSBjdXJyZW50IGluZGV4CisJZmlsZSwgYW5kIGNvbnRpbnVlLgorCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK1doZW4gaW5pdGlhbGx5IGludm9raW5nIGl0LCB5b3UgZ2l2ZSBpdCBuYW1lcyBvZiB0aGUgbWFpbGJveGVzCit0byBjcnVuY2guICBVcG9uIHNlZWluZyB0aGUgZmlyc3QgcGF0Y2ggdGhhdCBkb2VzIG5vdCBhcHBseSwgaXQKK2Fib3J0cyBpbiB0aGUgbWlkZGxlLCBqdXN0IGxpa2UgJ2dpdC1hcHBseW1ib3gnIGRvZXMuICBZb3UgY2FuCityZWNvdmVyIGZyb20gdGhpcyBpbiBvbmUgb2YgdHdvIHdheXM6CisKKy4gc2tpcCB0aGUgY3VycmVudCBvbmUgYnkgcmUtcnVubmluZyB0aGUgY29tbWFuZCB3aXRoICctLXNraXAnCisgIG9wdGlvbi4KKworLiBoYW5kIHJlc29sdmUgdGhlIGNvbmZsaWN0IGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHVwZGF0ZQorICB0aGUgaW5kZXggZmlsZSB0byBicmluZyBpdCBpbiBhIHN0YXRlIHRoYXQgdGhlIHBhdGNoIHNob3VsZAorICBoYXZlIHByb2R1Y2VkLiAgVGhlbiBydW4gdGhlIGNvbW1hbmQgd2l0aCAnLS1yZXNvbHZlZCcgb3B0aW9uLgorCitUaGUgY29tbWFuZCByZWZ1c2VzIHRvIHByb2Nlc3MgbmV3IG1haWxib3hlcyB3aGlsZSBgLmRvdGVzdGAKK2RpcmVjdG9yeSBleGlzdHMsIHNvIGlmIHlvdSBkZWNpZGUgdG8gc3RhcnQgb3ZlciBmcm9tIHNjcmF0Y2gsCitydW4gYHJtIC1mIC5kb3Rlc3RgIGJlZm9yZSBydW5uaW5nIHRoZSBjb21tYW5kIHdpdGggbWFpbGJveAorbmFtZXMuCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1hcHBseW1ib3hbMV0sIGdpdGxpbms6Z2l0LWFwcGx5cGF0Y2hbMV0sIGdpdGxpbms6Z2l0LWFwcGx5WzFdLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUGV0ciBCYXVkaXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYW5ub3RhdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYW5ub3RhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYWY3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hbm5vdGF0ZS50eHQKQEAgLTAsMCArMSw0NCBAQAorZ2l0LWFubm90YXRlKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFubm90YXRlIC0gQW5ub3RhdGUgZmlsZSBsaW5lcyB3aXRoIGNvbW1pdCBpbmZvCisKK1NZTk9QU0lTCistLS0tLS0tLQorZ2l0LWFubm90YXRlIFtvcHRpb25zXSBmaWxlIFtyZXZpc2lvbl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBbm5vdGF0ZXMgZWFjaCBsaW5lIGluIHRoZSBnaXZlbiBmaWxlIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgY29tbWl0Cit3aGljaCBpbnRyb2R1Y2VkIHRoZSBsaW5lLiBPcHRpb25hbGx5IGFubm90YXRlIGZyb20gYSBnaXZlbiByZXZpc2lvbi4KKworT1BUSU9OUworLS0tLS0tLQorLWwsIC0tbG9uZzo6CisJU2hvdyBsb25nIHJldiAoRGVmYXVsdHMgb2ZmKS4KKworLXQsIC0tdGltZTo6CisJU2hvdyByYXcgdGltZXN0YW1wIChEZWZhdWx0cyBvZmYpLgorCistciwgLS1yZW5hbWU6OgorCUZvbGxvdyByZW5hbWVzIChEZWZhdWx0cyBvbikuCisKKy1TLCAtLXJldi1maWxlIDxyZXZzLWZpbGU+OjoKKwlVc2UgcmV2cyBmcm9tIHJldnMtZmlsZSBpbnN0ZWFkIG9mIGNhbGxpbmcgZ2l0LXJldi1saXN0LgorCistaCwgLS1oZWxwOjoKKwlTaG93IGhlbHAgbWVzc2FnZS4KKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1ibGFtZVsxXQorCitBVVRIT1IKKy0tLS0tLQorV3JpdHRlbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmNzQ5NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5LnR4dApAQCAtMCwwICsxLDE0NyBAQAorZ2l0LWFwcGx5KDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFwcGx5IC0gQXBwbHkgcGF0Y2ggb24gYSBnaXQgaW5kZXggZmlsZSBhbmQgYSB3b3JrIHRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtYXBwbHknIFstLXN0YXRdIFstLW51bXN0YXRdIFstLXN1bW1hcnldIFstLWNoZWNrXSBbLS1pbmRleF0gWy0tYXBwbHldCisJICBbLS1uby1hZGRdIFstLWluZGV4LWluZm9dIFstLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudF0gWy16XSBbLXBOVU1dCisJICBbLUNOVU1dIFstLXdoaXRlc3BhY2U9PG5vd2Fybnx3YXJufGVycm9yfGVycm9yLWFsbHxzdHJpcD5dCisJICBbPHBhdGNoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBzdXBwbGllZCBkaWZmIG91dHB1dCBhbmQgYXBwbGllcyBpdCBvbiBhIGdpdCBpbmRleCBmaWxlCithbmQgYSB3b3JrIHRyZWUuCisKK09QVElPTlMKKy0tLS0tLS0KKzxwYXRjaD4uLi46OgorCVRoZSBmaWxlcyB0byByZWFkIHBhdGNoIGZyb20uICAnLScgY2FuIGJlIHVzZWQgdG8gcmVhZAorCWZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorCistLXN0YXQ6OgorCUluc3RlYWQgb2YgYXBwbHlpbmcgdGhlIHBhdGNoLCBvdXRwdXQgZGlmZnN0YXQgZm9yIHRoZQorCWlucHV0LiAgVHVybnMgb2ZmICJhcHBseSIuCisKKy0tbnVtc3RhdDo6CisJU2ltaWxhciB0byBcLS1zdGF0LCBidXQgc2hvd3MgbnVtYmVyIG9mIGFkZGVkIGFuZAorCWRlbGV0ZWQgbGluZXMgaW4gZGVjaW1hbCBub3RhdGlvbiBhbmQgcGF0aG5hbWUgd2l0aG91dAorCWFiYnJldmlhdGlvbiwgdG8gbWFrZSBpdCBtb3JlIG1hY2hpbmUgZnJpZW5kbHkuICBUdXJucworCW9mZiAiYXBwbHkiLgorCistLXN1bW1hcnk6OgorCUluc3RlYWQgb2YgYXBwbHlpbmcgdGhlIHBhdGNoLCBvdXRwdXQgYSBjb25kZW5zZWQKKwlzdW1tYXJ5IG9mIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gZ2l0IGRpZmYgZXh0ZW5kZWQKKwloZWFkZXJzLCBzdWNoIGFzIGNyZWF0aW9ucywgcmVuYW1lcyBhbmQgbW9kZSBjaGFuZ2VzLgorCVR1cm5zIG9mZiAiYXBwbHkiLgorCistLWNoZWNrOjoKKwlJbnN0ZWFkIG9mIGFwcGx5aW5nIHRoZSBwYXRjaCwgc2VlIGlmIHRoZSBwYXRjaCBpcworCWFwcGxpY2FibGUgdG8gdGhlIGN1cnJlbnQgd29yayB0cmVlIGFuZC9vciB0aGUgaW5kZXgKKwlmaWxlIGFuZCBkZXRlY3RzIGVycm9ycy4gIFR1cm5zIG9mZiAiYXBwbHkiLgorCistLWluZGV4OjoKKwlXaGVuIC0tY2hlY2sgaXMgaW4gZWZmZWN0LCBvciB3aGVuIGFwcGx5aW5nIHRoZSBwYXRjaAorCSh3aGljaCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vbmUgb2YgdGhlIG9wdGlvbnMgdGhhdAorCWRpc2FibGVzIGl0IGlzIGluIGVmZmVjdCksIG1ha2Ugc3VyZSB0aGUgcGF0Y2ggaXMKKwlhcHBsaWNhYmxlIHRvIHdoYXQgdGhlIGN1cnJlbnQgaW5kZXggZmlsZSByZWNvcmRzLiAgSWYKKwl0aGUgZmlsZSB0byBiZSBwYXRjaGVkIGluIHRoZSB3b3JrIHRyZWUgaXMgbm90CisJdXAtdG8tZGF0ZSwgaXQgaXMgZmxhZ2dlZCBhcyBhbiBlcnJvci4gIFRoaXMgZmxhZyBhbHNvCisJY2F1c2VzIHRoZSBpbmRleCBmaWxlIHRvIGJlIHVwZGF0ZWQuCisKKy0taW5kZXgtaW5mbzo6CisJTmV3ZXIgZ2l0LWRpZmYgb3V0cHV0IGhhcyBlbWJlZGRlZCAnaW5kZXggaW5mb3JtYXRpb24nCisJZm9yIGVhY2ggYmxvYiB0byBoZWxwIGlkZW50aWZ5IHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHRoYXQKKwl0aGUgcGF0Y2ggYXBwbGllcyB0by4gIFdoZW4gdGhpcyBmbGFnIGlzIGdpdmVuLCBhbmQgaWYKKwl0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgYmxvYiBpcyBhdmFpbGFibGUgbG9jYWxseSwKKwlvdXRwdXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZW0gdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworLXo6OgorCVdoZW4gc2hvd2luZyB0aGUgaW5kZXggaW5mb3JtYXRpb24sIGRvIG5vdCBtdW5nZSBwYXRocywKKwlidXQgdXNlIE5VTCB0ZXJtaW5hdGVkIG1hY2hpbmUgcmVhZGFibGUgZm9ybWF0LiAgV2l0aG91dAorCXRoaXMgZmxhZywgdGhlIHBhdGhuYW1lcyBvdXRwdXQgd2lsbCBoYXZlIFRBQiwgTEYsIGFuZAorCWJhY2tzbGFzaCBjaGFyYWN0ZXJzIHJlcGxhY2VkIHdpdGggYFx0YCwgYFxuYCwgYW5kIGBcXGAsCisJcmVzcGVjdGl2ZWx5LgorCistcDxuPjo6CisJUmVtb3ZlIDxuPiBsZWFkaW5nIHNsYXNoZXMgZnJvbSB0cmFkaXRpb25hbCBkaWZmIHBhdGhzLiBUaGUKKwlkZWZhdWx0IGlzIDEuCisKKy1DPG4+OjoKKwlFbnN1cmUgYXQgbGVhc3QgPG4+IGxpbmVzIG9mIHN1cnJvdW5kaW5nIGNvbnRleHQgbWF0Y2ggYmVmb3JlCisJYW5kIGFmdGVyIGVhY2ggY2hhbmdlLiAgV2hlbiBmZXdlciBsaW5lcyBvZiBzdXJyb3VuZGluZworCWNvbnRleHQgZXhpc3QgdGhleSBhbGwgbXVzdCBtYXRjaC4gIEJ5IGRlZmF1bHQgbm8gY29udGV4dCBpcworCWV2ZXIgaWdub3JlZC4KKworLS1hcHBseTo6CisJSWYgeW91IHVzZSBhbnkgb2YgdGhlIG9wdGlvbnMgbWFya2VkIGBgVHVybnMgb2ZmCisJImFwcGx5IicnIGFib3ZlLCBnaXQtYXBwbHkgcmVhZHMgYW5kIG91dHB1dHMgdGhlCisJaW5mb3JtYXRpb24geW91IGFza2VkIHdpdGhvdXQgYWN0dWFsbHkgYXBwbHlpbmcgdGhlCisJcGF0Y2guICBHaXZlIHRoaXMgZmxhZyBhZnRlciB0aG9zZSBmbGFncyB0byBhbHNvIGFwcGx5CisJdGhlIHBhdGNoLgorCistLW5vLWFkZDo6CisJV2hlbiBhcHBseWluZyBhIHBhdGNoLCBpZ25vcmUgYWRkaXRpb25zIG1hZGUgYnkgdGhlCisJcGF0Y2guICBUaGlzIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgY29tbW9uIHBhcnQgYmV0d2VlbgorCXR3byBmaWxlcyBieSBmaXJzdCBydW5uaW5nIGBkaWZmYCBvbiB0aGVtIGFuZCBhcHBseWluZworCXRoZSByZXN1bHQgd2l0aCB0aGlzIG9wdGlvbiwgd2hpY2ggd291bGQgYXBwbHkgdGhlCisJZGVsZXRpb24gcGFydCBidXQgbm90IGFkZGl0aW9uIHBhcnQuCisKKy0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50OjoKKwlXaGVuIGFwcGx5aW5nIGEgcGF0Y2gsIHdoaWNoIGlzIGEgZ2l0LWVuaGFuY2VkIHBhdGNoCisJdGhhdCB3YXMgcHJlcGFyZWQgdG8gcmVjb3JkIHRoZSBwcmUtIGFuZCBwb3N0LWltYWdlIG9iamVjdAorCW5hbWUgaW4gZnVsbCwgYW5kIHRoZSBwYXRoIGJlaW5nIHBhdGNoZWQgZXhhY3RseSBtYXRjaGVzCisJdGhlIG9iamVjdCB0aGUgcGF0Y2ggYXBwbGllcyB0byAoaS5lLiAiaW5kZXgiIGxpbmUncworCXByZS1pbWFnZSBvYmplY3QgbmFtZSBpcyB3aGF0IGlzIGluIHRoZSB3b3JraW5nIHRyZWUpLAorCWFuZCB0aGUgcG9zdC1pbWFnZSBvYmplY3QgaXMgYXZhaWxhYmxlIGluIHRoZSBvYmplY3QKKwlkYXRhYmFzZSwgdXNlIHRoZSBwb3N0LWltYWdlIG9iamVjdCBhcyB0aGUgcGF0Y2gKKwlyZXN1bHQuICBUaGlzIGFsbG93cyBiaW5hcnkgZmlsZXMgdG8gYmUgcGF0Y2hlZCBpbiBhCisJdmVyeSBsaW1pdGVkIHdheS4KKworLS13aGl0ZXNwYWNlPTxvcHRpb24+OjoKKwlXaGVuIGFwcGx5aW5nIGEgcGF0Y2gsIGRldGVjdCBhIG5ldyBvciBtb2RpZmllZCBsaW5lCisJdGhhdCBlbmRzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZXMgKHRoaXMgaW5jbHVkZXMgYQorCWxpbmUgdGhhdCBzb2xlbHkgY29uc2lzdHMgb2Ygd2hpdGVzcGFjZXMpLiAgQnkgZGVmYXVsdCwKKwl0aGUgY29tbWFuZCBvdXRwdXRzIHdhcm5pbmcgbWVzc2FnZXMgYW5kIGFwcGxpZXMgdGhlCisJcGF0Y2guCisJV2hlbiBgZ2l0LWFwcGx5YCBpcyB1c2VkIGZvciBzdGF0aXN0aWNzIGFuZCBub3QgYXBwbHlpbmcgYQorCXBhdGNoLCBpdCBkZWZhdWx0cyB0byBgbm93YXJuYC4KKwlZb3UgY2FuIHVzZSBkaWZmZXJlbnQgYDxvcHRpb24+YCB0byBjb250cm9sIHRoaXMKKwliZWhhdmlvcjoKKysKKyogYG5vd2FybmAgdHVybnMgb2ZmIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHdhcm5pbmcuCisqIGB3YXJuYCBvdXRwdXRzIHdhcm5pbmdzIGZvciBhIGZldyBzdWNoIGVycm9ycywgYnV0IGFwcGxpZXMgdGhlCisgIHBhdGNoIChkZWZhdWx0KS4KKyogYGVycm9yYCBvdXRwdXRzIHdhcm5pbmdzIGZvciBhIGZldyBzdWNoIGVycm9ycywgYW5kIHJlZnVzZXMKKyAgdG8gYXBwbHkgdGhlIHBhdGNoLgorKiBgZXJyb3ItYWxsYCBpcyBzaW1pbGFyIHRvIGBlcnJvcmAgYnV0IHNob3dzIGFsbCBlcnJvcnMuCisqIGBzdHJpcGAgb3V0cHV0cyB3YXJuaW5ncyBmb3IgYSBmZXcgc3VjaCBlcnJvcnMsIHN0cmlwcyBvdXQgdGhlCisgIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFuZCBhcHBsaWVzIHRoZSBwYXRjaC4KKworCitDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tCisKK2FwcGx5LndoaXRlc3BhY2U6OgorCVdoZW4gbm8gYC0td2hpdGVzcGFjZWAgZmxhZyBpcyBnaXZlbiBmcm9tIHRoZSBjb21tYW5kCisJbGluZSwgdGhpcyBjb25maWd1cmF0aW9uIGl0ZW0gaXMgdXNlZCBhcyB0aGUgZGVmYXVsdC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseW1ib3gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHltYm94LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRjNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHltYm94LnR4dApAQCAtMCwwICsxLDkyIEBACitnaXQtYXBwbHltYm94KDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1hcHBseW1ib3ggLSBBcHBseSBhIHNlcmllcyBvZiBwYXRjaGVzIGluIGEgbWFpbGJveAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1hcHBseW1ib3gnIFstdV0gWy1rXSBbLXFdIFstbV0gKCAtYyAuZG90ZXN0LzxudW0+IHwgPG1ib3g+ICkgWyA8c2lnbm9mZj4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1NwbGl0cyBtYWlsIG1lc3NhZ2VzIGluIGEgbWFpbGJveCBpbnRvIGNvbW1pdCBsb2cgbWVzc2FnZSwKK2F1dGhvcnNoaXAgaW5mb3JtYXRpb24gYW5kIHBhdGNoZXMsIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlCitjdXJyZW50IGJyYW5jaC4KKworCitPUFRJT05TCistLS0tLS0tCistcTo6CisJQXBwbHkgcGF0Y2hlcyBpbnRlcmFjdGl2ZWx5LiAgVGhlIHVzZXIgd2lsbCBiZSBnaXZlbgorCW9wcG9ydHVuaXR5IHRvIGVkaXQgdGhlIGxvZyBtZXNzYWdlIGFuZCB0aGUgcGF0Y2ggYmVmb3JlCisJYXR0ZW1wdGluZyB0byBhcHBseSBpdC4KKworLWs6OgorCVVzdWFsbHkgdGhlIHByb2dyYW0gJ2NsZWFucyB1cCcgdGhlIFN1YmplY3Q6IGhlYWRlciBsaW5lCisJdG8gZXh0cmFjdCB0aGUgdGl0bGUgbGluZSBmb3IgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSwKKwlhbW9uZyB3aGljaCAoMSkgcmVtb3ZlICdSZTonIG9yICdyZTonLCAoMikgbGVhZGluZworCXdoaXRlc3BhY2VzLCAoMykgJ1snIHVwIHRvICddJywgdHlwaWNhbGx5ICdbUEFUQ0hdJywgYW5kCisJdGhlbiBwcmVwZW5kcyAiW1BBVENIXSAiLiAgVGhpcyBmbGFnIGZvcmJpZHMgdGhpcworCW11bmdpbmcsIGFuZCBpcyBtb3N0IHVzZWZ1bCB3aGVuIHVzZWQgdG8gcmVhZCBiYWNrICdnaXQKKwlmb3JtYXQtcGF0Y2ggLS1tYm94JyBvdXRwdXQuCisKKy1tOjoKKwlQYXRjaGVzIGFyZSBhcHBsaWVkIHdpdGggYGdpdC1hcHBseWAgY29tbWFuZCwgYW5kIHVubGVzcworCWl0IGNsZWFubHkgYXBwbGllcyB3aXRob3V0IGZ1enosIHRoZSBwcm9jZXNzaW5nIGZhaWxzLgorCVdpdGggdGhpcyBmbGFnLCBpZiBhIHRyZWUgdGhhdCB0aGUgcGF0Y2ggYXBwbGllcyBjbGVhbmx5CisJaXMgZm91bmQgaW4gYSByZXBvc2l0b3J5LCB0aGUgcGF0Y2ggaXMgYXBwbGllZCB0byB0aGUKKwl0cmVlIGFuZCB0aGVuIGEgMy13YXkgbWVyZ2UgYmV0d2VlbiB0aGUgcmVzdWx0aW5nIHRyZWUKKwlhbmQgdGhlIGN1cnJlbnQgdHJlZS4KKworLXU6OgorCUJ5IGRlZmF1bHQsIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UsIGF1dGhvciBuYW1lIGFuZAorCWF1dGhvciBlbWFpbCBhcmUgdGFrZW4gZnJvbSB0aGUgZS1tYWlsIHdpdGhvdXQgYW55CisJY2hhcnNldCBjb252ZXJzaW9uLCBhZnRlciBtaW5pbWFsbHkgZGVjb2RpbmcgTUlNRQorCXRyYW5zZmVyIGVuY29kaW5nLiAgVGhpcyBmbGFnIGNhdXNlcyB0aGUgcmVzdWx0aW5nCisJY29tbWl0IHRvIGJlIGVuY29kZWQgaW4gdXRmLTggYnkgdHJhbnNsaXRlcmF0aW5nIHRoZW0uCisJTm90ZSB0aGF0IHRoZSBwYXRjaCBpcyBhbHdheXMgdXNlZCBhcyBpcyB3aXRob3V0IGNoYXJzZXQKKwljb252ZXJzaW9uLCBldmVuIHdpdGggdGhpcyBmbGFnLgorCistYyAuZG90ZXN0LzxudW0+OjoKKwlXaGVuIHRoZSBwYXRjaCBjb250YWluZWQgaW4gYW4gZS1tYWlsIGRvZXMgbm90IGNsZWFubHkKKwlhcHBseSwgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlLiBUaGUKKwlwYXRjaCBhbmQgZXh0cmFjdGVkIG1lc3NhZ2UgYXJlIGZvdW5kIGluIC5kb3Rlc3QvLCBhbmQKKwl5b3UgY291bGQgcmUtcnVuICdnaXQgYXBwbHltYm94JyB3aXRoICctYyAuZG90ZXN0LzxudW0+JworCWZsYWcgdG8gcmVzdGFydCB0aGUgcHJvY2VzcyBhZnRlciBpbnNwZWN0aW5nIGFuZCBmaXhpbmcKKwl0aGVtLgorCis8bWJveD46OgorCVRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGUtbWFpbCBtZXNzYWdlcworCXdpdGggcGF0Y2hlcy4gIFRoaXMgZmlsZSBzaG91bGQgYmUgaW4gdGhlIFVOSVggbWFpbGJveAorCWZvcm1hdC4gIFNlZSAnU3VibWl0dGluZ1BhdGNoZXMnIGRvY3VtZW50IHRvIGxlYXJuIGFib3V0CisJdGhlIGZvcm1hdHRpbmcgY29udmVudGlvbiBmb3IgZS1tYWlsIHN1Ym1pc3Npb24uCisKKzxzaWdub2ZmPjo6CisJVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB5b3VyICJTaWduZWQtb2ZmLWJ5IgorCWxpbmUuICBTZWUgJ1N1Ym1pdHRpbmdQYXRjaGVzJyBkb2N1bWVudCB0byBsZWFybiB3aGF0CisJIlNpZ25lZC1vZmYtYnkiIGxpbmUgbWVhbnMuICBZb3UgY2FuIGFsc28ganVzdCBzYXkKKwkneWVzJywgJ3RydWUnLCAnbWUnLCBvciAncGxlYXNlJyB0byB1c2UgYW4gYXV0b21hdGljYWxseQorCWdlbmVyYXRlZCAiU2lnbmVkLW9mZi1ieSIgbGluZSBiYXNlZCBvbiB5b3VyIGNvbW1pdHRlcgorCWlkZW50aXR5LgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtYW1bMV0sIGdpdGxpbms6Z2l0LWFwcGx5cGF0Y2hbMV0uCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5cGF0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHlwYXRjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxZmYxNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5cGF0Y2gudHh0CkBAIC0wLDAgKzEsNTAgQEAKK2dpdC1hcHBseXBhdGNoKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYXBwbHlwYXRjaCAtIEFwcGx5IG9uZSBwYXRjaCBleHRyYWN0ZWQgZnJvbSBhbiBlLW1haWwKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtYXBwbHlwYXRjaCcgPG1zZz4gPHBhdGNoPiA8aW5mbz4gWzxzaWdub2ZmPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUYWtlcyB0aHJlZSBmaWxlcyA8bXNnPiwgPHBhdGNoPiwgYW5kIDxpbmZvPiBwcmVwYXJlZCBmcm9tIGFuCitlLW1haWwgbWVzc2FnZSBieSAnZ2l0LW1haWxpbmZvJywgYW5kIGNyZWF0ZXMgYSBjb21taXQuICBJdCBpcwordXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGNvbW1hbmQgZGlyZWN0bHkuCisKK1RoaXMgY29tbWFuZCBjYW4gcnVuIGBhcHBseXBhdGNoLW1zZ2AsIGBwcmUtYXBwbHlwYXRjaGAsIGFuZAorYHBvc3QtYXBwbHlwYXRjaGAgaG9va3MuICBTZWUgbGluazpob29rcy5odG1sW2hvb2tzXSBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKKworT1BUSU9OUworLS0tLS0tLQorPG1zZz46OgorCUNvbW1pdCBsb2cgbWVzc2FnZSAoc2FucyB0aGUgZmlyc3QgbGluZSwgd2hpY2ggY29tZXMKKwlmcm9tIGUtbWFpbCBTdWJqZWN0IHN0b3JlZCBpbiA8aW5mbz4pLgorCis8cGF0Y2g+OjoKKwlUaGUgcGF0Y2ggdG8gYXBwbHkuCisKKzxpbmZvPjo6CisJQXV0aG9yIGFuZCBzdWJqZWN0IGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIGUtbWFpbCwKKwl1c2VkIG9uICJhdXRob3IiIGxpbmUgYW5kIGFzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZQorCWNvbW1pdCBsb2cgbWVzc2FnZS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcmNoaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTEzMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC50eHQKQEAgLTAsMCArMSwxMDYgQEAKK2dpdC1hcmNoaW1wb3J0KDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYXJjaGltcG9ydCAtIEltcG9ydCBhbiBBcmNoIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtYXJjaGltcG9ydCcgWy1oXSBbLXZdIFstb10gWy1hXSBbLWZdIFstVF0gWy1EIGRlcHRoXSBbLXQgdGVtcGRpcl0KKyAgICAgICAgICAgICAgIDxhcmNoaXZlL2JyYW5jaD4gWyA8YXJjaGl2ZS9icmFuY2g+IF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbXBvcnRzIGEgcHJvamVjdCBmcm9tIG9uZSBvciBtb3JlIEFyY2ggcmVwb3NpdG9yaWVzLiBJdCB3aWxsIGZvbGxvdyBicmFuY2hlcworYW5kIHJlcG9zaXRvcmllcyB3aXRoaW4gdGhlIG5hbWVzcGFjZXMgZGVmaW5lZCBieSB0aGUgPGFyY2hpdmUvYnJhbmNoPgorcGFyYW1ldGVycyBzdXBwbGllZC4gSWYgaXQgY2Fubm90IGZpbmQgdGhlIHJlbW90ZSBicmFuY2ggYSBtZXJnZSBjb21lcyBmcm9tCitpdCB3aWxsIGp1c3QgaW1wb3J0IGl0IGFzIGEgcmVndWxhciBjb21taXQuIElmIGl0IGNhbiBmaW5kIGl0LCBpdCB3aWxsIG1hcmsgaXQgCithcyBhIG1lcmdlIHdoZW5ldmVyIHBvc3NpYmxlIChzZWUgZGlzY3Vzc2lvbiBiZWxvdykuIAorCitUaGUgc2NyaXB0IGV4cGVjdHMgeW91IHRvIHByb3ZpZGUgdGhlIGtleSByb290cyB3aGVyZSBpdCBjYW4gc3RhcnQgdGhlIGltcG9ydCAKK2Zyb20gYW4gJ2luaXRpYWwgaW1wb3J0JyBvciAndGFnJyB0eXBlIG9mIEFyY2ggY29tbWl0LiBJdCB3aWxsIGZvbGxvdyBhbmQgCitpbXBvcnQgbmV3IGJyYW5jaGVzIHdpdGhpbiB0aGUgcHJvdmlkZWQgcm9vdHMuIAorCitJdCBleHBlY3RzIHRvIGJlIGRlYWxpbmcgd2l0aCBvbmUgcHJvamVjdCBvbmx5LiBJZiBpdCBzZWVzIAorYnJhbmNoZXMgdGhhdCBoYXZlIGRpZmZlcmVudCByb290cywgaXQgd2lsbCByZWZ1c2UgdG8gcnVuLiBJbiB0aGF0IGNhc2UsIAorZWRpdCB5b3VyIDxhcmNoaXZlL2JyYW5jaD4gcGFyYW1ldGVycyB0byBkZWZpbmUgY2xlYXJseSB0aGUgc2NvcGUgb2YgdGhlIAoraW1wb3J0LiAKKworYGdpdC1hcmNoaW1wb3J0YCB1c2VzIGB0bGFgIGV4dGVuc2l2ZWx5IGluIHRoZSBiYWNrZ3JvdW5kIHRvIGFjY2VzcyB0aGUgCitBcmNoIHJlcG9zaXRvcnkuCitNYWtlIHN1cmUgeW91IGhhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiBgdGxhYCBhdmFpbGFibGUgaW4gdGhlIHBhdGguIGB0bGFgIG11c3QKK2tub3cgYWJvdXQgdGhlIHJlcG9zaXRvcmllcyB5b3UgcGFzcyB0byBgZ2l0LWFyY2hpbXBvcnRgLiAKKworRm9yIHRoZSBpbml0aWFsIGltcG9ydCBgZ2l0LWFyY2hpbXBvcnRgIGV4cGVjdHMgdG8gZmluZCBpdHNlbGYgaW4gYW4gZW1wdHkgCitkaXJlY3RvcnkuIFRvIGZvbGxvdyB0aGUgZGV2ZWxvcG1lbnQgb2YgYSBwcm9qZWN0IHRoYXQgdXNlcyBBcmNoLCByZXJ1biAKK2BnaXQtYXJjaGltcG9ydGAgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBpbml0aWFsIGltcG9ydCB0byBwZXJmb3JtIAoraW5jcmVtZW50YWwgaW1wb3J0cy4KKworTUVSR0VTCistLS0tLS0KK1BhdGNoIG1lcmdlIGRhdGEgZnJvbSBBcmNoIGlzIHVzZWQgdG8gbWFyayBtZXJnZXMgaW4gZ2l0IGFzIHdlbGwuIGdpdCAKK2RvZXMgbm90IGNhcmUgbXVjaCBhYm91dCB0cmFja2luZyBwYXRjaGVzLCBhbmQgb25seSBjb25zaWRlcnMgYSBtZXJnZSB3aGVuIGEKK2JyYW5jaCBpbmNvcnBvcmF0ZXMgYWxsIHRoZSBjb21taXRzIHNpbmNlIHRoZSBwb2ludCB0aGV5IGZvcmtlZC4gVGhlIGVuZCByZXN1bHQKK2lzIHRoYXQgZ2l0IHdpbGwgaGF2ZSBhIGdvb2QgaWRlYSBvZiBob3cgZmFyIGJyYW5jaGVzIGhhdmUgZGl2ZXJnZWQuIFNvIHRoZSAKK2ltcG9ydCBwcm9jZXNzIGRvZXMgbG9zZSBzb21lIHBhdGNoLXRyYWRpbmcgbWV0YWRhdGEuCisKK0ZvcnR1bmF0ZWx5LCB3aGVuIHlvdSB0cnkgYW5kIG1lcmdlIGJyYW5jaGVzIGltcG9ydGVkIGZyb20gQXJjaCwgCitnaXQgd2lsbCBmaW5kIGEgZ29vZCBtZXJnZSBiYXNlLCBhbmQgaXQgaGFzIGEgZ29vZCBjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgCitwYXRjaGVzIHRoYXQgaGF2ZSBiZWVuIHRyYWRlZCBvdXQtb2Ytc2VxdWVuY2UgYmV0d2VlbiB0aGUgYnJhbmNoZXMuIAorCitPUFRJT05TCistLS0tLS0tCisKKy1oOjoKKwlEaXNwbGF5IHVzYWdlLgorCistdjo6CisJVmVyYm9zZSBvdXRwdXQuIAorCistVDo6CisJTWFueSB0YWdzLiBXaWxsIGNyZWF0ZSBhIHRhZyBmb3IgZXZlcnkgY29tbWl0LCByZWZsZWN0aW5nIHRoZSBjb21taXQgCisJbmFtZSBpbiB0aGUgQXJjaCByZXBvc2l0b3J5LgorCistZjo6CisJVXNlIHRoZSBmYXN0IHBhdGNoc2V0IGltcG9ydCBzdHJhdGVneS4gIFRoaXMgY2FuIGJlIHNpZ25pZmljYW50bHkKKwlmYXN0ZXIgZm9yIGxhcmdlIHRyZWVzLCBidXQgY2Fubm90IGhhbmRsZSBkaXJlY3RvcnkgcmVuYW1lcyBvcgorCXBlcm1pc3Npb25zIGNoYW5nZXMuICBUaGUgZGVmYXVsdCBzdHJhdGVneSBpcyBzbG93IGFuZCBzYWZlLgorCistbzo6CisJVXNlIHRoaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQtc3R5bGUgYnJhbmNoIG5hbWVzIHVzZWQgYnkKKwllYXJsaWVyIHZlcnNpb25zIG9mIGdpdC1hcmNoaW1wb3J0LiAgT2xkLXN0eWxlIGJyYW5jaCBuYW1lcworCXdlcmUgY2F0ZWdvcnktLWJyYW5jaCwgd2hlcmVhcyBuZXctc3R5bGUgYnJhbmNoIG5hbWVzIGFyZQorCWFyY2hpdmUsY2F0ZWdvcnktLWJyYW5jaC0tdmVyc2lvbi4KKworLUQgPGRlcHRoPjo6CisJRm9sbG93IG1lcmdlIGFuY2VzdHJ5IGFuZCBhdHRlbXB0IHRvIGltcG9ydCB0cmVlcyB0aGF0IGhhdmUgYmVlbgorCW1lcmdlZCBmcm9tLiAgU3BlY2lmeSBhIGRlcHRoIGdyZWF0ZXIgdGhhbiAxIGlmIHBhdGNoIGxvZ3MgaGF2ZSBiZWVuCisJcHJ1bmVkLgorCistYTo6CisJQXR0ZW1wdCB0byBhdXRvLXJlZ2lzdGVyIGFyY2hpdmVzIGF0IGh0dHA6Ly9taXJyb3JzLnNvdXJjZWNvbnRyb2wubmV0CisJVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggdGhlIC1EIG9wdGlvbi4KKworLXQgPHRtcGRpcj46OgorCU92ZXJyaWRlIHRoZSBkZWZhdWx0IHRlbXBkaXIuCisKKworPGFyY2hpdmUvYnJhbmNoPjo6CisJQXJjaGl2ZS9icmFuY2ggaWRlbnRpZmllciBpbiBhIGZvcm1hdCB0aGF0IGB0bGEgbG9nYCB1bmRlcnN0YW5kcy4gCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56Pi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8sIE1hcnRpbiBMYW5naG9mZiBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWJpc2VjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1iaXNlY3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNGI0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1iaXNlY3QudHh0CkBAIC0wLDAgKzEsMTM2IEBACitnaXQtYmlzZWN0KDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1iaXNlY3QgLSBGaW5kIHRoZSBjaGFuZ2UgdGhhdCBpbnRyb2R1Y2VkIGEgYnVnCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0IGJpc2VjdCcgPHN1YmNvbW1hbmQ+IDxvcHRpb25zPiAKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGUgY29tbWFuZCB0YWtlcyB2YXJpb3VzIHN1YmNvbW1hbmRzLCBhbmQgZGlmZmVyZW50IG9wdGlvbnMKK2RlcGVuZGluZyBvbiB0aGUgc3ViY29tbWFuZDoKKworIGdpdCBiaXNlY3Qgc3RhcnQgWzxwYXRocz4uLi5dCisgZ2l0IGJpc2VjdCBiYWQgPHJldj4KKyBnaXQgYmlzZWN0IGdvb2QgPHJldj4KKyBnaXQgYmlzZWN0IHJlc2V0IFs8YnJhbmNoPl0KKyBnaXQgYmlzZWN0IHZpc3VhbGl6ZQorIGdpdCBiaXNlY3QgcmVwbGF5IDxsb2dmaWxlPgorIGdpdCBiaXNlY3QgbG9nCisKK1RoaXMgY29tbWFuZCB1c2VzICdnaXQtcmV2LWxpc3QgLS1iaXNlY3QnIG9wdGlvbiB0byBoZWxwIGRyaXZlCit0aGUgYmluYXJ5IHNlYXJjaCBwcm9jZXNzIHRvIGZpbmQgd2hpY2ggY2hhbmdlIGludHJvZHVjZWQgYSBidWcsCitnaXZlbiBhbiBvbGQgImdvb2QiIGNvbW1pdCBvYmplY3QgbmFtZSBhbmQgYSBsYXRlciAiYmFkIiBjb21taXQKK29iamVjdCBuYW1lLgorCitUaGUgd2F5IHlvdSB1c2UgaXQgaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHN0YXJ0CiskIGdpdCBiaXNlY3QgYmFkCQkJIyBDdXJyZW50IHZlcnNpb24gaXMgYmFkCiskIGdpdCBiaXNlY3QgZ29vZCB2Mi42LjEzLXJjMgkJIyB2Mi42LjEzLXJjMiB3YXMgdGhlIGxhc3QgdmVyc2lvbgorCQkJCQkjIHRlc3RlZCB0aGF0IHdhcyBnb29kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB5b3UgZ2l2ZSBhdCBsZWFzdCBvbmUgYmFkIGFuZCBvbmUgZ29vZCB2ZXJzaW9ucywgaXQgd2lsbAorYmlzZWN0IHRoZSByZXZpc2lvbiB0cmVlIGFuZCBzYXkgc29tZXRoaW5nIGxpa2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQmlzZWN0aW5nOiA2NzUgcmV2aXNpb25zIGxlZnQgdG8gdGVzdCBhZnRlciB0aGlzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGNoZWNrIG91dCB0aGUgc3RhdGUgaW4gdGhlIG1pZGRsZS4gTm93LCBjb21waWxlIHRoYXQga2VybmVsLCBhbmQgYm9vdAoraXQuIE5vdywgbGV0J3Mgc2F5IHRoYXQgdGhpcyBib290ZWQga2VybmVsIHdvcmtzIGZpbmUsIHRoZW4ganVzdCBkbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBnb29kCQkJIyB0aGlzIG9uZSBpcyBnb29kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBub3cgc2F5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQmlzZWN0aW5nOiAzMzcgcmV2aXNpb25zIGxlZnQgdG8gdGVzdCBhZnRlciB0aGlzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHlvdSBjb250aW51ZSBhbG9uZywgY29tcGlsaW5nIHRoYXQgb25lLCB0ZXN0aW5nIGl0LCBhbmQgZGVwZW5kaW5nIG9uCit3aGV0aGVyIGl0IGlzIGdvb2Qgb3IgYmFkLCB5b3Ugc2F5ICJnaXQgYmlzZWN0IGdvb2QiIG9yICJnaXQgYmlzZWN0IGJhZCIsCithbmQgYXNrIGZvciB0aGUgbmV4dCBiaXNlY3Rpb24uCisKK1VudGlsIHlvdSBoYXZlIG5vIG1vcmUgbGVmdCwgYW5kIHlvdSdsbCBoYXZlIGJlZW4gbGVmdCB3aXRoIHRoZSBmaXJzdCBiYWQKK2tlcm5lbCByZXYgaW4gInJlZnMvYmlzZWN0L2JhZCIuCisKK09oLCBhbmQgdGhlbiBhZnRlciB5b3Ugd2FudCB0byByZXNldCB0byB0aGUgb3JpZ2luYWwgaGVhZCwgZG8gYQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCByZXNldAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIGdldCBiYWNrIHRvIHRoZSBtYXN0ZXIgYnJhbmNoLCBpbnN0ZWFkIG9mIGJlaW5nIGluIG9uZSBvZiB0aGUgYmlzZWN0aW9uCiticmFuY2hlcyAoImdpdCBiaXNlY3Qgc3RhcnQiIHdpbGwgZG8gdGhhdCBmb3IgeW91IHRvbywgYWN0dWFsbHk6IGl0IHdpbGwKK3Jlc2V0IHRoZSBiaXNlY3Rpb24gc3RhdGUsIGFuZCBiZWZvcmUgaXQgZG9lcyB0aGF0IGl0IGNoZWNrcyB0aGF0IHlvdSdyZQorbm90IHVzaW5nIHNvbWUgb2xkIGJpc2VjdGlvbiBicmFuY2gpLgorCitEdXJpbmcgdGhlIGJpc2VjdGlvbiBwcm9jZXNzLCB5b3UgY2FuIHNheQorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCB2aXN1YWxpemUKKy0tLS0tLS0tLS0tLQorCit0byBzZWUgdGhlIGN1cnJlbnRseSByZW1haW5pbmcgc3VzcGVjdHMgaW4gYGdpdGtgLgorCitUaGUgZ29vZC9iYWQgaW5wdXQgaXMgbG9nZ2VkLCBhbmQgYGdpdCBiaXNlY3QKK2xvZ2Agc2hvd3Mgd2hhdCB5b3UgaGF2ZSBkb25lIHNvIGZhci4gIFlvdSBjYW4gdHJ1bmNhdGUgaXRzCitvdXRwdXQgc29tZXdoZXJlIGFuZCBzYXZlIGl0IGluIGEgZmlsZSwgYW5kIHJ1bgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCByZXBsYXkgdGhhdC1maWxlCistLS0tLS0tLS0tLS0KKworaWYgeW91IGZpbmQgbGF0ZXIgeW91IG1hZGUgYSBtaXN0YWtlIHRlbGxpbmcgZ29vZC9iYWQgYWJvdXQgYQorcmV2aXNpb24uCisKK0lmIGluIGEgbWlkZGxlIG9mIGJpc2VjdCBzZXNzaW9uLCB5b3Uga25vdyB3aGF0IHRoZSBiaXNlY3QKK3N1Z2dlc3RlZCB0byB0cnkgbmV4dCBpcyBub3QgYSBnb29kIG9uZSB0byB0ZXN0IChlLmcuIHRoZSBjaGFuZ2UKK3RoZSBjb21taXQgaW50cm9kdWNlcyBpcyBrbm93biBub3QgdG8gd29yayBpbiB5b3VyIGVudmlyb25tZW50CithbmQgeW91IGtub3cgaXQgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSBidWcgeW91CithcmUgY2hhc2luZyksIHlvdSBtYXkgd2FudCB0byBmaW5kIGEgbmVhci1ieSBjb21taXQgYW5kIHRyeSB0aGF0CitpbnN0ZWFkLiAgSXQgZ29lcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBnb29kL2JhZAkJCSMgcHJldmlvdXMgcm91bmQgd2FzIGdvb2QvYmFkLgorQmlzZWN0aW5nOiAzMzcgcmV2aXNpb25zIGxlZnQgdG8gdGVzdCBhZnRlciB0aGlzCiskIGdpdCBiaXNlY3QgdmlzdWFsaXplCQkJIyBvb3BzLCB0aGF0IGlzIHVuaW50ZXJlc3RpbmcuCiskIGdpdCByZXNldCAtLWhhcmQgSEVBRH4zCQkjIHRyeSAzIHJldnMgYmVmb3JlIHdoYXQKKwkJCQkJIyB3YXMgc3VnZ2VzdGVkCistLS0tLS0tLS0tLS0KKworVGhlbiBjb21waWxlIGFuZCB0ZXN0IHRoZSBvbmUgeW91IGNob3NlIHRvIHRyeS4gIEFmdGVyIHRoYXQsCit0ZWxsIGJpc2VjdCB3aGF0IHRoZSByZXN1bHQgd2FzIGFzIHVzdWFsLgorCitZb3UgY2FuIGZ1cnRoZXIgY3V0IGRvd24gdGhlIG51bWJlciBvZiB0cmlhbHMgaWYgeW91IGtub3cgd2hhdAorcGFydCBvZiB0aGUgdHJlZSBpcyBpbnZvbHZlZCBpbiB0aGUgcHJvYmxlbSB5b3UgYXJlIHRyYWNraW5nCitkb3duLCBieSBnaXZpbmcgcGF0aHMgcGFyYW1ldGVycyB3aGVuIHlvdSBzYXkgYGJpc2VjdCBzdGFydGAsCitsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHN0YXJ0IGFyY2gvaTM4NiBpbmNsdWRlL2FzbS1pMzg2CistLS0tLS0tLS0tLS0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ibGFtZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ibGFtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExZmEwMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWJsYW1lLnR4dApAQCAtMCwwICsxLDQyIEBACitnaXQtYmxhbWUoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYmxhbWUgLSBCbGFtZSBmaWxlIGxpbmVzIG9uIGNvbW1pdHMKKworU1lOT1BTSVMKKy0tLS0tLS0tCitnaXQtYmxhbWUgZmlsZSBbb3B0aW9uc10gZmlsZSBbcmV2aXNpb25dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQW5ub3RhdGVzIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZmlsZSB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbW1pdAord2hpY2ggaW50cm9kdWNlZCB0aGUgbGluZS4gU3RhcnQgYW5ub3RhdGlvbiBmcm9tIHRoZSBnaXZlbiByZXZpc2lvbi4KKworT1BUSU9OUworLS0tLS0tLQorLWMsIC0tY29tcGF0aWJpbGl0eTo6CisJVXNlIHRoZSBzYW1lIG91dHB1dCBtb2RlIGFzIGdpdC1hbm5vdGF0ZSAoRGVmYXVsdDogb2ZmKS4KKworLWwsIC0tbG9uZzo6CisJU2hvdyBsb25nIHJldiAoRGVmYXVsdHMgb2ZmKS4KKworLVMsIC0tcmV2LWZpbGUgPHJldnMtZmlsZT46OgorCVVzZSByZXZzIGZyb20gcmV2cy1maWxlIGluc3RlYWQgb2YgY2FsbGluZyBnaXQtcmV2LWxpc3QuCisKKy1oLCAtLWhlbHA6OgorCVNob3cgaGVscCBtZXNzYWdlLgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtYW5ub3RhdGVbMV0KKworQVVUSE9SCistLS0tLS0KK1dyaXR0ZW4gYnkgRnJlZHJpayBLdWl2aW5lbiA8ZnJla3UwNDVAc3R1ZGVudC5saXUuc2U+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWJyYW5jaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1icmFuY2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2VmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1icmFuY2gudHh0CkBAIC0wLDAgKzEsMTA5IEBACitnaXQtYnJhbmNoKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1icmFuY2ggLSBMaXN0LCBjcmVhdGUsIG9yIGRlbGV0ZSBicmFuY2hlcy4KKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWJyYW5jaCcgWy1yXQorJ2dpdC1icmFuY2gnIFstbF0gWy1mXSA8YnJhbmNobmFtZT4gWzxzdGFydC1wb2ludD5dCisnZ2l0LWJyYW5jaCcgKC1kIHwgLUQpIDxicmFuY2huYW1lPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1dpdGggbm8gYXJndW1lbnRzIGdpdmVuIChvciBqdXN0IGAtcmApIGEgbGlzdCBvZiBhdmFpbGFibGUgYnJhbmNoZXMKK3dpbGwgYmUgc2hvd24sIHRoZSBjdXJyZW50IGJyYW5jaCB3aWxsIGJlIGhpZ2hsaWdodGVkIHdpdGggYW4gYXN0ZXJpc2suCisKK0luIGl0cyBzZWNvbmQgZm9ybSwgYSBuZXcgYnJhbmNoIG5hbWVkIDxicmFuY2huYW1lPiB3aWxsIGJlIGNyZWF0ZWQuCitJdCB3aWxsIHN0YXJ0IG91dCB3aXRoIGEgaGVhZCBlcXVhbCB0byB0aGUgb25lIGdpdmVuIGFzIDxzdGFydC1wb2ludD4uCitJZiBubyA8c3RhcnQtcG9pbnQ+IGlzIGdpdmVuLCB0aGUgYnJhbmNoIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgaGVhZAorZXF1YWwgdG8gdGhhdCBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgb3V0IGJyYW5jaC4KKworV2l0aCBhIGAtZGAgb3IgYC1EYCBvcHRpb24sIGA8YnJhbmNobmFtZT5gIHdpbGwgYmUgZGVsZXRlZC4gIFlvdSBtYXkKK3NwZWNpZnkgbW9yZSB0aGFuIG9uZSBicmFuY2ggZm9yIGRlbGV0aW9uLiAgSWYgdGhlIGJyYW5jaCBjdXJyZW50bHkKK2hhcyBhIHJlZiBsb2cgdGhlbiB0aGUgcmVmIGxvZyB3aWxsIGFsc28gYmUgZGVsZXRlZC4KKworCitPUFRJT05TCistLS0tLS0tCistZDo6CisJRGVsZXRlIGEgYnJhbmNoLiBUaGUgYnJhbmNoIG11c3QgYmUgZnVsbHkgbWVyZ2VkLgorCistRDo6CisJRGVsZXRlIGEgYnJhbmNoIGlycmVzcGVjdGl2ZSBvZiBpdHMgaW5kZXggc3RhdHVzLgorCistbDo6CisJQ3JlYXRlIHRoZSBicmFuY2gncyByZWYgbG9nLiAgVGhpcyBhY3RpdmF0ZXMgcmVjb3JkaW5nIG9mCisJYWxsIGNoYW5nZXMgdG8gbWFkZSB0aGUgYnJhbmNoIHJlZiwgZW5hYmxpbmcgdXNlIG9mIGRhdGUKKwliYXNlZCBzaGExIGV4cHJlc3Npb25zIHN1Y2ggYXMgIjxicmFuY2huYW1lPkB7eWVzdGVyZGF5fSIuCisKKy1mOjoKKwlGb3JjZSB0aGUgY3JlYXRpb24gb2YgYSBuZXcgYnJhbmNoIGV2ZW4gaWYgaXQgbWVhbnMgZGVsZXRpbmcKKwlhIGJyYW5jaCB0aGF0IGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUgbmFtZS4KKworLXI6OgorCUxpc3Qgb25seSB0aGUgInJlbW90ZSIgYnJhbmNoZXMuCisKKzxicmFuY2huYW1lPjo6CisJVGhlIG5hbWUgb2YgdGhlIGJyYW5jaCB0byBjcmVhdGUgb3IgZGVsZXRlLgorCVRoZSBuZXcgYnJhbmNoIG5hbWUgbXVzdCBwYXNzIGFsbCBjaGVja3MgZGVmaW5lZCBieQorCWdpdGxpbms6Z2l0LWNoZWNrLXJlZi1mb3JtYXRbMV0uICBTb21lIG9mIHRoZXNlIGNoZWNrcworCW1heSByZXN0cmljdCB0aGUgY2hhcmFjdGVycyBhbGxvd2VkIGluIGEgYnJhbmNoIG5hbWUuCisKKzxzdGFydC1wb2ludD46OgorCVRoZSBuZXcgYnJhbmNoIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgSEVBRCBlcXVhbCB0byB0aGlzLiAgSXQgbWF5CisJYmUgZ2l2ZW4gYXMgYSBicmFuY2ggbmFtZSwgYSBjb21taXQtaWQsIG9yIGEgdGFnLiAgSWYgdGhpcyBvcHRpb24KKwlpcyBvbWl0dGVkLCB0aGUgY3VycmVudCBicmFuY2ggaXMgYXNzdW1lZC4KKworCisKK0V4YW1wbGVzCistLS0tLS0tLQorCitTdGFydCBkZXZlbG9wbWVudCBvZmYgb2YgYSBrbm93biB0YWc6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtLy4uLi9saW51eC0yLjYgbXkyLjYKKyQgY2QgbXkyLjYKKyQgZ2l0IGJyYW5jaCBteTIuNi4xNCB2Mi42LjE0ICAgPDE+CiskIGdpdCBjaGVja291dCBteTIuNi4xNAorLS0tLS0tLS0tLS0tCisrCis8MT4gVGhpcyBzdGVwIGFuZCB0aGUgbmV4dCBvbmUgY291bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBzdGVwIHdpdGgKKyJjaGVja291dCAtYiBteTIuNi4xNCB2Mi42LjE0Ii4KKworRGVsZXRlIHVubmVlZGVkIGJyYW5jaDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnLy4uLi9naXQuZ2l0IG15LmdpdAorJCBjZCBteS5naXQKKyQgZ2l0IGJyYW5jaCAtRCB0b2RvICAgIDwxPgorLS0tLS0tLS0tLS0tCisrCis8MT4gZGVsZXRlIHRvZG8gYnJhbmNoIGV2ZW4gaWYgdGhlICJtYXN0ZXIiIGJyYW5jaCBkb2VzIG5vdCBoYXZlIGFsbAorY29tbWl0cyBmcm9tIHRvZG8gYnJhbmNoLgorCisKK05vdGVzCistLS0tLQorCitJZiB5b3UgYXJlIGNyZWF0aW5nIGEgYnJhbmNoIHRoYXQgeW91IHdhbnQgdG8gaW1tZWRpYXRlbHkgY2hlY2tvdXQsIGl0J3MKK2Vhc2llciB0byB1c2UgdGhlIGdpdCBjaGVja291dCBjb21tYW5kIHdpdGggaXRzIGAtYmAgb3B0aW9uIHRvIGNyZWF0ZQorYSBicmFuY2ggYW5kIGNoZWNrIGl0IG91dCB3aXRoIGEgc2luZ2xlIGNvbW1hbmQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNhdC1maWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNhdC1maWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTljYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2F0LWZpbGUudHh0CkBAIC0wLDAgKzEsNzIgQEAKK2dpdC1jYXQtZmlsZSgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jYXQtZmlsZSAtIFByb3ZpZGUgY29udGVudCBvciB0eXBlIGluZm9ybWF0aW9uIGZvciByZXBvc2l0b3J5IG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY2F0LWZpbGUnIFstdCB8IC1zIHwgLWUgfCAtcCB8IDx0eXBlPl0gPG9iamVjdD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitQcm92aWRlcyBjb250ZW50IG9yIHR5cGUgb2Ygb2JqZWN0cyBpbiB0aGUgcmVwb3NpdG9yeS4gVGhlIHR5cGUKK2lzIHJlcXVpcmVkIHVubGVzcyAnLXQnIG9yICctcCcgaXMgdXNlZCB0byBmaW5kIHRoZSBvYmplY3QgdHlwZSwKK29yICctcycgaXMgdXNlZCB0byBmaW5kIHRoZSBvYmplY3Qgc2l6ZS4KKworT1BUSU9OUworLS0tLS0tLQorPG9iamVjdD46OgorCVRoZSBzaGExIGlkZW50aWZpZXIgb2YgdGhlIG9iamVjdC4KKworLXQ6OgorCUluc3RlYWQgb2YgdGhlIGNvbnRlbnQsIHNob3cgdGhlIG9iamVjdCB0eXBlIGlkZW50aWZpZWQgYnkKKwk8b2JqZWN0Pi4KKworLXM6OgorCUluc3RlYWQgb2YgdGhlIGNvbnRlbnQsIHNob3cgdGhlIG9iamVjdCBzaXplIGlkZW50aWZpZWQgYnkKKwk8b2JqZWN0Pi4KKworLWU6OgorCVN1cHByZXNzIGFsbCBvdXRwdXQ7IGluc3RlYWQgZXhpdCB3aXRoIHplcm8gc3RhdHVzIGlmIDxvYmplY3Q+CisJZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG9iamVjdC4KKworLXA6OgorCVByZXR0eS1wcmludCB0aGUgY29udGVudHMgb2YgPG9iamVjdD4gYmFzZWQgb24gaXRzIHR5cGUuCisKKzx0eXBlPjo6CisJVHlwaWNhbGx5IHRoaXMgbWF0Y2hlcyB0aGUgcmVhbCB0eXBlIG9mIDxvYmplY3Q+IGJ1dCBhc2tpbmcKKwlmb3IgYSB0eXBlIHRoYXQgY2FuIHRyaXZpYWxseSBiZSBkZXJlZmVyZW5jZWQgZnJvbSB0aGUgZ2l2ZW4KKwk8b2JqZWN0PiBpcyBhbHNvIHBlcm1pdHRlZC4gIEFuIGV4YW1wbGUgaXMgdG8gYXNrIGZvciBhCisJInRyZWUiIHdpdGggPG9iamVjdD4gYmVpbmcgYSBjb21taXQgb2JqZWN0IHRoYXQgY29udGFpbnMgaXQsCisJb3IgdG8gYXNrIGZvciBhICJibG9iIiB3aXRoIDxvYmplY3Q+IGJlaW5nIGEgdGFnIG9iamVjdCB0aGF0CisJcG9pbnRzIGF0IGl0LgorCitPVVRQVVQKKy0tLS0tLQorSWYgJy10JyBpcyBzcGVjaWZpZWQsIG9uZSBvZiB0aGUgPHR5cGU+LgorCitJZiAnLXMnIGlzIHNwZWNpZmllZCwgdGhlIHNpemUgb2YgdGhlIDxvYmplY3Q+IGluIGJ5dGVzLgorCitJZiAnLWUnIGlzIHNwZWNpZmllZCwgbm8gb3V0cHV0LgorCitJZiAnLXAnIGlzIHNwZWNpZmllZCwgdGhlIGNvbnRlbnRzIG9mIDxvYmplY3Q+IGFyZSBwcmV0dHktcHJpbnRlZC4KKworT3RoZXJ3aXNlIHRoZSByYXcgKHRob3VnaCB1bmNvbXByZXNzZWQpIGNvbnRlbnRzIG9mIHRoZSA8b2JqZWN0PiB3aWxsCitiZSByZXR1cm5lZC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVjay1yZWYtZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E1ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQKQEAgLTAsMCArMSw1NSBAQAorZ2l0LWNoZWNrLXJlZi1mb3JtYXQoMSkKKz09PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaGVjay1yZWYtZm9ybWF0IC0gTWFrZSBzdXJlIHJlZiBuYW1lIGlzIHdlbGwgZm9ybWVkCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVjay1yZWYtZm9ybWF0JyA8cmVmbmFtZT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDaGVja3MgaWYgYSBnaXZlbiAncmVmbmFtZScgaXMgYWNjZXB0YWJsZSwgYW5kIGV4aXRzIG5vbi16ZXJvIGlmCitpdCBpcyBub3QuCisKK0EgcmVmZXJlbmNlIGlzIHVzZWQgaW4gZ2l0IHRvIHNwZWNpZnkgYnJhbmNoZXMgYW5kIHRhZ3MuICBBCiticmFuY2ggaGVhZCBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvaGVhZHNgIGRpcmVjdG9yeSwgYW5kCithIHRhZyBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvdGFnc2AgZGlyZWN0b3J5LiAgZ2l0CitpbXBvc2VzIHRoZSBmb2xsb3dpbmcgcnVsZXMgb24gaG93IHJlZnMgYXJlIG5hbWVkOgorCisuIEl0IGNhbiBpbmNsdWRlIHNsYXNoIGAvYCBmb3IgaGllcmFyY2hpY2FsIChkaXJlY3RvcnkpCisgIGdyb3VwaW5nLCBidXQgbm8gc2xhc2gtc2VwYXJhdGVkIGNvbXBvbmVudCBjYW4gYmVnaW4gd2l0aCBhCisgIGRvdCBgLmA7CisKKy4gSXQgY2Fubm90IGhhdmUgdHdvIGNvbnNlY3V0aXZlIGRvdHMgYC4uYCBhbnl3aGVyZTsKKworLiBJdCBjYW5ub3QgaGF2ZSBBU0NJSSBjb250cm9sIGNoYXJhY3RlciAoaS5lLiBieXRlcyB3aG9zZQorICB2YWx1ZXMgYXJlIGxvd2VyIHRoYW4gXDA0MCwgb3IgXDE3NyBgREVMYCksIHNwYWNlLCB0aWxkZSBgfmAsCisgIGNhcmV0IGB7Y2FyZXR9YCwgY29sb24gYDpgLCBxdWVzdGlvbi1tYXJrIGA/YCwgYXN0ZXJpc2sgYCpgLAorICBvciBvcGVuIGJyYWNrZXQgYFtgIGFueXdoZXJlOworCisuIEl0IGNhbm5vdCBlbmQgd2l0aCBhIHNsYXNoIGAvYC4KKworVGhlc2UgcnVsZXMgbWFrZXMgaXQgZWFzeSBmb3Igc2hlbGwgc2NyaXB0IGJhc2VkIHRvb2xzIHRvIHBhcnNlCityZWZuYW1lcywgcGF0aG5hbWUgZXhwYW5zaW9uIGJ5IHRoZSBzaGVsbCB3aGVuIGEgcmVmbmFtZSBpcyB1c2VkCit1bnF1b3RlZCAoYnkgbWlzdGFrZSksIGFuZCBhbHNvIGF2b2lkcyBhbWJpZ3VpdGllcyBpbiBjZXJ0YWluCityZWZuYW1lIGV4cHJlc3Npb25zIChzZWUgZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdKS4gIE5hbWVseToKKworLiBkb3VibGUtZG90IGAuLmAgYXJlIG9mdGVuIHVzZWQgYXMgaW4gYHJlZjEuLnJlZjJgLCBhbmQgaW4gc29tZQorICBjb250ZXh0IHRoaXMgbm90YXRpb24gbWVhbnMgYHtjYXJldH1yZWYxIHJlZjJgIChpLmUuIG5vdCBpbgorICByZWYxIGFuZCBpbiByZWYyKS4KKworLiB0aWxkZSBgfmAgYW5kIGNhcmV0IGB7Y2FyZXR9YCBhcmUgdXNlZCB0byBpbnRyb2R1Y2UgcG9zdGZpeAorICAnbnRoIHBhcmVudCcgYW5kICdwZWVsIG9uaW9uJyBvcGVyYXRpb24uCisKKy4gY29sb24gYDpgIGlzIHVzZWQgYXMgaW4gYHNyY3JlZjpkc3RyZWZgIHRvIG1lYW4gInVzZSBzcmNyZWZcJ3MKKyAgdmFsdWUgYW5kIHN0b3JlIGl0IGluIGRzdHJlZiIgaW4gZmV0Y2ggYW5kIHB1c2ggb3BlcmF0aW9ucy4KKyAgSXQgbWF5IGFsc28gYmUgdXNlZCB0byBzZWxlY3QgYSBzcGVjaWZpYyBvYmplY3Qgc3VjaCBhcyB3aXRoCisgIGdpdGxpbms6Z2l0LWNhdC1maWxlWzFdICJnaXQtY2F0LWZpbGUgYmxvYiB2MS4zLjM6cmVmcy5jIi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVjMTczCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2tvdXQtaW5kZXgudHh0CkBAIC0wLDAgKzEsMTg1IEBACitnaXQtY2hlY2tvdXQtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlY2tvdXQtaW5kZXggLSBDb3B5IGZpbGVzIGZyb20gdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jaGVja291dC1pbmRleCcgWy11XSBbLXFdIFstYV0gWy1mXSBbLW5dIFstLXByZWZpeD08c3RyaW5nPl0KKwkJICAgWy0tc3RhZ2U9PG51bWJlcj58YWxsXQorCQkgICBbLS10ZW1wXQorCQkgICBbLXpdIFstLXN0ZGluXQorCQkgICBbLS1dIFs8ZmlsZT5dXCoKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitXaWxsIGNvcHkgYWxsIGZpbGVzIGxpc3RlZCBmcm9tIHRoZSBpbmRleCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkKKyhub3Qgb3ZlcndyaXRpbmcgZXhpc3RpbmcgZmlsZXMpLgorCitPUFRJT05TCistLS0tLS0tCistdXwtLWluZGV4OjoKKwl1cGRhdGUgc3RhdCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNoZWNrZWQgb3V0IGVudHJpZXMgaW4KKwl0aGUgaW5kZXggZmlsZS4KKworLXF8LS1xdWlldDo6CisJYmUgcXVpZXQgaWYgZmlsZXMgZXhpc3Qgb3IgYXJlIG5vdCBpbiB0aGUgaW5kZXgKKworLWZ8LS1mb3JjZTo6CisJZm9yY2VzIG92ZXJ3cml0ZSBvZiBleGlzdGluZyBmaWxlcworCistYXwtLWFsbDo6CisJY2hlY2tzIG91dCBhbGwgZmlsZXMgaW4gdGhlIGluZGV4LiAgQ2Fubm90IGJlIHVzZWQKKwl0b2dldGhlciB3aXRoIGV4cGxpY2l0IGZpbGVuYW1lcy4KKworLW58LS1uby1jcmVhdGU6OgorCURvbid0IGNoZWNrb3V0IG5ldyBmaWxlcywgb25seSByZWZyZXNoIGZpbGVzIGFscmVhZHkgY2hlY2tlZAorCW91dC4KKworLS1wcmVmaXg9PHN0cmluZz46OgorCVdoZW4gY3JlYXRpbmcgZmlsZXMsIHByZXBlbmQgPHN0cmluZz4gKHVzdWFsbHkgYSBkaXJlY3RvcnkKKwlpbmNsdWRpbmcgYSB0cmFpbGluZyAvKQorCistLXN0YWdlPTxudW1iZXI+fGFsbDo6CisJSW5zdGVhZCBvZiBjaGVja2luZyBvdXQgdW5tZXJnZWQgZW50cmllcywgY29weSBvdXQgdGhlCisJZmlsZXMgZnJvbSBuYW1lZCBzdGFnZS4gIDxudW1iZXI+IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAzLgorCU5vdGU6IC0tc3RhZ2U9YWxsIGF1dG9tYXRpY2FsbHkgaW1wbGllcyAtLXRlbXAuCisKKy0tdGVtcDo6CisJSW5zdGVhZCBvZiBjb3B5aW5nIHRoZSBmaWxlcyB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkKKwl3cml0ZSB0aGUgY29udGVudCB0byB0ZW1wb3JhcnkgZmlsZXMuICBUaGUgdGVtcG9yYXJ5IG5hbWUKKwlhc3NvY2lhdGlvbnMgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZG91dC4KKworLS1zdGRpbjo6CisJSW5zdGVhZCBvZiB0YWtpbmcgbGlzdCBvZiBwYXRocyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCisJcmVhZCBsaXN0IG9mIHBhdGhzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LiAgUGF0aHMgYXJlCisJc2VwYXJhdGVkIGJ5IExGIChpLmUuIG9uZSBwYXRoIHBlciBsaW5lKSBieSBkZWZhdWx0LgorCistejo6CisJT25seSBtZWFuaW5nZnVsIHdpdGggYC0tc3RkaW5gOyBwYXRocyBhcmUgc2VwYXJhdGVkIHdpdGgKKwlOVUwgY2hhcmFjdGVyIGluc3RlYWQgb2YgTEYuCisKK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworVGhlIG9yZGVyIG9mIHRoZSBmbGFncyB1c2VkIHRvIG1hdHRlciwgYnV0IG5vdCBhbnltb3JlLgorCitKdXN0IGRvaW5nIGBnaXQtY2hlY2tvdXQtaW5kZXhgIGRvZXMgbm90aGluZy4gWW91IHByb2JhYmx5IG1lYW50CitgZ2l0LWNoZWNrb3V0LWluZGV4IC1hYC4gQW5kIGlmIHlvdSB3YW50IHRvIGZvcmNlIGl0LCB5b3Ugd2FudAorYGdpdC1jaGVja291dC1pbmRleCAtZiAtYWAuCisKK0ludHVpdGl2ZW5lc3MgaXMgbm90IHRoZSBnb2FsIGhlcmUuIFJlcGVhdGFiaWxpdHkgaXMuIFRoZSByZWFzb24gZm9yCit0aGUgIm5vIGFyZ3VtZW50cyBtZWFucyBubyB3b3JrIiBiZWhhdmlvciBpcyB0aGF0IGZyb20gc2NyaXB0cyB5b3UgYXJlCitzdXBwb3NlZCB0byBiZSBhYmxlIHRvIGRvOgorCistLS0tLS0tLS0tLS0tLS0tCiskIGZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgeGFyZ3MgLTAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgZm9yY2UgYWxsIGV4aXN0aW5nIGAqLmhgIGZpbGVzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlaXIKK2NhY2hlZCBjb3BpZXMuIElmIGFuIGVtcHR5IGNvbW1hbmQgbGluZSBpbXBsaWVkICJhbGwiLCB0aGVuIHRoaXMgd291bGQKK2ZvcmNlLXJlZnJlc2ggZXZlcnl0aGluZyBpbiB0aGUgaW5kZXgsIHdoaWNoIHdhcyBub3QgdGhlIHBvaW50LiAgQnV0CitzaW5jZSBnaXQtY2hlY2tvdXQtaW5kZXggYWNjZXB0cyAtLXN0ZGluIGl0IHdvdWxkIGJlIGZhc3RlciB0byB1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZmluZCAuIC1uYW1lICcqLmgnIC1wcmludDAgfCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXogLS1zdGRpbgorLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYC0tYCBpcyBqdXN0IGEgZ29vZCBpZGVhIHdoZW4geW91IGtub3cgdGhlIHJlc3Qgd2lsbCBiZSBmaWxlbmFtZXM7CitpdCB3aWxsIHByZXZlbnQgcHJvYmxlbXMgd2l0aCBhIGZpbGVuYW1lIG9mLCBmb3IgZXhhbXBsZSwgIGAtYWAuCitVc2luZyBgLS1gIGlzIHByb2JhYmx5IGEgZ29vZCBwb2xpY3kgaW4gc2NyaXB0cy4KKworCitVc2luZyAtLXRlbXAgb3IgLS1zdGFnZT1hbGwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2hlbiBgLS10ZW1wYCBpcyB1c2VkIChvciBpbXBsaWVkIGJ5IGAtLXN0YWdlPWFsbGApCitgZ2l0LWNoZWNrb3V0LWluZGV4YCB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciBlYWNoIGluZGV4CitlbnRyeSBiZWluZyBjaGVja2VkIG91dC4gIFRoZSBpbmRleCB3aWxsIG5vdCBiZSB1cGRhdGVkIHdpdGggc3RhdAoraW5mb3JtYXRpb24uICBUaGVzZSBvcHRpb25zIGNhbiBiZSB1c2VmdWwgaWYgdGhlIGNhbGxlciBuZWVkcyBhbGwKK3N0YWdlcyBvZiBhbGwgdW5tZXJnZWQgZW50cmllcyBzbyB0aGF0IHRoZSB1bm1lcmdlZCBmaWxlcyBjYW4gYmUKK3Byb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBtZXJnZSB0b29sLgorCitBIGxpc3Rpbmcgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZG91dCBwcm92aWRpbmcgdGhlIGFzc29jaWF0aW9uIG9mCit0ZW1wb3JhcnkgZmlsZSBuYW1lcyB0byB0cmFja2VkIHBhdGggbmFtZXMuICBUaGUgbGlzdGluZyBmb3JtYXQKK2hhcyB0d28gdmFyaWF0aW9uczoKKworICAgIC4gdGVtcG5hbWUgVEFCIHBhdGggUlMKKysKK1RoZSBmaXJzdCBmb3JtYXQgaXMgd2hhdCBnZXRzIHVzZWQgd2hlbiBgLS1zdGFnZWAgaXMgb21pdHRlZCBvcgoraXMgbm90IGAtLXN0YWdlPWFsbGAuIFRoZSBmaWVsZCB0ZW1wbmFtZSBpcyB0aGUgdGVtcG9yYXJ5IGZpbGUKK25hbWUgaG9sZGluZyB0aGUgZmlsZSBjb250ZW50IGFuZCBwYXRoIGlzIHRoZSB0cmFja2VkIHBhdGggbmFtZSBpbgordGhlIGluZGV4LiAgT25seSB0aGUgcmVxdWVzdGVkIGVudHJpZXMgYXJlIG91dHB1dC4KKworICAgIC4gc3RhZ2UxdGVtcCBTUCBzdGFnZTJ0ZW1wIFNQIHN0YWdlM3RtcCBUQUIgcGF0aCBSUworKworVGhlIHNlY29uZCBmb3JtYXQgaXMgd2hhdCBnZXRzIHVzZWQgd2hlbiBgLS1zdGFnZT1hbGxgLiAgVGhlIHRocmVlCitzdGFnZSB0ZW1wb3JhcnkgZmllbGRzIChzdGFnZTF0ZW1wLCBzdGFnZTJ0ZW1wLCBzdGFnZTN0ZW1wKSBsaXN0IHRoZQorbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaWYgdGhlcmUgaXMgYSBzdGFnZSBlbnRyeSBpbiB0aGUgaW5kZXgKK29yIGAuYCBpZiB0aGVyZSBpcyBubyBzdGFnZSBlbnRyeS4gIFBhdGhzIHdoaWNoIG9ubHkgaGF2ZSBhIHN0YWdlIDAKK2VudHJ5IHdpbGwgYWx3YXlzIGJlIG9taXR0ZWQgZnJvbSB0aGUgb3V0cHV0LgorCitJbiBib3RoIGZvcm1hdHMgUlMgKHRoZSByZWNvcmQgc2VwYXJhdG9yKSBpcyBuZXdsaW5lIGJ5IGRlZmF1bHQKK2J1dCB3aWxsIGJlIHRoZSBudWxsIGJ5dGUgaWYgLXogd2FzIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorVGhlIHRlbXBvcmFyeSBmaWxlIG5hbWVzIGFyZSBhbHdheXMgc2FmZSBzdHJpbmdzOyB0aGV5IHdpbGwgbmV2ZXIKK2NvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMgb3Igd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgVGhlIHBhdGgKK2ZpZWxkIGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoZSB0ZW1wb3JhcnkKK2ZpbGUgbmFtZXMgYXJlIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4KKworSWYgdGhlIG9iamVjdCBiZWluZyBjb3BpZWQgb3V0IHRvIGEgdGVtcG9yYXJ5IGZpbGUgaXMgYSBzeW1ib2xpYworbGluayB0aGUgY29udGVudCBvZiB0aGUgbGluayB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBub3JtYWwgZmlsZS4gIEl0IGlzCit1cCB0byB0aGUgZW5kLXVzZXIgb3IgdGhlIFBvcmNlbGFpbiB0byBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorVG8gdXBkYXRlIGFuZCByZWZyZXNoIG9ubHkgdGhlIGZpbGVzIGFscmVhZHkgY2hlY2tlZCBvdXQ6OgorKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2hlY2tvdXQtaW5kZXggLW4gLWYgLWEgJiYgZ2l0LXVwZGF0ZS1pbmRleCAtLWlnbm9yZS1taXNzaW5nIC0tcmVmcmVzaAorLS0tLS0tLS0tLS0tLS0tLQorCitVc2luZyBgZ2l0LWNoZWNrb3V0LWluZGV4YCB0byAiZXhwb3J0IGFuIGVudGlyZSB0cmVlIjo6CisJVGhlIHByZWZpeCBhYmlsaXR5IGJhc2ljYWxseSBtYWtlcyBpdCB0cml2aWFsIHRvIHVzZQorCWBnaXQtY2hlY2tvdXQtaW5kZXhgIGFzIGFuICJleHBvcnQgYXMgdHJlZSIgZnVuY3Rpb24uCisJSnVzdCByZWFkIHRoZSBkZXNpcmVkIHRyZWUgaW50byB0aGUgaW5kZXgsIGFuZCBkbzoKKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PWdpdC1leHBvcnQtZGlyLyAtYQorLS0tLS0tLS0tLS0tLS0tLQorKworYGdpdC1jaGVja291dC1pbmRleGAgd2lsbCAiZXhwb3J0IiB0aGUgaW5kZXggaW50byB0aGUgc3BlY2lmaWVkCitkaXJlY3RvcnkuCisrCitUaGUgZmluYWwgIi8iIGlzIGltcG9ydGFudC4gVGhlIGV4cG9ydGVkIG5hbWUgaXMgbGl0ZXJhbGx5IGp1c3QKK3ByZWZpeGVkIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuICBDb250cmFzdCB0aGlzIHdpdGggdGhlCitmb2xsb3dpbmcgZXhhbXBsZS4KKworRXhwb3J0IGZpbGVzIHdpdGggYSBwcmVmaXg6OgorKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9Lm1lcmdlZC0gTWFrZWZpbGUKKy0tLS0tLS0tLS0tLS0tLS0KKysKK1RoaXMgd2lsbCBjaGVjayBvdXQgdGhlIGN1cnJlbnRseSBjYWNoZWQgY29weSBvZiBgTWFrZWZpbGVgCitpbnRvIHRoZSBmaWxlIGAubWVyZ2VkLU1ha2VmaWxlYC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywKK0p1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaGVja291dC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVja291dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkYmFkYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LnR4dApAQCAtMCwwICsxLDE1NiBAQAorZ2l0LWNoZWNrb3V0KDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNoZWNrb3V0IC0gQ2hlY2tvdXQgYW5kIHN3aXRjaCB0byBhIGJyYW5jaAorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY2hlY2tvdXQnIFstZl0gWy1iIDxuZXdfYnJhbmNoPiBbLWxdXSBbLW1dIFs8YnJhbmNoPl0KKydnaXQtY2hlY2tvdXQnIFstbV0gWzxicmFuY2g+XSA8cGF0aHM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitXaGVuIDxwYXRocz4gYXJlIG5vdCBnaXZlbiwgdGhpcyBjb21tYW5kIHN3aXRjaGVzIGJyYW5jaGVzIGJ5Cit1cGRhdGluZyB0aGUgaW5kZXggYW5kIHdvcmtpbmcgdHJlZSB0byByZWZsZWN0IHRoZSBzcGVjaWZpZWQKK2JyYW5jaCwgPGJyYW5jaD4sIGFuZCB1cGRhdGluZyBIRUFEIHRvIGJlIDxicmFuY2g+IG9yLCBpZgorc3BlY2lmaWVkLCA8bmV3X2JyYW5jaD4uICBVc2luZyAtYiB3aWxsIGNhdXNlIDxuZXdfYnJhbmNoPiB0bworYmUgY3JlYXRlZC4KKworV2hlbiA8cGF0aHM+IGFyZSBnaXZlbiwgdGhpcyBjb21tYW5kIGRvZXMgKm5vdCogc3dpdGNoCiticmFuY2hlcy4gIEl0IHVwZGF0ZXMgdGhlIG5hbWVkIHBhdGhzIGluIHRoZSB3b3JraW5nIHRyZWUgZnJvbQordGhlIGluZGV4IGZpbGUgKGkuZS4gaXQgcnVucyBgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11YCkuICBJbgordGhpcyBjYXNlLCBgLWZgIGFuZCBgLWJgIG9wdGlvbnMgYXJlIG1lYW5pbmdsZXNzIGFuZCBnaXZpbmcKK2VpdGhlciBvZiB0aGVtIHJlc3VsdHMgaW4gYW4gZXJyb3IuICA8YnJhbmNoPiBhcmd1bWVudCBjYW4gYmUKK3VzZWQgdG8gc3BlY2lmeSBhIHNwZWNpZmljIHRyZWUtaXNoIHRvIHVwZGF0ZSB0aGUgaW5kZXggZm9yIHRoZQorZ2l2ZW4gcGF0aHMgYmVmb3JlIHVwZGF0aW5nIHRoZSB3b3JraW5nIHRyZWUuCisKKworT1BUSU9OUworLS0tLS0tLQorLWY6OgorCUZvcmNlIGEgcmUtcmVhZCBvZiBldmVyeXRoaW5nLgorCistYjo6CisJQ3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCA8bmV3X2JyYW5jaD4gYW5kIHN0YXJ0IGl0IGF0CisJPGJyYW5jaD4uICBUaGUgbmV3IGJyYW5jaCBuYW1lIG11c3QgcGFzcyBhbGwgY2hlY2tzIGRlZmluZWQKKwlieSBnaXRsaW5rOmdpdC1jaGVjay1yZWYtZm9ybWF0WzFdLiAgU29tZSBvZiB0aGVzZSBjaGVja3MKKwltYXkgcmVzdHJpY3QgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiBhIGJyYW5jaCBuYW1lLgorCistbDo6CisJQ3JlYXRlIHRoZSBuZXcgYnJhbmNoJ3MgcmVmIGxvZy4gIFRoaXMgYWN0aXZhdGVzIHJlY29yZGluZyBvZgorCWFsbCBjaGFuZ2VzIHRvIG1hZGUgdGhlIGJyYW5jaCByZWYsIGVuYWJsaW5nIHVzZSBvZiBkYXRlCisJYmFzZWQgc2hhMSBleHByZXNzaW9ucyBzdWNoIGFzICI8YnJhbmNobmFtZT5Ae3llc3RlcmRheX0iLgorCistbTo6CisJSWYgeW91IGhhdmUgbG9jYWwgbW9kaWZpY2F0aW9ucyB0byBvbmUgb3IgbW9yZSBmaWxlcyB0aGF0CisJYXJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBjdXJyZW50IGJyYW5jaCBhbmQgdGhlIGJyYW5jaCB0bworCXdoaWNoIHlvdSBhcmUgc3dpdGNoaW5nLCB0aGUgY29tbWFuZCByZWZ1c2VzIHRvIHN3aXRjaAorCWJyYW5jaGVzIGluIG9yZGVyIHRvIHByZXNlcnZlIHlvdXIgbW9kaWZpY2F0aW9ucyBpbiBjb250ZXh0LgorCUhvd2V2ZXIsIHdpdGggdGhpcyBvcHRpb24sIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gdGhlIGN1cnJlbnQKKwlicmFuY2gsIHlvdXIgd29ya2luZyB0cmVlIGNvbnRlbnRzLCBhbmQgdGhlIG5ldyBicmFuY2gKKwlpcyBkb25lLCBhbmQgeW91IHdpbGwgYmUgb24gdGhlIG5ldyBicmFuY2guCisrCitXaGVuIGEgbWVyZ2UgY29uZmxpY3QgaGFwcGVucywgdGhlIGluZGV4IGVudHJpZXMgZm9yIGNvbmZsaWN0aW5nCitwYXRocyBhcmUgbGVmdCB1bm1lcmdlZCwgYW5kIHlvdSBuZWVkIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0cworYW5kIG1hcmsgdGhlIHJlc29sdmVkIHBhdGhzIHdpdGggYGdpdCB1cGRhdGUtaW5kZXhgLgorCis8bmV3X2JyYW5jaD46OgorCU5hbWUgZm9yIHRoZSBuZXcgYnJhbmNoLgorCis8YnJhbmNoPjo6CisJQnJhbmNoIHRvIGNoZWNrb3V0OyBtYXkgYmUgYW55IG9iamVjdCBJRCB0aGF0IHJlc29sdmVzIHRvIGEKKwljb21taXQuIERlZmF1bHRzIHRvIEhFQUQuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKKy4gVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBjaGVja3Mgb3V0IHRoZSBgbWFzdGVyYCBicmFuY2gsIHJldmVydHMKK3RoZSBgTWFrZWZpbGVgIHRvIHR3byByZXZpc2lvbnMgYmFjaywgZGVsZXRlcyBoZWxsby5jIGJ5CittaXN0YWtlLCBhbmQgZ2V0cyBpdCBiYWNrIGZyb20gdGhlIGluZGV4LgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBtYXN0ZXIgICAgICAgICAgICAgPDE+CiskIGdpdCBjaGVja291dCBtYXN0ZXJ+MiBNYWtlZmlsZSAgPDI+CiskIHJtIC1mIGhlbGxvLmMKKyQgZ2l0IGNoZWNrb3V0IGhlbGxvLmMgICAgICAgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IHN3aXRjaCBicmFuY2gKKzwyPiB0YWtlIG91dCBhIGZpbGUgb3V0IG9mIG90aGVyIGNvbW1pdAorPDM+IHJlc3RvcmUgaGVsbG8uYyBmcm9tIEhFQUQgb2YgY3VycmVudCBicmFuY2gKKysKK0lmIHlvdSBoYXZlIGFuIHVuZm9ydHVuYXRlIGJyYW5jaCB0aGF0IGlzIG5hbWVkIGBoZWxsby5jYCwgdGhpcworc3RlcCB3b3VsZCBiZSBjb25mdXNlZCBhcyBhbiBpbnN0cnVjdGlvbiB0byBzd2l0Y2ggdG8gdGhhdCBicmFuY2guCitZb3Ugc2hvdWxkIGluc3RlYWQgd3JpdGU6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC0tIGhlbGxvLmMKKy0tLS0tLS0tLS0tLQorCisuIEFmdGVyIHdvcmtpbmcgaW4gYSB3cm9uZyBicmFuY2gsIHN3aXRjaGluZyB0byB0aGUgY29ycmVjdAorYnJhbmNoIHdvdWxkIGJlIGRvbmUgdXNpbmc6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15dG9waWMKKy0tLS0tLS0tLS0tLQorKworSG93ZXZlciwgeW91ciAid3JvbmciIGJyYW5jaCBhbmQgY29ycmVjdCAibXl0b3BpYyIgYnJhbmNoIG1heQorZGlmZmVyIGluIGZpbGVzIHRoYXQgeW91IGhhdmUgbG9jYWxseSBtb2RpZmllZCwgaW4gd2hpY2ggY2FzZSwKK3RoZSBhYm92ZSBjaGVja291dCB3b3VsZCBmYWlsIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXl0b3BpYworZmF0YWw6IEVudHJ5ICdmcm90eicgbm90IHVwdG9kYXRlLiBDYW5ub3QgbWVyZ2UuCistLS0tLS0tLS0tLS0KKysKK1lvdSBjYW4gZ2l2ZSB0aGUgYC1tYCBmbGFnIHRvIHRoZSBjb21tYW5kLCB3aGljaCB3b3VsZCB0cnkgYQordGhyZWUtd2F5IG1lcmdlOgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtbSBteXRvcGljCitBdXRvLW1lcmdpbmcgZnJvdHoKKy0tLS0tLS0tLS0tLQorKworQWZ0ZXIgdGhpcyB0aHJlZS13YXkgbWVyZ2UsIHRoZSBsb2NhbCBtb2RpZmljYXRpb25zIGFyZSBfbm90XworcmVnaXN0ZXJlZCBpbiB5b3VyIGluZGV4IGZpbGUsIHNvIGBnaXQgZGlmZmAgd291bGQgc2hvdyB5b3Ugd2hhdAorY2hhbmdlcyB5b3UgbWFkZSBzaW5jZSB0aGUgdGlwIG9mIHRoZSBuZXcgYnJhbmNoLgorCisuIFdoZW4gYSBtZXJnZSBjb25mbGljdCBoYXBwZW5zIGR1cmluZyBzd2l0Y2hpbmcgYnJhbmNoZXMgd2l0aAordGhlIGAtbWAgb3B0aW9uLCB5b3Ugd291bGQgc2VlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1tIG15dG9waWMKK0F1dG8tbWVyZ2luZyBmcm90egorbWVyZ2U6IHdhcm5pbmc6IGNvbmZsaWN0cyBkdXJpbmcgbWVyZ2UKK0VSUk9SOiBNZXJnZSBjb25mbGljdCBpbiBmcm90egorZmF0YWw6IG1lcmdlIHByb2dyYW0gZmFpbGVkCistLS0tLS0tLS0tLS0KKysKK0F0IHRoaXMgcG9pbnQsIGBnaXQgZGlmZmAgc2hvd3MgdGhlIGNoYW5nZXMgY2xlYW5seSBtZXJnZWQgYXMgaW4KK3RoZSBwcmV2aW91cyBleGFtcGxlLCBhcyB3ZWxsIGFzIHRoZSBjaGFuZ2VzIGluIHRoZSBjb25mbGljdGVkCitmaWxlcy4gIEVkaXQgYW5kIHJlc29sdmUgdGhlIGNvbmZsaWN0IGFuZCBtYXJrIGl0IHJlc29sdmVkIHdpdGgKK2BnaXQgdXBkYXRlLWluZGV4YCBhcyB1c3VhbDoKKysKKy0tLS0tLS0tLS0tLQorJCBlZGl0IGZyb3R6CiskIGdpdCB1cGRhdGUtaW5kZXggZnJvdHoKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnktcGljay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnktcGljay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhOTUwYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZXJyeS1waWNrLnR4dApAQCAtMCwwICsxLDYwIEBACitnaXQtY2hlcnJ5LXBpY2soMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlcnJ5LXBpY2sgLSBBcHBseSB0aGUgY2hhbmdlIGludHJvZHVjZWQgYnkgYW4gZXhpc3RpbmcgY29tbWl0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVycnktcGljaycgWy0tZWRpdF0gWy1uXSBbLXJdIDxjb21taXQ+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gb25lIGV4aXN0aW5nIGNvbW1pdCwgYXBwbHkgdGhlIGNoYW5nZSB0aGUgcGF0Y2ggaW50cm9kdWNlcywgYW5kIHJlY29yZCBhCituZXcgY29tbWl0IHRoYXQgcmVjb3JkcyBpdC4gIFRoaXMgcmVxdWlyZXMgeW91ciB3b3JraW5nIHRyZWUgdG8gYmUgY2xlYW4gKG5vCittb2RpZmljYXRpb25zIGZyb20gdGhlIEhFQUQgY29tbWl0KS4KKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1pdD46OgorCUNvbW1pdCB0byBjaGVycnktcGljay4KKworLWV8LS1lZGl0OjoKKwlXaXRoIHRoaXMgb3B0aW9uLCBgZ2l0LWNoZXJyeS1waWNrYCB3aWxsIGxldCB5b3UgZWRpdCB0aGUgY29tbWl0CisJbWVzc2FnZSBwcmlvciBjb21taXR0aW5nLgorCistcnwtLXJlcGxheTo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBhcHBlbmRzIHdoaWNoIGNvbW1pdCB3YXMKKwljaGVycnktcGlja2VkIGFmdGVyIHRoZSBvcmlnaW5hbCBjb21taXQgbWVzc2FnZSB3aGVuCisJbWFraW5nIGEgY29tbWl0LiAgVGhpcyBvcHRpb24sICctLXJlcGxheScsIGNhdXNlcyBpdCB0bworCXVzZSB0aGUgb3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgaW50YWN0LiAgVGhpcyBpcyB1c2VmdWwKKwl3aGVuIHlvdSBhcmUgcmVvcmRlcmluZyB0aGUgcGF0Y2hlcyBpbiB5b3VyIHByaXZhdGUgdHJlZQorCWJlZm9yZSBwdWJsaXNoaW5nLgorCistbnwtLW5vLWNvbW1pdDo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBjb21taXQgd2l0aAorCWEgY29tbWl0IGxvZyBtZXNzYWdlIHN0YXRpbmcgd2hpY2ggY29tbWl0IHdhcworCWNoZXJyeS1waWNrZWQuICBUaGlzIGZsYWcgYXBwbGllcyB0aGUgY2hhbmdlIG5lY2Vzc2FyeQorCXRvIGNoZXJyeS1waWNrIHRoZSBuYW1lZCBjb21taXQgdG8geW91ciB3b3JraW5nIHRyZWUsCisJYnV0IGRvZXMgbm90IG1ha2UgdGhlIGNvbW1pdC4gIEluIGFkZGl0aW9uLCB3aGVuIHRoaXMKKwlvcHRpb24gaXMgdXNlZCwgeW91ciB3b3JraW5nIHRyZWUgZG9lcyBub3QgaGF2ZSB0byBtYXRjaAorCXRoZSBIRUFEIGNvbW1pdC4gIFRoZSBjaGVycnktcGljayBpcyBkb25lIGFnYWluc3QgdGhlCisJYmVnaW5uaW5nIHN0YXRlIG9mIHlvdXIgd29ya2luZyB0cmVlLgorKworVGhpcyBpcyB1c2VmdWwgd2hlbiBjaGVycnktcGlja2luZyBtb3JlIHRoYW4gb25lIGNvbW1pdHMnCitlZmZlY3QgdG8geW91ciB3b3JraW5nIHRyZWUgaW4gYSByb3cuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNoZXJyeS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2JhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnkudHh0CkBAIC0wLDAgKzEsNTEgQEAKK2dpdC1jaGVycnkoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNoZXJyeSAtIEZpbmQgY29tbWl0cyBub3QgbWVyZ2VkIHVwc3RyZWFtCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVycnknIFstdl0gPHVwc3RyZWFtPiBbPGhlYWQ+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoZSBjaGFuZ2VzZXQgKG9yICJkaWZmIikgb2YgZWFjaCBjb21taXQgYmV0d2VlbiB0aGUgZm9yay1wb2ludCBhbmQgPGhlYWQ+CitpcyBjb21wYXJlZCBhZ2FpbnN0IGVhY2ggY29tbWl0IGJldHdlZW4gdGhlIGZvcmstcG9pbnQgYW5kIDx1cHN0cmVhbT4uCisKK0V2ZXJ5IGNvbW1pdCB3aXRoIGEgY2hhbmdlc2V0IHRoYXQgZG9lc24ndCBleGlzdCBpbiB0aGUgb3RoZXIgYnJhbmNoCitoYXMgaXRzIGlkIChzaGExKSByZXBvcnRlZCwgcHJlZml4ZWQgYnkgYSBzeW1ib2wuICBUaG9zZSBleGlzdGluZyBvbmx5CitpbiB0aGUgPHVwc3RyZWFtPiBicmFuY2ggYXJlIHByZWZpeGVkIHdpdGggYSBtaW51cyAoLSkgc2lnbiwgYW5kIHRob3NlCit0aGF0IG9ubHkgZXhpc3QgaW4gdGhlIDxoZWFkPiBicmFuY2ggYXJlIHByZWZpeGVkIHdpdGggYSBwbHVzICgrKSBzeW1ib2wuCisKK0JlY2F1c2UgZ2l0LWNoZXJyeSBjb21wYXJlcyB0aGUgY2hhbmdlc2V0IHJhdGhlciB0aGFuIHRoZSBjb21taXQgaWQKKyhzaGExKSwgeW91IGNhbiB1c2UgZ2l0LWNoZXJyeSB0byBmaW5kIG91dCBpZiBhIGNvbW1pdCB5b3UgbWFkZSBsb2NhbGx5CitoYXMgYmVlbiBhcHBsaWVkIDx1cHN0cmVhbT4gdW5kZXIgYSBkaWZmZXJlbnQgY29tbWl0IGlkLiAgRm9yIGV4YW1wbGUsCit0aGlzIHdpbGwgaGFwcGVuIGlmIHlvdSdyZSBmZWVkaW5nIHBhdGNoZXMgPHVwc3RyZWFtPiB2aWEgZW1haWwgcmF0aGVyCit0aGFuIHB1c2hpbmcgb3IgcHVsbGluZyBjb21taXRzIGRpcmVjdGx5LgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlWZXJib3NlLgorCis8dXBzdHJlYW0+OjoKKwlVcHN0cmVhbSBicmFuY2ggdG8gY29tcGFyZSBhZ2FpbnN0LgorCis8aGVhZD46OgorCVdvcmtpbmcgYnJhbmNoOyBkZWZhdWx0cyB0byBIRUFELgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2xlYW4udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2xlYW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWFmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jbGVhbi50eHQKQEAgLTAsMCArMSw1MyBAQAorZ2l0LWNsZWFuKDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNsZWFuIC0gUmVtb3ZlIHVudHJhY2tlZCBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWNsZWFuJyBbLWRdIFstbl0gWy1xXSBbLXggfCAtWF0gWy0tXSA8cGF0aHM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVtb3ZlcyBmaWxlcyB1bmtub3duIHRvIGdpdC4gIFRoaXMgYWxsb3dzIHRvIGNsZWFuIHRoZSB3b3JraW5nIHRyZWUKK2Zyb20gZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHZlcnNpb24gY29udHJvbC4gIElmIHRoZSAnLXgnIG9wdGlvbiBpcworc3BlY2lmaWVkLCBpZ25vcmVkIGZpbGVzIGFyZSBhbHNvIHJlbW92ZWQsIGFsbG93aW5nIHRvIHJlbW92ZSBhbGwKK2J1aWxkIHByb2R1Y3RzLgorV2hlbiBvcHRpb25hbCBgPHBhdGhzPi4uLmAgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIHBhdGhzCithZmZlY3RlZCBhcmUgZnVydGhlciBsaW1pdGVkIHRvIHRob3NlIHRoYXQgbWF0Y2ggdGhlbS4KKworCitPUFRJT05TCistLS0tLS0tCistZDo6CisJUmVtb3ZlIHVudHJhY2tlZCBkaXJlY3RvcmllcyBpbiBhZGRpdGlvbiB0byB1bnRyYWNrZWQgZmlsZXMuCisKKy1uOjoKKwlEb24ndCBhY3R1YWxseSByZW1vdmUgYW55dGhpbmcsIGp1c3Qgc2hvdyB3aGF0IHdvdWxkIGJlIGRvbmUuCisKKy1xOjoKKwlCZSBxdWlldCwgb25seSByZXBvcnQgZXJyb3JzLCBidXQgbm90IHRoZSBmaWxlcyB0aGF0IGFyZQorCXN1Y2Nlc3NmdWxseSByZW1vdmVkLgorCisteDo6CisJRG9uJ3QgdXNlIHRoZSBpZ25vcmUgcnVsZXMuICBUaGlzIGFsbG93cyByZW1vdmluZyBhbGwgdW50cmFja2VkCisJZmlsZXMsIGluY2x1ZGluZyBidWlsZCBwcm9kdWN0cy4gIFRoaXMgY2FuIGJlIHVzZWQgKHBvc3NpYmx5IGluCisJY29uanVuY3Rpb24gd2l0aCBnaXRsaW5rOmdpdC1yZXNldFsxXSkgdG8gY3JlYXRlIGEgcHJpc3RpbmUKKwl3b3JraW5nIGRpcmVjdG9yeSB0byB0ZXN0IGEgY2xlYW4gYnVpbGQuCisKKy1YOjoKKwlSZW1vdmUgb25seSBmaWxlcyBpZ25vcmVkIGJ5IGdpdC4gIFRoaXMgbWF5IGJlIHVzZWZ1bCB0byByZWJ1aWxkCisJZXZlcnl0aGluZyBmcm9tIHNjcmF0Y2gsIGJ1dCBrZWVwIG1hbnVhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNsb25lLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2xvbmUtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmNDNlZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNsb25lLXBhY2sudHh0CkBAIC0wLDAgKzEsNjQgQEAKK2dpdC1jbG9uZS1wYWNrKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2xvbmUtcGFjayAtIENsb25lcyBhIHJlcG9zaXRvcnkgYnkgcmVjZWl2aW5nIHBhY2tlZCBvYmplY3RzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNsb25lLXBhY2snIFstLWV4ZWM9PGdpdC11cGxvYWQtcGFjaz5dIFs8aG9zdD46XTxkaXJlY3Rvcnk+IFs8aGVhZD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ2xvbmVzIGEgcmVwb3NpdG9yeSBpbnRvIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkgYnkgaW52b2tpbmcKKydnaXQtdXBsb2FkLXBhY2snLCBwb3NzaWJseSBvbiB0aGUgcmVtb3RlIGhvc3QgdmlhIHNzaCwgaW4KK3RoZSBuYW1lZCByZXBvc2l0b3J5LCBhbmQgc3RvcmVzIHRoZSBzZW50IHBhY2sgaW4gdGhlIGxvY2FsCityZXBvc2l0b3J5LgorCitPUFRJT05TCistLS0tLS0tCistLWV4ZWM9PGdpdC11cGxvYWQtcGFjaz46OgorCVVzZSB0aGlzIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gJ2dpdC11cGxvYWQtcGFjaycgb24gdGhlCisJcmVtb3RlIHNpZGUsIGlmIGl0IGlzIG5vdCBmb3VuZCBvbiB5b3VyICRQQVRILgorCUluc3RhbGxhdGlvbnMgb2Ygc3NoZCBpZ25vcmUgdGhlIHVzZXIncyBlbnZpcm9ubWVudAorCXNldHVwIHNjcmlwdHMgZm9yIGxvZ2luIHNoZWxscyAoZS5nLiAuYmFzaF9wcm9maWxlKSBhbmQKKwl5b3VyIHByaXZhdGVseSBpbnN0YWxsZWQgZ2l0IG1heSBub3QgYmUgZm91bmQgb24gdGhlIHN5c3RlbQorCWRlZmF1bHQgJFBBVEguICBBbm90aGVyIHdvcmthcm91bmQgc3VnZ2VzdGVkIGlzIHRvIHNldAorCXVwIHlvdXIgJFBBVEggaW4gIi5iYXNocmMiLCBidXQgdGhpcyBmbGFnIGlzIGZvciBwZW9wbGUKKwl3aG8gZG8gbm90IHdhbnQgdG8gcGF5IHRoZSBvdmVyaGVhZCBmb3Igbm9uLWludGVyYWN0aXZlCisJc2hlbGxzIGJ5IGhhdmluZyBhIGxlYW4gLmJhc2hyYyBmaWxlICh0aGV5IHNldCBtb3N0IG9mCisJdGhlIHRoaW5ncyB1cCBpbiAuYmFzaF9wcm9maWxlKS4KKworPGhvc3Q+OjoKKwlBIHJlbW90ZSBob3N0IHRoYXQgaG91c2VzIHRoZSByZXBvc2l0b3J5LiAgV2hlbiB0aGlzCisJcGFydCBpcyBzcGVjaWZpZWQsICdnaXQtdXBsb2FkLXBhY2snIGlzIGludm9rZWQgdmlhCisJc3NoLgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gc3luYyBmcm9tLgorCis8aGVhZD4uLi46OgorCVRoZSBoZWFkcyB0byB1cGRhdGUuICBUaGlzIGlzIHJlbGF0aXZlIHRvICRHSVRfRElSCisJKGUuZy4gIkhFQUQiLCAicmVmcy9oZWFkcy9tYXN0ZXIiKS4gIFdoZW4gdW5zcGVjaWZpZWQsCisJYWxsIGhlYWRzIGFyZSB1cGRhdGVkIHRvIG1hdGNoIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4KKysKK1VzdWFsbHkgYWxsIHRoZSByZWZzIGZyb20gZXhpc3RpbmcgcmVwb3NpdG9yeSBhcmUgc3RvcmVkCit1bmRlciB0aGUgc2FtZSBuYW1lIGluIHRoZSBuZXcgcmVwb3NpdG9yeS4gIEdpdmluZyBleHBsaWNpdAorPGhlYWQ+IGFyZ3VtZW50cyBpbnN0ZWFkIHdyaXRlcyB0aGUgb2JqZWN0IG5hbWVzIGFuZCByZWZzIHRvCit0aGUgc3RhbmRhcmQgb3V0cHV0LCBqdXN0IGxpa2UgZ2V0LWZldGNoLXBhY2sgZG9lcy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2xvbmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2xvbmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDUyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jbG9uZS50eHQKQEAgLTAsMCArMSwxNzIgQEAKK2dpdC1jbG9uZSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jbG9uZSAtIENsb25lcyBhIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY2xvbmUnIFstLXRlbXBsYXRlPTx0ZW1wbGF0ZV9kaXJlY3Rvcnk+XSBbLWwgWy1zXV0gWy1xXSBbLW5dIFstLWJhcmVdCisJICBbLW8gPG5hbWU+XSBbLXUgPHVwbG9hZC1wYWNrPl0gWy0tcmVmZXJlbmNlIDxyZXBvc2l0b3J5Pl0KKwkgIFstLXVzZS1zZXBhcmF0ZS1yZW1vdGVdIDxyZXBvc2l0b3J5PiBbPGRpcmVjdG9yeT5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ2xvbmVzIGEgcmVwb3NpdG9yeSBpbnRvIGEgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcnkuICBBbGwgcmVtb3RlCiticmFuY2ggaGVhZHMgYXJlIGNvcGllZCB1bmRlciBgJEdJVF9ESVIvcmVmcy9oZWFkcy9gLCBleGNlcHQKK3RoYXQgdGhlIHJlbW90ZSBgbWFzdGVyYCBpcyBhbHNvIGNvcGllZCB0byBgb3JpZ2luYCBicmFuY2guCisKK0luIGFkZGl0aW9uLCBgJEdJVF9ESVIvcmVtb3Rlcy9vcmlnaW5gIGZpbGUgaXMgc2V0IHVwIHRvIGhhdmUKK3RoaXMgbGluZToKKworCVB1bGw6IG1hc3RlcjpvcmlnaW4KKworVGhpcyBpcyB0byBoZWxwIHRoZSB0eXBpY2FsIHdvcmtmbG93IG9mIHdvcmtpbmcgb2ZmIG9mIHRoZQorcmVtb3RlIGBtYXN0ZXJgIGJyYW5jaC4gIEV2ZXJ5IHRpbWUgYGdpdCBwdWxsYCB3aXRob3V0IGFyZ3VtZW50CitpcyBydW4sIHRoZSBwcm9ncmVzcyBvbiB0aGUgcmVtb3RlIGBtYXN0ZXJgIGJyYW5jaCBpcyB0cmFja2VkIGJ5Citjb3B5aW5nIGl0IGludG8gdGhlIGxvY2FsIGBvcmlnaW5gIGJyYW5jaCwgYW5kIG1lcmdlZCBpbnRvIHRoZQorYnJhbmNoIHlvdSBhcmUgY3VycmVudGx5IHdvcmtpbmcgb24uICBSZW1vdGUgYnJhbmNoZXMgb3RoZXIgdGhhbgorYG1hc3RlcmAgYXJlIGFsc28gYWRkZWQgdGhlcmUgdG8gYmUgdHJhY2tlZC4KKworCitPUFRJT05TCistLS0tLS0tCistLWxvY2FsOjoKKy1sOjoKKwlXaGVuIHRoZSByZXBvc2l0b3J5IHRvIGNsb25lIGZyb20gaXMgb24gYSBsb2NhbCBtYWNoaW5lLAorCXRoaXMgZmxhZyBieXBhc3NlcyBub3JtYWwgImdpdCBhd2FyZSIgdHJhbnNwb3J0CisJbWVjaGFuaXNtIGFuZCBjbG9uZXMgdGhlIHJlcG9zaXRvcnkgYnkgbWFraW5nIGEgY29weSBvZgorCUhFQUQgYW5kIGV2ZXJ5dGhpbmcgdW5kZXIgb2JqZWN0cyBhbmQgcmVmcyBkaXJlY3Rvcmllcy4KKwlUaGUgZmlsZXMgdW5kZXIgLmdpdC9vYmplY3RzLyBkaXJlY3RvcnkgYXJlIGhhcmRsaW5rZWQKKwl0byBzYXZlIHNwYWNlIHdoZW4gcG9zc2libGUuCisKKy0tc2hhcmVkOjoKKy1zOjoKKwlXaGVuIHRoZSByZXBvc2l0b3J5IHRvIGNsb25lIGlzIG9uIHRoZSBsb2NhbCBtYWNoaW5lLAorCWluc3RlYWQgb2YgdXNpbmcgaGFyZCBsaW5rcywgYXV0b21hdGljYWxseSBzZXR1cAorCS5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgdG8gc2hhcmUgdGhlIG9iamVjdHMKKwl3aXRoIHRoZSBzb3VyY2UgcmVwb3NpdG9yeS4gIFRoZSByZXN1bHRpbmcgcmVwb3NpdG9yeQorCXN0YXJ0cyBvdXQgd2l0aG91dCBhbnkgb2JqZWN0IG9mIGl0cyBvd24uCisKKy0tcmVmZXJlbmNlIDxyZXBvc2l0b3J5Pjo6CisJSWYgdGhlIHJlZmVyZW5jZSByZXBvc2l0b3J5IGlzIG9uIHRoZSBsb2NhbCBtYWNoaW5lCisJYXV0b21hdGljYWxseSBzZXR1cCAuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzIHRvCisJb2J0YWluIG9iamVjdHMgZnJvbSB0aGUgcmVmZXJlbmNlIHJlcG9zaXRvcnkuICBVc2luZworCWFuIGFscmVhZHkgZXhpc3RpbmcgcmVwb3NpdG9yeSBhcyBhbiBhbHRlcm5hdGUgd2lsbAorCXJlcXVpcmUgbGVzcyBvYmplY3RzIHRvIGJlIGNvcGllZCBmcm9tIHRoZSByZXBvc2l0b3J5CisJYmVpbmcgY2xvbmVkLCByZWR1Y2luZyBuZXR3b3JrIGFuZCBsb2NhbCBzdG9yYWdlIGNvc3RzLgorCistLXF1aWV0OjoKKy1xOjoKKwlPcGVyYXRlIHF1aWV0bHkuICBUaGlzIGZsYWcgaXMgcGFzc2VkIHRvICJyc3luYyIgYW5kCisJImdpdC1jbG9uZS1wYWNrIiBjb21tYW5kcyB3aGVuIGdpdmVuLgorCistbjo6CisJTm8gY2hlY2tvdXQgb2YgSEVBRCBpcyBwZXJmb3JtZWQgYWZ0ZXIgdGhlIGNsb25lIGlzIGNvbXBsZXRlLgorCistLWJhcmU6OgorCU1ha2UgYSAnYmFyZScgR0lUIHJlcG9zaXRvcnkuICBUaGF0IGlzLCBpbnN0ZWFkIG9mCisJY3JlYXRpbmcgYDxkaXJlY3Rvcnk+YCBhbmQgcGxhY2luZyB0aGUgYWRtaW5pc3RyYXRpdmUKKwlmaWxlcyBpbiBgPGRpcmVjdG9yeT4vLmdpdGAsIG1ha2UgdGhlIGA8ZGlyZWN0b3J5PmAKKwlpdHNlbGYgdGhlIGAkR0lUX0RJUmAuIFRoaXMgaW1wbGllcyBgLW5gIG9wdGlvbi4gIFdoZW4KKwl0aGlzIG9wdGlvbiBpcyB1c2VkLCBuZWl0aGVyIHRoZSBgb3JpZ2luYCBicmFuY2ggbm9yIHRoZQorCWRlZmF1bHQgYHJlbW90ZXMvb3JpZ2luYCBmaWxlIGlzIGNyZWF0ZWQuCisKKy1vIDxuYW1lPjo6CisJSW5zdGVhZCBvZiB1c2luZyB0aGUgYnJhbmNoIG5hbWUgJ29yaWdpbicgdG8ga2VlcCB0cmFjaworCW9mIHRoZSB1cHN0cmVhbSByZXBvc2l0b3J5LCB1c2UgPG5hbWU+IGluc3RlYWQuICBOb3RlCisJdGhhdCB0aGUgc2hvcnRoYW5kIG5hbWUgc3RvcmVkIGluIGByZW1vdGVzL29yaWdpbmAgaXMKKwlub3QgYWZmZWN0ZWQsIGJ1dCB0aGUgbG9jYWwgYnJhbmNoIG5hbWUgdG8gcHVsbCB0aGUKKwlyZW1vdGUgYG1hc3RlcmAgYnJhbmNoIGludG8gaXMuCisKKy0tdXBsb2FkLXBhY2sgPHVwbG9hZC1wYWNrPjo6CistdSA8dXBsb2FkLXBhY2s+OjoKKwlXaGVuIGdpdmVuLCBhbmQgdGhlIHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbSBpcyBoYW5kbGVkCisJYnkgJ2dpdC1jbG9uZS1wYWNrJywgJy0tZXhlYz08dXBsb2FkLXBhY2s+JyBpcyBwYXNzZWQgdG8KKwl0aGUgY29tbWFuZCB0byBzcGVjaWZ5IG5vbi1kZWZhdWx0IHBhdGggZm9yIHRoZSBjb21tYW5kCisJcnVuIG9uIHRoZSBvdGhlciBlbmQuCisKKy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT46OgorCVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRlbXBsYXRlcyB3aWxsIGJlIHVzZWQ7CisJaWYgdW5zZXQgdGhlIHRlbXBsYXRlcyBhcmUgdGFrZW4gZnJvbSB0aGUgaW5zdGFsbGF0aW9uCisJZGVmaW5lZCBkZWZhdWx0LCB0eXBpY2FsbHkgYC91c3Ivc2hhcmUvZ2l0LWNvcmUvdGVtcGxhdGVzYC4KKworLS11c2Utc2VwYXJhdGUtcmVtb3RlOjoKKwlTYXZlIHJlbW90ZXMgaGVhZHMgdW5kZXIgYCRHSVRfRElSL3JlbW90ZXMvb3JpZ2luL2AgaW5zdGVhZAorCW9mIGAkR0lUX0RJUi9yZWZzL2hlYWRzL2AuICBPbmx5IHRoZSBtYXN0ZXIgYnJhbmNoIGlzIHNhdmVkCisJaW4gdGhlIGxhdHRlci4KKworPHJlcG9zaXRvcnk+OjoKKwlUaGUgKHBvc3NpYmx5IHJlbW90ZSkgcmVwb3NpdG9yeSB0byBjbG9uZSBmcm9tLiAgSXQgY2FuCisJYmUgYW55IFVSTCBnaXQtZmV0Y2ggc3VwcG9ydHMuCisKKzxkaXJlY3Rvcnk+OjoKKwlUaGUgbmFtZSBvZiBhIG5ldyBkaXJlY3RvcnkgdG8gY2xvbmUgaW50by4gIFRoZSAiaHVtYW5pc2giCisJcGFydCBvZiB0aGUgc291cmNlIHJlcG9zaXRvcnkgaXMgdXNlZCBpZiBubyBkaXJlY3RvcnkgaXMKKwlleHBsaWNpdGx5IGdpdmVuICgicmVwbyIgZm9yICIvcGF0aC90by9yZXBvLmdpdCIgYW5kICJmb28iCisJZm9yICJob3N0Lnh6OmZvby8uZ2l0IikuICBDbG9uaW5nIGludG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5CisJaXMgbm90IGFsbG93ZWQuCisKK0V4YW1wbGVzCistLS0tLS0tLQorCitDbG9uZSBmcm9tIHVwc3RyZWFtOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS8uLi4vbGludXgtMi42IG15Mi42CiskIGNkIG15Mi42CiskIG1ha2UKKy0tLS0tLS0tLS0tLQorCisKK01ha2UgYSBsb2NhbCBjbG9uZSB0aGF0IGJvcnJvd3MgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnksIHdpdGhvdXQgY2hlY2tpbmcgdGhpbmdzIG91dDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIC1sIC1zIC1uIC4gLi4vY29weQorJCBjZCBjb3B5CiskIGdpdCBzaG93LWJyYW5jaAorLS0tLS0tLS0tLS0tCisKKworQ2xvbmUgZnJvbSB1cHN0cmVhbSB3aGlsZSBib3Jyb3dpbmcgZnJvbSBhbiBleGlzdGluZyBsb2NhbCBkaXJlY3Rvcnk6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSAtLXJlZmVyZW5jZSBteTIuNiBcCisJZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS8uLi4vbGludXgtMi43IFwKKwlteTIuNworJCBjZCBteTIuNworLS0tLS0tLS0tLS0tCisKKworQ3JlYXRlIGEgYmFyZSByZXBvc2l0b3J5IHRvIHB1Ymxpc2ggeW91ciBjaGFuZ2VzIHRvIHRoZSBwdWJsaWM6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSAtLWJhcmUgLWwgL2hvbWUvcHJvai8uZ2l0IC9wdWIvc2NtL3Byb2ouZ2l0CistLS0tLS0tLS0tLS0KKworCitDcmVhdGUgYSByZXBvc2l0b3J5IG9uIHRoZSBrZXJuZWwub3JnIG1hY2hpbmUgdGhhdCBib3Jyb3dzIGZyb20gTGludXM6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSAtLWJhcmUgLWwgLXMgL3B1Yi9zY20vLi4uL3RvcnZhbGRzL2xpbnV4LTIuNi5naXQgXAorICAgIC9wdWIvc2NtLy4uLi9tZS9zdWJzeXMtMi42LmdpdAorLS0tLS0tLS0tLS0tCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQtdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkMWExYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbW1pdC10cmVlLnR4dApAQCAtMCwwICsxLDEwMCBAQAorZ2l0LWNvbW1pdC10cmVlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNvbW1pdC10cmVlIC0gQ3JlYXRlcyBhIG5ldyBjb21taXQgb2JqZWN0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvbW1pdC10cmVlJyA8dHJlZT4gWy1wIDxwYXJlbnQgY29tbWl0Pl1cKiA8IGNoYW5nZWxvZworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NyZWF0ZXMgYSBuZXcgY29tbWl0IG9iamVjdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdHJlZSBvYmplY3QgYW5kCitlbWl0cyB0aGUgbmV3IGNvbW1pdCBvYmplY3QgaWQgb24gc3Rkb3V0LiBJZiBubyBwYXJlbnQgaXMgZ2l2ZW4gdGhlbgoraXQgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBpbml0aWFsIHRyZWUuCisKK0EgY29tbWl0IG9iamVjdCB1c3VhbGx5IGhhcyAxIHBhcmVudCAoYSBjb21taXQgYWZ0ZXIgYSBjaGFuZ2UpIG9yIHVwCit0byAxNiBwYXJlbnRzLiAgTW9yZSB0aGFuIG9uZSBwYXJlbnQgcmVwcmVzZW50cyBhIG1lcmdlIG9mIGJyYW5jaGVzCit0aGF0IGxlZCB0byB0aGVtLgorCitXaGlsZSBhIHRyZWUgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IHN0YXRlIG9mIGEgd29ya2luZworZGlyZWN0b3J5LCBhIGNvbW1pdCByZXByZXNlbnRzIHRoYXQgc3RhdGUgaW4gInRpbWUiLCBhbmQgZXhwbGFpbnMgaG93Cit0byBnZXQgdGhlcmUuCisKK05vcm1hbGx5IGEgY29tbWl0IHdvdWxkIGlkZW50aWZ5IGEgbmV3ICJIRUFEIiBzdGF0ZSwgYW5kIHdoaWxlIGdpdAorZG9lc24ndCBjYXJlIHdoZXJlIHlvdSBzYXZlIHRoZSBub3RlIGFib3V0IHRoYXQgc3RhdGUsIGluIHByYWN0aWNlIHdlCit0ZW5kIHRvIGp1c3Qgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgZmlsZSB0aGF0IGlzIHBvaW50ZWQgYXQgYnkKK2AuZ2l0L0hFQURgLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgc2VlIHdoYXQgdGhlIGxhc3QgY29tbWl0dGVkCitzdGF0ZSB3YXMuCisKK09QVElPTlMKKy0tLS0tLS0KKzx0cmVlPjo6CisJQW4gZXhpc3RpbmcgdHJlZSBvYmplY3QKKworLXAgPHBhcmVudCBjb21taXQ+OjoKKwlFYWNoICctcCcgaW5kaWNhdGVzIHRoZSBpZCBvZiBhIHBhcmVudCBjb21taXQgb2JqZWN0LgorCQorCitDb21taXQgSW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGNvbW1pdCBlbmNhcHN1bGF0ZXM6CisKKy0gYWxsIHBhcmVudCBvYmplY3QgaWRzCistIGF1dGhvciBuYW1lLCBlbWFpbCBhbmQgZGF0ZQorLSBjb21taXR0ZXIgbmFtZSBhbmQgZW1haWwgYW5kIHRoZSBjb21taXQgdGltZS4KKworSWYgbm90IHByb3ZpZGVkLCAiZ2l0LWNvbW1pdC10cmVlIiB1c2VzIHlvdXIgbmFtZSwgaG9zdG5hbWUgYW5kIGRvbWFpbiB0bworcHJvdmlkZSBhdXRob3IgYW5kIGNvbW1pdHRlciBpbmZvLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5CitlaXRoZXIgYC5naXQvY29uZmlnYCBmaWxlLCBvciB1c2luZyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworCUdJVF9BVVRIT1JfTkFNRQorCUdJVF9BVVRIT1JfRU1BSUwKKwlHSVRfQVVUSE9SX0RBVEUKKwlHSVRfQ09NTUlUVEVSX05BTUUKKwlHSVRfQ09NTUlUVEVSX0VNQUlMCisKKyhuYiAiPCIsICI+IiBhbmQgIlxuInMgYXJlIHN0cmlwcGVkKQorCitJbiBgLmdpdC9jb25maWdgIGZpbGUsIHRoZSBmb2xsb3dpbmcgaXRlbXMgYXJlIHVzZWQgZm9yIEdJVF9BVVRIT1JfTkFNRSBhbmQKK0dJVF9BVVRIT1JfRU1BSUw6CisKKwlbdXNlcl0KKwkJbmFtZSA9ICJZb3VyIE5hbWUiCisJCWVtYWlsID0gInlvdXJAZW1haWwuYWRkcmVzcy54eiIKKworQSBjb21taXQgY29tbWVudCBpcyByZWFkIGZyb20gc3RkaW4gKG1heCA5OTkgY2hhcnMpLiBJZiBhIGNoYW5nZWxvZworZW50cnkgaXMgbm90IHByb3ZpZGVkIHZpYSAiPCIgcmVkaXJlY3Rpb24sICJnaXQtY29tbWl0LXRyZWUiIHdpbGwganVzdCB3YWl0Citmb3Igb25lIHRvIGJlIGVudGVyZWQgYW5kIHRlcm1pbmF0ZWQgd2l0aCBeRC4KKworCitEaWFnbm9zdGljcworLS0tLS0tLS0tLS0KK1lvdSBkb24ndCBleGlzdC4gR28gYXdheSE6OgorICAgIFRoZSBwYXNzd2QoNSkgZ2Vjb3MgZmllbGQgY291bGRuJ3QgYmUgcmVhZAorWW91ciBwYXJlbnRzIG11c3QgaGF2ZSBoYXRlZCB5b3UhOjoKKyAgICBUaGUgcGFzc3dvcmQoNSkgZ2Vjb3MgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorWW91ciBzeXNhZG1pbiBtdXN0IGhhdGUgeW91ITo6CisgICAgVGhlIHBhc3N3b3JkKDUpIG5hbWUgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXdyaXRlLXRyZWVbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY29tbWl0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbW1pdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlNjZmMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbW1pdC50eHQKQEAgLTAsMCArMSwxNzAgQEAKK2dpdC1jb21taXQoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNvbW1pdCAtIFJlY29yZCB5b3VyIGNoYW5nZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWNvbW1pdCcgWy1hXSBbLXNdIFstdl0gWygtYyB8IC1DKSA8Y29tbWl0PiB8IC1GIDxmaWxlPiB8IC1tIDxtc2c+XQorCSAgIFstLW5vLXZlcmlmeV0gWy0tYW1lbmRdIFstZV0gWy0tYXV0aG9yIDxhdXRob3I+XQorCSAgIFstLV0gW1staSB8IC1vIF08ZmlsZT4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVXBkYXRlcyB0aGUgaW5kZXggZmlsZSBmb3IgZ2l2ZW4gcGF0aHMsIG9yIGFsbCBtb2RpZmllZCBmaWxlcyBpZgorJy1hJyBpcyBzcGVjaWZpZWQsIGFuZCBtYWtlcyBhIGNvbW1pdCBvYmplY3QuICBUaGUgY29tbWFuZAorVklTVUFMIGFuZCBFRElUT1IgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGVkaXQgdGhlIGNvbW1pdCBsb2cKK21lc3NhZ2UuCisKK1NldmVyYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgYXJlIHVzZWQgZHVyaW5nIGNvbW1pdHMuICBUaGV5IGFyZQorZG9jdW1lbnRlZCBpbiBnaXRsaW5rOmdpdC1jb21taXQtdHJlZVsxXS4KKworCitUaGlzIGNvbW1hbmQgY2FuIHJ1biBgY29tbWl0LW1zZ2AsIGBwcmUtY29tbWl0YCwgYW5kCitgcG9zdC1jb21taXRgIGhvb2tzLiAgU2VlIGxpbms6aG9va3MuaHRtbFtob29rc10gZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorCitPUFRJT05TCistLS0tLS0tCistYXwtLWFsbDo6CisJVXBkYXRlIGFsbCBwYXRocyBpbiB0aGUgaW5kZXggZmlsZS4gIFRoaXMgZmxhZyBub3RpY2VzCisJZmlsZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgYW5kIGRlbGV0ZWQsIGJ1dCBuZXcgZmlsZXMKKwl5b3UgaGF2ZSBub3QgdG9sZCBnaXQgYWJvdXQgYXJlIG5vdCBhZmZlY3RlZC4KKworLWMgb3IgLUMgPGNvbW1pdD46OgorCVRha2UgZXhpc3RpbmcgY29tbWl0IG9iamVjdCwgYW5kIHJldXNlIHRoZSBsb2cgbWVzc2FnZQorCWFuZCB0aGUgYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiAoaW5jbHVkaW5nIHRoZSB0aW1lc3RhbXApCisJd2hlbiBjcmVhdGluZyB0aGUgY29tbWl0LiAgV2l0aCAnLUMnLCB0aGUgZWRpdG9yIGlzIG5vdAorCWludm9rZWQ7IHdpdGggJy1jJyB0aGUgdXNlciBjYW4gZnVydGhlciBlZGl0IHRoZSBjb21taXQKKwltZXNzYWdlLgorCistRiA8ZmlsZT46OgorCVRha2UgdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGZpbGUuICBVc2UgJy0nIHRvCisJcmVhZCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworLS1hdXRob3IgPGF1dGhvcj46OgorCU92ZXJyaWRlIHRoZSBhdXRob3IgbmFtZSB1c2VkIGluIHRoZSBjb21taXQuICBVc2UKKwlgQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT5gIGZvcm1hdC4KKworLW0gPG1zZz46OgorCVVzZSB0aGUgZ2l2ZW4gPG1zZz4gYXMgdGhlIGNvbW1pdCBtZXNzYWdlLgorCistc3wtLXNpZ25vZmY6OgorCUFkZCBTaWduZWQtb2ZmLWJ5IGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKy12fC0tdmVyaWZ5OjoKKwlMb29rIGZvciBzdXNwaWNpb3VzIGxpbmVzIHRoZSBjb21taXQgaW50cm9kdWNlcywgYW5kCisJYWJvcnQgY29tbWl0dGluZyBpZiB0aGVyZSBpcyBvbmUuICBUaGUgZGVmaW5pdGlvbiBvZgorCSdzdXNwaWNpb3VzIGxpbmVzJyBpcyBjdXJyZW50bHkgdGhlIGxpbmVzIHRoYXQgaGFzCisJdHJhaWxpbmcgd2hpdGVzcGFjZXMsIGFuZCB0aGUgbGluZXMgd2hvc2UgaW5kZW50YXRpb24KKwloYXMgYSBTUCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBUQUIKKwljaGFyYWN0ZXIuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgorCistbnwtLW5vLXZlcmlmeTo6CisJVGhlIG9wcG9zaXRlIG9mIGAtLXZlcmlmeWAuCisKKy1lfC0tZWRpdDo6CisJVGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSBmaWxlIHdpdGggYC1GYCwgY29tbWFuZCBsaW5lIHdpdGgKKwlgLW1gLCBhbmQgZnJvbSBmaWxlIHdpdGggYC1DYCBhcmUgdXN1YWxseSB1c2VkIGFzIHRoZQorCWNvbW1pdCBsb2cgbWVzc2FnZSB1bm1vZGlmaWVkLiAgVGhpcyBvcHRpb24gbGV0cyB5b3UKKwlmdXJ0aGVyIGVkaXQgdGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSB0aGVzZSBzb3VyY2VzLgorCistLWFtZW5kOjoKKworCVVzZWQgdG8gYW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2guIFByZXBhcmUgdGhlIHRyZWUKKwlvYmplY3QgeW91IHdvdWxkIHdhbnQgdG8gcmVwbGFjZSB0aGUgbGF0ZXN0IGNvbW1pdCBhcyB1c3VhbAorCSh0aGlzIGluY2x1ZGVzIHRoZSB1c3VhbCAtaS8tbyBhbmQgZXhwbGljaXQgcGF0aHMpLCBhbmQgdGhlCisJY29tbWl0IGxvZyBlZGl0b3IgaXMgc2VlZGVkIHdpdGggdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlCisJdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaC4gVGhlIGNvbW1pdCB5b3UgY3JlYXRlIHJlcGxhY2VzIHRoZQorCWN1cnJlbnQgdGlwIC0tIGlmIGl0IHdhcyBhIG1lcmdlLCBpdCB3aWxsIGhhdmUgdGhlIHBhcmVudHMgb2YKKwl0aGUgY3VycmVudCB0aXAgYXMgcGFyZW50cyAtLSBzbyB0aGUgY3VycmVudCB0b3AgY29tbWl0IGlzCisJZGlzY2FyZGVkLgorKworLS0KK0l0IGlzIGEgcm91Z2ggZXF1aXZhbGVudCBmb3I6CistLS0tLS0KKwkkIGdpdCByZXNldCAtLXNvZnQgSEVBRF4KKwkkIC4uLiBkbyBzb21ldGhpbmcgZWxzZSB0byBjb21lIHVwIHdpdGggdGhlIHJpZ2h0IHRyZWUgLi4uCisJJCBnaXQgY29tbWl0IC1jIE9SSUdfSEVBRAorCistLS0tLS0KK2J1dCBjYW4gYmUgdXNlZCB0byBhbWVuZCBhIG1lcmdlIGNvbW1pdC4KKy0tCisKKy1pfC0taW5jbHVkZTo6CisJSW5zdGVhZCBvZiBjb21taXR0aW5nIG9ubHkgdGhlIGZpbGVzIHNwZWNpZmllZCBvbiB0aGUKKwljb21tYW5kIGxpbmUsIHVwZGF0ZSB0aGVtIGluIHRoZSBpbmRleCBmaWxlIGFuZCB0aGVuCisJY29tbWl0IHRoZSB3aG9sZSBpbmRleC4gIFRoaXMgaXMgdGhlIHRyYWRpdGlvbmFsCisJYmVoYXZpb3IuCisKKy1vfC0tb25seTo6CisJQ29tbWl0IG9ubHkgdGhlIGZpbGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorCVRoaXMgZm9ybWF0IGNhbm5vdCBiZSB1c2VkIGR1cmluZyBhIG1lcmdlLCBub3Igd2hlbiB0aGUKKwlpbmRleCBhbmQgdGhlIGxhdGVzdCBjb21taXQgZG9lcyBub3QgbWF0Y2ggb24gdGhlCisJc3BlY2lmaWVkIHBhdGhzIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKworXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCis8ZmlsZT4uLi46OgorCUZpbGVzIHRvIGJlIGNvbW1pdHRlZC4gIFRoZSBtZWFuaW5nIG9mIHRoZXNlIGlzCisJZGlmZmVyZW50IGJldHdlZW4gYC0taW5jbHVkZWAgYW5kIGAtLW9ubHlgLiAgV2l0aG91dAorCWVpdGhlciwgaXQgZGVmYXVsdHMgYC0tb25seWAgc2VtYW50aWNzLgorCitJZiB5b3UgbWFrZSBhIGNvbW1pdCBhbmQgdGhlbiBmb3VuZCBhIG1pc3Rha2UgaW1tZWRpYXRlbHkgYWZ0ZXIKK3RoYXQsIHlvdSBjYW4gcmVjb3ZlciBmcm9tIGl0IHdpdGggZ2l0bGluazpnaXQtcmVzZXRbMV0uCisKKworRGlzY3Vzc2lvbgorLS0tLS0tLS0tLQorCitgZ2l0IGNvbW1pdGAgd2l0aG91dCBfYW55XyBwYXJhbWV0ZXIgY29tbWl0cyB0aGUgdHJlZSBzdHJ1Y3R1cmUKK3JlY29yZGVkIGJ5IHRoZSBjdXJyZW50IGluZGV4IGZpbGUuICBUaGlzIGlzIGEgd2hvbGUtdHJlZSBjb21taXQKK2V2ZW4gdGhlIGNvbW1hbmQgaXMgaW52b2tlZCBmcm9tIGEgc3ViZGlyZWN0b3J5LgorCitgZ2l0IGNvbW1pdCAtLWluY2x1ZGUgcGF0aHMuLi5gIGlzIGVxdWl2YWxlbnQgdG8KKworCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgcGF0aHMuLi4KKwlnaXQgY29tbWl0CisKK1RoYXQgaXMsIHVwZGF0ZSB0aGUgc3BlY2lmaWVkIHBhdGhzIHRvIHRoZSBpbmRleCBhbmQgdGhlbiBjb21taXQKK3RoZSB3aG9sZSB0cmVlLgorCitgZ2l0IGNvbW1pdCBwYXRocy4uLmAgbGFyZ2VseSBieXBhc3NlcyB0aGUgaW5kZXggZmlsZSBhbmQKK2NvbW1pdHMgb25seSB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBzcGVjaWZpZWQgcGF0aHMuICBJdCBoYXMKK2hvd2V2ZXIgc2V2ZXJhbCBzYWZldHkgdmFsdmVzIHRvIHByZXZlbnQgY29uZnVzaW9uLgorCisuIEl0IHJlZnVzZXMgdG8gcnVuIGR1cmluZyBhIG1lcmdlIChpLmUuIHdoZW4KKyAgYCRHSVRfRElSL01FUkdFX0hFQURgIGV4aXN0cyksIGFuZCByZW1pbmRzIHRyYWluZWQgZ2l0IHVzZXJzCisgIHRoYXQgdGhlIHRyYWRpdGlvbmFsIHNlbWFudGljcyBub3cgbmVlZHMgLWkgZmxhZy4KKworLiBJdCByZWZ1c2VzIHRvIHJ1biBpZiBuYW1lZCBgcGF0aHMuLi5gIGFyZSBkaWZmZXJlbnQgaW4gSEVBRAorICBhbmQgdGhlIGluZGV4IChkaXR0byBhYm91dCByZW1pbmRpbmcpLiAgQWRkZWQgcGF0aHMgYXJlIE9LLgorICBUaGlzIGlzIGJlY2F1c2UgYW4gZWFybGllciBgZ2l0IGRpZmZgIChub3QgYGdpdCBkaWZmIEhFQURgKQorICB3b3VsZCBoYXZlIHNob3duIHRoZSBkaWZmZXJlbmNlcyBzaW5jZSB0aGUgbGFzdCBgZ2l0CisgIHVwZGF0ZS1pbmRleCBwYXRocy4uLmAgdG8gdGhlIHVzZXIsIGFuZCBhbiBpbmV4cGVyaWVuY2VkIHVzZXIKKyAgbWF5IG1pc3Rha2VubHkgdGhpbmsgdGhhdCB0aGUgY2hhbmdlcyBiZXR3ZWVuIHRoZSBpbmRleCBhbmQKKyAgdGhlIEhFQUQgKGkuZS4gZWFybGllciBjaGFuZ2VzIG1hZGUgYmVmb3JlIHRoZSBsYXN0IGBnaXQKKyAgdXBkYXRlLWluZGV4IHBhdGhzLi4uYCB3YXMgZG9uZSkgYXJlIG5vdCBiZWluZyBjb21taXR0ZWQuCisKKy4gSXQgcmVhZHMgSEVBRCBjb21taXQgaW50byBhIHRlbXBvcmFyeSBpbmRleCBmaWxlLCB1cGRhdGVzIHRoZQorICBzcGVjaWZpZWQgYHBhdGhzLi4uYCBhbmQgbWFrZXMgYSBjb21taXQuICBBdCB0aGUgc2FtZSB0aW1lLAorICB0aGUgcmVhbCBpbmRleCBmaWxlIGlzIGFsc28gdXBkYXRlZCB3aXRoIHRoZSBzYW1lIGBwYXRocy4uLmAuCisKK2BnaXQgY29tbWl0IC0tYWxsYCB1cGRhdGVzIHRoZSBpbmRleCBmaWxlIHdpdGggX2FsbF8gY2hhbmdlcyB0bwordGhlIHdvcmtpbmcgdHJlZSwgYW5kIG1ha2VzIGEgd2hvbGUtdHJlZSBjb21taXQsIHJlZ2FyZGxlc3Mgb2YKK3doaWNoIHN1YmRpcmVjdG9yeSB0aGUgY29tbWFuZCBpcyBpbnZva2VkIGluLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jb252ZXJ0LW9iamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY29udmVydC1vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTIyMGMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY29udmVydC1vYmplY3RzLnR4dApAQCAtMCwwICsxLDI5IEBACitnaXQtY29udmVydC1vYmplY3RzKDEpCis9PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb252ZXJ0LW9iamVjdHMgLSBDb252ZXJ0cyBvbGQtc3R5bGUgZ2l0IHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY29udmVydC1vYmplY3RzJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbnZlcnRzIG9sZC1zdHlsZSBnaXQgcmVwb3NpdG9yeSB0byB0aGUgbGF0ZXN0IGZvcm1hdAorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jb3VudC1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNvdW50LW9iamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGNlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb3VudC1vYmplY3RzLnR4dApAQCAtMCwwICsxLDM4IEBACitnaXQtY291bnQtb2JqZWN0cygxKQorPT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNvdW50LW9iamVjdHMgLSBSZXBvcnRzIG9uIHVucGFja2VkIG9iamVjdHMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvdW50LW9iamVjdHMnIFstdl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvdW50cyB0aGUgbnVtYmVyIG9mIHVucGFja2VkIG9iamVjdCBmaWxlcyBhbmQgZGlzayBzcGFjZSBjb25zdW1lZCBieQordGhlbSwgdG8gaGVscCB5b3UgZGVjaWRlIHdoZW4gaXQgaXMgYSBnb29kIHRpbWUgdG8gcmVwYWNrLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlJbiBhZGRpdGlvbiB0byB0aGUgbnVtYmVyIG9mIGxvb3NlIG9iamVjdHMgYW5kIGRpc2sKKwlzcGFjZSBjb25zdW1lZCwgaXQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mIGluLXBhY2sKKwlvYmplY3RzLCBhbmQgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVtb3ZlZCBieQorCXJ1bm5pbmcgYGdpdC1wcnVuZS1wYWNrZWRgLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNleHBvcnRjb21taXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzZXhwb3J0Y29tbWl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJkM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzZXhwb3J0Y29tbWl0LnR4dApAQCAtMCwwICsxLDgzIEBACitnaXQtY3ZzZXhwb3J0Y29tbWl0KDEpCis9PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jdnNleHBvcnRjb21taXQgLSBFeHBvcnQgYSBjb21taXQgdG8gYSBDVlMgY2hlY2tvdXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY3ZzZXhwb3J0Y29tbW1pdCcgWy1oXSBbLXZdIFstY10gWy1wXSBbLWZdIFstbSBtc2dwcmVmaXhdIFtQQVJFTlRDT01NSVRdIENPTU1JVElECisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitFeHBvcnRzIGEgY29tbWl0IGZyb20gR0lUIHRvIGEgQ1ZTIGNoZWNrb3V0LCBtYWtpbmcgaXQgZWFzaWVyCit0byBtZXJnZSBwYXRjaGVzIGZyb20gYSBnaXQgcmVwb3NpdG9yeSBpbnRvIGEgQ1ZTIHJlcG9zaXRvcnkuIAorCitFeGVjdXRlIGl0IGZyb20gdGhlIHJvb3Qgb2YgdGhlIENWUyB3b3JraW5nIGNvcHkuIEdJVF9ESVIgbXVzdCBiZSBkZWZpbmVkLiAKK1NlZSBleGFtcGxlcyBiZWxvdy4KKworSXQgZG9lcyBpdHMgYmVzdCB0byBkbyB0aGUgc2FmZSB0aGluZywgaXQgd2lsbCBjaGVjayB0aGF0IHRoZSBmaWxlcyBhcmUgCit1bmNoYW5nZWQgYW5kIHVwIHRvIGRhdGUgaW4gdGhlIENWUyBjaGVja291dCwgYW5kIGl0IHdpbGwgbm90IGF1dG9jb21taXQgCitieSBkZWZhdWx0LgorCitTdXBwb3J0cyBmaWxlIGFkZGl0aW9ucywgcmVtb3ZhbHMsIGFuZCBjb21taXRzIHRoYXQgYWZmZWN0IGJpbmFyeSBmaWxlcy4KKworSWYgdGhlIGNvbW1pdCBpcyBhIG1lcmdlIGNvbW1pdCwgeW91IG11c3QgdGVsbCBnaXQtY3ZzYXBwbHljb21taXQgd2hhdCBwYXJlbnQKK3Nob3VsZCB0aGUgY2hhbmdlc2V0IGJlIGRvbmUgYWdhaW5zdC4gCisKK09QVElPTlMKKy0tLS0tLS0KKworLWM6OgorCUNvbW1pdCBhdXRvbWF0aWNhbGx5IGlmIHRoZSBwYXRjaCBhcHBsaWVkIGNsZWFubHkuIEl0IHdpbGwgbm90CisJY29tbWl0IGlmIGFueSBodW5rcyBmYWlsIHRvIGFwcGx5IG9yIHRoZXJlIHdlcmUgb3RoZXIgcHJvYmxlbXMuCisKKy1wOjoKKwlCZSBwZWRhbnRpYyAocGFyYW5vaWQpIHdoZW4gYXBwbHlpbmcgcGF0Y2hlcy4gSW52b2tlcyBwYXRjaCB3aXRoIAorCS0tZnV6ej0wCisKKy1mOjoKKwlGb3JjZSB0aGUgbWVyZ2UgZXZlbiBpZiB0aGUgZmlsZXMgYXJlIG5vdCB1cCB0byBkYXRlLgorCistbTo6CisJUHJlcGVuZCB0aGUgY29tbWl0IG1lc3NhZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgcHJlZml4LiAKKwlVc2VmdWwgZm9yIHBhdGNoIHNlcmllcyBhbmQgdGhlIGxpa2UuCisKKy12OjoKKwlWZXJib3NlLgorCitFWEFNUExFUworLS0tLS0tLS0KKworTWVyZ2Ugb25lIHBhdGNoIGludG8gQ1ZTOjoKKysKKy0tLS0tLS0tLS0tLQorJCBleHBvcnQgR0lUX0RJUj1+L3Byb2plY3QvLmdpdAorJCBjZCB+L3Byb2plY3RfY3ZzX2NoZWNrb3V0CiskIGdpdC1jdnNleHBvcnRjb21taXQgLXYgPGNvbW1pdC1zaGExPgorJCBjdnMgY29tbWl0IC1GIC5tZ3MgPGZpbGVzPiAKKy0tLS0tLS0tLS0tLQorCitNZXJnZSBwZW5kaW5nIHBhdGNoZXMgaW50byBDVlMgYXV0b21hdGljYWxseSAtLSBvbmx5IGlmIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgOjoKKysKKy0tLS0tLS0tLS0tLQorJCBleHBvcnQgR0lUX0RJUj1+L3Byb2plY3QvLmdpdAorJCBjZCB+L3Byb2plY3RfY3ZzX2NoZWNrb3V0CiskIGdpdC1jaGVycnkgY3ZzaGVhZCBteWhlYWQgfCBzZWQgLW4gJ3MvXisgLy9wJyB8IHhhcmdzIC1sMSBnaXQtY3ZzZXhwb3J0Y29tbWl0IC1jIC1wIC12CistLS0tLS0tLS0tLS0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGM2ZDdjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LnR4dApAQCAtMCwwICsxLDE0MSBAQAorZ2l0LWN2c2ltcG9ydCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY3ZzaW1wb3J0IC0gSW1wb3J0IGEgQ1ZTIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY3ZzaW1wb3J0JyBbLW8gPGJyYW5jaC1mb3ItSEVBRD5dIFstaF0gWy12XSBbLWQgPENWU1JPT1Q+XSBbLXMgPHN1YnN0Pl0KKwkgICAgICBbLXAgPG9wdGlvbnMtZm9yLWN2c3BzPl0gWy1DIDxnaXRfcmVwb3NpdG9yeT5dIFstaV0gWy1QIDxmaWxlPl0KKwkgICAgICBbLW1dIFstTSByZWdleF0gWzxDVlNfbW9kdWxlPl0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ltcG9ydHMgYSBDVlMgcmVwb3NpdG9yeSBpbnRvIGdpdC4gSXQgd2lsbCBlaXRoZXIgY3JlYXRlIGEgbmV3CityZXBvc2l0b3J5LCBvciBpbmNyZW1lbnRhbGx5IGltcG9ydCBpbnRvIGFuIGV4aXN0aW5nIG9uZS4KKworU3BsaXR0aW5nIHRoZSBDVlMgbG9nIGludG8gcGF0Y2ggc2V0cyBpcyBkb25lIGJ5ICdjdnNwcycuCitBdCBsZWFzdCB2ZXJzaW9uIDIuMSBpcyByZXF1aXJlZC4KKworWW91IHNob3VsZCAqbmV2ZXIqIGRvIGFueSB3b3JrIG9mIHlvdXIgb3duIG9uIHRoZSBicmFuY2hlcyB0aGF0IGFyZQorY3JlYXRlZCBieSBnaXQtY3ZzaW1wb3J0LiBUaGUgaW5pdGlhbCBpbXBvcnQgd2lsbCBjcmVhdGUgYW5kIHBvcHVsYXRlIGEKKyJtYXN0ZXIiIGJyYW5jaCBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeSdzIG1haW4gYnJhbmNoIHdoaWNoIHlvdSdyZSBmcmVlCit0byB3b3JrIHdpdGg7IGFmdGVyIHRoYXQsIHlvdSBuZWVkIHRvICdnaXQgbWVyZ2UnIGluY3JlbWVudGFsIGltcG9ydHMsIG9yCithbnkgQ1ZTIGJyYW5jaGVzLCB5b3Vyc2VsZi4KKworT1BUSU9OUworLS0tLS0tLQorLWQgPENWU1JPT1Q+OjoKKwlUaGUgcm9vdCBvZiB0aGUgQ1ZTIGFyY2hpdmUuIE1heSBiZSBsb2NhbCAoYSBzaW1wbGUgcGF0aCkgb3IgcmVtb3RlOworCWN1cnJlbnRseSwgb25seSB0aGUgOmxvY2FsOiwgOmV4dDogYW5kIDpwc2VydmVyOiBhY2Nlc3MgbWV0aG9kcyAKKwlhcmUgc3VwcG9ydGVkLgorCistQyA8dGFyZ2V0LWRpcj46OgorICAgICAgICBUaGUgZ2l0IHJlcG9zaXRvcnkgdG8gaW1wb3J0IHRvLiAgSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0CisgICAgICAgIGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworLWk6OgorCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKwllbnN1cmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgaW5kZXggcmVtYWluIHVudG91Y2hlZCBhbmQgd2lsbAorCW5vdCBjcmVhdGUgdGhlbSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KKworLWs6OgorCUtpbGwga2V5d29yZHM6IHdpbGwgZXh0cmFjdCBmaWxlcyB3aXRoIC1rayBmcm9tIHRoZSBDVlMgYXJjaGl2ZQorCXRvIGF2b2lkIG5vaXN5IGNoYW5nZXNldHMuIEhpZ2hseSByZWNvbW1lbmRlZCwgYnV0IG9mZiBieSBkZWZhdWx0CisJdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmx5IGltcG9ydGVkIHRyZWVzLiAKKworLXU6OgorCUNvbnZlcnQgdW5kZXJzY29yZXMgaW4gdGFnIGFuZCBicmFuY2ggbmFtZXMgdG8gZG90cy4KKworLW8gPGJyYW5jaC1mb3ItSEVBRD46OgorCVRoZSAnSEVBRCcgYnJhbmNoIGZyb20gQ1ZTIGlzIGltcG9ydGVkIHRvIHRoZSAnb3JpZ2luJyBicmFuY2ggd2l0aGluCisJdGhlIGdpdCByZXBvc2l0b3J5LCBhcyAnSEVBRCcgYWxyZWFkeSBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIGdpdC4KKwlVc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gaW1wb3J0IGludG8gYSBkaWZmZXJlbnQgYnJhbmNoLgorKworVXNlICctbyBtYXN0ZXInIGZvciBjb250aW51aW5nIGFuIGltcG9ydCB0aGF0IHdhcyBpbml0aWFsbHkgZG9uZSBieQordGhlIG9sZCBjdnMyZ2l0IHRvb2wuCisKKy1wIDxvcHRpb25zLWZvci1jdnNwcz46OgorCUFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgY3ZzcHMuCisJVGhlIG9wdGlvbnMgJy11JyBhbmQgJy1BJyBhcmUgaW1wbGljaXQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlLgorKworSWYgeW91IG5lZWQgdG8gcGFzcyBtdWx0aXBsZSBvcHRpb25zLCBzZXBhcmF0ZSB0aGVtIHdpdGggYSBjb21tYS4KKworLVAgPGN2c3BzLW91dHB1dC1maWxlPjo6CisJSW5zdGVhZCBvZiBjYWxsaW5nIGN2c3BzLCByZWFkIHRoZSBwcm92aWRlZCBjdnNwcyBvdXRwdXQgZmlsZS4gVXNlZnVsCisJZm9yIGRlYnVnZ2luZyBvciB3aGVuIGN2c3BzIGlzIGJlaW5nIGhhbmRsZWQgb3V0c2lkZSBjdnNpbXBvcnQuCisKKy1tOjogICAgCisJQXR0ZW1wdCB0byBkZXRlY3QgbWVyZ2VzIGJhc2VkIG9uIHRoZSBjb21taXQgbWVzc2FnZS4gVGhpcyBvcHRpb24KKwl3aWxsIGVuYWJsZSBkZWZhdWx0IHJlZ2V4ZXMgdGhhdCB0cnkgdG8gY2FwdHVyZSB0aGUgbmFtZSBzb3VyY2UgCisJYnJhbmNoIG5hbWUgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2UuIAorCistTSA8cmVnZXg+OjoKKwlBdHRlbXB0IHRvIGRldGVjdCBtZXJnZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBjdXN0b20KKwlyZWdleC4gSXQgY2FuIGJlIHVzZWQgd2l0aCAtbSB0byBhbHNvIHNlZSB0aGUgZGVmYXVsdCByZWdleGVzLiAKKwlZb3UgbXVzdCBlc2NhcGUgZm9yd2FyZCBzbGFzaGVzLiAKKworLXY6OgorCVZlcmJvc2l0eTogbGV0ICdjdnNpbXBvcnQnIHJlcG9ydCB3aGF0IGl0IGlzIGRvaW5nLgorCis8Q1ZTX21vZHVsZT46OgorCVRoZSBDVlMgbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydC4gUmVsYXRpdmUgdG8gPENWU1JPT1Q+LgorCistaDo6CisJUHJpbnQgYSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCisteiA8ZnV6ej46OgorICAgICAgICBQYXNzIHRoZSB0aW1lc3RhbXAgZnV6eiBmYWN0b3IgdG8gY3ZzcHMuCisKKy1zIDxzdWJzdD46OgorCVN1YnN0aXR1dGUgdGhlIGNoYXJhY3RlciAiLyIgaW4gYnJhbmNoIG5hbWVzIHdpdGggPHN1YnN0PgorCistQSA8YXV0aG9yLWNvbnYtZmlsZT46OgorCUNWUyBieSBkZWZhdWx0IHVzZXMgdGhlIHVuaXggdXNlcm5hbWUgd2hlbiB3cml0aW5nIGl0cworCWNvbW1pdCBsb2dzLiBVc2luZyB0aGlzIG9wdGlvbiBhbmQgYW4gYXV0aG9yLWNvbnYtZmlsZQorCWluIHRoaXMgZm9ybWF0CisrCistLS0tLS0tLS0KKwlleG9uPUFuZHJlYXMgRXJpY3Nzb24gPGFlQG9wNS5zZT4KKwlzcGF3bj1TaW1vbiBQYXduIDxzcGF3bkBmcm9nLXBvbmQub3JnPgorCistLS0tLS0tLS0KKysKK2dpdC1jdnNpbXBvcnQgd2lsbCBtYWtlIGl0IGFwcGVhciBhcyB0aG9zZSBhdXRob3JzIGhhZAordGhlaXIgR0lUX0FVVEhPUl9OQU1FIGFuZCBHSVRfQVVUSE9SX0VNQUlMIHNldCBwcm9wZXJseQorYWxsIGFsb25nLgorKworRm9yIGNvbnZlbmllbmNlLCB0aGlzIGRhdGEgaXMgc2F2ZWQgdG8gJEdJVF9ESVIvY3ZzLWF1dGhvcnMKK2VhY2ggdGltZSB0aGUgLUEgb3B0aW9uIGlzIHByb3ZpZGVkIGFuZCByZWFkIGZyb20gdGhhdCBzYW1lCitmaWxlIGVhY2ggdGltZSBnaXQtY3ZzaW1wb3J0IGlzIHJ1bi4KKysKK0l0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmZWF0dXJlIGlmIHlvdSBpbnRlbmQgdG8KK2V4cG9ydCBjaGFuZ2VzIGJhY2sgdG8gQ1ZTIGFnYWluIGxhdGVyIHdpdGgKK2dpdC1saW5rWzFdOjpnaXQtY3ZzZXhwb3J0Y29tbWl0LgorCitPVVRQVVQKKy0tLS0tLQorSWYgJy12JyBpcyBzcGVjaWZpZWQsIHRoZSBzY3JpcHQgcmVwb3J0cyB3aGF0IGl0IGlzIGRvaW5nLgorCitPdGhlcndpc2UsIHN1Y2Nlc3MgaXMgaW5kaWNhdGVkIHRoZSBVbml4IHdheSwgaS5lLiBieSBzaW1wbHkgZXhpdGluZyB3aXRoCithIHplcm8gZXhpdCBzdGF0dXMuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LCB3aXRoIGhlbHAgZnJvbQordmFyaW91cyBwYXJ0aWNpcGFudHMgb2YgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY3Zzc2VydmVyLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c3NlcnZlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyOGRiMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c3NlcnZlci50eHQKQEAgLTAsMCArMSwxNjEgQEAKK2dpdC1jdnNzZXJ2ZXIoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWN2c3NlcnZlciAtIEEgQ1ZTIHNlcnZlciBlbXVsYXRvciBmb3IgZ2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorZXhwb3J0IENWU19TRVJWRVI9Z2l0LWN2c3NlcnZlcgorJ2N2cycgLWQgOmV4dDp1c2VyQHNlcnZlci9wYXRoL3JlcG8uZ2l0IGNvIDxIRUFEX25hbWU+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIGFwcGxpY2F0aW9uIGlzIGEgQ1ZTIGVtdWxhdGlvbiBsYXllciBmb3IgZ2l0LgorCitJdCBpcyBoaWdobHkgZnVuY3Rpb25hbC4gSG93ZXZlciwgbm90IGFsbCBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCwKK2FuZCBmb3IgdGhvc2UgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCwKK25vdCBhbGwgc3dpdGNoZXMgYXJlIGltcGxlbWVudGVkLgorCitUZXN0aW5nIGhhcyBiZWVuIGRvbmUgdXNpbmcgYm90aCB0aGUgQ0xJIENWUyBjbGllbnQsIGFuZCB0aGUgRWNsaXBzZSBDVlMKK3BsdWdpbi4gTW9zdCBmdW5jdGlvbmFsaXR5IHdvcmtzIGZpbmUgd2l0aCBib3RoIG9mIHRoZXNlIGNsaWVudHMuCisKK0xJTUlUQVRJT05TCistLS0tLS0tLS0tLQorCitDdXJyZW50bHkgY3Zzc2VydmVyIHdvcmtzIG92ZXIgU1NIIGNvbm5lY3Rpb25zIGZvciByZWFkL3dyaXRlIGNsaWVudHMsIGFuZAorb3ZlciBwc2VydmVyIGZvciBhbm9ueW1vdXMgQ1ZTIGFjY2Vzcy4KKworQ1ZTIGNsaWVudHMgY2Fubm90IHRhZywgYnJhbmNoIG9yIHBlcmZvcm0gR0lUIG1lcmdlcy4KKworSU5TVEFMTEFUSU9OCistLS0tLS0tLS0tLS0KKworMS4gSWYgeW91IGFyZSBnb2luZyB0byBvZmZlciBhbm9ueW1vdXMgQ1ZTIGFjY2VzcyB2aWEgcHNlcnZlciwgYWRkIGEgbGluZSBpbgorICAgL2V0Yy9pbmV0ZC5jb25mIGxpa2UKKysKKy0tCistLS0tLS0KKyAgIGN2c3BzZXJ2ZXIgc3RyZWFtIHRjcCBub3dhaXQgbm9ib2R5IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlcgorCistLS0tLS0KK05vdGU6IEluIHNvbWUgY2FzZXMsIHlvdSBuZWVkIHRvIHBhc3MgdGhlICdwc2VydmVyJyBhcmd1bWVudCB0d2ljZSBmb3IKK2dpdC1jdnNzZXJ2ZXIgdG8gc2VlIGl0LiBTbyB0aGUgbGluZSB3b3VsZCBsb29rIGxpa2UKKworLS0tLS0tCisgICBjdnNwc2VydmVyIHN0cmVhbSB0Y3Agbm93YWl0IG5vYm9keSBnaXQtY3Zzc2VydmVyIHBzZXJ2ZXIgcHNlcnZlcgorCistLS0tLS0KK05vIHNwZWNpYWwgc2V0dXAgaXMgbmVlZGVkIGZvciBTU0ggYWNjZXNzLCBvdGhlciB0aGFuIGhhdmluZyBHSVQgdG9vbHMKK2luIHRoZSBQQVRILiBJZiB5b3UgaGF2ZSBjbGllbnRzIHRoYXQgZG8gbm90IGFjY2VwdCB0aGUgQ1ZTX1NFUlZFUgorZW52IHZhcmlhYmxlLCB5b3UgY2FuIHJlbmFtZSBnaXQtY3Zzc2VydmVyIHRvIGN2cy4KKy0tCisyLiBGb3IgZWFjaCByZXBvIHRoYXQgeW91IHdhbnQgYWNjZXNzaWJsZSBmcm9tIENWUyB5b3UgbmVlZCB0byBlZGl0IGNvbmZpZyBpbgorICAgdGhlIHJlcG8gYW5kIGFkZCB0aGUgZm9sbG93aW5nIHNlY3Rpb24uCisrCistLQorLS0tLS0tCisgICBbZ2l0Y3ZzXQorICAgICAgICBlbmFibGVkPTEKKyAgICAgICAgIyBvcHRpb25hbCBmb3IgZGVidWdnaW5nCisgICAgICAgIGxvZ2ZpbGU9L3BhdGgvdG8vbG9nZmlsZQorCistLS0tLS0KK05vdGU6IHlvdSBuZWVkIHRvIGVuc3VyZSBlYWNoIHVzZXIgdGhhdCBpcyBnb2luZyB0byBpbnZva2UgZ2l0LWN2c3NlcnZlciBoYXMKK3dyaXRlIGFjY2VzcyB0byB0aGUgbG9nIGZpbGUgYW5kIHRvIHRoZSBnaXQgcmVwb3NpdG9yeS4gV2hlbiBvZmZlcmluZyBhbm9uCithY2Nlc3MgdmlhIHBzZXJ2ZXIsIHRoaXMgbWVhbnMgdGhhdCB0aGUgbm9ib2R5IHVzZXIgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzCit0byBhdCBsZWFzdCB0aGUgc3FsaXRlIGRhdGFiYXNlIGF0IHRoZSByb290IG9mIHRoZSByZXBvc2l0b3J5LgorLS0KKzMuIE9uIHRoZSBjbGllbnQgbWFjaGluZSB5b3UgbmVlZCB0byBzZXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMuCisgICBDVlNST09UIHNob3VsZCBiZSBzZXQgYXMgcGVyIG5vcm1hbCwgYnV0IHRoZSBkaXJlY3Rvcnkgc2hvdWxkIHBvaW50IGF0IHRoZQorICAgYXBwcm9wcmlhdGUgZ2l0IHJlcG8uIEZvciBleGFtcGxlOgorKworLS0KK0ZvciBTU0ggYWNjZXNzLCBDVlNfU0VSVkVSIHNob3VsZCBiZSBzZXQgdG8gZ2l0LWN2c3NlcnZlcgorCitFeGFtcGxlOgorCistLS0tLS0KKyAgICAgZXhwb3J0IENWU1JPT1Q9OmV4dDp1c2VyQHNlcnZlcjovdmFyL2dpdC9wcm9qZWN0LmdpdAorICAgICBleHBvcnQgQ1ZTX1NFUlZFUj1naXQtY3Zzc2VydmVyCistLS0tLS0KKy0tCis0LiBGb3IgU1NIIGNsaWVudHMgdGhhdCB3aWxsIG1ha2UgY29tbWl0cywgbWFrZSBzdXJlIHRoZWlyIC5iYXNocmMgZmlsZQorICAgc2V0cyB0aGUgR0lUX0FVVEhPUiBhbmQgR0lUX0NPTU1JVFRFUiB2YXJpYWJsZXMuCisKKzUuIENsaWVudHMgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGNoZWNrIG91dCB0aGUgcHJvamVjdC4gVXNlIHRoZSBDVlMgJ21vZHVsZScKKyAgIG5hbWUgdG8gaW5kaWNhdGUgd2hhdCBHSVQgJ2hlYWQnIHlvdSB3YW50IHRvIGNoZWNrIG91dC4gRXhhbXBsZToKKysKKy0tLS0tLQorICAgICBjdnMgY28gLWQgcHJvamVjdC1tYXN0ZXIgbWFzdGVyCistLS0tLS0KKworRWNsaXBzZSBDVlMgQ2xpZW50IE5vdGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gZ2V0IGEgY2hlY2tvdXQgd2l0aCB0aGUgRWNsaXBzZSBDVlMgY2xpZW50OgorCisxLiBTZWxlY3QgIkNyZWF0ZSBhIG5ldyBwcm9qZWN0IC0+IEZyb20gQ1ZTIGNoZWNrb3V0IgorMi4gQ3JlYXRlIGEgbmV3IGxvY2F0aW9uLiBTZWUgdGhlIG5vdGVzIGJlbG93IGZvciBkZXRhaWxzIG9uIGhvdyB0byBjaG9vc2UgdGhlCisgICByaWdodCBwcm90b2NvbC4KKzMuIEJyb3dzZSB0aGUgJ21vZHVsZXMnIGF2YWlsYWJsZS4gSXQgd2lsbCBnaXZlIHlvdSBhIGxpc3Qgb2YgdGhlIGhlYWRzIGluCisgICB0aGUgcmVwb3NpdG9yeS4gWW91IHdpbGwgbm90IGJlIGFibGUgdG8gYnJvd3NlIHRoZSB0cmVlIGZyb20gdGhlcmUuIE9ubHkKKyAgIHRoZSBoZWFkcy4KKzQuIFBpY2sgJ0hFQUQnIHdoZW4gaXQgYXNrcyB3aGF0IGJyYW5jaC90YWcgdG8gY2hlY2sgb3V0LiBVbnRpY2sgdGhlCisgICAibGF1bmNoIGNvbW1pdCB3aXphcmQiIHRvIGF2b2lkIGNvbW1pdHRpbmcgdGhlIC5wcm9qZWN0IGZpbGUuCisKK1Byb3RvY29sIG5vdGVzOiBJZiB5b3UgYXJlIHVzaW5nIGFub255bW91cyBhY2Nlc3MgdmlhIHBzZXJ2ZXIsIGp1c3Qgc2VsZWN0IHRoYXQuCitUaG9zZSB1c2luZyBTU0ggYWNjZXNzIHNob3VsZCBjaG9vc2UgdGhlICdleHQnIHByb3RvY29sLCBhbmQgY29uZmlndXJlICdleHQnCithY2Nlc3Mgb24gdGhlIFByZWZlcmVuY2VzLT5UZWFtLT5DVlMtPkV4dENvbm5lY3Rpb24gcGFuZS4gU2V0IENWU19TRVJWRVIgdG8KKydnaXQtY3Zzc2VydmVyJy4gTm90IHRoYXQgcGFzc3dvcmQgc3VwcG9ydCBpcyBub3QgZ29vZCB3aGVuIHVzaW5nICdleHQnLAoreW91IHdpbGwgZGVmaW5pdGVseSB3YW50IHRvIGhhdmUgU1NIIGtleXMgc2V0dXAuCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4ganVzdCB1c2UgdGhlIG5vbi1zdGFuZGFyZCBleHRzc2ggcHJvdG9jb2wgdGhhdCBFY2xpcHNlCitvZmZlci4gSW4gdGhhdCBjYXNlIENWU19TRVJWRVIgaXMgaWdub3JlZCwgYW5kIHlvdSB3aWxsIGhhdmUgdG8gcmVwbGFjZQordGhlIGN2cyB1dGlsaXR5IG9uIHRoZSBzZXJ2ZXIgd2l0aCBnaXQtY3Zzc2VydmVyIG9yIG1hbmlwdWxhdGUgeW91ciAuYmFzaHJjCitzbyB0aGF0IGNhbGxpbmcgJ2N2cycgZWZmZWN0aXZlbHkgY2FsbHMgZ2l0LWN2c3NlcnZlci4KKworQ2xpZW50cyBrbm93biB0byB3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ1ZTIDEuMTIuOSBvbiBEZWJpYW4KK0NWUyAxLjExLjE3IG9uIE1hY09TWCAoZnJvbSBGaW5rIHBhY2thZ2UpCitFY2xpcHNlIDMuMCwgMy4xLjIgb24gTWFjT1NYIChzZWUgRWNsaXBzZSBDVlMgQ2xpZW50IE5vdGVzKQorVG9ydG9pc2VDVlMKKworT3BlcmF0aW9ucyBzdXBwb3J0ZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsbCB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZCBmb3Igbm9ybWFsIHVzZSBhcmUgc3VwcG9ydGVkLCBpbmNsdWRpbmcKK2NoZWNrb3V0LCBkaWZmLCBzdGF0dXMsIHVwZGF0ZSwgbG9nLCBhZGQsIHJlbW92ZSwgY29tbWl0LgorTGVnYWN5IG1vbml0b3Jpbmcgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCAoZWRpdCwgd2F0Y2ggYW5kIHJlbGF0ZWQpLgorRXhwb3J0cyBhbmQgdGFnZ2luZyAodGFncyBhbmQgYnJhbmNoZXMpIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgc3RhZ2UuCisKK1RoZSBzZXJ2ZXIgd2lsbCBzZXQgdGhlIC1rIG1vZGUgdG8gYmluYXJ5IHdoZW4gcmVsZXZhbnQuIEluIHByb3BlciBHSVQKK3RyYWRpdGlvbiwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBhcmUgYWx3YXlzIHJlc3BlY3RlZC4KK05vIGtleXdvcmQgZXhwYW5zaW9uIG9yIG5ld2xpbmUgbXVuZ2luZyBpcyBzdXBwb3J0ZWQuCisKK0RlcGVuZGVuY2llcworLS0tLS0tLS0tLS0tCisKK2dpdC1jdnNzZXJ2ZXIgZGVwZW5kcyBvbiBEQkQ6OlNRTGl0ZS4KKworQ29weXJpZ2h0IGFuZCBBdXRob3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBwcm9ncmFtIGlzIGNvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKworQXV0aG9yczogTWFydHluIFNtaXRoICAgIDxtYXJ0eW5AY2F0YWx5c3QubmV0Lm56PgorICAgICAgICAgTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56PgorICAgICAgICAgd2l0aCBpZGVhcyBhbmQgcGF0Y2hlcyBmcm9tIHBhcnRpY2lwYW50cyBvZiB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBNYXJ0eW4gU21pdGggPG1hcnR5bkBjYXRhbHlzdC5uZXQubno+IGFuZCBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+IE1hdHRoaWFzIFVybGljaHMgPHNtdXJmQHNtdXJmLm5vcmlzLmRlPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kYWVtb24udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZGFlbW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzM1N2RhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZGFlbW9uLnR4dApAQCAtMCwwICsxLDEwMiBAQAorZ2l0LWRhZW1vbigxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZGFlbW9uIC0gQSByZWFsbHkgc2ltcGxlIHNlcnZlciBmb3IgZ2l0IHJlcG9zaXRvcmllcworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtZGFlbW9uJyBbLS12ZXJib3NlXSBbLS1zeXNsb2ddIFstLWluZXRkIHwgLS1wb3J0PW5dIFstLWV4cG9ydC1hbGxdCisgICAgICAgICAgICAgWy0tdGltZW91dD1uXSBbLS1pbml0LXRpbWVvdXQ9bl0gWy0tc3RyaWN0LXBhdGhzXQorICAgICAgICAgICAgIFstLWJhc2UtcGF0aD1wYXRoXSBbLS11c2VyLXBhdGggfCAtLXVzZXItcGF0aD1wYXRoXQorCSAgICAgW2RpcmVjdG9yeS4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBIHJlYWxseSBzaW1wbGUgVENQIGdpdCBkYWVtb24gdGhhdCBub3JtYWxseSBsaXN0ZW5zIG9uIHBvcnQgIkRFRkFVTFRfR0lUX1BPUlQiCitha2EgOTQxOC4gSXQgd2FpdHMgZm9yIGEgY29ubmVjdGlvbiwgYW5kIHdpbGwganVzdCBleGVjdXRlICJnaXQtdXBsb2FkLXBhY2siCit3aGVuIGl0IGdldHMgb25lLgorCitJdCdzIGNhcmVmdWwgaW4gdGhhdCB0aGVyZSdzIGEgbWFnaWMgcmVxdWVzdC1saW5lIHRoYXQgZ2l2ZXMgdGhlIGNvbW1hbmQgYW5kCit3aGF0IGRpcmVjdG9yeSB0byB1cGxvYWQsIGFuZCBpdCB2ZXJpZmllcyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgT0suCisKK0l0IHZlcmlmaWVzIHRoYXQgdGhlIGRpcmVjdG9yeSBoYXMgdGhlIG1hZ2ljIGZpbGUgImdpdC1kYWVtb24tZXhwb3J0LW9rIiwgYW5kCitpdCB3aWxsIHJlZnVzZSB0byBleHBvcnQgYW55IGdpdCBkaXJlY3RvcnkgdGhhdCBoYXNuJ3QgZXhwbGljaXRseSBiZWVuIG1hcmtlZAorZm9yIGV4cG9ydCB0aGlzIHdheSAodW5sZXNzIHRoZSAnLS1leHBvcnQtYWxsJyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkKS4gSWYgeW91CitwYXNzIHNvbWUgZGlyZWN0b3J5IHBhdGhzIGFzICdnaXQtZGFlbW9uJyBhcmd1bWVudHMsIHlvdSBjYW4gZnVydGhlciByZXN0cmljdAordGhlIG9mZmVycyB0byBhIHdoaXRlbGlzdCBjb21wcmlzaW5nIG9mIHRob3NlLgorCitUaGlzIGlzIGlkZWFsbHkgc3VpdGVkIGZvciByZWFkLW9ubHkgdXBkYXRlcywgaS5lLiwgcHVsbGluZyBmcm9tIGdpdCByZXBvc2l0b3JpZXMuCisKK09QVElPTlMKKy0tLS0tLS0KKy0tc3RyaWN0LXBhdGhzOjoKKwlNYXRjaCBwYXRocyBleGFjdGx5IChpLmUuIGRvbid0IGFsbG93ICIvZm9vL3JlcG8iIHdoZW4gdGhlIHJlYWwgcGF0aCBpcworCSIvZm9vL3JlcG8uZ2l0IiBvciAiL2Zvby9yZXBvLy5naXQiKSBhbmQgZG9uJ3QgZG8gdXNlci1yZWxhdGl2ZSBwYXRocy4KKwlnaXQtZGFlbW9uIHdpbGwgcmVmdXNlIHRvIHN0YXJ0IHdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgbm8KKwl3aGl0ZWxpc3QgaXMgc3BlY2lmaWVkLgorCistLWJhc2UtcGF0aDo6CisJUmVtYXAgYWxsIHRoZSBwYXRoIHJlcXVlc3RzIGFzIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBwYXRoLgorCVRoaXMgaXMgc29ydCBvZiAiR0lUIHJvb3QiIC0gaWYgeW91IHJ1biBnaXQtZGFlbW9uIHdpdGgKKwknLS1iYXNlLXBhdGg9L3Nydi9naXQnIG9uIGV4YW1wbGUuY29tLCB0aGVuIGlmIHlvdSBsYXRlciB0cnkgdG8gcHVsbAorCSdnaXQ6Ly9leGFtcGxlLmNvbS9oZWxsby5naXQnLCBgZ2l0LWRhZW1vbmAgd2lsbCBpbnRlcnByZXQgdGhlIHBhdGgKKwlhcyAnL3Nydi9naXQvaGVsbG8uZ2l0Jy4KKworLS1leHBvcnQtYWxsOjoKKwlBbGxvdyBwdWxsaW5nIGZyb20gYWxsIGRpcmVjdG9yaWVzIHRoYXQgbG9vayBsaWtlIEdJVCByZXBvc2l0b3JpZXMKKwkoaGF2ZSB0aGUgJ29iamVjdHMnIGFuZCAncmVmcycgc3ViZGlyZWN0b3JpZXMpLCBldmVuIGlmIHRoZXkKKwlkbyBub3QgaGF2ZSB0aGUgJ2dpdC1kYWVtb24tZXhwb3J0LW9rJyBmaWxlLgorCistLWluZXRkOjoKKwlIYXZlIHRoZSBzZXJ2ZXIgcnVuIGFzIGFuIGluZXRkIHNlcnZpY2UuIEltcGxpZXMgLS1zeXNsb2cuCisKKy0tcG9ydDo6CisJTGlzdGVuIG9uIGFuIGFsdGVybmF0aXZlIHBvcnQuCisKKy0taW5pdC10aW1lb3V0OjoKKwlUaW1lb3V0IGJldHdlZW4gdGhlIG1vbWVudCB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlCisJY2xpZW50IHJlcXVlc3QgaXMgcmVjZWl2ZWQgKHR5cGljYWxseSBhIHJhdGhlciBsb3cgdmFsdWUsIHNpbmNlCisJdGhhdCBzaG91bGQgYmUgYmFzaWNhbGx5IGltbWVkaWF0ZSkuCisKKy0tdGltZW91dDo6CisJVGltZW91dCBmb3Igc3BlY2lmaWMgY2xpZW50IHN1Yi1yZXF1ZXN0cy4gVGhpcyBpbmNsdWRlcyB0aGUgdGltZQorCWl0IHRha2VzIGZvciB0aGUgc2VydmVyIHRvIHByb2Nlc3MgdGhlIHN1Yi1yZXF1ZXN0IGFuZCB0aW1lIHNwZW50CisJd2FpdGluZyBmb3IgbmV4dCBjbGllbnQncyByZXF1ZXN0LgorCistLXN5c2xvZzo6CisJTG9nIHRvIHN5c2xvZyBpbnN0ZWFkIG9mIHN0ZGVyci4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGRvZXMgbm90IGltcGx5CisJLS12ZXJib3NlLCB0aHVzIGJ5IGRlZmF1bHQgb25seSBlcnJvciBjb25kaXRpb25zIHdpbGwgYmUgbG9nZ2VkLgorCistLXVzZXItcGF0aCwgLS11c2VyLXBhdGg9cGF0aDo6CisJQWxsb3cgfnVzZXIgbm90YXRpb24gdG8gYmUgdXNlZCBpbiByZXF1ZXN0cy4gIFdoZW4KKwlzcGVjaWZpZWQgd2l0aCBubyBwYXJhbWV0ZXIsIHJlcXVlc3RzIHRvCisJZ2l0Oi8vaG9zdC9+YWxpY2UvZm9vIGlzIHRha2VuIGFzIGEgcmVxdWVzdCB0byBhY2Nlc3MKKwknZm9vJyByZXBvc2l0b3J5IGluIHRoZSBob21lIGRpcmVjdG9yeSBvZiB1c2VyIGBhbGljZWAuCisJSWYgYC0tdXNlci1wYXRoPXBhdGhgIGlzIHNwZWNpZmllZCwgdGhlIHNhbWUgcmVxdWVzdCBpcworCXRha2VuIGFzIGEgcmVxdWVzdCB0byBhY2Nlc3MgYHBhdGgvZm9vYCByZXBvc2l0b3J5IGluCisJdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHVzZXIgYGFsaWNlYC4KKworLS12ZXJib3NlOjoKKwlMb2cgZGV0YWlscyBhYm91dCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIHJlcXVlc3RlZCBmaWxlcy4KKworPGRpcmVjdG9yeT46OgorCUEgZGlyZWN0b3J5IHRvIGFkZCB0byB0aGUgd2hpdGVsaXN0IG9mIGFsbG93ZWQgZGlyZWN0b3JpZXMuIFVubGVzcworCS0tc3RyaWN0LXBhdGhzIGlzIHNwZWNpZmllZCB0aGlzIHdpbGwgYWxzbyBpbmNsdWRlIHN1YmRpcmVjdG9yaWVzCisJb2YgZWFjaCBuYW1lZCBkaXJlY3RvcnkuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sIFlPU0hJRlVKSSBIaWRlYWtpCis8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+IGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZGVzY3JpYmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZGVzY3JpYmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDBmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kZXNjcmliZS50eHQKQEAgLTAsMCArMSw3OSBAQAorZ2l0LWRlc2NyaWJlKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRlc2NyaWJlIC0gU2hvdyB0aGUgbW9zdCByZWNlbnQgdGFnIHRoYXQgaXMgcmVhY2hhYmxlIGZyb20gYSBjb21taXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZGVzY3JpYmUnIFstLWFsbF0gWy0tdGFnc10gWy0tYWJicmV2PTxuPl0gPGNvbW1pdHRpc2g+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhlIGNvbW1hbmQgZmluZHMgdGhlIG1vc3QgcmVjZW50IHRhZyB0aGF0IGlzIHJlYWNoYWJsZSBmcm9tIGEKK2NvbW1pdCwgYW5kIGlmIHRoZSBjb21taXQgaXRzZWxmIGlzIHBvaW50ZWQgYXQgYnkgdGhlIHRhZywgc2hvd3MKK3RoZSB0YWcuICBPdGhlcndpc2UsIGl0IHN1ZmZpeGVzIHRoZSB0YWcgbmFtZSB3aXRoIGFiYnJldmlhdGVkCitvYmplY3QgbmFtZSBvZiB0aGUgY29tbWl0LgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxjb21taXR0aXNoPjo6CisJVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBjb21taXR0aXNoLgorCistLWFsbDo6CisJSW5zdGVhZCBvZiB1c2luZyBvbmx5IHRoZSBhbm5vdGF0ZWQgdGFncywgdXNlIGFueSByZWYKKwlmb3VuZCBpbiBgLmdpdC9yZWZzL2AuCisKKy0tdGFnczo6CisJSW5zdGVhZCBvZiB1c2luZyBvbmx5IHRoZSBhbm5vdGF0ZWQgdGFncywgdXNlIGFueSB0YWcKKwlmb3VuZCBpbiBgLmdpdC9yZWZzL3RhZ3NgLgorCistLWFiYnJldj08bj46OgorCUluc3RlYWQgb2YgdXNpbmcgdGhlIGRlZmF1bHQgOCBoZXhhZGVjaW1hbCBkaWdpdHMgYXMgdGhlCisJYWJicmV2aWF0ZWQgb2JqZWN0IG5hbWUsIHVzZSA8bj4gZGlnaXRzLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitXaXRoIHNvbWV0aGluZyBsaWtlIGdpdC5naXQgY3VycmVudCB0cmVlLCBJIGdldDoKKworCVt0b3J2YWxkc0BnNSBnaXRdJCBnaXQtZGVzY3JpYmUgcGFyZW50CisJdjEuMC40LWcyNDE0NzIxYgorCitpLmUuIHRoZSBjdXJyZW50IGhlYWQgb2YgbXkgInBhcmVudCIgYnJhbmNoIGlzIGJhc2VkIG9uIHYxLjAuNCwKK2J1dCBzaW5jZSBpdCBoYXMgYSBmZXcgY29tbWl0cyBvbiB0b3Agb2YgdGhhdCwgaXQgaGFzIGFkZGVkIHRoZQorZ2l0IGhhc2ggb2YgdGhlIHRoaW5nIHRvIHRoZSBlbmQ6ICItZyIgKyA4LWNoYXIgc2hvcnRoYW5kIGZvcgordGhlIGNvbW1pdCBgMjQxNDcyMWIxOTQ0NTNmMDU4MDc5ZDg5N2QxM2M0ZTM3N2Y5MmRjNmAuCisKK0RvaW5nIGEgImdpdC1kZXNjcmliZSIgb24gYSB0YWctbmFtZSB3aWxsIGp1c3Qgc2hvdyB0aGUgdGFnIG5hbWU6CisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0LWRlc2NyaWJlIHYxLjAuNAorCXYxLjAuNAorCitXaXRoIC0tYWxsLCB0aGUgY29tbWFuZCBjYW4gdXNlIGJyYW5jaCBoZWFkcyBhcyByZWZlcmVuY2VzLCBzbwordGhlIG91dHB1dCBzaG93cyB0aGUgcmVmZXJlbmNlIHBhdGggYXMgd2VsbDoKKworCVt0b3J2YWxkc0BnNSBnaXRdJCBnaXQgZGVzY3JpYmUgLS1hbGwgLS1hYmJyZXY9NCB2MS4wLjVeMgorCXRhZ3MvdjEuMC4wLWc5NzViCisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0IGRlc2NyaWJlIC0tYWxsIEhFQUReCisJaGVhZHMvbHQvZGVzY3JpYmUtZzk3NWIKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+LCBidXQgc29tZXdoYXQKK2J1dGNoZXJlZCBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1maWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWZpbGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFiOGIzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1maWxlcy50eHQKQEAgLTAsMCArMSw1OCBAQAorZ2l0LWRpZmYtZmlsZXMoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmLWZpbGVzIC0gQ29tcGFyZXMgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWRpZmYtZmlsZXMnIFstcV0gWy0wfC0xfC0yfC0zfC1jfC0tY2NdIFs8Y29tbW9uIGRpZmYgb3B0aW9ucz5dIFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ29tcGFyZXMgdGhlIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUgYW5kIHRoZSBpbmRleC4gIFdoZW4gcGF0aHMKK2FyZSBzcGVjaWZpZWQsIGNvbXBhcmVzIG9ubHkgdGhvc2UgbmFtZWQgcGF0aHMuICBPdGhlcndpc2UgYWxsCitlbnRyaWVzIGluIHRoZSBpbmRleCBhcmUgY29tcGFyZWQuICBUaGUgb3V0cHV0IGZvcm1hdCBpcyB0aGUKK3NhbWUgYXMgImdpdC1kaWZmLWluZGV4IiBhbmQgImdpdC1kaWZmLXRyZWUiLgorCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpkaWZmLW9wdGlvbnMudHh0W10KKworLTEgLTIgLTMgb3IgLS1iYXNlIC0tb3VycyAtLXRoZWlycywgYW5kIC0wOjoKKwlEaWZmIGFnYWluc3QgdGhlICJiYXNlIiB2ZXJzaW9uLCAib3VyIGJyYW5jaCIgb3IgInRoZWlyCisJYnJhbmNoIiByZXNwZWN0aXZlbHkuICBXaXRoIHRoZXNlIG9wdGlvbnMsIGRpZmZzIGZvcgorCW1lcmdlZCBlbnRyaWVzIGFyZSBub3Qgc2hvd24uCisrCitUaGUgZGVmYXVsdCBpcyB0byBkaWZmIGFnYWluc3Qgb3VyIGJyYW5jaCAoLTIpIGFuZCB0aGUgCitjbGVhbmx5IHJlc29sdmVkIHBhdGhzLiAgVGhlIG9wdGlvbiAtMCBjYW4gYmUgZ2l2ZW4gdG8KK29taXQgZGlmZiBvdXRwdXQgZm9yIHVubWVyZ2VkIGVudHJpZXMgYW5kIGp1c3Qgc2hvdyAiVW5tZXJnZWQiLgorCistYywtLWNjOjoKKwlUaGlzIGNvbXBhcmVzIHN0YWdlIDIgKG91ciBicmFuY2gpLCBzdGFnZSAzICh0aGVpcgorCWJyYW5jaCkgYW5kIHRoZSB3b3JraW5nIHRyZWUgZmlsZSBhbmQgb3V0cHV0cyBhIGNvbWJpbmVkCisJZGlmZiwgc2ltaWxhciB0byB0aGUgd2F5ICdkaWZmLXRyZWUnIHNob3dzIGEgbWVyZ2UKKwljb21taXQgd2l0aCB0aGVzZSBmbGFncy4KKworLXE6OgorCVJlbWFpbiBzaWxlbnQgZXZlbiBvbiBub25leGlzdGluZyBmaWxlcworCitPdXRwdXQgZm9ybWF0CistLS0tLS0tLS0tLS0tCitpbmNsdWRlOjpkaWZmLWZvcm1hdC50eHRbXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDQzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWluZGV4LnR4dApAQCAtMCwwICsxLDEzMyBAQAorZ2l0LWRpZmYtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmLWluZGV4IC0gQ29tcGFyZXMgY29udGVudCBhbmQgbW9kZSBvZiBibG9icyBiZXR3ZWVuIHRoZSBpbmRleCBhbmQgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1kaWZmLWluZGV4JyBbLW1dIFstLWNhY2hlZF0gWzxjb21tb24gZGlmZiBvcHRpb25zPl0gPHRyZWUtaXNoPiBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXBhcmVzIHRoZSBjb250ZW50IGFuZCBtb2RlIG9mIHRoZSBibG9icyBmb3VuZCB2aWEgYSB0cmVlCitvYmplY3Qgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCBpbmRleCBhbmQsIG9wdGlvbmFsbHkKK2lnbm9yaW5nIHRoZSBzdGF0IHN0YXRlIG9mIHRoZSBmaWxlIG9uIGRpc2suICBXaGVuIHBhdGhzIGFyZQorc3BlY2lmaWVkLCBjb21wYXJlcyBvbmx5IHRob3NlIG5hbWVkIHBhdGhzLiAgT3RoZXJ3aXNlIGFsbAorZW50cmllcyBpbiB0aGUgaW5kZXggYXJlIGNvbXBhcmVkLgorCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpkaWZmLW9wdGlvbnMudHh0W10KKworPHRyZWUtaXNoPjo6CisJVGhlIGlkIG9mIGEgdHJlZSBvYmplY3QgdG8gZGlmZiBhZ2FpbnN0LgorCistLWNhY2hlZDo6CisJZG8gbm90IGNvbnNpZGVyIHRoZSBvbi1kaXNrIGZpbGUgYXQgYWxsCisKKy1tOjoKKwlCeSBkZWZhdWx0LCBmaWxlcyByZWNvcmRlZCBpbiB0aGUgaW5kZXggYnV0IG5vdCBjaGVja2VkCisJb3V0IGFyZSByZXBvcnRlZCBhcyBkZWxldGVkLiAgVGhpcyBmbGFnIG1ha2VzCisJImdpdC1kaWZmLWluZGV4IiBzYXkgdGhhdCBhbGwgbm9uLWNoZWNrZWQtb3V0IGZpbGVzIGFyZSB1cAorCXRvIGRhdGUuCisKK091dHB1dCBmb3JtYXQKKy0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtZm9ybWF0LnR4dFtdCisKK09wZXJhdGluZyBNb2RlcworLS0tLS0tLS0tLS0tLS0tCitZb3UgY2FuIGNob29zZSB3aGV0aGVyIHlvdSB3YW50IHRvIHRydXN0IHRoZSBpbmRleCBmaWxlIGVudGlyZWx5CisodXNpbmcgdGhlICctLWNhY2hlZCcgZmxhZykgb3IgYXNrIHRoZSBkaWZmIGxvZ2ljIHRvIHNob3cgYW55IGZpbGVzCit0aGF0IGRvbid0IG1hdGNoIHRoZSBzdGF0IHN0YXRlIGFzIGJlaW5nICJ0ZW50YXRpdmVseSBjaGFuZ2VkIi4gIEJvdGgKK29mIHRoZXNlIG9wZXJhdGlvbnMgYXJlIHZlcnkgdXNlZnVsIGluZGVlZC4KKworQ2FjaGVkIE1vZGUKKy0tLS0tLS0tLS0tCitJZiAnLS1jYWNoZWQnIGlzIHNwZWNpZmllZCwgaXQgYWxsb3dzIHlvdSB0byBhc2s6CisKKwlzaG93IG1lIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIEhFQUQgYW5kIHRoZSBjdXJyZW50IGluZGV4CisJY29udGVudHMgKHRoZSBvbmVzIEknZCB3cml0ZSB3aXRoIGEgImdpdC13cml0ZS10cmVlIikKKworRm9yIGV4YW1wbGUsIGxldCdzIHNheSB0aGF0IHlvdSBoYXZlIHdvcmtlZCBvbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LCB1cGRhdGVkCitzb21lIGZpbGVzIGluIHRoZSBpbmRleCBhbmQgYXJlIHJlYWR5IHRvIGNvbW1pdC4gWW91IHdhbnQgdG8gc2VlIGV4YWN0bHkKKyp3aGF0KiB5b3UgYXJlIGdvaW5nIHRvIGNvbW1pdCBpcyB3aXRob3V0IGhhdmluZyB0byB3cml0ZSBhIG5ldyB0cmVlCitvYmplY3QgYW5kIGNvbXBhcmUgaXQgdGhhdCB3YXksIGFuZCB0byBkbyB0aGF0LCB5b3UganVzdCBkbworCisJZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRAorCitFeGFtcGxlOiBsZXQncyBzYXkgSSBoYWQgcmVuYW1lZCBgY29tbWl0LmNgIHRvIGBnaXQtY29tbWl0LmNgLCBhbmQgSSBoYWQKK2RvbmUgYW4gImdpdC11cGRhdGUtaW5kZXgiIHRvIG1ha2UgdGhhdCBlZmZlY3RpdmUgaW4gdGhlIGluZGV4IGZpbGUuCisiZ2l0LWRpZmYtZmlsZXMiIHdvdWxkbid0IHNob3cgYW55dGhpbmcgYXQgYWxsLCBzaW5jZSB0aGUgaW5kZXggZmlsZQorbWF0Y2hlcyBteSB3b3JraW5nIGRpcmVjdG9yeS4gQnV0IGRvaW5nIGEgImdpdC1kaWZmLWluZGV4IiBkb2VzOgorCisgIHRvcnZhbGRzQHBwYzk3MDp+L2dpdD4gZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRAorICAtMTAwNjQ0IGJsb2IgICAgNDE2MWFlY2M2NzAwYTJlYjU3OWU4NDJhZjBiN2YyMmI5ODQ0M2Y3NCAgICAgICAgY29tbWl0LmMKKyAgKzEwMDY0NCBibG9iICAgIDQxNjFhZWNjNjcwMGEyZWI1NzllODQyYWYwYjdmMjJiOTg0NDNmNzQgICAgICAgIGdpdC1jb21taXQuYworCitZb3UgY2FuIHRyaXZpYWxseSBzZWUgdGhhdCB0aGUgYWJvdmUgaXMgYSByZW5hbWUuCisKK0luIGZhY3QsICJnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCIgKnNob3VsZCogYWx3YXlzIGJlIGVudGlyZWx5IGVxdWl2YWxlbnQgdG8KK2FjdHVhbGx5IGRvaW5nIGEgImdpdC13cml0ZS10cmVlIiBhbmQgY29tcGFyaW5nIHRoYXQuIEV4Y2VwdCB0aGlzIG9uZSBpcyBtdWNoCituaWNlciBmb3IgdGhlIGNhc2Ugd2hlcmUgeW91IGp1c3Qgd2FudCB0byBjaGVjayB3aGVyZSB5b3UgYXJlLgorCitTbyBkb2luZyBhICJnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCIgaXMgYmFzaWNhbGx5IHZlcnkgdXNlZnVsIHdoZW4geW91IGFyZQorYXNraW5nIHlvdXJzZWxmICJ3aGF0IGhhdmUgSSBhbHJlYWR5IG1hcmtlZCBmb3IgYmVpbmcgY29tbWl0dGVkLCBhbmQgCit3aGF0J3MgdGhlIGRpZmZlcmVuY2UgdG8gYSBwcmV2aW91cyB0cmVlIi4KKworTm9uLWNhY2hlZCBNb2RlCistLS0tLS0tLS0tLS0tLS0KK1RoZSAibm9uLWNhY2hlZCIgbW9kZSB0YWtlcyBhIGRpZmZlcmVudCBhcHByb2FjaCwgYW5kIGlzIHBvdGVudGlhbGx5Cit0aGUgbW9yZSB1c2VmdWwgb2YgdGhlIHR3byBpbiB0aGF0IHdoYXQgaXQgZG9lcyBjYW4ndCBiZSBlbXVsYXRlZCB3aXRoCithICJnaXQtd3JpdGUtdHJlZSIgKyAiZ2l0LWRpZmYtdHJlZSIuIFRodXMgdGhhdCdzIHRoZSBkZWZhdWx0IG1vZGUuCitUaGUgbm9uLWNhY2hlZCB2ZXJzaW9uIGFza3MgdGhlIHF1ZXN0aW9uOgorCisgIHNob3cgbWUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSEVBRCBhbmQgdGhlIGN1cnJlbnRseSBjaGVja2VkIG91dAorICB0cmVlIC0gaW5kZXggY29udGVudHMgX2FuZF8gZmlsZXMgdGhhdCBhcmVuJ3QgdXAtdG8tZGF0ZQorCit3aGljaCBpcyBvYnZpb3VzbHkgYSB2ZXJ5IHVzZWZ1bCBxdWVzdGlvbiB0b28sIHNpbmNlIHRoYXQgdGVsbHMgeW91IHdoYXQKK3lvdSAqY291bGQqIGNvbW1pdC4gQWdhaW4sIHRoZSBvdXRwdXQgbWF0Y2hlcyB0aGUgImdpdC1kaWZmLXRyZWUgLXIiCitvdXRwdXQgdG8gYSB0ZWUsIGJ1dCB3aXRoIGEgdHdpc3QuCisKK1RoZSB0d2lzdCBpcyB0aGF0IGlmIHNvbWUgZmlsZSBkb2Vzbid0IG1hdGNoIHRoZSBpbmRleCwgd2UgZG9uJ3QgaGF2ZQorYSBiYWNraW5nIHN0b3JlIHRoaW5nIGZvciBpdCwgYW5kIHdlIHVzZSB0aGUgbWFnaWMgImFsbC16ZXJvIiBzaGExIHRvCitzaG93IHRoYXQuIFNvIGxldCdzIHNheSB0aGF0IHlvdSBoYXZlIGVkaXRlZCBga2VybmVsL3NjaGVkLmNgLCBidXQKK2hhdmUgbm90IGFjdHVhbGx5IGRvbmUgYSAiZ2l0LXVwZGF0ZS1pbmRleCIgb24gaXQgeWV0IC0gdGhlcmUgaXMgbm8KKyJvYmplY3QiIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHN0YXRlLCBhbmQgeW91IGdldDoKKworICB0b3J2YWxkc0BwcGM5NzA6fi92Mi42L2xpbnV4PiBnaXQtZGlmZi1pbmRleCBIRUFECisgICoxMDA2NDQtPjEwMDY2NCBibG9iICAgIDc0NzZiYi4uLi4uLi0+MDAwMDAwLi4uLi4uICAgICAga2VybmVsL3NjaGVkLmMKKworaS5lLiwgaXQgc2hvd3MgdGhhdCB0aGUgdHJlZSBoYXMgY2hhbmdlZCwgYW5kIHRoYXQgYGtlcm5lbC9zY2hlZC5jYCBoYXMgaXMKK25vdCB1cC10by1kYXRlIGFuZCBtYXkgY29udGFpbiBuZXcgc3R1ZmYuIFRoZSBhbGwtemVybyBzaGExIG1lYW5zIHRoYXQgdG8KK2dldCB0aGUgcmVhbCBkaWZmLCB5b3UgbmVlZCB0byBsb29rIGF0IHRoZSBvYmplY3QgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CitkaXJlY3RseSByYXRoZXIgdGhhbiBkbyBhbiBvYmplY3QtdG8tb2JqZWN0IGRpZmYuCisKK05PVEU6IEFzIHdpdGggb3RoZXIgY29tbWFuZHMgb2YgdGhpcyB0eXBlLCAiZ2l0LWRpZmYtaW5kZXgiIGRvZXMgbm90CithY3R1YWxseSBsb29rIGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCBhbGwuIFNvIG1heWJlCitga2VybmVsL3NjaGVkLmNgIGhhc24ndCBhY3R1YWxseSBjaGFuZ2VkLCBhbmQgaXQncyBqdXN0IHRoYXQgeW91Cit0b3VjaGVkIGl0LiBJbiBlaXRoZXIgY2FzZSwgaXQncyBhIG5vdGUgdGhhdCB5b3UgbmVlZCB0bworImdpdC11cGRhdGUtaW5kZXgiIGl0IHRvIG1ha2UgdGhlIGluZGV4IGJlIGluIHN5bmMuCisKK05PVEU6IFlvdSBjYW4gaGF2ZSBhIG1peHR1cmUgb2YgZmlsZXMgc2hvdyB1cCBhcyAiaGFzIGJlZW4gdXBkYXRlZCIKK2FuZCAiaXMgc3RpbGwgZGlydHkgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IiB0b2dldGhlci4gWW91IGNhbiBhbHdheXMKK3RlbGwgd2hpY2ggZmlsZSBpcyBpbiB3aGljaCBzdGF0ZSwgc2luY2UgdGhlICJoYXMgYmVlbiB1cGRhdGVkIiBvbmVzCitzaG93IGEgdmFsaWQgc2hhMSwgYW5kIHRoZSAibm90IGluIHN5bmMgd2l0aCB0aGUgaW5kZXgiIG9uZXMgd2lsbAorYWx3YXlzIGhhdmUgdGhlIHNwZWNpYWwgYWxsLXplcm8gc2hhMS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1zdGFnZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1zdGFnZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNzM5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXN0YWdlcy50eHQKQEAgLTAsMCArMSw0MCBAQAorZ2l0LWRpZmYtc3RhZ2VzKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRpZmYtc3RhZ2VzIC0gQ29tcGFyZXMgY29udGVudCBhbmQgbW9kZSBvZiBibG9icyBiZXR3ZWVuIHN0YWdlcyBpbiBhbiB1bm1lcmdlZCBpbmRleCBmaWxlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWRpZmYtc3RhZ2VzJyBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8c3RhZ2UxPiA8c3RhZ2UyPiBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXBhcmVzIHRoZSBjb250ZW50IGFuZCBtb2RlIG9mIHRoZSBibG9icyBpbiB0d28gc3RhZ2VzIGluIGFuCit1bm1lcmdlZCBpbmRleCBmaWxlLgorCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpkaWZmLW9wdGlvbnMudHh0W10KKworPHN0YWdlMT4sPHN0YWdlMj46OgorCVRoZSBzdGFnZSBudW1iZXIgdG8gYmUgY29tcGFyZWQuCisKK091dHB1dCBmb3JtYXQKKy0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtZm9ybWF0LnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U4ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi10cmVlLnR4dApAQCAtMCwwICsxLDE2OSBAQAorZ2l0LWRpZmYtdHJlZSgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZGlmZi10cmVlIC0gQ29tcGFyZXMgdGhlIGNvbnRlbnQgYW5kIG1vZGUgb2YgYmxvYnMgZm91bmQgdmlhIHR3byB0cmVlIG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtZGlmZi10cmVlJyBbLS1zdGRpbl0gWy1tXSBbLXNdIFstdl0gWy0tbm8tY29tbWl0LWlkXSBbLS1wcmV0dHldCisJICAgICAgWy10XSBbLXJdIFstYyB8IC0tY2NdIFstLXJvb3RdIFs8Y29tbW9uIGRpZmYgb3B0aW9ucz5dCisJICAgICAgPHRyZWUtaXNoPiBbPHRyZWUtaXNoPl0gWzxwYXRoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDb21wYXJlcyB0aGUgY29udGVudCBhbmQgbW9kZSBvZiB0aGUgYmxvYnMgZm91bmQgdmlhIHR3byB0cmVlIG9iamVjdHMuCisKK0lmIHRoZXJlIGlzIG9ubHkgb25lIDx0cmVlLWlzaD4gZ2l2ZW4sIHRoZSBjb21taXQgaXMgY29tcGFyZWQgd2l0aCBpdHMgcGFyZW50cworKHNlZSAtLXN0ZGluIGJlbG93KS4KKworTm90ZSB0aGF0ICJnaXQtZGlmZi10cmVlIiBjYW4gdXNlIHRoZSB0cmVlIGVuY2Fwc3VsYXRlZCBpbiBhIGNvbW1pdCBvYmplY3QuCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCis8dHJlZS1pc2g+OjoKKwlUaGUgaWQgb2YgYSB0cmVlIG9iamVjdC4KKworPHBhdGg+Li4uOjoKKwlJZiBwcm92aWRlZCwgdGhlIHJlc3VsdHMgYXJlIGxpbWl0ZWQgdG8gYSBzdWJzZXQgb2YgZmlsZXMKKwltYXRjaGluZyBvbmUgb2YgdGhlc2UgcHJlZml4IHN0cmluZ3MuCisJaS5lLiwgZmlsZSBtYXRjaGVzIGAvXjxwYXR0ZXJuMT58PHBhdHRlcm4yPnwuLi4vYAorCU5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBkb2VzIG5vdCBwcm92aWRlIGFueSB3aWxkY2FyZCBvciByZWdleHAKKwlmZWF0dXJlcy4KKworLXI6OgorICAgICAgICByZWN1cnNlIGludG8gc3ViLXRyZWVzCisKKy10OjoKKwlzaG93IHRyZWUgZW50cnkgaXRzZWxmIGFzIHdlbGwgYXMgc3VidHJlZXMuICBJbXBsaWVzIC1yLgorCistLXJvb3Q6OgorCVdoZW4gJy0tcm9vdCcgaXMgc3BlY2lmaWVkIHRoZSBpbml0aWFsIGNvbW1pdCB3aWxsIGJlIHNob3dlZCBhcyBhIGJpZworCWNyZWF0aW9uIGV2ZW50LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBkaWZmIGFnYWluc3QgdGhlIE5VTEwgdHJlZS4KKworLS1zdGRpbjo6CisJV2hlbiAnLS1zdGRpbicgaXMgc3BlY2lmaWVkLCB0aGUgY29tbWFuZCBkb2VzIG5vdCB0YWtlCisJPHRyZWUtaXNoPiBhcmd1bWVudHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgSW5zdGVhZCwgaXQKKwlyZWFkcyBlaXRoZXIgb25lIDxjb21taXQ+IG9yIGEgcGFpciBvZiA8dHJlZS1pc2g+CisJc2VwYXJhdGVkIHdpdGggYSBzaW5nbGUgc3BhY2UgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQuCisrCitXaGVuIGEgc2luZ2xlIGNvbW1pdCBpcyBnaXZlbiBvbiBvbmUgbGluZSBvZiBzdWNoIGlucHV0LCBpdCBjb21wYXJlcwordGhlIGNvbW1pdCB3aXRoIGl0cyBwYXJlbnRzLiAgVGhlIGZvbGxvd2luZyBmbGFncyBmdXJ0aGVyIGFmZmVjdHMgaXRzCitiZWhhdmlvci4gIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gdGhlIGNhc2Ugd2hlcmUgdHdvIDx0cmVlLWlzaD4KK3NlcGFyYXRlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGFyZSBnaXZlbi4KKworLW06OgorCUJ5IGRlZmF1bHQsICJnaXQtZGlmZi10cmVlIC0tc3RkaW4iIGRvZXMgbm90IHNob3cKKwlkaWZmZXJlbmNlcyBmb3IgbWVyZ2UgY29tbWl0cy4gIFdpdGggdGhpcyBmbGFnLCBpdCBzaG93cworCWRpZmZlcmVuY2VzIHRvIHRoYXQgY29tbWl0IGZyb20gYWxsIG9mIGl0cyBwYXJlbnRzLiBTZWUKKwlhbHNvICctYycuCisKKy1zOjoKKwlCeSBkZWZhdWx0LCAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIiBzaG93cyBkaWZmZXJlbmNlcywKKwllaXRoZXIgaW4gbWFjaGluZS1yZWFkYWJsZSBmb3JtICh3aXRob3V0ICctcCcpIG9yIGluIHBhdGNoCisJZm9ybSAod2l0aCAnLXAnKS4gIFRoaXMgb3V0cHV0IGNhbiBiZSBzdXBwcmVzc2VkLiAgSXQgaXMKKwlvbmx5IHVzZWZ1bCB3aXRoICctdicgZmxhZy4KKworLXY6OgorCVRoaXMgZmxhZyBjYXVzZXMgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiIgdG8gYWxzbyBzaG93CisJdGhlIGNvbW1pdCBtZXNzYWdlIGJlZm9yZSB0aGUgZGlmZmVyZW5jZXMuCisKKy0tcHJldHR5Wz0ocmF3fG1lZGl1bXxzaG9ydCldOjoKKwlUaGlzIGlzIHVzZWQgdG8gY29udHJvbCAicHJldHR5IHByaW50aW5nIiBmb3JtYXQgb2YgdGhlCisJY29tbWl0IG1lc3NhZ2UuICBXaXRob3V0ICI9PHN0eWxlPiIsIGl0IGRlZmF1bHRzIHRvCisJbWVkaXVtLgorCistLW5vLWNvbW1pdC1pZDo6CisJZ2l0LWRpZmYtdHJlZSBvdXRwdXRzIGEgbGluZSB3aXRoIHRoZSBjb21taXQgSUQgd2hlbgorCWFwcGxpY2FibGUuICBUaGlzIGZsYWcgc3VwcHJlc3NlZCB0aGUgY29tbWl0IElEIG91dHB1dC4KKworLWM6OgorCVRoaXMgZmxhZyBjaGFuZ2VzIHRoZSB3YXkgYSBtZXJnZSBjb21taXQgaXMgZGlzcGxheWVkCisJKHdoaWNoIG1lYW5zIGl0IGlzIHVzZWZ1bCBvbmx5IHdoZW4gdGhlIGNvbW1hbmQgaXMgZ2l2ZW4KKwlvbmUgPHRyZWUtaXNoPiwgb3IgJy0tc3RkaW4nKS4gIEl0IHNob3dzIHRoZSBkaWZmZXJlbmNlcworCWZyb20gZWFjaCBvZiB0aGUgcGFyZW50cyB0byB0aGUgbWVyZ2UgcmVzdWx0IHNpbXVsdGFuZW91c2x5CisJaW5zdGVhZCBvZiBzaG93aW5nIHBhaXJ3aXNlIGRpZmYgYmV0d2VlbiBhIHBhcmVudCBhbmQgdGhlCisJcmVzdWx0IG9uZSBhdCBhIHRpbWUgKHdoaWNoIGlzIHdoYXQgdGhlICctbScgb3B0aW9uIGRvZXMpLgorCUZ1cnRoZXJtb3JlLCBpdCBsaXN0cyBvbmx5IGZpbGVzIHdoaWNoIHdlcmUgbW9kaWZpZWQKKwlmcm9tIGFsbCBwYXJlbnRzLgorCistLWNjOjoKKwlUaGlzIGZsYWcgY2hhbmdlcyB0aGUgd2F5IGEgbWVyZ2UgY29tbWl0IHBhdGNoIGlzIGRpc3BsYXllZCwKKwlpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSAnLWMnIG9wdGlvbi4gSXQgaW1wbGllcyB0aGUgJy1jJworCWFuZCAnLXAnIG9wdGlvbnMgYW5kIGZ1cnRoZXIgY29tcHJlc3NlcyB0aGUgcGF0Y2ggb3V0cHV0CisJYnkgb21pdHRpbmcgaHVua3MgdGhhdCBzaG93IGRpZmZlcmVuY2VzIGZyb20gb25seSBvbmUKKwlwYXJlbnQsIG9yIHNob3cgdGhlIHNhbWUgY2hhbmdlIGZyb20gYWxsIGJ1dCBvbmUgcGFyZW50CisJZm9yIGFuIE9jdG9wdXMgbWVyZ2UuICBXaGVuIHRoaXMgb3B0aW1pemF0aW9uIG1ha2VzIGFsbAorCWh1bmtzIGRpc2FwcGVhciwgdGhlIGNvbW1pdCBpdHNlbGYgYW5kIHRoZSBjb21taXQgbG9nCisJbWVzc2FnZSBpcyBub3Qgc2hvd24sIGp1c3QgbGlrZSBpbiBhbnkgb3RoZXIgImVtcHR5IGRpZmYiIGNhc2UuCisKKy0tYWx3YXlzOjoKKwlTaG93IHRoZSBjb21taXQgaXRzZWxmIGFuZCB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGV2ZW4KKwlpZiB0aGUgZGlmZiBpdHNlbGYgaXMgZW1wdHkuCisKKworTGltaXRpbmcgT3V0cHV0CistLS0tLS0tLS0tLS0tLS0KK0lmIHlvdSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZGlmZmVyZW5jZXMgaW4gYSBzdWJzZXQgb2YgZmlsZXMsIGZvcgorZXhhbXBsZSBzb21lIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcywgeW91IG1pZ2h0IGRvOgorCisJZ2l0LWRpZmYtdHJlZSAtciA8dHJlZS1pc2g+IDx0cmVlLWlzaD4gYXJjaC9pYTY0IGluY2x1ZGUvYXNtLWlhNjQKKworYW5kIGl0IHdpbGwgb25seSBzaG93IHlvdSB3aGF0IGNoYW5nZWQgaW4gdGhvc2UgdHdvIGRpcmVjdG9yaWVzLgorCitPciBpZiB5b3UgYXJlIHNlYXJjaGluZyBmb3Igd2hhdCBjaGFuZ2VkIGluIGp1c3QgYGtlcm5lbC9zY2hlZC5jYCwganVzdCBkbworCisJZ2l0LWRpZmYtdHJlZSAtciA8dHJlZS1pc2g+IDx0cmVlLWlzaD4ga2VybmVsL3NjaGVkLmMKKworYW5kIGl0IHdpbGwgaWdub3JlIGFsbCBkaWZmZXJlbmNlcyB0byBvdGhlciBmaWxlcy4KKworVGhlIHBhdHRlcm4gaXMgYWx3YXlzIHRoZSBwcmVmaXgsIGFuZCBpcyBtYXRjaGVkIGV4YWN0bHkuICBUaGVyZSBhcmUgbm8KK3dpbGRjYXJkcy4gIEV2ZW4gc3RyaWN0ZXIsIGl0IGhhcyB0byBtYXRjaCBhIGNvbXBsZXRlIHBhdGggY29tcG9uZW50LgorSS5lLiAiZm9vIiBkb2VzIG5vdCBwaWNrIHVwIGBmb29iYXIuaGAuICAiZm9vIiBkb2VzIG1hdGNoIGBmb28vYmFyLmhgCitzbyBpdCBjYW4gYmUgdXNlZCB0byBuYW1lIHN1YmRpcmVjdG9yaWVzLgorCitBbiBleGFtcGxlIG9mIG5vcm1hbCB1c2FnZSBpczoKKworICB0b3J2YWxkc0BwcGM5NzA6fi9naXQ+IGdpdC1kaWZmLXRyZWUgNTMxOWU0Li4uLi4uCisgICoxMDA2NjQtPjEwMDY2NCBibG9iICAgIGFjMzQ4Yi4uLi4uLi4tPmEwMTUxMy4uLi4uLi4gICAgICBnaXQtZnNjay1vYmplY3RzLmMKKword2hpY2ggdGVsbHMgeW91IHRoYXQgdGhlIGxhc3QgY29tbWl0IGNoYW5nZWQganVzdCBvbmUgZmlsZSAoaXQncyBmcm9tCit0aGlzIG9uZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NvbW1pdCAzYzZmN2NhMTlhZDQwNDNlOWU3MmZhOTQxMDZmMzUyODk3ZTY1MWE4Cit0cmVlIDUzMTllNGQ2MDljZGQyODIwNjljYzRkY2UzM2MxZGI1NTk1MzliMDMKK3BhcmVudCBiNGU2MjhlYTMwZDVhYjM2MDYxMTlkMmVhNWNhZWFiMTQxZDM4ZGY3CithdXRob3IgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQHBwYzk3MC5vc2RsLm9yZz4gU2F0IEFwciA5IDEyOjAyOjMwIDIwMDUKK2NvbW1pdHRlciBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAcHBjOTcwLm9zZGwub3JnPiBTYXQgQXByIDkgMTI6MDI6MzAgMjAwNQorCitNYWtlICJnaXQtZnNjay1vYmplY3RzIiBwcmludCBvdXQgYWxsIHRoZSByb290IGNvbW1pdHMgaXQgZmluZHMuCisKK09uY2UgSSBkbyB0aGUgcmVmZXJlbmNlIHRyYWNraW5nLCBJJ2xsIGFsc28gbWFrZSBpdCBwcmludCBvdXQgYWxsIHRoZQorSEVBRCBjb21taXRzIGl0IGZpbmRzLCB3aGljaCBpcyBldmVuIG1vcmUgaW50ZXJlc3RpbmcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbiBjYXNlIHlvdSBjYXJlKS4KKworT3V0cHV0IGZvcm1hdAorLS0tLS0tLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1mb3JtYXQudHh0W10KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIyMDgwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi50eHQKQEAgLTAsMCArMSwxMTYgQEAKK2dpdC1kaWZmKDEpCis9PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZGlmZiAtIFNob3cgY2hhbmdlcyBiZXR3ZWVuIGNvbW1pdHMsIGNvbW1pdCBhbmQgd29ya2luZyB0cmVlLCBldGMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZGlmZicgWyAtLWRpZmYtb3B0aW9ucyBdIDxlbnQ+ezAsMn0gWzxwYXRoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTaG93IGNoYW5nZXMgYmV0d2VlbiB0d28gZW50cywgYW4gZW50IGFuZCB0aGUgd29ya2luZyB0cmVlLCBhbgorZW50IGFuZCB0aGUgaW5kZXggZmlsZSwgb3IgdGhlIGluZGV4IGZpbGUgYW5kIHRoZSB3b3JraW5nIHRyZWUuCitUaGUgY29tYmluYXRpb24gb2Ygd2hhdCBpcyBjb21wYXJlZCB3aXRoIHdoYXQgaXMgZGV0ZXJtaW5lZCBieQordGhlIG51bWJlciBvZiBlbnRzIGdpdmVuIHRvIHRoZSBjb21tYW5kLgorCisqIFdoZW4gbm8gPGVudD4gaXMgZ2l2ZW4sIHRoZSB3b3JraW5nIHRyZWUgYW5kIHRoZSBpbmRleAorICBmaWxlIGlzIGNvbXBhcmVkLCB1c2luZyBgZ2l0LWRpZmYtZmlsZXNgLgorCisqIFdoZW4gb25lIDxlbnQ+IGlzIGdpdmVuLCB0aGUgd29ya2luZyB0cmVlIGFuZCB0aGUgbmFtZWQKKyAgdHJlZSBpcyBjb21wYXJlZCwgdXNpbmcgYGdpdC1kaWZmLWluZGV4YC4gIFRoZSBvcHRpb24KKyAgYC0tY2FjaGVkYCBjYW4gYmUgZ2l2ZW4gdG8gY29tcGFyZSB0aGUgaW5kZXggZmlsZSBhbmQKKyAgdGhlIG5hbWVkIHRyZWUuCisKKyogV2hlbiB0d28gPGVudD5zIGFyZSBnaXZlbiwgdGhlc2UgdHdvIHRyZWVzIGFyZSBjb21wYXJlZAorICB1c2luZyBgZ2l0LWRpZmYtdHJlZWAuCisKK09QVElPTlMKKy0tLS0tLS0KKy0tZGlmZi1vcHRpb25zOjoKKwknLS1kaWZmLW9wdGlvbnMnIGFyZSBwYXNzZWQgdG8gdGhlIGBnaXQtZGlmZi1maWxlc2AsCisJYGdpdC1kaWZmLWluZGV4YCwgYW5kIGBnaXQtZGlmZi10cmVlYCBjb21tYW5kcy4gIFNlZSB0aGUKKwlkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBjb21tYW5kcyBmb3IgZGVzY3JpcHRpb24uCisKKzxwYXRoPi4uLjo6CisJVGhlIDxwYXRoPiBhcmd1bWVudHMgYXJlIGFsc28gcGFzc2VkIHRvIGBnaXQtZGlmZi1cKmAKKwljb21tYW5kcy4KKworCitFWEFNUExFUworLS0tLS0tLS0KKworVmFyaW91cyB3YXlzIHRvIGNoZWNrIHlvdXIgd29ya2luZyB0cmVlOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiAgICAgICAgICAgIDwxPgorJCBnaXQgZGlmZiAtLWNhY2hlZCAgIDwyPgorJCBnaXQgZGlmZiBIRUFEICAgICAgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gY2hhbmdlcyBpbiB0aGUgd29ya2luZyB0cmVlIHNpbmNlIHlvdXIgbGFzdCBnaXQtdXBkYXRlLWluZGV4LgorPDI+IGNoYW5nZXMgYmV0d2VlbiB0aGUgaW5kZXggYW5kIHlvdXIgbGFzdCBjb21taXQ7IHdoYXQgeW91Cit3b3VsZCBiZSBjb21taXR0aW5nIGlmIHlvdSBydW4gImdpdCBjb21taXQiIHdpdGhvdXQgIi1hIiBvcHRpb24uCis8Mz4gY2hhbmdlcyBpbiB0aGUgd29ya2luZyB0cmVlIHNpbmNlIHlvdXIgbGFzdCBjb21taXQ7IHdoYXQgeW91Cit3b3VsZCBiZSBjb21taXR0aW5nIGlmIHlvdSBydW4gImdpdCBjb21taXQgLWEiCisKK0NvbXBhcmluZyB3aXRoIGFyYml0cmFyeSBjb21taXRzOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiB0ZXN0ICAgICAgICAgICAgPDE+CiskIGdpdCBkaWZmIEhFQUQgLS0gLi90ZXN0ICA8Mj4KKyQgZ2l0IGRpZmYgSEVBRF4gSEVBRCAgICAgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gaW5zdGVhZCBvZiB1c2luZyB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaCwgY29tcGFyZSB3aXRoIHRoZQordGlwIG9mICJ0ZXN0IiBicmFuY2guCis8Mj4gaW5zdGVhZCBvZiBjb21wYXJpbmcgd2l0aCB0aGUgdGlwIG9mICJ0ZXN0IiBicmFuY2gsIGNvbXBhcmUgd2l0aAordGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gsIGJ1dCBsaW1pdCB0aGUgY29tcGFyaXNvbiB0byB0aGUKK2ZpbGUgInRlc3QiLgorPDM+IGNvbXBhcmUgdGhlIHZlcnNpb24gYmVmb3JlIHRoZSBsYXN0IGNvbW1pdCBhbmQgdGhlIGxhc3QgY29tbWl0LgorCisKK0xpbWl0aW5nIHRoZSBkaWZmIG91dHB1dDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1kaWZmLWZpbHRlcj1NUkMgICAgICAgICAgICA8MT4KKyQgZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyAtciAgICAgICAgICAgICA8Mj4KKyQgZ2l0IGRpZmYgYXJjaC9pMzg2IGluY2x1ZGUvYXNtLWkzODYgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IHNob3cgb25seSBtb2RpZmljYXRpb24sIHJlbmFtZSBhbmQgY29weSwgYnV0IG5vdCBhZGRpdGlvbgorbm9yIGRlbGV0aW9uLgorPDI+IHNob3cgb25seSBuYW1lcyBhbmQgdGhlIG5hdHVyZSBvZiBjaGFuZ2UsIGJ1dCBub3QgYWN0dWFsCitkaWZmIG91dHB1dC4gIC0tbmFtZS1zdGF0dXMgZGlzYWJsZXMgdXN1YWwgcGF0Y2ggZ2VuZXJhdGlvbgord2hpY2ggaW4gdHVybiBhbHNvIGRpc2FibGVzIHJlY3Vyc2l2ZSBiZWhhdmlvciwgc28gd2l0aG91dCAtcgoreW91IHdvdWxkIG9ubHkgc2VlIHRoZSBkaXJlY3RvcnkgbmFtZSBpZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBhCitmaWxlIGluIGEgc3ViZGlyZWN0b3J5LgorPDM+IGxpbWl0IGRpZmYgb3V0cHV0IHRvIG5hbWVkIHN1YnRyZWVzLgorCitNdW5naW5nIHRoZSBkaWZmIG91dHB1dDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1maW5kLWNvcGllcy1oYXJkZXIgLUIgLUMgIDwxPgorJCBnaXQgZGlmZiAtUiAgICAgICAgICAgICAgICAgICAgICAgICAgPDI+CistLS0tLS0tLS0tLS0KKysKKzwxPiBzcGVuZCBleHRyYSBjeWNsZXMgdG8gZmluZCByZW5hbWVzLCBjb3BpZXMgYW5kIGNvbXBsZXRlCityZXdyaXRlcyAodmVyeSBleHBlbnNpdmUpLgorPDI+IG91dHB1dCBkaWZmIGluIHJldmVyc2UuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZldGNoLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmOWFhNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZldGNoLXBhY2sudHh0CkBAIC0wLDAgKzEsNzMgQEAKK2dpdC1mZXRjaC1wYWNrKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmV0Y2gtcGFjayAtIFJlY2VpdmUgbWlzc2luZyBvYmplY3RzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWZldGNoLXBhY2snIFstcV0gWy1rXSBbLS1leGVjPTxnaXQtdXBsb2FkLXBhY2s+XSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiBbPHJlZnM+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ludm9rZXMgJ2dpdC11cGxvYWQtcGFjaycgb24gYSBwb3RlbnRpYWxseSByZW1vdGUgcmVwb3NpdG9yeSwKK2FuZCBhc2tzIGl0IHRvIHNlbmQgb2JqZWN0cyBtaXNzaW5nIGZyb20gdGhpcyByZXBvc2l0b3J5LCB0bwordXBkYXRlIHRoZSBuYW1lZCBoZWFkcy4gIFRoZSBsaXN0IG9mIGNvbW1pdHMgYXZhaWxhYmxlIGxvY2FsbHkKK2lzIGZvdW5kIG91dCBieSBzY2FubmluZyBsb2NhbCAkR0lUX0RJUi9yZWZzLyBhbmQgc2VudCB0bworJ2dpdC11cGxvYWQtcGFjaycgcnVubmluZyBvbiB0aGUgb3RoZXIgZW5kLgorCitUaGlzIGNvbW1hbmQgZGVnZW5lcmF0ZXMgdG8gZG93bmxvYWQgZXZlcnl0aGluZyB0byBjb21wbGV0ZSB0aGUKK2Fza2VkIHJlZnMgZnJvbSB0aGUgcmVtb3RlIHNpZGUgd2hlbiB0aGUgbG9jYWwgc2lkZSBkb2VzIG5vdAoraGF2ZSBhIGNvbW1vbiBhbmNlc3RvciBjb21taXQuCisKKworT1BUSU9OUworLS0tLS0tLQorLXE6OgorCVBhc3MgJy1xJyBmbGFnIHRvICdnaXQtdW5wYWNrLW9iamVjdHMnOyB0aGlzIG1ha2VzIHRoZQorCWNsb25pbmcgcHJvY2VzcyBsZXNzIHZlcmJvc2UuCisKKy1rOjoKKwlEbyBub3QgaW52b2tlICdnaXQtdW5wYWNrLW9iamVjdHMnIG9uIHJlY2VpdmVkIGRhdGEsIGJ1dAorCWNyZWF0ZSBhIHNpbmdsZSBwYWNrZmlsZSBvdXQgb2YgaXQgaW5zdGVhZCwgYW5kIHN0b3JlIGl0CisJaW4gdGhlIG9iamVjdCBkYXRhYmFzZS4KKworLS1leGVjPTxnaXQtdXBsb2FkLXBhY2s+OjoKKwlVc2UgdGhpcyB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvICdnaXQtdXBsb2FkLXBhY2snIG9uIHRoZQorCXJlbW90ZSBzaWRlLCBpZiBpcyBub3QgZm91bmQgb24geW91ciAkUEFUSC4KKwlJbnN0YWxsYXRpb25zIG9mIHNzaGQgaWdub3JlcyB0aGUgdXNlcidzIGVudmlyb25tZW50CisJc2V0dXAgc2NyaXB0cyBmb3IgbG9naW4gc2hlbGxzIChlLmcuIC5iYXNoX3Byb2ZpbGUpIGFuZAorCXlvdXIgcHJpdmF0ZWx5IGluc3RhbGxlZCBnaXQgbWF5IG5vdCBiZSBmb3VuZCBvbiB0aGUgc3lzdGVtCisJZGVmYXVsdCAkUEFUSC4gIEFub3RoZXIgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgaXMgdG8gc2V0CisJdXAgeW91ciAkUEFUSCBpbiAiLmJhc2hyYyIsIGJ1dCB0aGlzIGZsYWcgaXMgZm9yIHBlb3BsZQorCXdobyBkbyBub3Qgd2FudCB0byBwYXkgdGhlIG92ZXJoZWFkIGZvciBub24taW50ZXJhY3RpdmUKKwlzaGVsbHMgYnkgaGF2aW5nIGEgbGVhbiAuYmFzaHJjIGZpbGUgKHRoZXkgc2V0IG1vc3Qgb2YKKwl0aGUgdGhpbmdzIHVwIGluIC5iYXNoX3Byb2ZpbGUpLgorCis8aG9zdD46OgorCUEgcmVtb3RlIGhvc3QgdGhhdCBob3VzZXMgdGhlIHJlcG9zaXRvcnkuICBXaGVuIHRoaXMKKwlwYXJ0IGlzIHNwZWNpZmllZCwgJ2dpdC11cGxvYWQtcGFjaycgaXMgaW52b2tlZCB2aWEKKwlzc2guCisKKzxkaXJlY3Rvcnk+OjoKKwlUaGUgcmVwb3NpdG9yeSB0byBzeW5jIGZyb20uCisKKzxyZWZzPi4uLjo6CisJVGhlIHJlbW90ZSBoZWFkcyB0byB1cGRhdGUgZnJvbS4gVGhpcyBpcyByZWxhdGl2ZSB0bworCSRHSVRfRElSIChlLmcuICJIRUFEIiwgInJlZnMvaGVhZHMvbWFzdGVyIikuICBXaGVuCisJdW5zcGVjaWZpZWQsIHVwZGF0ZSBmcm9tIGFsbCBoZWFkcyB0aGUgcmVtb3RlIHNpZGUgaGFzLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTg2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC50eHQKQEAgLTAsMCArMSw0OCBAQAorZ2l0LWZldGNoKDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZldGNoIC0gRG93bmxvYWQgb2JqZWN0cyBhbmQgYSBoZWFkIGZyb20gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWZldGNoJyA8b3B0aW9ucz4gPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRmV0Y2hlcyBuYW1lZCBoZWFkcyBvciB0YWdzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5LCBhbG9uZyB3aXRoCit0aGUgb2JqZWN0cyBuZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlbS4KKworVGhlIHJlZiBuYW1lcyBhbmQgdGhlaXIgb2JqZWN0IG5hbWVzIG9mIGZldGNoZWQgcmVmcyBhcmUgc3RvcmVkCitpbiBgLmdpdC9GRVRDSF9IRUFEYC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbGVmdCBmb3IgYSBsYXRlciBtZXJnZQorb3BlcmF0aW9uIGRvbmUgYnkgImdpdCBtZXJnZSIuCisKKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6ZmV0Y2gtb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpwdWxsLWZldGNoLXBhcmFtLnR4dFtdCisKK2luY2x1ZGU6OnVybHMudHh0W10KKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1wdWxsWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mbXQtbWVyZ2UtbXNnLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWZtdC1tZXJnZS1tc2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MGViMzkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mbXQtbWVyZ2UtbXNnLnR4dApAQCAtMCwwICsxLDM5IEBACitnaXQtZm10LW1lcmdlLW1zZygxKQorPT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZtdC1tZXJnZS1tc2cgLSBQcm9kdWNlIGEgbWVyZ2UgY29tbWl0IG1lc3NhZ2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZm10LW1lcmdlLW1zZycgPCRHSVRfRElSL0ZFVENIX0hFQUQKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUYWtlcyB0aGUgbGlzdCBvZiBtZXJnZWQgb2JqZWN0cyBvbiBzdGRpbiBhbmQgcHJvZHVjZXMgYSBzdWl0YWJsZQorY29tbWl0IG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIG1lcmdlIGNvbW1pdCwgdXN1YWxseSB0byBiZQorcGFzc2VkIGFzIHRoZSAnPG1lcmdlLW1lc3NhZ2U+JyBhcmd1bWVudCBvZiBgZ2l0LW1lcmdlYC4KKworVGhpcyBzY3JpcHQgaXMgaW50ZW5kZWQgbW9zdGx5IGZvciBpbnRlcm5hbCB1c2UgYnkgc2NyaXB0cworYXV0b21hdGljYWxseSBpbnZva2luZyBgZ2l0LW1lcmdlYC4KKworCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LW1lcmdlWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBQZXRyIEJhdWRpcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mb3JtYXQtcGF0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZm9ybWF0LXBhdGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EwMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZm9ybWF0LXBhdGNoLnR4dApAQCAtMCwwICsxLDExNSBAQAorZ2l0LWZvcm1hdC1wYXRjaCgxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZm9ybWF0LXBhdGNoIC0gUHJlcGFyZSBwYXRjaGVzIGZvciBlLW1haWwgc3VibWlzc2lvbgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1mb3JtYXQtcGF0Y2gnIFstbiB8IC1rXSBbLW8gPGRpcj4gfCAtLXN0ZG91dF0gWy0tYXR0YWNoXQorCSAgICAgICAgICAgWy1zIHwgLS1zaWdub2ZmXSBbLS1kaWZmLW9wdGlvbnNdIFstLXN0YXJ0LW51bWJlciA8bj5dCisJCSAgIDxzaW5jZT5bLi48dW50aWw+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworUHJlcGFyZSBlYWNoIGNvbW1pdCBiZXR3ZWVuIDxzaW5jZT4gYW5kIDx1bnRpbD4gd2l0aCBpdHMgcGF0Y2ggaW4KK29uZSBmaWxlIHBlciBjb21taXQsIGZvcm1hdHRlZCB0byByZXNlbWJsZSBVTklYIG1haWxib3ggZm9ybWF0LgorSWYgLi48dW50aWw+IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoZWFkIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcKK3RyZWUgaXMgaW1wbGllZC4KKworVGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgaXMgY29udmVuaWVudCBmb3IgZS1tYWlsIHN1Ym1pc3Npb24gb3IKK2ZvciB1c2Ugd2l0aCBnaXRsaW5rOmdpdC1hbVsxXS4KKworRWFjaCBvdXRwdXQgZmlsZSBpcyBudW1iZXJlZCBzZXF1ZW50aWFsbHkgZnJvbSAxLCBhbmQgdXNlcyB0aGUKK2ZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIChtYXNzYWdlZCBmb3IgcGF0aG5hbWUgc2FmZXR5KSBhcwordGhlIGZpbGVuYW1lLiBUaGUgbmFtZXMgb2YgdGhlIG91dHB1dCBmaWxlcyBhcmUgcHJpbnRlZCB0byBzdGFuZGFyZAorb3V0cHV0LCB1bmxlc3MgdGhlIC0tc3Rkb3V0IG9wdGlvbiBpcyBzcGVjaWZpZWQuCisKK0lmIC1vIGlzIHNwZWNpZmllZCwgb3V0cHV0IGZpbGVzIGFyZSBjcmVhdGVkIGluIDxkaXI+LiAgT3RoZXJ3aXNlCit0aGV5IGFyZSBjcmVhdGVkIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCitJZiAtbiBpcyBzcGVjaWZpZWQsIGluc3RlYWQgb2YgIltQQVRDSF0gU3ViamVjdCIsIHRoZSBmaXJzdCBsaW5lCitpcyBmb3JtYXR0ZWQgYXMgIltQQVRDSCBuL21dIFN1YmplY3QiLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1vfC0tb3V0cHV0LWRpcmVjdG9yeSA8ZGlyPjo6CisJVXNlIDxkaXI+IHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgZmlsZXMsIGluc3RlYWQgb2YgdGhlCisJY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKworLW58LS1udW1iZXJlZDo6CisJTmFtZSBvdXRwdXQgaW4gJ1tQQVRDSCBuL21dJyBmb3JtYXQuCisKKy0tc3RhcnQtbnVtYmVyIDxuPjo6CisJU3RhcnQgbnVtYmVyaW5nIHRoZSBwYXRjaGVzIGF0IDxuPiBpbnN0ZWFkIG9mIDEuCisKKy1rfC0ta2VlcC1zdWJqZWN0OjoKKwlEbyBub3Qgc3RyaXAvYWRkICdbUEFUQ0hdJyBmcm9tIHRoZSBmaXJzdCBsaW5lIG9mIHRoZQorCWNvbW1pdCBsb2cgbWVzc2FnZS4KKworLXN8LS1zaWdub2ZmOjoKKwlBZGQgYFNpZ25lZC1vZmYtYnk6YCBsaW5lIHRvIHRoZSBjb21taXQgbWVzc2FnZSwgdXNpbmcKKwl0aGUgY29tbWl0dGVyIGlkZW50aXR5IG9mIHlvdXJzZWxmLgorCistLXN0ZG91dDo6CisJUHJpbnQgYWxsIGNvbW1pdHMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBpbiBtYm94IGZvcm1hdCwKKwlpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgZmlsZSBmb3IgZWFjaCBvbmUuCisKKy0tYXR0YWNoOjoKKwlDcmVhdGUgYXR0YWNobWVudHMgaW5zdGVhZCBvZiBpbmxpbmluZyBwYXRjaGVzLgorCisKK0NPTkZJR1VSQVRJT04KKy0tLS0tLS0tLS0tLS0KK1lvdSBjYW4gc3BlY2lmeSBleHRyYSBtYWlsIGhlYWRlciBsaW5lcyB0byBiZSBhZGRlZCB0byBlYWNoCittZXNzYWdlIGluIHRoZSByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gYXMgZm9sbG93czoKKworW2Zvcm1hdF0KKyAgICAgICAgaGVhZGVycyA9ICJPcmdhbml6YXRpb246IGdpdC1mb29cbiIKKworCitFWEFNUExFUworLS0tLS0tLS0KKworZ2l0LWZvcm1hdC1wYXRjaCAtayAtLXN0ZG91dCBSMS4uUjIgfCBnaXQtYW0gLTMgLWs6OgorCUV4dHJhY3QgY29tbWl0cyBiZXR3ZWVuIHJldmlzaW9ucyBSMSBhbmQgUjIsIGFuZCBhcHBseQorCXRoZW0gb24gdG9wIG9mIHRoZSBjdXJyZW50IGJyYW5jaCB1c2luZyBgZ2l0LWFtYCB0bworCWNoZXJyeS1waWNrIHRoZW0uCisKK2dpdC1mb3JtYXQtcGF0Y2ggb3JpZ2luOjoKKwlFeHRyYWN0IGFsbCBjb21taXRzIHdoaWNoIGFyZSBpbiB0aGUgY3VycmVudCBicmFuY2ggYnV0CisJbm90IGluIHRoZSBvcmlnaW4gYnJhbmNoLiAgRm9yIGVhY2ggY29tbWl0IGEgc2VwYXJhdGUgZmlsZQorCWlzIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCitnaXQtZm9ybWF0LXBhdGNoIC1NIC1CIG9yaWdpbjo6CisJVGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIG9uZS4gIEFkZGl0aW9uYWxseSwgaXQgZGV0ZWN0cworCWFuZCBoYW5kbGVzIHJlbmFtZXMgYW5kIGNvbXBsZXRlIHJld3JpdGVzIGludGVsbGlnZW50bHkgdG8KKwlwcm9kdWNlIGEgcmVuYW1pbmcgcGF0Y2guICBBIHJlbmFtaW5nIHBhdGNoIHJlZHVjZXMgdGhlCisJYW1vdW50IG9mIHRleHQgb3V0cHV0LCBhbmQgZ2VuZXJhbGx5IG1ha2VzIGl0IGVhc2llciB0bworCXJldmlldyBpdC4gIE5vdGUgdGhhdCB0aGUgInBhdGNoIiBwcm9ncmFtIGRvZXMgbm90CisJdW5kZXJzdGFuZCByZW5hbWluZyBwYXRjaGVzLCBzbyB1c2UgaXQgb25seSB3aGVuIHlvdSBrbm93CisJdGhlIHJlY2lwaWVudCB1c2VzIGdpdCB0byBhcHBseSB5b3VyIHBhdGNoLgorCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtYW1bMV0sIGdpdGxpbms6Z2l0LXNlbmQtZW1haWxbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZnNjay1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWZzY2stb2JqZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhZjk5ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZzY2stb2JqZWN0cy50eHQKQEAgLTAsMCArMSwxMzkgQEAKK2dpdC1mc2NrLW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZzY2stb2JqZWN0cyAtIFZlcmlmaWVzIHRoZSBjb25uZWN0aXZpdHkgYW5kIHZhbGlkaXR5IG9mIHRoZSBvYmplY3RzIGluIHRoZSBkYXRhYmFzZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1mc2NrLW9iamVjdHMnIFstLXRhZ3NdIFstLXJvb3RdIFstLXVucmVhY2hhYmxlXSBbLS1jYWNoZV0KKwkJIFstLWZ1bGxdIFstLXN0cmljdF0gWzxvYmplY3Q+Kl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitWZXJpZmllcyB0aGUgY29ubmVjdGl2aXR5IGFuZCB2YWxpZGl0eSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgZGF0YWJhc2UuCisKK09QVElPTlMKKy0tLS0tLS0KKzxvYmplY3Q+OjoKKwlBbiBvYmplY3QgdG8gdHJlYXQgYXMgdGhlIGhlYWQgb2YgYW4gdW5yZWFjaGFiaWxpdHkgdHJhY2UuCisrCitJZiBubyBvYmplY3RzIGFyZSBnaXZlbiwgZ2l0LWZzY2stb2JqZWN0cyBkZWZhdWx0cyB0byB1c2luZyB0aGUKK2luZGV4IGZpbGUgYW5kIGFsbCBTSEExIHJlZmVyZW5jZXMgaW4gLmdpdC9yZWZzLyogYXMgaGVhZHMuCisKKy0tdW5yZWFjaGFibGU6OgorCVByaW50IG91dCBvYmplY3RzIHRoYXQgZXhpc3QgYnV0IHRoYXQgYXJlbid0IHJlYWRhYmxlIGZyb20gYW55CisJb2YgdGhlIHJlZmVyZW5jZSBub2Rlcy4KKworLS1yb290OjoKKwlSZXBvcnQgcm9vdCBub2Rlcy4KKworLS10YWdzOjoKKwlSZXBvcnQgdGFncy4KKworLS1jYWNoZTo6CisJQ29uc2lkZXIgYW55IG9iamVjdCByZWNvcmRlZCBpbiB0aGUgaW5kZXggYWxzbyBhcyBhIGhlYWQgbm9kZSBmb3IKKwlhbiB1bnJlYWNoYWJpbGl0eSB0cmFjZS4KKworLS1mdWxsOjoKKwlDaGVjayBub3QganVzdCBvYmplY3RzIGluIEdJVF9PQkpFQ1RfRElSRUNUT1JZCisJKCRHSVRfRElSL29iamVjdHMpLCBidXQgYWxzbyB0aGUgb25lcyBmb3VuZCBpbiBhbHRlcm5hdGUKKwlvYmplY3QgcG9vbHMgbGlzdGVkIGluIEdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTCisJb3IgJEdJVF9ESVIvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMsCisJYW5kIGluIHBhY2tlZCBnaXQgYXJjaGl2ZXMgZm91bmQgaW4gJEdJVF9ESVIvb2JqZWN0cy9wYWNrCisJYW5kIGNvcnJlc3BvbmRpbmcgcGFjayBzdWJkaXJlY3RvcmllcyBpbiBhbHRlcm5hdGUKKwlvYmplY3QgcG9vbHMuCisKKy0tc3RyaWN0OjoKKwlFbmFibGUgbW9yZSBzdHJpY3QgY2hlY2tpbmcsIG5hbWVseSB0byBjYXRjaCBhIGZpbGUgbW9kZQorCXJlY29yZGVkIHdpdGggZyt3IGJpdCBzZXQsIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IG9sZGVyCisJdmVyc2lvbnMgb2YgZ2l0LiAgRXhpc3RpbmcgcmVwb3NpdG9yaWVzLCBpbmNsdWRpbmcgdGhlCisJTGludXgga2VybmVsLCBnaXQgaXRzZWxmLCBhbmQgc3BhcnNlIHJlcG9zaXRvcnkgaGF2ZSBvbGQKKwlvYmplY3RzIHRoYXQgdHJpZ2dlcnMgdGhpcyBjaGVjaywgYnV0IGl0IGlzIHJlY29tbWVuZGVkCisJdG8gY2hlY2sgbmV3IHByb2plY3RzIHdpdGggdGhpcyBmbGFnLgorCitJdCB0ZXN0cyBTSEExIGFuZCBnZW5lcmFsIG9iamVjdCBzYW5pdHksIGFuZCBpdCBkb2VzIGZ1bGwgdHJhY2tpbmcgb2YKK3RoZSByZXN1bHRpbmcgcmVhY2hhYmlsaXR5IGFuZCBldmVyeXRoaW5nIGVsc2UuIEl0IHByaW50cyBvdXQgYW55Citjb3JydXB0aW9uIGl0IGZpbmRzIChtaXNzaW5nIG9yIGJhZCBvYmplY3RzKSwgYW5kIGlmIHlvdSB1c2UgdGhlCisnLS11bnJlYWNoYWJsZScgZmxhZyBpdCB3aWxsIGFsc28gcHJpbnQgb3V0IG9iamVjdHMgdGhhdCBleGlzdCBidXQKK3RoYXQgYXJlbid0IHJlYWRhYmxlIGZyb20gYW55IG9mIHRoZSBzcGVjaWZpZWQgaGVhZCBub2Rlcy4KKworU28gZm9yIGV4YW1wbGUKKworCWdpdC1mc2NrLW9iamVjdHMgLS11bnJlYWNoYWJsZSBIRUFEICQoY2F0IC5naXQvcmVmcy9oZWFkcy8qKQorCit3aWxsIGRvIHF1aXRlIGEgX2xvdF8gb2YgdmVyaWZpY2F0aW9uIG9uIHRoZSB0cmVlLiBUaGVyZSBhcmUgYSBmZXcKK2V4dHJhIHZhbGlkaXR5IHRlc3RzIHRvIGJlIGFkZGVkIChtYWtlIHN1cmUgdGhhdCB0cmVlIG9iamVjdHMgYXJlCitzb3J0ZWQgcHJvcGVybHkgZXRjKSwgYnV0IG9uIHRoZSB3aG9sZSBpZiAiZ2l0LWZzY2stb2JqZWN0cyIgaXMgaGFwcHksIHlvdQorZG8gaGF2ZSBhIHZhbGlkIHRyZWUuCisKK0FueSBjb3JydXB0IG9iamVjdHMgeW91IHdpbGwgaGF2ZSB0byBmaW5kIGluIGJhY2t1cHMgb3Igb3RoZXIgYXJjaGl2ZXMKKyhpLmUuLCB5b3UgY2FuIGp1c3QgcmVtb3ZlIHRoZW0gYW5kIGRvIGFuICJyc3luYyIgd2l0aCBzb21lIG90aGVyIHNpdGUgaW4KK3RoZSBob3BlcyB0aGF0IHNvbWVib2R5IGVsc2UgaGFzIHRoZSBvYmplY3QgeW91IGhhdmUgY29ycnVwdGVkKS4KKworT2YgY291cnNlLCAidmFsaWQgdHJlZSIgZG9lc24ndCBtZWFuIHRoYXQgaXQgd2Fzbid0IGdlbmVyYXRlZCBieSBzb21lCitldmlsIHBlcnNvbiwgYW5kIHRoZSBlbmQgcmVzdWx0IG1pZ2h0IGJlIGNyYXAuIGdpdCBpcyBhIHJldmlzaW9uCit0cmFja2luZyBzeXN0ZW0sIG5vdCBhIHF1YWxpdHkgYXNzdXJhbmNlIHN5c3RlbSA7KQorCitFeHRyYWN0ZWQgRGlhZ25vc3RpY3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHBlY3QgZGFuZ2xpbmcgY29tbWl0cyAtIHBvdGVudGlhbCBoZWFkcyAtIGR1ZSB0byBsYWNrIG9mIGhlYWQgaW5mb3JtYXRpb246OgorCVlvdSBoYXZlbid0IHNwZWNpZmllZCBhbnkgbm9kZXMgYXMgaGVhZHMgc28gaXQgd29uJ3QgYmUKKwlwb3NzaWJsZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdW4tcGFyZW50ZWQgY29tbWl0cyBhbmQKKwlyb290IG5vZGVzLgorCittaXNzaW5nIHNoYTEgZGlyZWN0b3J5ICc8ZGlyPic6OgorCVRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgc2hhMSBvYmplY3RzIGlzIG1pc3NpbmcuCisKK3VucmVhY2hhYmxlIDx0eXBlPiA8b2JqZWN0Pjo6CisJVGhlIDx0eXBlPiBvYmplY3QgPG9iamVjdD4sIGlzbid0IGFjdHVhbGx5IHJlZmVycmVkIHRvIGRpcmVjdGx5CisJb3IgaW5kaXJlY3RseSBpbiBhbnkgb2YgdGhlIHRyZWVzIG9yIGNvbW1pdHMgc2Vlbi4gVGhpcyBjYW4KKwltZWFuIHRoYXQgdGhlcmUncyBhbm90aGVyIHJvb3Qgbm9kZSB0aGF0IHlvdSdyZSBub3Qgc3BlY2lmeWluZworCW9yIHRoYXQgdGhlIHRyZWUgaXMgY29ycnVwdC4gSWYgeW91IGhhdmVuJ3QgbWlzc2VkIGEgcm9vdCBub2RlCisJdGhlbiB5b3UgbWlnaHQgYXMgd2VsbCBkZWxldGUgdW5yZWFjaGFibGUgbm9kZXMgc2luY2UgdGhleQorCWNhbid0IGJlIHVzZWQuCisKK21pc3NpbmcgPHR5cGU+IDxvYmplY3Q+OjoKKwlUaGUgPHR5cGU+IG9iamVjdCA8b2JqZWN0PiwgaXMgcmVmZXJyZWQgdG8gYnV0IGlzbid0IHByZXNlbnQgaW4KKwl0aGUgZGF0YWJhc2UuCisKK2RhbmdsaW5nIDx0eXBlPiA8b2JqZWN0Pjo6CisJVGhlIDx0eXBlPiBvYmplY3QgPG9iamVjdD4sIGlzIHByZXNlbnQgaW4gdGhlIGRhdGFiYXNlIGJ1dCBuZXZlcgorCSdkaXJlY3RseScgdXNlZC4gQSBkYW5nbGluZyBjb21taXQgY291bGQgYmUgYSByb290IG5vZGUuCisKK3dhcm5pbmc6IGdpdC1mc2NrLW9iamVjdHM6IHRyZWUgPHRyZWU+IGhhcyBmdWxsIHBhdGhuYW1lcyBpbiBpdDo6CisJQW5kIGl0IHNob3VsZG4ndC4uLgorCitzaGExIG1pc21hdGNoIDxvYmplY3Q+OjoKKwlUaGUgZGF0YWJhc2UgaGFzIGFuIG9iamVjdCB3aG8ncyBzaGExIGRvZXNuJ3QgbWF0Y2ggdGhlCisJZGF0YWJhc2UgdmFsdWUuCisJVGhpcyBpbmRpY2F0ZXMgYSBzZXJpb3VzIGRhdGEgaW50ZWdyaXR5IHByb2JsZW0uCisKK0Vudmlyb25tZW50IFZhcmlhYmxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dJVF9PQkpFQ1RfRElSRUNUT1JZOjoKKwl1c2VkIHRvIHNwZWNpZnkgdGhlIG9iamVjdCBkYXRhYmFzZSByb290ICh1c3VhbGx5ICRHSVRfRElSL29iamVjdHMpCisKK0dJVF9JTkRFWF9GSUxFOjoKKwl1c2VkIHRvIHNwZWNpZnkgdGhlIGluZGV4IGZpbGUgb2YgdGhlIGluZGV4CisKK0dJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTOjoKKwl1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBvYmplY3QgZGF0YWJhc2Ugcm9vdHMgKHVzdWFsbHkgdW5zZXQpCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1nZXQtdGFyLWNvbW1pdC1pZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1nZXQtdGFyLWNvbW1pdC1pZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4MDViNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWdldC10YXItY29tbWl0LWlkLnR4dApAQCAtMCwwICsxLDM3IEBACitnaXQtZ2V0LXRhci1jb21taXQtaWQoMSkKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZ2V0LXRhci1jb21taXQtaWQgLSBFeHRyYWN0IGNvbW1pdCBJRCBmcm9tIGFuIGFyY2hpdmUgY3JlYXRlZCB1c2luZyBnaXQtdGFyLXRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZ2V0LXRhci1jb21taXQtaWQnIDwgPHRhcmZpbGU+CisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBY3RzIGFzIGEgZmlsdGVyLCBleHRyYWN0aW5nIHRoZSBjb21taXQgSUQgc3RvcmVkIGluIGFyY2hpdmVzIGNyZWF0ZWQgYnkKK2dpdC10YXItdHJlZS4gIEl0IHJlYWRzIG9ubHkgdGhlIGZpcnN0IDEwMjQgYnl0ZXMgb2YgaW5wdXQsIHRodXMgaXRzCitydW50aW1lIGlzIG5vdCBpbmZsdWVuY2VkIGJ5IHRoZSBzaXplIG9mIDx0YXJmaWxlPiB2ZXJ5IG11Y2guCisKK0lmIG5vIGNvbW1pdCBJRCBpcyBmb3VuZCwgZ2l0LWdldC10YXItY29tbWl0LWlkIHF1aWV0bHkgZXhpc3RzIHdpdGggYQorcmV0dXJuIGNvZGUgb2YgMS4gIFRoaXMgY2FuIGhhcHBlbiBpZiA8dGFyZmlsZT4gaGFkIG5vdCBiZWVuIGNyZWF0ZWQKK3VzaW5nIGdpdC10YXItdHJlZSBvciBpZiB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIGdpdC10YXItdHJlZSBoYWQgYmVlbgorYSB0cmVlIElEIGluc3RlYWQgb2YgYSBjb21taXQgSUQgb3IgdGFnLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFJlbmUgU2NoYXJmZSA8cmVuZS5zY2hhcmZlQGxzcmZpcmUuYXRoLmN4PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWdyZXAudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZ3JlcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4MTBkZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWdyZXAudHh0CkBAIC0wLDAgKzEsOTUgQEAKK2dpdC1ncmVwKDEpCis9PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZ3JlcCAtIFByaW50IGxpbmVzIG1hdGNoaW5nIGEgcGF0dGVybgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1ncmVwJyBbLS1jYWNoZWRdCisJICAgWy1hIHwgLS10ZXh0XSBbLUldIFstaSB8IC0taWdub3JlLWNhc2VdIFstdyB8IC0td29yZC1yZWdleHBdCisJICAgWy12IHwgLS1pbnZlcnQtbWF0Y2hdCisJICAgWy1FIHwgLS1leHRlbmRlZC1yZWdleHBdIFstRyB8IC0tYmFzaWMtcmVnZXhwXSBbLUYgfCAtLWZpeGVkLXN0cmluZ3NdCisJICAgWy1uXSBbLWwgfCAtLWZpbGVzLXdpdGgtbWF0Y2hlc10gWy1MIHwgLS1maWxlcy13aXRob3V0LW1hdGNoXQorCSAgIFstYyB8IC0tY291bnRdCisJICAgWy1BIDxwb3N0LWNvbnRleHQ+XSBbLUIgPHByZS1jb250ZXh0Pl0gWy1DIDxjb250ZXh0Pl0KKwkgICBbLWYgPGZpbGU+XSBbLWUgPHBhdHRlcm4+XQorCSAgIFs8dHJlZT4uLi5dCisJICAgWy0tXSBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0xvb2sgZm9yIHNwZWNpZmllZCBwYXR0ZXJucyBpbiB0aGUgd29ya2luZyB0cmVlIGZpbGVzLCBibG9icworcmVnaXN0ZXJlZCBpbiB0aGUgaW5kZXggZmlsZSwgb3IgZ2l2ZW4gdHJlZSBvYmplY3RzLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tY2FjaGVkOjoKKwlJbnN0ZWFkIG9mIHNlYXJjaGluZyBpbiB0aGUgd29ya2luZyB0cmVlIGZpbGVzLCBjaGVjaworCXRoZSBibG9icyByZWdpc3RlcmVkIGluIHRoZSBpbmRleCBmaWxlLgorCistYSB8IC0tdGV4dDo6CisJUHJvY2VzcyBiaW5hcnkgZmlsZXMgYXMgaWYgdGhleSB3ZXJlIHRleHQuCisKKy1pIHwgLS1pZ25vcmUtY2FzZTo6CisJSWdub3JlIGNhc2UgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcGF0dGVybnMgYW5kIHRoZQorCWZpbGVzLgorCistdyB8IC0td29yZC1yZWdleHA6OgorCU1hdGNoIHRoZSBwYXR0ZXJuIG9ubHkgYXQgd29yZCBib3VuZGFyeSAoZWl0aGVyIGJlZ2luIGF0IHRoZQorCWJlZ2lubmluZyBvZiBhIGxpbmUsIG9yIHByZWNlZGVkIGJ5IGEgbm9uLXdvcmQgY2hhcmFjdGVyOyBlbmQgYXQKKwl0aGUgZW5kIG9mIGEgbGluZSBvciBmb2xsb3dlZCBieSBhIG5vbi13b3JkIGNoYXJhY3RlcikuCisKKy12IHwgLS1pbnZlcnQtbWF0Y2g6OgorCVNlbGVjdCBub24tbWF0Y2hpbmcgbGluZXMuCisKKy1FIHwgLS1leHRlbmRlZC1yZWdleHAgfCAtRyB8IC0tYmFzaWMtcmVnZXhwOjoKKwlVc2UgUE9TSVggZXh0ZW5kZWQvYmFzaWMgcmVnZXhwIGZvciBwYXR0ZXJucy4gIERlZmF1bHQKKwlpcyB0byB1c2UgYmFzaWMgcmVnZXhwLgorCistbjo6CisJUHJlZml4IHRoZSBsaW5lIG51bWJlciB0byBtYXRjaGluZyBsaW5lcy4KKworLWwgfCAtLWZpbGVzLXdpdGgtbWF0Y2hlcyB8IC1MIHwgLS1maWxlcy13aXRob3V0LW1hdGNoOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgZXZlcnkgbWF0Y2hlZCBsaW5lLCBzaG93IG9ubHkgdGhlCisJbmFtZXMgb2YgZmlsZXMgdGhhdCBjb250YWluIChvciBkbyBub3QgY29udGFpbikgbWF0Y2hlcy4KKworLWMgfCAtLWNvdW50OjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgZXZlcnkgbWF0Y2hlZCBsaW5lLCBzaG93IHRoZSBudW1iZXIgb2YKKwlsaW5lcyB0aGF0IG1hdGNoLgorCistW0FCQ10gPGNvbnRleHQ+OjoKKwlTaG93IGBjb250ZXh0YCB0cmFpbGluZyAoYEFgIC0tIGFmdGVyKSwgb3IgbGVhZGluZyAoYEJgCisJLS0gYmVmb3JlKSwgb3IgYm90aCAoYENgIC0tIGNvbnRleHQpIGxpbmVzLCBhbmQgcGxhY2UgYQorCWxpbmUgY29udGFpbmluZyBgLS1gIGJldHdlZW4gY29udGlndW91cyBncm91cHMgb2YKKwltYXRjaGVzLgorCistZiA8ZmlsZT46OgorCVJlYWQgcGF0dGVybnMgZnJvbSA8ZmlsZT4sIG9uZSBwZXIgbGluZS4KKworYDx0cmVlPi4uLmA6OgorCVNlYXJjaCBibG9icyBpbiB0aGUgdHJlZXMgZm9yIHNwZWNpZmllZCBwYXR0ZXJucy4KKworYC0tYDo6CisJU2lnbmFscyB0aGUgZW5kIG9mIG9wdGlvbnM7IHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzCisJYXJlIDxwYXRoPiBsaW1pdGVycy4KKworCitBdXRob3IKKy0tLS0tLQorT3JpZ2luYWxseSB3cml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sIGxhdGVyCityZXZhbXBlZCBieSBKdW5pbyBDIEhhbWFuby4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU4ZDAwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaGFzaC1vYmplY3QudHh0CkBAIC0wLDAgKzEsNDYgQEAKK2dpdC1oYXNoLW9iamVjdCgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1oYXNoLW9iamVjdCAtIENvbXB1dGVzIG9iamVjdCBJRCBhbmQgb3B0aW9uYWxseSBjcmVhdGVzIGEgYmxvYiBmcm9tIGEgZmlsZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1oYXNoLW9iamVjdCcgWy10IDx0eXBlPl0gWy13XSBbLS1zdGRpbl0gWy0tXSA8ZmlsZT4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDb21wdXRlcyB0aGUgb2JqZWN0IElEIHZhbHVlIGZvciBhbiBvYmplY3Qgd2l0aCBzcGVjaWZpZWQgdHlwZQord2l0aCB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGZpbGUgKHdoaWNoIGNhbiBiZSBvdXRzaWRlIG9mIHRoZQord29yayB0cmVlKSwgYW5kIG9wdGlvbmFsbHkgd3JpdGVzIHRoZSByZXN1bHRpbmcgb2JqZWN0IGludG8gdGhlCitvYmplY3QgZGF0YWJhc2UuICBSZXBvcnRzIGl0cyBvYmplY3QgSUQgdG8gaXRzIHN0YW5kYXJkIG91dHB1dC4KK1RoaXMgaXMgdXNlZCBieSAiZ2l0LWN2c2ltcG9ydCIgdG8gdXBkYXRlIHRoZSBpbmRleAord2l0aG91dCBtb2RpZnlpbmcgZmlsZXMgaW4gdGhlIHdvcmsgdHJlZS4gIFdoZW4gPHR5cGU+IGlzIG5vdAorc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byAiYmxvYiIuIAorCitPUFRJT05TCistLS0tLS0tCisKKy10IDx0eXBlPjo6CisJU3BlY2lmeSB0aGUgdHlwZSAoZGVmYXVsdDogImJsb2IiKS4KKworLXc6OgorCUFjdHVhbGx5IHdyaXRlIHRoZSBvYmplY3QgaW50byB0aGUgb2JqZWN0IGRhdGFiYXNlLgorCistLXN0ZGluOjoKKwlSZWFkIHRoZSBvYmplY3QgZnJvbSBzdGFuZGFyZCBpbnB1dCBpbnN0ZWFkIG9mIGZyb20gYSBmaWxlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1mZXRjaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLWZldGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzFhMTMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1mZXRjaC50eHQKQEAgLTAsMCArMSw0NyBAQAorZ2l0LWh0dHAtZmV0Y2goMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1odHRwLWZldGNoIC0gZG93bmxvYWRzIGEgcmVtb3RlIGdpdCByZXBvc2l0b3J5IHZpYSBIVFRQCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWh0dHAtZmV0Y2gnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLXcgZmlsZW5hbWVdIFstLXJlY292ZXJdIDxjb21taXQ+IDx1cmw+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRG93bmxvYWRzIGEgcmVtb3RlIGdpdCByZXBvc2l0b3J5IHZpYSBIVFRQLgorCitPUFRJT05TCistLS0tLS0tCitjb21taXQtaWQ6OgorICAgICAgICBFaXRoZXIgdGhlIGhhc2ggb3IgdGhlIGZpbGVuYW1lIHVuZGVyIFtVUkxdL3JlZnMvIHRvCisgICAgICAgIHB1bGwuCisKKy1jOjoKKwlHZXQgdGhlIGNvbW1pdCBvYmplY3RzLgorLXQ6OgorCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorLWE6OgorCUdldCBhbGwgdGhlIG9iamVjdHMuCistdjo6CisJUmVwb3J0IHdoYXQgaXMgZG93bmxvYWRlZC4KKworLXcgPGZpbGVuYW1lPjo6CisgICAgICAgIFdyaXRlcyB0aGUgY29tbWl0LWlkIGludG8gdGhlIGZpbGVuYW1lIHVuZGVyICRHSVRfRElSL3JlZnMvPGZpbGVuYW1lPiBvbgorICAgICAgICB0aGUgbG9jYWwgZW5kIGFmdGVyIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWh0dHAtcHVzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLXB1c2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMWY4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLXB1c2gudHh0CkBAIC0wLDAgKzEsODkgQEAKK2dpdC1odHRwLXB1c2goMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWh0dHAtcHVzaCAtIFB1c2ggbWlzc2luZyBvYmplY3RzIHVzaW5nIEhUVFAvREFWCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWh0dHAtcHVzaCcgWy0tY29tcGxldGVdIFstLWZvcmNlXSBbLS12ZXJib3NlXSA8dXJsPiA8cmVmPiBbPHJlZj4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2VuZHMgbWlzc2luZyBvYmplY3RzIHRvIHJlbW90ZSByZXBvc2l0b3J5LCBhbmQgdXBkYXRlcyB0aGUKK3JlbW90ZSBicmFuY2guCisKKworT1BUSU9OUworLS0tLS0tLQorLS1jb21wbGV0ZTo6CisJRG8gbm90IGFzc3VtZSB0aGF0IHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpcyBjb21wbGV0ZSBpbiBpdHMKKwljdXJyZW50IHN0YXRlLCBhbmQgdmVyaWZ5IGFsbCBvYmplY3RzIGluIHRoZSBlbnRpcmUgbG9jYWwKKwlyZWYncyBoaXN0b3J5IGV4aXN0IGluIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4KKworLS1mb3JjZTo6CisJVXN1YWxseSwgdGhlIGNvbW1hbmQgcmVmdXNlcyB0byB1cGRhdGUgYSByZW1vdGUgcmVmIHRoYXQKKwlpcyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIGxvY2FsIHJlZiB1c2VkIHRvIG92ZXJ3cml0ZSBpdC4KKwlUaGlzIGZsYWcgZGlzYWJsZXMgdGhlIGNoZWNrLiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQKKwl0aGUgcmVtb3RlIHJlcG9zaXRvcnkgY2FuIGxvc2UgY29tbWl0czsgdXNlIGl0IHdpdGgKKwljYXJlLgorCistLXZlcmJvc2U6OgorCVJlcG9ydCB0aGUgbGlzdCBvZiBvYmplY3RzIGJlaW5nIHdhbGtlZCBsb2NhbGx5IGFuZCB0aGUKKwlsaXN0IG9mIG9iamVjdHMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5LgorCis8cmVmPi4uLjoKKwlUaGUgcmVtb3RlIHJlZnMgdG8gdXBkYXRlLgorCisKK1NwZWNpZnlpbmcgdGhlIFJlZnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSAnPHJlZj4nIHNwZWNpZmljYXRpb24gY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBwYXR0ZXJuLCBvciBhIHBhaXIKK29mIHN1Y2ggcGF0dGVybnMgc2VwYXJhdGVkIGJ5IGEgY29sb24gIjoiICh0aGlzIG1lYW5zIHRoYXQgYSByZWYgbmFtZQorY2Fubm90IGhhdmUgYSBjb2xvbiBpbiBpdCkuICBBIHNpbmdsZSBwYXR0ZXJuICc8bmFtZT4nIGlzIGp1c3QgYSAKK3Nob3J0aGFuZCBmb3IgJzxuYW1lPjo8bmFtZT4nLgorCitFYWNoIHBhdHRlcm4gcGFpciBjb25zaXN0cyBvZiB0aGUgc291cmNlIHNpZGUgKGJlZm9yZSB0aGUgY29sb24pCithbmQgdGhlIGRlc3RpbmF0aW9uIHNpZGUgKGFmdGVyIHRoZSBjb2xvbikuICBUaGUgcmVmIHRvIGJlCitwdXNoZWQgaXMgZGV0ZXJtaW5lZCBieSBmaW5kaW5nIGEgbWF0Y2ggdGhhdCBtYXRjaGVzIHRoZSBzb3VyY2UKK3NpZGUsIGFuZCB3aGVyZSBpdCBpcyBwdXNoZWQgaXMgZGV0ZXJtaW5lZCBieSB1c2luZyB0aGUKK2Rlc3RpbmF0aW9uIHNpZGUuCisKKyAtIEl0IGlzIGFuIGVycm9yIGlmIDxzcmM+IGRvZXMgbm90IG1hdGNoIGV4YWN0bHkgb25lIG9mIHRoZQorICAgbG9jYWwgcmVmcy4KKworIC0gSWYgPGRzdD4gZG9lcyBub3QgbWF0Y2ggYW55IHJlbW90ZSByZWYsIGVpdGhlcgorCisgICAqIGl0IGhhcyB0byBzdGFydCB3aXRoICJyZWZzLyI7IDxkc3Q+IGlzIHVzZWQgYXMgdGhlCisgICAgIGRlc3RpbmF0aW9uIGxpdGVyYWxseSBpbiB0aGlzIGNhc2UuCisKKyAgICogPHNyYz4gPT0gPGRzdD4gYW5kIHRoZSByZWYgdGhhdCBtYXRjaGVkIHRoZSA8c3JjPiBtdXN0IG5vdAorICAgICBleGlzdCBpbiB0aGUgc2V0IG9mIHJlbW90ZSByZWZzOyB0aGUgcmVmIG1hdGNoZWQgPHNyYz4KKyAgICAgbG9jYWxseSBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbi4KKworV2l0aG91dCAnLS1mb3JjZScsIHRoZSA8c3JjPiByZWYgaXMgc3RvcmVkIGF0IHRoZSByZW1vdGUgb25seSBpZgorPGRzdD4gZG9lcyBub3QgZXhpc3QsIG9yIDxkc3Q+IGlzIGEgcHJvcGVyIHN1YnNldCAoaS5lLiBhbgorYW5jZXN0b3IpIG9mIDxzcmM+LiAgVGhpcyBjaGVjaywga25vd24gYXMgImZhc3QgZm9yd2FyZCBjaGVjayIsCitpcyBwZXJmb3JtZWQgaW4gb3JkZXIgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIHRoZQorcmVtb3RlIHJlZiBhbmQgbG9zZSBvdGhlciBwZW9wbGVzJyBjb21taXRzIGZyb20gdGhlcmUuCisKK1dpdGggJy0tZm9yY2UnLCB0aGUgZmFzdCBmb3J3YXJkIGNoZWNrIGlzIGRpc2FibGVkIGZvciBhbGwgcmVmcy4KKworT3B0aW9uYWxseSwgYSA8cmVmPiBwYXJhbWV0ZXIgY2FuIGJlIHByZWZpeGVkIHdpdGggYSBwbHVzICcrJyBzaWduCit0byBkaXNhYmxlIHRoZSBmYXN0LWZvcndhcmQgY2hlY2sgb25seSBvbiB0aGF0IHJlZi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBOaWNrIEhlbmdldmVsZCA8bmlja2hAcmVhY3RyaXguY29tPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBOaWNrIEhlbmdldmVsZAorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWltYXAtc2VuZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbWFwLXNlbmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTllOWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbWFwLXNlbmQudHh0CkBAIC0wLDAgKzEsNjIgQEAKK2dpdC1pbWFwLXNlbmQoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWltYXAtc2VuZCAtIER1bXAgYSBtYWlsYm94IGZyb20gc3RkaW4gaW50byBhbiBpbWFwIGZvbGRlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1pbWFwLXNlbmQnCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgdXBsb2FkcyBhIG1haWxib3ggZ2VuZXJhdGVkIHdpdGggZ2l0LWZvcm1hdC1wYXRjaAoraW50byBhbiBpbWFwIGRyYWZ0cyBmb2xkZXIuICBUaGlzIGFsbG93cyBwYXRjaGVzIHRvIGJlIHNlbnQgYXMKK290aGVyIGVtYWlsIGlzIHNlbnQgd2l0aCBtYWlsIGNsaWVudHMgdGhhdCBjYW5ub3QgcmVhZCBtYWlsYm94CitmaWxlcyBkaXJlY3RseS4KKworVHlwaWNhbCB1c2FnZSBpcyBzb21ldGhpbmcgbGlrZToKKworZ2l0LWZvcm1hdC1wYXRjaCAtLXNpZ25vZmYgLS1zdGRvdXQgLS1hdHRhY2ggb3JpZ2luIHwgZ2l0LWltYXAtc2VuZAorCisKK0NPTkZJR1VSQVRJT04KKy0tLS0tLS0tLS0tLS0KKworZ2l0LWltYXAtc2VuZCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHZhbHVlcyBpbiB0aGUgcmVwb3NpdG9yeQorY29uZmlndXJhdGlvbiBmaWxlIChzaG93biB3aXRoIGV4YW1wbGVzKToKKworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KK1tpbWFwXQorICAgIEZvbGRlciA9ICJJTkJPWC5EcmFmdHMiCisKK1tpbWFwXQorICAgIFR1bm5lbCA9ICJzc2ggLXEgdXNlckBzZXJ2ZXIuY29tIC91c3IvYmluL2ltYXBkIC4vTWFpbGRpciAyPiAvZGV2L251bGwiCisKK1tpbWFwXQorICAgIEhvc3QgPSBpbWFwLnNlcnZlci5jb20KKyAgICBVc2VyID0gYm9iCisgICAgUGFzcyA9IHB3ZAorICAgIFBvcnQgPSAxNDMKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKworQlVHUworLS0tLQorRG9lc24ndCBoYW5kbGUgbGluZXMgc3RhcnRpbmcgd2l0aCAiRnJvbSAiIGluIHRoZSBtZXNzYWdlIGJvZHkuCisKKworQXV0aG9yCistLS0tLS0KK0Rlcml2ZWQgZnJvbSBpc3luYyAxLjAuMSBieSBNaWtlIE1jQ29ybWFjay4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWlrZSBNY0Nvcm1hY2sKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1pbmRleC1wYWNrLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWluZGV4LXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxY2U1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbmRleC1wYWNrLnR4dApAQCAtMCwwICsxLDQ0IEBACitnaXQtaW5kZXgtcGFjaygxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWluZGV4LXBhY2sgLSBCdWlsZCBwYWNrIGluZGV4IGZpbGUgZm9yIGFuIGV4aXN0aW5nIHBhY2tlZCBhcmNoaXZlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWluZGV4LXBhY2snIFstbyA8aW5kZXgtZmlsZT5dIDxwYWNrLWZpbGU+CisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBhIHBhY2tlZCBhcmNoaXZlICgucGFjaykgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUsIGFuZAorYnVpbGRzIGEgcGFjayBpbmRleCBmaWxlICguaWR4KSBmb3IgaXQuICBUaGUgcGFja2VkIGFyY2hpdmUKK3RvZ2V0aGVyIHdpdGggdGhlIHBhY2sgaW5kZXggY2FuIHRoZW4gYmUgcGxhY2VkIGluIHRoZQorb2JqZWN0cy9wYWNrLyBkaXJlY3Rvcnkgb2YgYSBnaXQgcmVwb3NpdG9yeS4KKworCitPUFRJT05TCistLS0tLS0tCistbyA8aW5kZXgtZmlsZT46OgorCVdyaXRlIHRoZSBnZW5lcmF0ZWQgcGFjayBpbmRleCBpbnRvIHRoZSBzcGVjaWZpZWQKKwlmaWxlLiAgV2l0aG91dCB0aGlzIG9wdGlvbiB0aGUgbmFtZSBvZiBwYWNrIGluZGV4CisJZmlsZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBuYW1lIG9mIHBhY2tlZCBhcmNoaXZlCisJZmlsZSBieSByZXBsYWNpbmcgLnBhY2sgd2l0aCAuaWR4IChhbmQgdGhlIHByb2dyYW0KKwlmYWlscyBpZiB0aGUgbmFtZSBvZiBwYWNrZWQgYXJjaGl2ZSBkb2VzIG5vdCBlbmQKKwl3aXRoIC5wYWNrKS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBTZXJnZXkgVmxhc292IDx2c3VAYWx0bGludXgucnU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgU2VyZ2V5IFZsYXNvdgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaW5pdC1kYi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbml0LWRiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE1MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaW5pdC1kYi50eHQKQEAgLTAsMCArMSw4MiBAQAorZ2l0LWluaXQtZGIoMSkKKz09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1pbml0LWRiIC0gQ3JlYXRlcyBhbiBlbXB0eSBnaXQgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1pbml0LWRiJyBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0gWy0tc2hhcmVkXQorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT46OgorCVByb3ZpZGUgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRlbXBsYXRlcyB3aWxsIGJlIHVzZWQuCisJVGhlIGRlZmF1bHQgdGVtcGxhdGUgZGlyZWN0b3J5IGlzIGAvdXNyL3NoYXJlL2dpdC1jb3JlL3RlbXBsYXRlc2AuCisKKy0tc2hhcmVkOjoKKwlTcGVjaWZ5IHRoYXQgdGhlIGdpdCByZXBvc2l0b3J5IGlzIHRvIGJlIHNoYXJlZCBhbW9uZ3N0IHNldmVyYWwgdXNlcnMuCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgY3JlYXRlcyBhbiBlbXB0eSBnaXQgcmVwb3NpdG9yeSAtIGJhc2ljYWxseSBhIGAuZ2l0YCBkaXJlY3RvcnkKK3dpdGggc3ViZGlyZWN0b3JpZXMgZm9yIGBvYmplY3RzYCwgYHJlZnMvaGVhZHNgLCBgcmVmcy90YWdzYCwgYW5kCit0ZW1wbGF0ZWQgZmlsZXMuCitBbiBpbml0aWFsIGBIRUFEYCBmaWxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgSEVBRCBvZiB0aGUgbWFzdGVyIGJyYW5jaAoraXMgYWxzbyBjcmVhdGVkLgorCitJZiBgLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5PmAgaXMgc3BlY2lmaWVkLCBgPHRlbXBsYXRlX2RpcmVjdG9yeT5gCitpcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIHRlbXBsYXRlIGZpbGVzIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LgorVGhlIHRlbXBsYXRlIGZpbGVzIGluY2x1ZGUgc29tZSBkaXJlY3Rvcnkgc3RydWN0dXJlLCBzb21lIHN1Z2dlc3RlZAorImV4Y2x1ZGUgcGF0dGVybnMiLCBhbmQgY29waWVzIG9mIG5vbi1leGVjdXRpbmcgImhvb2siIGZpbGVzLiAgVGhlCitzdWdnZXN0ZWQgcGF0dGVybnMgYW5kIGhvb2sgZmlsZXMgYXJlIGFsbCBtb2RpZmlhYmxlIGFuZCBleHRlbnNpYmxlLgorCitJZiB0aGUgYCRHSVRfRElSYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdGhlbiBpdCBzcGVjaWZpZXMgYSBwYXRoCit0byB1c2UgaW5zdGVhZCBvZiBgLi8uZ2l0YCBmb3IgdGhlIGJhc2Ugb2YgdGhlIHJlcG9zaXRvcnkuCisKK0lmIHRoZSBvYmplY3Qgc3RvcmFnZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHZpYSB0aGUgYCRHSVRfT0JKRUNUX0RJUkVDVE9SWWAKK2Vudmlyb25tZW50IHZhcmlhYmxlIHRoZW4gdGhlIHNoYTEgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQgdW5kZXJuZWF0aCAtCitvdGhlcndpc2UgdGhlIGRlZmF1bHQgYCRHSVRfRElSL29iamVjdHNgIGRpcmVjdG9yeSBpcyB1c2VkLgorCitBIHNoYXJlZCByZXBvc2l0b3J5IGFsbG93cyB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgZ3JvdXAgdG8gcHVzaCBpbnRvIHRoYXQKK3JlcG9zaXRvcnkuIFdoZW4gc3BlY2lmeWluZyBgLS1zaGFyZWRgIHRoZSBjb25maWcgdmFyaWFibGUgImNvcmUuc2hhcmVkUmVwb3NpdG9yeSIgCitpcyBzZXQgdG8gJ3RydWUnIHNvIHRoYXQgZGlyZWN0b3JpZXMgdW5kZXIgYCRHSVRfRElSYCBhcmUgbWFkZSBncm91cCB3cml0YWJsZQorKGFuZCBnK3N4LCBzaW5jZSB0aGUgZ2l0IGdyb3VwIG1heSBiZSBub3QgdGhlIHByaW1hcnkgZ3JvdXAgb2YgYWxsIHVzZXJzKS4KKworUnVubmluZyBgZ2l0LWluaXQtZGJgIGluIGFuIGV4aXN0aW5nIHJlcG9zaXRvcnkgaXMgc2FmZS4gSXQgd2lsbCBub3Qgb3ZlcndyaXRlCit0aGluZ3MgdGhhdCBhcmUgYWxyZWFkeSB0aGVyZS4gVGhlIHByaW1hcnkgcmVhc29uIGZvciByZXJ1bm5pbmcgYGdpdC1pbml0LWRiYAoraXMgdG8gcGljayB1cCBuZXdseSBhZGRlZCB0ZW1wbGF0ZXMuCisKKworCitFWEFNUExFUworLS0tLS0tLS0KKworU3RhcnQgYSBuZXcgZ2l0IHJlcG9zaXRvcnkgZm9yIGFuIGV4aXN0aW5nIGNvZGUgYmFzZTo6CisrCistLS0tLS0tLS0tLS0tLS0tCiskIGNkIC9wYXRoL3RvL215L2NvZGViYXNlCiskIGdpdC1pbml0LWRiICAgPDE+CiskIGdpdC1hZGQgLiAgICAgPDI+CistLS0tLS0tLS0tLS0tLS0tCisrCis8MT4gcHJlcGFyZSAvcGF0aC90by9teS9jb2RlYmFzZS8uZ2l0IGRpcmVjdG9yeQorPDI+IGFkZCBhbGwgZXhpc3RpbmcgZmlsZSB0byB0aGUgaW5kZXgKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbG9jYWwtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9jYWwtZmV0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWJlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1sb2NhbC1mZXRjaC50eHQKQEAgLTAsMCArMSw0MyBAQAorZ2l0LWxvY2FsLWZldGNoKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxvY2FsLWZldGNoIC0gRHVwbGljYXRlcyBhbm90aGVyIGdpdCByZXBvc2l0b3J5IG9uIGEgbG9jYWwgc3lzdGVtCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWxvY2FsLWZldGNoJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy13IGZpbGVuYW1lXSBbLS1yZWNvdmVyXSBbLWxdIFstc10gWy1uXSBjb21taXQtaWQgcGF0aAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0R1cGxpY2F0ZXMgYW5vdGhlciBnaXQgcmVwb3NpdG9yeSBvbiBhIGxvY2FsIHN5c3RlbS4KKworT1BUSU9OUworLS0tLS0tLQorLWM6OgorCUdldCB0aGUgY29tbWl0IG9iamVjdHMuCistdDo6CisJR2V0IHRyZWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWl0IG9iamVjdHMuCistYTo6CisJR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy12OjoKKwlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorCistdyA8ZmlsZW5hbWU+OjoKKyAgICAgICAgV3JpdGVzIHRoZSBjb21taXQtaWQgaW50byB0aGUgZmlsZW5hbWUgdW5kZXIgJEdJVF9ESVIvcmVmcy88ZmlsZW5hbWU+IG9uCisgICAgICAgIHRoZSBsb2NhbCBlbmQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbG9nLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxvZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmZmZmNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWxvZy50eHQKQEAgLTAsMCArMSw3NyBAQAorZ2l0LWxvZygxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbG9nIC0gU2hvdyBjb21taXQgbG9ncworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1sb2cnIDxvcHRpb24+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2hvd3MgdGhlIGNvbW1pdCBsb2dzLgorCitUaGUgY29tbWFuZCB0YWtlcyBvcHRpb25zIGFwcGxpY2FibGUgdG8gdGhlIGdpdGxpbms6Z2l0LXJldi1saXN0WzFdCitjb21tYW5kIHRvIGNvbnRyb2wgd2hhdCBpcyBzaG93biBhbmQgaG93LCBhbmQgb3B0aW9ucyBhcHBsaWNhYmxlIHRvCit0aGUgZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdIGNvbW1hbmRzIHRvIGNvbnRyb2wgaG93IHRoZSBjaGFuZ2UKK2VhY2ggY29tbWl0IGludHJvZHVjZXMgYXJlIHNob3duLgorCitUaGlzIG1hbnVhbCBwYWdlIGRlc2NyaWJlcyBvbmx5IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcHRpb25zLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tcHJldHR5PTxmb3JtYXQ+OjoKKwlDb250cm9scyB0aGUgd2F5IHRoZSBjb21taXQgbG9nIGlzIGZvcm1hdHRlZC4KKworLS1tYXgtY291bnQ9PG4+OjoKKwlMaW1pdHMgdGhlIG51bWJlciBvZiBjb21taXRzIHRvIHNob3cuCisKKzxzaW5jZT4uLjx1bnRpbD46OgorCVNob3cgb25seSBjb21taXRzIGJldHdlZW4gdGhlIG5hbWVkIHR3byBjb21taXRzLgorCistcDo6CisJU2hvdyB0aGUgY2hhbmdlIHRoZSBjb21taXQgaW50cm9kdWNlcyBpbiBhIHBhdGNoIGZvcm0uCisKKzxwYXRocz4uLi46OgorCVNob3cgb25seSBjb21taXRzIHRoYXQgYWZmZWN0IHRoZSBzcGVjaWZpZWQgcGF0aHMuCisKKworRXhhbXBsZXMKKy0tLS0tLS0tCitnaXQgbG9nIC0tbm8tbWVyZ2VzOjoKKworCVNob3cgdGhlIHdob2xlIGNvbW1pdCBoaXN0b3J5LCBidXQgc2tpcCBhbnkgbWVyZ2VzCisKK2dpdCBsb2cgdjIuNi4xMi4uIGluY2x1ZGUvc2NzaSBkcml2ZXJzL3Njc2k6OgorCisJU2hvdyBhbGwgY29tbWl0cyBzaW5jZSB2ZXJzaW9uICd2Mi42LjEyJyB0aGF0IGNoYW5nZWQgYW55IGZpbGUKKwlpbiB0aGUgaW5jbHVkZS9zY3NpIG9yIGRyaXZlcnMvc2NzaSBzdWJkaXJlY3RvcmllcworCitnaXQgbG9nIC0tc2luY2U9IjIgd2Vla3MgYWdvIiBcLS0gZ2l0azo6CisKKwlTaG93IHRoZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGFzdCB0d28gd2Vla3MgdG8gdGhlIGZpbGUgJ2dpdGsnLgorCVRoZSAiLS0iIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgKmJyYW5jaCogbmFtZWQKKwknZ2l0aycKKworZ2l0IGxvZyAtciAtLW5hbWUtc3RhdHVzIHJlbGVhc2UuLnRlc3Q6OgorCisJU2hvdyB0aGUgY29tbWl0cyB0aGF0IGFyZSBpbiB0aGUgInRlc3QiIGJyYW5jaCBidXQgbm90IHlldAorCWluIHRoZSAicmVsZWFzZSIgYnJhbmNoLCBhbG9uZyB3aXRoIHRoZSBsaXN0IG9mIHBhdGhzCisJZWFjaCBjb21taXQgbW9kaWZpZXMuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1sb3N0LWZvdW5kLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxvc3QtZm91bmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MmE5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1sb3N0LWZvdW5kLnR4dApAQCAtMCwwICsxLDc4IEBACitnaXQtbG9zdC1mb3VuZCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxvc3QtZm91bmQgLSBSZWNvdmVyIGxvc3QgcmVmcyB0aGF0IGx1Y2tpbHkgaGF2ZSBub3QgeWV0IGJlZW4gcHJ1bmVkCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1sb3N0LWZvdW5kJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ZpbmRzIGRhbmdsaW5nIGNvbW1pdHMgYW5kIHRhZ3MgZnJvbSB0aGUgb2JqZWN0IGRhdGFiYXNlLCBhbmQKK2NyZWF0ZXMgcmVmcyB0byB0aGVtIGluIC5naXQvbG9zdC1mb3VuZC8gZGlyZWN0b3J5LiAgQ29tbWl0cyBhbmQKK3RhZ3MgdGhhdCBkZXJlZmVyZW5jZSB0byBjb21taXRzIGdvIHRvIC5naXQvbG9zdC1mb3VuZC9jb21taXQKK2FuZCBvdGhlcnMgYXJlIHN0b3JlZCBpbiAuZ2l0L2xvc3QtZm91bmQvb3RoZXIgZGlyZWN0b3J5LgorCisKK09VVFBVVAorLS0tLS0tCitPbmUgbGluZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBjb21taXQgYW5kIHRhZyBmb3VuZCBhbG9uZyB3aXRoCit0aGVpciBvYmplY3QgbmFtZSBhcmUgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCisKK0VYQU1QTEUKKy0tLS0tLS0KKworU3VwcG9zZSB5b3UgcnVuICdnaXQgdGFnIC1mJyBhbmQgbWlzdHlwZWQgdGhlIHRhZyB0byBvdmVyd3JpdGUuCitUaGUgcmVmIHRvIHlvdXIgdGFnIGlzIG92ZXJ3cml0dGVuLCBidXQgdW50aWwgeW91IHJ1biAnZ2l0CitwcnVuZScsIGl0IGlzIHN0aWxsIHRoZXJlLgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGxvc3QtZm91bmQKK1sxZWYyYjE5NmQ5MDllZWQ1MjNkNGYzYzliZjU0Yjc4Y2RkNjg0M2M2XSBHSVQgMC45OS45YworLi4uCistLS0tLS0tLS0tLS0KKworQWxzbyB5b3UgY2FuIHVzZSBnaXRrIHRvIGJyb3dzZSBob3cgdGhleSByZWxhdGUgdG8gZWFjaCBvdGhlcgorYW5kIGV4aXN0aW5nIChwcm9iYWJseSBvbGQpIHRhZ3MuCisKKy0tLS0tLS0tLS0tLQorJCBnaXRrICQoY2QgLmdpdC9sb3N0LWZvdW5kL2NvbW1pdCAmJiBlY2hvID8/KikKKy0tLS0tLS0tLS0tLQorCitBZnRlciBtYWtpbmcgc3VyZSB0aGF0IGl0IGlzIHRoZSBvYmplY3QgeW91IGFyZSBsb29raW5nIGZvciwgeW91CitjYW4gcmVjb25uZWN0IGl0IHRvIHlvdXIgcmVndWxhciAuZ2l0L3JlZnMgaGllcmFyY2h5LgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNhdC1maWxlIC10IDFlZjJiMTk2Cit0YWcKKyQgZ2l0IGNhdC1maWxlIHRhZyAxZWYyYjE5Ngorb2JqZWN0IGZhNDFiYmNlOGUzOGM2N2EyMTg0MTVkZTZjZmE1MTBjN2U1MDAzMmEKK3R5cGUgY29tbWl0Cit0YWcgdjAuOTkuOWMKK3RhZ2dlciBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IDExMzEwNTk1OTQgLTA4MDAKKworR0lUIDAuOTkuOWMKKworVGhpcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGNoYW5nZXMgZnJvbSB0aGUgIm1hc3RlciIgYnJhbmNoLCBzaW5jZQorLi4uCiskIGdpdCB1cGRhdGUtcmVmIHJlZnMvdGFncy9ub3QtbG9zdC1hbnltb3JlIDFlZjJiMTk2CiskIGdpdCByZXYtcGFyc2Ugbm90LWxvc3QtYW55bW9yZQorMWVmMmIxOTZkOTA5ZWVkNTIzZDRmM2M5YmY1NGI3OGNkZDY4NDNjNgorLS0tLS0tLS0tLS0tCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIOa/semHjiDntJQgPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLWZpbGVzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLWZpbGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDhhMmFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtZmlsZXMudHh0CkBAIC0wLDAgKzEsMjU0IEBACitnaXQtbHMtZmlsZXMoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbHMtZmlsZXMgLSBJbmZvcm1hdGlvbiBhYm91dCBmaWxlcyBpbiB0aGUgaW5kZXgvd29ya2luZyBkaXJlY3RvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtbHMtZmlsZXMnIFstel0gWy10XSBbLXZdCisJCSgtLVtjYWNoZWR8ZGVsZXRlZHxvdGhlcnN8aWdub3JlZHxzdGFnZXx1bm1lcmdlZHxraWxsZWR8bW9kaWZpZWRdKVwqCisJCSgtW2N8ZHxvfGl8c3x1fGt8bV0pXCoKKwkJWy14IDxwYXR0ZXJuPnwtLWV4Y2x1ZGU9PHBhdHRlcm4+XQorCQlbLVggPGZpbGU+fC0tZXhjbHVkZS1mcm9tPTxmaWxlPl0KKwkJWy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxmaWxlPl0KKwkJWy0tZXJyb3ItdW5tYXRjaF0KKwkJWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXZdIFstLV0gWzxmaWxlPl1cKgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgbWVyZ2VzIHRoZSBmaWxlIGxpc3RpbmcgaW4gdGhlIGRpcmVjdG9yeSBjYWNoZSBpbmRleCB3aXRoIHRoZQorYWN0dWFsIHdvcmtpbmcgZGlyZWN0b3J5IGxpc3QsIGFuZCBzaG93cyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHRoZQordHdvLgorCitPbmUgb3IgbW9yZSBvZiB0aGUgb3B0aW9ucyBiZWxvdyBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGZpbGVzCitzaG93bjoKKworT1BUSU9OUworLS0tLS0tLQorLWN8LS1jYWNoZWQ6OgorCVNob3cgY2FjaGVkIGZpbGVzIGluIHRoZSBvdXRwdXQgKGRlZmF1bHQpCisKKy1kfC0tZGVsZXRlZDo6CisJU2hvdyBkZWxldGVkIGZpbGVzIGluIHRoZSBvdXRwdXQKKworLW18LS1tb2RpZmllZDo6CisJU2hvdyBtb2RpZmllZCBmaWxlcyBpbiB0aGUgb3V0cHV0CisKKy1vfC0tb3RoZXJzOjoKKwlTaG93IG90aGVyIGZpbGVzIGluIHRoZSBvdXRwdXQKKworLWl8LS1pZ25vcmVkOjoKKwlTaG93IGlnbm9yZWQgZmlsZXMgaW4gdGhlIG91dHB1dAorCU5vdGUgdGhlIHRoaXMgYWxzbyByZXZlcnNlcyBhbnkgZXhjbHVkZSBsaXN0IHByZXNlbnQuCisKKy1zfC0tc3RhZ2U6OgorCVNob3cgc3RhZ2UgZmlsZXMgaW4gdGhlIG91dHB1dAorCistLWRpcmVjdG9yeTo6CisJSWYgYSB3aG9sZSBkaXJlY3RvcnkgaXMgY2xhc3NpZmllZCBhcyAib3RoZXIiLCBzaG93IGp1c3QgaXRzCisJbmFtZSAod2l0aCBhIHRyYWlsaW5nIHNsYXNoKSBhbmQgbm90IGl0cyB3aG9sZSBjb250ZW50cy4KKworLS1uby1lbXB0eS1kaXJlY3Rvcnk6OgorCURvIG5vdCBsaXN0IGVtcHR5IGRpcmVjdG9yaWVzLiBIYXMgbm8gZWZmZWN0IHdpdGhvdXQgLS1kaXJlY3RvcnkuCisKKy11fC0tdW5tZXJnZWQ6OgorCVNob3cgdW5tZXJnZWQgZmlsZXMgaW4gdGhlIG91dHB1dCAoZm9yY2VzIC0tc3RhZ2UpCisKKy1rfC0ta2lsbGVkOjoKKwlTaG93IGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtIHRoYXQgbmVlZCB0byBiZSByZW1vdmVkIGR1ZQorCXRvIGZpbGUvZGlyZWN0b3J5IGNvbmZsaWN0cyBmb3IgY2hlY2tvdXQtaW5kZXggdG8KKwlzdWNjZWVkLgorCistejo6CisJXDAgbGluZSB0ZXJtaW5hdGlvbiBvbiBvdXRwdXQuCisKKy14fC0tZXhjbHVkZT08cGF0dGVybj46OgorCVNraXBzIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm4uCisJTm90ZSB0aGF0IHBhdHRlcm4gaXMgYSBzaGVsbCB3aWxkY2FyZCBwYXR0ZXJuLgorCistWHwtLWV4Y2x1ZGUtZnJvbT08ZmlsZT46OgorCWV4Y2x1ZGUgcGF0dGVybnMgYXJlIHJlYWQgZnJvbSA8ZmlsZT47IDEgcGVyIGxpbmUuCisKKy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxmaWxlPjo6CisJcmVhZCBhZGRpdGlvbmFsIGV4Y2x1ZGUgcGF0dGVybnMgdGhhdCBhcHBseSBvbmx5IHRvIHRoZQorCWRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzIGluIDxmaWxlPi4KKworLS1lcnJvci11bm1hdGNoOjoKKwlJZiBhbnkgPGZpbGU+IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgaW5kZXgsIHRyZWF0IHRoaXMgYXMgYW4KKwllcnJvciAocmV0dXJuIDEpLgorCistdDo6CisJSWRlbnRpZnkgdGhlIGZpbGUgc3RhdHVzIHdpdGggdGhlIGZvbGxvd2luZyB0YWdzIChmb2xsb3dlZCBieQorCWEgc3BhY2UpIGF0IHRoZSBzdGFydCBvZiBlYWNoIGxpbmU6CisJSDo6CWNhY2hlZAorCU06Ogl1bm1lcmdlZAorCVI6OglyZW1vdmVkL2RlbGV0ZWQKKwlDOjoJbW9kaWZpZWQvY2hhbmdlZAorCUs6Ogl0byBiZSBraWxsZWQKKwk/OjoJb3RoZXIKKworLXY6OgorCVNpbWlsYXIgdG8gYC10YCwgYnV0IHVzZSBsb3dlcmNhc2UgbGV0dGVycyBmb3IgZmlsZXMKKwl0aGF0IGFyZSBtYXJrZWQgYXMgJ2Fsd2F5cyBtYXRjaGluZyBpbmRleCcuCisKKy0tZnVsbC1uYW1lOjoKKwlXaGVuIHJ1biBmcm9tIGEgc3ViZGlyZWN0b3J5LCB0aGUgY29tbWFuZCB1c3VhbGx5CisJb3V0cHV0cyBwYXRocyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBUaGlzCisJb3B0aW9uIGZvcmNlcyBwYXRocyB0byBiZSBvdXRwdXQgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKKwl0b3AgZGlyZWN0b3J5LgorCistLWFiYnJldls9PG4+XTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBmdWxsIDQwLWJ5dGUgaGV4YWRlY2ltYWwgb2JqZWN0CisJbGluZXMsIHNob3cgb25seSBoYW5kZnVsIGhleGRpZ2l0cyBwcmVmaXguCisJTm9uIGRlZmF1bHQgbnVtYmVyIG9mIGRpZ2l0cyBjYW4gYmUgc3BlY2lmaWVkIHdpdGggLS1hYmJyZXY9PG4+LgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKKzxmaWxlPjo6CisJRmlsZXMgdG8gc2hvdy4gSWYgbm8gZmlsZXMgYXJlIGdpdmVuIGFsbCBmaWxlcyB3aGljaCBtYXRjaCB0aGUgb3RoZXIKKwlzcGVjaWZpZWQgY3JpdGVyaWEgYXJlIHNob3duLgorCitPdXRwdXQKKy0tLS0tLQorc2hvdyBmaWxlcyBqdXN0IG91dHB1dHMgdGhlIGZpbGVuYW1lIHVubGVzcyAnLS1zdGFnZScgaXMgc3BlY2lmaWVkIGluCit3aGljaCBjYXNlIGl0IG91dHB1dHM6CisKKyAgICAgICAgWzx0YWc+IF08bW9kZT4gPG9iamVjdD4gPHN0YWdlPiA8ZmlsZT4KKworImdpdC1scy1maWxlcyAtLXVubWVyZ2VkIiBhbmQgImdpdC1scy1maWxlcyAtLXN0YWdlIiBjYW4gYmUgdXNlZCB0byBleGFtaW5lCitkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB1bm1lcmdlZCBwYXRocy4KKworRm9yIGFuIHVubWVyZ2VkIHBhdGgsIGluc3RlYWQgb2YgcmVjb3JkaW5nIGEgc2luZ2xlIG1vZGUvU0hBMSBwYWlyLAordGhlIGRpcmNhY2hlIHJlY29yZHMgdXAgdG8gdGhyZWUgc3VjaCBwYWlyczsgb25lIGZyb20gdHJlZSBPIGluIHN0YWdlCisxLCBBIGluIHN0YWdlIDIsIGFuZCBCIGluIHN0YWdlIDMuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIGJ5Cit0aGUgdXNlciAob3IgdGhlIHBvcmNlbGFpbikgdG8gc2VlIHdoYXQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVjb3JkZWQgYXQgdGhlCitwYXRoLiAoc2VlIGdpdC1yZWFkLXRyZWUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3RhdGUpCisKK1doZW4gYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwKK3Jlc3BlY3RpdmVseS4KKworCitFeGNsdWRlIFBhdHRlcm5zCistLS0tLS0tLS0tLS0tLS0tCisKKydnaXQtbHMtZmlsZXMnIGNhbiB1c2UgYSBsaXN0IG9mICJleGNsdWRlIHBhdHRlcm5zIiB3aGVuCit0cmF2ZXJzaW5nIHRoZSBkaXJlY3RvcnkgdHJlZSBhbmQgZmluZGluZyBmaWxlcyB0byBzaG93IHdoZW4gdGhlCitmbGFncyAtLW90aGVycyBvciAtLWlnbm9yZWQgYXJlIHNwZWNpZmllZC4KKworVGhlc2UgZXhjbHVkZSBwYXR0ZXJucyBjb21lIGZyb20gdGhlc2UgcGxhY2VzOgorCisgIDEuIGNvbW1hbmQgbGluZSBmbGFnIC0tZXhjbHVkZT08cGF0dGVybj4gc3BlY2lmaWVzIGEgc2luZ2xlCisgICAgIHBhdHRlcm4uCisKKyAgMi4gY29tbWFuZCBsaW5lIGZsYWcgLS1leGNsdWRlLWZyb209PGZpbGU+IHNwZWNpZmllcyBhIGxpc3Qgb2YKKyAgICAgcGF0dGVybnMgc3RvcmVkIGluIGEgZmlsZS4KKworICAzLiBjb21tYW5kIGxpbmUgZmxhZyAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08bmFtZT4gc3BlY2lmaWVzCisgICAgIGEgbmFtZSBvZiB0aGUgZmlsZSBpbiBlYWNoIGRpcmVjdG9yeSAnZ2l0LWxzLWZpbGVzJworICAgICBleGFtaW5lcywgYW5kIGlmIGV4aXN0cywgaXRzIGNvbnRlbnRzIGFyZSB1c2VkIGFzIGFuCisgICAgIGFkZGl0aW9uYWwgbGlzdCBvZiBwYXR0ZXJucy4KKworQW4gZXhjbHVkZSBwYXR0ZXJuIGZpbGUgdXNlZCBieSAoMikgYW5kICgzKSBjb250YWlucyBvbmUgcGF0dGVybgorcGVyIGxpbmUuICBBIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBhICcjJyBjYW4gYmUgdXNlZCBhcyBjb21tZW50Citmb3IgcmVhZGFiaWxpdHkuCisKK1RoZXJlIGFyZSB0aHJlZSBsaXN0cyBvZiBwYXR0ZXJucyB0aGF0IGFyZSBpbiBlZmZlY3QgYXQgYSBnaXZlbgordGltZS4gIFRoZXkgYXJlIGJ1aWx0IGFuZCBvcmRlcmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorCisgKiAtLWV4Y2x1ZGU9PHBhdHRlcm4+IGZyb20gdGhlIGNvbW1hbmQgbGluZTsgcGF0dGVybnMgYXJlCisgICBvcmRlcmVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKyAqIGxpbmVzIHJlYWQgZnJvbSAtLWV4Y2x1ZGUtZnJvbT08ZmlsZT47IHBhdHRlcm5zIGFyZSBvcmRlcmVkCisgICBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhciBpbiB0aGUgZmlsZS4KKworICogV2hlbiAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08bmFtZT4gaXMgc3BlY2lmaWVkLCB1cG9uCisgICBlbnRlcmluZyBhIGRpcmVjdG9yeSB0aGF0IGhhcyBzdWNoIGEgZmlsZSwgaXRzIGNvbnRlbnRzIGFyZQorICAgYXBwZW5kZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCAibGlzdCBvZiBwYXR0ZXJucyIuICBUaGV5CisgICBhcmUgcG9wcGVkIG9mZiB3aGVuIGxlYXZpbmcgdGhlIGRpcmVjdG9yeS4KKworRWFjaCBwYXR0ZXJuIGluIHRoZSBwYXR0ZXJuIGxpc3Qgc3BlY2lmaWVzICJhIG1hdGNoIHBhdHRlcm4iIGFuZAorb3B0aW9uYWxseSB0aGUgZmF0ZTsgZWl0aGVyIGEgZmlsZSB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gaXMKK2NvbnNpZGVyZWQgZXhjbHVkZWQgb3IgaW5jbHVkZWQuICBBIGZpbGVuYW1lIGlzIG1hdGNoZWQgYWdhaW5zdAordGhlIHBhdHRlcm5zIGluIHRoZSB0aHJlZSBsaXN0czsgdGhlIC0tZXhjbHVkZS1mcm9tIGxpc3QgaXMKK2NoZWNrZWQgZmlyc3QsIHRoZW4gdGhlIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5IGxpc3QsIGFuZCB0aGVuCitmaW5hbGx5IHRoZSAtLWV4Y2x1ZGUgbGlzdC4gVGhlIGxhc3QgbWF0Y2ggZGV0ZXJtaW5lcyBpdHMgZmF0ZS4KK0lmIHRoZXJlIGlzIG5vIG1hdGNoIGluIHRoZSB0aHJlZSBsaXN0cywgdGhlIGZhdGUgaXMgImluY2x1ZGVkIi4KKworQSBwYXR0ZXJuIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggLS1leGNsdWRlIG9yIHJlYWQKK2Zyb20gdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLS1leGNsdWRlLWZyb20gaXMgcmVsYXRpdmUgdG8gdGhlCit0b3Agb2YgdGhlIGRpcmVjdG9yeSB0cmVlLiAgQSBwYXR0ZXJuIHJlYWQgZnJvbSBhIGZpbGUgc3BlY2lmaWVkCitieSAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeSBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlCitwYXR0ZXJuIGZpbGUgYXBwZWFycyBpbi4KKworQW4gZXhjbHVkZSBwYXR0ZXJuIGlzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgLSBhbiBvcHRpb25hbCBwcmVmaXggJyEnIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGZhdGUgdGhpcyBwYXR0ZXJuCisgICBzcGVjaWZpZXMgaXMgImluY2x1ZGUiLCBub3QgdGhlIHVzdWFsICJleGNsdWRlIjsgdGhlCisgICByZW1haW5kZXIgb2YgdGhlIHBhdHRlcm4gc3RyaW5nIGlzIGludGVycHJldGVkIGFjY29yZGluZyB0bworICAgdGhlIGZvbGxvd2luZyBydWxlcy4KKworIC0gaWYgaXQgZG9lcyBub3QgY29udGFpbiBhIHNsYXNoICcvJywgaXQgaXMgYSBzaGVsbCBnbG9iCisgICBwYXR0ZXJuIGFuZCB1c2VkIHRvIG1hdGNoIGFnYWluc3QgdGhlIGZpbGVuYW1lIHdpdGhvdXQKKyAgIGxlYWRpbmcgZGlyZWN0b3JpZXMuCisKKyAtIG90aGVyd2lzZSwgaXQgaXMgYSBzaGVsbCBnbG9iIHBhdHRlcm4sIHN1aXRhYmxlIGZvcgorICAgY29uc3VtcHRpb24gYnkgZm5tYXRjaCgzKSB3aXRoIEZOTV9QQVRITkFNRSBmbGFnLiAgSS5lLiBhCisgICBzbGFzaCBpbiB0aGUgcGF0dGVybiBtdXN0IG1hdGNoIGEgc2xhc2ggaW4gdGhlIHBhdGhuYW1lLgorICAgIkRvY3VtZW50YXRpb24vXCouaHRtbCIgbWF0Y2hlcyAiRG9jdW1lbnRhdGlvbi9naXQuaHRtbCIgYnV0CisgICBub3QgInBwYy9wcGMuaHRtbCIuICBBcyBhIG5hdHVyYWwgZXhjZXB0aW9uLCAiLyouYyIgbWF0Y2hlcworICAgImNhdC1maWxlLmMiIGJ1dCBub3QgIm1vemlsbGEtc2hhMS9zaGExLmMiLgorCitBbiBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICQgY2F0IC5naXQvaWdub3JlCisgICAgIyBpZ25vcmUgb2JqZWN0cyBhbmQgYXJjaGl2ZXMsIGFueXdoZXJlIGluIHRoZSB0cmVlLgorICAgICouW29hXQorICAgICQgY2F0IERvY3VtZW50YXRpb24vLmdpdGlnbm9yZQorICAgICMgaWdub3JlIGdlbmVyYXRlZCBodG1sIGZpbGVzLAorICAgICouaHRtbAorICAgICMgZXhjZXB0IGZvby5odG1sIHdoaWNoIGlzIG1haW50YWluZWQgYnkgaGFuZAorICAgICFmb28uaHRtbAorICAgICQgZ2l0LWxzLWZpbGVzIC0taWdub3JlZCBcCisgICAgICAgIC0tZXhjbHVkZT0nRG9jdW1lbnRhdGlvbi8qLlswLTldJyBcCisgICAgICAgIC0tZXhjbHVkZS1mcm9tPS5naXQvaWdub3JlIFwKKyAgICAgICAgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5vdGhlciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICQgY2F0IC5naXRpZ25vcmUKKyAgICB2bWxpbnV4KgorICAgICQgbHMgYXJjaC9mb28va2VybmVsL3ZtKgorICAgIGFyY2gvZm9vL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisgICAgJCBlY2hvICchL3ZtbGludXgqJyA+YXJjaC9mb28va2VybmVsLy5naXRpZ25vcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBzZWNvbmQgLmdpdGlnbm9yZSBrZWVwcyBgYXJjaC9mb28va2VybmVsL3ZtbGludXgubGRzLlNgIGZpbGUKK2Zyb20gZ2V0dGluZyBpZ25vcmVkLgorCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtcmVhZC10cmVlWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXJlbW90ZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy1yZW1vdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGMxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy1yZW1vdGUudHh0CkBAIC0wLDAgKzEsNjMgQEAKK2dpdC1scy1yZW1vdGUoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxzLXJlbW90ZSAtIExvb2sgYXQgcmVmZXJlbmNlcyBvdGhlciByZXBvc2l0b3J5IGhhcworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1scy1yZW1vdGUnIFstLWhlYWRzXSBbLS10YWdzXSA8cmVwb3NpdG9yeT4gPHJlZnM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgdGhlIHJlZmVyZW5jZXMgb3RoZXIgcmVwb3NpdG9yeSBoYXMuCisKKworT1BUSU9OUworLS0tLS0tLQorLWh8LS1oZWFkcywgLXR8LS10YWdzOjoKKwlMaW1pdCB0byBvbmx5IHJlZnMvaGVhZHMgYW5kIHJlZnMvdGFncywgcmVzcGVjdGl2ZWx5LgorCVRoZXNlIG9wdGlvbnMgYXJlIF9ub3RfIG11dHVhbGx5IGV4Y2x1c2l2ZTsgd2hlbiBnaXZlbgorCWJvdGgsIHJlZmVyZW5jZXMgc3RvcmVkIGluIHJlZnMvaGVhZHMgYW5kIHJlZnMvdGFncyBhcmUKKwlkaXNwbGF5ZWQuCisKKzxyZXBvc2l0b3J5Pjo6CisJTG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkuICBUaGUgc2hvcnRoYW5kIGRlZmluZWQgaW4KKwkkR0lUX0RJUi9icmFuY2hlcy8gY2FuIGJlIHVzZWQuCisKKzxyZWZzPi4uLjo6CisJV2hlbiB1bnNwZWNpZmllZCwgYWxsIHJlZmVyZW5jZXMsIGFmdGVyIGZpbHRlcmluZyBkb25lCisJd2l0aCAtLWhlYWRzIGFuZCAtLXRhZ3MsIGFyZSBzaG93bi4gIFdoZW4gPHJlZnM+Li4uIGFyZQorCXNwZWNpZmllZCwgb25seSByZWZlcmVuY2VzIG1hdGNoaW5nIHRoZSBnaXZlbiBwYXR0ZXJucworCWFyZSBkaXNwbGF5ZWQuCisKK0VYQU1QTEVTCistLS0tLS0tLQorCisJJCBnaXQgbHMtcmVtb3RlIC0tdGFncyAuLy4KKwlkNjYwMmVjNTE5NGM4N2IwZmM4NzEwM2NhNGQ2NzI1MWM3NmYyMzNhCXJlZnMvdGFncy92MC45OQorCWYyNWEyNjVhMzQyYWVkNjA0MWFiMGNjNDg0MjI0ZDljYTU0YjZmNDEJcmVmcy90YWdzL3YwLjk5LjEKKwk3Y2VjYTI3NWQwNDdjOTBjMGM3ZDVhZmIxM2FiOTdlZmRmNTFiZDZlCXJlZnMvdGFncy92MC45OS4zCisJYzVkYjU0NTZhZTNiMDg3M2ZjNjU5YzE5ZmFmZGRlMjIzMTNjYzQ0MQlyZWZzL3RhZ3MvdjAuOTkuMgorCTA5MTgzODVkYmQ5NjU2Y2FiMGQxZDgxYmE3NDUzZDQ5YmJjMTYyNTAJcmVmcy90YWdzL2p1bmlvLWdwZy1wdWIKKwkkIGdpdCBscy1yZW1vdGUgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQgbWFzdGVyIHB1IHJjCisJNWZlOTc4YTUzODFmMWZiYWQyNmE4MGU2ODJkZGQyYTQwMTk2Njc0MAlyZWZzL2hlYWRzL21hc3RlcgorCWM3ODFhODRiNTIwNGZiMjk0YzljY2M3OWY4YjNiYWNlZWIzMmMwNjEJcmVmcy9oZWFkcy9wdQorCWIxZDA5NmYyOTI2YzRlMzdjOWMwYjZhN2JmMjExOWJlZGFhMjc3Y2IJcmVmcy9oZWFkcy9yYworCSQgZWNobyBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdCA+LmdpdC9icmFuY2hlcy9wdWJsaWMKKwkkIGdpdCBscy1yZW1vdGUgLS10YWdzIHB1YmxpYyB2XCoKKwlkNjYwMmVjNTE5NGM4N2IwZmM4NzEwM2NhNGQ2NzI1MWM3NmYyMzNhCXJlZnMvdGFncy92MC45OQorCWYyNWEyNjVhMzQyYWVkNjA0MWFiMGNjNDg0MjI0ZDljYTU0YjZmNDEJcmVmcy90YWdzL3YwLjk5LjEKKwljNWRiNTQ1NmFlM2IwODczZmM2NTljMTlmYWZkZGUyMjMxM2NjNDQxCXJlZnMvdGFncy92MC45OS4yCisJN2NlY2EyNzVkMDQ3YzkwYzBjN2Q1YWZiMTNhYjk3ZWZkZjUxYmQ2ZQlyZWZzL3RhZ3MvdjAuOTkuMworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODNiYWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dApAQCAtMCwwICsxLDgzIEBACitnaXQtbHMtdHJlZSgxKQorPT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxzLXRyZWUgLSBMaXN0cyB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1scy10cmVlJyBbLWRdIFstcl0gWy10XSBbLXpdCisJICAgIFstLW5hbWUtb25seV0gWy0tbmFtZS1zdGF0dXNdIFstLWZ1bGwtbmFtZV0gWy0tYWJicmV2PVs8bj5dXQorCSAgICA8dHJlZS1pc2g+IFtwYXRocy4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitMaXN0cyB0aGUgY29udGVudHMgb2YgYSBnaXZlbiB0cmVlIG9iamVjdCwgbGlrZSB3aGF0ICIvYmluL2xzIC1hIiBkb2VzCitpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSB1c2FnZSBpcyBzdWJ0bHkgZGlmZmVyZW50LAordGhvdWdoIC0gJ3BhdGhzJyBkZW5vdGUganVzdCBhIGxpc3Qgb2YgcGF0dGVybnMgdG8gbWF0Y2gsIGUuZy4gc28gc3BlY2lmeWluZworZGlyZWN0b3J5IG5hbWUgKHdpdGhvdXQgJy1yJykgd2lsbCBiZWhhdmUgZGlmZmVyZW50bHksIGFuZCBvcmRlciBvZiB0aGUKK2FyZ3VtZW50cyBkb2VzIG5vdCBtYXR0ZXIuCisKK09QVElPTlMKKy0tLS0tLS0KKzx0cmVlLWlzaD46OgorCUlkIG9mIGEgdHJlZS1pc2guCisKKy1kOjoKKwlTaG93IG9ubHkgdGhlIG5hbWVkIHRyZWUgZW50cnkgaXRzZWxmLCBub3QgaXRzIGNoaWxkcmVuLgorCistcjo6CisJUmVjdXJzZSBpbnRvIHN1Yi10cmVlcy4KKworLXQ6OgorCVNob3cgdHJlZSBlbnRyaWVzIGV2ZW4gd2hlbiBnb2luZyB0byByZWN1cnNlIHRoZW0uIEhhcyBubyBlZmZlY3QKKwlpZiAnLXInIHdhcyBub3QgcGFzc2VkLiAnLWQnIGltcGxpZXMgJy10Jy4KKworLXo6OgorCVwwIGxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0LgorCistLW5hbWUtb25seTo6CistLW5hbWUtc3RhdHVzOjoKKwlMaXN0IG9ubHkgZmlsZW5hbWVzIChpbnN0ZWFkIG9mIHRoZSAibG9uZyIgb3V0cHV0KSwgb25lIHBlciBsaW5lLgorCistLWFiYnJldls9PG4+XTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBmdWxsIDQwLWJ5dGUgaGV4YWRlY2ltYWwgb2JqZWN0CisJbGluZXMsIHNob3cgb25seSBoYW5kZnVsIGhleGRpZ2l0cyBwcmVmaXguCisJTm9uIGRlZmF1bHQgbnVtYmVyIG9mIGRpZ2l0cyBjYW4gYmUgc3BlY2lmaWVkIHdpdGggLS1hYmJyZXY9PG4+LgorCistLWZ1bGwtbmFtZTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBwYXRoIG5hbWVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKwlkaXJlY3RvcnksIHNob3cgdGhlIGZ1bGwgcGF0aCBuYW1lcy4KKworcGF0aHM6OgorCVdoZW4gcGF0aHMgYXJlIGdpdmVuLCBzaG93IHRoZW0gKG5vdGUgdGhhdCB0aGlzIGlzbid0IHJlYWxseSByYXcKKwlwYXRobmFtZXMsIGJ1dCByYXRoZXIgYSBsaXN0IG9mIHBhdHRlcm5zIHRvIG1hdGNoKS4gIE90aGVyd2lzZQorCWltcGxpY2l0bHkgdXNlcyB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgdHJlZSBhcyB0aGUgc29sZSBwYXRoIGFyZ3VtZW50LgorCisKK091dHB1dCBGb3JtYXQKKy0tLS0tLS0tLS0tLS0KKyAgICAgICAgPG1vZGU+IFNQIDx0eXBlPiBTUCA8b2JqZWN0PiBUQUIgPGZpbGU+CisKK1doZW4gdGhlIGAtemAgb3B0aW9uIGlzIG5vdCB1c2VkLCBUQUIsIExGLCBhbmQgYmFja3NsYXNoIGNoYXJhY3RlcnMKK2luIHBhdGhuYW1lcyBhcmUgcmVwcmVzZW50ZWQgYXMgYFx0YCwgYFxuYCwgYW5kIGBcXGAsIHJlc3BlY3RpdmVseS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBQZXRyIEJhdWRpcyA8cGFza3lAc3VzZS5jej4KK0NvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gc2NyYXRjaCBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+LAorYW5vdGhlciBtYWpvciByZXdyaXRlIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdAorPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWFpbGluZm8udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWFpbGluZm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMGEwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsaW5mby50eHQKQEAgLTAsMCArMSw3MiBAQAorZ2l0LW1haWxpbmZvKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LW1haWxpbmZvIC0gRXh0cmFjdHMgcGF0Y2ggZnJvbSBhIHNpbmdsZSBlLW1haWwgbWVzc2FnZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1tYWlsaW5mbycgWy1rXSBbLXUgfCAtLWVuY29kaW5nPTxlbmNvZGluZz5dIDxtc2c+IDxwYXRjaD4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRpbmcgYSBzaW5nbGUgZS1tYWlsIG1lc3NhZ2UgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsIGFuZAord3JpdGVzIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgaW4gPG1zZz4gZmlsZSwgYW5kIHRoZSBwYXRjaGVzIGluCis8cGF0Y2g+IGZpbGUuICBUaGUgYXV0aG9yIG5hbWUsIGUtbWFpbCBhbmQgZS1tYWlsIHN1YmplY3QgYXJlCit3cml0dGVuIG91dCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHRvIGJlIHVzZWQgYnkgZ2l0LWFwcGx5cGF0Y2gKK3RvIGNyZWF0ZSBhIGNvbW1pdC4gIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcworY29tbWFuZCBkaXJlY3RseS4KKworCitPUFRJT05TCistLS0tLS0tCistazo6CisJVXN1YWxseSB0aGUgcHJvZ3JhbSAnY2xlYW5zIHVwJyB0aGUgU3ViamVjdDogaGVhZGVyIGxpbmUKKwl0byBleHRyYWN0IHRoZSB0aXRsZSBsaW5lIGZvciB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLAorCWFtb25nIHdoaWNoICgxKSByZW1vdmUgJ1JlOicgb3IgJ3JlOicsICgyKSBsZWFkaW5nCisJd2hpdGVzcGFjZXMsICgzKSAnWycgdXAgdG8gJ10nLCB0eXBpY2FsbHkgJ1tQQVRDSF0nLCBhbmQKKwl0aGVuIHByZXBlbmRzICJbUEFUQ0hdICIuICBUaGlzIGZsYWcgZm9yYmlkcyB0aGlzCisJbXVuZ2luZywgYW5kIGlzIG1vc3QgdXNlZnVsIHdoZW4gdXNlZCB0byByZWFkIGJhY2sgJ2dpdAorCWZvcm1hdC1wYXRjaCAtLW1ib3gnIG91dHB1dC4KKworLXU6OgorCUJ5IGRlZmF1bHQsIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UsIGF1dGhvciBuYW1lIGFuZAorCWF1dGhvciBlbWFpbCBhcmUgdGFrZW4gZnJvbSB0aGUgZS1tYWlsIHdpdGhvdXQgYW55CisJY2hhcnNldCBjb252ZXJzaW9uLCBhZnRlciBtaW5pbWFsbHkgZGVjb2RpbmcgTUlNRQorCXRyYW5zZmVyIGVuY29kaW5nLiAgVGhpcyBmbGFnIGNhdXNlcyB0aGUgcmVzdWx0aW5nCisJY29tbWl0IHRvIGJlIGVuY29kZWQgaW4gdGhlIGVuY29kaW5nIHNwZWNpZmllZCBieQorCWkxOG4uY29tbWl0ZW5jb2RpbmcgY29uZmlndXJhdGlvbiAoZGVmYXVsdHMgdG8gdXRmLTgpIGJ5CisJdHJhbnNsaXRlcmF0aW5nIHRoZW0uIAorCU5vdGUgdGhhdCB0aGUgcGF0Y2ggaXMgYWx3YXlzIHVzZWQgYXMgaXMgd2l0aG91dCBjaGFyc2V0CisJY29udmVyc2lvbiwgZXZlbiB3aXRoIHRoaXMgZmxhZy4KKworLS1lbmNvZGluZz08ZW5jb2Rpbmc+OjoKKwlTaW1pbGFyIHRvIC11IGJ1dCBpZiB0aGUgbG9jYWwgY29udmVudGlvbiBpcyBkaWZmZXJlbnQKKwlmcm9tIHdoYXQgaXMgc3BlY2lmaWVkIGJ5IGkxOG4uY29tbWl0ZW5jb2RpbmcsIHRoaXMgZmxhZworCWNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGl0LgorCis8bXNnPjo6CisJVGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBleHRyYWN0ZWQgZnJvbSBlLW1haWwsIHVzdWFsbHkKKwlleGNlcHQgdGhlIHRpdGxlIGxpbmUgd2hpY2ggY29tZXMgZnJvbSBlLW1haWwgU3ViamVjdC4KKworPHBhdGNoPjo6CisJVGhlIHBhdGNoIGV4dHJhY3RlZCBmcm9tIGUtbWFpbC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWFpbHNwbGl0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1haWxzcGxpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5ZTM2YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1haWxzcGxpdC50eHQKQEAgLTAsMCArMSw1MiBAQAorZ2l0LW1haWxzcGxpdCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWFpbHNwbGl0IC0gVG90YWxseSBicmFpbmRhbWFnZWQgbWJveCBzcGxpdHRlciBwcm9ncmFtCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1tYWlsc3BsaXQnIFstYl0gWy1mPG5uPl0gWy1kPHByZWM+XSAtbzxkaXJlY3Rvcnk+IFstLV0gWzxtYm94Pi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTcGxpdHMgYSBtYm94IGZpbGUgaW50byBhIGxpc3Qgb2YgZmlsZXM6ICIwMDAxIiAiMDAwMiIgLi4gIGluIHRoZSBzcGVjaWZpZWQKK2RpcmVjdG9yeSBzbyB5b3UgY2FuIHByb2Nlc3MgdGhlbSBmdXJ0aGVyIGZyb20gdGhlcmUuCisKK09QVElPTlMKKy0tLS0tLS0KKzxtYm94Pjo6CisJTWJveCBmaWxlIHRvIHNwbGl0LiAgSWYgbm90IGdpdmVuLCB0aGUgbWJveCBpcyByZWFkIGZyb20KKwl0aGUgc3RhbmRhcmQgaW5wdXQuCisKKzxkaXJlY3Rvcnk+OjoKKwlEaXJlY3RvcnkgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGluZGl2aWR1YWwgbWVzc2FnZXMuCisKKy1iOjoKKwlJZiBhbnkgZmlsZSBkb2Vzbid0IGJlZ2luIHdpdGggYSBGcm9tIGxpbmUsIGFzc3VtZSBpdCBpcyBhCisJc2luZ2xlIG1haWwgbWVzc2FnZSBpbnN0ZWFkIG9mIHNpZ25hbGxpbmcgZXJyb3IuCisKKy1kPHByZWM+OjoKKwlJbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDQgZGlnaXRzIHdpdGggbGVhZGluZyB6ZXJvcywKKwlkaWZmZXJlbnQgcHJlY2lzaW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIHRoZSBnZW5lcmF0ZWQKKwlmaWxlbmFtZXMuCisKKy1mPG5uPjo6CisJU2tpcCB0aGUgZmlyc3QgPG5uPiBudW1iZXJzLCBmb3IgZXhhbXBsZSBpZiAtZjMgaXMgc3BlY2lmaWVkLAorCXN0YXJ0IHRoZSBudW1iZXJpbmcgd2l0aCAwMDA0LgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CithbmQgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtYmFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1iYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDk5YmUyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtYmFzZS50eHQKQEAgLTAsMCArMSw0MyBAQAorZ2l0LW1lcmdlLWJhc2UoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS1iYXNlIC0gRmluZHMgYXMgZ29vZCBhIGNvbW1vbiBhbmNlc3RvciBhcyBwb3NzaWJsZSBmb3IgYSBtZXJnZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1tZXJnZS1iYXNlJyBbLS1hbGxdIDxjb21taXQ+IDxjb21taXQ+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCisiZ2l0LW1lcmdlLWJhc2UiIGZpbmRzIGFzIGdvb2QgYSBjb21tb24gYW5jZXN0b3IgYXMgcG9zc2libGUgYmV0d2VlbgordGhlIHR3byBjb21taXRzLiBUaGF0IGlzLCBnaXZlbiB0d28gY29tbWl0cyBBIGFuZCBCICdnaXQtbWVyZ2UtYmFzZSBBCitCJyB3aWxsIG91dHB1dCBhIGNvbW1pdCB3aGljaCBpcyByZWFjaGFibGUgZnJvbSBib3RoIEEgYW5kIEIgdGhyb3VnaAordGhlIHBhcmVudCByZWxhdGlvbnNoaXAuCisKK0dpdmVuIGEgc2VsZWN0aW9uIG9mIGVxdWFsbHkgZ29vZCBjb21tb24gYW5jZXN0b3JzIGl0IHNob3VsZCBub3QgYmUKK3JlbGllZCBvbiB0byBkZWNpZGUgaW4gYW55IHBhcnRpY3VsYXIgd2F5LgorCitUaGUgImdpdC1tZXJnZS1iYXNlIiBhbGdvcml0aG0gaXMgc3RpbGwgaW4gZmx1eCAtIHVzZSB0aGUgc291cmNlLi4uCisKK09QVElPTlMKKy0tLS0tLS0KKy0tYWxsOjoKKwlPdXRwdXQgYWxsIGNvbW1vbiBhbmNlc3RvcnMgZm9yIHRoZSB0d28gY29tbWl0cyBpbnN0ZWFkIG9mCisJanVzdCBvbmUuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1pbmRleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMDYwMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWluZGV4LnR4dApAQCAtMCwwICsxLDg4IEBACitnaXQtbWVyZ2UtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWVyZ2UtaW5kZXggLSBSdW5zIGEgbWVyZ2UgZm9yIGZpbGVzIG5lZWRpbmcgbWVyZ2luZworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1tZXJnZS1pbmRleCcgWy1vXSBbLXFdIDxtZXJnZS1wcm9ncmFtPiAoLWEgfCBcLS0gfCA8ZmlsZT5cKikKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGxvb2tzIHVwIHRoZSA8ZmlsZT4ocykgaW4gdGhlIGluZGV4IGFuZCwgaWYgdGhlcmUgYXJlIGFueSBtZXJnZQorZW50cmllcywgcGFzc2VzIHRoZSBTSEExIGhhc2ggZm9yIHRob3NlIGZpbGVzIGFzIGFyZ3VtZW50cyAxLCAyLCAzIChlbXB0eQorYXJndW1lbnQgaWYgbm8gZmlsZSksIGFuZCA8ZmlsZT4gYXMgYXJndW1lbnQgNC4gIEZpbGUgbW9kZXMgZm9yIHRoZSB0aHJlZQorZmlsZXMgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgNSwgNiBhbmQgNy4KKworT1BUSU9OUworLS0tLS0tLQorXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCistYTo6CisJUnVuIG1lcmdlIGFnYWluc3QgYWxsIGZpbGVzIGluIHRoZSBpbmRleCB0aGF0IG5lZWQgbWVyZ2luZy4KKworLW86OgorCUluc3RlYWQgb2Ygc3RvcHBpbmcgYXQgdGhlIGZpcnN0IGZhaWxlZCBtZXJnZSwgZG8gYWxsIG9mIHRoZW0KKwlpbiBvbmUgc2hvdCAtIGNvbnRpbnVlIHdpdGggbWVyZ2luZyBldmVuIHdoZW4gcHJldmlvdXMgbWVyZ2VzCisJcmV0dXJuZWQgZXJyb3JzLCBhbmQgb25seSByZXR1cm4gdGhlIGVycm9yIGNvZGUgYWZ0ZXIgYWxsIHRoZQorCW1lcmdlcyBhcmUgb3Zlci4KKworLXE6OgorCURvIG5vdCBjb21wbGFpbiBhYm91dCBmYWlsZWQgbWVyZ2UgcHJvZ3JhbSAodGhlIG1lcmdlIHByb2dyYW0KKwlmYWlsdXJlIHVzdWFsbHkgaW5kaWNhdGVzIGNvbmZsaWN0cyBkdXJpbmcgbWVyZ2UpLiBUaGlzIGlzIGZvcgorCXBvcmNlbGFpbnMgd2hpY2ggbWlnaHQgd2FudCB0byBlbWl0IGN1c3RvbSBtZXNzYWdlcy4KKworSWYgImdpdC1tZXJnZS1pbmRleCIgaXMgY2FsbGVkIHdpdGggbXVsdGlwbGUgPGZpbGU+cyAob3IgLWEpIHRoZW4gaXQKK3Byb2Nlc3NlcyB0aGVtIGluIHR1cm4gb25seSBzdG9wcGluZyBpZiBtZXJnZSByZXR1cm5zIGEgbm9uLXplcm8gZXhpdAorY29kZS4KKworVHlwaWNhbGx5IHRoaXMgaXMgcnVuIHdpdGggdGhlIGEgc2NyaXB0IGNhbGxpbmcgdGhlIG1lcmdlIGNvbW1hbmQgZnJvbQordGhlIFJDUyBwYWNrYWdlLgorCitBIHNhbXBsZSBzY3JpcHQgY2FsbGVkICJnaXQtbWVyZ2Utb25lLWZpbGUiIGlzIGluY2x1ZGVkIGluIHRoZQorZGlzdHJpYnV0aW9uLgorCitBTEVSVCBBTEVSVCBBTEVSVCEgVGhlIGdpdCAibWVyZ2Ugb2JqZWN0IG9yZGVyIiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKK1JDUyAibWVyZ2UiIHByb2dyYW0gbWVyZ2Ugb2JqZWN0IG9yZGVyLiBJbiB0aGUgYWJvdmUgb3JkZXJpbmcsIHRoZQorb3JpZ2luYWwgaXMgZmlyc3QuIEJ1dCB0aGUgYXJndW1lbnQgb3JkZXIgdG8gdGhlIDMtd2F5IG1lcmdlIHByb2dyYW0KKyJtZXJnZSIgaXMgdG8gaGF2ZSB0aGUgb3JpZ2luYWwgaW4gdGhlIG1pZGRsZS4gRG9uJ3QgYXNrIG1lIHdoeS4KKworRXhhbXBsZXM6CisKKyAgdG9ydmFsZHNAcHBjOTcwOn4vbWVyZ2UtdGVzdD4gZ2l0LW1lcmdlLWluZGV4IGNhdCBNTQorICBUaGlzIGlzIE1NIGZyb20gdGhlIG9yaWdpbmFsIHRyZWUuCQkJIyBvcmlnaW5hbAorICBUaGlzIGlzIG1vZGlmaWVkIE1NIGluIHRoZSBicmFuY2ggQS4JCQkjIG1lcmdlMQorICBUaGlzIGlzIG1vZGlmaWVkIE1NIGluIHRoZSBicmFuY2ggQi4JCQkjIG1lcmdlMgorICBUaGlzIGlzIG1vZGlmaWVkIE1NIGluIHRoZSBicmFuY2ggQi4JCQkjIGN1cnJlbnQgY29udGVudHMKKworb3IgCisKKyAgdG9ydmFsZHNAcHBjOTcwOn4vbWVyZ2UtdGVzdD4gZ2l0LW1lcmdlLWluZGV4IGNhdCBBQSBNTQorICBjYXQ6IDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICBUaGlzIGlzIGFkZGVkIEFBIGluIHRoZSBicmFuY2ggQS4KKyAgVGhpcyBpcyBhZGRlZCBBQSBpbiB0aGUgYnJhbmNoIEIuCisgIFRoaXMgaXMgYWRkZWQgQUEgaW4gdGhlIGJyYW5jaCBCLgorICBmYXRhbDogbWVyZ2UgcHJvZ3JhbSBmYWlsZWQKKword2hlcmUgdGhlIGxhdHRlciBleGFtcGxlIHNob3dzIGhvdyAiZ2l0LW1lcmdlLWluZGV4IiB3aWxsIHN0b3AgdHJ5aW5nIHRvCittZXJnZSBvbmNlIGFueXRoaW5nIGhhcyByZXR1cm5lZCBhbiBlcnJvciAoaS5lLiwgImNhdCIgcmV0dXJuZWQgYW4gZXJyb3IKK2ZvciB0aGUgQUEgZmlsZSwgYmVjYXVzZSBpdCBkaWRuJ3QgZXhpc3QgaW4gdGhlIG9yaWdpbmFsLCBhbmQgdGh1cworImdpdC1tZXJnZS1pbmRleCIgZGlkbid0IGV2ZW4gdHJ5IHRvIG1lcmdlIHRoZSBNTSB0aGluZykuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK09uZS1zaG90IG1lcmdlIGJ5IFBldHIgQmF1ZGlzIDxwYXNreUB1Y3cuY3o+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2Utb25lLWZpbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2Utb25lLWZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWFkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1vbmUtZmlsZS50eHQKQEAgLTAsMCArMSwzMCBAQAorZ2l0LW1lcmdlLW9uZS1maWxlKDEpCis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LW1lcmdlLW9uZS1maWxlIC0gVGhlIHN0YW5kYXJkIGhlbHBlciBwcm9ncmFtIHRvIHVzZSB3aXRoICJnaXQtbWVyZ2UtaW5kZXgiCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1lcmdlLW9uZS1maWxlJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgaXMgdGhlIHN0YW5kYXJkIGhlbHBlciBwcm9ncmFtIHRvIHVzZSB3aXRoICJnaXQtbWVyZ2UtaW5kZXgiCit0byByZXNvbHZlIGEgbWVyZ2UgYWZ0ZXIgdGhlIHRyaXZpYWwgbWVyZ2UgZG9uZSB3aXRoICJnaXQtcmVhZC10cmVlIC1tIi4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiwKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gYW5kIFBldHIgQmF1ZGlzIDxwYXNreUBzdXNlLmN6Pi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmI0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS10cmVlLnR4dApAQCAtMCwwICsxLDM3IEBACitnaXQtbWVyZ2UtdHJlZSgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LW1lcmdlLXRyZWUgLSBTaG93IHRocmVlLXdheSBtZXJnZSB3aXRob3V0IHRvdWNoaW5nIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1lcmdlLXRyZWUnIDxiYXNlLXRyZWU+IDxicmFuY2gxPiA8YnJhbmNoMj4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyB0aHJlZSB0cmVlaXNoLCBhbmQgb3V0cHV0IHRyaXZpYWwgbWVyZ2UgcmVzdWx0cyBhbmQKK2NvbmZsaWN0aW5nIHN0YWdlcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgVGhpcyBpcyBzaW1pbGFyIHRvCit3aGF0IHRocmVlLXdheSByZWFkLXRyZWUgLW0gZG9lcywgYnV0IGluc3RlYWQgb2Ygc3RvcmluZyB0aGUKK3Jlc3VsdHMgaW4gdGhlIGluZGV4LCB0aGUgY29tbWFuZCBvdXRwdXRzIHRoZSBlbnRyaWVzIHRvIHRoZQorc3RhbmRhcmQgb3V0cHV0LgorCitUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgaGlnaGVyIGxldmVsIHNjcmlwdHMgdG8gY29tcHV0ZQorbWVyZ2UgcmVzdWx0cyBvdXRzaWRlIGluZGV4LCBhbmQgc3R1ZmYgdGhlIHJlc3VsdHMgYmFjayBpbnRvIHRoZQoraW5kZXguICBGb3IgdGhpcyByZWFzb24sIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCBvbWl0cworZW50cmllcyB0aGF0IG1hdGNoIDxicmFuY2gxPiB0cmVlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTc5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS50eHQKQEAgLTAsMCArMSwxNTggQEAKK2dpdC1tZXJnZSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZSAtIEdyYW5kIFVuaWZpZWQgTWVyZ2UgRHJpdmVyCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1lcmdlJyBbLW5dIFstLW5vLWNvbW1pdF0gWy1zIDxzdHJhdGVneT5dLi4uIDxtc2c+IDxoZWFkPiA8cmVtb3RlPiA8cmVtb3RlPi4uLgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBpcyB0aGUgdG9wLWxldmVsIHVzZXIgaW50ZXJmYWNlIHRvIHRoZSBtZXJnZSBtYWNoaW5lcnkKK3doaWNoIGRyaXZlcyBtdWx0aXBsZSBtZXJnZSBzdHJhdGVneSBzY3JpcHRzLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6Om1lcmdlLW9wdGlvbnMudHh0W10KKworPG1zZz46OgorCVRoZSBjb21taXQgbWVzc2FnZSB0byBiZSB1c2VkIGZvciB0aGUgbWVyZ2UgY29tbWl0IChpbiBjYXNlCisJaXQgaXMgY3JlYXRlZCkuIFRoZSBgZ2l0LWZtdC1tZXJnZS1tc2dgIHNjcmlwdCBjYW4gYmUgdXNlZAorCXRvIGdpdmUgYSBnb29kIGRlZmF1bHQgZm9yIGF1dG9tYXRlZCBgZ2l0LW1lcmdlYCBpbnZvY2F0aW9ucy4KKworPGhlYWQ+OjoKKwlvdXIgYnJhbmNoIGhlYWQgY29tbWl0LgorCis8cmVtb3RlPjo6CisJb3RoZXIgYnJhbmNoIGhlYWQgbWVyZ2VkIGludG8gb3VyIGJyYW5jaC4gIFlvdSBuZWVkIGF0CisJbGVhc3Qgb25lIDxyZW1vdGU+LiAgU3BlY2lmeWluZyBtb3JlIHRoYW4gb25lIDxyZW1vdGU+CisJb2J2aW91c2x5IG1lYW5zIHlvdSBhcmUgdHJ5aW5nIGFuIE9jdG9wdXMuCisKK2luY2x1ZGU6Om1lcmdlLXN0cmF0ZWdpZXMudHh0W10KKworCitJZiB5b3UgdHJpZWQgYSBtZXJnZSB3aGljaCByZXN1bHRlZCBpbiBhIGNvbXBsZXggY29uZmxpY3RzIGFuZAord291bGQgd2FudCB0byBzdGFydCBvdmVyLCB5b3UgY2FuIHJlY292ZXIgd2l0aAorZ2l0bGluazpnaXQtcmVzZXRbMV0uCisKKworSE9XIE1FUkdFIFdPUktTCistLS0tLS0tLS0tLS0tLS0KKworQSBtZXJnZSBpcyBhbHdheXMgYmV0d2VlbiB0aGUgY3VycmVudCBgSEVBRGAgYW5kIG9uZSBvciBtb3JlCityZW1vdGUgYnJhbmNoIGhlYWRzLCBhbmQgdGhlIGluZGV4IGZpbGUgbXVzdCBleGFjdGx5IG1hdGNoIHRoZQordHJlZSBvZiBgSEVBRGAgY29tbWl0IChpLmUuIHRoZSBjb250ZW50cyBvZiB0aGUgbGFzdCBjb21taXQpIHdoZW4KK2l0IGhhcHBlbnMuICBJbiBvdGhlciB3b3JkcywgYGdpdC1kaWZmIC0tY2FjaGVkIEhFQURgIG11c3QKK3JlcG9ydCBubyBjaGFuZ2VzLgorCitbTk9URV0KK1RoaXMgaXMgYSBiaXQgb2YgbGllLiAgSW4gY2VydGFpbiBzcGVjaWFsIGNhc2VzLCB5b3VyIGluZGV4IGFyZQorYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdHJlZSBvZiBgSEVBRGAgY29tbWl0LiAgVGhlIG1vc3QKK25vdGFibGUgY2FzZSBpcyB3aGVuIHlvdXIgYEhFQURgIGNvbW1pdCBpcyBhbHJlYWR5IGFoZWFkIG9mIHdoYXQKK2lzIGJlaW5nIG1lcmdlZCwgaW4gd2hpY2ggY2FzZSB5b3VyIGluZGV4IGNhbiBoYXZlIGFyYml0cmFyeQorZGlmZmVyZW5jZSBmcm9tIHlvdXIgYEhFQURgIGNvbW1pdC4gIE90aGVyd2lzZSwgeW91ciBpbmRleCBlbnRyaWVzCithcmUgYWxsb3dlZCBoYXZlIGRpZmZlcmVuY2VzIGZyb20geW91ciBgSEVBRGAgY29tbWl0IHRoYXQgbWF0Y2gKK3RoZSByZXN1bHQgb2YgdHJpdmlhbCBtZXJnZSAoZS5nLiB5b3UgcmVjZWl2ZWQgdGhlIHNhbWUgcGF0Y2gKK2Zyb20gZXh0ZXJuYWwgc291cmNlIHRvIHByb2R1Y2UgdGhlIHNhbWUgcmVzdWx0IGFzIHdoYXQgeW91IGFyZQorbWVyZ2luZykuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRoIGRpZCBub3QgZXhpc3QgaW4gdGhlIGNvbW1vbgorYW5jZXN0b3IgYW5kIHlvdXIgaGVhZCBjb21taXQgYnV0IGV4aXN0cyBpbiB0aGUgdHJlZSB5b3UgYXJlCittZXJnaW5nIGludG8geW91ciByZXBvc2l0b3J5LCBhbmQgaWYgeW91IGFscmVhZHkgaGFwcGVuIHRvIGhhdmUKK3RoYXQgcGF0aCBleGFjdGx5IGluIHlvdXIgaW5kZXgsIHRoZSBtZXJnZSBkb2VzIG5vdCBoYXZlIHRvCitmYWlsLgorCitPdGhlcndpc2UsIG1lcmdlIHdpbGwgcmVmdXNlIHRvIGRvIGFueSBoYXJtIHRvIHlvdXIgcmVwb3NpdG9yeQorKHRoYXQgaXMsIGl0IG1heSBmZXRjaCB0aGUgb2JqZWN0cyBmcm9tIHJlbW90ZSwgYW5kIGl0IG1heSBldmVuCit1cGRhdGUgdGhlIGxvY2FsIGJyYW5jaCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHJlbW90ZSBicmFuY2gKK3dpdGggYGdpdCBwdWxsIHJlbW90ZSByYnJhbmNoOmxicmFuY2hgLCBidXQgeW91ciB3b3JraW5nIHRyZWUsCitgLmdpdC9IRUFEYCBwb2ludGVyIGFuZCBpbmRleCBmaWxlIGFyZSBsZWZ0IGludGFjdCkuCisKK1lvdSBtYXkgaGF2ZSBsb2NhbCBtb2RpZmljYXRpb25zIGluIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMuICBJbgorb3RoZXIgd29yZHMsIGBnaXQtZGlmZmAgaXMgYWxsb3dlZCB0byByZXBvcnQgY2hhbmdlcy4KK0hvd2V2ZXIsIHRoZSBtZXJnZSB1c2VzIHlvdXIgd29ya2luZyB0cmVlIGFzIHRoZSB3b3JraW5nIGFyZWEsCithbmQgaW4gb3JkZXIgdG8gcHJldmVudCB0aGUgbWVyZ2Ugb3BlcmF0aW9uIGZyb20gbG9zaW5nIHN1Y2gKK2NoYW5nZXMsIGl0IG1ha2VzIHN1cmUgdGhhdCB0aGV5IGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUKK21lcmdlLiBUaG9zZSBjb21wbGV4IHRhYmxlcyBpbiByZWFkLXRyZWUgZG9jdW1lbnRhdGlvbiBkZWZpbmUKK3doYXQgaXQgbWVhbnMgZm9yIGEgcGF0aCB0byAiaW50ZXJmZXJlIHdpdGggdGhlIG1lcmdlIi4gIEFuZCBpZgoreW91ciBsb2NhbCBtb2RpZmljYXRpb25zIGludGVyZmVyZSB3aXRoIHRoZSBtZXJnZSwgYWdhaW4sIGl0CitzdG9wcyBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcuCisKK1NvIGluIHRoZSBhYm92ZSB0d28gImZhaWxlZCBtZXJnZSIgY2FzZSwgeW91IGRvIG5vdCBoYXZlIHRvCit3b3JyeSBhYm91dCBsb3NzYWdlIG9mIGRhdGEgLS0tIHlvdSBzaW1wbHkgd2VyZSBub3QgcmVhZHkgdG8gZG8KK2EgbWVyZ2UsIHNvIG5vIG1lcmdlIGhhcHBlbmVkIGF0IGFsbC4gIFlvdSBtYXkgd2FudCB0byBmaW5pc2gKK3doYXRldmVyIHlvdSB3ZXJlIGluIHRoZSBtaWRkbGUgb2YgZG9pbmcsIGFuZCByZXRyeSB0aGUgc2FtZQorcHVsbCBhZnRlciB5b3UgYXJlIGRvbmUgYW5kIHJlYWR5LgorCitXaGVuIHRoaW5ncyBjbGVhbmx5IG1lcmdlLCB0aGVzZSB0aGluZ3MgaGFwcGVuOgorCisxLiB0aGUgcmVzdWx0cyBhcmUgdXBkYXRlZCBib3RoIGluIHRoZSBpbmRleCBmaWxlIGFuZCBpbiB5b3VyCisgICB3b3JraW5nIHRyZWUsCisyLiBpbmRleCBmaWxlIGlzIHdyaXR0ZW4gb3V0IGFzIGEgdHJlZSwKKzMuIHRoZSB0cmVlIGdldHMgY29tbWl0dGVkLCBhbmQgCis0LiB0aGUgYEhFQURgIHBvaW50ZXIgZ2V0cyBhZHZhbmNlZC4KKworQmVjYXVzZSBvZiAyLiwgd2UgcmVxdWlyZSB0aGF0IHRoZSBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgaW5kZXgKK2ZpbGUgdG8gbWF0Y2ggZXhhY3RseSB0aGUgY3VycmVudCBgSEVBRGAgY29tbWl0OyBvdGhlcndpc2Ugd2UKK3dpbGwgd3JpdGUgb3V0IHlvdXIgbG9jYWwgY2hhbmdlcyBhbHJlYWR5IHJlZ2lzdGVyZWQgaW4geW91cgoraW5kZXggZmlsZSBhbG9uZyB3aXRoIHRoZSBtZXJnZSByZXN1bHQsIHdoaWNoIGlzIG5vdCBnb29kLgorQmVjYXVzZSAxLiBpbnZvbHZlcyBvbmx5IHRoZSBwYXRocyBkaWZmZXJlbnQgYmV0d2VlbiB5b3VyCiticmFuY2ggYW5kIHRoZSByZW1vdGUgYnJhbmNoIHlvdSBhcmUgcHVsbGluZyBmcm9tIGR1cmluZyB0aGUKK21lcmdlICh3aGljaCBpcyB0eXBpY2FsbHkgYSBmcmFjdGlvbiBvZiB0aGUgd2hvbGUgdHJlZSksIHlvdSBjYW4KK2hhdmUgbG9jYWwgbW9kaWZpY2F0aW9ucyBpbiB5b3VyIHdvcmtpbmcgdHJlZSBhcyBsb25nIGFzIHRoZXkgZG8KK25vdCBvdmVybGFwIHdpdGggd2hhdCB0aGUgbWVyZ2UgdXBkYXRlcy4KKworV2hlbiB0aGVyZSBhcmUgY29uZmxpY3RzLCB0aGVzZSB0aGluZ3MgaGFwcGVuOgorCisxLiBgSEVBRGAgc3RheXMgdGhlIHNhbWUuCisKKzIuIENsZWFubHkgbWVyZ2VkIHBhdGhzIGFyZSB1cGRhdGVkIGJvdGggaW4gdGhlIGluZGV4IGZpbGUgYW5kCisgICBpbiB5b3VyIHdvcmtpbmcgdHJlZS4KKworMy4gRm9yIGNvbmZsaWN0aW5nIHBhdGhzLCB0aGUgaW5kZXggZmlsZSByZWNvcmRzIHVwIHRvIHRocmVlCisgICB2ZXJzaW9uczsgc3RhZ2UxIHN0b3JlcyB0aGUgdmVyc2lvbiBmcm9tIHRoZSBjb21tb24gYW5jZXN0b3IsCisgICBzdGFnZTIgZnJvbSBgSEVBRGAsIGFuZCBzdGFnZTMgZnJvbSB0aGUgcmVtb3RlIGJyYW5jaCAoeW91CisgICBjYW4gaW5zcGVjdCB0aGUgc3RhZ2VzIHdpdGggYGdpdC1scy1maWxlcyAtdWApLiAgVGhlIHdvcmtpbmcKKyAgIHRyZWUgZmlsZXMgaGF2ZSB0aGUgcmVzdWx0IG9mICJtZXJnZSIgcHJvZ3JhbTsgaS5lLiAzLXdheQorICAgbWVyZ2UgcmVzdWx0IHdpdGggZmFtaWxpYXIgY29uZmxpY3QgbWFya2VycyBgPDw8ID09PSA+Pj5gLgorCis0LiBObyBvdGhlciBjaGFuZ2VzIGFyZSBkb25lLiAgSW4gcGFydGljdWxhciwgdGhlIGxvY2FsCisgICBtb2RpZmljYXRpb25zIHlvdSBoYWQgYmVmb3JlIHlvdSBzdGFydGVkIG1lcmdlIHdpbGwgc3RheSB0aGUKKyAgIHNhbWUgYW5kIHRoZSBpbmRleCBlbnRyaWVzIGZvciB0aGVtIHN0YXkgYXMgdGhleSB3ZXJlLAorICAgaS5lLiBtYXRjaGluZyBgSEVBRGAuCisKK0FmdGVyIHNlZWluZyBhIGNvbmZsaWN0LCB5b3UgY2FuIGRvIHR3byB0aGluZ3M6CisKKyAqIERlY2lkZSBub3QgdG8gbWVyZ2UuICBUaGUgb25seSBjbGVhbi11cCB5b3UgbmVlZCBhcmUgdG8gcmVzZXQKKyAgIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBgSEVBRGAgY29tbWl0IHRvIHJldmVyc2UgMi4gYW5kIHRvIGNsZWFuCisgICB1cCB3b3JraW5nIHRyZWUgY2hhbmdlcyBtYWRlIGJ5IDIuIGFuZCAzLjsgYGdpdC1yZXNldGAgY2FuCisgICBiZSB1c2VkIGZvciB0aGlzLgorCisgKiBSZXNvbHZlIHRoZSBjb25mbGljdHMuICBgZ2l0LWRpZmZgIHdvdWxkIHJlcG9ydCBvbmx5IHRoZQorICAgY29uZmxpY3RpbmcgcGF0aHMgYmVjYXVzZSBvZiB0aGUgYWJvdmUgMi4gYW5kIDMuLiAgRWRpdCB0aGUKKyAgIHdvcmtpbmcgdHJlZSBmaWxlcyBpbnRvIGEgZGVzaXJhYmxlIHNoYXBlLCBgZ2l0LXVwZGF0ZS1pbmRleGAKKyAgIHRoZW0sIHRvIG1ha2UgdGhlIGluZGV4IGZpbGUgY29udGFpbiB3aGF0IHRoZSBtZXJnZSByZXN1bHQKKyAgIHNob3VsZCBiZSwgYW5kIHJ1biBgZ2l0LWNvbW1pdGAgdG8gY29tbWl0IHRoZSByZXN1bHQuCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1mbXQtbWVyZ2UtbXNnWzFdLCBnaXRsaW5rOmdpdC1wdWxsWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1rdGFnLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdGFnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODYwYTNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWt0YWcudHh0CkBAIC0wLDAgKzEsNDcgQEAKK2dpdC1ta3RhZygxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ta3RhZyAtIENyZWF0ZXMgYSB0YWcgb2JqZWN0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1rdGFnJyA8IHNpZ25hdHVyZV9maWxlCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZHMgYSB0YWcgY29udGVudHMgb24gc3RhbmRhcmQgaW5wdXQgYW5kIGNyZWF0ZXMgYSB0YWcgb2JqZWN0Cit0aGF0IGNhbiBhbHNvIGJlIHVzZWQgdG8gc2lnbiBvdGhlciBvYmplY3RzLgorCitUaGUgb3V0cHV0IGlzIHRoZSBuZXcgdGFnJ3MgPG9iamVjdD4gaWRlbnRpZmllci4KKworVGFnIEZvcm1hdAorLS0tLS0tLS0tLQorQSB0YWcgc2lnbmF0dXJlIGZpbGUgaGFzIGEgdmVyeSBzaW1wbGUgZml4ZWQgZm9ybWF0OiB0aHJlZSBsaW5lcyBvZgorCisgIG9iamVjdCA8c2hhMT4KKyAgdHlwZSA8dHlwZW5hbWU+CisgIHRhZyA8dGFnbmFtZT4KKworZm9sbG93ZWQgYnkgc29tZSAnb3B0aW9uYWwnIGZyZWUtZm9ybSBzaWduYXR1cmUgdGhhdCBnaXQgaXRzZWxmCitkb2Vzbid0IGNhcmUgYWJvdXQsIGJ1dCB0aGF0IGNhbiBiZSB2ZXJpZmllZCB3aXRoIGdwZyBvciBzaW1pbGFyLgorCitUaGUgc2l6ZSBvZiB0aGUgZnVsbCBvYmplY3QgaXMgYXJ0aWZpY2lhbGx5IGxpbWl0ZWQgdG8gOGtCLiAgKEp1c3QKK2JlY2F1c2UgSSdtIGEgbGF6eSBiYXN0YXJkLCBhbmQgaWYgeW91IGNhbid0IGZpdCBhIHNpZ25hdHVyZSBpbiB0aGF0CitzaXplLCB5b3UncmUgZG9pbmcgc29tZXRoaW5nIHdyb25nKQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ta3RyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWt0cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjllZTYwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWt0cmVlLnR4dApAQCAtMCwwICsxLDM1IEBACitnaXQtbWt0cmVlKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ta3RyZWUgLSBCdWlsZCBhIHRyZWUtb2JqZWN0IGZyb20gbHMtdHJlZSBmb3JtYXR0ZWQgdGV4dAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ta3RyZWUnIFstel0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBzdGFuZGFyZCBpbnB1dCBpbiBub24tcmVjdXJzaXZlIGBscy10cmVlYCBvdXRwdXQgZm9ybWF0LAorYW5kIGNyZWF0ZXMgYSB0cmVlIG9iamVjdC4gIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgdHJlZSBvYmplY3QKK2J1aWx0IGlzIHdyaXR0ZW4gdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworT1BUSU9OUworLS0tLS0tLQorLXo6OgorCVJlYWQgdGhlIE5VTC10ZXJtaW5hdGVkIGBscy10cmVlIC16YCBvdXRwdXQgaW5zdGVhZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW12LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW12LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDdjNDNhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbXYudHh0CkBAIC0wLDAgKzEsNTQgQEAKK2dpdC1tdigxKQorPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tdiAtIE1vdmUgb3IgcmVuYW1lIGEgZmlsZSwgZGlyZWN0b3J5IG9yIHN5bWxpbmsKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbXYnIDxvcHRpb25zPi4uLiA8YXJncz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIG1vdmUgb3IgcmVuYW1lIGEgZmlsZSwgZGlyZWN0b3J5IG9yIHN5bWxpbmsuCisKKyBnaXQtbXYgWy1mXSBbLW5dIDxzb3VyY2U+IDxkZXN0aW5hdGlvbj4KKyBnaXQtbXYgWy1mXSBbLW5dIFsta10gPHNvdXJjZT4gLi4uIDxkZXN0aW5hdGlvbiBkaXJlY3Rvcnk+CisKK0luIHRoZSBmaXJzdCBmb3JtLCBpdCByZW5hbWVzIDxzb3VyY2U+LCB3aGljaCBtdXN0IGV4aXN0IGFuZCBiZSBlaXRoZXIKK2EgZmlsZSwgc3ltbGluayBvciBkaXJlY3RvcnksIHRvIDxkZXN0aW5hdGlvbj4uCitJbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBsYXN0IGFyZ3VtZW50IGhhcyB0byBiZSBhbiBleGlzdGluZworZGlyZWN0b3J5OyB0aGUgZ2l2ZW4gc291cmNlcyB3aWxsIGJlIG1vdmVkIGludG8gdGhpcyBkaXJlY3RvcnkuCisKK1RoZSBpbmRleCBpcyB1cGRhdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgYnV0IHRoZSBjaGFuZ2UgbXVzdCBzdGlsbCBiZQorY29tbWl0dGVkLgorCitPUFRJT05TCistLS0tLS0tCistZjo6CisJRm9yY2UgcmVuYW1pbmcgb3IgbW92aW5nIG9mIGEgZmlsZSBldmVuIGlmIHRoZSB0YXJnZXQgZXhpc3RzCistazo6CisgICAgICAgIFNraXAgbW92ZSBvciByZW5hbWUgYWN0aW9ucyB3aGljaCB3b3VsZCBsZWFkIHRvIGFuIGVycm9yCisJY29uZGl0aW9uLiBBbiBlcnJvciBoYXBwZW5zIHdoZW4gYSBzb3VyY2UgaXMgbmVpdGhlciBleGlzdGluZyBub3IKKyAgICAgICAgY29udHJvbGxlZCBieSBHSVQsIG9yIHdoZW4gaXQgd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nCisgICAgICAgIGZpbGUgdW5sZXNzICctZicgaXMgZ2l2ZW4uCistbjo6CisJRG8gbm90aGluZzsgb25seSBzaG93IHdoYXQgd291bGQgaGFwcGVuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorUmV3cml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CitNb3ZlIGZ1bmN0aW9uYWxpdHkgYWRkZWQgYnkgSm9zZWYgV2VpZGVuZG9yZmVyIDxKb3NlZi5XZWlkZW5kb3JmZXJAZ214LmRlPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW5hbWUtcmV2LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW5hbWUtcmV2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWExNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbmFtZS1yZXYudHh0CkBAIC0wLDAgKzEsNjcgQEAKK2dpdC1uYW1lLXJldigxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1uYW1lLXJldiAtIEZpbmQgc3ltYm9saWMgbmFtZXMgZm9yIGdpdmVuIHJldnMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbmFtZS1yZXYnIFstLXRhZ3NdICggLS1hbGwgfCAtLXN0ZGluIHwgPGNvbW1pdHRpc2g+Li4uICkKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitGaW5kcyBzeW1ib2xpYyBuYW1lcyBzdWl0YWJsZSBmb3IgaHVtYW4gZGlnZXN0aW9uIGZvciByZXZpc2lvbnMgZ2l2ZW4gaW4gYW55Citmb3JtYXQgcGFyc2FibGUgYnkgZ2l0LXJldi1wYXJzZS4KKworCitPUFRJT05TCistLS0tLS0tCisKKy0tdGFnczo6CisJRG8gbm90IHVzZSBicmFuY2ggbmFtZXMsIGJ1dCBvbmx5IHRhZ3MgdG8gbmFtZSB0aGUgY29tbWl0cworCistLWFsbDo6CisJTGlzdCBhbGwgY29tbWl0cyByZWFjaGFibGUgZnJvbSBhbGwgcmVmcworCistLXN0ZGluOjoKKwlSZWFkIGZyb20gc3RkaW4sIGFwcGVuZCAiKDxyZXZfbmFtZT4pIiB0byBhbGwgc2hhMSdzIG9mIG5hbWUnYWJsZQorCWNvbW1pdHMsIGFuZCBwYXNzIHRvIHN0ZG91dAorCitFWEFNUExFCistLS0tLS0tCisKK0dpdmVuIGEgY29tbWl0LCBmaW5kIG91dCB3aGVyZSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVmcy4gU2F5IHNvbWVib2R5Cit3cm90ZSB5b3UgYWJvdXQgdGhhdCBwaGFudGFzdGljIGNvbW1pdCAzM2RiNWY0ZDkwMjdhMTBlNDc3Y2NmMDU0YjJjMWFiOTRmNzRjODVhLgorT2YgY291cnNlLCB5b3UgbG9vayBpbnRvIHRoZSBjb21taXQsIGJ1dCB0aGF0IG9ubHkgdGVsbHMgeW91IHdoYXQgaGFwcGVuZWQsIGJ1dAorbm90IHRoZSBjb250ZXh0LgorCitFbnRlciBnaXQtbmFtZS1yZXY6CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgbmFtZS1yZXYgMzNkYjVmNGQ5MDI3YTEwZTQ3N2NjZjA1NGIyYzFhYjk0Zjc0Yzg1YQorMzNkYjVmNGQ5MDI3YTEwZTQ3N2NjZjA1NGIyYzFhYjk0Zjc0Yzg1YSB0YWdzL3YwLjk5XjB+OTQwCistLS0tLS0tLS0tLS0KKworTm93IHlvdSBhcmUgd2lzZXIsIGJlY2F1c2UgeW91IGtub3cgdGhhdCBpdCBoYXBwZW5lZCA5NDAgcmV2aXNpb25zIGJlZm9yZSB2MC45OS4KKworQW5vdGhlciBuaWNlIHRoaW5nIHlvdSBjYW4gZG8gaXM6CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgbG9nIHwgZ2l0IG5hbWUtcmV2IC0tc3RkaW4KKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4gPEpvaGFubmVzLlNjaGluZGVsaW5AZ214LmRlPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKb2hhbm5lcyBTY2hpbmRlbGluLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcDRpbXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcDRpbXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOThmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wNGltcG9ydC50eHQKQEAgLTAsMCArMSwxNjUgQEAKK2dpdC1wNGltcG9ydCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wNGltcG9ydCAtIEltcG9ydCBhIFBlcmZvcmNlIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK2BnaXQtcDRpbXBvcnRgIFstcXwtdl0gWy0tYXV0aG9ycyA8ZmlsZT5dIFstdCA8dGltZXpvbmU+XSA8Ly9wNHJlcG8vcGF0aD4gPGJyYW5jaD4KKworYGdpdC1wNGltcG9ydGAgLS1zdGl0Y2ggPC8vcDRyZXBvL3BhdGg+CisKK2BnaXQtcDRpbXBvcnRgCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbXBvcnQgYSBQZXJmb3JjZSByZXBvc2l0b3J5IGludG8gYW4gZXhpc3RpbmcgZ2l0IHJlcG9zaXRvcnkuICBXaGVuCithIDwvL3A0cmVwby9wYXRoPiBhbmQgPGJyYW5jaD4gYXJlIHNwZWNpZmllZCBhIG5ldyBicmFuY2ggd2l0aCB0aGUKK2dpdmVuIG5hbWUgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgaW5pdGlhbCBpbXBvcnQgd2lsbCBiZWdpbi4KKworT25jZSB0aGUgaW5pdGlhbCBpbXBvcnQgaXMgY29tcGxldGUgeW91IGNhbiBkbyBhbiBpbmNyZW1lbnRhbCBpbXBvcnQKK29mIG5ldyBjb21taXRzIGZyb20gdGhlIFBlcmZvcmNlIHJlcG9zaXRvcnkuICBZb3UgZG8gdGhpcyBieSBjaGVja2luZworb3V0IHRoZSBhcHByb3ByaWF0ZSBnaXQgYnJhbmNoIGFuZCB0aGVuIHJ1bm5pbmcgYGdpdC1wNGltcG9ydGAgd2l0aG91dAorYW55IG9wdGlvbnMuCisKK1RoZSBzdGFuZGFyZCBwNCBjbGllbnQgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBQZXJmb3JjZQorcmVwb3NpdG9yeTsgaXQgbXVzdCBiZSBjb25maWd1cmVkIGNvcnJlY3RseSBpbiBvcmRlciBmb3IgYGdpdC1wNGltcG9ydGAKK3RvIG9wZXJhdGUgKHNlZSBiZWxvdykuCisKKworT1BUSU9OUworLS0tLS0tLQorLXE6OgorCURvIG5vdCBkaXNwbGF5IGFueSBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KKworLXY6OgorICAgICAgICBHaXZlIGV4dHJhIHByb2dyZXNzIGluZm9ybWF0aW9uLgorCitcLS1hdXRob3JzOjoKKwlTcGVjaWZ5IGFuIGF1dGhvcnMgZmlsZSBjb250YWluaW5nIGEgbWFwcGluZyBvZiBQZXJmb3JjZSB1c2VyCisJaWRzIHRvIGZ1bGwgbmFtZXMgYW5kIGVtYWlsIGFkZHJlc3NlcyAoc2VlIE5vdGVzIGJlbG93KS4KKworXC0tc3RpdGNoOjoKKwlJbXBvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBwZXJmb3JjZSBicmFuY2ggaW50byB0aGUKKwljdXJyZW50bHkgY2hlY2tlZCBvdXQgZ2l0IGJyYW5jaC4KKworXC0tbG9nOjoKKwlTdG9yZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHNwZWNpZmllZCBmaWxlLgorCistdDo6CisJU3BlY2lmeSB0aGF0IHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpcyBpbiB0aGUgc3BlY2lmaWVkIHRpbWV6b25lLgorCVRpbWV6b25lIG11c3QgYmUgaW4gdGhlIGZvcm1hdCAiVVMvUGFjaWZpYyIgb3IgIkV1cm9wZS9Mb25kb24iCisJZXRjLiAgWW91IG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMgb25jZSwgaXQgd2lsbCBiZSBzYXZlZCBpbgorCXRoZSBnaXQgY29uZmlnIGZpbGUgZm9yIHRoZSByZXBvc2l0b3J5LgorCis8Ly9wNHJlcG8vcGF0aD46OgorCVRoZSBQZXJmb3JjZSBwYXRoIHRoYXQgd2lsbCBiZSBpbXBvcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgYnJhbmNoLgorCis8YnJhbmNoPjo6CisJVGhlIG5ldyBicmFuY2ggdGhhdCB3aWxsIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGUgUGVyZm9yY2UgaW1wb3J0cy4KKworCitQNCBDbGllbnQKKy0tLS0tLS0tLQorWW91IG11c3QgbWFrZSB0aGUgYHA0YCBjbGllbnQgY29tbWFuZCBhdmFpbGFibGUgaW4geW91ciAkUEFUSCBhbmQKK2NvbmZpZ3VyZSBpdCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB0YXJnZXQgUGVyZm9yY2UgcmVwb3NpdG9yeS4KK1R5cGljYWxseSB0aGlzIG1lYW5zIHlvdSBtdXN0IHNldCB0aGUgIiRQNFBPUlQiIGFuZCAiJFA0Q0xJRU5UIgorZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitZb3UgbXVzdCBhbHNvIGNvbmZpZ3VyZSBhIGBwNGAgY2xpZW50ICJ2aWV3IiB3aGljaCBtYXBzIHRoZSBQZXJmb3JjZQorYnJhbmNoIGludG8gdGhlIHRvcCBsZXZlbCBvZiB5b3VyIGdpdCByZXBvc2l0b3J5LCBmb3IgZXhhbXBsZToKKworLS0tLS0tLS0tLS0tCitDbGllbnQ6IG15aG9zdAorCitSb290OiAgIC9ob21lL3NlYW4vaW1wb3J0CisKK09wdGlvbnM6ICAgbm9hbGx3cml0ZSBjbG9iYmVyIG5vY29tcHJlc3MgdW5sb2NrZWQgbW9kdGltZSBybWRpcgorCitWaWV3OgorICAgICAgICAvL3B1YmxpYy9qYW0vLi4uIC8vbXlob3N0L2phbS8uLi4KKy0tLS0tLS0tLS0tLQorCitXaXRoIHRoZSBhYm92ZSBgcDRgIGNsaWVudCBzZXR1cCwgeW91IGNvdWxkIGltcG9ydCB0aGUgImphbSIKK3BlcmZvcmNlIGJyYW5jaCBpbnRvIGEgYnJhbmNoIG5hbWVkICJqYW1teSIsIGxpa2Ugc286CisKKy0tLS0tLS0tLS0tLQorJCBta2RpciAtcCAvaG9tZS9zZWFuL2ltcG9ydC9qYW0KKyQgY2QgL2hvbWUvc2Vhbi9pbXBvcnQvamFtCiskIGdpdCBpbml0LWRiCiskIGdpdCBwNGltcG9ydCAvL3B1YmxpYy9qYW0gamFtbXkKKy0tLS0tLS0tLS0tLQorCisKK011bHRpcGxlIEJyYW5jaGVzCistLS0tLS0tLS0tLS0tLS0tLQorTm90ZSB0aGF0IGJ5IGNyZWF0aW5nIG11bHRpcGxlICJ2aWV3cyIgeW91IGNhbiB1c2UgYGdpdC1wNGltcG9ydGAKK3RvIGltcG9ydCBhZGRpdGlvbmFsIGJyYW5jaGVzIGludG8gdGhlIHNhbWUgZ2l0IHJlcG9zaXRvcnkuCitIb3dldmVyLCB0aGUgYHA0YCBjbGllbnQgaGFzIGEgbGltaXRhdGlvbiBpbiB0aGF0IGl0IHNpbGVudGx5CitpZ25vcmVzIGFsbCBidXQgdGhlIGxhc3QgInZpZXciIHRoYXQgbWFwcyBpbnRvIHRoZSBzYW1lIGxvY2FsCitkaXJlY3RvcnkuICBTbyB0aGUgZm9sbG93aW5nIHdpbGwgKm5vdCogd29yazoKKworLS0tLS0tLS0tLS0tCitWaWV3OgorICAgICAgICAvL3B1YmxpYy9qYW0vLi4uIC8vbXlob3N0L2phbS8uLi4KKyAgICAgICAgLy9wdWJsaWMvb3RoZXIvLi4uIC8vbXlob3N0L2phbS8uLi4KKyAgICAgICAgLy9wdWJsaWMvZ3Vlc3QvLi4uIC8vbXlob3N0L2phbS8uLi4KKy0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCBtb3JlIHRoYW4gb25lIFBlcmZvcmNlIGJyYW5jaCB0byBiZSBpbXBvcnRlZCBpbnRvIHRoZQorc2FtZSBkaXJlY3RvcnkgeW91IG11c3QgZW1wbG95IGEgd29ya2Fyb3VuZC4gIEEgc2ltcGxlIG9wdGlvbiBpcwordG8gYWRqdXN0IHlvdXIgYHA0YCBjbGllbnQgYmVmb3JlIGVhY2ggaW1wb3J0IHRvIG9ubHkgaW5jbHVkZSBhCitzaW5nbGUgdmlldy4KKworQW5vdGhlciBvcHRpb24gaXMgdG8gY3JlYXRlIG11bHRpcGxlIHN5bWxpbmtzIGxvY2FsbHkgd2hpY2ggYWxsCitwb2ludCB0byB0aGUgc2FtZSBkaXJlY3RvcnkgaW4geW91ciBnaXQgcmVwb3NpdG9yeSBhbmQgdGhlbiB1c2UKK29uZSBwZXIgInZpZXciIGluc3RlYWQgb2YgbGlzdGluZyB0aGUgYWN0dWFsIGRpcmVjdG9yeS4KKworCitUYWdzCistLS0tCitBIGdpdCB0YWcgb2YgdGhlIGZvcm0gcDQveHggaXMgY3JlYXRlZCBmb3IgZXZlcnkgY2hhbmdlIGltcG9ydGVkIGZyb20KK3RoZSBQZXJmb3JjZSByZXBvc2l0b3J5IHdoZXJlIHh4IGlzIHRoZSBQZXJmb3JjZSBjaGFuZ2VzZXQgbnVtYmVyLgorVGhlcmVmb3JlIGFmdGVyIHRoZSBpbXBvcnQgeW91IGNhbiB1c2UgZ2l0IHRvIGFjY2VzcyBhbnkgY29tbWl0IGJ5IGl0cworUGVyZm9yY2UgbnVtYmVyLCBlZy4gZ2l0IHNob3cgcDQvMzI3LgorCitUaGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgSEVBRCBjb21taXQgaXMgYWxzbyBob3cgYGdpdC1wNGltcG9ydGAKK2RldGVybWluZXMgaWYgdGhlcmUgYXJlIG5ldyBjaGFuZ2VzIHRvIGluY3JlbWVudGFsbHkgaW1wb3J0IGZyb20gdGhlCitQZXJmb3JjZSByZXBvc2l0b3J5LgorCitJZiB5b3UgaW1wb3J0IGZyb20gYSByZXBvc2l0b3J5IHdpdGggbWFueSB0aG91c2FuZHMgb2YgY2hhbmdlcworeW91IHdpbGwgaGF2ZSBhbiBlcXVhbCBudW1iZXIgb2YgcDQveHh4eCBnaXQgdGFncy4gIEdpdCB0YWdzIGNhbgorYmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIGRpc2sgc3BhY2UgYW5kIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy4KK0lmIHlvdSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gZnVydGhlciBpbmNyZW1lbnRhbCBpbXBvcnRzLCB5b3UKK21heSBkZWxldGUgdGhlIHRhZ3MuCisKKworTm90ZXMKKy0tLS0tCitZb3UgY2FuIGludGVycnVwdCB0aGUgaW1wb3J0IChlZy4gY3RybC1jKSBhdCBhbnkgdGltZSBhbmQgcmVzdGFydCBpdAord2l0aG91dCB3b3JyeS4KKworQXV0aG9yIGluZm9ybWF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBieSBxdWVyeWluZyB0aGUKK1BlcmZvcmNlICJ1c2VycyIgdGFibGUgdXNpbmcgdGhlIGlkIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNoYW5nZS4KK0hvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIG1hbnVhbGx5IHN1cHBseSB0aGVzZSBtYXBwaW5ncyB5b3UgY2FuIGRvCitzbyB3aXRoIHRoZSAiLS1hdXRob3JzIiBvcHRpb24uICBJdCBhY2NlcHRzIGEgZmlsZSBjb250YWluaW5nIGEgbGlzdAorb2YgbWFwcGluZ3Mgd2l0aCBlYWNoIGxpbmUgY29udGFpbmluZyBvbmUgbWFwcGluZyBpbiB0aGUgZm9ybWF0OgorCistLS0tLS0tLS0tLS0KKyAgICBwZXJmb3JjZV9pZCA9IEZ1bGwgTmFtZSA8ZW1haWxAYWRkcmVzcy5jb20+CistLS0tLS0tLS0tLS0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBTZWFuIEVzdGFicm9va3MgPHNlYW5sa21sQHN5bXBhdGljby5jYT4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stb2JqZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5MWY4OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stb2JqZWN0cy50eHQKQEAgLTAsMCArMSwxMTIgQEAKK2dpdC1wYWNrLW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhY2stb2JqZWN0cyAtIENyZWF0ZSBhIHBhY2tlZCBhcmNoaXZlIG9mIG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcGFjay1vYmplY3RzJyBbLXFdIFstLW5vLXJldXNlLWRlbHRhXSBbLS1ub24tZW1wdHldCisJWy0tbG9jYWxdIFstLWluY3JlbWVudGFsXSBbLS13aW5kb3c9Tl0gWy0tZGVwdGg9Tl0KKwl7LS1zdGRvdXQgfCBiYXNlLW5hbWV9IDwgb2JqZWN0LWxpc3QKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgYW5kIHdyaXRlcyBhIHBhY2tlZAorYXJjaGl2ZSB3aXRoIHNwZWNpZmllZCBiYXNlLW5hbWUsIG9yIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK0EgcGFja2VkIGFyY2hpdmUgaXMgYW4gZWZmaWNpZW50IHdheSB0byB0cmFuc2ZlciBzZXQgb2Ygb2JqZWN0cworYmV0d2VlbiB0d28gcmVwb3NpdG9yaWVzLCBhbmQgYWxzbyBpcyBhbiBhcmNoaXZhbCBmb3JtYXQgd2hpY2gKK2lzIGVmZmljaWVudCB0byBhY2Nlc3MuICBUaGUgcGFja2VkIGFyY2hpdmUgZm9ybWF0ICgucGFjaykgaXMKK2Rlc2lnbmVkIHRvIGJlIHVucGFja2FibGUgd2l0aG91dCBoYXZpbmcgYW55dGhpbmcgZWxzZSwgYnV0IGZvcgorcmFuZG9tIGFjY2VzcywgYWNjb21wYW5pZWQgd2l0aCB0aGUgcGFjayBpbmRleCBmaWxlICguaWR4KS4KKworJ2dpdC11bnBhY2stb2JqZWN0cycgY29tbWFuZCBjYW4gcmVhZCB0aGUgcGFja2VkIGFyY2hpdmUgYW5kCitleHBhbmQgdGhlIG9iamVjdHMgY29udGFpbmVkIGluIHRoZSBwYWNrIGludG8gIm9uZS1maWxlCitvbmUtb2JqZWN0IiBmb3JtYXQ7IHRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYnkgdGhlIHNtYXJ0LXB1bGwKK2NvbW1hbmRzIHdoZW4gYSBwYWNrIGlzIGNyZWF0ZWQgb24tdGhlLWZseSBmb3IgZWZmaWNpZW50IG5ldHdvcmsKK3RyYW5zcG9ydCBieSB0aGVpciBwZWVycy4KKworUGxhY2luZyBib3RoIGluIHRoZSBwYWNrLyBzdWJkaXJlY3Rvcnkgb2YgJEdJVF9PQkpFQ1RfRElSRUNUT1JZIChvcgorYW55IG9mIHRoZSBkaXJlY3RvcmllcyBvbiAkR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVMpCitlbmFibGVzIGdpdCB0byByZWFkIGZyb20gc3VjaCBhbiBhcmNoaXZlLgorCitJbiBhIHBhY2tlZCBhcmNoaXZlLCBhbiBvYmplY3QgaXMgZWl0aGVyIHN0b3JlZCBhcyBhIGNvbXByZXNzZWQKK3dob2xlLCBvciBhcyBhIGRpZmZlcmVuY2UgZnJvbSBzb21lIG90aGVyIG9iamVjdC4gIFRoZSBsYXR0ZXIgaXMKK29mdGVuIGNhbGxlZCBhIGRlbHRhLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2Jhc2UtbmFtZTo6CisJV3JpdGUgaW50byBhIHBhaXIgb2YgZmlsZXMgKC5wYWNrIGFuZCAuaWR4KSwgdXNpbmcKKwk8YmFzZS1uYW1lPiB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKwlXaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHRoZSB0d28gZmlsZXMgYXJlIHdyaXR0ZW4gaW4KKwk8YmFzZS1uYW1lPi08U0hBMT4ue3BhY2ssaWR4fSBmaWxlcy4gIDxTSEExPiBpcyBhIGhhc2gKKwlvZiBvYmplY3QgbmFtZXMgKGN1cnJlbnRseSBpbiByYW5kb20gb3JkZXIgc28gaXQgZG9lcworCW5vdCBoYXZlIGFueSB1c2VmdWwgbWVhbmluZykgdG8gbWFrZSB0aGUgcmVzdWx0aW5nCisJZmlsZW5hbWUgcmVhc29uYWJseSB1bmlxdWUsIGFuZCB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZAorCW91dHB1dCBvZiB0aGUgY29tbWFuZC4KKworLS1zdGRvdXQ6OgorCVdyaXRlIHRoZSBwYWNrIGNvbnRlbnRzICh3aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuIHRvCisJLnBhY2sgZmlsZSkgb3V0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKKy0td2luZG93IGFuZCAtLWRlcHRoOjoKKwlUaGVzZSB0d28gb3B0aW9ucyBhZmZlY3RzIGhvdyB0aGUgb2JqZWN0cyBjb250YWluZWQgaW4KKwl0aGUgcGFjayBhcmUgc3RvcmVkIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uLiAgVGhlCisJb2JqZWN0cyBhcmUgZmlyc3QgaW50ZXJuYWxseSBzb3J0ZWQgYnkgdHlwZSwgc2l6ZSBhbmQKKwlvcHRpb25hbGx5IG5hbWVzIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSBvdGhlciBvYmplY3RzCisJd2l0aGluIC0td2luZG93IHRvIHNlZSBpZiB1c2luZyBkZWx0YSBjb21wcmVzc2lvbiBzYXZlcworCXNwYWNlLiAgLS1kZXB0aCBsaW1pdHMgdGhlIG1heGltdW0gZGVsdGEgZGVwdGg7IG1ha2luZworCWl0IHRvbyBkZWVwIGFmZmVjdHMgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSB1bnBhY2tlcgorCXNpZGUsIGJlY2F1c2UgZGVsdGEgZGF0YSBuZWVkcyB0byBiZSBhcHBsaWVkIHRoYXQgbWFueQorCXRpbWVzIHRvIGdldCB0byB0aGUgbmVjZXNzYXJ5IG9iamVjdC4KKworLS1pbmNyZW1lbnRhbDo6CisJVGhpcyBmbGFnIGNhdXNlcyBhbiBvYmplY3QgYWxyZWFkeSBpbiBhIHBhY2sgaWdub3JlZAorCWV2ZW4gaWYgaXQgYXBwZWFycyBpbiB0aGUgc3RhbmRhcmQgaW5wdXQuCisKKy0tbG9jYWw6OgorCVRoaXMgZmxhZyBpcyBzaW1pbGFyIHRvIGAtLWluY3JlbWVudGFsYDsgaW5zdGVhZCBvZgorCWlnbm9yaW5nIGFsbCBwYWNrZWQgb2JqZWN0cywgaXQgb25seSBpZ25vcmVzIG9iamVjdHMKKwl0aGF0IGFyZSBwYWNrZWQgYW5kIG5vdCBpbiB0aGUgbG9jYWwgb2JqZWN0IHN0b3JlCisJKGkuZS4gYm9ycm93ZWQgZnJvbSBhbiBhbHRlcm5hdGUpLgorCistLW5vbi1lbXB0eTo6CisgICAgICAgIE9ubHkgY3JlYXRlIGEgcGFja2VkIGFyY2hpdmUgaWYgaXQgd291bGQgY29udGFpbiBhdAorICAgICAgICBsZWFzdCBvbmUgb2JqZWN0LgorCistcTo6CisJVGhpcyBmbGFnIG1ha2VzIHRoZSBjb21tYW5kIG5vdCB0byByZXBvcnQgaXRzIHByb2dyZXNzCisJb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbS4KKworLS1uby1yZXVzZS1kZWx0YTo6CisJV2hlbiBjcmVhdGluZyBhIHBhY2tlZCBhcmNoaXZlIGluIGEgcmVwb3NpdG9yeSB0aGF0CisJaGFzIGV4aXN0aW5nIHBhY2tzLCB0aGUgY29tbWFuZCByZXVzZXMgZXhpc3RpbmcgZGVsdGFzLgorCVRoaXMgc29tZXRpbWVzIHJlc3VsdHMgaW4gYSBzbGlnaHRseSBzdWJvcHRpbWFsIHBhY2suCisJVGhpcyBmbGFnIHRlbGxzIHRoZSBjb21tYW5kIG5vdCB0byByZXVzZSBleGlzdGluZyBkZWx0YXMKKwlidXQgY29tcHV0ZSB0aGVtIGZyb20gc2NyYXRjaC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1yZXBhY2tbMV0KK2dpdGxpbms6Z2l0LXBydW5lLXBhY2tlZFsxXQorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1yZWR1bmRhbnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1yZWR1bmRhbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjA2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLXJlZHVuZGFudC50eHQKQEAgLTAsMCArMSw1OCBAQAorZ2l0LXBhY2stcmVkdW5kYW50KDEpCis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhY2stcmVkdW5kYW50IC0gUHJvZ3JhbSB1c2VkIHRvIGZpbmQgcmVkdW5kYW50IHBhY2sgZmlsZXMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcGFjay1yZWR1bmRhbnQnIFsgLS12ZXJib3NlIF0gWyAtLWFsdC1vZGIgXSA8IC0tYWxsIHwgLnBhY2sgZmlsZW5hbWUgLi4uID4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHByb2dyYW0gY29tcHV0ZXMgd2hpY2ggcGFja3MgaW4geW91ciByZXBvc2l0b3J5CithcmUgcmVkdW5kYW50LiBUaGUgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBwaXBpbmcgdG8KKyd4YXJncyBybScgaWYgeW91IGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeS4KKworZ2l0LXBhY2stcmVkdW5kYW50IGFjY2VwdHMgYSBsaXN0IG9mIG9iamVjdHMgb24gc3RhbmRhcmQgaW5wdXQuIEFueSBvYmplY3RzCitnaXZlbiB3aWxsIGJlIGlnbm9yZWQgd2hlbiBjaGVja2luZyB3aGljaCBwYWNrcyBhcmUgcmVxdWlyZWQuIFRoaXMgbWFrZXMgdGhlIAorZm9sbG93aW5nIGNvbW1hbmQgdXNlZnVsIHdoZW4gd2FudGluZyB0byByZW1vdmUgcGFja3Mgd2hpY2ggY29udGFpbiB1bnJlYWNoYWJsZQorb2JqZWN0cy4KKworZ2l0LWZzY2stb2JqZWN0cyAtLWZ1bGwgLS11bnJlYWNoYWJsZSB8IGN1dCAtZCAnICcgLWYzIHwgXAorZ2l0LXBhY2stcmVkdW5kYW50IC0tYWxsIHwgeGFyZ3Mgcm0KKworT1BUSU9OUworLS0tLS0tLQorCisKKy0tYWxsOjoKKwlQcm9jZXNzZXMgYWxsIHBhY2tzLiBBbnkgZmlsZW5hbWVzIG9uIHRoZSBjb21tYW5kbGluZSBhcmUgaWdub3JlZC4KKworLS1hbHQtb2RiOjoKKwlEb24ndCByZXF1aXJlIG9iamVjdHMgcHJlc2VudCBpbiBwYWNrcyBmcm9tIGFsdGVybmF0ZSBvYmplY3QKKwlkaXJlY3RvcmllcyB0byBiZSBwcmVzZW50IGluIGxvY2FsIHBhY2tzLgorCistLXZlcmJvc2U6OgorCU91dHB1dHMgc29tZSBzdGF0aXN0aWNzIHRvIHN0ZGVyci4gSGFzIGEgc21hbGwgcGVyZm9ybWFuY2UgcGVuYWx0eS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTHVrYXMgU2FuZHN0csO2bSA8bHVrYXNzQGV0ZWsuY2hhbG1lcnMuc2U+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEx1a2FzIFNhbmRzdHLDtm0gPGx1a2Fzc0BldGVrLmNoYWxtZXJzLnNlPgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXQorZ2l0bGluazpnaXQtcmVwYWNrWzFdCitnaXRsaW5rOmdpdC1wcnVuZS1wYWNrZWRbMV0KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBhcnNlLXJlbW90ZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYXJzZS1yZW1vdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjdhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYXJzZS1yZW1vdGUudHh0CkBAIC0wLDAgKzEsNDggQEAKK2dpdC1wYXJzZS1yZW1vdGUoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhcnNlLXJlbW90ZSAtIFJvdXRpbmVzIHRvIGhlbHAgcGFyc2luZyAkR0lUX0RJUi9yZW1vdGVzLworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJy4gZ2l0LXBhcnNlLXJlbW90ZScKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHNjcmlwdCBpcyBpbmNsdWRlZCBpbiB2YXJpb3VzIHNjcmlwdHMgdG8gc3VwcGx5Cityb3V0aW5lcyB0byBwYXJzZSBmaWxlcyB1bmRlciAkR0lUX0RJUi9yZW1vdGVzLyBhbmQKKyRHSVRfRElSL2JyYW5jaGVzLy4KKworVGhlIHByaW1hcnkgZW50cnkgcG9pbnRzIGFyZToKKworZ2V0X3JlbW90ZV9yZWZzX2Zvcl9mZXRjaDo6CisJR2l2ZW4gdGhlIGxpc3Qgb2YgdXNlci1zdXBwbGllZCBgPHJlcG8+IDxyZWZzcGVjPi4uLmAsCisJcmV0dXJuIHRoZSBsaXN0IG9mIHJlZnMgdG8gZmV0Y2ggYWZ0ZXIgY2Fub25pY2FsaXppbmcKKwl0aGVtIGludG8gYCRHSVRfRElSYCByZWxhdGl2ZSBwYXRocworCShlLmcuIGByZWZzL2hlYWRzL2Zvb2ApLiAgV2hlbiBgPHJlZnNwZWM+Li4uYCBpcyBlbXB0eQorCXRoZSByZXR1cm5lZCBsaXN0IG9mIHJlZnMgY29uc2lzdHMgb2YgdGhlIGRlZmF1bHRzCisJZm9yIHRoZSBnaXZlbiBgPHJlcG8+YCwgaWYgc3BlY2lmaWVkIGluCisJYCRHSVRfRElSL3JlbW90ZXMvYCBvciBgJEdJVF9ESVIvYnJhbmNoZXMvYC4KKworZ2V0X3JlbW90ZV9yZWZzX2Zvcl9wdXNoOjoKKwlHaXZlbiB0aGUgbGlzdCBvZiB1c2VyLXN1cHBsaWVkIGA8cmVwbz4gPHJlZnNwZWM+Li4uYCwKKwlyZXR1cm4gdGhlIGxpc3Qgb2YgcmVmcyB0byBwdXNoIGluIGEgZm9ybSBzdWl0YWJsZSB0byBiZQorCWZlZCB0byB0aGUgYGdpdC1zZW5kLXBhY2tgIGNvbW1hbmQuICBXaGVuIGA8cmVmc3BlYz4uLi5gCisJaXMgZW1wdHkgdGhlIHJldHVybmVkIGxpc3Qgb2YgcmVmcyBjb25zaXN0cyBvZiB0aGUKKwlkZWZhdWx0cyBmb3IgdGhlIGdpdmVuIGA8cmVwbz5gLCBpZiBzcGVjaWZpZWQgaW4KKwlgJEdJVF9ESVIvcmVtb3Rlcy9gLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFuby4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGF0Y2gtaWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGF0Y2gtaWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODkwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYXRjaC1pZC50eHQKQEAgLTAsMCArMSw0MyBAQAorZ2l0LXBhdGNoLWlkKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhdGNoLWlkIC0gR2VuZXJhdGUgYSBwYXRjaCBJRAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcGF0Y2gtaWQnIDwgPHBhdGNoPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0EgInBhdGNoIElEIiBpcyBub3RoaW5nIGJ1dCBhIFNIQTEgb2YgdGhlIGRpZmYgYXNzb2NpYXRlZCB3aXRoIGEgcGF0Y2gsIHdpdGgKK3doaXRlc3BhY2UgYW5kIGxpbmUgbnVtYmVycyBpZ25vcmVkLiAgQXMgc3VjaCwgaXQncyAicmVhc29uYWJseSBzdGFibGUiLCBidXQgYXQKK3RoZSBzYW1lIHRpbWUgYWxzbyByZWFzb25hYmx5IHVuaXF1ZSwgaS5lLiwgdHdvIHBhdGNoZXMgdGhhdCBoYXZlIHRoZSBzYW1lICJwYXRjaAorSUQiIGFyZSBhbG1vc3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSB0aGluZy4KKworSU9XLCB5b3UgY2FuIHVzZSB0aGlzIHRoaW5nIHRvIGxvb2sgZm9yIGxpa2VseSBkdXBsaWNhdGUgY29tbWl0cy4KKworV2hlbiBkZWFsaW5nIHdpdGggZ2l0LWRpZmYtdHJlZSBvdXRwdXQsIGl0IHRha2VzIGFkdmFudGFnZSBvZgordGhlIGZhY3QgdGhhdCB0aGUgcGF0Y2ggaXMgcHJlZml4ZWQgd2l0aCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlCitjb21taXQsIGFuZCBvdXRwdXRzIHR3byA0MC1ieXRlIGhleGFkZWNpbWFsIHN0cmluZy4gIFRoZSBmaXJzdAorc3RyaW5nIGlzIHRoZSBwYXRjaCBJRCwgYW5kIHRoZSBzZWNvbmQgc3RyaW5nIGlzIHRoZSBjb21taXQgSUQuCitUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBtYXBwaW5nIGZyb20gcGF0Y2ggSUQgdG8gY29tbWl0IElELgorCitPUFRJT05TCistLS0tLS0tCis8cGF0Y2g+OjoKKwlUaGUgZGlmZiB0byBjcmVhdGUgdGhlIElEIG9mLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGVlay1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGVlay1yZW1vdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDA2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wZWVrLXJlbW90ZS50eHQKQEAgLTAsMCArMSw1MiBAQAorZ2l0LXBlZWstcmVtb3RlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBlZWstcmVtb3RlIC0gTGlzdHMgdGhlIHJlZmVyZW5jZXMgaW4gYSByZW1vdGUgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wZWVrLXJlbW90ZScgWy0tZXhlYz08Z2l0LXVwbG9hZC1wYWNrPl0gWzxob3N0PjpdPGRpcmVjdG9yeT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitMaXN0cyB0aGUgcmVmZXJlbmNlcyB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgaGFzLCBhbmQgb3B0aW9uYWxseQorc3RvcmVzIHRoZW0gaW4gdGhlIGxvY2FsIHJlcG9zaXRvcnkgdW5kZXIgdGhlIHNhbWUgbmFtZS4KKworT1BUSU9OUworLS0tLS0tLQorLS1leGVjPTxnaXQtdXBsb2FkLXBhY2s+OjoKKwlVc2UgdGhpcyB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvICdnaXQtdXBsb2FkLXBhY2snIG9uIHRoZQorCXJlbW90ZSBzaWRlLCBpZiBpdCBpcyBub3QgZm91bmQgb24geW91ciAkUEFUSC4gU29tZQorCWluc3RhbGxhdGlvbnMgb2Ygc3NoZCBpZ25vcmVzIHRoZSB1c2VyJ3MgZW52aXJvbm1lbnQKKwlzZXR1cCBzY3JpcHRzIGZvciBsb2dpbiBzaGVsbHMgKGUuZy4gLmJhc2hfcHJvZmlsZSkgYW5kCisJeW91ciBwcml2YXRlbHkgaW5zdGFsbGVkIGdpdCBtYXkgbm90IGJlIGZvdW5kIG9uIHRoZSBzeXN0ZW0KKwlkZWZhdWx0ICRQQVRILiAgQW5vdGhlciB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBpcyB0byBzZXQKKwl1cCB5b3VyICRQQVRIIGluICIuYmFzaHJjIiwgYnV0IHRoaXMgZmxhZyBpcyBmb3IgcGVvcGxlCisJd2hvIGRvIG5vdCB3YW50IHRvIHBheSB0aGUgb3ZlcmhlYWQgZm9yIG5vbi1pbnRlcmFjdGl2ZQorCXNoZWxscywgYnV0IHByZWZlciBoYXZpbmcgYSBsZWFuIC5iYXNocmMgZmlsZSAodGhleSBzZXQgbW9zdCBvZgorCXRoZSB0aGluZ3MgdXAgaW4gLmJhc2hfcHJvZmlsZSkuCisKKzxob3N0Pjo6CisJQSByZW1vdGUgaG9zdCB0aGF0IGhvdXNlcyB0aGUgcmVwb3NpdG9yeS4gIFdoZW4gdGhpcworCXBhcnQgaXMgc3BlY2lmaWVkLCAnZ2l0LXVwbG9hZC1wYWNrJyBpcyBpbnZva2VkIHZpYQorCXNzaC4KKworPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIHN5bmMgZnJvbS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcHJ1bmUtcGFja2VkLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLXBhY2tlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0ODgyNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLXBhY2tlZC50eHQKQEAgLTAsMCArMSw1MSBAQAorZ2l0LXBydW5lLXBhY2tlZCgxKQorPT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wcnVuZS1wYWNrZWQgLSBQcm9ncmFtIHVzZWQgdG8gcmVtb3ZlIHRoZSBleHRyYSBvYmplY3QgZmlsZXMgdGhhdCBhcmUgbm93CityZXNpZGluZyBpbiBhIHBhY2sgZmlsZS4KKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcHJ1bmUtcGFja2VkJyBbLW5dCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHByb2dyYW0gc2VhcmNoIHRoZSBgJEdJVF9PQkpFQ1RfRElSYCBmb3IgYWxsIG9iamVjdHMgdGhhdCBjdXJyZW50bHkKK2V4aXN0IGluIGEgcGFjayBmaWxlIGFzIHdlbGwgYXMgdGhlIGluZGVwZW5kZW50IG9iamVjdCBkaXJlY3Rvcmllcy4KKworQWxsIHN1Y2ggZXh0cmEgb2JqZWN0cyBhcmUgcmVtb3ZlZC4KKworQSBwYWNrIGlzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzLCBpbmRpdmlkdWFsbHkgY29tcHJlc3NlZCwgd2l0aCBkZWx0YQorY29tcHJlc3Npb24gYXBwbGllZCwgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUsIHdpdGggYW4gYXNzb2NpYXRlZCBpbmRleCBmaWxlLgorCitQYWNrcyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIGxvYWQgb24gbWlycm9yIHN5c3RlbXMsIGJhY2t1cCBlbmdpbmVzLAorZGlzayBzdG9yYWdlLCBldGMuCisKKworT1BUSU9OUworLS0tLS0tLQorLW46OgorICAgICAgICBEb24ndCBhY3R1YWxseSByZW1vdmUgYW55IG9iamVjdHMsIG9ubHkgc2hvdyB0aG9zZSB0aGF0IHdvdWxkIGhhdmUgYmVlbgorICAgICAgICByZW1vdmVkLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtcGFjay1vYmplY3RzWzFdCitnaXRsaW5rOmdpdC1yZXBhY2tbMV0KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFlMzAzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcHJ1bmUudHh0CkBAIC0wLDAgKzEsNjEgQEAKK2dpdC1wcnVuZSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wcnVuZSAtIFBydW5lcyBhbGwgdW5yZWFjaGFibGUgb2JqZWN0cyBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcHJ1bmUnIFstbl0gWy0tXSBbPGhlYWQ+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVGhpcyBydW5zIGBnaXQtZnNjay1vYmplY3RzIC0tdW5yZWFjaGFibGVgIHVzaW5nIGFsbCB0aGUgcmVmcworYXZhaWxhYmxlIGluIGAkR0lUX0RJUi9yZWZzYCwgb3B0aW9uYWxseSB3aXRoIGFkZGl0aW9uYWwgc2V0IG9mCitvYmplY3RzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgcHJ1bmVzIGFsbAorb2JqZWN0cyB1bnJlYWNoYWJsZSBmcm9tIGFueSBvZiB0aGVzZSBoZWFkIG9iamVjdHMgZnJvbSB0aGUgb2JqZWN0IGRhdGFiYXNlLgorSW4gYWRkaXRpb24sIGl0CitwcnVuZXMgdGhlIHVucGFja2VkIG9iamVjdHMgdGhhdCBhcmUgYWxzbyBmb3VuZCBpbiBwYWNrcyBieQorcnVubmluZyBgZ2l0IHBydW5lLXBhY2tlZGAuCisKK09QVElPTlMKKy0tLS0tLS0KKworLW46OgorCURvIG5vdCByZW1vdmUgYW55dGhpbmc7IGp1c3QgcmVwb3J0IHdoYXQgaXQgd291bGQKKwlyZW1vdmUuCisKK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworPGhlYWQ+Li4uOjoKKwlJbiBhZGRpdGlvbiB0byBvYmplY3RzCisJcmVhY2hhYmxlIGZyb20gYW55IG9mIG91ciByZWZlcmVuY2VzLCBrZWVwIG9iamVjdHMKKwlyZWFjaGFibGUgZnJvbSBsaXN0ZWQgPGhlYWQ+cy4KKworRVhBTVBMRQorLS0tLS0tLQorCitUbyBwcnVuZSBvYmplY3RzIG5vdCB1c2VkIGJ5IHlvdXIgcmVwb3NpdG9yeSBub3IgYW5vdGhlciB0aGF0Citib3Jyb3dzIGZyb20geW91ciByZXBvc2l0b3J5IHZpYSBpdHMKK2AuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzYDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBwcnVuZSAkKGNkIC4uL2Fub3RoZXIgJiYgJChnaXQtcmV2LXBhcnNlIC0tYWxsKSkKKy0tLS0tLS0tLS0tLQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wdWxsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTU3N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcHVsbC50eHQKQEAgLTAsMCArMSwxMzIgQEAKK2dpdC1wdWxsKDEpCis9PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcHVsbCAtIFB1bGwgYW5kIG1lcmdlIGZyb20gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXB1bGwnIDxvcHRpb25zPiA8cmVwb3NpdG9yeT4gPHJlZnNwZWM+Li4uCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSdW5zIGBnaXQtZmV0Y2hgIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMsIGFuZCBjYWxscyBgZ2l0LW1lcmdlYAordG8gbWVyZ2UgdGhlIHJldHJpZXZlZCBoZWFkKHMpIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLgorCitOb3RlIHRoYXQgeW91IGNhbiB1c2UgYC5gIChjdXJyZW50IGRpcmVjdG9yeSkgYXMgdGhlCis8cmVwb3NpdG9yeT4gdG8gcHVsbCBmcm9tIHRoZSBsb2NhbCByZXBvc2l0b3J5IC0tIHRoaXMgaXMgdXNlZnVsCit3aGVuIG1lcmdpbmcgbG9jYWwgYnJhbmNoZXMgaW50byB0aGUgY3VycmVudCBicmFuY2guCisKKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6bWVyZ2Utb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpmZXRjaC1vcHRpb25zLnR4dFtdCisKK2luY2x1ZGU6OnB1bGwtZmV0Y2gtcGFyYW0udHh0W10KKworaW5jbHVkZTo6dXJscy50eHRbXQorCitpbmNsdWRlOjptZXJnZS1zdHJhdGVnaWVzLnR4dFtdCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitnaXQgcHVsbCwgZ2l0IHB1bGwgb3JpZ2luOjoKKwlGZXRjaCB0aGUgZGVmYXVsdCBoZWFkIGZyb20gdGhlIHJlcG9zaXRvcnkgeW91IGNsb25lZAorCWZyb20gYW5kIG1lcmdlIGl0IGludG8geW91ciBjdXJyZW50IGJyYW5jaC4KKworZ2l0IHB1bGwgLXMgb3VycyAuIG9ic29sZXRlOjoKKwlNZXJnZSBsb2NhbCBicmFuY2ggYG9ic29sZXRlYCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwKKwl1c2luZyBgb3Vyc2AgbWVyZ2Ugc3RyYXRlZ3kuCisKK2dpdCBwdWxsIC4gZml4ZXMgZW5oYW5jZW1lbnRzOjoKKwlCdW5kbGUgbG9jYWwgYnJhbmNoIGBmaXhlc2AgYW5kIGBlbmhhbmNlbWVudHNgIG9uIHRvcCBvZgorCXRoZSBjdXJyZW50IGJyYW5jaCwgbWFraW5nIGFuIE9jdG9wdXMgbWVyZ2UuCisKK2dpdCBwdWxsIC0tbm8tY29tbWl0IC4gbWFpbnQ6OgorCU1lcmdlIGxvY2FsIGJyYW5jaCBgbWFpbnRgIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLCBidXQKKwlkbyBub3QgbWFrZSBhIGNvbW1pdCBhdXRvbWF0aWNhbGx5LiAgVGhpcyBjYW4gYmUgdXNlZAorCXdoZW4geW91IHdhbnQgdG8gaW5jbHVkZSBmdXJ0aGVyIGNoYW5nZXMgdG8gdGhlIG1lcmdlLAorCW9yIHdhbnQgdG8gd3JpdGUgeW91ciBvd24gbWVyZ2UgY29tbWl0IG1lc3NhZ2UuCisrCitZb3Ugc2hvdWxkIHJlZnJhaW4gZnJvbSBhYnVzaW5nIHRoaXMgb3B0aW9uIHRvIHNuZWFrIHN1YnN0YW50aWFsCitjaGFuZ2VzIGludG8gYSBtZXJnZSBjb21taXQuICBTbWFsbCBmaXh1cHMgbGlrZSBidW1waW5nCityZWxlYXNlL3ZlcnNpb24gbmFtZSB3b3VsZCBiZSBhY2NlcHRhYmxlLgorCitDb21tYW5kIGxpbmUgcHVsbCBvZiBtdWx0aXBsZSBicmFuY2hlcyBmcm9tIG9uZSByZXBvc2l0b3J5OjoKKysKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjYXQgLmdpdC9yZW1vdGVzL29yaWdpbgorVVJMOiBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0CitQdWxsOiBtYXN0ZXI6b3JpZ2luCisKKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgZmV0Y2ggb3JpZ2luIG1hc3RlcjpvcmlnaW4gK3B1OnB1IG1haW50Om1haW50CiskIGdpdCBwdWxsIC4gb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKysKK0hlcmUsIGEgdHlwaWNhbCBgLmdpdC9yZW1vdGVzL29yaWdpbmAgZmlsZSBmcm9tIGEKK2BnaXQtY2xvbmVgIG9wZXJhdGlvbiBpcyB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKK2NvbW1hbmQgbGluZSBvcHRpb25zIHRvIGBnaXQtZmV0Y2hgIHRvIGZpcnN0IHVwZGF0ZQorbXVsdGlwbGUgYnJhbmNoZXMgb2YgdGhlIGxvY2FsIHJlcG9zaXRvcnkgYW5kIHRoZW4KK3RvIG1lcmdlIHRoZSByZW1vdGUgYG9yaWdpbmAgYnJhbmNoIGludG8gdGhlIGxvY2FsCitgbWFzdGVyYCBicmFuY2guICBUaGUgbG9jYWwgYHB1YCBicmFuY2ggaXMgdXBkYXRlZAorZXZlbiBpZiBpdCBkb2VzIG5vdCByZXN1bHQgaW4gYSBmYXN0IGZvcndhcmQgdXBkYXRlLgorSGVyZSwgdGhlIHB1bGwgY2FuIG9idGFpbiBpdHMgb2JqZWN0cyBmcm9tIHRoZSBsb2NhbAorcmVwb3NpdG9yeSB1c2luZyBgLmAsIGFzIHRoZSBwcmV2aW91cyBgZ2l0LWZldGNoYCBpcwora25vd24gdG8gaGF2ZSBhbHJlYWR5IG9idGFpbmVkIGFuZCBtYWRlIGF2YWlsYWJsZQorYWxsIHRoZSBuZWNlc3Nhcnkgb2JqZWN0cy4KKworCitQdWxsIG9mIG11bHRpcGxlIGJyYW5jaGVzIGZyb20gb25lIHJlcG9zaXRvcnkgdXNpbmcgYC5naXQvcmVtb3Rlc2AgZmlsZTo6CisrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvcmVtb3Rlcy9vcmlnaW4KK1VSTDogZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdAorUHVsbDogbWFzdGVyOm9yaWdpbgorUHVsbDogK3B1OnB1CitQdWxsOiBtYWludDptYWludAorCiskIGdpdCBjaGVja291dCBtYXN0ZXIKKyQgZ2l0IHB1bGwgb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKysKK0hlcmUsIGEgdHlwaWNhbCBgLmdpdC9yZW1vdGVzL29yaWdpbmAgZmlsZSBmcm9tIGEKK2BnaXQtY2xvbmVgIG9wZXJhdGlvbiBoYXMgYmVlbiBoYW5kLW1vZGlmaWVkIHRvIGluY2x1ZGUKK3RoZSBicmFuY2gtbWFwcGluZyBvZiBhZGRpdGlvbmFsIHJlbW90ZSBhbmQgbG9jYWwKK2hlYWRzIGRpcmVjdGx5LiAgQSBzaW5nbGUgYGdpdC1wdWxsYCBvcGVyYXRpb24gd2hpbGUKK2luIHRoZSBgbWFzdGVyYCBicmFuY2ggd2lsbCBmZXRjaCBtdWx0aXBsZSBoZWFkcyBhbmQKK21lcmdlIHRoZSByZW1vdGUgYG9yaWdpbmAgaGVhZCBpbnRvIHRoZSBjdXJyZW50LAorbG9jYWwgYG1hc3RlcmAgYnJhbmNoLgorCisKK0lmIHlvdSB0cmllZCBhIHB1bGwgd2hpY2ggcmVzdWx0ZWQgaW4gYSBjb21wbGV4IGNvbmZsaWN0cyBhbmQKK3dvdWxkIHdhbnQgdG8gc3RhcnQgb3ZlciwgeW91IGNhbiByZWNvdmVyIHdpdGgKK2dpdGxpbms6Z2l0LXJlc2V0WzFdLgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtZmV0Y2hbMV0sIGdpdGxpbms6Z2l0LW1lcmdlWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorYW5kIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSm9uIExvZWxpZ2VyLAorRGF2aWQgR3JlYXZlcywKK0p1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcHVzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wdXNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWI1Y2ExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcHVzaC50eHQKQEAgLTAsMCArMSw4NyBAQAorZ2l0LXB1c2goMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wdXNoIC0gVXBkYXRlIHJlbW90ZSByZWZzIGFsb25nIHdpdGggYXNzb2NpYXRlZCBvYmplY3RzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXB1c2gnIFstLWFsbF0gWy0tdGFnc10gWy0tZm9yY2VdIDxyZXBvc2l0b3J5PiA8cmVmc3BlYz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1VwZGF0ZXMgcmVtb3RlIHJlZnMgdXNpbmcgbG9jYWwgcmVmcywgd2hpbGUgc2VuZGluZyBvYmplY3RzCituZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIGdpdmVuIHJlZnMuCisKK1lvdSBjYW4gbWFrZSBpbnRlcmVzdGluZyB0aGluZ3MgaGFwcGVuIHRvIGEgcmVwb3NpdG9yeQorZXZlcnkgdGltZSB5b3UgcHVzaCBpbnRvIGl0LCBieSBzZXR0aW5nIHVwICdob29rcycgdGhlcmUuICBTZWUKK2RvY3VtZW50YXRpb24gZm9yIGdpdGxpbms6Z2l0LXJlY2VpdmUtcGFja1sxXS4KKworCitPUFRJT05TCistLS0tLS0tCis8cmVwb3NpdG9yeT46OgorCVRoZSAicmVtb3RlIiByZXBvc2l0b3J5IHRoYXQgaXMgZGVzdGluYXRpb24gb2YgYSBwdXNoCisJb3BlcmF0aW9uLiAgU2VlIHRoZSBzZWN0aW9uIDw8VVJMUyxHSVQgVVJMUz4+IGJlbG93LgorCis8cmVmc3BlYz46OgorCVRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGEgPHJlZnNwZWM+IHBhcmFtZXRlciBpcworCWArPzxzcmM+Ojxkc3Q+YDsgdGhhdCBpcywgYW4gb3B0aW9uYWwgcGx1cyBgK2AsIGZvbGxvd2VkCisJYnkgdGhlIHNvdXJjZSByZWYsIGZvbGxvd2VkIGJ5IGEgY29sb24gYDpgLCBmb2xsb3dlZCBieQorCXRoZSBkZXN0aW5hdGlvbiByZWYuCisrCitUaGUgPHNyYz4gc2lkZSBjYW4gYmUgYW4KK2FyYml0cmFyeSAiU0hBMSBleHByZXNzaW9uIiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuCithcmd1bWVudCB0byBgZ2l0LWNhdC1maWxlIC10YC4gIEUuZy4gYG1hc3Rlcn40YCAocHVzaAorZm91ciBwYXJlbnRzIGJlZm9yZSB0aGUgY3VycmVudCBtYXN0ZXIgaGVhZCkuCisrCitUaGUgbG9jYWwgcmVmIHRoYXQgbWF0Y2hlcyA8c3JjPiBpcyB1c2VkCit0byBmYXN0IGZvcndhcmQgdGhlIHJlbW90ZSByZWYgdGhhdCBtYXRjaGVzIDxkc3Q+LiAgSWYKK3RoZSBvcHRpb25hbCBwbHVzIGArYCBpcyB1c2VkLCB0aGUgcmVtb3RlIHJlZiBpcyB1cGRhdGVkCitldmVuIGlmIGl0IGRvZXMgbm90IHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZCB1cGRhdGUuCisrCitOb3RlOiBJZiBubyBleHBsaWNpdCByZWZzcGVjIGlzIGZvdW5kLCAodGhhdCBpcyBuZWl0aGVyCitvbiB0aGUgY29tbWFuZCBsaW5lIG5vciBpbiBhbnkgUHVzaCBsaW5lIG9mIHRoZQorY29ycmVzcG9uZGluZyByZW1vdGVzIGZpbGUtLS1zZWUgYmVsb3cpLCB0aGVuIGFsbCB0aGUKK3JlZnMgdGhhdCBleGlzdCBib3RoIG9uIHRoZSBsb2NhbCBzaWRlIGFuZCBvbiB0aGUgcmVtb3RlCitzaWRlIGFyZSB1cGRhdGVkLgorKworU29tZSBzaG9ydC1jdXQgbm90YXRpb25zIGFyZSBhbHNvIHN1cHBvcnRlZC4KKysKKyogYHRhZyA8dGFnPmAgbWVhbnMgdGhlIHNhbWUgYXMgYHJlZnMvdGFncy88dGFnPjpyZWZzL3RhZ3MvPHRhZz5gLgorKiBBIHBhcmFtZXRlciA8cmVmPiB3aXRob3V0IGEgY29sb24gaXMgZXF1aXZhbGVudCB0bworICA8cmVmPmA6YDxyZWY+LCBoZW5jZSB1cGRhdGVzIDxyZWY+IGluIHRoZSBkZXN0aW5hdGlvbiBmcm9tIDxyZWY+CisgIGluIHRoZSBzb3VyY2UuCisKK1wtLWFsbDo6CisJSW5zdGVhZCBvZiBuYW1pbmcgZWFjaCByZWYgdG8gcHVzaCwgc3BlY2lmaWVzIHRoYXQgYWxsCisJcmVmcyBiZSBwdXNoZWQuCisKK1wtLXRhZ3M6OgorCUFsbCByZWZzIHVuZGVyIGAkR0lUX0RJUi9yZWZzL3RhZ3NgIGFyZSBwdXNoZWQsIGluCisJYWRkaXRpb24gdG8gcmVmc3BlY3MgZXhwbGljaXRseSBsaXN0ZWQgb24gdGhlIGNvbW1hbmQKKwlsaW5lLgorCistZiwgXC0tZm9yY2U6OgorCVVzdWFsbHksIHRoZSBjb21tYW5kIHJlZnVzZXMgdG8gdXBkYXRlIGEgcmVtb3RlIHJlZiB0aGF0IGlzCisJbm90IGEgZGVzY2VuZGVudCBvZiB0aGUgbG9jYWwgcmVmIHVzZWQgdG8gb3ZlcndyaXRlIGl0LgorCVRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2suICBUaGlzIGNhbiBjYXVzZSB0aGUKKwlyZW1vdGUgcmVwb3NpdG9yeSB0byBsb3NlIGNvbW1pdHM7IHVzZSBpdCB3aXRoIGNhcmUuCisKK2luY2x1ZGU6OnVybHMudHh0W10KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXF1aWx0aW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXF1aWx0aW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTlhOGMzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcXVpbHRpbXBvcnQudHh0CkBAIC0wLDAgKzEsNjEgQEAKK2dpdC1xdWlsdGltcG9ydCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcXVpbHRpbXBvcnQgLSBBcHBsaWVzIGEgcXVpbHQgcGF0Y2hzZXQgb250byB0aGUgY3VycmVudCBicmFuY2gKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcXVpbHRpbXBvcnQnIFstLWRyeS1ydW5dIFstLWF1dGhvciA8YXV0aG9yPl0gWy0tcGF0Y2hlcyA8ZGlyPl0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0FwcGxpZXMgYSBxdWlsdCBwYXRjaHNldCBvbnRvIHRoZSBjdXJyZW50IGdpdCBicmFuY2gsIHByZXNlcnZpbmcKK3RoZSBwYXRjaCBib3VuZGFyaWVzLCBwYXRjaCBvcmRlciwgYW5kIHBhdGNoIGRlc2NyaXB0aW9ucyBwcmVzZW50CitpbiB0aGUgcXVpbHQgcGF0Y2hzZXQuCisKK0ZvciBlYWNoIHBhdGNoIHRoZSBjb2RlIGF0dGVtcHRzIHRvIGV4dHJhY3QgdGhlIGF1dGhvciBmcm9tIHRoZQorcGF0Y2ggZGVzY3JpcHRpb24uICBJZiB0aGF0IGZhaWxzIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGF1dGhvcgorc3BlY2lmaWVkIHdpdGggLS1hdXRob3IuICBJZiB0aGUgLS1hdXRob3IgZmxhZyB3YXMgbm90IGdpdmVuCit0aGUgcGF0Y2ggZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkIGFuZCB0aGUgdXNlciBpcyBhc2tlZCB0bworaW50ZXJhY3RpdmVseSBlbnRlciB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4KKworSWYgYSBzdWJqZWN0IGlzIG5vdCBmb3VuZCBpbiB0aGUgcGF0Y2ggZGVzY3JpcHRpb24gdGhlIHBhdGNoIG5hbWUgaXMKK3ByZXNlcnZlZCBhcyB0aGUgMSBsaW5lIHN1YmplY3QgaW4gdGhlIGdpdCBkZXNjcmlwdGlvbi4KKworT1BUSU9OUworLS0tLS0tLQorLS1kcnktcnVuOjoKKwlXYWxrIHRocm91Z2ggdGhlIHBhdGNoZXMgaW4gdGhlIHNlcmllcyBhbmQgd2FybgorCWlmIHdlIGNhbm5vdCBmaW5kIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGNvbW1pdAorCWEgcGF0Y2guICBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcgb25seSBtaXNzaW5nIGF1dGhvcgorCWluZm9ybWF0aW9uIGlzIHdhcm5lZCBhYm91dC4KKworLS1hdXRob3IgQXV0aG9yIE5hbWUgPEF1dGhvciBFbWFpbD46OgorCVRoZSBhdXRob3IgbmFtZSBhbmQgZW1haWwgYWRkcmVzcyB0byB1c2Ugd2hlbiBubyBhdXRob3IKKwlpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGNoIGRlc2NyaXB0aW9uLgorCistLXBhdGNoZXMgPGRpcj46OgorCVRoZSBkaXJlY3RvcnkgdG8gZmluZCB0aGUgcXVpbHQgcGF0Y2hlcyBhbmQgdGhlCisJcXVpbHQgc2VyaWVzIGZpbGUuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgZm9yIHRoZSBwYXRjaCBkaXJlY3RvcnkgaXMgcGF0Y2hlcworCW9yIHRoZSB2YWx1ZSBvZiB0aGUgJFFVSUxUX1BBVENIRVMgZW52aXJvbm1lbnQKKwl2YXJpYWJsZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQGxueGkuY29tPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1AbG54aS5jb20+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZWFkLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODk0ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dApAQCAtMCwwICsxLDMyMyBAQAorZ2l0LXJlYWQtdHJlZSgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVhZC10cmVlIC0gUmVhZHMgdHJlZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBpbmRleAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZWFkLXRyZWUnICg8dHJlZS1pc2g+IHwgW1stbSBbLS1hZ2dyZXNzaXZlXXwgLS1yZXNldF0gWy11IHwgLWldXSA8dHJlZS1pc2gxPiBbPHRyZWUtaXNoMj4gWzx0cmVlLWlzaDM+XV0pCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyB0aGUgdHJlZSBpbmZvcm1hdGlvbiBnaXZlbiBieSA8dHJlZS1pc2g+IGludG8gdGhlIGluZGV4LAorYnV0IGRvZXMgbm90IGFjdHVhbGx5ICp1cGRhdGUqIGFueSBvZiB0aGUgZmlsZXMgaXQgImNhY2hlcyIuIChzZWU6CitnaXRsaW5rOmdpdC1jaGVja291dC1pbmRleFsxXSkKKworT3B0aW9uYWxseSwgaXQgY2FuIG1lcmdlIGEgdHJlZSBpbnRvIHRoZSBpbmRleCwgcGVyZm9ybSBhCitmYXN0LWZvcndhcmQgKGkuZS4gMi13YXkpIG1lcmdlLCBvciBhIDMtd2F5IG1lcmdlLCB3aXRoIHRoZSBgLW1gCitmbGFnLiAgV2hlbiB1c2VkIHdpdGggYC1tYCwgdGhlIGAtdWAgZmxhZyBjYXVzZXMgaXQgdG8gYWxzbyB1cGRhdGUKK3RoZSBmaWxlcyBpbiB0aGUgd29yayB0cmVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisKK1RyaXZpYWwgbWVyZ2VzIGFyZSBkb25lIGJ5IGBnaXQtcmVhZC10cmVlYCBpdHNlbGYuICBPbmx5IGNvbmZsaWN0aW5nIHBhdGhzCit3aWxsIGJlIGluIHVubWVyZ2VkIHN0YXRlIHdoZW4gYGdpdC1yZWFkLXRyZWVgIHJldHVybnMuCisKK09QVElPTlMKKy0tLS0tLS0KKy1tOjoKKwlQZXJmb3JtIGEgbWVyZ2UsIG5vdCBqdXN0IGEgcmVhZC4gIFRoZSBjb21tYW5kIHdpbGwKKwlyZWZ1c2UgdG8gcnVuIGlmIHlvdXIgaW5kZXggZmlsZSBoYXMgdW5tZXJnZWQgZW50cmllcywKKwlpbmRpY2F0aW5nIHRoYXQgeW91IGhhdmUgbm90IGZpbmlzaGVkIHByZXZpb3VzIG1lcmdlIHlvdQorCXN0YXJ0ZWQuCisKKy0tcmVzZXQ6OgorICAgICAgICBTYW1lIGFzIC1tLCBleGNlcHQgdGhhdCB1bm1lcmdlZCBlbnRyaWVzIGFyZSBkaXNjYXJkZWQKKyAgICAgICAgaW5zdGVhZCBvZiBmYWlsaW5nLgorCistdTo6CisJQWZ0ZXIgYSBzdWNjZXNzZnVsIG1lcmdlLCB1cGRhdGUgdGhlIGZpbGVzIGluIHRoZSB3b3JrCisJdHJlZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCistaTo6CisJVXN1YWxseSBhIG1lcmdlIHJlcXVpcmVzIHRoZSBpbmRleCBmaWxlIGFzIHdlbGwgYXMgdGhlCisJZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcmUgdXAgdG8gZGF0ZSB3aXRoIHRoZQorCWN1cnJlbnQgaGVhZCBjb21taXQsIGluIG9yZGVyIG5vdCB0byBsb3NlIGxvY2FsCisJY2hhbmdlcy4gIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2sgd2l0aCB0aGUgd29ya2luZworCXRyZWUgYW5kIGlzIG1lYW50IHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIG1lcmdlIG9mCisJdHJlZXMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQKKwl3b3JraW5nIHRyZWUgc3RhdHVzIGludG8gYSB0ZW1wb3JhcnkgaW5kZXggZmlsZS4KKworLS1hZ2dyZXNzaXZlOjoKKwlVc3VhbGx5IGEgdGhyZWUtd2F5IG1lcmdlIGJ5IGBnaXQtcmVhZC10cmVlYCByZXNvbHZlcworCXRoZSBtZXJnZSBmb3IgcmVhbGx5IHRyaXZpYWwgY2FzZXMgYW5kIGxlYXZlcyBvdGhlcgorCWNhc2VzIHVucmVzb2x2ZWQgaW4gdGhlIGluZGV4LCBzbyB0aGF0IFBvcmNlbGFpbnMgY2FuCisJaW1wbGVtZW50IGRpZmZlcmVudCBtZXJnZSBwb2xpY2llcy4gIFRoaXMgZmxhZyBtYWtlcyB0aGUKKwljb21tYW5kIHRvIHJlc29sdmUgYSBmZXcgbW9yZSBjYXNlcyBpbnRlcm5hbGx5OgorKworKiB3aGVuIG9uZSBzaWRlIHJlbW92ZXMgYSBwYXRoIGFuZCB0aGUgb3RoZXIgc2lkZSBsZWF2ZXMgdGhlIHBhdGgKKyAgdW5tb2RpZmllZC4gIFRoZSByZXNvbHV0aW9uIGlzIHRvIHJlbW92ZSB0aGF0IHBhdGguCisqIHdoZW4gYm90aCBzaWRlcyByZW1vdmUgYSBwYXRoLiAgVGhlIHJlc29sdXRpb24gaXMgdG8gcmVtb3ZlIHRoYXQgcGF0aC4KKyogd2hlbiBib3RoIHNpZGVzIGFkZHMgYSBwYXRoIGlkZW50aWNhbGx5LiAgVGhlIHJlc29sdXRpb24KKyAgaXMgdG8gYWRkIHRoYXQgcGF0aC4KKworPHRyZWUtaXNoIz46OgorCVRoZSBpZCBvZiB0aGUgdHJlZSBvYmplY3QocykgdG8gYmUgcmVhZC9tZXJnZWQuCisKKworTWVyZ2luZworLS0tLS0tLQorSWYgYC1tYCBpcyBzcGVjaWZpZWQsIGBnaXQtcmVhZC10cmVlYCBjYW4gcGVyZm9ybSAzIGtpbmRzIG9mCittZXJnZSwgYSBzaW5nbGUgdHJlZSBtZXJnZSBpZiBvbmx5IDEgdHJlZSBpcyBnaXZlbiwgYQorZmFzdC1mb3J3YXJkIG1lcmdlIHdpdGggMiB0cmVlcywgb3IgYSAzLXdheSBtZXJnZSBpZiAzIHRyZWVzIGFyZQorcHJvdmlkZWQuCisKKworU2luZ2xlIFRyZWUgTWVyZ2UKK35+fn5+fn5+fn5+fn5+fn5+CitJZiBvbmx5IDEgdHJlZSBpcyBzcGVjaWZpZWQsIGdpdC1yZWFkLXRyZWUgb3BlcmF0ZXMgYXMgaWYgdGhlIHVzZXIgZGlkIG5vdAorc3BlY2lmeSBgLW1gLCBleGNlcHQgdGhhdCBpZiB0aGUgb3JpZ2luYWwgaW5kZXggaGFzIGFuIGVudHJ5IGZvciBhCitnaXZlbiBwYXRobmFtZSwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgcGF0aCBtYXRjaGVzIHdpdGggdGhlIHRyZWUKK2JlaW5nIHJlYWQsIHRoZSBzdGF0IGluZm8gZnJvbSB0aGUgaW5kZXggaXMgdXNlZC4gKEluIG90aGVyIHdvcmRzLCB0aGUKK2luZGV4J3Mgc3RhdCgpcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgbWVyZ2VkIHRyZWUncykuCisKK1RoYXQgbWVhbnMgdGhhdCBpZiB5b3UgZG8gYSBgZ2l0LXJlYWQtdHJlZSAtbSA8bmV3dHJlZT5gIGZvbGxvd2VkIGJ5IGEKK2BnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWFgLCB0aGUgYGdpdC1jaGVja291dC1pbmRleGAgb25seSBjaGVja3Mgb3V0Cit0aGUgc3R1ZmYgdGhhdCByZWFsbHkgY2hhbmdlZC4KKworVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGZhbHNlIGhpdHMgd2hlbiBgZ2l0LWRpZmYtZmlsZXNgIGlzCitydW4gYWZ0ZXIgYGdpdC1yZWFkLXRyZWVgLgorCisKK1R3byBUcmVlIE1lcmdlCit+fn5+fn5+fn5+fn5+fgorCitUeXBpY2FsbHksIHRoaXMgaXMgaW52b2tlZCBhcyBgZ2l0LXJlYWQtdHJlZSAtbSAkSCAkTWAsIHdoZXJlICRICitpcyB0aGUgaGVhZCBjb21taXQgb2YgdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSwgYW5kICRNIGlzIHRoZSBoZWFkCitvZiBhIGZvcmVpZ24gdHJlZSwgd2hpY2ggaXMgc2ltcGx5IGFoZWFkIG9mICRIIChpLmUuIHdlIGFyZSBpbiBhCitmYXN0IGZvcndhcmQgc2l0dWF0aW9uKS4KKworV2hlbiB0d28gdHJlZXMgYXJlIHNwZWNpZmllZCwgdGhlIHVzZXIgaXMgdGVsbGluZyBnaXQtcmVhZC10cmVlCit0aGUgZm9sbG93aW5nOgorCisgICAgIDEuIFRoZSBjdXJyZW50IGluZGV4IGFuZCB3b3JrIHRyZWUgaXMgZGVyaXZlZCBmcm9tICRILCBidXQKKyAgICAgICAgdGhlIHVzZXIgbWF5IGhhdmUgbG9jYWwgY2hhbmdlcyBpbiB0aGVtIHNpbmNlICRIOworCisgICAgIDIuIFRoZSB1c2VyIHdhbnRzIHRvIGZhc3QtZm9yd2FyZCB0byAkTS4KKworSW4gdGhpcyBjYXNlLCB0aGUgYGdpdC1yZWFkLXRyZWUgLW0gJEggJE1gIGNvbW1hbmQgbWFrZXMgc3VyZQordGhhdCBubyBsb2NhbCBjaGFuZ2UgaXMgbG9zdCBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgIm1lcmdlIi4KK0hlcmUgYXJlIHRoZSAiY2FycnkgZm9yd2FyZCIgcnVsZXM6CisKKyAgICAgICAgSSAoaW5kZXgpICAgICAgICAgICBIICAgICAgICBNICAgICAgICBSZXN1bHQKKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAwIG5vdGhpbmcgICAgICAgICAgICAgbm90aGluZyAgbm90aGluZyAgKGRvZXMgbm90IGhhcHBlbikKKyAgICAgIDEgbm90aGluZyAgICAgICAgICAgICBub3RoaW5nICBleGlzdHMgICB1c2UgTQorICAgICAgMiBub3RoaW5nICAgICAgICAgICAgIGV4aXN0cyAgIG5vdGhpbmcgIHJlbW92ZSBwYXRoIGZyb20gaW5kZXgKKyAgICAgIDMgbm90aGluZyAgICAgICAgICAgICBleGlzdHMgICBleGlzdHMgICB1c2UgTQorCisgICAgICAgIGNsZWFuIEk9PUggIEk9PU0KKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIDQgeWVzICAgTi9BICAgTi9BICAgICBub3RoaW5nICBub3RoaW5nICBrZWVwIGluZGV4CisgICAgICA1IG5vICAgIE4vQSAgIE4vQSAgICAgbm90aGluZyAgbm90aGluZyAga2VlcCBpbmRleAorCisgICAgICA2IHllcyAgIE4vQSAgIHllcyAgICAgbm90aGluZyAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAgNyBubyAgICBOL0EgICB5ZXMgICAgIG5vdGhpbmcgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKyAgICAgIDggeWVzICAgTi9BICAgbm8gICAgICBub3RoaW5nICBleGlzdHMgICBmYWlsCisgICAgICA5IG5vICAgIE4vQSAgIG5vICAgICAgbm90aGluZyAgZXhpc3RzICAgZmFpbAorCisgICAgIDEwIHllcyAgIHllcyAgIE4vQSAgICAgZXhpc3RzICAgbm90aGluZyAgcmVtb3ZlIHBhdGggZnJvbSBpbmRleAorICAgICAxMSBubyAgICB5ZXMgICBOL0EgICAgIGV4aXN0cyAgIG5vdGhpbmcgIGZhaWwKKyAgICAgMTIgeWVzICAgbm8gICAgTi9BICAgICBleGlzdHMgICBub3RoaW5nICBmYWlsCisgICAgIDEzIG5vICAgIG5vICAgIE4vQSAgICAgZXhpc3RzICAgbm90aGluZyAgZmFpbAorCisgICAgICAgIGNsZWFuIChIPU0pCisgICAgICAgLS0tLS0tCisgICAgIDE0IHllcyAgICAgICAgICAgICAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAxNSBubyAgICAgICAgICAgICAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKworICAgICAgICBjbGVhbiBJPT1IICBJPT1NIChIIT1NKQorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAxNiB5ZXMgICBubyAgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGZhaWwKKyAgICAgMTcgbm8gICAgbm8gICAgbm8gICAgICBleGlzdHMgICBleGlzdHMgICBmYWlsCisgICAgIDE4IHllcyAgIG5vICAgIHllcyAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAxOSBubyAgICBubyAgICB5ZXMgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKyAgICAgMjAgeWVzICAgeWVzICAgbm8gICAgICBleGlzdHMgICBleGlzdHMgICB1c2UgTQorICAgICAyMSBubyAgICB5ZXMgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGZhaWwKKworSW4gYWxsICJrZWVwIGluZGV4IiBjYXNlcywgdGhlIGluZGV4IGVudHJ5IHN0YXlzIGFzIGluIHRoZQorb3JpZ2luYWwgaW5kZXggZmlsZS4gIElmIHRoZSBlbnRyeSB3ZXJlIG5vdCB1cCB0byBkYXRlLAorZ2l0LXJlYWQtdHJlZSBrZWVwcyB0aGUgY29weSBpbiB0aGUgd29yayB0cmVlIGludGFjdCB3aGVuCitvcGVyYXRpbmcgdW5kZXIgdGhlIC11IGZsYWcuCisKK1doZW4gdGhpcyBmb3JtIG9mIGdpdC1yZWFkLXRyZWUgcmV0dXJucyBzdWNjZXNzZnVsbHksIHlvdSBjYW4KK3NlZSB3aGF0ICJsb2NhbCBjaGFuZ2VzIiB5b3UgbWFkZSBhcmUgY2FycmllZCBmb3J3YXJkIGJ5IHJ1bm5pbmcKK2BnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkTWAuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAorbmVjZXNzYXJpbHkgbWF0Y2ggYGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkICRIYCB3b3VsZCBoYXZlCitwcm9kdWNlZCBiZWZvcmUgc3VjaCBhIHR3byB0cmVlIG1lcmdlLiAgVGhpcyBpcyBiZWNhdXNlIG9mIGNhc2VzCisxOCBhbmQgMTkgLS0tIGlmIHlvdSBhbHJlYWR5IGhhZCB0aGUgY2hhbmdlcyBpbiAkTSAoZS5nLiBtYXliZQoreW91IHBpY2tlZCBpdCB1cCB2aWEgZS1tYWlsIGluIGEgcGF0Y2ggZm9ybSksIGBnaXQtZGlmZi1pbmRleAorLS1jYWNoZWQgJEhgIHdvdWxkIGhhdmUgdG9sZCB5b3UgYWJvdXQgdGhlIGNoYW5nZSBiZWZvcmUgdGhpcworbWVyZ2UsIGJ1dCBpdCB3b3VsZCBub3Qgc2hvdyBpbiBgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJE1gCitvdXRwdXQgYWZ0ZXIgdHdvLXRyZWUgbWVyZ2UuCisKKworMy1XYXkgTWVyZ2UKK35+fn5+fn5+fn5+CitFYWNoICJpbmRleCIgZW50cnkgaGFzIHR3byBiaXRzIHdvcnRoIG9mICJzdGFnZSIgc3RhdGUuIHN0YWdlIDAgaXMgdGhlCitub3JtYWwgb25lLCBhbmQgaXMgdGhlIG9ubHkgb25lIHlvdSdkIHNlZSBpbiBhbnkga2luZCBvZiBub3JtYWwgdXNlLgorCitIb3dldmVyLCB3aGVuIHlvdSBkbyBgZ2l0LXJlYWQtdHJlZWAgd2l0aCB0aHJlZSB0cmVlcywgdGhlICJzdGFnZSIKK3N0YXJ0cyBvdXQgYXQgMS4KKworVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gZG8KKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tIDx0cmVlMT4gPHRyZWUyPiA8dHJlZTM+CistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhbiBpbmRleCB3aXRoIGFsbCBvZiB0aGUgPHRyZWUxPiBlbnRyaWVzIGluCisic3RhZ2UxIiwgYWxsIG9mIHRoZSA8dHJlZTI+IGVudHJpZXMgaW4gInN0YWdlMiIgYW5kIGFsbCBvZiB0aGUKKzx0cmVlMz4gZW50cmllcyBpbiAic3RhZ2UzIi4gIFdoZW4gcGVyZm9ybWluZyBhIG1lcmdlIG9mIGFub3RoZXIKK2JyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgd2UgdXNlIHRoZSBjb21tb24gYW5jZXN0b3IgdHJlZQorYXMgPHRyZWUxPiwgdGhlIGN1cnJlbnQgYnJhbmNoIGhlYWQgYXMgPHRyZWUyPiwgYW5kIHRoZSBvdGhlcgorYnJhbmNoIGhlYWQgYXMgPHRyZWUzPi4KKworRnVydGhlcm1vcmUsIGBnaXQtcmVhZC10cmVlYCBoYXMgc3BlY2lhbC1jYXNlIGxvZ2ljIHRoYXQgc2F5czogaWYgeW91IHNlZQorYSBmaWxlIHRoYXQgbWF0Y2hlcyBpbiBhbGwgcmVzcGVjdHMgaW4gdGhlIGZvbGxvd2luZyBzdGF0ZXMsIGl0CisiY29sbGFwc2VzIiBiYWNrIHRvICJzdGFnZTAiOgorCisgICAtIHN0YWdlIDIgYW5kIDMgYXJlIHRoZSBzYW1lOyB0YWtlIG9uZSBvciB0aGUgb3RoZXIgKGl0IG1ha2VzIG5vCisgICAgIGRpZmZlcmVuY2UgLSB0aGUgc2FtZSB3b3JrIGhhcyBiZWVuIGRvbmUgb24gb3VyIGJyYW5jaCBpbgorICAgICBzdGFnZSAyIGFuZCB0aGVpciBicmFuY2ggaW4gc3RhZ2UgMykKKworICAgLSBzdGFnZSAxIGFuZCBzdGFnZSAyIGFyZSB0aGUgc2FtZSBhbmQgc3RhZ2UgMyBpcyBkaWZmZXJlbnQ7IHRha2UKKyAgICAgc3RhZ2UgMyAob3VyIGJyYW5jaCBpbiBzdGFnZSAyIGRpZCBub3QgZG8gYW55dGhpbmcgc2luY2UgdGhlCisgICAgIGFuY2VzdG9yIGluIHN0YWdlIDEgd2hpbGUgdGhlaXIgYnJhbmNoIGluIHN0YWdlIDMgd29ya2VkIG9uCisgICAgIGl0KQorCisgICAtIHN0YWdlIDEgYW5kIHN0YWdlIDMgYXJlIHRoZSBzYW1lIGFuZCBzdGFnZSAyIGlzIGRpZmZlcmVudCB0YWtlCisgICAgIHN0YWdlIDIgKHdlIGRpZCBzb21ldGhpbmcgd2hpbGUgdGhleSBkaWQgbm90aGluZykKKworVGhlIGBnaXQtd3JpdGUtdHJlZWAgY29tbWFuZCByZWZ1c2VzIHRvIHdyaXRlIGEgbm9uc2Vuc2ljYWwgdHJlZSwgYW5kIGl0Cit3aWxsIGNvbXBsYWluIGFib3V0IHVubWVyZ2VkIGVudHJpZXMgaWYgaXQgc2VlcyBhIHNpbmdsZSBlbnRyeSB0aGF0IGlzIG5vdAorc3RhZ2UgMC4KKworT0ssIHRoaXMgYWxsIHNvdW5kcyBsaWtlIGEgY29sbGVjdGlvbiBvZiB0b3RhbGx5IG5vbnNlbnNpY2FsIHJ1bGVzLAorYnV0IGl0J3MgYWN0dWFsbHkgZXhhY3RseSB3aGF0IHlvdSB3YW50IGluIG9yZGVyIHRvIGRvIGEgZmFzdAorbWVyZ2UuIFRoZSBkaWZmZXJlbnQgc3RhZ2VzIHJlcHJlc2VudCB0aGUgInJlc3VsdCB0cmVlIiAoc3RhZ2UgMCwgYWthCisibWVyZ2VkIiksIHRoZSBvcmlnaW5hbCB0cmVlIChzdGFnZSAxLCBha2EgIm9yaWciKSwgYW5kIHRoZSB0d28gdHJlZXMKK3lvdSBhcmUgdHJ5aW5nIHRvIG1lcmdlIChzdGFnZSAyIGFuZCAzIHJlc3BlY3RpdmVseSkuCisKK1RoZSBvcmRlciBvZiBzdGFnZXMgMSwgMiBhbmQgMyAoaGVuY2UgdGhlIG9yZGVyIG9mIHRocmVlCis8dHJlZS1pc2g+IGNvbW1hbmQgbGluZSBhcmd1bWVudHMpIGFyZSBzaWduaWZpY2FudCB3aGVuIHlvdQorc3RhcnQgYSAzLXdheSBtZXJnZSB3aXRoIGFuIGluZGV4IGZpbGUgdGhhdCBpcyBhbHJlYWR5Citwb3B1bGF0ZWQuICBIZXJlIGlzIGFuIG91dGxpbmUgb2YgaG93IHRoZSBhbGdvcml0aG0gd29ya3M6CisKKy0gaWYgYSBmaWxlIGV4aXN0cyBpbiBpZGVudGljYWwgZm9ybWF0IGluIGFsbCB0aHJlZSB0cmVlcywgaXQgd2lsbAorICBhdXRvbWF0aWNhbGx5IGNvbGxhcHNlIHRvICJtZXJnZWQiIHN0YXRlIGJ5IGdpdC1yZWFkLXRyZWUuCisKKy0gYSBmaWxlIHRoYXQgaGFzIF9hbnlfIGRpZmZlcmVuY2Ugd2hhdC1zby1ldmVyIGluIHRoZSB0aHJlZSB0cmVlcworICB3aWxsIHN0YXkgYXMgc2VwYXJhdGUgZW50cmllcyBpbiB0aGUgaW5kZXguIEl0J3MgdXAgdG8gInBvcmNlbGFpbgorICBwb2xpY3kiIHRvIGRldGVybWluZSBob3cgdG8gcmVtb3ZlIHRoZSBub24tMCBzdGFnZXMsIGFuZCBpbnNlcnQgYQorICBtZXJnZWQgdmVyc2lvbi4KKworLSB0aGUgaW5kZXggZmlsZSBzYXZlcyBhbmQgcmVzdG9yZXMgd2l0aCBhbGwgdGhpcyBpbmZvcm1hdGlvbiwgc28geW91CisgIGNhbiBtZXJnZSB0aGluZ3MgaW5jcmVtZW50YWxseSwgYnV0IGFzIGxvbmcgYXMgaXQgaGFzIGVudHJpZXMgaW4KKyAgc3RhZ2VzIDEvMi8zIChpLmUuLCAidW5tZXJnZWQgZW50cmllcyIpIHlvdSBjYW4ndCB3cml0ZSB0aGUgcmVzdWx0LiBTbworICBub3cgdGhlIG1lcmdlIGFsZ29yaXRobSBlbmRzIHVwIGJlaW5nIHJlYWxseSBzaW1wbGU6CisKKyAgKiB5b3Ugd2FsayB0aGUgaW5kZXggaW4gb3JkZXIsIGFuZCBpZ25vcmUgYWxsIGVudHJpZXMgb2Ygc3RhZ2UgMCwKKyAgICBzaW5jZSB0aGV5J3ZlIGFscmVhZHkgYmVlbiBkb25lLgorCisgICogaWYgeW91IGZpbmQgYSAic3RhZ2UxIiwgYnV0IG5vIG1hdGNoaW5nICJzdGFnZTIiIG9yICJzdGFnZTMiLCB5b3UKKyAgICBrbm93IGl0J3MgYmVlbiByZW1vdmVkIGZyb20gYm90aCB0cmVlcyAoaXQgb25seSBleGlzdGVkIGluIHRoZQorICAgIG9yaWdpbmFsIHRyZWUpLCBhbmQgeW91IHJlbW92ZSB0aGF0IGVudHJ5LgorCisgICogaWYgeW91IGZpbmQgYSBtYXRjaGluZyAic3RhZ2UyIiBhbmQgInN0YWdlMyIgdHJlZSwgeW91IHJlbW92ZSBvbmUKKyAgICBvZiB0aGVtLCBhbmQgdHVybiB0aGUgb3RoZXIgaW50byBhICJzdGFnZTAiIGVudHJ5LiBSZW1vdmUgYW55CisgICAgbWF0Y2hpbmcgInN0YWdlMSIgZW50cnkgaWYgaXQgZXhpc3RzIHRvby4gIC4uIGFsbCB0aGUgbm9ybWFsCisgICAgdHJpdmlhbCBydWxlcyAuLgorCitZb3Ugd291bGQgbm9ybWFsbHkgdXNlIGBnaXQtbWVyZ2UtaW5kZXhgIHdpdGggc3VwcGxpZWQKK2BnaXQtbWVyZ2Utb25lLWZpbGVgIHRvIGRvIHRoaXMgbGFzdCBzdGVwLiAgVGhlIHNjcmlwdCB1cGRhdGVzCit0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcyBpdCBtZXJnZXMgZWFjaCBwYXRoIGFuZCBhdCB0aGUKK2VuZCBvZiBhIHN1Y2Nlc3NmdWwgbWVyZ2UuCisKK1doZW4geW91IHN0YXJ0IGEgMy13YXkgbWVyZ2Ugd2l0aCBhbiBpbmRleCBmaWxlIHRoYXQgaXMgYWxyZWFkeQorcG9wdWxhdGVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhlCitmaWxlcyBpbiB5b3VyIHdvcmsgdHJlZSwgYW5kIHlvdSBjYW4gZXZlbiBoYXZlIGZpbGVzIHdpdGgKK2NoYW5nZXMgdW5yZWNvcmRlZCBpbiB0aGUgaW5kZXggZmlsZS4gIEl0IGlzIGZ1cnRoZXIgYXNzdW1lZAordGhhdCB0aGlzIHN0YXRlIGlzICJkZXJpdmVkIiBmcm9tIHRoZSBzdGFnZSAyIHRyZWUuICBUaGUgMy13YXkKK21lcmdlIHJlZnVzZXMgdG8gcnVuIGlmIGl0IGZpbmRzIGFuIGVudHJ5IGluIHRoZSBvcmlnaW5hbCBpbmRleAorZmlsZSB0aGF0IGRvZXMgbm90IG1hdGNoIHN0YWdlIDIuCisKK1RoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHlvdSBmcm9tIGxvc2luZyB5b3VyIHdvcmstaW4tcHJvZ3Jlc3MKK2NoYW5nZXMsIGFuZCBtaXhpbmcgeW91ciByYW5kb20gY2hhbmdlcyBpbiBhbiB1bnJlbGF0ZWQgbWVyZ2UKK2NvbW1pdC4gIFRvIGlsbHVzdHJhdGUsIHN1cHBvc2UgeW91IHN0YXJ0IGZyb20gd2hhdCBoYXMgYmVlbgorY29tbWl0dGVkIGxhc3QgdG8geW91ciByZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tCiskIEpDPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJIRUFEXjAiYAorJCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJEpDCistLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBkbyByYW5kb20gZWRpdHMsIHdpdGhvdXQgcnVubmluZyBnaXQtdXBkYXRlLWluZGV4LiAgQW5kIHRoZW4KK3lvdSBub3RpY2UgdGhhdCB0aGUgdGlwIG9mIHlvdXIgInVwc3RyZWFtIiB0cmVlIGhhcyBhZHZhbmNlZAorc2luY2UgeW91IHB1bGxlZCBmcm9tIGhpbToKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtZmV0Y2ggZ2l0Oi8vLi4uLiBsaW51cworJCBMVD1gY2F0IC5naXQvRkVUQ0hfSEVBRGAKKy0tLS0tLS0tLS0tLS0tLS0KKworWW91ciB3b3JrIHRyZWUgaXMgc3RpbGwgYmFzZWQgb24geW91ciBIRUFEICgkSkMpLCBidXQgeW91IGhhdmUKK3NvbWUgZWRpdHMgc2luY2UuICBUaHJlZS13YXkgbWVyZ2UgbWFrZXMgc3VyZSB0aGF0IHlvdSBoYXZlIG5vdAorYWRkZWQgb3IgbW9kaWZpZWQgaW5kZXggZW50cmllcyBzaW5jZSAkSkMsIGFuZCBpZiB5b3UgaGF2ZW4ndCwKK3RoZW4gZG9lcyB0aGUgcmlnaHQgdGhpbmcuICBTbyB3aXRoIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtbSAtdSBgZ2l0LW1lcmdlLWJhc2UgJEpDICRMVGAgJEpDICRMVAorJCBnaXQtbWVyZ2UtaW5kZXggZ2l0LW1lcmdlLW9uZS1maWxlIC1hCiskIGVjaG8gIk1lcmdlIHdpdGggTGludXMiIHwgXAorICBnaXQtY29tbWl0LXRyZWUgYGdpdC13cml0ZS10cmVlYCAtcCAkSkMgLXAgJExUCistLS0tLS0tLS0tLS0tLS0tCisKK3doYXQgeW91IHdvdWxkIGNvbW1pdCBpcyBhIHB1cmUgbWVyZ2UgYmV0d2VlbiAkSkMgYW5kICRMVCB3aXRob3V0Cit5b3VyIHdvcmstaW4tcHJvZ3Jlc3MgY2hhbmdlcywgYW5kIHlvdXIgd29yayB0cmVlIHdvdWxkIGJlCit1cGRhdGVkIHRvIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCitIb3dldmVyLCBpZiB5b3UgaGF2ZSBsb2NhbCBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUgdGhhdAord291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgdGhpcyBtZXJnZSxgZ2l0LXJlYWQtdHJlZWAgd2lsbCByZWZ1c2UKK3RvIHJ1biB0byBwcmV2ZW50IHlvdXIgY2hhbmdlcyBmcm9tIGJlaW5nIGxvc3QuCisKK0luIG90aGVyIHdvcmRzLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHdoYXQgZXhpc3RzIG9ubHkKK2luIHRoZSB3b3JraW5nIHRyZWUuICBXaGVuIHlvdSBoYXZlIGxvY2FsIGNoYW5nZXMgaW4gYSBwYXJ0IG9mCit0aGUgcHJvamVjdCB0aGF0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGUgbWVyZ2UsIHlvdXIgY2hhbmdlcyBkbworbm90IGludGVyZmVyZSB3aXRoIHRoZSBtZXJnZSwgYW5kIGFyZSBrZXB0IGludGFjdC4gIFdoZW4gdGhleQorKmRvKiBpbnRlcmZlcmUsIHRoZSBtZXJnZSBkb2VzIG5vdCBldmVuIHN0YXJ0IChgZ2l0LXJlYWQtdHJlZWAKK2NvbXBsYWlucyBsb3VkbHkgYW5kIGZhaWxzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueXRoaW5nKS4gIEluIHN1Y2gKK2EgY2FzZSwgeW91IGNhbiBzaW1wbHkgY29udGludWUgZG9pbmcgd2hhdCB5b3Ugd2VyZSBpbiB0aGUKK21pZGRsZSBvZiBkb2luZywgYW5kIHdoZW4geW91ciB3b3JraW5nIHRyZWUgaXMgcmVhZHkgKGkuZS4geW91CitoYXZlIGZpbmlzaGVkIHlvdXIgd29yay1pbi1wcm9ncmVzcyksIGF0dGVtcHQgdGhlIG1lcmdlIGFnYWluLgorCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtd3JpdGUtdHJlZVsxXTsgZ2l0bGluazpnaXQtbHMtZmlsZXNbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmViYXNlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYmFzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlZTRhYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYmFzZS50eHQKQEAgLTAsMCArMSwxMzYgQEAKK2dpdC1yZWJhc2UoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlYmFzZSAtIFJlYmFzZSBsb2NhbCBjb21taXRzIHRvIGEgbmV3IGhlYWQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlYmFzZScgWy0tb250byA8bmV3YmFzZT5dIDx1cHN0cmVhbT4gWzxicmFuY2g+XQorCisnZ2l0LXJlYmFzZScgLS1jb250aW51ZSB8IC0tc2tpcCB8IC0tYWJvcnQKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitnaXQtcmViYXNlIHJlcGxhY2VzIDxicmFuY2g+IHdpdGggYSBuZXcgYnJhbmNoIG9mIHRoZSBzYW1lIG5hbWUuICBXaGVuCit0aGUgLS1vbnRvIG9wdGlvbiBpcyBwcm92aWRlZCB0aGUgbmV3IGJyYW5jaCBzdGFydHMgb3V0IHdpdGggYSBIRUFEIGVxdWFsCit0byA8bmV3YmFzZT4sIG90aGVyd2lzZSBpdCBpcyBlcXVhbCB0byA8dXBzdHJlYW0+LiAgSXQgdGhlbiBhdHRlbXB0cyB0bworY3JlYXRlIGEgbmV3IGNvbW1pdCBmb3IgZWFjaCBjb21taXQgZnJvbSB0aGUgb3JpZ2luYWwgPGJyYW5jaD4gdGhhdCBkb2VzCitub3QgZXhpc3QgaW4gdGhlIDx1cHN0cmVhbT4gYnJhbmNoLgorCitJdCBpcyBwb3NzaWJsZSB0aGF0IGEgbWVyZ2UgZmFpbHVyZSB3aWxsIHByZXZlbnQgdGhpcyBwcm9jZXNzIGZyb20gYmVpbmcKK2NvbXBsZXRlbHkgYXV0b21hdGljLiAgWW91IHdpbGwgaGF2ZSB0byByZXNvbHZlIGFueSBzdWNoIG1lcmdlIGZhaWx1cmUKK2FuZCBydW4gYGdpdCByZWJhc2UgLS1jb250aW51ZWAuICBBbm90aGVyIG9wdGlvbiBpcyB0byBieXBhc3MgdGhlIGNvbW1pdAordGhhdCBjYXVzZWQgdGhlIG1lcmdlIGZhaWx1cmUgd2l0aCBgZ2l0IHJlYmFzZSAtLXNraXBgLiAgVG8gcmVzdG9yZSB0aGUKK29yaWdpbmFsIDxicmFuY2g+IGFuZCByZW1vdmUgdGhlIC5kb3Rlc3Qgd29ya2luZyBmaWxlcywgdXNlIHRoZSBjb21tYW5kCitgZ2l0IHJlYmFzZSAtLWFib3J0YCBpbnN0ZWFkLgorCitOb3RlIHRoYXQgaWYgPGJyYW5jaD4gaXMgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgY3VycmVudGx5CitjaGVja2VkIG91dCBicmFuY2ggaXMgdXNlZC4KKworQXNzdW1lIHRoZSBmb2xsb3dpbmcgaGlzdG9yeSBleGlzdHMgYW5kIHRoZSBjdXJyZW50IGJyYW5jaCBpcyAidG9waWMiOgorCistLS0tLS0tLS0tLS0KKyAgICAgICAgICBBLS0tQi0tLUMgdG9waWMKKyAgICAgICAgIC8KKyAgICBELS0tRS0tLUYtLS1HIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK0Zyb20gdGhpcyBwb2ludCwgdGhlIHJlc3VsdCBvZiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworCisgICAgZ2l0LXJlYmFzZSBtYXN0ZXIKKyAgICBnaXQtcmViYXNlIG1hc3RlciB0b3BpYworCit3b3VsZCBiZToKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICBBJy0tQictLUMnIHRvcGljCisgICAgICAgICAgICAgICAgIC8KKyAgICBELS0tRS0tLUYtLS1HIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK1doaWxlLCBzdGFydGluZyBmcm9tIHRoZSBzYW1lIHBvaW50LCB0aGUgcmVzdWx0IG9mIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCitjb21tYW5kczoKKworICAgIGdpdC1yZWJhc2UgLS1vbnRvIG1hc3Rlcn4xIG1hc3RlcgorICAgIGdpdC1yZWJhc2UgLS1vbnRvIG1hc3Rlcn4xIG1hc3RlciB0b3BpYworCit3b3VsZCBiZToKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIEEnLS1CJy0tQycgdG9waWMKKyAgICAgICAgICAgICAvCisgICAgRC0tLUUtLS1GLS0tRyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitJbiBjYXNlIG9mIGNvbmZsaWN0LCBnaXQtcmViYXNlIHdpbGwgc3RvcCBhdCB0aGUgZmlyc3QgcHJvYmxlbWF0aWMgY29tbWl0CithbmQgbGVhdmUgY29uZmxpY3QgbWFya2VycyBpbiB0aGUgdHJlZS4gIFlvdSBjYW4gdXNlIGdpdCBkaWZmIHRvIGxvY2F0ZQordGhlIG1hcmtlcnMgKDw8PDw8PCkgYW5kIG1ha2UgZWRpdHMgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QuICBGb3IgZWFjaAorZmlsZSB5b3UgZWRpdCwgeW91IG5lZWQgdG8gdGVsbCBnaXQgdGhhdCB0aGUgY29uZmxpY3QgaGFzIGJlZW4gcmVzb2x2ZWQsCit0eXBpY2FsbHkgdGhpcyB3b3VsZCBiZSBkb25lIHdpdGgKKworCisgICAgZ2l0IHVwZGF0ZS1pbmRleCA8ZmlsZW5hbWU+CisKKworQWZ0ZXIgcmVzb2x2aW5nIHRoZSBjb25mbGljdCBtYW51YWxseSBhbmQgdXBkYXRpbmcgdGhlIGluZGV4IHdpdGggdGhlCitkZXNpcmVkIHJlc29sdXRpb24sIHlvdSBjYW4gY29udGludWUgdGhlIHJlYmFzaW5nIHByb2Nlc3Mgd2l0aAorCisKKyAgICBnaXQgcmViYXNlIC0tY29udGludWUKKworCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVuZG8gdGhlIGdpdC1yZWJhc2Ugd2l0aAorCisKKyAgICBnaXQgcmViYXNlIC0tYWJvcnQKKworT1BUSU9OUworLS0tLS0tLQorPG5ld2Jhc2U+OjoKKwlTdGFydGluZyBwb2ludCBhdCB3aGljaCB0byBjcmVhdGUgdGhlIG5ldyBjb21taXRzLiBJZiB0aGUKKwktLW9udG8gb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFydGluZyBwb2ludCBpcworCTx1cHN0cmVhbT4uCisKKzx1cHN0cmVhbT46OgorCVVwc3RyZWFtIGJyYW5jaCB0byBjb21wYXJlIGFnYWluc3QuCisKKzxicmFuY2g+OjoKKwlXb3JraW5nIGJyYW5jaDsgZGVmYXVsdHMgdG8gSEVBRC4KKworLS1jb250aW51ZTo6CisJUmVzdGFydCB0aGUgcmViYXNpbmcgcHJvY2VzcyBhZnRlciBoYXZpbmcgcmVzb2x2ZWQgYSBtZXJnZSBjb25mbGljdC4KKworLS1hYm9ydDo6CisJUmVzdG9yZSB0aGUgb3JpZ2luYWwgYnJhbmNoIGFuZCBhYm9ydCB0aGUgcmViYXNlIG9wZXJhdGlvbi4KKworTk9URVMKKy0tLS0tCitXaGVuIHlvdSByZWJhc2UgYSBicmFuY2gsIHlvdSBhcmUgY2hhbmdpbmcgaXRzIGhpc3RvcnkgaW4gYSB3YXkgdGhhdAord2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IgYW55b25lIHdobyBhbHJlYWR5IGhhcyBhIGNvcHkgb2YgdGhlIGJyYW5jaAoraW4gdGhlaXIgcmVwb3NpdG9yeSBhbmQgdHJpZXMgdG8gcHVsbCB1cGRhdGVzIGZyb20geW91LiAgWW91IHNob3VsZAordW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHVzaW5nICdnaXQgcmViYXNlJyBvbiBhIHJlcG9zaXRvcnkgdGhhdAoreW91IHNoYXJlLgorCitXaGVuIHRoZSBnaXQgcmViYXNlIGNvbW1hbmQgaXMgcnVuLCBpdCB3aWxsIGZpcnN0IGV4ZWN1dGUgYSAicHJlLXJlYmFzZSIKK2hvb2sgaWYgb25lIGV4aXN0cy4gIFlvdSBjYW4gdXNlIHRoaXMgaG9vayB0byBkbyBzYW5pdHkgY2hlY2tzIGFuZAorcmVqZWN0IHRoZSByZWJhc2UgaWYgaXQgaXNuJ3QgYXBwcm9wcmlhdGUuICBQbGVhc2Ugc2VlIHRoZSB0ZW1wbGF0ZQorcHJlLXJlYmFzZSBob29rIHNjcmlwdCBmb3IgYW4gZXhhbXBsZS4KKworWW91IG11c3QgYmUgaW4gdGhlIHRvcCBkaXJlY3Rvcnkgb2YgeW91ciBwcm9qZWN0IHRvIHN0YXJ0IChvciBjb250aW51ZSkKK2EgcmViYXNlLiAgVXBvbiBjb21wbGV0aW9uLCA8YnJhbmNoPiB3aWxsIGJlIHRoZSBjdXJyZW50IGJyYW5jaC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlY2VpdmUtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWNlaXZlLXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGViY2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWNlaXZlLXBhY2sudHh0CkBAIC0wLDAgKzEsOTkgQEAKK2dpdC1yZWNlaXZlLXBhY2soMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlY2VpdmUtcGFjayAtIFJlY2VpdmUgd2hhdCBpcyBwdXNoZWQgaW50byBpdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZWNlaXZlLXBhY2snIDxkaXJlY3Rvcnk+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW52b2tlZCBieSAnZ2l0LXNlbmQtcGFjaycgYW5kIHVwZGF0ZXMgdGhlIHJlcG9zaXRvcnkgd2l0aCB0aGUKK2luZm9ybWF0aW9uIGZlZCBmcm9tIHRoZSByZW1vdGUgZW5kLgorCitUaGlzIGNvbW1hbmQgaXMgdXN1YWxseSBub3QgaW52b2tlZCBkaXJlY3RseSBieSB0aGUgZW5kIHVzZXIuCitUaGUgVUkgZm9yIHRoZSBwcm90b2NvbCBpcyBvbiB0aGUgJ2dpdC1zZW5kLXBhY2snIHNpZGUsIGFuZCB0aGUKK3Byb2dyYW0gcGFpciBpcyBtZWFudCB0byBiZSB1c2VkIHRvIHB1c2ggdXBkYXRlcyB0byByZW1vdGUKK3JlcG9zaXRvcnkuICBGb3IgcHVsbCBvcGVyYXRpb25zLCBzZWUgJ2dpdC1mZXRjaC1wYWNrJyBhbmQKKydnaXQtY2xvbmUtcGFjaycuCisKK1RoZSBjb21tYW5kIGFsbG93cyBmb3IgY3JlYXRpb24gYW5kIGZhc3QgZm9yd2FyZGluZyBvZiBzaGExIHJlZnMKKyhoZWFkcy90YWdzKSBvbiB0aGUgcmVtb3RlIGVuZCAoc3RyaWN0bHkgc3BlYWtpbmcsIGl0IGlzIHRoZQorbG9jYWwgZW5kIHJlY2VpdmUtcGFjayBydW5zLCBidXQgdG8gdGhlIHVzZXIgd2hvIGlzIHNpdHRpbmcgYXQKK3RoZSBzZW5kLXBhY2sgZW5kLCBpdCBpcyB1cGRhdGluZyB0aGUgcmVtb3RlLiAgQ29uZnVzZWQ/KQorCitCZWZvcmUgZWFjaCByZWYgaXMgdXBkYXRlZCwgaWYgJEdJVF9ESVIvaG9va3MvdXBkYXRlIGZpbGUgZXhpc3RzCithbmQgZXhlY3V0YWJsZSwgaXQgaXMgY2FsbGVkIHdpdGggdGhyZWUgcGFyYW1ldGVyczoKKworICAgICAgICRHSVRfRElSL2hvb2tzL3VwZGF0ZSByZWZuYW1lIHNoYTEtb2xkIHNoYTEtbmV3CisKK1RoZSByZWZuYW1lIHBhcmFtZXRlciBpcyByZWxhdGl2ZSB0byAkR0lUX0RJUjsgZS5nLiBmb3IgdGhlCittYXN0ZXIgaGVhZCB0aGlzIGlzICJyZWZzL2hlYWRzL21hc3RlciIuICBUd28gc2hhMSBhcmUgdGhlCitvYmplY3QgbmFtZXMgZm9yIHRoZSByZWZuYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZS4gIE5vdGUKK3RoYXQgdGhlIGhvb2sgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcmVmbmFtZSBpcyB1cGRhdGVkLCBzbyBlaXRoZXIKK3NoYTEtb2xkIGlzIDB7NDB9IChtZWFuaW5nIHRoZXJlIGlzIG5vIHN1Y2ggcmVmIHlldCksIG9yIGl0CitzaG91bGQgbWF0Y2ggd2hhdCBpcyByZWNvcmRlZCBpbiByZWZuYW1lLgorCitUaGUgaG9vayBzaG91bGQgZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyBpZiBpdCB3YW50cyB0bworZGlzYWxsb3cgdXBkYXRpbmcgdGhlIG5hbWVkIHJlZi4gIE90aGVyd2lzZSBpdCBzaG91bGQgZXhpdCB3aXRoCit6ZXJvLgorCitVc2luZyB0aGlzIGhvb2ssIGl0IGlzIGVhc3kgdG8gZ2VuZXJhdGUgbWFpbHMgb24gdXBkYXRlcyB0bwordGhlIGxvY2FsIHJlcG9zaXRvcnkuIFRoaXMgZXhhbXBsZSBzY3JpcHQgc2VuZHMgYSBtYWlsIHdpdGgKK3RoZSBjb21taXRzIHB1c2hlZCB0byB0aGUgcmVwb3NpdG9yeToKKworCSMhL2Jpbi9zaAorCSMgbWFpbCBvdXQgY29tbWl0IHVwZGF0ZSBpbmZvcm1hdGlvbi4KKwlpZiBleHByICIkMiIgOiAnMCokJyA+L2Rldi9udWxsCisJdGhlbgorCQllY2hvICJDcmVhdGVkIGEgbmV3IHJlZiwgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1pdHM6IgorCQlnaXQtcmV2LWxpc3QgLS1wcmV0dHkgIiQyIgorCWVsc2UKKwkJZWNobyAiTmV3IGNvbW1pdHM6IgorCQlnaXQtcmV2LWxpc3QgLS1wcmV0dHkgIiQzIiAiXiQyIgorCWZpIHwKKwltYWlsIC1zICJDaGFuZ2VzIHRvIHJlZiAkMSIgY29tbWl0LWxpc3RAbXlkb21haW4KKwlleGl0IDAKKworQW5vdGhlciBob29rICRHSVRfRElSL2hvb2tzL3Bvc3QtdXBkYXRlLCBpZiBleGlzdHMgYW5kCitleGVjdXRhYmxlLCBpcyBjYWxsZWQgd2l0aCB0aGUgbGlzdCBvZiByZWZzIHRoYXQgaGF2ZSBiZWVuCit1cGRhdGVkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcmVwb3NpdG9yeSB3aWRlIGNsZWFudXAKK3Rhc2sgaWYgbmVlZGVkLiAgVGhlIGV4aXQgY29kZSBmcm9tIHRoaXMgaG9vayBpbnZvY2F0aW9uIGlzCitpZ25vcmVkOyB0aGUgb25seSB0aGluZyBsZWZ0IGZvciBnaXQtcmVjZWl2ZS1wYWNrIHRvIGRvIGF0IHRoYXQKK3BvaW50IGlzIHRvIGV4aXQgaXRzZWxmIGFueXdheS4gIFRoaXMgaG9vayBjYW4gYmUgdXNlZCwgZm9yCitleGFtcGxlLCB0byBydW4gImdpdC11cGRhdGUtc2VydmVyLWluZm8iIGlmIHRoZSByZXBvc2l0b3J5IGlzCitwYWNrZWQgYW5kIGlzIHNlcnZlZCB2aWEgYSBkdW1iIHRyYW5zcG9ydC4KKworCSMhL2Jpbi9zaAorCWV4ZWMgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbworCitUaGVyZSBhcmUgb3RoZXIgcmVhbC13b3JsZCBleGFtcGxlcyBvZiB1c2luZyB1cGRhdGUgYW5kCitwb3N0LXVwZGF0ZSBob29rcyBmb3VuZCBpbiB0aGUgRG9jdW1lbnRhdGlvbi9ob3d0byBkaXJlY3RvcnkuCisKKworT1BUSU9OUworLS0tLS0tLQorPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIHN5bmMgaW50by4KKworCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXNlbmQtcGFja1sxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVsaW5rLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlbGluay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhNjAxMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlbGluay50eHQKQEAgLTAsMCArMSwzNyBAQAorZ2l0LXJlbGluaygxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVsaW5rIC0gSGFyZGxpbmsgY29tbW9uIG9iamVjdHMgaW4gbG9jYWwgcmVwb3NpdG9yaWVzCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZWxpbmsnIFstLXNhZmVdIDxkaXI+IDxkaXI+IFs8ZGlyPl1cKgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgd2lsbCBzY2FuIDIgb3IgbW9yZSBvYmplY3QgcmVwb3NpdG9yaWVzIGFuZCBsb29rIGZvciBjb21tb24gb2JqZWN0cywgY2hlY2sKK2lmIHRoZXkgYXJlIGhhcmRsaW5rZWQsIGFuZCByZXBsYWNlIG9uZSB3aXRoIGEgaGFyZGxpbmsgdG8gdGhlIG90aGVyIGlmIG5vdC4KKworT1BUSU9OUworLS0tLS0tLQorLS1zYWZlOjoKKwlTdG9wcyBpZiB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGhhc2ggZXhpc3QgYnV0IGhhdmUgZGlmZmVyZW50IHNpemVzLgorCURlZmF1bHQgaXMgdG8gd2FybiBhbmQgY29udGludWUuCisKKzxkaXI+OjoKKwlEaXJlY3RvcmllcyBjb250YWluaW5nIGEgLmdpdC9vYmplY3RzLyBzdWJkaXJlY3RvcnkuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVwYWNrLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxNjIyNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcGFjay50eHQKQEAgLTAsMCArMSw3NSBAQAorZ2l0LXJlcGFjaygxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVwYWNrIC0gU2NyaXB0IHVzZWQgdG8gcGFjayBhIHJlcG9zaXRvcnkgZnJvbSBhIGNvbGxlY3Rpb24gb2YKK29iamVjdHMgaW50byBwYWNrIGZpbGVzLgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZXBhY2snIFstYV0gWy1kXSBbLWZdIFstbF0gWy1uXSBbLXFdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNvbWJpbmUgYWxsIG9iamVjdHMgdGhhdCBkbyBub3QgY3VycmVudGx5CityZXNpZGUgaW4gYSAicGFjayIsIGludG8gYSBwYWNrLgorCitBIHBhY2sgaXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMsIGluZGl2aWR1YWxseSBjb21wcmVzc2VkLCB3aXRoCitkZWx0YSBjb21wcmVzc2lvbiBhcHBsaWVkLCBzdG9yZWQgaW4gYSBzaW5nbGUgZmlsZSwgd2l0aCBhbgorYXNzb2NpYXRlZCBpbmRleCBmaWxlLgorCitQYWNrcyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIGxvYWQgb24gbWlycm9yIHN5c3RlbXMsIGJhY2t1cAorZW5naW5lcywgZGlzayBzdG9yYWdlLCBldGMuCisKK09QVElPTlMKKy0tLS0tLS0KKworLWE6OgorCUluc3RlYWQgb2YgaW5jcmVtZW50YWxseSBwYWNraW5nIHRoZSB1bnBhY2tlZCBvYmplY3RzLAorCXBhY2sgZXZlcnl0aGluZyBhdmFpbGFibGUgaW50byBhIHNpbmdsZSBwYWNrLgorCUVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gcGFja2luZyBhIHJlcG9zaXRvcnkgdGhhdCBpcyB1c2VkCisJZm9yIGEgcHJpdmF0ZSBkZXZlbG9wbWVudCBhbmQgdGhlcmUgbm8gbmVlZCB0byB3b3JyeQorCWFib3V0IHBlb3BsZSBmZXRjaGluZyB2aWEgZHVtYiBwcm90b2NvbHMgZnJvbSBpdC4gIFVzZQorCXdpdGggJy1kJy4KKworLWQ6OgorCUFmdGVyIHBhY2tpbmcsIGlmIHRoZSBuZXdseSBjcmVhdGVkIHBhY2tzIG1ha2Ugc29tZQorCWV4aXN0aW5nIHBhY2tzIHJlZHVuZGFudCwgcmVtb3ZlIHRoZSByZWR1bmRhbnQgcGFja3MuCisJQWxzbyBydW5zIGdpdGxpbms6Z2l0LXBydW5lLXBhY2tlZFsxXS4KKworLWw6OgorICAgICAgICBQYXNzIHRoZSBgLS1sb2NhbGAgb3B0aW9uIHRvIGBnaXQgcGFjay1vYmplY3RzYCwgc2VlCisgICAgICAgIGdpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXS4KKworLWY6OgorICAgICAgICBQYXNzIHRoZSBgLS1uby1yZXVzZS1kZWx0YWAgb3B0aW9uIHRvIGBnaXQgcGFjay1vYmplY3RzYCwgc2VlCisgICAgICAgIGdpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXS4KKworLXE6OgorICAgICAgICBQYXNzIHRoZSBgLXFgIG9wdGlvbiB0byBgZ2l0IHBhY2stb2JqZWN0c2AsIHNlZQorICAgICAgICBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0uCisKKy1uOjoKKyAgICAgICAgRG8gbm90IHVwZGF0ZSB0aGUgc2VydmVyIGluZm9ybWF0aW9uIHdpdGgKKyAgICAgICAgYGdpdCB1cGRhdGUtc2VydmVyLWluZm9gLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtcGFjay1vYmplY3RzWzFdCitnaXRsaW5rOmdpdC1wcnVuZS1wYWNrZWRbMV0KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlcG8tY29uZmlnLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcG8tY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTE0MmUwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVwby1jb25maWcudHh0CkBAIC0wLDAgKzEsMTg4IEBACitnaXQtcmVwby1jb25maWcoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVwby1jb25maWcgLSBHZXQgYW5kIHNldCBvcHRpb25zIGluIC5naXQvY29uZmlnCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXJlcG8tY29uZmlnJyBbdHlwZV0gbmFtZSBbdmFsdWUgW3ZhbHVlX3JlZ2V4XV0KKydnaXQtcmVwby1jb25maWcnIFt0eXBlXSAtLXJlcGxhY2UtYWxsIG5hbWUgW3ZhbHVlIFt2YWx1ZV9yZWdleF1dCisnZ2l0LXJlcG8tY29uZmlnJyBbdHlwZV0gLS1nZXQgbmFtZSBbdmFsdWVfcmVnZXhdCisnZ2l0LXJlcG8tY29uZmlnJyBbdHlwZV0gLS1nZXQtYWxsIG5hbWUgW3ZhbHVlX3JlZ2V4XQorJ2dpdC1yZXBvLWNvbmZpZycgW3R5cGVdIC0tdW5zZXQgbmFtZSBbdmFsdWVfcmVnZXhdCisnZ2l0LXJlcG8tY29uZmlnJyBbdHlwZV0gLS11bnNldC1hbGwgbmFtZSBbdmFsdWVfcmVnZXhdCisnZ2l0LXJlcG8tY29uZmlnJyAtbCB8IC0tbGlzdAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1lvdSBjYW4gcXVlcnkvc2V0L3JlcGxhY2UvdW5zZXQgb3B0aW9ucyB3aXRoIHRoaXMgY29tbWFuZC4gVGhlIG5hbWUgaXMKK2FjdHVhbGx5IHRoZSBzZWN0aW9uIGFuZCB0aGUga2V5IHNlcGFyYXRlZCBieSBhIGRvdCwgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlCitlc2NhcGVkLgorCitJZiB5b3Ugd2FudCB0byBzZXQvdW5zZXQgYW4gb3B0aW9uIHdoaWNoIGNhbiBvY2N1ciBvbiBtdWx0aXBsZQorbGluZXMsIGEgUE9TSVggcmVnZXhwIGB2YWx1ZV9yZWdleGAgbmVlZHMgdG8gYmUgZ2l2ZW4uICBPbmx5IHRoZQorZXhpc3RpbmcgdmFsdWVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4cCBhcmUgdXBkYXRlZCBvciB1bnNldC4gIElmCit5b3Ugd2FudCB0byBoYW5kbGUgdGhlIGxpbmVzIHRoYXQgZG8gKm5vdCogbWF0Y2ggdGhlIHJlZ2V4LCBqdXN0CitwcmVwZW5kIGEgc2luZ2xlIGV4Y2xhbWF0aW9uIG1hcmsgaW4gZnJvbnQgKHNlZSBFWEFNUExFUykuCisKK1RoZSB0eXBlIHNwZWNpZmllciBjYW4gYmUgZWl0aGVyICctLWludCcgb3IgJy0tYm9vbCcsIHdoaWNoIHdpbGwgbWFrZQorJ2dpdC1yZXBvLWNvbmZpZycgZW5zdXJlIHRoYXQgdGhlIHZhcmlhYmxlKHMpIGFyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQKK2NvbnZlcnQgdGhlIHZhbHVlIHRvIHRoZSBjYW5vbmljYWwgZm9ybSAoc2ltcGxlIGRlY2ltYWwgbnVtYmVyIGZvciBpbnQsCithICJ0cnVlIiBvciAiZmFsc2UiIHN0cmluZyBmb3IgYm9vbCkuIElmIG5vIHR5cGUgc3BlY2lmaWVyIGlzIHBhc3NlZCwKK25vIGNoZWNrcyBvciB0cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgdmFsdWUuCisKK1RoaXMgY29tbWFuZCB3aWxsIGZhaWwgaWY6CisKKy4gVGhlIC5naXQvY29uZmlnIGZpbGUgaXMgaW52YWxpZCwKKy4gQ2FuIG5vdCB3cml0ZSB0byAuZ2l0L2NvbmZpZywKKy4gbm8gc2VjdGlvbiB3YXMgcHJvdmlkZWQsCisuIHRoZSBzZWN0aW9uIG9yIGtleSBpcyBpbnZhbGlkLAorLiB5b3UgdHJ5IHRvIHVuc2V0IGFuIG9wdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCwgb3IKKy4geW91IHRyeSB0byB1bnNldC9zZXQgYW4gb3B0aW9uIGZvciB3aGljaCBtdWx0aXBsZSBsaW5lcyBtYXRjaC4KKworCitPUFRJT05TCistLS0tLS0tCisKKy0tcmVwbGFjZS1hbGw6OgorCURlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVwbGFjZSBhdCBtb3N0IG9uZSBsaW5lLiBUaGlzIHJlcGxhY2VzCisJYWxsIGxpbmVzIG1hdGNoaW5nIHRoZSBrZXkgKGFuZCBvcHRpb25hbGx5IHRoZSB2YWx1ZV9yZWdleCkuCisKKy0tZ2V0OjoKKwlHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGtleSAob3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhIHJlZ2V4CisJbWF0Y2hpbmcgdGhlIHZhbHVlKS4KKworLS1nZXQtYWxsOjoKKwlMaWtlIGdldCwgYnV0IGRvZXMgbm90IGZhaWwgaWYgdGhlIG51bWJlciBvZiB2YWx1ZXMgZm9yIHRoZSBrZXkKKwlpcyBub3QgZXhhY3RseSBvbmUuCisKKy0tZ2V0LXJlZ2V4cDo6CisJTGlrZSAtLWdldC1hbGwsIGJ1dCBpbnRlcnByZXRzIHRoZSBuYW1lIGFzIGEgcmVndWxhciBleHByZXNzaW9uLgorCistLXVuc2V0OjoKKwlSZW1vdmUgdGhlIGxpbmUgbWF0Y2hpbmcgdGhlIGtleSBmcm9tIC5naXQvY29uZmlnLgorCistLXVuc2V0LWFsbDo6CisJUmVtb3ZlIGFsbCBtYXRjaGluZyBsaW5lcyBmcm9tIC5naXQvY29uZmlnLgorCistbCwgLS1saXN0OjoKKwlMaXN0IGFsbCB2YXJpYWJsZXMgc2V0IGluIC5naXQvY29uZmlnLgorCisKK0VYQU1QTEUKKy0tLS0tLS0KKworR2l2ZW4gYSAuZ2l0L2NvbmZpZyBsaWtlIHRoaXM6CisKKwkjCisJIyBUaGlzIGlzIHRoZSBjb25maWcgZmlsZSwgYW5kCisJIyBhICcjJyBvciAnOycgY2hhcmFjdGVyIGluZGljYXRlcworCSMgYSBjb21tZW50CisJIworCisJOyBjb3JlIHZhcmlhYmxlcworCVtjb3JlXQorCQk7IERvbid0IHRydXN0IGZpbGUgbW9kZXMKKwkJZmlsZW1vZGUgPSBmYWxzZQorCisJOyBPdXIgZGlmZiBhbGdvcml0aG0KKwlbZGlmZl0KKwkJZXh0ZXJuYWwgPSAiL3Vzci9sb2NhbC9iaW4vZ251LWRpZmYgLXUiCisJCXJlbmFtZXMgPSB0cnVlCisKKwk7IFByb3h5IHNldHRpbmdzCisJW2NvcmVdCisJCWdpdHByb3h5PSJzc2giIGZvciAic3NoOi8va2VybmVsLm9yZy8iCisJCWdpdHByb3h5PSJwcm94eS1jb21tYW5kIiBmb3Iga2VybmVsLm9yZworCQlnaXRwcm94eT0ibXlwcm90b2NvbC1jb21tYW5kIiBmb3IgIm15Oi8vIgorCQlnaXRwcm94eT1kZWZhdWx0LXByb3h5IDsgZm9yIGFsbCB0aGUgcmVzdAorCit5b3UgY2FuIHNldCB0aGUgZmlsZW1vZGUgdG8gdHJ1ZSB3aXRoCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgcmVwby1jb25maWcgY29yZS5maWxlbW9kZSB0cnVlCistLS0tLS0tLS0tLS0KKworVGhlIGh5cG90aGV0aWMgcHJveHkgY29tbWFuZCBlbnRyaWVzIGFjdHVhbGx5IGhhdmUgYSBwb3N0Zml4IHRvIGRpc2Nlcm4KK3RvIHdoYXQgVVJMIHRoZXkgYXBwbHkuIEhlcmUgaXMgaG93IHRvIGNoYW5nZSB0aGUgZW50cnkgZm9yIGtlcm5lbC5vcmcKK3RvICJzc2giLgorCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIGNvcmUuZ2l0cHJveHkgJyJzc2giIGZvciBrZXJuZWwub3JnJyAnZm9yIGtlcm5lbC5vcmckJworLS0tLS0tLS0tLS0tCisKK1RoaXMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgdGhlIGtleS92YWx1ZSBwYWlyIGZvciBrZXJuZWwub3JnIGlzIHJlcGxhY2VkLgorCitUbyBkZWxldGUgdGhlIGVudHJ5IGZvciByZW5hbWVzLCBkbworCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIC0tdW5zZXQgZGlmZi5yZW5hbWVzCistLS0tLS0tLS0tLS0KKworSWYgeW91IHdhbnQgdG8gZGVsZXRlIGFuIGVudHJ5IGZvciBhIG11bHRpdmFyIChsaWtlIGNvcmUuZ2l0cHJveHkgYWJvdmUpLAoreW91IGhhdmUgdG8gcHJvdmlkZSBhIHJlZ2V4IG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiBleGFjdGx5IG9uZSBsaW5lLgorCitUbyBxdWVyeSB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4ga2V5LCBkbworCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIC0tZ2V0IGNvcmUuZmlsZW1vZGUKKy0tLS0tLS0tLS0tLQorCitvcgorCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIGNvcmUuZmlsZW1vZGUKKy0tLS0tLS0tLS0tLQorCitvciwgdG8gcXVlcnkgYSBtdWx0aXZhcjoKKworLS0tLS0tLS0tLS0tCislIGdpdCByZXBvLWNvbmZpZyAtLWdldCBjb3JlLmdpdHByb3h5ICJmb3Iga2VybmVsLm9yZyQiCistLS0tLS0tLS0tLS0KKworSWYgeW91IHdhbnQgdG8ga25vdyBhbGwgdGhlIHZhbHVlcyBmb3IgYSBtdWx0aXZhciwgZG86CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgcmVwby1jb25maWcgLS1nZXQtYWxsIGNvcmUuZ2l0cHJveHkKKy0tLS0tLS0tLS0tLQorCitJZiB5b3UgbGlrZSB0byBsaXZlIGRhbmdlcm91cywgeW91IGNhbiByZXBsYWNlICphbGwqIGNvcmUuZ2l0cHJveHkgYnkgYQorbmV3IG9uZSB3aXRoCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgcmVwby1jb25maWcgLS1yZXBsYWNlLWFsbCBjb3JlLmdpdHByb3h5IHNzaAorLS0tLS0tLS0tLS0tCisKK0hvd2V2ZXIsIGlmIHlvdSByZWFsbHkgb25seSB3YW50IHRvIHJlcGxhY2UgdGhlIGxpbmUgZm9yIHRoZSBkZWZhdWx0IHByb3h5LAoraS5lLiB0aGUgb25lIHdpdGhvdXQgYSAiZm9yIC4uLiIgcG9zdGZpeCwgZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCislIGdpdCByZXBvLWNvbmZpZyBjb3JlLmdpdHByb3h5IHNzaCAnISBmb3IgJworLS0tLS0tLS0tLS0tCisKK1RvIGFjdHVhbGx5IG1hdGNoIG9ubHkgdmFsdWVzIHdpdGggYW4gZXhjbGFtYXRpb24gbWFyaywgeW91IGhhdmUgdG8KKworLS0tLS0tLS0tLS0tCislIGdpdCByZXBvLWNvbmZpZyBzZWN0aW9uLmtleSB2YWx1ZSAnWyFdJworLS0tLS0tLS0tLS0tCisKKworaW5jbHVkZTo6Y29uZmlnLnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4sIFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVxdWVzdC1wdWxsLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcXVlc3QtcHVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4YTVmZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcXVlc3QtcHVsbC50eHQKQEAgLTAsMCArMSw0MCBAQAorZ2l0LXJlcXVlc3QtcHVsbCgxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVxdWVzdC1wdWxsIC0gR2VuZXJhdGVzIGEgc3VtbWFyeSBvZiBwZW5kaW5nIGNoYW5nZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlcXVlc3QtcHVsbCcgPHN0YXJ0PiA8dXJsPiBbPGVuZD5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitTdW1tYXJpemVzIHRoZSBjaGFuZ2VzIGJldHdlZW4gdHdvIGNvbW1pdHMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgYW5kIGluY2x1ZGVzCit0aGUgZ2l2ZW4gVVJMIGluIHRoZSBnZW5lcmF0ZWQgc3VtbWFyeS4KKworT1BUSU9OUworLS0tLS0tLQorPHN0YXJ0Pjo6CisJQ29tbWl0IHRvIHN0YXJ0IGF0LgorCis8dXJsPjo6CisJVVJMIHRvIGluY2x1ZGUgaW4gdGhlIHN1bW1hcnkuCisKKzxlbmQ+OjoKKwlDb21taXQgdG8gc2VuZCBhdDsgZGVmYXVsdHMgdG8gSEVBRC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4gYW5kIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXJlcmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVyZXJlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjZiNjUxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVyZXJlLnR4dApAQCAtMCwwICsxLDE3NyBAQAorZ2l0LXJlcmVyZSgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVyZXJlIC0gUmV1c2UgcmVjb3JkZWQgcmVzb2x2ZQorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVyZXJlJworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitJbiBhIHdvcmtmbG93IHRoYXQgZW1wbG95cyByZWxhdGl2ZWx5IGxvbmcgbGl2ZWQgdG9waWMgYnJhbmNoZXMsCit0aGUgZGV2ZWxvcGVyIHNvbWV0aW1lcyBuZWVkcyB0byByZXNvbHZlIHRoZSBzYW1lIGNvbmZsaWN0IG92ZXIKK2FuZCBvdmVyIGFnYWluIHVudGlsIHRoZSB0b3BpYyBicmFuY2hlcyBhcmUgZG9uZSAoZWl0aGVyIG1lcmdlZAordG8gdGhlICJyZWxlYXNlIiBicmFuY2gsIG9yIHNlbnQgb3V0IGFuZCBhY2NlcHRlZCB1cHN0cmVhbSkuCisKK1RoaXMgY29tbWFuZCBoZWxwcyB0aGlzIHByb2Nlc3MgYnkgcmVjb3JkaW5nIGNvbmZsaWN0ZWQKK2F1dG9tZXJnZSByZXN1bHRzIGFuZCBjb3JyZXNwb25kaW5nIGhhbmQtcmVzb2x2ZSByZXN1bHRzIG9uIHRoZQoraW5pdGlhbCBtYW51YWwgbWVyZ2UsIGFuZCBsYXRlciBieSBub3RpY2luZyB0aGUgc2FtZSBhdXRvbWVyZ2UKK3Jlc3VsdHMgYW5kIGFwcGx5aW5nIHRoZSBwcmV2aW91c2x5IHJlY29yZGVkIGhhbmQgcmVzb2x1dGlvbi4KKworW05PVEVdCitZb3UgbmVlZCB0byBjcmVhdGUgYCRHSVRfRElSL3JyLWNhY2hlYCBkaXJlY3RvcnkgdG8gZW5hYmxlIHRoaXMKK2NvbW1hbmQuCisKK0RJU0NVU1NJT04KKy0tLS0tLS0tLS0KKworV2hlbiB5b3VyIHRvcGljIGJyYW5jaCBtb2RpZmllcyBvdmVybGFwcGluZyBhcmVhIHRoYXQgeW91cgorbWFzdGVyIGJyYW5jaCAob3IgdXBzdHJlYW0pIHRvdWNoZWQgc2luY2UgeW91ciB0b3BpYyBicmFuY2gKK2ZvcmtlZCBmcm9tIGl0LCB5b3UgbWF5IHdhbnQgdG8gdGVzdCBpdCB3aXRoIHRoZSBsYXRlc3QgbWFzdGVyLAorZXZlbiBiZWZvcmUgeW91ciB0b3BpYyBicmFuY2ggaXMgcmVhZHkgdG8gYmUgcHVzaGVkIHVwc3RyZWFtOgorCistLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgby0tLSotLS1vIHRvcGljCisgICAgICAgICAgICAgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tbyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitGb3Igc3VjaCBhIHRlc3QsIHlvdSBuZWVkIHRvIG1lcmdlIG1hc3RlciBhbmQgdG9waWMgc29tZWhvdy4KK09uZSB3YXkgdG8gZG8gaXQgaXMgdG8gcHVsbCBtYXN0ZXIgaW50byB0aGUgdG9waWMgYnJhbmNoOgorCistLS0tLS0tLS0tLS0KKwkkIGdpdCBjaGVja291dCB0b3BpYworCSQgZ2l0IHB1bGwgLiBtYXN0ZXIKKworICAgICAgICAgICAgICBvLS0tKi0tLW8tLS0rIHRvcGljCisgICAgICAgICAgICAgLyAgICAgICAgICAgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tbyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGUgY29tbWl0cyBtYXJrZWQgd2l0aCBgKmAgdG91Y2ggdGhlIHNhbWUgYXJlYSBpbiB0aGUgc2FtZQorZmlsZTsgeW91IG5lZWQgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzIHdoZW4gY3JlYXRpbmcgdGhlIGNvbW1pdAorbWFya2VkIHdpdGggYCtgLiAgVGhlbiB5b3UgY2FuIHRlc3QgdGhlIHJlc3VsdCB0byBtYWtlIHN1cmUgeW91cgord29yay1pbi1wcm9ncmVzcyBzdGlsbCB3b3JrcyB3aXRoIHdoYXQgaXMgaW4gdGhlIGxhdGVzdCBtYXN0ZXIuCisKK0FmdGVyIHRoaXMgdGVzdCBtZXJnZSwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnRpbnVlIHlvdXIgd29yaworb24gdGhlIHRvcGljLiAgVGhlIGVhc2llc3QgaXMgdG8gYnVpbGQgb24gdG9wIG9mIHRoZSB0ZXN0IG1lcmdlCitjb21taXQgYCtgLCBhbmQgd2hlbiB5b3VyIHdvcmsgaW4gdGhlIHRvcGljIGJyYW5jaCBpcyBmaW5hbGx5CityZWFkeSwgcHVsbCB0aGUgdG9waWMgYnJhbmNoIGludG8gbWFzdGVyLCBhbmQvb3IgYXNrIHRoZQordXBzdHJlYW0gdG8gcHVsbCBmcm9tIHlvdS4gIEJ5IHRoYXQgdGltZSwgaG93ZXZlciwgdGhlIG1hc3RlciBvcgordGhlIHVwc3RyZWFtIG1pZ2h0IGhhdmUgYmVlbiBhZHZhbmNlZCBzaW5jZSB0aGUgdGVzdCBtZXJnZSBgK2AsCitpbiB3aGljaCBjYXNlIHRoZSBmaW5hbCBjb21taXQgZ3JhcGggd291bGQgbG9vayBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorCSQgZ2l0IGNoZWNrb3V0IHRvcGljCisJJCBnaXQgcHVsbCAuIG1hc3RlcgorCSQgLi4uIHdvcmsgb24gYm90aCB0b3BpYyBhbmQgbWFzdGVyIGJyYW5jaGVzCisJJCBnaXQgY2hlY2tvdXQgbWFzdGVyCisJJCBnaXQgcHVsbCAuIHRvcGljCisKKyAgICAgICAgICAgICAgby0tLSotLS1vLS0tKy0tLW8tLS1vIHRvcGljCisgICAgICAgICAgICAgLyAgICAgICAgICAgLyAgICAgICAgIFwKKyAgICBvLS0tby0tLW8tLS0qLS0tby0tLW8tLS1vLS0tby0tLSsgbWFzdGVyCistLS0tLS0tLS0tLS0KKworV2hlbiB5b3VyIHRvcGljIGJyYW5jaCBpcyBsb25nLWxpdmVkLCBob3dldmVyLCB5b3VyIHRvcGljIGJyYW5jaAord291bGQgZW5kIHVwIGhhdmluZyBtYW55IHN1Y2ggIk1lcmdlIGZyb20gbWFzdGVyIiBjb21taXRzIG9uIGl0LAord2hpY2ggd291bGQgdW5uZWNlc3NhcmlseSBjbHV0dGVyIHRoZSBkZXZlbG9wbWVudCBoaXN0b3J5LgorUmVhZGVycyBvZiB0aGUgTGludXgga2VybmVsIG1haWxpbmcgbGlzdCBtYXkgcmVtZW1iZXIgdGhhdCBMaW51cworY29tcGxhaW5lZCBhYm91dCBzdWNoIHRvbyBmcmVxdWVudCB0ZXN0IG1lcmdlcyB3aGVuIGEgc3Vic3lzdGVtCittYWludGFpbmVyIGFza2VkIHRvIHB1bGwgZnJvbSBhIGJyYW5jaCBmdWxsIG9mICJ1c2VsZXNzIG1lcmdlcyIuCisKK0FzIGFuIGFsdGVybmF0aXZlLCB0byBrZWVwIHRoZSB0b3BpYyBicmFuY2ggY2xlYW4gb2YgdGVzdAorbWVyZ2VzLCB5b3UgY291bGQgYmxvdyBhd2F5IHRoZSB0ZXN0IG1lcmdlLCBhbmQga2VlcCBidWlsZGluZyBvbgordG9wIG9mIHRoZSB0aXAgYmVmb3JlIHRoZSB0ZXN0IG1lcmdlOgorCistLS0tLS0tLS0tLS0KKwkkIGdpdCBjaGVja291dCB0b3BpYworCSQgZ2l0IHB1bGwgLiBtYXN0ZXIKKwkkIGdpdCByZXNldCAtLWhhcmQgSEVBRF4gOyMgcmV3aW5kIHRoZSB0ZXN0IG1lcmdlCisJJCAuLi4gd29yayBvbiBib3RoIHRvcGljIGFuZCBtYXN0ZXIgYnJhbmNoZXMKKwkkIGdpdCBjaGVja291dCBtYXN0ZXIKKwkkIGdpdCBwdWxsIC4gdG9waWMKKworICAgICAgICAgICAgICBvLS0tKi0tLW8tLS0tLS0tby0tLW8gdG9waWMKKyAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgXAorICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vLS0tKyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGlzIHdvdWxkIGxlYXZlIG9ubHkgb25lIG1lcmdlIGNvbW1pdCB3aGVuIHlvdXIgdG9waWMgYnJhbmNoIGlzCitmaW5hbGx5IHJlYWR5IGFuZCBtZXJnZWQgaW50byB0aGUgbWFzdGVyIGJyYW5jaC4gIFRoaXMgbWVyZ2UKK3dvdWxkIHJlcXVpcmUgeW91IHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LCBpbnRyb2R1Y2VkIGJ5IHRoZQorY29tbWl0cyBtYXJrZWQgd2l0aCBgKmAuICBIb3dldmVyLCBvZnRlbiB0aGlzIGNvbmZsaWN0IGlzIHRoZQorc2FtZSBjb25mbGljdCB5b3UgcmVzb2x2ZWQgd2hlbiB5b3UgY3JlYXRlZCB0aGUgdGVzdCBtZXJnZSB5b3UKK2JsZXcgYXdheS4gIGBnaXQtcmVyZXJlYCBjb21tYW5kIGhlbHBzIHlvdSB0byByZXNvbHZlIHRoaXMgZmluYWwKK2NvbmZsaWN0ZWQgbWVyZ2UgdXNpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20geW91ciBlYXJsaWVyIGhhbmQKK3Jlc29sdmUuCisKK1J1bm5pbmcgYGdpdC1yZXJlcmVgIGNvbW1hbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjb25mbGljdGVkCithdXRvbWVyZ2UgcmVjb3JkcyB0aGUgY29uZmxpY3RlZCB3b3JraW5nIHRyZWUgZmlsZXMsIHdpdGggdGhlCit1c3VhbCBjb25mbGljdCBtYXJrZXJzIGA8PDw8PDw8YCwgYD09PT09PT1gLCBhbmQgYD4+Pj4+Pj5gIGluCit0aGVtLiAgTGF0ZXIsIGFmdGVyIHlvdSBhcmUgZG9uZSByZXNvbHZpbmcgdGhlIGNvbmZsaWN0cywKK3J1bm5pbmcgYGdpdC1yZXJlcmVgIGFnYWluIHJlY29yZHMgdGhlIHJlc29sdmVkIHN0YXRlIG9mIHRoZXNlCitmaWxlcy4gIFN1cHBvc2UgeW91IGRpZCB0aGlzIHdoZW4geW91IGNyZWF0ZWQgdGhlIHRlc3QgbWVyZ2Ugb2YKK21hc3RlciBpbnRvIHRoZSB0b3BpYyBicmFuY2guCisKK05leHQgdGltZSwgcnVubmluZyBgZ2l0LXJlcmVyZWAgYWZ0ZXIgc2VlaW5nIGEgY29uZmxpY3RlZAorYXV0b21lcmdlLCBpZiB0aGUgY29uZmxpY3QgaXMgdGhlIHNhbWUgYXMgdGhlIGVhcmxpZXIgb25lCityZWNvcmRlZCwgaXQgaXMgbm90aWNlZCBhbmQgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGUKK2VhcmxpZXIgY29uZmxpY3RlZCBhdXRvbWVyZ2UsIHRoZSBlYXJsaWVyIG1hbnVhbCByZXNvbHV0aW9uLCBhbmQKK3RoZSBjdXJyZW50IGNvbmZsaWN0ZWQgYXV0b21lcmdlIGlzIHBlcmZvcm1lZCBieSB0aGUgY29tbWFuZC4KK0lmIHRoaXMgdGhyZWUtd2F5IG1lcmdlIHJlc29sdmVzIGNsZWFubHksIHRoZSByZXN1bHQgaXMgd3JpdHRlbgorb3V0IHRvIHlvdXIgd29ya2luZyB0cmVlIGZpbGUsIHNvIHlvdSB3b3VsZCBub3QgaGF2ZSB0byBtYW51YWxseQorcmVzb2x2ZSBpdC4gIE5vdGUgdGhhdCBgZ2l0LXJlcmVyZWAgbGVhdmVzIHRoZSBpbmRleCBmaWxlIGFsb25lLAorc28geW91IHN0aWxsIG5lZWQgdG8gZG8gdGhlIGZpbmFsIHNhbml0eSBjaGVja3Mgd2l0aCBgZ2l0IGRpZmZgCisob3IgYGdpdCBkaWZmIC1jYCkgYW5kIGBnaXQgdXBkYXRlLWluZGV4YCB3aGVuIHlvdSBhcmUKK3NhdGlzZmllZC4KKworQXMgYSBjb252ZW5pZW5jZSBtZWFzdXJlLCBgZ2l0LW1lcmdlYCBhdXRvbWF0aWNhbGx5IGludm9rZXMKK2BnaXQtcmVyZXJlYCB3aGVuIGl0IGV4aXRzIHdpdGggYSBmYWlsZWQgYXV0b21lcmdlLCB3aGljaAorcmVjb3JkcyBpdCBpZiBpdCBpcyBhIG5ldyBjb25mbGljdCwgb3IgcmV1c2VzIHRoZSBlYXJsaWVyIGhhbmQKK3Jlc29sdmUgd2hlbiBpdCBpcyBub3QuICBgZ2l0LWNvbW1pdGAgYWxzbyBpbnZva2VzIGBnaXQtcmVyZXJlYAord2hlbiByZWNvcmRpbmcgYSBtZXJnZSByZXN1bHQuICBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB5b3UgZG8KK25vdCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgeW91cnNlbGYgKE5vdGU6IHlvdSBzdGlsbCBoYXZlCit0byBjcmVhdGUgYCRHSVRfRElSL3JyLWNhY2hlYCBkaXJlY3RvcnkgdG8gZW5hYmxlIHRoaXMgY29tbWFuZCkuCisKK0luIG91ciBleGFtcGxlLCB3aGVuIHlvdSBkaWQgdGhlIHRlc3QgbWVyZ2UsIHRoZSBtYW51YWwKK3Jlc29sdXRpb24gaXMgcmVjb3JkZWQsIGFuZCBpdCB3aWxsIGJlIHJldXNlZCB3aGVuIHlvdSBkbyB0aGUKK2FjdHVhbCBtZXJnZSBsYXRlciB3aXRoIHVwZGF0ZWQgbWFzdGVyIGFuZCB0b3BpYyBicmFuY2gsIGFzIGxvbmcKK2FzIHRoZSBlYXJsaWVyIHJlc29sdXRpb24gaXMgc3RpbGwgYXBwbGljYWJsZS4KKworVGhlIGluZm9ybWF0aW9uIGBnaXQtcmVyZXJlYCByZWNvcmRzIGlzIGFsc28gdXNlZCB3aGVuIHJ1bm5pbmcKK2BnaXQtcmViYXNlYC4gIEFmdGVyIGJsb3dpbmcgYXdheSB0aGUgdGVzdCBtZXJnZSBhbmQgY29udGludWluZworZGV2ZWxvcG1lbnQgb24gdGhlIHRvcGljIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIG8tLS0qLS0tby0tLS0tLS1vLS0tbyB0b3BpYworICAgICAgICAgICAgIC8KKyAgICBvLS0tby0tLW8tLS0qLS0tby0tLW8tLS1vLS0tbyAgIG1hc3RlcgorCisJJCBnaXQgcmViYXNlIG1hc3RlciB0b3BpYworCisJCQkJICBvLS0tKi0tLW8tLS0tLS0tby0tLW8gdG9waWMKKwkJCQkgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vICAgbWFzdGVyCistLS0tLS0tLS0tLS0KKworeW91IGNvdWxkIHJ1biBgZ2l0IHJlYmFzZSBtYXN0ZXIgdG9waWNgLCB0byBrZWVwIHlvdXJzZWxmCit1cC10by1kYXRlIGV2ZW4gYmVmb3JlIHlvdXIgdG9waWMgaXMgcmVhZHkgdG8gYmUgc2VudCB1cHN0cmVhbS4KK1RoaXMgd291bGQgcmVzdWx0IGluIGZhbGxpbmcgYmFjayB0byB0aHJlZS13YXkgbWVyZ2UsIGFuZCBpdAord291bGQgY29uZmxpY3QgdGhlIHNhbWUgd2F5IHRoZSB0ZXN0IG1lcmdlIHlvdSByZXNvbHZlZCBlYXJsaWVyLgorYGdpdC1yZXJlcmVgIGlzIHJ1biBieSBgZ2l0IHJlYmFzZWAgdG8gaGVscCB5b3UgcmVzb2x2ZSB0aGlzCitjb25mbGljdC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVzZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVzZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTBmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXNldC50eHQKQEAgLTAsMCArMSwxODIgQEAKK2dpdC1yZXNldCgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXNldCAtIFJlc2V0IGN1cnJlbnQgSEVBRCB0byB0aGUgc3BlY2lmaWVkIHN0YXRlCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZXNldCcgWy0tbWl4ZWQgfCAtLXNvZnQgfCAtLWhhcmRdIFs8Y29tbWl0LWlzaD5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2V0cyB0aGUgY3VycmVudCBoZWFkIHRvIHRoZSBzcGVjaWZpZWQgY29tbWl0IGFuZCBvcHRpb25hbGx5IHJlc2V0cyB0aGUKK2luZGV4IGFuZCB3b3JraW5nIHRyZWUgdG8gbWF0Y2guCisKK1RoaXMgY29tbWFuZCBpcyB1c2VmdWwgaWYgeW91IG5vdGljZSBzb21lIHNtYWxsIGVycm9yIGluIGEgcmVjZW50Citjb21taXQgKG9yIHNldCBvZiBjb21taXRzKSBhbmQgd2FudCB0byByZWRvIHRoYXQgcGFydCB3aXRob3V0IHNob3dpbmcKK3RoZSB1bmRvIGluIHRoZSBoaXN0b3J5LgorCitJZiB5b3Ugd2FudCB0byB1bmRvIGEgY29tbWl0IG90aGVyIHRoYW4gdGhlIGxhdGVzdCBvbiBhIGJyYW5jaCwKK2dpdGxpbms6Z2l0LXJldmVydFsxXSBpcyB5b3VyIGZyaWVuZC4KKworT1BUSU9OUworLS0tLS0tLQorLS1taXhlZDo6CisJUmVzZXRzIHRoZSBpbmRleCBidXQgbm90IHRoZSB3b3JraW5nIHRyZWUgKGkuZS4sIHRoZSBjaGFuZ2VkIGZpbGVzCisJYXJlIHByZXNlcnZlZCBidXQgbm90IG1hcmtlZCBmb3IgY29tbWl0KSBhbmQgcmVwb3J0cyB3aGF0IGhhcyBub3QKKwliZWVuIHVwZGF0ZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYWN0aW9uLgorCistLXNvZnQ6OgorCURvZXMgbm90IHRvdWNoIHRoZSBpbmRleCBmaWxlIG5vciB0aGUgd29ya2luZyB0cmVlIGF0IGFsbCwgYnV0CisJcmVxdWlyZXMgdGhlbSB0byBiZSBpbiBhIGdvb2Qgb3JkZXIuIFRoaXMgbGVhdmVzIGFsbCB5b3VyIGNoYW5nZWQKKwlmaWxlcyAiVXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iLCBhcyBnaXRsaW5rOmdpdC1zdGF0dXNbMV0gd291bGQKKwlwdXQgaXQuCisKKy0taGFyZDo6CisJTWF0Y2hlcyB0aGUgd29ya2luZyB0cmVlIGFuZCBpbmRleCB0byB0aGF0IG9mIHRoZSB0cmVlIGJlaW5nCisJc3dpdGNoZWQgdG8uIEFueSBjaGFuZ2VzIHRvIHRyYWNrZWQgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZQorCXNpbmNlIDxjb21taXQtaXNoPiBhcmUgbG9zdC4KKworPGNvbW1pdC1pc2g+OjoKKwlDb21taXQgdG8gbWFrZSB0aGUgY3VycmVudCBIRUFELgorCitFeGFtcGxlcworLS0tLS0tLS0KKworVW5kbyBhIGNvbW1pdCBhbmQgcmVkbzo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAuLi4KKyQgZ2l0IHJlc2V0IC0tc29mdCBIRUFEXiAgICAgIDwxPgorJCBlZGl0ICAgICAgICAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCBjb21taXQgLWEgLWMgT1JJR19IRUFEICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IFRoaXMgaXMgbW9zdCBvZnRlbiBkb25lIHdoZW4geW91IHJlbWVtYmVyZWQgd2hhdCB5b3UKK2p1c3QgY29tbWl0dGVkIGlzIGluY29tcGxldGUsIG9yIHlvdSBtaXNzcGVsbGVkIHlvdXIgY29tbWl0CittZXNzYWdlLCBvciBib3RoLiAgTGVhdmVzIHdvcmtpbmcgdHJlZSBhcyBpdCB3YXMgYmVmb3JlICJyZXNldCIuCis8Mj4gbWFrZSBjb3JyZWN0aW9ucyB0byB3b3JraW5nIHRyZWUgZmlsZXMuCis8Mz4gInJlc2V0IiBjb3BpZXMgdGhlIG9sZCBoZWFkIHRvIC5naXQvT1JJR19IRUFEOyByZWRvIHRoZQorY29tbWl0IGJ5IHN0YXJ0aW5nIHdpdGggaXRzIGxvZyBtZXNzYWdlLiAgSWYgeW91IGRvIG5vdCBuZWVkIHRvCitlZGl0IHRoZSBtZXNzYWdlIGZ1cnRoZXIsIHlvdSBjYW4gZ2l2ZSAtQyBvcHRpb24gaW5zdGVhZC4KKworVW5kbyBjb21taXRzIHBlcm1hbmVudGx5OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC4uLgorJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MyAgIDwxPgorLS0tLS0tLS0tLS0tCisrCis8MT4gVGhlIGxhc3QgdGhyZWUgY29tbWl0cyAoSEVBRCwgSEVBRF4sIGFuZCBIRUFEfjIpIHdlcmUgYmFkCithbmQgeW91IGRvIG5vdCB3YW50IHRvIGV2ZXIgc2VlIHRoZW0gYWdhaW4uICBEbyAqbm90KiBkbyB0aGlzIGlmCit5b3UgaGF2ZSBhbHJlYWR5IGdpdmVuIHRoZXNlIGNvbW1pdHMgdG8gc29tZWJvZHkgZWxzZS4KKworVW5kbyBhIGNvbW1pdCwgbWFraW5nIGl0IGEgdG9waWMgYnJhbmNoOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIHRvcGljL3dpcCAgICAgPDE+CiskIGdpdCByZXNldCAtLWhhcmQgSEVBRH4zICA8Mj4KKyQgZ2l0IGNoZWNrb3V0IHRvcGljL3dpcCAgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gWW91IGhhdmUgbWFkZSBzb21lIGNvbW1pdHMsIGJ1dCByZWFsaXplIHRoZXkgd2VyZSBwcmVtYXR1cmUKK3RvIGJlIGluIHRoZSAibWFzdGVyIiBicmFuY2guICBZb3Ugd2FudCB0byBjb250aW51ZSBwb2xpc2hpbmcKK3RoZW0gaW4gYSB0b3BpYyBicmFuY2gsIHNvIGNyZWF0ZSAidG9waWMvd2lwIiBicmFuY2ggb2ZmIG9mIHRoZQorY3VycmVudCBIRUFELgorPDI+IFJld2luZCB0aGUgbWFzdGVyIGJyYW5jaCB0byBnZXQgcmlkIG9mIHRob3NlIHRocmVlIGNvbW1pdHMuCis8Mz4gU3dpdGNoIHRvICJ0b3BpYy93aXAiIGJyYW5jaCBhbmQga2VlcCB3b3JraW5nLgorCitVbmRvIHVwZGF0ZS1pbmRleDo6CisrCistLS0tLS0tLS0tLS0KKyQgZWRpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8MT4KKyQgZ2l0LXVwZGF0ZS1pbmRleCBmcm90ei5jIGZpbGZyZS5jCiskIG1haWx4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCByZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDM+CiskIGdpdCBwdWxsIGdpdDovL2luZm8uZXhhbXBsZS5jb20vIG5pdGZvbCAgPDQ+CistLS0tLS0tLS0tLS0KKysKKzwxPiB5b3UgYXJlIGhhcHBpbHkgd29ya2luZyBvbiBzb21ldGhpbmcsIGFuZCBmaW5kIHRoZSBjaGFuZ2VzCitpbiB0aGVzZSBmaWxlcyBhcmUgaW4gZ29vZCBvcmRlci4gIFlvdSBkbyBub3Qgd2FudCB0byBzZWUgdGhlbQord2hlbiB5b3UgcnVuICJnaXQgZGlmZiIsIGJlY2F1c2UgeW91IHBsYW4gdG8gd29yayBvbiBvdGhlciBmaWxlcworYW5kIGNoYW5nZXMgd2l0aCB0aGVzZSBmaWxlcyBhcmUgZGlzdHJhY3RpbmcuCis8Mj4gc29tZWJvZHkgYXNrcyB5b3UgdG8gcHVsbCwgYW5kIHRoZSBjaGFuZ2VzIHNvdW5kcyB3b3J0aHkgb2YgbWVyZ2luZy4KKzwzPiBob3dldmVyLCB5b3UgYWxyZWFkeSBkaXJ0aWVkIHRoZSBpbmRleCAoaS5lLiB5b3VyIGluZGV4IGRvZXMKK25vdCBtYXRjaCB0aGUgSEVBRCBjb21taXQpLiAgQnV0IHlvdSBrbm93IHRoZSBwdWxsIHlvdSBhcmUgZ29pbmcKK3RvIG1ha2UgZG9lcyBub3QgYWZmZWN0IGZyb3R6LmMgbm9yIGZpbGZyZS5jLCBzbyB5b3UgcmV2ZXJ0IHRoZQoraW5kZXggY2hhbmdlcyBmb3IgdGhlc2UgdHdvIGZpbGVzLiAgWW91ciBjaGFuZ2VzIGluIHdvcmtpbmcgdHJlZQorcmVtYWluIHRoZXJlLgorPDQ+IHRoZW4geW91IGNhbiBwdWxsIGFuZCBtZXJnZSwgbGVhdmluZyBmcm90ei5jIGFuZCBmaWxmcmUuYworY2hhbmdlcyBzdGlsbCBpbiB0aGUgd29ya2luZyB0cmVlLgorCitVbmRvIGEgbWVyZ2Ugb3IgcHVsbDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgICAgICAgICAgICAgICAgICAgICAgICAgPDE+CitUcnlpbmcgcmVhbGx5IHRyaXZpYWwgaW4taW5kZXggbWVyZ2UuLi4KK2ZhdGFsOiBNZXJnZSByZXF1aXJlcyBmaWxlLWxldmVsIG1lcmdpbmcKK05vcGUuCisuLi4KK0F1dG8tbWVyZ2luZyBuaXRmb2wKK0NPTkZMSUNUIChjb250ZW50KTogTWVyZ2UgY29uZmxpY3QgaW4gbml0Zm9sCitBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkL3ByZXZlbnRlZDsgZml4IHVwIGJ5IGhhbmQKKyQgZ2l0IHJlc2V0IC0taGFyZCAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCBwdWxsIC4gdG9waWMvYnJhbmNoICAgICAgICAgIDwzPgorVXBkYXRpbmcgZnJvbSA0MTIyMy4uLiB0byAxMzEzNC4uLgorRmFzdCBmb3J3YXJkCiskIGdpdCByZXNldCAtLWhhcmQgT1JJR19IRUFEICAgICAgIDw0PgorLS0tLS0tLS0tLS0tCisrCis8MT4gdHJ5IHRvIHVwZGF0ZSBmcm9tIHRoZSB1cHN0cmVhbSByZXN1bHRlZCBpbiBhIGxvdCBvZgorY29uZmxpY3RzOyB5b3Ugd2VyZSBub3QgcmVhZHkgdG8gc3BlbmQgYSBsb3Qgb2YgdGltZSBtZXJnaW5nCityaWdodCBub3csIHNvIHlvdSBkZWNpZGUgdG8gZG8gdGhhdCBsYXRlci4KKzwyPiAicHVsbCIgaGFzIG5vdCBtYWRlIG1lcmdlIGNvbW1pdCwgc28gImdpdCByZXNldCAtLWhhcmQiCit3aGljaCBpcyBhIHN5bm9ueW0gZm9yICJnaXQgcmVzZXQgLS1oYXJkIEhFQUQiIGNsZWFycyB0aGUgbWVzcworZnJvbSB0aGUgaW5kZXggZmlsZSBhbmQgdGhlIHdvcmtpbmcgdHJlZS4KKzwzPiBtZXJnZSBhIHRvcGljIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgd2hpY2ggcmVzdWx0ZWQKK2luIGEgZmFzdCBmb3J3YXJkLgorPDQ+IGJ1dCB5b3UgZGVjaWRlZCB0aGF0IHRoZSB0b3BpYyBicmFuY2ggaXMgbm90IHJlYWR5IGZvciBwdWJsaWMKK2NvbnN1bXB0aW9uIHlldC4gICJwdWxsIiBvciAibWVyZ2UiIGFsd2F5cyBsZWF2ZXMgdGhlIG9yaWdpbmFsCit0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoIGluIE9SSUdfSEVBRCwgc28gcmVzZXR0aW5nIGhhcmQgdG8gaXQKK2JyaW5ncyB5b3VyIGluZGV4IGZpbGUgYW5kIHRoZSB3b3JraW5nIHRyZWUgYmFjayB0byB0aGF0IHN0YXRlLAorYW5kIHJlc2V0cyB0aGUgdGlwIG9mIHRoZSBicmFuY2ggdG8gdGhhdCBjb21taXQuCisKK0ludGVycnVwdGVkIHdvcmtmbG93OjoKKysKK1N1cHBvc2UgeW91IGFyZSBpbnRlcnJ1cHRlZCBieSBhbiB1cmdlbnQgZml4IHJlcXVlc3Qgd2hpbGUgeW91CithcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGxhcmdlIGNoYW5nZS4gIFRoZSBmaWxlcyBpbiB5b3VyCit3b3JraW5nIHRyZWUgYXJlIG5vdCBpbiBhbnkgc2hhcGUgdG8gYmUgY29tbWl0dGVkIHlldCwgYnV0IHlvdQorbmVlZCB0byBnZXQgdG8gdGhlIG90aGVyIGJyYW5jaCBmb3IgYSBxdWljayBidWdmaXguCisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IGZlYXR1cmUgOyMgeW91IHdlcmUgd29ya2luZyBpbiAiZmVhdHVyZSIgYnJhbmNoIGFuZAorJCB3b3JrIHdvcmsgd29yayAgICAgICA7IyBnb3QgaW50ZXJydXB0ZWQKKyQgZ2l0IGNvbW1pdCAtYSAtbSAnc25hcHNob3QgV0lQJyAgICAgICAgICAgICAgICAgPDE+CiskIGdpdCBjaGVja291dCBtYXN0ZXIKKyQgZml4IGZpeCBmaXgKKyQgZ2l0IGNvbW1pdCA7IyBjb21taXQgd2l0aCByZWFsIGxvZworJCBnaXQgY2hlY2tvdXQgZmVhdHVyZQorJCBnaXQgcmVzZXQgLS1zb2Z0IEhFQUReIDsjIGdvIGJhY2sgdG8gV0lQIHN0YXRlICA8Mj4KKyQgZ2l0IHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBUaGlzIGNvbW1pdCB3aWxsIGdldCBibG93biBhd2F5IHNvIGEgdGhyb3ctYXdheSBsb2cgbWVzc2FnZSBpcyBPSy4KKzwyPiBUaGlzIHJlbW92ZXMgdGhlICdXSVAnIGNvbW1pdCBmcm9tIHRoZSBjb21taXQgaGlzdG9yeSwgYW5kIHNldHMKKyAgICB5b3VyIHdvcmtpbmcgdHJlZSB0byB0aGUgc3RhdGUganVzdCBiZWZvcmUgeW91IG1hZGUgdGhhdCBzbmFwc2hvdC4KKzwzPiBBdCB0aGlzIHBvaW50IHRoZSBpbmRleCBmaWxlIHN0aWxsIGhhcyBhbGwgdGhlIFdJUCBjaGFuZ2VzIHlvdQorICAgIGNvbW1pdHRlZCBhcyAnc25hcHNob3QgV0lQJy4gIFRoaXMgdXBkYXRlcyB0aGUgaW5kZXggdG8gc2hvdyB5b3VyCisgICAgV0lQIGZpbGVzIGFzIHVuY29tbWl0dGVkLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZCBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlc29sdmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVzb2x2ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1N2MyYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlc29sdmUudHh0CkBAIC0wLDAgKzEsMzYgQEAKK2dpdC1yZXNvbHZlKDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVzb2x2ZSAtIE1lcmdlIHR3byBjb21taXRzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlc29sdmUnIDxjdXJyZW50PiA8bWVyZ2VkPiA8bWVzc2FnZT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXZlbiB0d28gY29tbWl0cyBhbmQgYSBtZXJnZSBtZXNzYWdlLCBtZXJnZSB0aGUgPG1lcmdlZD4gY29tbWl0CitpbnRvIDxjdXJyZW50PiBjb21taXQsIHdpdGggdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSA8bWVzc2FnZT4uCisKK1doZW4gPGN1cnJlbnQ+IGlzIGEgZGVzY2VuZGFudCBvZiA8bWVyZ2VkPiwgb3IgPGN1cnJlbnQ+IGlzIGFuCithbmNlc3RvciBvZiA8bWVyZ2VkPiwgbm8gbmV3IGNvbW1pdCBpcyBjcmVhdGVkIGFuZCB0aGUgPG1lc3NhZ2U+CitpcyBpZ25vcmVkLiAgVGhlIGZvcm1lciBpcyBpbmZvcm1hbGx5IGNhbGxlZCAiYWxyZWFkeSB1cCB0bworZGF0ZSIsIGFuZCB0aGUgbGF0dGVyIGlzIG9mdGVuIGNhbGxlZCAiZmFzdCBmb3J3YXJkIi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorRGFuIEhvbG1zYW5kIDxob2xtc2FuZEBnbWFpbC5jb20+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJldi1saXN0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJldi1saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDZkMTRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2LWxpc3QudHh0CkBAIC0wLDAgKzEsMTE3IEBACitnaXQtcmV2LWxpc3QoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmV2LWxpc3QgLSBMaXN0cyBjb21taXQgb2JqZWN0cyBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcmV2LWxpc3QnIFsgXC0tbWF4LWNvdW50PW51bWJlciBdCisJICAgICBbIFwtLW1heC1hZ2U9dGltZXN0YW1wIF0KKwkgICAgIFsgXC0tbWluLWFnZT10aW1lc3RhbXAgXQorCSAgICAgWyBcLS1zcGFyc2UgXQorCSAgICAgWyBcLS1uby1tZXJnZXMgXQorCSAgICAgWyBcLS1yZW1vdmUtZW1wdHkgXQorCSAgICAgWyBcLS1hbGwgXQorCSAgICAgWyBcLS10b3BvLW9yZGVyIF0KKwkgICAgIFsgXC0tcGFyZW50cyBdCisJICAgICBbIFtcLS1vYmplY3RzIHwgXC0tb2JqZWN0cy1lZGdlXSBbIFwtLXVucGFja2VkIF0gXQorCSAgICAgWyBcLS1wcmV0dHkgfCBcLS1oZWFkZXIgXQorCSAgICAgWyBcLS1iaXNlY3QgXQorCSAgICAgPGNvbW1pdD4uLi4gWyBcLS0gPHBhdGhzPi4uLiBdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorTGlzdHMgY29tbWl0IG9iamVjdHMgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyIHN0YXJ0aW5nIGF0IHRoZQorZ2l2ZW4gY29tbWl0KHMpLCB0YWtpbmcgYW5jZXN0cnkgcmVsYXRpb25zaGlwIGludG8gYWNjb3VudC4gIFRoaXMgaXMKK3VzZWZ1bCB0byBwcm9kdWNlIGh1bWFuLXJlYWRhYmxlIGxvZyBvdXRwdXQuCisKK0NvbW1pdHMgd2hpY2ggYXJlIHN0YXRlZCB3aXRoIGEgcHJlY2VkaW5nICd7Y2FyZXR9JyBjYXVzZSBsaXN0aW5nIHRvIHN0b3AgYXQKK3RoYXQgcG9pbnQuIFRoZWlyIHBhcmVudHMgYXJlIGltcGxpZWQuICJnaXQtcmV2LWxpc3QgZm9vIGJhciB7Y2FyZXR9YmF6IiB0aHVzCittZWFucyAibGlzdCBhbGwgdGhlIGNvbW1pdHMgd2hpY2ggYXJlIGluY2x1ZGVkIGluICdmb28nIGFuZCAnYmFyJywgYnV0Citub3QgaW4gJ2JheiciLgorCitBIHNwZWNpYWwgbm90YXRpb24gPGNvbW1pdDE+Li48Y29tbWl0Mj4gY2FuIGJlIHVzZWQgYXMgYQorc2hvcnQtaGFuZCBmb3Ige2NhcmV0fTxjb21taXQxPiA8Y29tbWl0Mj4uCisKKworT1BUSU9OUworLS0tLS0tLQorLS1wcmV0dHk6OgorCVByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgY29tbWl0IGNoYW5nZXNldHMgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4KKworLS1oZWFkZXI6OgorCVByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgY29tbWl0IGluIHJhdy1mb3JtYXQ7IGVhY2gKKwlyZWNvcmQgaXMgc2VwYXJhdGVkIHdpdGggYSBOVUwgY2hhcmFjdGVyLgorCistLW9iamVjdHM6OgorCVByaW50IHRoZSBvYmplY3QgSURzIG9mIGFueSBvYmplY3QgcmVmZXJlbmNlZCBieSB0aGUgbGlzdGVkIGNvbW1pdHMuCisJJ2dpdC1yZXYtbGlzdCAtLW9iamVjdHMgZm9vIF5iYXInIHRodXMgbWVhbnMgInNlbmQgbWUgYWxsIG9iamVjdCBJRHMKKwl3aGljaCBJIG5lZWQgdG8gZG93bmxvYWQgaWYgSSBoYXZlIHRoZSBjb21taXQgb2JqZWN0ICdiYXInLCBidXQKKwlub3QgJ2ZvbyciLgorCistLW9iamVjdHMtZWRnZTo6CisJU2ltaWxhciB0byBgLS1vYmplY3RzYCwgYnV0IGFsc28gcHJpbnQgdGhlIElEcyBvZgorCWV4Y2x1ZGVkIGNvbW1pdHMgcmVmaXhlZCB3aXRoIGEgYC1gIGNoYXJhY3Rlci4gIFRoaXMgaXMKKwl1c2VkIGJ5IGBnaXQtcGFjay1vYmplY3RzYCB0byBidWlsZCAndGhpbicgcGFjaywgd2hpY2gKKwlyZWNvcmRzIG9iamVjdHMgaW4gZGVsdGlmaWVkIGZvcm0gYmFzZWQgb24gb2JqZWN0cworCWNvbnRhaW5lZCBpbiB0aGVzZSBleGNsdWRlZCBjb21taXRzIHRvIHJlZHVjZSBuZXR3b3JrCisJdHJhZmZpYy4KKworLS11bnBhY2tlZDo6CisJT25seSB1c2VmdWwgd2l0aCBgLS1vYmplY3RzYDsgcHJpbnQgdGhlIG9iamVjdCBJRHMgdGhhdAorCWFyZSBub3QgaW4gcGFja3MuCisKKy0tYmlzZWN0OjoKKwlMaW1pdCBvdXRwdXQgdG8gdGhlIG9uZSBjb21taXQgb2JqZWN0IHdoaWNoIGlzIHJvdWdobHkgaGFsZndheQorCWJldHdlZW4gdGhlIGluY2x1ZGVkIGFuZCBleGNsdWRlZCBjb21taXRzLiBUaHVzLCBpZiAnZ2l0LXJldi1saXN0CisJLS1iaXNlY3QgZm9vIHtjYXJldH1iYXIge2NhcmV0fWJheicgb3V0cHV0cyAnbWlkcG9pbnQnLCB0aGUgb3V0cHV0CisJb2YgJ2dpdC1yZXYtbGlzdCBmb28ge2NhcmV0fW1pZHBvaW50JyBhbmQgJ2dpdC1yZXYtbGlzdCBtaWRwb2ludAorCXtjYXJldH1iYXIge2NhcmV0fWJheicgd291bGQgYmUgb2Ygcm91Z2hseSB0aGUgc2FtZSBsZW5ndGguCisJRmluZGluZyB0aGUgY2hhbmdlCisJd2hpY2ggaW50cm9kdWNlcyBhIHJlZ3Jlc3Npb24gaXMgdGh1cyByZWR1Y2VkIHRvIGEgYmluYXJ5IHNlYXJjaDoKKwlyZXBlYXRlZGx5IGdlbmVyYXRlIGFuZCB0ZXN0IG5ldyAnbWlkcG9pbnQncyB1bnRpbCB0aGUgY29tbWl0IGNoYWluCisJaXMgb2YgbGVuZ3RoIG9uZS4KKworLS1tYXgtY291bnQ6OgorCUxpbWl0IHRoZSBudW1iZXIgb2YgY29tbWl0cyBvdXRwdXQuCisKKy0tbWF4LWFnZT10aW1lc3RhbXAsIC0tbWluLWFnZT10aW1lc3RhbXA6OgorCUxpbWl0IHRoZSBjb21taXRzIG91dHB1dCB0byBzcGVjaWZpZWQgdGltZSByYW5nZS4KKworLS1zcGFyc2U6OgorCVdoZW4gb3B0aW9uYWwgcGF0aHMgYXJlIGdpdmVuLCB0aGUgY29tbWFuZCBvdXRwdXRzIG9ubHkKKwl0aGUgY29tbWl0cyB0aGF0IGNoYW5nZXMgYXQgbGVhc3Qgb25lIG9mIHRoZW0sIGFuZCBhbHNvCisJaWdub3JlcyBtZXJnZXMgdGhhdCBkbyBub3QgdG91Y2ggdGhlIGdpdmVuIHBhdGhzLiAgVGhpcworCWZsYWcgbWFrZXMgdGhlIGNvbW1hbmQgb3V0cHV0IGFsbCBlbGlnaWJsZSBjb21taXRzCisJKHN0aWxsIHN1YmplY3QgdG8gY291bnQgYW5kIGFnZSBsaW1pdGF0aW9uKSwgYnV0IGFwcGx5CisJbWVyZ2Ugc2ltcGxpZmljYXRpb24gbmV2ZXJ0aGVsZXNzLgorCistLXJlbW92ZS1lbXB0eTo6CisJU3RvcCB3aGVuIGEgZ2l2ZW4gcGF0aCBkaXNhcHBlYXJzIGZyb20gdGhlIHRyZWUuCisKKy0tYWxsOjoKKwlQcmV0ZW5kIGFzIGlmIGFsbCB0aGUgcmVmcyBpbiBgJEdJVF9ESVIvcmVmcy9gIGFyZQorCWxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFzIDxjb21taXQ+LgorCistLXRvcG8tb3JkZXI6OgorCUJ5IGRlZmF1bHQsIHRoZSBjb21taXRzIGFyZSBzaG93biBpbiByZXZlcnNlCisJY2hyb25vbG9naWNhbCBvcmRlci4gIFRoaXMgb3B0aW9uIG1ha2VzIHRoZW0gYXBwZWFyIGluCisJdG9wb2xvZ2ljYWwgb3JkZXIgKGkuZS4gZGVzY2VuZGFudCBjb21taXRzIGFyZSBzaG93bgorCWJlZm9yZSB0aGVpciBwYXJlbnRzKS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJldi1wYXJzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXYtcGFyc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2NkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXYtcGFyc2UudHh0CkBAIC0wLDAgKzEsMjAzIEBACitnaXQtcmV2LXBhcnNlKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXYtcGFyc2UgLSBQaWNrIG91dCBhbmQgbWFzc2FnZSBwYXJhbWV0ZXJzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJldi1wYXJzZScgWyAtLW9wdGlvbiBdIDxhcmdzPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworTWFueSBnaXQgcG9yY2VsYWluaXNoIGNvbW1hbmRzIHRha2UgbWl4dHVyZSBvZiBmbGFncworKGkuZS4gcGFyYW1ldGVycyB0aGF0IGJlZ2luIHdpdGggYSBkYXNoICctJykgYW5kIHBhcmFtZXRlcnMKK21lYW50IGZvciB1bmRlcmx5aW5nIGBnaXQtcmV2LWxpc3RgIGNvbW1hbmQgdGhleSB1c2UgaW50ZXJuYWxseQorYW5kIGZsYWdzIGFuZCBwYXJhbWV0ZXJzIGZvciBvdGhlciBjb21tYW5kcyB0aGV5IHVzZSBhcyB0aGUKK2Rvd25zdHJlYW0gb2YgYGdpdC1yZXYtbGlzdGAuICBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0bworZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tcmV2cy1vbmx5OjoKKwlEbyBub3Qgb3V0cHV0IGZsYWdzIGFuZCBwYXJhbWV0ZXJzIG5vdCBtZWFudCBmb3IKKwlgZ2l0LXJldi1saXN0YCBjb21tYW5kLgorCistLW5vLXJldnM6OgorCURvIG5vdCBvdXRwdXQgZmxhZ3MgYW5kIHBhcmFtZXRlcnMgbWVhbnQgZm9yCisJYGdpdC1yZXYtbGlzdGAgY29tbWFuZC4KKworLS1mbGFnczo6CisJRG8gbm90IG91dHB1dCBub24tZmxhZyBwYXJhbWV0ZXJzLgorCistLW5vLWZsYWdzOjoKKwlEbyBub3Qgb3V0cHV0IGZsYWcgcGFyYW1ldGVycy4KKworLS1kZWZhdWx0IDxhcmc+OjoKKwlJZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgZ2l2ZW4gYnkgdGhlIHVzZXIsIHVzZSBgPGFyZz5gCisJaW5zdGVhZC4KKworLS12ZXJpZnk6OgorCVRoZSBwYXJhbWV0ZXIgZ2l2ZW4gbXVzdCBiZSB1c2FibGUgYXMgYSBzaW5nbGUsIHZhbGlkCisJb2JqZWN0IG5hbWUuICBPdGhlcndpc2UgYmFyZiBhbmQgYWJvcnQuCisKKy0tc3E6OgorCVVzdWFsbHkgdGhlIG91dHB1dCBpcyBtYWRlIG9uZSBsaW5lIHBlciBmbGFnIGFuZAorCXBhcmFtZXRlci4gIFRoaXMgb3B0aW9uIG1ha2VzIG91dHB1dCBhIHNpbmdsZSBsaW5lLAorCXByb3Blcmx5IHF1b3RlZCBmb3IgY29uc3VtcHRpb24gYnkgc2hlbGwuICBVc2VmdWwgd2hlbgorCXlvdSBleHBlY3QgeW91ciBwYXJhbWV0ZXIgdG8gY29udGFpbiB3aGl0ZXNwYWNlcyBhbmQKKwluZXdsaW5lcyAoZS5nLiB3aGVuIHVzaW5nIHBpY2theGUgYC1TYCB3aXRoCisJYGdpdC1kaWZmLVwqYCkuCisKKy0tbm90OjoKKwlXaGVuIHNob3dpbmcgb2JqZWN0IG5hbWVzLCBwcmVmaXggdGhlbSB3aXRoICd7Y2FyZXR9JyBhbmQKKwlzdHJpcCAne2NhcmV0fScgcHJlZml4IGZyb20gdGhlIG9iamVjdCBuYW1lcyB0aGF0IGFscmVhZHkgaGF2ZQorCW9uZS4KKworLS1zeW1ib2xpYzo6CisJVXN1YWxseSB0aGUgb2JqZWN0IG5hbWVzIGFyZSBvdXRwdXQgaW4gU0hBMSBmb3JtICh3aXRoCisJcG9zc2libGUgJ3tjYXJldH0nIHByZWZpeCk7IHRoaXMgb3B0aW9uIG1ha2VzIHRoZW0gb3V0cHV0IGluIGEKKwlmb3JtIGFzIGNsb3NlIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCBhcyBwb3NzaWJsZS4KKworCistLWFsbDo6CisJU2hvdyBhbGwgcmVmcyBmb3VuZCBpbiBgJEdJVF9ESVIvcmVmc2AuCisKKy0tYnJhbmNoZXM6OgorCVNob3cgYnJhbmNoIHJlZnMgZm91bmQgaW4gYCRHSVRfRElSL3JlZnMvaGVhZHNgLgorCistLXRhZ3M6OgorCVNob3cgdGFnIHJlZnMgZm91bmQgaW4gYCRHSVRfRElSL3JlZnMvdGFnc2AuCisKKy0tcmVtb3Rlczo6CisJU2hvdyB0YWcgcmVmcyBmb3VuZCBpbiBgJEdJVF9ESVIvcmVmcy9yZW1vdGVzYC4KKworLS1zaG93LXByZWZpeDo6CisJV2hlbiB0aGUgY29tbWFuZCBpcyBpbnZva2VkIGZyb20gYSBzdWJkaXJlY3RvcnksIHNob3cgdGhlCisJcGF0aCBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZXZlbAorCWRpcmVjdG9yeS4KKworLS1zaG93LWNkdXA6OgorCVdoZW4gdGhlIGNvbW1hbmQgaXMgaW52b2tlZCBmcm9tIGEgc3ViZGlyZWN0b3J5LCBzaG93IHRoZQorCXBhdGggb2YgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKKwlkaXJlY3RvcnkgKHR5cGljYWxseSBhIHNlcXVlbmNlIG9mICIuLi8iLCBvciBhbiBlbXB0eSBzdHJpbmcpLgorCistLWdpdC1kaXI6OgorCVNob3cgYCRHSVRfRElSYCBpZiBkZWZpbmVkIGVsc2Ugc2hvdyB0aGUgcGF0aCB0byB0aGUgLmdpdCBkaXJlY3RvcnkuCisKKy0tc2hvcnQsIC0tc2hvcnQ9bnVtYmVyOjoKKwlJbnN0ZWFkIG9mIG91dHB1dHRpbmcgdGhlIGZ1bGwgU0hBMSB2YWx1ZXMgb2Ygb2JqZWN0IG5hbWVzIHRyeSB0bworCWFiYnJldmlhdGUgdGhlbSB0byBhIHNob3J0ZXIgdW5pcXVlIG5hbWUuIFdoZW4gbm8gbGVuZ3RoIGlzIHNwZWNpZmllZAorCTcgaXMgdXNlZC4gVGhlIG1pbmltdW0gbGVuZ3RoIGlzIDQuCisKKy0tc2luY2U9ZGF0ZXN0cmluZywgLS1hZnRlcj1kYXRlc3RyaW5nOjoKKwlQYXJzZXMgdGhlIGRhdGUgc3RyaW5nLCBhbmQgb3V0cHV0cyBjb3JyZXNwb25kaW5nCisJLS1tYXgtYWdlPSBwYXJhbWV0ZXIgZm9yIGdpdC1yZXYtbGlzdCBjb21tYW5kLgorCistLXVudGlsPWRhdGVzdHJpbmcsIC0tYmVmb3JlPWRhdGVzdHJpbmc6OgorCVBhcnNlcyB0aGUgZGF0ZSBzdHJpbmcsIGFuZCBvdXRwdXRzIGNvcnJlc3BvbmRpbmcKKwktLW1pbi1hZ2U9IHBhcmFtZXRlciBmb3IgZ2l0LXJldi1saXN0IGNvbW1hbmQuCisKKzxhcmdzPi4uLjo6CisJRmxhZ3MgYW5kIHBhcmFtZXRlcnMgdG8gYmUgcGFyc2VkLgorCisKK1NQRUNJRllJTkcgUkVWSVNJT05TCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHJldmlzaW9uIHBhcmFtZXRlciB0eXBpY2FsbHksIGJ1dCBub3QgbmVjZXNzYXJpbHksIG5hbWVzIGEKK2NvbW1pdCBvYmplY3QuICBUaGV5IHVzZSB3aGF0IGlzIGNhbGxlZCBhbiAnZXh0ZW5kZWQgU0hBMScKK3N5bnRheC4KKworKiBUaGUgZnVsbCBTSEExIG9iamVjdCBuYW1lICg0MC1ieXRlIGhleGFkZWNpbWFsIHN0cmluZyksIG9yCisgIGEgc3Vic3RyaW5nIG9mIHN1Y2ggdGhhdCBpcyB1bmlxdWUgd2l0aGluIHRoZSByZXBvc2l0b3J5LgorICBFLmcuIGRhZTg2ZTE5NTBiMTI3N2U1NDVjZWUxODA1NTE3NTAwMjljZmU3MzUgYW5kIGRhZTg2ZSBib3RoCisgIG5hbWUgdGhlIHNhbWUgY29tbWl0IG9iamVjdCBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgb2JqZWN0IGluCisgIHlvdXIgcmVwb3NpdG9yeSB3aG9zZSBvYmplY3QgbmFtZSBzdGFydHMgd2l0aCBkYWU4NmUuCisKKyogQSBzeW1ib2xpYyByZWYgbmFtZS4gIEUuZy4gJ21hc3RlcicgdHlwaWNhbGx5IG1lYW5zIHRoZSBjb21taXQKKyAgb2JqZWN0IHJlZmVyZW5jZWQgYnkgJEdJVF9ESVIvcmVmcy9oZWFkcy9tYXN0ZXIuICBJZiB5b3UKKyAgaGFwcGVuIHRvIGhhdmUgYm90aCBoZWFkcy9tYXN0ZXIgYW5kIHRhZ3MvbWFzdGVyLCB5b3UgY2FuCisgIGV4cGxpY2l0bHkgc2F5ICdoZWFkcy9tYXN0ZXInIHRvIHRlbGwgZ2l0IHdoaWNoIG9uZSB5b3UgbWVhbi4KKworKiBBIHN1ZmZpeCAnQCcgZm9sbG93ZWQgYnkgYSBkYXRlIHNwZWNpZmljYXRpb24gZW5jbG9zZWQgaW4gYSBicmFjZQorICBwYWlyIChlLmcuICdce3llc3RlcmRheVx9JywgJ1x7MSBtb250aCAyIHdlZWtzIDMgZGF5cyAxIGhvdXIgMQorICBzZWNvbmQgYWdvXH0nIG9yICdcezE5NzktMDItMjYgMTg6MzA6MDBcfScpIHRvIHNwZWNpZnkgdGhlIHZhbHVlCisgIG9mIHRoZSByZWYgYXQgYSBwcmlvciBwb2ludCBpbiB0aW1lLiAgVGhpcyBzdWZmaXggbWF5IG9ubHkgYmUKKyAgdXNlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYSByZWYgbmFtZSBhbmQgdGhlIHJlZiBtdXN0IGhhdmUgYW4KKyAgZXhpc3RpbmcgbG9nICgkR0lUX0RJUi9sb2dzLzxyZWY+KS4KKworKiBBIHN1ZmZpeCAne2NhcmV0fScgdG8gYSByZXZpc2lvbiBwYXJhbWV0ZXIgbWVhbnMgdGhlIGZpcnN0IHBhcmVudCBvZgorICB0aGF0IGNvbW1pdCBvYmplY3QuICAne2NhcmV0fTxuPicgbWVhbnMgdGhlIDxuPnRoIHBhcmVudCAoaS5lLgorICAncmV2e2NhcmV0fScKKyAgaXMgZXF1aXZhbGVudCB0byAncmV2e2NhcmV0fTEnKS4gIEFzIGEgc3BlY2lhbCBydWxlLAorICAncmV2e2NhcmV0fTAnIG1lYW5zIHRoZSBjb21taXQgaXRzZWxmIGFuZCBpcyB1c2VkIHdoZW4gJ3JldicgaXMgdGhlCisgIG9iamVjdCBuYW1lIG9mIGEgdGFnIG9iamVjdCB0aGF0IHJlZmVycyB0byBhIGNvbW1pdCBvYmplY3QuCisKKyogQSBzdWZmaXggJ348bj4nIHRvIGEgcmV2aXNpb24gcGFyYW1ldGVyIG1lYW5zIHRoZSBjb21taXQKKyAgb2JqZWN0IHRoYXQgaXMgdGhlIDxuPnRoIGdlbmVyYXRpb24gZ3JhbmQtcGFyZW50IG9mIHRoZSBuYW1lZAorICBjb21taXQgb2JqZWN0LCBmb2xsb3dpbmcgb25seSB0aGUgZmlyc3QgcGFyZW50LiAgSS5lLiByZXZ+MyBpcworICBlcXVpdmFsZW50IHRvIHJldntjYXJldH17Y2FyZXR9e2NhcmV0fSB3aGljaCBpcyBlcXVpdmFsZW50IHRvXAorICByZXZ7Y2FyZXR9MXtjYXJldH0xe2NhcmV0fTEuCisKKyogQSBzdWZmaXggJ3tjYXJldH0nIGZvbGxvd2VkIGJ5IGFuIG9iamVjdCB0eXBlIG5hbWUgZW5jbG9zZWQgaW4KKyAgYnJhY2UgcGFpciAoZS5nLiBgdjAuOTkuOHtjYXJldH1ce2NvbW1pdFx9YCkgbWVhbnMgdGhlIG9iamVjdAorICBjb3VsZCBiZSBhIHRhZywgYW5kIGRlcmVmZXJlbmNlIHRoZSB0YWcgcmVjdXJzaXZlbHkgdW50aWwgYW4KKyAgb2JqZWN0IG9mIHRoYXQgdHlwZSBpcyBmb3VuZCBvciB0aGUgb2JqZWN0IGNhbm5vdCBiZQorICBkZXJlZmVyZW5jZWQgYW55bW9yZSAoaW4gd2hpY2ggY2FzZSwgYmFyZikuICBgcmV2e2NhcmV0fTBgCisgIGludHJvZHVjZWQgZWFybGllciBpcyBhIHNob3J0LWhhbmQgZm9yIGByZXZ7Y2FyZXR9XHtjb21taXRcfWAuCisKKyogQSBzdWZmaXggJ3tjYXJldH0nIGZvbGxvd2VkIGJ5IGFuIGVtcHR5IGJyYWNlIHBhaXIKKyAgKGUuZy4gYHYwLjk5Ljh7Y2FyZXR9XHtcfWApIG1lYW5zIHRoZSBvYmplY3QgY291bGQgYmUgYSB0YWcsCisgIGFuZCBkZXJlZmVyZW5jZSB0aGUgdGFnIHJlY3Vyc2l2ZWx5IHVudGlsIGEgbm9uLXRhZyBvYmplY3QgaXMKKyAgZm91bmQuCisKKydnaXQtcmV2LXBhcnNlJyBhbHNvIGFjY2VwdHMgYSBwcmVmaXggJ3tjYXJldH0nIHRvIHJldmlzaW9uIHBhcmFtZXRlciwKK3doaWNoIGlzIHBhc3NlZCB0byAnZ2l0LXJldi1saXN0Jy4gIFR3byByZXZpc2lvbiBwYXJhbWV0ZXJzCitjb25jYXRlbmF0ZWQgd2l0aCAnLi4nIGlzIGEgc2hvcnQtaGFuZCBmb3Igd3JpdGluZyBhIHJhbmdlCitiZXR3ZWVuIHRoZW0uICBJLmUuICdyMS4ucjInIGlzIGVxdWl2YWxlbnQgdG8gc2F5aW5nICd7Y2FyZXR9cjEgcjInCisKK0hlcmUgaXMgYW4gaWxsdXN0cmF0aW9uLCBieSBKb24gTG9lbGlnZXIuICBCb3RoIG5vZGUgQiBhbmQgQyBhcmUKK2EgY29tbWl0IHBhcmVudHMgb2YgY29tbWl0IG5vZGUgQS4gIFBhcmVudCBjb21taXRzIGFyZSBvcmRlcmVkCitsZWZ0LXRvLXJpZ2h0LgorCisgICAgRyAgIEggICBJICAgSgorICAgICBcIC8gICAgIFwgLworICAgICAgRCAgIEUgICBGCisgICAgICAgXCAgfCAgLworICAgICAgICBcIHwgLworICAgICAgICAgXHwvCisgICAgICAgICAgQiAgICAgQworICAgICAgICAgICBcICAgLworICAgICAgICAgICAgXCAvCisgICAgICAgICAgICAgQQorCisgICAgQSA9ICAgICAgPSBBXjAKKyAgICBCID0gQV4gICA9IEFeMSAgICAgPSBBfjEKKyAgICBDID0gQV4yICA9IEFeMgorICAgIEQgPSBBXl4gID0gQV4xXjEgICA9IEF+MgorICAgIEUgPSBCXjIgID0gQV5eMgorICAgIEYgPSBCXjMgID0gQV5eMworICAgIEcgPSBBXl5eID0gQV4xXjFeMSA9IEF+MworICAgIEggPSBEXjIgID0gQl5eMiAgICA9IEFeXl4yICA9IEF+Ml4yCisgICAgSSA9IEZeICAgPSBCXjNeICAgID0gQV5eM14KKyAgICBKID0gRl4yICA9IEJeM14yICAgPSBBXl4zXjIKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJldmVydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXZlcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjc4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXZlcnQudHh0CkBAIC0wLDAgKzEsNTcgQEAKK2dpdC1yZXZlcnQoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJldmVydCAtIFJldmVydCBhbiBleGlzdGluZyBjb21taXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJldmVydCcgWy0tZWRpdCB8IC0tbm8tZWRpdF0gWy1uXSA8Y29tbWl0PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0dpdmVuIG9uZSBleGlzdGluZyBjb21taXQsIHJldmVydCB0aGUgY2hhbmdlIHRoZSBwYXRjaCBpbnRyb2R1Y2VzLCBhbmQgcmVjb3JkIGEKK25ldyBjb21taXQgdGhhdCByZWNvcmRzIGl0LiAgVGhpcyByZXF1aXJlcyB5b3VyIHdvcmtpbmcgdHJlZSB0byBiZSBjbGVhbiAobm8KK21vZGlmaWNhdGlvbnMgZnJvbSB0aGUgSEVBRCBjb21taXQpLgorCitPUFRJT05TCistLS0tLS0tCis8Y29tbWl0Pjo6CisJQ29tbWl0IHRvIHJldmVydC4KKworLWV8LS1lZGl0OjoKKwlXaXRoIHRoaXMgb3B0aW9uLCBgZ2l0LXJldmVydGAgd2lsbCBsZXQgeW91IGVkaXQgdGhlIGNvbW1pdAorCW1lc3NhZ2UgcHJpb3IgY29tbWl0dGluZyB0aGUgcmV2ZXJ0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmCisJeW91IHJ1biB0aGUgY29tbWFuZCBmcm9tIGEgdGVybWluYWwuCisKKy0tbm8tZWRpdDo6CisJV2l0aCB0aGlzIG9wdGlvbiwgYGdpdC1yZXZlcnRgIHdpbGwgbm90IHN0YXJ0IHRoZSBjb21taXQKKwltZXNzYWdlIGVkaXRvci4KKworLW58LS1uby1jb21taXQ6OgorCVVzdWFsbHkgdGhlIGNvbW1hbmQgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgY29tbWl0IHdpdGgKKwlhIGNvbW1pdCBsb2cgbWVzc2FnZSBzdGF0aW5nIHdoaWNoIGNvbW1pdCB3YXMgcmV2ZXJ0ZWQuCisJVGhpcyBmbGFnIGFwcGxpZXMgdGhlIGNoYW5nZSBuZWNlc3NhcnkgdG8gcmV2ZXJ0IHRoZQorCW5hbWVkIGNvbW1pdCB0byB5b3VyIHdvcmtpbmcgdHJlZSwgYnV0IGRvZXMgbm90IG1ha2UgdGhlCisJY29tbWl0LiAgSW4gYWRkaXRpb24sIHdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgeW91cgorCXdvcmtpbmcgdHJlZSBkb2VzIG5vdCBoYXZlIHRvIG1hdGNoIHRoZSBIRUFEIGNvbW1pdC4KKwlUaGUgcmV2ZXJ0IGlzIGRvbmUgYWdhaW5zdCB0aGUgYmVnaW5uaW5nIHN0YXRlIG9mIHlvdXIKKwl3b3JraW5nIHRyZWUuCisrCitUaGlzIGlzIHVzZWZ1bCB3aGVuIHJldmVydGluZyBtb3JlIHRoYW4gb25lIGNvbW1pdHMnCitlZmZlY3QgdG8geW91ciB3b3JraW5nIHRyZWUgaW4gYSByb3cuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJtLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZjNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcm0udHh0CkBAIC0wLDAgKzEsOTIgQEAKK2dpdC1ybSgxKQorPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ybSAtIFJlbW92ZSBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUgYW5kIGZyb20gdGhlIGluZGV4CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ybScgWy1mXSBbLW5dIFstdl0gWy0tXSA8ZmlsZT4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBIGNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUuIEZvciB0aG9zZSBjb21pbmcKK2Zyb20gY3ZzLCBnaXQtcm0gcHJvdmlkZXMgYW4gb3BlcmF0aW9uIHNpbWlsYXIgdG8gImN2cyBybSIgb3IgImN2cworcmVtb3ZlIi4KKworCitPUFRJT05TCistLS0tLS0tCis8ZmlsZT4uLi46OgorCUZpbGVzIHRvIHJlbW92ZSBmcm9tIHRoZSBpbmRleCBhbmQgb3B0aW9uYWxseSwgZnJvbSB0aGUKKwl3b3JraW5nIHRyZWUgYXMgd2VsbC4KKworLWY6OgorCVJlbW92ZSBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUgYXMgd2VsbCBhcyBmcm9tIHRoZSBpbmRleC4KKworLW46OgorICAgICAgICBEb24ndCBhY3R1YWxseSByZW1vdmUgdGhlIGZpbGUocyksIGp1c3Qgc2hvdyBpZiB0aGV5IGV4aXN0IGluCisgICAgICAgIHRoZSBpbmRleC4KKworLXY6OgorICAgICAgICBCZSB2ZXJib3NlLgorCitcLS06OgorCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIGNvbW1hbmQtbGluZSBvcHRpb25zIGZyb20KKwl0aGUgbGlzdCBvZiBmaWxlcywgKHVzZWZ1bCB3aGVuIGZpbGVuYW1lcyBtaWdodCBiZSBtaXN0YWtlbgorCWZvciBjb21tYW5kLWxpbmUgb3B0aW9ucykuCisKKworRElTQ1VTU0lPTgorLS0tLS0tLS0tLQorCitUaGUgbGlzdCBvZiA8ZmlsZT4gZ2l2ZW4gdG8gdGhlIGNvbW1hbmQgaXMgZmVkIHRvIGBnaXQtbHMtZmlsZXNgCitjb21tYW5kIHRvIGxpc3QgZmlsZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgaW5kZXggYW5kCithcmUgbm90IGlnbm9yZWQvZXhjbHVkZWQgYnkgYCRHSVRfRElSL2luZm8vZXhjbHVkZWAgZmlsZSBvcgorYC5naXRpZ25vcmVgIGZpbGUgaW4gZWFjaCBkaXJlY3RvcnkuICBUaGlzIG1lYW5zIHR3byB0aGluZ3M6CisKKy4gWW91IGNhbiBwdXQgdGhlIG5hbWUgb2YgYSBkaXJlY3Rvcnkgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZQorICBjb21tYW5kIHdpbGwgcmVtb3ZlIGFsbCBmaWxlcyBpbiBpdCBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzICh0aGUKKyAgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcyBhcmUgbmV2ZXIgcmVtb3ZlZCBmcm9tIHRoZSB3b3JraW5nIHRyZWUpOworCisuIEdpdmluZyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBpcyBub3QgaW4gdGhlIGluZGV4IGRvZXMgbm90CisgIHJlbW92ZSB0aGF0IGZpbGUuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCitnaXQtcm0gRG9jdW1lbnRhdGlvbi9cXCoudHh0OjoKKworCVJlbW92ZXMgYWxsIGBcKi50eHRgIGZpbGVzIGZyb20gdGhlIGluZGV4IHRoYXQgYXJlIHVuZGVyIHRoZQorCWBEb2N1bWVudGF0aW9uYCBkaXJlY3RvcnkgYW5kIGFueSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMuIFRoZQorCWZpbGVzIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSB3b3JraW5nIHRyZWUuCisrCitOb3RlIHRoYXQgdGhlIGFzdGVyaXNrIGBcKmAgaXMgcXVvdGVkIGZyb20gdGhlIHNoZWxsIGluIHRoaXMKK2V4YW1wbGU7IHRoaXMgbGV0cyB0aGUgY29tbWFuZCBpbmNsdWRlIHRoZSBmaWxlcyBmcm9tCitzdWJkaXJlY3RvcmllcyBvZiBgRG9jdW1lbnRhdGlvbi9gIGRpcmVjdG9yeS4KKworZ2l0LXJtIC1mIGdpdC0qLnNoOjoKKworCVJlbW92ZSBhbGwgZ2l0LSouc2ggc2NyaXB0cyB0aGF0IGFyZSBpbiB0aGUgaW5kZXguIFRoZSBmaWxlcworCWFyZSByZW1vdmVkIGZyb20gdGhlIGluZGV4LCBhbmQgKGJlY2F1c2Ugb2YgdGhlIC1mIG9wdGlvbiksCisJZnJvbSB0aGUgd29ya2luZyB0cmVlIGFzIHdlbGwuIEJlY2F1c2UgdGhpcyBleGFtcGxlIGxldHMgdGhlCisJc2hlbGwgZXhwYW5kIHRoZSBhc3RlcmlzayAoaS5lLiB5b3UgYXJlIGxpc3RpbmcgdGhlIGZpbGVzCisJZXhwbGljaXRseSksIGl0IGRvZXMgbm90IHJlbW92ZSBgc3ViZGlyL2dpdC1mb28uc2hgLgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWFkZFsxXQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2VuZC1lbWFpbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLWVtYWlsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDFiOWNmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2VuZC1lbWFpbC50eHQKQEAgLTAsMCArMSw5NCBAQAorZ2l0LXNlbmQtZW1haWwoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zZW5kLWVtYWlsIC0gU2VuZCBhIGNvbGxlY3Rpb24gb2YgcGF0Y2hlcyBhcyBlbWFpbHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc2VuZC1lbWFpbCcgW29wdGlvbnNdIDxmaWxlfGRpcmVjdG9yeT4gWy4uLiBmaWxlfGRpcmVjdG9yeV0KKworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGFrZXMgdGhlIHBhdGNoZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgZW1haWxzIHRoZW0gb3V0LgorCitUaGUgaGVhZGVyIG9mIHRoZSBlbWFpbCBpcyBjb25maWd1cmFibGUgYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuICBJZiBub3QKK3NwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHdpdGggYSBSZWFkTGluZQorZW5hYmxlZCBpbnRlcmZhY2UgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLgorCitPUFRJT05TCistLS0tLS0tCitUaGUgb3B0aW9ucyBhdmFpbGFibGUgYXJlOgorCistLWNjOjoKKwlTcGVjaWZ5IGEgc3RhcnRpbmcgIkNjOiIgdmFsdWUgZm9yIGVhY2ggZW1haWwuCisKKy0tY2hhaW4tcmVwbHktdG8sIC0tbm8tY2hhaW4tcmVwbHktdG86OgorCUlmIHRoaXMgaXMgc2V0LCBlYWNoIGVtYWlsIHdpbGwgYmUgc2VudCBhcyBhIHJlcGx5IHRvIHRoZSBwcmV2aW91cworCWVtYWlsIHNlbnQuICBJZiBkaXNhYmxlZCB3aXRoICItLW5vLWNoYWluLXJlcGx5LXRvIiwgYWxsIGVtYWlscyBhZnRlcgorCXRoZSBmaXJzdCB3aWxsIGJlIHNlbnQgYXMgcmVwbGllcyB0byB0aGUgZmlyc3QgZW1haWwgc2VudC4gIFdoZW4gdXNpbmcKKwl0aGlzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBmaXJzdCBmaWxlIGdpdmVuIGJlIGFuIG92ZXJ2aWV3IG9mIHRoZQorCWVudGlyZSBwYXRjaCBzZXJpZXMuCisJRGVmYXVsdCBpcyAtLWNoYWluLXJlcGx5LXRvCisKKy0tY29tcG9zZTo6CisJVXNlICRFRElUT1IgdG8gZWRpdCBhbiBpbnRyb2R1Y3RvcnkgbWVzc2FnZSBmb3IgdGhlCisJcGF0Y2ggc2VyaWVzLgorCistLWZyb206OgorCVNwZWNpZnkgdGhlIHNlbmRlciBvZiB0aGUgZW1haWxzLiAgVGhpcyB3aWxsIGRlZmF1bHQgdG8KKwl0aGUgdmFsdWUgR0lUX0NPTU1JVFRFUl9JREVOVCwgYXMgcmV0dXJuZWQgYnkgImdpdC12YXIgLWwiLgorCVRoZSB1c2VyIHdpbGwgc3RpbGwgYmUgcHJvbXB0ZWQgdG8gY29uZmlybSB0aGlzIGVudHJ5LgorCistLWluLXJlcGx5LXRvOjoKKwlTcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgZmlyc3QgSW4tUmVwbHktVG8gaGVhZGVyLgorCVN1YnNlcXVlbnQgZW1haWxzIHdpbGwgcmVmZXIgdG8gdGhlIHByZXZpb3VzIGVtYWlsIAorCWluc3RlYWQgb2YgdGhpcyBpZiAtLWNoYWluLXJlcGx5LXRvIGlzIHNldCAodGhlIGRlZmF1bHQpCisJT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworLS1uby1zaWduZWQtb2ZmLWJ5LWNjOjoKKwlEbyBub3QgYWRkIGVtYWlscyBmb3VuZCBpbiBTaWduZWQtb2ZmLWJ5OiBsaW5lcyB0byB0aGUgY2MgbGlzdC4KKworLS1xdWlldDo6CisJTWFrZSBnaXQtc2VuZC1lbWFpbCBsZXNzIHZlcmJvc2UuICBPbmUgbGluZSBwZXIgZW1haWwgc2hvdWxkIGJlCisJYWxsIHRoYXQgaXMgb3V0cHV0LgorCistLXNtdHAtc2VydmVyOjoKKwlJZiBzZXQsIHNwZWNpZmllcyB0aGUgb3V0Z29pbmcgU01UUCBzZXJ2ZXIgdG8gdXNlLiAgRGVmYXVsdHMgdG8KKwlsb2NhbGhvc3QuCisKKy0tc3ViamVjdDo6CisgICAJU3BlY2lmeSB0aGUgaW5pdGlhbCBzdWJqZWN0IG9mIHRoZSBlbWFpbCB0aHJlYWQuCisJT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworLS1zdXBwcmVzcy1mcm9tOjoKKwlEbyBub3QgYWRkIHRoZSBGcm9tOiBhZGRyZXNzIHRvIHRoZSBjYzogbGlzdCwgaWYgaXQgc2hvd3MgdXAgaW4gYSBGcm9tOgorCWxpbmUuCisKKy0tdG86OgorCVNwZWNpZnkgdGhlIHByaW1hcnkgcmVjaXBpZW50IG9mIHRoZSBlbWFpbHMgZ2VuZXJhdGVkLgorCUdlbmVyYWxseSwgdGhpcyB3aWxsIGJlIHRoZSB1cHN0cmVhbSBtYWludGFpbmVyIG9mIHRoZQorCXByb2plY3QgaW52b2x2ZWQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKworZ2l0LXNlbmQtZW1haWwgaXMgb3JpZ2luYWxseSBiYXNlZCB1cG9uCitzZW5kX2xvdHNfb2ZfZW1haWwucGwgYnkgR3JlZyBLcm9haC1IYXJ0bWFuLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBSeWFuIEFuZGVyc29uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2VuZC1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY3ZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2VuZC1wYWNrLnR4dApAQCAtMCwwICsxLDExMCBAQAorZ2l0LXNlbmQtcGFjaygxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2VuZC1wYWNrIC0gUHVzaCBtaXNzaW5nIG9iamVjdHMgcGFja2VkCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNlbmQtcGFjaycgWy0tYWxsXSBbLS1mb3JjZV0gWy0tZXhlYz08Z2l0LXJlY2VpdmUtcGFjaz5dIFs8aG9zdD46XTxkaXJlY3Rvcnk+IFs8cmVmPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbnZva2VzICdnaXQtcmVjZWl2ZS1wYWNrJyBvbiBhIHBvc3NpYmx5IHJlbW90ZSByZXBvc2l0b3J5LCBhbmQKK3VwZGF0ZXMgaXQgZnJvbSB0aGUgY3VycmVudCByZXBvc2l0b3J5LCBzZW5kaW5nIG5hbWVkIHJlZnMuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1leGVjPTxnaXQtcmVjZWl2ZS1wYWNrPjo6CisJUGF0aCB0byB0aGUgJ2dpdC1yZWNlaXZlLXBhY2snIHByb2dyYW0gb24gdGhlIHJlbW90ZQorCWVuZC4gIFNvbWV0aW1lcyB1c2VmdWwgd2hlbiBwdXNoaW5nIHRvIGEgcmVtb3RlCisJcmVwb3NpdG9yeSBvdmVyIHNzaCwgYW5kIHlvdSBkbyBub3QgaGF2ZSB0aGUgcHJvZ3JhbSBpbgorCWEgZGlyZWN0b3J5IG9uIHRoZSBkZWZhdWx0ICRQQVRILgorCistLWFsbDo6CisJSW5zdGVhZCBvZiBleHBsaWNpdGx5IHNwZWNpZnlpbmcgd2hpY2ggcmVmcyB0byB1cGRhdGUsCisJdXBkYXRlIGFsbCByZWZzIHRoYXQgbG9jYWxseSBleGlzdC4KKworLS1mb3JjZTo6CisJVXN1YWxseSwgdGhlIGNvbW1hbmQgcmVmdXNlcyB0byB1cGRhdGUgYSByZW1vdGUgcmVmIHRoYXQKKwlpcyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIGxvY2FsIHJlZiB1c2VkIHRvIG92ZXJ3cml0ZSBpdC4KKwlUaGlzIGZsYWcgZGlzYWJsZXMgdGhlIGNoZWNrLiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQKKwl0aGUgcmVtb3RlIHJlcG9zaXRvcnkgY2FuIGxvc2UgY29tbWl0czsgdXNlIGl0IHdpdGgKKwljYXJlLgorCis8aG9zdD46OgorCUEgcmVtb3RlIGhvc3QgdG8gaG91c2UgdGhlIHJlcG9zaXRvcnkuICBXaGVuIHRoaXMKKwlwYXJ0IGlzIHNwZWNpZmllZCwgJ2dpdC1yZWNlaXZlLXBhY2snIGlzIGludm9rZWQgdmlhCisJc3NoLgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gdXBkYXRlLgorCis8cmVmPi4uLjoKKwlUaGUgcmVtb3RlIHJlZnMgdG8gdXBkYXRlLgorCisKK1NwZWNpZnlpbmcgdGhlIFJlZnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gc3BlY2lmeSB3aGljaCByZWZzIHRvIHVwZGF0ZSBvbiB0aGUKK3JlbW90ZSBlbmQuCisKK1dpdGggJy0tYWxsJyBmbGFnLCBhbGwgcmVmcyB0aGF0IGV4aXN0IGxvY2FsbHkgYXJlIHRyYW5zZmVycmVkIHRvCit0aGUgcmVtb3RlIHNpZGUuICBZb3UgY2Fubm90IHNwZWNpZnkgYW55ICc8cmVmPicgaWYgeW91IHVzZQordGhpcyBmbGFnLgorCitXaXRob3V0ICctLWFsbCcgYW5kIHdpdGhvdXQgYW55ICc8cmVmPicsIHRoZSByZWZzIHRoYXQgZXhpc3QKK2JvdGggb24gdGhlIGxvY2FsIHNpZGUgYW5kIG9uIHRoZSByZW1vdGUgc2lkZSBhcmUgdXBkYXRlZC4KKworV2hlbiBvbmUgb3IgbW9yZSAnPHJlZj4nIGFyZSBzcGVjaWZpZWQgZXhwbGljaXRseSwgaXQgY2FuIGJlIGVpdGhlciBhCitzaW5nbGUgcGF0dGVybiwgb3IgYSBwYWlyIG9mIHN1Y2ggcGF0dGVybiBzZXBhcmF0ZWQgYnkgYSBjb2xvbgorIjoiICh0aGlzIG1lYW5zIHRoYXQgYSByZWYgbmFtZSBjYW5ub3QgaGF2ZSBhIGNvbG9uIGluIGl0KS4gIEEKK3NpbmdsZSBwYXR0ZXJuICc8bmFtZT4nIGlzIGp1c3QgYSBzaG9ydGhhbmQgZm9yICc8bmFtZT46PG5hbWU+Jy4KKworRWFjaCBwYXR0ZXJuIHBhaXIgY29uc2lzdHMgb2YgdGhlIHNvdXJjZSBzaWRlIChiZWZvcmUgdGhlIGNvbG9uKQorYW5kIHRoZSBkZXN0aW5hdGlvbiBzaWRlIChhZnRlciB0aGUgY29sb24pLiAgVGhlIHJlZiB0byBiZQorcHVzaGVkIGlzIGRldGVybWluZWQgYnkgZmluZGluZyBhIG1hdGNoIHRoYXQgbWF0Y2hlcyB0aGUgc291cmNlCitzaWRlLCBhbmQgd2hlcmUgaXQgaXMgcHVzaGVkIGlzIGRldGVybWluZWQgYnkgdXNpbmcgdGhlCitkZXN0aW5hdGlvbiBzaWRlLgorCisgLSBJdCBpcyBhbiBlcnJvciBpZiA8c3JjPiBkb2VzIG5vdCBtYXRjaCBleGFjdGx5IG9uZSBvZiB0aGUKKyAgIGxvY2FsIHJlZnMuCisKKyAtIEl0IGlzIGFuIGVycm9yIGlmIDxkc3Q+IG1hdGNoZXMgbW9yZSB0aGFuIG9uZSByZW1vdGUgcmVmcy4KKworIC0gSWYgPGRzdD4gZG9lcyBub3QgbWF0Y2ggYW55IHJlbW90ZSByZWYsIGVpdGhlcgorCisgICAqIGl0IGhhcyB0byBzdGFydCB3aXRoICJyZWZzLyI7IDxkc3Q+IGlzIHVzZWQgYXMgdGhlCisgICAgIGRlc3RpbmF0aW9uIGxpdGVyYWxseSBpbiB0aGlzIGNhc2UuCisKKyAgICogPHNyYz4gPT0gPGRzdD4gYW5kIHRoZSByZWYgdGhhdCBtYXRjaGVkIHRoZSA8c3JjPiBtdXN0IG5vdAorICAgICBleGlzdCBpbiB0aGUgc2V0IG9mIHJlbW90ZSByZWZzOyB0aGUgcmVmIG1hdGNoZWQgPHNyYz4KKyAgICAgbG9jYWxseSBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbi4KKworV2l0aG91dCAnLS1mb3JjZScsIHRoZSA8c3JjPiByZWYgaXMgc3RvcmVkIGF0IHRoZSByZW1vdGUgb25seSBpZgorPGRzdD4gZG9lcyBub3QgZXhpc3QsIG9yIDxkc3Q+IGlzIGEgcHJvcGVyIHN1YnNldCAoaS5lLiBhbgorYW5jZXN0b3IpIG9mIDxzcmM+LiAgVGhpcyBjaGVjaywga25vd24gYXMgImZhc3QgZm9yd2FyZCBjaGVjayIsCitpcyBwZXJmb3JtZWQgaW4gb3JkZXIgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIHRoZQorcmVtb3RlIHJlZiBhbmQgbG9zZSBvdGhlciBwZW9wbGVzJyBjb21taXRzIGZyb20gdGhlcmUuCisKK1dpdGggJy0tZm9yY2UnLCB0aGUgZmFzdCBmb3J3YXJkIGNoZWNrIGlzIGRpc2FibGVkIGZvciBhbGwgcmVmcy4KKworT3B0aW9uYWxseSwgYSA8cmVmPiBwYXJhbWV0ZXIgY2FuIGJlIHByZWZpeGVkIHdpdGggYSBwbHVzICcrJyBzaWduCit0byBkaXNhYmxlIHRoZSBmYXN0LWZvcndhcmQgY2hlY2sgb25seSBvbiB0aGF0IHJlZi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXNoLXNldHVwLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNoLXNldHVwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTIxN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2gtc2V0dXAudHh0CkBAIC0wLDAgKzEsMzUgQEAKK2dpdC1zaC1zZXR1cCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaC1zZXR1cCAtIENvbW1vbiBnaXQgc2hlbGwgc2NyaXB0IHNldHVwIGNvZGUKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNoLXNldHVwJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworU2V0cyB1cCB0aGUgbm9ybWFsIGdpdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMKKyhjdXJyZW50bHkganVzdCAiZGllKCkiKSwgYW5kIHJldHVybnMgT0sgaWYgaXQgYWxsIGxvb2tzIGxpa2UgYSBnaXQgYXJjaGl2ZS4KK1NvLCB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBnaXQgc2NyaXB0cyBtb3JlIGNhcmVmdWwgYW5kIHJlYWRhYmxlLAordXNlIGl0IGFzIGZvbGxvd3M6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4gZ2l0LXNoLXNldHVwIHx8IGRpZSAiTm90IGEgZ2l0IGFyY2hpdmUiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0MjY2ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNoZWxsLnR4dApAQCAtMCwwICsxLDM1IEBACitnaXQtc2hlbGwoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2hlbGwgLSBSZXN0cmljdGVkIGxvZ2luIHNoZWxsIGZvciBHSVQgb3ZlciBTU0ggb25seQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zaGVsbCcgLWMgPGNvbW1hbmQ+IDxhcmd1bWVudD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBsb2dpbiBzaGVsbCBmb3IgU1NIIGFjY291bnRzIHlvdSB3YW50Cit0byByZXN0cmljdCB0byBHSVQgcHVsbC9wdXNoIGFjY2VzcyBvbmx5LiBJdCBwZXJtaXRzIGV4ZWN1dGlvbiBvbmx5CitvZiBzZXJ2ZXItc2lkZSBHSVQgY29tbWFuZHMgaW1wbGVtZW50aW5nIHRoZSBwdWxsL3B1c2ggZnVuY3Rpb25hbGl0eS4KK1RoZSBjb21tYW5kcyBjYW4gYmUgZXhlY3V0ZWQgb25seSBieSB0aGUgJy1jJyBvcHRpb247IHRoZSBzaGVsbCBpcyBub3QKK2ludGVyYWN0aXZlLgorCitDdXJyZW50bHksIG9ubHkgdGhlIGBnaXQtcmVjZWl2ZS1wYWNrYCBhbmQgYGdpdC11cGxvYWQtcGFja2AgY29tbWFuZHMKK2FyZSBwZXJtaXR0ZWQgdG8gYmUgY2FsbGVkLCB3aXRoIGEgc2luZ2xlIHJlcXVpcmVkIGFyZ3VtZW50LgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvcnRsb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvcnRsb2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG9ydGxvZy50eHQKQEAgLTAsMCArMSw0MyBAQAorZ2l0LXNob3J0bG9nKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3J0bG9nIC0gU3VtbWFyaXplICdnaXQgbG9nJyBvdXRwdXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCitnaXQtbG9nIC0tcHJldHR5PXNob3J0IHwgJ2dpdC1zaG9ydGxvZycKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTdW1tYXJpemVzICdnaXQgbG9nJyBvdXRwdXQgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGluY2x1c2lvbgoraW4gcmVsZWFzZSBhbm5vdW5jZW1lbnRzLiBFYWNoIGNvbW1pdCB3aWxsIGJlIGdyb3VwZWQgYnkgYXV0aG9yCit0aGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2Ugd2lsbCBiZSBzaG93bi4KKworQWRkaXRpb25hbGx5LCAiW1BBVENIXSIgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBjb21taXQgZGVzY3JpcHRpb24uCisKK0ZJTEVTCistLS0tLQorJy5tYWlsbWFwJzo6CisJSWYgdGhpcyBmaWxlIGV4aXN0cywgaXQgd2lsbCBiZSB1c2VkIGZvciBtYXBwaW5nIGF1dGhvciBlbWFpbAorCWFkZHJlc3NlcyB0byBhIHJlYWwgYXV0aG9yIG5hbWUuIE9uZSBtYXBwaW5nIHBlciBsaW5lLCBmaXJzdAorCXRoZSBhdXRob3IgbmFtZSBmb2xsb3dlZCBieSB0aGUgZW1haWwgYWRkcmVzcyBlbmNsb3NlZCBieQorCSc8JyBhbmQgJz4nLiBVc2UgaGFzaCAnIycgZm9yIGNvbW1lbnRzLiBFeGFtcGxlOgorCisJCSMgS2VlcCBhbHBoYWJldGl6ZWQKKwkJQWRhbSBNb3Jyb3cgPGFkYW1AbG9jYWxob3N0LmxvY2FsZG9tYWluPgorCQlFdmUgSm9uZXMgPGV2ZUBsYXB0b3AuKG5vbmUpPgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1icmFuY2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1icmFuY2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTViNDUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWJyYW5jaC50eHQKQEAgLTAsMCArMSwxNjIgQEAKK2dpdC1zaG93LWJyYW5jaCgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93LWJyYW5jaCAtIFNob3cgYnJhbmNoZXMgYW5kIHRoZWlyIGNvbW1pdHMKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXNob3ctYnJhbmNoJyBbLS1hbGxdIFstLWhlYWRzXSBbLS10YWdzXSBbLS10b3BvLW9yZGVyXSBbLS1jdXJyZW50XQorCQlbLS1tb3JlPTxuPiB8IC0tbGlzdCB8IC0taW5kZXBlbmRlbnQgfCAtLW1lcmdlLWJhc2VdCisJCVstLW5vLW5hbWUgfCAtLXNoYTEtbmFtZV0gWzxyZXY+IHwgPGdsb2I+XS4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworU2hvd3MgdGhlIGNvbW1pdCBhbmNlc3RyeSBncmFwaCBzdGFydGluZyBmcm9tIHRoZSBjb21taXRzIG5hbWVkCit3aXRoIDxyZXY+cyBvciA8Z2xvYnM+cyAob3IgYWxsIHJlZnMgdW5kZXIgJEdJVF9ESVIvcmVmcy9oZWFkcworYW5kL29yICRHSVRfRElSL3JlZnMvdGFncykgc2VtaS12aXN1YWxseS4KKworSXQgY2Fubm90IHNob3cgbW9yZSB0aGFuIDI5IGJyYW5jaGVzIGFuZCBjb21taXRzIGF0IGEgdGltZS4KKworSXQgdXNlcyBgc2hvd2JyYW5jaC5kZWZhdWx0YCBtdWx0aS12YWx1ZWQgY29uZmlndXJhdGlvbiBpdGVtcyBpZgorbm8gPHJldj4gbm9yIDxnbG9iPiBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxyZXY+OjoKKwlBcmJpdHJhcnkgZXh0ZW5kZWQgU0hBMSBleHByZXNzaW9uIChzZWUgYGdpdC1yZXYtcGFyc2VgKQorCXRoYXQgdHlwaWNhbGx5IG5hbWVzIGEgYnJhbmNoIEhFQUQgb3IgYSB0YWcuCisKKzxnbG9iPjo6CisJQSBnbG9iIHBhdHRlcm4gdGhhdCBtYXRjaGVzIGJyYW5jaCBvciB0YWcgbmFtZXMgdW5kZXIKKwkkR0lUX0RJUi9yZWZzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIG1hbnkgdG9waWMKKwlicmFuY2hlcyB1bmRlciAkR0lUX0RJUi9yZWZzL2hlYWRzL3RvcGljLCBnaXZpbmcKKwlgdG9waWMvKmAgd291bGQgc2hvdyBhbGwgb2YgdGhlbS4KKworLS1hbGwgLS1oZWFkcyAtLXRhZ3M6OgorCVNob3cgYWxsIHJlZnMgdW5kZXIgJEdJVF9ESVIvcmVmcywgJEdJVF9ESVIvcmVmcy9oZWFkcywKKwlhbmQgJEdJVF9ESVIvcmVmcy90YWdzLCByZXNwZWN0aXZlbHkuCisKKy0tY3VycmVudDo6CisJV2l0aCB0aGlzIG9wdGlvbiwgdGhlIGNvbW1hbmQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKwlicmFuY2ggdG8gdGhlIGxpc3Qgb2YgcmV2cyB0byBiZSBzaG93biB3aGVuIGl0IGlzIG5vdAorCWdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKy0tdG9wby1vcmRlcjo6CisgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBicmFuY2hlcyBhbmQgdGhlaXIgY29tbWl0cyBhcmUgc2hvd24gaW4KKyAgICAgICAgcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlbQorICAgICAgICBhcHBlYXIgaW4gdG9wb2xvZ2ljYWwgb3JkZXIgKGkuZS4sIGRlc2NlbmRhbnQgY29tbWl0cworICAgICAgICBhcmUgc2hvd24gYmVmb3JlIHRoZWlyIHBhcmVudHMpLgorCistLW1vcmU9PG4+OjoKKwlVc3VhbGx5IHRoZSBjb21tYW5kIHN0b3BzIG91dHB1dCB1cG9uIHNob3dpbmcgdGhlIGNvbW1pdAorCXRoYXQgaXMgdGhlIGNvbW1vbiBhbmNlc3RvciBvZiBhbGwgdGhlIGJyYW5jaGVzLiAgVGhpcworCWZsYWcgdGVsbHMgdGhlIGNvbW1hbmQgdG8gZ28gPG4+IG1vcmUgY29tbW9uIGNvbW1pdHMKKwliZXlvbmQgdGhhdC4gIFdoZW4gPG4+IGlzIG5lZ2F0aXZlLCBkaXNwbGF5IG9ubHkgdGhlCisJPHJlZmVyZW5jZT5zIGdpdmVuLCB3aXRob3V0IHNob3dpbmcgdGhlIGNvbW1pdCBhbmNlc3RyeQorCXRyZWUuCisKKy0tbGlzdDo6CisJU3lub255bSB0byBgLS1tb3JlPS0xYAorCistLW1lcmdlLWJhc2U6OgorCUluc3RlYWQgb2Ygc2hvd2luZyB0aGUgY29tbWl0IGxpc3QsIGp1c3QgYWN0IGxpa2UgdGhlCisJJ2dpdC1tZXJnZS1iYXNlIC1hJyBjb21tYW5kLCBleGNlcHQgdGhhdCBpdCBjYW4gYWNjZXB0CisJbW9yZSB0aGFuIHR3byBoZWFkcy4KKworLS1pbmRlcGVuZGVudDo6CisJQW1vbmcgdGhlIDxyZWZlcmVuY2U+cyBnaXZlbiwgZGlzcGxheSBvbmx5IHRoZSBvbmVzIHRoYXQKKwljYW5ub3QgYmUgcmVhY2hlZCBmcm9tIGFueSBvdGhlciA8cmVmZXJlbmNlPi4KKworLS1uby1uYW1lOjoKKwlEbyBub3Qgc2hvdyBuYW1pbmcgc3RyaW5ncyBmb3IgZWFjaCBjb21taXQuCisKKy0tc2hhMS1uYW1lOjoKKwlJbnN0ZWFkIG9mIG5hbWluZyB0aGUgY29tbWl0cyB1c2luZyB0aGUgcGF0aCB0byByZWFjaAorCXRoZW0gZnJvbSBoZWFkcyAoZS5nLiAibWFzdGVyfjIiIHRvIG1lYW4gdGhlIGdyYW5kcGFyZW50CisJb2YgIm1hc3RlciIpLCBuYW1lIHRoZW0gd2l0aCB0aGUgdW5pcXVlIHByZWZpeCBvZiB0aGVpcgorCW9iamVjdCBuYW1lcy4KKworTm90ZSB0aGF0IC0tbW9yZSwgLS1saXN0LCAtLWluZGVwZW5kZW50IGFuZCAtLW1lcmdlLWJhc2Ugb3B0aW9ucworYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKworCitPVVRQVVQKKy0tLS0tLQorR2l2ZW4gTiA8cmVmZXJlbmNlcz4sIHRoZSBmaXJzdCBOIGxpbmVzIGFyZSB0aGUgb25lLWxpbmUKK2Rlc2NyaXB0aW9uIGZyb20gdGhlaXIgY29tbWl0IG1lc3NhZ2UuICBUaGUgYnJhbmNoIGhlYWQgdGhhdCBpcworcG9pbnRlZCBhdCBieSAkR0lUX0RJUi9IRUFEIGlzIHByZWZpeGVkIHdpdGggYW4gYXN0ZXJpc2sgYCpgCitjaGFyYWN0ZXIgd2hpbGUgb3RoZXIgaGVhZHMgYXJlIHByZWZpeGVkIHdpdGggYSBgIWAgY2hhcmFjdGVyLgorCitGb2xsb3dpbmcgdGhlc2UgTiBsaW5lcywgb25lLWxpbmUgbG9nIGZvciBlYWNoIGNvbW1pdCBpcworZGlzcGxheWVkLCBpbmRlbnRlZCBOIHBsYWNlcy4gIElmIGEgY29tbWl0IGlzIG9uIHRoZSBJLXRoCiticmFuY2gsIHRoZSBJLXRoIGluZGVudGF0aW9uIGNoYXJhY3RlciBzaG93cyBhIGArYCBzaWduOworb3RoZXJ3aXNlIGl0IHNob3dzIGEgc3BhY2UuICBNZXJnZSBjb21taXRzIGFyZSBkZW5vdGVkIGJ5CithIGAtYCBzaWduLiAgRWFjaCBjb21taXQgc2hvd3MgYSBzaG9ydCBuYW1lIHRoYXQKK2NhbiBiZSB1c2VkIGFzIGFuIGV4dGVuZGVkIFNIQTEgdG8gbmFtZSB0aGF0IGNvbW1pdC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRocmVlIGJyYW5jaGVzLCAibWFzdGVyIiwgImZpeGVzIgorYW5kICJtaGYiOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIG1hc3RlciBmaXhlcyBtaGYKKyogW21hc3Rlcl0gQWRkICdnaXQgc2hvdy1icmFuY2gnLgorICEgW2ZpeGVzXSBJbnRyb2R1Y2UgInJlc2V0IHR5cGUiIGZsYWcgdG8gImdpdCByZXNldCIKKyAgISBbbWhmXSBBbGxvdyAiK3JlbW90ZTpsb2NhbCIgcmVmc3BlYyB0byBjYXVzZSAtLWZvcmNlIHdoZW4gZmV0Y2hpbmcuCistLS0KKyAgKyBbbWhmXSBBbGxvdyAiK3JlbW90ZTpsb2NhbCIgcmVmc3BlYyB0byBjYXVzZSAtLWZvcmNlIHdoZW4gZmV0Y2hpbmcuCisgICsgW21oZn4xXSBVc2UgZ2l0LW9jdG9wdXMgd2hlbiBwdWxsaW5nIG1vcmUgdGhhbiBvbmUgaGVhZHMuCisgKyAgW2ZpeGVzXSBJbnRyb2R1Y2UgInJlc2V0IHR5cGUiIGZsYWcgdG8gImdpdCByZXNldCIKKyAgKyBbbWhmfjJdICJnaXQgZmV0Y2ggLS1mb3JjZSIuCisgICsgW21oZn4zXSBVc2UgLmdpdC9yZW1vdGUvb3JpZ2luLCBub3QgLmdpdC9icmFuY2hlcy9vcmlnaW4uCisgICsgW21oZn40XSBNYWtlICJnaXQgcHVsbCIgYW5kICJnaXQgZmV0Y2giIGRlZmF1bHQgdG8gb3JpZ2luCisgICsgW21oZn41XSBJbmZhbW91cyAnb2N0b3B1cyBtZXJnZScKKyAgKyBbbWhmfjZdIFJldGlyZSBnaXQtcGFyc2UtcmVtb3RlLgorICArIFttaGZ+N10gTXVsdGktaGVhZCBmZXRjaC4KKyAgKyBbbWhmfjhdIFN0YXJ0IGFkZGluZyB0aGUgJEdJVF9ESVIvcmVtb3Rlcy8gc3VwcG9ydC4KKyorKyBbbWFzdGVyXSBBZGQgJ2dpdCBzaG93LWJyYW5jaCcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlc2UgdGhyZWUgYnJhbmNoZXMgYWxsIGZvcmtlZCBmcm9tIGEgY29tbW9uIGNvbW1pdCwgW21hc3Rlcl0sCit3aG9zZSBjb21taXQgbWVzc2FnZSBpcyAiQWRkICdnaXQgc2hvdy1icmFuY2gnLiAgImZpeGVzIiBicmFuY2gKK2FkZHMgb25lIGNvbW1pdCAnSW50cm9kdWNlICJyZXNldCB0eXBlIicuICAibWhmIiBicmFuY2ggaGFzIG1hbnkKK290aGVyIGNvbW1pdHMuICBUaGUgY3VycmVudCBicmFuY2ggaXMgIm1hc3RlciIuCisKKworRVhBTVBMRQorLS0tLS0tLQorCitJZiB5b3Uga2VlcCB5b3VyIHByaW1hcnkgYnJhbmNoZXMgaW1tZWRpYXRlbHkgdW5kZXIKK2AkR0lUX0RJUi9yZWZzL2hlYWRzYCwgYW5kIHRvcGljIGJyYW5jaGVzIGluIHN1YmRpcmVjdG9yaWVzIG9mCitpdCwgaGF2aW5nIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBtYXkgaGVscDoKKworLS0tLS0tLS0tLS0tCitbc2hvd2JyYW5jaF0KKwlkZWZhdWx0ID0gLS10b3BvLW9yZGVyCisJZGVmYXVsdCA9IGhlYWRzLyoKKworLS0tLS0tLS0tLS0tCisKK1dpdGggdGhpcywgYGdpdCBzaG93LWJyYW5jaGAgd2l0aG91dCBleHRyYSBwYXJhbWV0ZXJzIHdvdWxkIHNob3cKK29ubHkgdGhlIHByaW1hcnkgYnJhbmNoZXMuICBJbiBhZGRpdGlvbiwgaWYgeW91IGhhcHBlbiB0byBiZSBvbgoreW91ciB0b3BpYyBicmFuY2gsIGl0IGlzIHNob3duIGFzIHdlbGwuCisKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNob3ctaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMDliNjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWluZGV4LnR4dApAQCAtMCwwICsxLDM1IEBACitnaXQtc2hvdy1pbmRleCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3ctaW5kZXggLSBTaG93IHBhY2tlZCBhcmNoaXZlIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNob3ctaW5kZXgnIDwgaWR4LWZpbGUKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGdpdmVuIGlkeCBmaWxlIGZvciBwYWNrZWQgZ2l0IGFyY2hpdmUgY3JlYXRlZCB3aXRoCitnaXQtcGFjay1vYmplY3RzIGNvbW1hbmQsIGFuZCBkdW1wcyBpdHMgY29udGVudHMuCisKK1RoZSBpbmZvcm1hdGlvbiBpdCBvdXRwdXRzIGlzIHN1YnNldCBvZiB3aGF0IHlvdSBjYW4gZ2V0IGZyb20KKydnaXQtdmVyaWZ5LXBhY2sgLXYnOyB0aGlzIGNvbW1hbmQgb25seSBzaG93cyB0aGUgcGFja2ZpbGUKK29mZnNldCBhbmQgU0hBMSBvZiBlYWNoIG9iamVjdC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNob3cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGRmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LnR4dApAQCAtMCwwICsxLDQ5IEBACitnaXQtc2hvdygxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3cgLSBTaG93IG9uZSBjb21taXQgd2l0aCBkaWZmZXJlbmNlIGl0IGludHJvZHVjZXMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc2hvdycgPG9wdGlvbj4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTaG93cyBjb21taXQgbG9nIGFuZCB0ZXh0dWFsIGRpZmYgZm9yIGEgc2luZ2xlIGNvbW1pdC4gIFRoZQorY29tbWFuZCBpbnRlcm5hbGx5IGludm9rZXMgJ2dpdC1yZXYtbGlzdCcgcGlwZWQgdG8KKydnaXQtZGlmZi10cmVlJywgYW5kIHRha2VzIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBib3RoIG9mCit0aGVzZSBjb21tYW5kcy4gSXQgYWxzbyBwcmVzZW50cyB0aGUgbWVyZ2UgY29tbWl0IGluIGEgc3BlY2lhbAorZm9ybWF0IGFzIHByb2R1Y2VkIGJ5ICdnaXQtZGlmZi10cmVlIC0tY2MnLgorCitUaGlzIG1hbnVhbCBwYWdlIGRlc2NyaWJlcyBvbmx5IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcHRpb25zLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxjb21taXRpZD46OgorCUlEIG9mIHRoZSBjb21taXQgdG8gc2hvdy4KKworLS1wcmV0dHk9PGZvcm1hdD46OgorCUNvbnRyb2xzIHRoZSBvdXRwdXQgZm9ybWF0IGZvciB0aGUgY29tbWl0IGxvZ3MuCisJPGZvcm1hdD4gY2FuIGJlIG9uZSBvZiAncmF3JywgJ21lZGl1bScsICdzaG9ydCcsICdmdWxsJywKKwlhbmQgJ29uZWxpbmUnLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgUGV0ciBCYXVkaXMgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK1RoaXMgbWFudWFsIHBhZ2UgaXMgYSBzdHViLiBZb3UgY2FuIGhlbHAgdGhlIGdpdCBkb2N1bWVudGF0aW9uIGJ5IGV4cGFuZGluZyBpdC4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1mZXRjaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtZmV0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtZmV0Y2gudHh0CkBAIC0wLDAgKzEsNTEgQEAKK2dpdC1zc2gtZmV0Y2goMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNzaC1mZXRjaCAtIFB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCisKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc3NoLWZldGNoJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy13IGZpbGVuYW1lXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nCitnaXQtc3NoLXVwbG9hZCBvbiB0aGUgb3RoZXIgZW5kLiBJdCBmdW5jdGlvbnMgaWRlbnRpY2FsbHkgdG8KK2dpdC1zc2gtdXBsb2FkLCBhc2lkZSBmcm9tIHdoaWNoIGVuZCB5b3UgcnVuIGl0IG9uLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2NvbW1pdC1pZDo6CisgICAgICAgIEVpdGhlciB0aGUgaGFzaCBvciB0aGUgZmlsZW5hbWUgdW5kZXIgW1VSTF0vcmVmcy8gdG8KKyAgICAgICAgcHVsbC4KKworLWM6OgorCUdldCB0aGUgY29tbWl0IG9iamVjdHMuCistdDo6CisJR2V0IHRyZWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWl0IG9iamVjdHMuCistYTo6CisJR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy12OjoKKwlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorLXc6OgorICAgICAgICBXcml0ZXMgdGhlIGNvbW1pdC1pZCBpbnRvIHRoZSBmaWxlbmFtZSB1bmRlciAkR0lUX0RJUi9yZWZzLyBvbgorICAgICAgICB0aGUgbG9jYWwgZW5kIGFmdGVyIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBEYW5pZWwgQmFya2Fsb3cgPGJhcmthbG93QGlhYmVydm9uLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtdXBsb2FkLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC11cGxvYWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjY3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtdXBsb2FkLnR4dApAQCAtMCwwICsxLDQ3IEBACitnaXQtc3NoLXVwbG9hZCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNzaC11cGxvYWQgLSBQdXNoZXMgdG8gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNzaC11cGxvYWQnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLXcgZmlsZW5hbWVdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitQdXNoZXMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nCitnaXQtc3NoLWZldGNoIG9uIHRoZSBvdGhlciBlbmQuIEl0IGZ1bmN0aW9ucyBpZGVudGljYWxseSB0bworZ2l0LXNzaC1mZXRjaCwgYXNpZGUgZnJvbSB3aGljaCBlbmQgeW91IHJ1biBpdCBvbi4KKworT1BUSU9OUworLS0tLS0tLQorY29tbWl0LWlkOjoKKyAgICAgICAgSWQgb2YgY29tbWl0IHRvIHB1c2guCisKKy1jOjoKKyAgICAgICAgR2V0IHRoZSBjb21taXQgb2JqZWN0cy4KKy10OjoKKyAgICAgICAgR2V0IHRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgY29tbWl0IG9iamVjdC4KKy1hOjoKKyAgICAgICAgR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy12OjoKKyAgICAgICAgUmVwb3J0IHdoYXQgaXMgdXBsb2FkZWQuCistdzo6CisgICAgICAgIFdyaXRlcyB0aGUgY29tbWl0LWlkIGludG8gdGhlIGZpbGVuYW1lIHVuZGVyIFtVUkxdL3JlZnMvIG9uCisgICAgICAgIHRoZSByZW1vdGUgZW5kIGFmdGVyIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgRGFuaWVsIEJhcmthbG93IDxiYXJrYWxvd0BpYWJlcnZvbi5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhbmllbCBCYXJrYWxvdworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3RhdHVzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN0YXR1cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0NmY0OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN0YXR1cy50eHQKQEAgLTAsMCArMSw0NSBAQAorZ2l0LXN0YXR1cygxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc3RhdHVzIC0gU2hvdyB3b3JraW5nIHRyZWUgc3RhdHVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN0YXR1cycKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitFeGFtaW5lcyBwYXRocyBpbiB0aGUgd29ya2luZyB0cmVlIHRoYXQgaGFzIGNoYW5nZXMgdW5yZWNvcmRlZAordG8gdGhlIGluZGV4IGZpbGUsIGFuZCBjaGFuZ2VzIGJldHdlZW4gdGhlIGluZGV4IGZpbGUgYW5kIHRoZQorY3VycmVudCBIRUFEIGNvbW1pdC4gIFRoZSBmb3JtZXIgcGF0aHMgYXJlIHdoYXQgeW91IF9jb3VsZF8KK2NvbW1pdCBieSBydW5uaW5nICdnaXQtdXBkYXRlLWluZGV4JyBiZWZvcmUgcnVubmluZyAnZ2l0Citjb21taXQnLCBhbmQgdGhlIGxhdHRlciBwYXRocyBhcmUgd2hhdCB5b3UgX3dvdWxkXyBjb21taXQgYnkKK3J1bm5pbmcgJ2dpdCBjb21taXQnLgorCitJZiB0aGVyZSBpcyBubyBwYXRoIHRoYXQgaXMgZGlmZmVyZW50IGJldHdlZW4gdGhlIGluZGV4IGZpbGUgYW5kCit0aGUgY3VycmVudCBIRUFEIGNvbW1pdCwgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBub24temVybworc3RhdHVzLgorCisKK09VVFBVVAorLS0tLS0tCitUaGUgb3V0cHV0IGZyb20gdGhpcyBjb21tYW5kIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBjb21taXQKK3RlbXBsYXRlIGNvbW1lbnRzLCBhbmQgYWxsIHRoZSBvdXRwdXQgbGluZXMgYXJlIHByZWZpeGVkIHdpdGggJyMnLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXN0cmlwc3BhY2UudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3RyaXBzcGFjZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwM2RkMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN0cmlwc3BhY2UudHh0CkBAIC0wLDAgKzEsMzMgQEAKK2dpdC1zdHJpcHNwYWNlKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc3RyaXBzcGFjZSAtIEZpbHRlciBvdXQgZW1wdHkgbGluZXMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc3RyaXBzcGFjZScgPCA8c3RyZWFtPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlbW92ZSBtdWx0aXBsZSBlbXB0eSBsaW5lcywgYW5kIGVtcHR5IGxpbmVzIGF0IGJlZ2lubmluZyBhbmQgZW5kLgorCitPUFRJT05TCistLS0tLS0tCis8c3RyZWFtPjo6CisJQnl0ZSBzdHJlYW0gdG8gYWN0IG9uLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3ZuaW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN2bmltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiODdjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN2bmltcG9ydC50eHQKQEAgLTAsMCArMSwxNjAgQEAKK2dpdC1zdm5pbXBvcnQoMSkKKz09PT09PT09PT09PT09PT0KK3YwLjEsIEp1bHkgMjAwNQorCitOQU1FCistLS0tCitnaXQtc3ZuaW1wb3J0IC0gSW1wb3J0IGEgU1ZOIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtc3ZuaW1wb3J0JyBbIC1vIDxicmFuY2gtZm9yLUhFQUQ+IF0gWyAtaCBdIFsgLXYgXSBbIC1kIHwgLUQgXQorCQlbIC1DIDxHSVRfcmVwb3NpdG9yeT4gXSBbIC1pIF0gWyAtdSBdIFstbCBsaW1pdF9yZXZdCisJCVsgLWIgYnJhbmNoX3N1YmRpciBdIFsgLVQgdHJ1bmtfc3ViZGlyIF0gWyAtdCB0YWdfc3ViZGlyIF0KKwkJWyAtcyBzdGFydF9jaGcgXSBbIC1tIF0gWyAtciBdIFsgLU0gcmVnZXggXQorCQlbIC1JIDxpZ25vcmVmaWxlX25hbWU+IF0gWyAtQSA8YXV0aG9yX2ZpbGU+IF0KKwkJPFNWTl9yZXBvc2l0b3J5X1VSTD4gWyA8cGF0aD4gXQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW1wb3J0cyBhIFNWTiByZXBvc2l0b3J5IGludG8gZ2l0LiBJdCB3aWxsIGVpdGhlciBjcmVhdGUgYSBuZXcKK3JlcG9zaXRvcnksIG9yIGluY3JlbWVudGFsbHkgaW1wb3J0IGludG8gYW4gZXhpc3Rpbmcgb25lLgorCitTVk4gYWNjZXNzIGlzIGRvbmUgYnkgdGhlIFNWTjo6UGVybCBtb2R1bGUuCisKK2dpdC1zdm5pbXBvcnQgYXNzdW1lcyB0aGF0IFNWTiByZXBvc2l0b3JpZXMgYXJlIG9yZ2FuaXplZCBpbnRvIG9uZQorInRydW5rIiBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1haW4gZGV2ZWxvcG1lbnQgaGFwcGVucywgImJyYW5jaC9GT08iCitkaXJlY3RvcmllcyBmb3IgYnJhbmNoZXMsIGFuZCAiL3RhZ3MvRk9PIiBkaXJlY3RvcmllcyBmb3IgdGFncy4KK090aGVyIHN1YmRpcmVjdG9yaWVzIGFyZSBpZ25vcmVkLgorCitnaXQtc3ZuaW1wb3J0IGNyZWF0ZXMgYSBmaWxlICIuZ2l0L3N2bjJnaXQiLCB3aGljaCBpcyByZXF1aXJlZCBmb3IKK2luY3JlbWVudGFsIFNWTiBpbXBvcnRzLgorCitPUFRJT05TCistLS0tLS0tCistQyA8dGFyZ2V0LWRpcj46OgorICAgICAgICBUaGUgR0lUIHJlcG9zaXRvcnkgdG8gaW1wb3J0IHRvLiAgSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0CisgICAgICAgIGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworLXMgPHN0YXJ0X3Jldj46OgorICAgICAgICBTdGFydCBpbXBvcnRpbmcgYXQgdGhpcyBTVk4gY2hhbmdlIG51bWJlci4gVGhlICBkZWZhdWx0IGlzIDEuCisrCitXaGVuIGltcG9ydGluZyBpbmNyZW1lbnRhbGx5LCB5b3UgbWlnaHQgbmVlZCB0byBlZGl0IHRoZSAuZ2l0L3N2bjJnaXQgZmlsZS4KKworLWk6OgorCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKwllbnN1cmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgaW5kZXggcmVtYWluIHVudG91Y2hlZCBhbmQgd2lsbAorCW5vdCBjcmVhdGUgdGhlbSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KKworLVQgPHRydW5rX3N1YmRpcj46OgorCU5hbWUgdGhlIFNWTiB0cnVuay4gRGVmYXVsdCAidHJ1bmsiLgorCistdCA8dGFnX3N1YmRpcj46OgorCU5hbWUgdGhlIFNWTiBzdWJkaXJlY3RvcnkgZm9yIHRhZ3MuIERlZmF1bHQgInRhZ3MiLgorCistYiA8YnJhbmNoX3N1YmRpcj46OgorCU5hbWUgdGhlIFNWTiBzdWJkaXJlY3RvcnkgZm9yIGJyYW5jaGVzLiBEZWZhdWx0ICJicmFuY2hlcyIuCisKKy1vIDxicmFuY2gtZm9yLUhFQUQ+OjoKKwlUaGUgJ3RydW5rJyBicmFuY2ggZnJvbSBTVk4gaXMgaW1wb3J0ZWQgdG8gdGhlICdvcmlnaW4nIGJyYW5jaCB3aXRoaW4KKwl0aGUgZ2l0IHJlcG9zaXRvcnkuIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBpbXBvcnQgaW50byBhCisJZGlmZmVyZW50IGJyYW5jaC4KKworLXI6OgorCVByZXBlbmQgJ3JYOiAnIHRvIGNvbW1pdCBtZXNzYWdlcywgd2hlcmUgWCBpcyB0aGUgaW1wb3J0ZWQKKwlzdWJ2ZXJzaW9uIHJldmlzaW9uLgorCistSSA8aWdub3JlZmlsZV9uYW1lPjo6CisJSW1wb3J0IHRoZSBzdm46aWdub3JlIGRpcmVjdG9yeSBwcm9wZXJ0eSB0byBmaWxlcyB3aXRoIHRoaXMKKwluYW1lIGluIGVhY2ggZGlyZWN0b3J5LiAoVGhlIFN1YnZlcnNpb24gYW5kIEdJVCBpZ25vcmUKKwlzeW50YXhlcyBhcmUgc2ltaWxhciBlbm91Z2ggdGhhdCB1c2luZyB0aGUgU3VidmVyc2lvbiBwYXR0ZXJucworCWRpcmVjdGx5IHdpdGggIi1JIC5naXRpZ25vcmUiIHdpbGwgYWxtb3N0IGFsd2F5cyBqdXN0IHdvcmsuKQorCistQSA8YXV0aG9yX2ZpbGU+OjoKKwlSZWFkIGEgZmlsZSB3aXRoIGxpbmVzIG9uIHRoZSBmb3JtCisrCistLS0tLS0KKwl1c2VybmFtZSA9IFVzZXIncyBGdWxsIE5hbWUgPGVtYWlsQGFkZHIuZXM+CisKKy0tLS0tLQorKworYW5kIHVzZSAiVXNlcidzIEZ1bGwgTmFtZSA8ZW1haWxAYWRkci5lcz4iIGFzIHRoZSBHSVQKK2F1dGhvciBhbmQgY29tbWl0dGVyIGZvciBTdWJ2ZXJzaW9uIGNvbW1pdHMgbWFkZSBieQorInVzZXJuYW1lIi4gSWYgZW5jb3VudGVyaW5nIGEgY29tbWl0IG1hZGUgYnkgYSB1c2VyIG5vdCBpbiB0aGUKK2xpc3QsIGFib3J0LgorKworRm9yIGNvbnZlbmllbmNlLCB0aGlzIGRhdGEgaXMgc2F2ZWQgdG8gJEdJVF9ESVIvc3ZuLWF1dGhvcnMKK2VhY2ggdGltZSB0aGUgLUEgb3B0aW9uIGlzIHByb3ZpZGVkLCBhbmQgcmVhZCBmcm9tIHRoYXQgc2FtZQorZmlsZSBlYWNoIHRpbWUgZ2l0LXN2bmltcG9ydCBpcyBydW4gd2l0aCBhbiBleGlzdGluZyBHSVQKK3JlcG9zaXRvcnkgd2l0aG91dCAtQS4KKworLW06OgorCUF0dGVtcHQgdG8gZGV0ZWN0IG1lcmdlcyBiYXNlZCBvbiB0aGUgY29tbWl0IG1lc3NhZ2UuIFRoaXMgb3B0aW9uCisJd2lsbCBlbmFibGUgZGVmYXVsdCByZWdleGVzIHRoYXQgdHJ5IHRvIGNhcHR1cmUgdGhlIG5hbWUgc291cmNlCisJYnJhbmNoIG5hbWUgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKy1NIDxyZWdleD46OgorCUF0dGVtcHQgdG8gZGV0ZWN0IG1lcmdlcyBiYXNlZCBvbiB0aGUgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGN1c3RvbQorCXJlZ2V4LiBJdCBjYW4gYmUgdXNlZCB3aXRoIC1tIHRvIGFsc28gc2VlIHRoZSBkZWZhdWx0IHJlZ2V4ZXMuCisJWW91IG11c3QgZXNjYXBlIGZvcndhcmQgc2xhc2hlcy4KKworLWwgPG1heF9yZXY+OjoKKwlTcGVjaWZ5IGEgbWF4aW11bSByZXZpc2lvbiBudW1iZXIgdG8gcHVsbC4KKworCUZvcm1lcmx5LCB0aGlzIG9wdGlvbiBjb250cm9sbGVkIGhvdyBtYW55IHJldmlzaW9ucyB0byBwdWxsLAorCWR1ZSB0byBTVk4gbWVtb3J5IGxlYWtzLiAoVGhlc2UgaGF2ZSBiZWVuIHdvcmtlZCBhcm91bmQuKQorCistdjo6CisJVmVyYm9zaXR5OiBsZXQgJ3N2bmltcG9ydCcgcmVwb3J0IHdoYXQgaXQgaXMgZG9pbmcuCisKKy1kOjoKKwlVc2UgZGlyZWN0IEhUVFAgcmVxdWVzdHMgaWYgcG9zc2libGUuIFRoZSAiPHBhdGg+IiBhcmd1bWVudCBpcyB1c2VkCisJb25seSBmb3IgcmV0cmlldmluZyB0aGUgU1ZOIGxvZ3M7IHRoZSBwYXRoIHRvIHRoZSBjb250ZW50cyBpcworCWluY2x1ZGVkIGluIHRoZSBTVk4gbG9nLgorCistRDo6CisJVXNlIGRpcmVjdCBIVFRQIHJlcXVlc3RzIGlmIHBvc3NpYmxlLiBUaGUgIjxwYXRoPiIgYXJndW1lbnQgaXMgdXNlZAorCWZvciByZXRyaWV2aW5nIHRoZSBsb2dzLCBhcyB3ZWxsIGFzIGZvciB0aGUgY29udGVudHMuCisrCitUaGVyZSdzIG5vIHNhZmUgd2F5IHRvIGF1dG9tYXRpY2FsbHkgZmluZCBvdXQgd2hpY2ggb2YgdGhlc2Ugb3B0aW9ucyB0bwordXNlLCBzbyB5b3UgbmVlZCB0byB0cnkgYm90aC4gVXN1YWxseSwgdGhlIG9uZSB0aGF0J3Mgd3Jvbmcgd2lsbCBkaWUKK3dpdGggYSA0MHggZXJyb3IgcHJldHR5IHF1aWNrbHkuCisKKzxTVk5fcmVwb3NpdG9yeV9VUkw+OjoKKwlUaGUgVVJMIG9mIHRoZSBTVk4gbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydC4gRm9yIGxvY2FsCisJcmVwb3NpdG9yaWVzLCB1c2UgImZpbGU6Ly8vYWJzb2x1dGUvcGF0aCIuCisrCitJZiB5b3UncmUgdXNpbmcgdGhlICItZCIgb3IgIi1EIiBvcHRpb24sIHRoaXMgaXMgdGhlIFVSTCBvZiB0aGUgU1ZOCityZXBvc2l0b3J5IGl0c2VsZjsgaXQgdXN1YWxseSBlbmRzIGluICIvc3ZuIi4KKworPHBhdGg+OjoKKwlUaGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSB3YW50IHRvIGNoZWNrIG91dC4KKworLWg6OgorCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworT1VUUFVUCistLS0tLS0KK0lmICctdicgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0IHJlcG9ydHMgd2hhdCBpdCBpcyBkb2luZy4KKworT3RoZXJ3aXNlLCBzdWNjZXNzIGlzIGluZGljYXRlZCB0aGUgVW5peCB3YXksIGkuZS4gYnkgc2ltcGx5IGV4aXRpbmcgd2l0aAorYSB6ZXJvIGV4aXQgc3RhdHVzLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4sIHdpdGggaGVscCBmcm9tCit2YXJpb3VzIHBhcnRpY2lwYW50cyBvZiB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitCYXNlZCBvbiBhIGN2czJnaXQgc2NyaXB0IGJ5IHRoZSBzYW1lIGF1dGhvci4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3ltYm9saWMtcmVmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN5bWJvbGljLXJlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhYzZhNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN5bWJvbGljLXJlZi50eHQKQEAgLTAsMCArMSw1MiBAQAorZ2l0LXN5bWJvbGljLXJlZigxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc3ltYm9saWMtcmVmIC0gcmVhZCBhbmQgbW9kaWZ5IHN5bWJvbGljIHJlZnMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN5bWJvbGljLXJlZicgPG5hbWU+IFs8cmVmPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXZlbiBvbmUgYXJndW1lbnQsIHJlYWRzIHdoaWNoIGJyYW5jaCBoZWFkIHRoZSBnaXZlbiBzeW1ib2xpYworcmVmIHJlZmVycyB0byBhbmQgb3V0cHV0cyBpdHMgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIGAuZ2l0L2AKK2RpcmVjdG9yeS4gIFR5cGljYWxseSB5b3Ugd291bGQgZ2l2ZSBgSEVBRGAgYXMgdGhlIDxuYW1lPgorYXJndW1lbnQgdG8gc2VlIG9uIHdoaWNoIGJyYW5jaCB5b3VyIHdvcmtpbmcgdHJlZSBpcyBvbi4KKworR2l2ZSB0d28gYXJndW1lbnRzLCBjcmVhdGUgb3IgdXBkYXRlIGEgc3ltYm9saWMgcmVmIDxuYW1lPiB0bworcG9pbnQgYXQgdGhlIGdpdmVuIGJyYW5jaCA8cmVmPi4KKworVHJhZGl0aW9uYWxseSwgYC5naXQvSEVBRGAgaXMgYSBzeW1saW5rIHBvaW50aW5nIGF0CitgcmVmcy9oZWFkcy9tYXN0ZXJgLiAgV2hlbiB3ZSB3YW50IHRvIHN3aXRjaCB0byBhbm90aGVyIGJyYW5jaCwKK3dlIGRpZCBgbG4gLXNmIHJlZnMvaGVhZHMvbmV3YnJhbmNoIC5naXQvSEVBRGAsIGFuZCB3aGVuIHdlIHdhbnQKK3RvIGZpbmQgb3V0IHdoaWNoIGJyYW5jaCB3ZSBhcmUgb24sIHdlIGRpZCBgcmVhZGxpbmsgLmdpdC9IRUFEYC4KK1RoaXMgd2FzIGZpbmUsIGFuZCBpbnRlcm5hbGx5IHRoYXQgaXMgd2hhdCBzdGlsbCBoYXBwZW5zIGJ5CitkZWZhdWx0LCBidXQgb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IGhhdmUgd29ya2luZyBzeW1saW5rcywKK29yIHRoYXQgZG8gbm90IGhhdmUgdGhlIGByZWFkbGluaygxKWAgY29tbWFuZCwgdGhpcyB3YXMgYSBiaXQKK2N1bWJlcnNvbWUuICBPbiBzb21lIHBsYXRmb3JtcywgYGxuIC1zZmAgZG9lcyBub3QgZXZlbiB3b3JrIGFzCithZHZlcnRpc2VkIChob3Jyb3JzKS4KKworQSBzeW1ib2xpYyByZWYgY2FuIGJlIGEgcmVndWxhciBmaWxlIHRoYXQgc3RvcmVzIGEgc3RyaW5nIHRoYXQKK2JlZ2lucyB3aXRoIGByZWY6IHJlZnMvYC4gIEZvciBleGFtcGxlLCB5b3VyIGAuZ2l0L0hFQURgICpjYW4qCitiZSBhIHJlZ3VsYXIgZmlsZSB3aG9zZSBjb250ZW50cyBpcyBgcmVmOiByZWZzL2hlYWRzL21hc3RlcmAuCitUaGlzIGNhbiBiZSB1c2VkIG9uIGEgZmlsZXN5c3RlbSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgc3ltYm9saWMKK2xpbmtzLiAgSW5zdGVhZCBvZiBkb2luZyBgcmVhZGxpbmsgLmdpdC9IRUFEYCwgYGdpdC1zeW1ib2xpYy1yZWYKK0hFQURgIGNhbiBiZSB1c2VkIHRvIGZpbmQgb3V0IHdoaWNoIGJyYW5jaCB3ZSBhcmUgb24uICBUbyBwb2ludAordGhlIEhFQUQgdG8gYG5ld2JyYW5jaGAsIGluc3RlYWQgb2YgYGxuIC1zZiByZWZzL2hlYWRzL25ld2JyYW5jaAorLmdpdC9IRUFEYCwgYGdpdC1zeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzL25ld2JyYW5jaGAgY2FuIGJlCit1c2VkLgorCitDdXJyZW50bHksIC5naXQvSEVBRCB1c2VzIGEgcmVndWxhciBmaWxlIHN5bWJvbGljIHJlZiBvbiBDeWd3aW4sCithbmQgZXZlcnl3aGVyZSBlbHNlIGl0IGlzIGltcGxlbWVudGVkIGFzIGEgc3ltbGluay4gIFRoaXMgY2FuIGJlCitjaGFuZ2VkIGF0IGNvbXBpbGF0aW9uIHRpbWUuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC10YWcudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdGFnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3NmMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdGFnLnR4dApAQCAtMCwwICsxLDc1IEBACitnaXQtdGFnKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC10YWcgLSBDcmVhdGUgYSB0YWcgb2JqZWN0IHNpZ25lZCB3aXRoIEdQRworCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC10YWcnIFstYSB8IC1zIHwgLXUgPGtleS1pZD5dIFstZiB8IC1kXSBbLW0gPG1zZz5dIDxuYW1lPiBbPGhlYWQ+XQorJ2dpdC10YWcnIC1sIFs8cGF0dGVybj5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQWRkcyBhICd0YWcnIHJlZmVyZW5jZSBpbiBgLmdpdC9yZWZzL3RhZ3MvYAorCitVbmxlc3MgYC1mYCBpcyBnaXZlbiwgdGhlIHRhZyBtdXN0IG5vdCB5ZXQgZXhpc3QgaW4KK2AuZ2l0L3JlZnMvdGFncy9gIGRpcmVjdG9yeS4KKworSWYgb25lIG9mIGAtYWAsIGAtc2AsIG9yIGAtdSA8a2V5LWlkPmAgaXMgcGFzc2VkLCB0aGUgY29tbWFuZAorY3JlYXRlcyBhICd0YWcnIG9iamVjdCwgYW5kIHJlcXVpcmVzIHRoZSB0YWcgbWVzc2FnZS4gIFVubGVzcworYC1tIDxtc2c+YCBpcyBnaXZlbiwgYW4gZWRpdG9yIGlzIHN0YXJ0ZWQgZm9yIHRoZSB1c2VyIHRvIHR5cGUKK2luIHRoZSB0YWcgbWVzc2FnZS4KKworT3RoZXJ3aXNlIGp1c3QgdGhlIFNIQTEgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1pdCBvYmplY3QgaXMKK3dyaXR0ZW4gKGkuZS4gYSBsaWdodHdlaWdodCB0YWcpLgorCitBIEdudVBHIHNpZ25lZCB0YWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCB3aGVuIGAtc2Agb3IgYC11Cis8a2V5LWlkPmAgaXMgdXNlZC4gIFdoZW4gYC11IDxrZXktaWQ+YCBpcyBub3QgdXNlZCwgdGhlCitjb21taXR0ZXIgaWRlbnRpdHkgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZCB0byBmaW5kIHRoZQorR251UEcga2V5IGZvciBzaWduaW5nLgorCitgLWQgPHRhZz5gIGRlbGV0ZXMgdGhlIHRhZy4KKworYC1sIDxwYXR0ZXJuPmAgbGlzdHMgdGFncyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuIChvciBhbGwKK2lmIG5vIHBhdHRlcm4gaXMgZ2l2ZW4pLgorCitPUFRJT05TCistLS0tLS0tCistYTo6CisJTWFrZSBhbiB1bnNpZ25lZCwgYW5ub3RhdGVkIHRhZyBvYmplY3QKKworLXM6OgorCU1ha2UgYSBHUEctc2lnbmVkIHRhZywgdXNpbmcgdGhlIGRlZmF1bHQgZS1tYWlsIGFkZHJlc3MncyBrZXkKKworLXUgPGtleS1pZD46OgorCU1ha2UgYSBHUEctc2lnbmVkIHRhZywgdXNpbmcgdGhlIGdpdmVuIGtleQorCistZjo6CisJUmVwbGFjZSBhbiBleGlzdGluZyB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoaW5zdGVhZCBvZiBmYWlsaW5nKQorCistZDo6CisJRGVsZXRlIGFuIGV4aXN0aW5nIHRhZyB3aXRoIHRoZSBnaXZlbiBuYW1lCisKKy1sIDxwYXR0ZXJuPjo6CisJTGlzdCB0YWdzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4gKG9yIGFsbCBpZiBubyBwYXR0ZXJuIGlzIGdpdmVuKS4KKworLW0gPG1zZz46OgorCVVzZSB0aGUgZ2l2ZW4gdGFnIG1lc3NhZ2UgKGluc3RlYWQgb2YgcHJvbXB0aW5nKQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZCBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXRhci10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXRhci10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzE1MzdiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdGFyLXRyZWUudHh0CkBAIC0wLDAgKzEsNjcgQEAKK2dpdC10YXItdHJlZSgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC10YXItdHJlZSAtIENyZWF0ZXMgYSB0YXIgYXJjaGl2ZSBvZiB0aGUgZmlsZXMgaW4gdGhlIG5hbWVkIHRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdGFyLXRyZWUnIFstLXJlbW90ZT08cmVwbz5dIDx0cmVlLWlzaD4gWyA8YmFzZT4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NyZWF0ZXMgYSB0YXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlIG5hbWVkIHRyZWUuCitXaGVuIDxiYXNlPiBpcyBzcGVjaWZpZWQgaXQgaXMgYWRkZWQgYXMgYSBsZWFkaW5nIHBhdGggdG8gdGhlIGZpbGVzIGluIHRoZQorZ2VuZXJhdGVkIHRhciBhcmNoaXZlLgorCitnaXQtdGFyLXRyZWUgYmVoYXZlcyBkaWZmZXJlbnRseSB3aGVuIGdpdmVuIGEgdHJlZSBJRCB2ZXJzdXMgd2hlbiBnaXZlbgorYSBjb21taXQgSUQgb3IgdGFnIElELiAgSW4gdGhlIGZpcnN0IGNhc2UgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkIGFzCittb2RpZmljYXRpb24gdGltZSBvZiBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUuICBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCitjb21taXQgdGltZSBhcyByZWNvcmRlZCBpbiB0aGUgcmVmZXJlbmNlZCBjb21taXQgb2JqZWN0IGlzIHVzZWQgaW5zdGVhZC4KK0FkZGl0aW9uYWxseSB0aGUgY29tbWl0IElEIGlzIHN0b3JlZCBpbiBhIGdsb2JhbCBleHRlbmRlZCBwYXggaGVhZGVyLgorSXQgY2FuIGJlIGV4dHJhY3RlZCB1c2luZyBnaXQtZ2V0LXRhci1jb21taXQtaWQuCisKK09QVElPTlMKKy0tLS0tLS0KKworPHRyZWUtaXNoPjo6CisJVGhlIHRyZWUgb3IgY29tbWl0IHRvIHByb2R1Y2UgdGFyIGFyY2hpdmUgZm9yLiAgSWYgaXQgaXMKKwl0aGUgb2JqZWN0IG5hbWUgb2YgYSBjb21taXQgb2JqZWN0LgorCis8YmFzZT46OgorCUxlYWRpbmcgcGF0aCB0byB0aGUgZmlsZXMgaW4gdGhlIHJlc3VsdGluZyB0YXIgYXJjaGl2ZS4KKworLS1yZW1vdGU9PHJlcG8+OjoKKwlJbnN0ZWFkIG9mIG1ha2luZyBhIHRhciBhcmNoaXZlIGZyb20gbG9jYWwgcmVwb3NpdG9yeSwKKwlyZXRyaWV2ZSBhIHRhciBhcmNoaXZlIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS4KKworRXhhbXBsZXMKKy0tLS0tLS0tCitnaXQgdGFyLXRyZWUgSEVBRCB8IChjZCAvdmFyL3RtcC8gJiYgbWtkaXIganVuayAmJiB0YXIgQ3hmIGp1bmsgLSk6OgorCisJQ3JlYXRlIGEgdGFyIGFyY2hpdmUgdGhhdCBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlCisJbGF0ZXN0IGNvbW1pdCBvbiB0aGUgY3VycmVudCBicmFuY2gsIGFuZCBleHRyYWN0cyBpdCBpbgorCWAvdmFyL3RtcC9qdW5rYCBkaXJlY3RvcnkuCisKK2dpdCB0YXItdHJlZSB2Mi42LjE3IGxpbnV4LTIuNi4xNyB8IGd6aXAgPmxpbnV4LTIuNi4xNy50YXIuZ3oKKworCUNyZWF0ZSBhIHRhcmJhbGwgZm9yIHYyLjYuMTcgcmVsZWFzZS4KKworZ2l0IHRhci10cmVlIC0tcmVtb3RlPWV4YW1wbGUuY29tOmdpdC5naXQgdjAuOTkgPmdpdC0wLjk5LnRhcgorCisJR2V0IGEgdGFyYmFsbCB2MC45OSBmcm9tIGV4YW1wbGUuY29tLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBSZW5lIFNjaGFyZmUuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdG9vbHMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdG9vbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTUyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC10b29scy50eHQKQEAgLTAsMCArMSw5NyBAQAorQSBzaG9ydCBnaXQgdG9vbHMgc3VydmV5Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitBcGFydCBmcm9tIGdpdCBjb250cmliLyBhcmVhIHRoZXJlIGFyZSBzb21lIG90aGVycyB0aGlyZC1wYXJ0eSB0b29scworeW91IG1heSB3YW50IHRvIGxvb2suCisKK1RoaXMgZG9jdW1lbnQgcHJlc2VudHMgYSBicmllZiBzdW1tYXJ5IG9mIGVhY2ggdG9vbCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKK2xpbmsuCisKKworQWx0ZXJuYXRpdmUvQXVnbWVudGF0aXZlIFBvcmNlbGFpbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIC0gKkNvZ2l0byogKGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2NvZ2l0by8pCisKKyAgIENvZ2l0byBpcyBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIGdpdCB0cmVlIGhpc3RvcnkKKyAgIHN0b3JhZ2Ugc3lzdGVtLiBJdCBhaW1zIGF0IHNlYW1sZXNzIHVzZXIgaW50ZXJmYWNlIGFuZCBlYXNlIG9mIHVzZSwKKyAgIHByb3ZpZGluZyBnZW5lcmFsbHkgc21vb3RoZXIgdXNlciBleHBlcmllbmNlIHRoYW4gdGhlICJyYXciIENvcmUgR0lUCisgICBpdHNlbGYgYW5kIGluZGVlZCBtYW55IG90aGVyIHZlcnNpb24gY29udHJvbCBzeXN0ZW1zLgorCisKKyAgIC0gKnBnKiAoaHR0cDovL3d3dy5zcGVhcmNlLm9yZy9jYXRlZ29yeS9wcm9qZWN0cy9zY20vcGcvKQorCisgICBwZyBpcyBhIHNoZWxsIHNjcmlwdCB3cmFwcGVyIGFyb3VuZCBHSVQgdG8gaGVscCB0aGUgdXNlciBtYW5hZ2UgYSBzZXQgb2YKKyAgIHBhdGNoZXMgdG8gZmlsZXMuIHBnIGlzIHNvbWV3aGF0IGxpa2UgcXVpbHQgb3IgU3RHSVQsIGJ1dCBpdCBkb2VzIGhhdmUgYQorICAgc2xpZ2h0bHkgZGlmZmVyZW50IGZlYXR1cmUgc2V0LgorCisKKyAgIC0gKlN0R2l0KiAoaHR0cDovL3d3dy5wcm9jb2RlLm9yZy9zdGdpdC8pCisKKyAgIFN0YWNrZWQgR0lUIHByb3ZpZGVzIGEgcXVpbHQtbGlrZSBwYXRjaCBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgaW4gdGhlCisgICAgR0lUIGVudmlyb25tZW50LiBZb3UgY2FuIGVhc2lseSBtYW5hZ2UgeW91ciBwYXRjaGVzIGluIHRoZSBzY29wZSBvZiBHSVQKKyAgIHVudGlsIHRoZXkgZ2V0IG1lcmdlZCB1cHN0cmVhbS4KKworCitIaXN0b3J5IFZpZXdlcnMKKy0tLS0tLS0tLS0tLS0tLQorCisgICAtICpnaXRrKiAoc2hpcHBlZCB3aXRoIGdpdC1jb3JlKQorCisgICBnaXRrIGlzIGEgc2ltcGxlIFRLIEdVSSBmb3IgYnJvd3NpbmcgaGlzdG9yeSBvZiBHSVQgcmVwb3NpdG9yaWVzIGVhc2lseS4KKworCisgICAtICpnaXR2aWV3KiAgKGNvbnRyaWIvKQorCisgICBnaXR2aWV3IGlzIGEgR1RLIGJhc2VkIHJlcG9zaXRvcnkgYnJvd3NlciBmb3IgZ2l0CisKKworICAgLSAqZ2l0d2ViKiAoZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXR3ZWIvKQorCisgICBHSVR3ZWIgcHJvdmlkZXMgZnVsbC1mbGVkZ2VkIHdlYiBpbnRlcmZhY2UgZm9yIEdJVCByZXBvc2l0b3JpZXMuCisKKworICAgLSAqcWdpdCogKGh0dHA6Ly9kaWdpbGFuZGVyLmxpYmVyby5pdC9tY29zdGFsYmEvKQorCisgICBRR2l0IGlzIGEgZ2l0L1N0R0lUIEdVSSB2aWV3ZXIgYnVpbHQgb24gUXQvQysrLiBRR2l0IGNvdWxkIGJlIHVzZWQKKyAgIHRvIGJyb3dzZSBoaXN0b3J5IGFuZCBkaXJlY3RvcnkgdHJlZSwgdmlldyBhbm5vdGF0ZWQgZmlsZXMsIGNvbW1pdAorICAgY2hhbmdlcyBjaGVycnkgcGlja2luZyBzaW5nbGUgZmlsZXMgb3IgYXBwbHlpbmcgcGF0Y2hlcy4KKyAgIEN1cnJlbnRseSBpdCBpcyB0aGUgZmFzdGVzdCBhbmQgbW9zdCBmZWF0dXJlIHJpY2ggYW1vbmcgdGhlIGdpdAorICAgdmlld2VycyBhbmQgY29tbWl0IHRvb2xzLgorCisKKworRm9yZWlnbiBTQ00gaW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgLSAqZ2l0LXN2biogKGNvbnRyaWIvKQorCisgICBnaXQtc3ZuIGlzIGEgc2ltcGxlIGNvbmR1aXQgZm9yIGNoYW5nZXNldHMgYmV0d2VlbiBhIHNpbmdsZSBTdWJ2ZXJzaW9uCisgICBicmFuY2ggYW5kIGdpdC4KKworCisgICAtICpxdWlsdDJnaXQgLyBnaXQycXVpbHQqIChodHRwOi8vaG9tZS10ai5vcmcvd2lraS9pbmRleC5waHAvTWlzYykKKworICAgVGhlc2UgdXRpbGl0aWVzIGNvbnZlcnQgcGF0Y2ggc2VyaWVzIGluIGEgcXVpbHQgcmVwb3NpdG9yeSBhbmQgY29tbWl0CisgICBzZXJpZXMgaW4gZ2l0IGJhY2sgYW5kIGZvcnRoLgorCisKK090aGVycworLS0tLS0tCisKKyAgIC0gKihoKWdjdCogKGh0dHA6Ly93d3cuY3lkLmxpdS5zZS91c2Vycy9+ZnJla3UwNDUvZ2N0LykKKworICAgQ29tbWl0IFRvb2wgb3IgKGgpZ2N0IGlzIGEgR1VJIGVuYWJsZWQgY29tbWl0IHRvb2wgZm9yIGdpdCBhbmQKKyAgIE1lcmN1cmlhbCAoaGcpLiBJdCBhbGxvd3MgdGhlIHVzZXIgdG8gdmlldyBkaWZmcywgc2VsZWN0IHdoaWNoIGZpbGVzCisgICB0byBjb21taXR0ZWQgKG9yIGlnbm9yZWQgLyByZXZlcnRlZCkgd3JpdGUgY29tbWl0IG1lc3NhZ2VzIGFuZAorICAgcGVyZm9ybSB0aGUgY29tbWl0IGl0c2VsZi4KKworICAgLSAqZ2l0LmVsKiAoY29udHJpYi8pCisKKyAgIFRoaXMgaXMgYW4gRW1hY3MgaW50ZXJmYWNlIGZvciBnaXQuIFRoZSB1c2VyIGludGVyZmFjZSBpcyBtb2RlbGVkIG9uCisgICBwY2wtY3ZzLiBJdCBoYXMgYmVlbiBkZXZlbG9wZWQgb24gRW1hY3MgMjEgYW5kIHdpbGwgcHJvYmFibHkgbmVlZCBzb21lCisgICB0d2Vha2luZyB0byB3b3JrIG9uIFhFbWFjcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVucGFjay1maWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVucGFjay1maWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTNkYzgxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLWZpbGUudHh0CkBAIC0wLDAgKzEsMzYgQEAKK2dpdC11bnBhY2stZmlsZSgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11bnBhY2stZmlsZSAtIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIGEgYmxvYidzIGNvbnRlbnRzCisKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdW5wYWNrLWZpbGUnIDxibG9iPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NyZWF0ZXMgYSBmaWxlIGhvbGRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9iIHNwZWNpZmllZCBieSBzaGExLiBJdAorcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisJLm1lcmdlX2ZpbGVfWFhYWFgKKworT1BUSU9OUworLS0tLS0tLQorPGJsb2I+OjoKKwlNdXN0IGJlIGEgYmxvYiBpZAorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLW9iamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLW9iamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGIzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stb2JqZWN0cy50eHQKQEAgLTAsMCArMSw0OSBAQAorZ2l0LXVucGFjay1vYmplY3RzKDEpCis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVucGFjay1vYmplY3RzIC0gVW5wYWNrIG9iamVjdHMgZnJvbSBhIHBhY2tlZCBhcmNoaXZlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVucGFjay1vYmplY3RzJyBbLW5dIFstcV0gPHBhY2stZmlsZQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZCBhIHBhY2tlZCBhcmNoaXZlICgucGFjaykgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsIGV4cGFuZGluZwordGhlIG9iamVjdHMgY29udGFpbmVkIHdpdGhpbiBhbmQgd3JpdGluZyB0aGVtIGludG8gdGhlIHJlcG9zaXRvcnkgaW4KKyJsb29zZSIgKG9uZSBvYmplY3QgcGVyIGZpbGUpIGZvcm1hdC4KKworT2JqZWN0cyB0aGF0IGFscmVhZHkgZXhpc3QgaW4gdGhlIHJlcG9zaXRvcnkgd2lsbCAqbm90KiBiZSB1bnBhY2tlZAorZnJvbSB0aGUgcGFjay1maWxlLiAgVGhlcmVmb3JlLCBub3RoaW5nIHdpbGwgYmUgdW5wYWNrZWQgaWYgeW91IHVzZQordGhpcyBjb21tYW5kIG9uIGEgcGFjay1maWxlIHRoYXQgZXhpc3RzIHdpdGhpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuCisKK1BsZWFzZSBzZWUgdGhlIGBnaXQtcmVwYWNrYCBkb2N1bWVudGF0aW9uIGZvciBvcHRpb25zIHRvIGdlbmVyYXRlCituZXcgcGFja3MgYW5kIHJlcGxhY2UgZXhpc3Rpbmcgb25lcy4KKworT1BUSU9OUworLS0tLS0tLQorLW46OgorICAgICAgICBPbmx5IGxpc3QgdGhlIG9iamVjdHMgdGhhdCB3b3VsZCBiZSB1bnBhY2tlZCwgZG9uJ3QgYWN0dWFsbHkgdW5wYWNrCisgICAgICAgIHRoZW0uCisKKy1xOjoKKwlUaGUgY29tbWFuZCB1c3VhbGx5IHNob3dzIHBlcmNlbnRhZ2UgcHJvZ3Jlc3MuICBUaGlzCisJZmxhZyBzdXBwcmVzc2VzIGl0LgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1pbmRleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlNmU3NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1pbmRleC50eHQKQEAgLTAsMCArMSwzMTggQEAKK2dpdC11cGRhdGUtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwZGF0ZS1pbmRleCAtIE1vZGlmaWVzIHRoZSBpbmRleCBvciBkaXJlY3RvcnkgY2FjaGUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtdXBkYXRlLWluZGV4JworCSAgICAgWy0tYWRkXSBbLS1yZW1vdmUgfCAtLWZvcmNlLXJlbW92ZV0gWy0tcmVwbGFjZV0KKwkgICAgIFstLXJlZnJlc2hdIFstcV0gWy0tdW5tZXJnZWRdIFstLWlnbm9yZS1taXNzaW5nXQorCSAgICAgWy0tY2FjaGVpbmZvIDxtb2RlPiA8b2JqZWN0PiA8ZmlsZT5dXCoKKwkgICAgIFstLWNobW9kPSgrfC0peF0KKwkgICAgIFstLWFzc3VtZS11bmNoYW5nZWQgfCAtLW5vLWFzc3VtZS11bmNoYW5nZWRdCisJICAgICBbLS1yZWFsbHktcmVmcmVzaF0gWy0tdW5yZXNvbHZlXSBbLS1hZ2Fpbl0KKwkgICAgIFstLWluZm8tb25seV0gWy0taW5kZXgtaW5mb10KKwkgICAgIFstel0gWy0tc3RkaW5dCisJICAgICBbLS12ZXJib3NlXQorCSAgICAgWy0tXSBbPGZpbGU+XVwqCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorTW9kaWZpZXMgdGhlIGluZGV4IG9yIGRpcmVjdG9yeSBjYWNoZS4gRWFjaCBmaWxlIG1lbnRpb25lZCBpcyB1cGRhdGVkCitpbnRvIHRoZSBpbmRleCBhbmQgYW55ICd1bm1lcmdlZCcgb3IgJ25lZWRzIHVwZGF0aW5nJyBzdGF0ZSBpcworY2xlYXJlZC4KKworVGhlIHdheSAiZ2l0LXVwZGF0ZS1pbmRleCIgaGFuZGxlcyBmaWxlcyBpdCBpcyB0b2xkIGFib3V0IGNhbiBiZSBtb2RpZmllZAordXNpbmcgdGhlIHZhcmlvdXMgb3B0aW9uczoKKworT1BUSU9OUworLS0tLS0tLQorLS1hZGQ6OgorCUlmIGEgc3BlY2lmaWVkIGZpbGUgaXNuJ3QgaW4gdGhlIGluZGV4IGFscmVhZHkgdGhlbiBpdCdzCisJYWRkZWQuCisJRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gaWdub3JlIG5ldyBmaWxlcy4KKworLS1yZW1vdmU6OgorCUlmIGEgc3BlY2lmaWVkIGZpbGUgaXMgaW4gdGhlIGluZGV4IGJ1dCBpcyBtaXNzaW5nIHRoZW4gaXQncworCXJlbW92ZWQuCisJRGVmYXVsdCBiZWhhdmlvciBpcyB0byBpZ25vcmUgcmVtb3ZlZCBmaWxlLgorCistLXJlZnJlc2g6OgorCUxvb2tzIGF0IHRoZSBjdXJyZW50IGluZGV4IGFuZCBjaGVja3MgdG8gc2VlIGlmIG1lcmdlcyBvcgorCXVwZGF0ZXMgYXJlIG5lZWRlZCBieSBjaGVja2luZyBzdGF0KCkgaW5mb3JtYXRpb24uCisKKy1xOjoKKyAgICAgICAgUXVpZXQuICBJZiAtLXJlZnJlc2ggZmluZHMgdGhhdCB0aGUgaW5kZXggbmVlZHMgYW4gdXBkYXRlLCB0aGUKKyAgICAgICAgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBlcnJvciBvdXQuICBUaGlzIG9wdGlvbiBtYWtlcworICAgICAgICBnaXQtdXBkYXRlLWluZGV4IGNvbnRpbnVlIGFueXdheS4KKworLS11bm1lcmdlZDo6CisgICAgICAgIElmIC0tcmVmcmVzaCBmaW5kcyB1bm1lcmdlZCBjaGFuZ2VzIGluIHRoZSBpbmRleCwgdGhlIGRlZmF1bHQKKyAgICAgICAgYmVoYXZpb3IgaXMgdG8gZXJyb3Igb3V0LiAgVGhpcyBvcHRpb24gbWFrZXMgZ2l0LXVwZGF0ZS1pbmRleCAKKyAgICAgICAgY29udGludWUgYW55d2F5LgorCistLWlnbm9yZS1taXNzaW5nOjoKKwlJZ25vcmVzIG1pc3NpbmcgZmlsZXMgZHVyaW5nIGEgLS1yZWZyZXNoCisKKy0tY2FjaGVpbmZvIDxtb2RlPiA8b2JqZWN0PiA8cGF0aD46OgorCURpcmVjdGx5IGluc2VydCB0aGUgc3BlY2lmaWVkIGluZm8gaW50byB0aGUgaW5kZXguCisJCistLWluZGV4LWluZm86OgorICAgICAgICBSZWFkIGluZGV4IGluZm9ybWF0aW9uIGZyb20gc3RkaW4uCisKKy0tY2htb2Q9KCt8LSl4OjoKKyAgICAgICAgU2V0IHRoZSBleGVjdXRlIHBlcm1pc3Npb25zIG9uIHRoZSB1cGRhdGVkIGZpbGVzLiAgICAgICAgCisKKy0tYXNzdW1lLXVuY2hhbmdlZCwgLS1uby1hc3N1bWUtdW5jaGFuZ2VkOjoKKwlXaGVuIHRoZXNlIGZsYWdzIGFyZSBzcGVjaWZpZWQsIHRoZSBvYmplY3QgbmFtZSByZWNvcmRlZAorCWZvciB0aGUgcGF0aHMgYXJlIG5vdCB1cGRhdGVkLiAgSW5zdGVhZCwgdGhlc2Ugb3B0aW9ucworCXNldHMgYW5kIHVuc2V0cyB0aGUgImFzc3VtZSB1bmNoYW5nZWQiIGJpdCBmb3IgdGhlCisJcGF0aHMuICBXaGVuIHRoZSAiYXNzdW1lIHVuY2hhbmdlZCIgYml0IGlzIG9uLCBnaXQgc3RvcHMKKwljaGVja2luZyB0aGUgd29ya2luZyB0cmVlIGZpbGVzIGZvciBwb3NzaWJsZQorCW1vZGlmaWNhdGlvbnMsIHNvIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHVuc2V0IHRoZSBiaXQgdG8KKwl0ZWxsIGdpdCB3aGVuIHlvdSBjaGFuZ2UgdGhlIHdvcmtpbmcgdHJlZSBmaWxlLiBUaGlzIGlzCisJc29tZXRpbWVzIGhlbHBmdWwgd2hlbiB3b3JraW5nIHdpdGggYSBiaWcgcHJvamVjdCBvbiBhCisJZmlsZXN5c3RlbSB0aGF0IGhhcyB2ZXJ5IHNsb3cgbHN0YXQoMikgc3lzdGVtIGNhbGwKKwkoZS5nLiBjaWZzKS4KKworLS1hZ2Fpbjo6CisJUnVucyBgZ2l0LXVwZGF0ZS1pbmRleGAgaXRzZWxmIG9uIHRoZSBwYXRocyB3aG9zZSBpbmRleAorCWVudHJpZXMgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIGZyb20gdGhlIGBIRUFEYCBjb21taXQuCisKKy0tdW5yZXNvbHZlOjoKKwlSZXN0b3JlcyB0aGUgJ3VubWVyZ2VkJyBvciAnbmVlZHMgdXBkYXRpbmcnIHN0YXRlIG9mIGEKKwlmaWxlIGR1cmluZyBhIG1lcmdlIGlmIGl0IHdhcyBjbGVhcmVkIGJ5IGFjY2lkZW50LgorCistLWluZm8tb25seTo6CisJRG8gbm90IGNyZWF0ZSBvYmplY3RzIGluIHRoZSBvYmplY3QgZGF0YWJhc2UgZm9yIGFsbAorCTxmaWxlPiBhcmd1bWVudHMgdGhhdCBmb2xsb3cgdGhpcyBmbGFnOyBqdXN0IGluc2VydAorCXRoZWlyIG9iamVjdCBJRHMgaW50byB0aGUgaW5kZXguCisKKy0tZm9yY2UtcmVtb3ZlOjoKKwlSZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgaW5kZXggZXZlbiB3aGVuIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorCXN0aWxsIGhhcyBzdWNoIGEgZmlsZS4gKEltcGxpZXMgLS1yZW1vdmUuKQorCistLXJlcGxhY2U6OgorCUJ5IGRlZmF1bHQsIHdoZW4gYSBmaWxlIGBwYXRoYCBleGlzdHMgaW4gdGhlIGluZGV4LAorCWdpdC11cGRhdGUtaW5kZXggcmVmdXNlcyBhbiBhdHRlbXB0IHRvIGFkZCBgcGF0aC9maWxlYC4KKwlTaW1pbGFybHkgaWYgYSBmaWxlIGBwYXRoL2ZpbGVgIGV4aXN0cywgYSBmaWxlIGBwYXRoYAorCWNhbm5vdCBiZSBhZGRlZC4gIFdpdGggLS1yZXBsYWNlIGZsYWcsIGV4aXN0aW5nIGVudHJpZXMKKwl0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBlbnRyeSBiZWluZyBhZGRlZCBhcmUKKwlhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2l0aCB3YXJuaW5nIG1lc3NhZ2VzLgorCistLXN0ZGluOjoKKwlJbnN0ZWFkIG9mIHRha2luZyBsaXN0IG9mIHBhdGhzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwKKwlyZWFkIGxpc3Qgb2YgcGF0aHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuICBQYXRocyBhcmUKKwlzZXBhcmF0ZWQgYnkgTEYgKGkuZS4gb25lIHBhdGggcGVyIGxpbmUpIGJ5IGRlZmF1bHQuCisKKy0tdmVyYm9zZTo6CisgICAgICAgIFJlcG9ydCB3aGF0IGlzIGJlaW5nIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gaW5kZXguCisKKy16OjoKKwlPbmx5IG1lYW5pbmdmdWwgd2l0aCBgLS1zdGRpbmA7IHBhdGhzIGFyZSBzZXBhcmF0ZWQgd2l0aAorCU5VTCBjaGFyYWN0ZXIgaW5zdGVhZCBvZiBMRi4KKworXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCis8ZmlsZT46OgorCUZpbGVzIHRvIGFjdCBvbi4KKwlOb3RlIHRoYXQgZmlsZXMgYmVnaW5uaW5nIHdpdGggJy4nIGFyZSBkaXNjYXJkZWQuIFRoaXMgaW5jbHVkZXMKKwlgLi9maWxlYCBhbmQgYGRpci8uL2ZpbGVgLiBJZiB5b3UgZG9uJ3Qgd2FudCB0aGlzLCB0aGVuIHVzZQkKKwljbGVhbmVyIG5hbWVzLgorCVRoZSBzYW1lIGFwcGxpZXMgdG8gZGlyZWN0b3JpZXMgZW5kaW5nICcvJyBhbmQgcGF0aHMgd2l0aCAnLy8nCisKK1VzaW5nIC0tcmVmcmVzaAorLS0tLS0tLS0tLS0tLS0tCisnLS1yZWZyZXNoJyBkb2VzIG5vdCBjYWxjdWxhdGUgYSBuZXcgc2hhMSBmaWxlIG9yIGJyaW5nIHRoZSBpbmRleAordXAtdG8tZGF0ZSBmb3IgbW9kZS9jb250ZW50IGNoYW5nZXMuIEJ1dCB3aGF0IGl0ICpkb2VzKiBkbyBpcyB0bworInJlLW1hdGNoIiB0aGUgc3RhdCBpbmZvcm1hdGlvbiBvZiBhIGZpbGUgd2l0aCB0aGUgaW5kZXgsIHNvIHRoYXQgeW91CitjYW4gcmVmcmVzaCB0aGUgaW5kZXggZm9yIGEgZmlsZSB0aGF0IGhhc24ndCBiZWVuIGNoYW5nZWQgYnV0IHdoZXJlCit0aGUgc3RhdCBlbnRyeSBpcyBvdXQgb2YgZGF0ZS4KKworRm9yIGV4YW1wbGUsIHlvdSdkIHdhbnQgdG8gZG8gdGhpcyBhZnRlciBkb2luZyBhICJnaXQtcmVhZC10cmVlIiwgdG8gbGluawordXAgdGhlIHN0YXQgaW5kZXggZGV0YWlscyB3aXRoIHRoZSBwcm9wZXIgZmlsZXMuCisKK1VzaW5nIC0tY2FjaGVpbmZvIG9yIC0taW5mby1vbmx5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJy0tY2FjaGVpbmZvJyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgZmlsZSB0aGF0IGlzIG5vdCBpbiB0aGUKK2N1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBUaGlzIGlzIHVzZWZ1bCBmb3IgbWluaW11bS1jaGVja291dAorbWVyZ2luZy4KKworVG8gcHJldGVuZCB5b3UgaGF2ZSBhIGZpbGUgd2l0aCBtb2RlIGFuZCBzaGExIGF0IHBhdGgsIHNheToKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtdXBkYXRlLWluZGV4IC0tY2FjaGVpbmZvIG1vZGUgc2hhMSBwYXRoCistLS0tLS0tLS0tLS0tLS0tCisKKyctLWluZm8tb25seScgaXMgdXNlZCB0byByZWdpc3RlciBmaWxlcyB3aXRob3V0IHBsYWNpbmcgdGhlbSBpbiB0aGUgb2JqZWN0CitkYXRhYmFzZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBzdGF0dXMtb25seSByZXBvc2l0b3JpZXMuCisKK0JvdGggJy0tY2FjaGVpbmZvJyBhbmQgJy0taW5mby1vbmx5JyBiZWhhdmUgc2ltaWxhcmx5OiB0aGUgaW5kZXggaXMgdXBkYXRlZAorYnV0IHRoZSBvYmplY3QgZGF0YWJhc2UgaXNuJ3QuICAnLS1jYWNoZWluZm8nIGlzIHVzZWZ1bCB3aGVuIHRoZSBvYmplY3QgaXMKK2luIHRoZSBkYXRhYmFzZSBidXQgdGhlIGZpbGUgaXNuJ3QgYXZhaWxhYmxlIGxvY2FsbHkuICAnLS1pbmZvLW9ubHknIGlzCit1c2VmdWwgd2hlbiB0aGUgZmlsZSBpcyBhdmFpbGFibGUsIGJ1dCB5b3UgZG8gbm90IHdpc2ggdG8gdXBkYXRlIHRoZQorb2JqZWN0IGRhdGFiYXNlLgorCisKK1VzaW5nIC0taW5kZXgtaW5mbworLS0tLS0tLS0tLS0tLS0tLS0tCisKK2AtLWluZGV4LWluZm9gIGlzIGEgbW9yZSBwb3dlcmZ1bCBtZWNoYW5pc20gdGhhdCBsZXRzIHlvdSBmZWVkCittdWx0aXBsZSBlbnRyeSBkZWZpbml0aW9ucyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgYW5kIGRlc2lnbmVkCitzcGVjaWZpY2FsbHkgZm9yIHNjcmlwdHMuICBJdCBjYW4gdGFrZSBpbnB1dHMgb2YgdGhyZWUgZm9ybWF0czoKKworICAgIC4gbW9kZSAgICAgICAgIFNQIHNoYTEgICAgICAgICAgVEFCIHBhdGgKKysKK1RoZSBmaXJzdCBmb3JtYXQgaXMgd2hhdCAiZ2l0LWFwcGx5IC0taW5kZXgtaW5mbyIKK3JlcG9ydHMsIGFuZCB1c2VkIHRvIHJlY29uc3RydWN0IGEgcGFydGlhbCB0cmVlCit0aGF0IGlzIHVzZWQgZm9yIHBob255IG1lcmdlIGJhc2UgdHJlZSB3aGVuIGZhbGxpbmcKK2JhY2sgb24gMy13YXkgbWVyZ2UuCisKKyAgICAuIG1vZGUgU1AgdHlwZSBTUCBzaGExICAgICAgICAgIFRBQiBwYXRoCisrCitUaGUgc2Vjb25kIGZvcm1hdCBpcyB0byBzdHVmZiBnaXQtbHMtdHJlZSBvdXRwdXQKK2ludG8gdGhlIGluZGV4IGZpbGUuCisKKyAgICAuIG1vZGUgICAgICAgICBTUCBzaGExIFNQIHN0YWdlIFRBQiBwYXRoCisrCitUaGlzIGZvcm1hdCBpcyB0byBwdXQgaGlnaGVyIG9yZGVyIHN0YWdlcyBpbnRvIHRoZQoraW5kZXggZmlsZSBhbmQgbWF0Y2hlcyBnaXQtbHMtZmlsZXMgLS1zdGFnZSBvdXRwdXQuCisKK1RvIHBsYWNlIGEgaGlnaGVyIHN0YWdlIGVudHJ5IHRvIHRoZSBpbmRleCwgdGhlIHBhdGggc2hvdWxkCitmaXJzdCBiZSByZW1vdmVkIGJ5IGZlZWRpbmcgYSBtb2RlPTAgZW50cnkgZm9yIHRoZSBwYXRoLCBhbmQKK3RoZW4gZmVlZGluZyBuZWNlc3NhcnkgaW5wdXQgbGluZXMgaW4gdGhlIHRoaXJkIGZvcm1hdC4KKworRm9yIGV4YW1wbGUsIHN0YXJ0aW5nIHdpdGggdGhpcyBpbmRleDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBscy1maWxlcyAtcworMTAwNjQ0IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMCAgICAgICBmcm90egorLS0tLS0tLS0tLS0tCisKK3lvdSBjYW4gZmVlZCB0aGUgZm9sbG93aW5nIGlucHV0IHRvIGAtLWluZGV4LWluZm9gOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8KKzAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAlmcm90egorMTAwNjQ0IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMQlmcm90egorMTAwNzU1IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMglmcm90egorLS0tLS0tLS0tLS0tCisKK1RoZSBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmZWVkcyAwIGFzIHRoZSBtb2RlIHRvIHJlbW92ZSB0aGUKK3BhdGg7IHRoZSBTSEExIGRvZXMgbm90IG1hdHRlciBhcyBsb25nIGFzIGl0IGlzIHdlbGwgZm9ybWF0dGVkLgorVGhlbiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBsaW5lIGZlZWRzIHN0YWdlIDEgYW5kIHN0YWdlIDIgZW50cmllcworZm9yIHRoYXQgcGF0aC4gIEFmdGVyIHRoZSBhYm92ZSwgd2Ugd291bGQgZW5kIHVwIHdpdGggdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBscy1maWxlcyAtcworMTAwNjQ0IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMQlmcm90egorMTAwNzU1IDhhMTIxOGExMDI0YTIxMmJiM2RiMzBiZWNkODYwMzE1ZjlmM2FjNTIgMglmcm90egorLS0tLS0tLS0tLS0tCisKKworVXNpbmcgImFzc3VtZSB1bmNoYW5nZWQiIGJpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNYW55IG9wZXJhdGlvbnMgaW4gZ2l0IGRlcGVuZCBvbiB5b3VyIGZpbGVzeXN0ZW0gdG8gaGF2ZSBhbgorZWZmaWNpZW50IGBsc3RhdCgyKWAgaW1wbGVtZW50YXRpb24sIHNvIHRoYXQgYHN0X210aW1lYAoraW5mb3JtYXRpb24gZm9yIHdvcmtpbmcgdHJlZSBmaWxlcyBjYW4gYmUgY2hlYXBseSBjaGVja2VkIHRvIHNlZQoraWYgdGhlIGZpbGUgY29udGVudHMgaGF2ZSBjaGFuZ2VkIGZyb20gdGhlIHZlcnNpb24gcmVjb3JkZWQgaW4KK3RoZSBpbmRleCBmaWxlLiAgVW5mb3J0dW5hdGVseSwgc29tZSBmaWxlc3lzdGVtcyBoYXZlCitpbmVmZmljaWVudCBgbHN0YXQoMilgLiAgSWYgeW91ciBmaWxlc3lzdGVtIGlzIG9uZSBvZiB0aGVtLCB5b3UKK2NhbiBzZXQgImFzc3VtZSB1bmNoYW5nZWQiIGJpdCB0byBwYXRocyB5b3UgaGF2ZSBub3QgY2hhbmdlZCB0bworY2F1c2UgZ2l0IG5vdCB0byBkbyB0aGlzIGNoZWNrLiAgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBiaXQgb24gYQorcGF0aCBkb2VzIG5vdCBtZWFuIGdpdCB3aWxsIGNoZWNrIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSB0bworc2VlIGlmIGl0IGhhcyBjaGFuZ2VkIC0tIGl0IG1ha2VzIGdpdCB0byBvbWl0IGFueSBjaGVja2luZyBhbmQKK2Fzc3VtZSBpdCBoYXMgKm5vdCogY2hhbmdlZC4gIFdoZW4geW91IG1ha2UgY2hhbmdlcyB0byB3b3JraW5nCit0cmVlIGZpbGVzLCB5b3UgaGF2ZSB0byBleHBsaWNpdGx5IHRlbGwgZ2l0IGFib3V0IGl0IGJ5IGRyb3BwaW5nCisiYXNzdW1lIHVuY2hhbmdlZCIgYml0LCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHlvdSBtb2RpZnkgdGhlbS4KKworSW4gb3JkZXIgdG8gc2V0ICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQsIHVzZSBgLS1hc3N1bWUtdW5jaGFuZ2VkYAorb3B0aW9uLiAgVG8gdW5zZXQsIHVzZSBgLS1uby1hc3N1bWUtdW5jaGFuZ2VkYC4KKworVGhlIGNvbW1hbmQgbG9va3MgYXQgYGNvcmUuaWdub3Jlc3RhdGAgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4gIFdoZW4KK3RoaXMgaXMgdHJ1ZSwgcGF0aHMgdXBkYXRlZCB3aXRoIGBnaXQtdXBkYXRlLWluZGV4IHBhdGhzLi4uYCBhbmQKK3BhdGhzIHVwZGF0ZWQgd2l0aCBvdGhlciBnaXQgY29tbWFuZHMgdGhhdCB1cGRhdGUgYm90aCBpbmRleCBhbmQKK3dvcmtpbmcgdHJlZSAoZS5nLiBgZ2l0LWFwcGx5IC0taW5kZXhgLCBgZ2l0LWNoZWNrb3V0LWluZGV4IC11YCwKK2FuZCBgZ2l0LXJlYWQtdHJlZSAtdWApIGFyZSBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyAiYXNzdW1lCit1bmNoYW5nZWQiLiAgTm90ZSB0aGF0ICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQgaXMgKm5vdCogc2V0IGlmCitgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2hgIGZpbmRzIHRoZSB3b3JraW5nIHRyZWUgZmlsZSBtYXRjaGVzCit0aGUgaW5kZXggKHVzZSBgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlYWxseS1yZWZyZXNoYCBpZiB5b3Ugd2FudAordG8gbWFyayB0aGVtIGFzICJhc3N1bWUgdW5jaGFuZ2VkIikuCisKKworRXhhbXBsZXMKKy0tLS0tLS0tCitUbyB1cGRhdGUgYW5kIHJlZnJlc2ggb25seSB0aGUgZmlsZXMgYWxyZWFkeSBjaGVja2VkIG91dDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2hlY2tvdXQtaW5kZXggLW4gLWYgLWEgJiYgZ2l0LXVwZGF0ZS1pbmRleCAtLWlnbm9yZS1taXNzaW5nIC0tcmVmcmVzaAorLS0tLS0tLS0tLS0tLS0tLQorCitPbiBhbiBpbmVmZmljaWVudCBmaWxlc3lzdGVtIHdpdGggYGNvcmUuaWdub3Jlc3RhdGAgc2V0OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgdXBkYXRlLWluZGV4IC0tcmVhbGx5LXJlZnJlc2ggICAgICAgICAgICAgIDwxPgorJCBnaXQgdXBkYXRlLWluZGV4IC0tbm8tYXNzdW1lLXVuY2hhbmdlZCBmb28uYyAgIDwyPgorJCBnaXQgZGlmZiAtLW5hbWUtb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwzPgorJCBlZGl0IGZvby5jCiskIGdpdCBkaWZmIC0tbmFtZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPDQ+CitNIGZvby5jCiskIGdpdCB1cGRhdGUtaW5kZXggZm9vLmMgICAgICAgICAgICAgICAgICAgICAgICAgPDU+CiskIGdpdCBkaWZmIC0tbmFtZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPDY+CiskIGVkaXQgZm9vLmMKKyQgZ2l0IGRpZmYgLS1uYW1lLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICA8Nz4KKyQgZ2l0IHVwZGF0ZS1pbmRleCAtLW5vLWFzc3VtZS11bmNoYW5nZWQgZm9vLmMgICA8OD4KKyQgZ2l0IGRpZmYgLS1uYW1lLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICA8OT4KK00gZm9vLmMKKy0tLS0tLS0tLS0tLQorKworPDE+IGZvcmNlcyBsc3RhdCgyKSB0byBzZXQgImFzc3VtZSB1bmNoYW5nZWQiIGJpdHMgZm9yIHBhdGhzIHRoYXQgbWF0Y2ggaW5kZXguCis8Mj4gbWFyayB0aGUgcGF0aCB0byBiZSBlZGl0ZWQuCis8Mz4gdGhpcyBkb2VzIGxzdGF0KDIpIGFuZCBmaW5kcyBpbmRleCBtYXRjaGVzIHRoZSBwYXRoLgorPDQ+IHRoaXMgZG9lcyBsc3RhdCgyKSBhbmQgZmluZHMgaW5kZXggZG9lcyAqbm90KiBtYXRjaCB0aGUgcGF0aC4KKzw1PiByZWdpc3RlcmluZyB0aGUgbmV3IHZlcnNpb24gdG8gaW5kZXggc2V0cyAiYXNzdW1lIHVuY2hhbmdlZCIgYml0LgorPDY+IGFuZCBpdCBpcyBhc3N1bWVkIHVuY2hhbmdlZC4KKzw3PiBldmVuIGFmdGVyIHlvdSBlZGl0IGl0LgorPDg+IHlvdSBjYW4gdGVsbCBhYm91dCB0aGUgY2hhbmdlIGFmdGVyIHRoZSBmYWN0LgorPDk+IG5vdyBpdCBjaGVja3Mgd2l0aCBsc3RhdCgyKSBhbmQgZmluZHMgaXQgaGFzIGJlZW4gY2hhbmdlZC4KKworCitDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tCisKK1RoZSBjb21tYW5kIGhvbm9ycyBgY29yZS5maWxlbW9kZWAgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4gIElmCit5b3VyIHJlcG9zaXRvcnkgaXMgb24gYW4gZmlsZXN5c3RlbSB3aG9zZSBleGVjdXRhYmxlIGJpdHMgYXJlCit1bnJlbGlhYmxlLCB0aGlzIHNob3VsZCBiZSBzZXQgdG8gJ2ZhbHNlJyAoc2VlIGdpdGxpbms6Z2l0LXJlcG8tY29uZmlnWzFdKS4KK1RoaXMgY2F1c2VzIHRoZSBjb21tYW5kIHRvIGlnbm9yZSBkaWZmZXJlbmNlcyBpbiBmaWxlIG1vZGVzIHJlY29yZGVkCitpbiB0aGUgaW5kZXggYW5kIHRoZSBmaWxlIG1vZGUgb24gdGhlIGZpbGVzeXN0ZW0gaWYgdGhleSBkaWZmZXIgb25seSBvbgorZXhlY3V0YWJsZSBiaXQuICAgT24gc3VjaCBhbiB1bmZvcnR1bmF0ZSBmaWxlc3lzdGVtLCB5b3UgbWF5CituZWVkIHRvIHVzZSBgZ2l0LXVwZGF0ZS1pbmRleCAtLWNobW9kPWAuCisKK1RoZSBjb21tYW5kIGxvb2tzIGF0IGBjb3JlLmlnbm9yZXN0YXRgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuICBTZWUKKydVc2luZyAiYXNzdW1lIHVuY2hhbmdlZCIgYml0JyBzZWN0aW9uIGFib3ZlLgorCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtcmVwby1jb25maWdbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXJlZi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtcmVmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYyMDMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXJlZi50eHQKQEAgLTAsMCArMSw4NCBAQAorZ2l0LXVwZGF0ZS1yZWYoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGRhdGUtcmVmIC0gdXBkYXRlIHRoZSBvYmplY3QgbmFtZSBzdG9yZWQgaW4gYSByZWYgc2FmZWx5CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11cGRhdGUtcmVmJyBbLW0gPHJlYXNvbj5dIDxyZWY+IDxuZXd2YWx1ZT4gWzxvbGR2YWx1ZT5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gdHdvIGFyZ3VtZW50cywgc3RvcmVzIHRoZSA8bmV3dmFsdWU+IGluIHRoZSA8cmVmPiwgcG9zc2libHkKK2RlcmVmZXJlbmNpbmcgdGhlIHN5bWJvbGljIHJlZnMuICBFLmcuIGBnaXQtdXBkYXRlLXJlZiBIRUFECis8bmV3dmFsdWU+YCB1cGRhdGVzIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkIHRvIHRoZSBuZXcgb2JqZWN0LgorCitHaXZlbiB0aHJlZSBhcmd1bWVudHMsIHN0b3JlcyB0aGUgPG5ld3ZhbHVlPiBpbiB0aGUgPHJlZj4sCitwb3NzaWJseSBkZXJlZmVyZW5jaW5nIHRoZSBzeW1ib2xpYyByZWZzLCBhZnRlciB2ZXJpZnlpbmcgdGhhdAordGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIDxyZWY+IG1hdGNoZXMgPG9sZHZhbHVlPi4KK0UuZy4gYGdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyIDxuZXd2YWx1ZT4gPG9sZHZhbHVlPmAKK3VwZGF0ZXMgdGhlIG1hc3RlciBicmFuY2ggaGVhZCB0byA8bmV3dmFsdWU+IG9ubHkgaWYgaXRzIGN1cnJlbnQKK3ZhbHVlIGlzIDxvbGR2YWx1ZT4uCisKK0l0IGFsc28gYWxsb3dzIGEgInJlZiIgZmlsZSB0byBiZSBhIHN5bWJvbGljIHBvaW50ZXIgdG8gYW5vdGhlcgorcmVmIGZpbGUgYnkgc3RhcnRpbmcgd2l0aCB0aGUgZm91ci1ieXRlIGhlYWRlciBzZXF1ZW5jZSBvZgorInJlZjoiLgorCitNb3JlIGltcG9ydGFudGx5LCBpdCBhbGxvd3MgdGhlIHVwZGF0ZSBvZiBhIHJlZiBmaWxlIHRvIGZvbGxvdwordGhlc2Ugc3ltYm9saWMgcG9pbnRlcnMsIHdoZXRoZXIgdGhleSBhcmUgc3ltbGlua3Mgb3IgdGhlc2UKKyJyZWd1bGFyIGZpbGUgc3ltYm9saWMgcmVmcyIuICBJdCBmb2xsb3dzICpyZWFsKiBzeW1saW5rcyBvbmx5CitpZiB0aGV5IHN0YXJ0IHdpdGggInJlZnMvIjogb3RoZXJ3aXNlIGl0IHdpbGwganVzdCB0cnkgdG8gcmVhZAordGhlbSBhbmQgdXBkYXRlIHRoZW0gYXMgYSByZWd1bGFyIGZpbGUgKGkuZS4gaXQgd2lsbCBhbGxvdyB0aGUKK2ZpbGVzeXN0ZW0gdG8gZm9sbG93IHRoZW0sIGJ1dCB3aWxsIG92ZXJ3cml0ZSBzdWNoIGEgc3ltbGluayB0bworc29tZXdoZXJlIGVsc2Ugd2l0aCBhIHJlZ3VsYXIgZmlsZW5hbWUpLgorCitJbiBnZW5lcmFsLCB1c2luZworCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAiJGhlYWQiCisKK3Nob3VsZCBiZSBhIF9sb3RfIHNhZmVyIHRoYW4gZG9pbmcKKworCWVjaG8gIiRoZWFkIiA+ICIkR0lUX0RJUi9IRUFEIgorCitib3RoIGZyb20gYSBzeW1saW5rIGZvbGxvd2luZyBzdGFuZHBvaW50ICphbmQqIGFuIGVycm9yIGNoZWNraW5nCitzdGFuZHBvaW50LiAgVGhlICJyZWZzLyIgcnVsZSBmb3Igc3ltbGlua3MgbWVhbnMgdGhhdCBzeW1saW5rcwordGhhdCBwb2ludCB0byAib3V0c2lkZSIgdGhlIHRyZWUgYXJlIHNhZmU6IHRoZXknbGwgYmUgZm9sbG93ZWQKK2ZvciByZWFkaW5nIGJ1dCBub3QgZm9yIHdyaXRpbmcgKHNvIHdlJ2xsIG5ldmVyIHdyaXRlIHRocm91Z2ggYQorcmVmIHN5bWxpbmsgdG8gc29tZSBvdGhlciB0cmVlLCBpZiB5b3UgaGF2ZSBjb3BpZWQgYSB3aG9sZQorYXJjaGl2ZSBieSBjcmVhdGluZyBhIHN5bWxpbmsgdHJlZSkuCisKK0xvZ2dpbmcgVXBkYXRlcworLS0tLS0tLS0tLS0tLS0tCitJZiBjb25maWcgcGFyYW1ldGVyICJjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMiIGlzIHRydWUgb3IgdGhlIGZpbGUKKyIkR0lUX0RJUi9sb2dzLzxyZWY+IiBleGlzdHMgdGhlbiBgZ2l0LXVwZGF0ZS1yZWZgIHdpbGwgYXBwZW5kCithIGxpbmUgdG8gdGhlIGxvZyBmaWxlICIkR0lUX0RJUi9sb2dzLzxyZWY+IiAoZGVyZWZlcmVuY2luZyBhbGwKK3N5bWJvbGljIHJlZnMgYmVmb3JlIGNyZWF0aW5nIHRoZSBsb2cgbmFtZSkgZGVzY3JpYmluZyB0aGUgY2hhbmdlCitpbiByZWYgdmFsdWUuICBMb2cgbGluZXMgYXJlIGZvcm1hdHRlZCBhczoKKworICAgIC4gb2xkc2hhMSBTUCBuZXdzaGExIFNQIGNvbW1pdHRlciBMRgorKworV2hlcmUgIm9sZHNoYTEiIGlzIHRoZSA0MCBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgdmFsdWUgcHJldmlvdXNseQorc3RvcmVkIGluIDxyZWY+LCAibmV3c2hhMSIgaXMgdGhlIDQwIGNoYXJhY3RlciBoZXhhZGVjaW1hbCB2YWx1ZSBvZgorPG5ld3ZhbHVlPiBhbmQgImNvbW1pdHRlciIgaXMgdGhlIGNvbW1pdHRlcidzIG5hbWUsIGVtYWlsIGFkZHJlc3MKK2FuZCBkYXRlIGluIHRoZSBzdGFuZGFyZCBHSVQgY29tbWl0dGVyIGlkZW50IGZvcm1hdC4KKworT3B0aW9uYWxseSB3aXRoIC1tOgorCisgICAgLiBvbGRzaGExIFNQIG5ld3NoYTEgU1AgY29tbWl0dGVyIFRBQiBtZXNzYWdlIExGCisrCitXaGVyZSBhbGwgZmllbGRzIGFyZSBhcyBkZXNjcmliZWQgYWJvdmUgYW5kICJtZXNzYWdlIiBpcyB0aGUKK3ZhbHVlIHN1cHBsaWVkIHRvIHRoZSAtbSBvcHRpb24uCisKK0FuIHVwZGF0ZSB3aWxsIGZhaWwgKHdpdGhvdXQgY2hhbmdpbmcgPHJlZj4pIGlmIHRoZSBjdXJyZW50IHVzZXIgaXMKK3VuYWJsZSB0byBjcmVhdGUgYSBuZXcgbG9nIGZpbGUsIGFwcGVuZCB0byB0aGUgZXhpc3RpbmcgbG9nIGZpbGUKK29yIGRvZXMgbm90IGhhdmUgY29tbWl0dGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtc2VydmVyLWluZm8udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXNlcnZlci1pbmZvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGEwM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLXNlcnZlci1pbmZvLnR4dApAQCAtMCwwICsxLDU4IEBACitnaXQtdXBkYXRlLXNlcnZlci1pbmZvKDEpCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGRhdGUtc2VydmVyLWluZm8gLSBVcGRhdGUgYXV4aWxpYXJ5IGluZm8gZmlsZSB0byBoZWxwIGR1bWIgc2VydmVycworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11cGRhdGUtc2VydmVyLWluZm8nIFstLWZvcmNlXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0EgZHVtYiBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBkbyBvbi10aGUtZmx5IHBhY2sgZ2VuZXJhdGlvbnMgbXVzdAoraGF2ZSBzb21lIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBmaWxlcyBpbiAkR0lUX0RJUi9pbmZvIGFuZAorJEdJVF9PQkpFQ1RfRElSRUNUT1JZL2luZm8gZGlyZWN0b3JpZXMgdG8gaGVscCBjbGllbnRzIGRpc2NvdmVyCit3aGF0IHJlZmVyZW5jZXMgYW5kIHBhY2tzIHRoZSBzZXJ2ZXIgaGFzLiAgVGhpcyBjb21tYW5kCitnZW5lcmF0ZXMgc3VjaCBhdXhpbGlhcnkgZmlsZXMuCisKKworT1BUSU9OUworLS0tLS0tLQorCistZnwtLWZvcmNlOjoKKwlVcGRhdGUgdGhlIGluZm8gZmlsZXMgZnJvbSBzY3JhdGNoLgorCisKK09VVFBVVAorLS0tLS0tCisKK0N1cnJlbnRseSB0aGUgY29tbWFuZCB1cGRhdGVzIHRoZSBmb2xsb3dpbmcgZmlsZXMuICBQbGVhc2Ugc2VlCitsaW5rOnJlcG9zaXRvcnktbGF5b3V0Lmh0bWxbcmVwb3NpdG9yeS1sYXlvdXRdIGZvciBkZXNjcmlwdGlvbgorb2Ygd2hhdCB0aGV5IGFyZSBmb3I6CisKKyogb2JqZWN0cy9pbmZvL3BhY2tzCisKKyogaW5mby9yZWZzCisKKworQlVHUworLS0tLQorV2hlbiB5b3UgcmVtb3ZlIGFuIGV4aXN0aW5nIHJlZiwgdGhlIGNvbW1hbmQgZmFpbHMgdG8gdXBkYXRlCitpbmZvL3JlZnMgZmlsZSB1bmxlc3MgYC0tZm9yY2VgIGZsYWcgaXMgZ2l2ZW4uCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1wYWNrLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzk1ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLXBhY2sudHh0CkBAIC0wLDAgKzEsMzkgQEAKK2dpdC11cGxvYWQtcGFjaygxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGxvYWQtcGFjayAtIFNlbmQgbWlzc2luZyBvYmplY3RzIHBhY2tlZAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11cGxvYWQtcGFjaycgPGRpcmVjdG9yeT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbnZva2VkIGJ5ICdnaXQtY2xvbmUtcGFjaycgYW5kL29yICdnaXQtZmV0Y2gtcGFjaycsIGxlYXJucyB3aGF0CitvYmplY3RzIHRoZSBvdGhlciBzaWRlIGlzIG1pc3NpbmcsIGFuZCBzZW5kcyB0aGVtIGFmdGVyIHBhY2tpbmcuCisKK1RoaXMgY29tbWFuZCBpcyB1c3VhbGx5IG5vdCBpbnZva2VkIGRpcmVjdGx5IGJ5IHRoZSBlbmQgdXNlci4KK1RoZSBVSSBmb3IgdGhlIHByb3RvY29sIGlzIG9uIHRoZSAnZ2l0LWZldGNoLXBhY2snIHNpZGUsIGFuZCB0aGUKK3Byb2dyYW0gcGFpciBpcyBtZWFudCB0byBiZSB1c2VkIHRvIHB1bGwgdXBkYXRlcyBmcm9tIGEgcmVtb3RlCityZXBvc2l0b3J5LiAgRm9yIHB1c2ggb3BlcmF0aW9ucywgc2VlICdnaXQtc2VuZC1wYWNrJy4KKworCitPUFRJT05TCistLS0tLS0tCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gc3luYyBmcm9tLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC10YXIudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLXRhci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwMTlhMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC10YXIudHh0CkBAIC0wLDAgKzEsMzkgQEAKK2dpdC11cGxvYWQtdGFyKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdXBsb2FkLXRhciAtIFNlbmQgdGFyIGFyY2hpdmUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdXBsb2FkLXRhcicgPGRpcmVjdG9yeT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbnZva2VkIGJ5ICdnaXQtdGFyLXRyZWUgLS1yZW1vdGUnIGFuZCBzZW5kcyBhIGdlbmVyYXRlZCB0YXIgYXJjaGl2ZQordG8gdGhlIG90aGVyIGVuZCBvdmVyIHRoZSBnaXQgcHJvdG9jb2wuCisKK1RoaXMgY29tbWFuZCBpcyB1c3VhbGx5IG5vdCBpbnZva2VkIGRpcmVjdGx5IGJ5IHRoZSBlbmQgdXNlci4KK1RoZSBVSSBmb3IgdGhlIHByb3RvY29sIGlzIG9uIHRoZSAnZ2l0LXRhci10cmVlJyBzaWRlLCBhbmQgdGhlCitwcm9ncmFtIHBhaXIgaXMgbWVhbnQgdG8gYmUgdXNlZCB0byBnZXQgYSB0YXIgYWNoaXZlIGZyb20gYQorcmVtb3RlIHJlcG9zaXRvcnkuCisKKworT1BUSU9OUworLS0tLS0tLQorPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIGdldCBhIHRhciBhcmNoaXZlIGZyb20uCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5pb0BrZXJuZWwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC12YXIudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdmFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIxYTBkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdmFyLnR4dApAQCAtMCwwICsxLDY1IEBACitnaXQtdmFyKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC12YXIgLSBQcmludCB0aGUgZ2l0IHVzZXJzIGlkZW50aXR5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXZhcicgWyAtbCB8IDx2YXJpYWJsZT4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1ByaW50cyBhIGdpdCBsb2dpY2FsIHZhcmlhYmxlLgorCitPUFRJT05TCistLS0tLS0tCistbDo6CisJQ2F1c2UgdGhlIGxvZ2ljYWwgdmFyaWFibGVzIHRvIGJlIGxpc3RlZC4gSW4gYWRkaXRpb24sIGFsbCB0aGUKKwl2YXJpYWJsZXMgb2YgdGhlIGdpdCBjb25maWd1cmF0aW9uIGZpbGUgLmdpdC9jb25maWcgYXJlIGxpc3RlZAorCWFzIHdlbGwuIChIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgbGlzdGluZyBmdW5jdGlvbmFsaXR5CisJaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgZ2l0LXJlcG8tY29uZmlnIC1sYC4pCisKK0VYQU1QTEUKKy0tLS0tLS0tCisJJCBnaXQtdmFyIEdJVF9BVVRIT1JfSURFTlQKKwlFcmljIFcuIEJpZWRlcm1hbiA8ZWJpZWRlcm1AbG54aS5jb20+IDExMjEyMjMyNzggLTA2MDAKKworCitWQVJJQUJMRVMKKy0tLS0tLS0tLS0KK0dJVF9BVVRIT1JfSURFTlQ6OgorICAgIFRoZSBhdXRob3Igb2YgYSBwaWVjZSBvZiBjb2RlLgorCitHSVRfQ09NTUlUVEVSX0lERU5UOjoKKyAgICBUaGUgcGVyc29uIHdobyBwdXQgYSBwaWVjZSBvZiBjb2RlIGludG8gZ2l0LgorCitEaWFnbm9zdGljcworLS0tLS0tLS0tLS0KK1lvdSBkb24ndCBleGlzdC4gR28gYXdheSE6OgorICAgIFRoZSBwYXNzd2QoNSkgZ2Vjb3MgZmllbGQgY291bGRuJ3QgYmUgcmVhZAorWW91ciBwYXJlbnRzIG11c3QgaGF2ZSBoYXRlZCB5b3UhOjoKKyAgICBUaGUgcGFzc3dvcmQoNSkgZ2Vjb3MgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorWW91ciBzeXNhZG1pbiBtdXN0IGhhdGUgeW91ITo6CisgICAgVGhlIHBhc3N3b3JkKDUpIG5hbWUgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWNvbW1pdC10cmVlWzFdCitnaXRsaW5rOmdpdC10YWdbMV0KK2dpdGxpbms6Z2l0LXJlcG8tY29uZmlnWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEVyaWMgQmllZGVybWFuIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjEzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC12ZXJpZnktcGFjay50eHQKQEAgLTAsMCArMSw1NCBAQAorZ2l0LXZlcmlmeS1wYWNrKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXZlcmlmeS1wYWNrIC0gVmFsaWRhdGUgcGFja2VkIGdpdCBhcmNoaXZlIGZpbGVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXZlcmlmeS1wYWNrJyBbLXZdIFstLV0gPHBhY2s+LmlkeCAuLi4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGdpdmVuIGlkeCBmaWxlIGZvciBwYWNrZWQgZ2l0IGFyY2hpdmUgY3JlYXRlZCB3aXRoCitnaXQtcGFjay1vYmplY3RzIGNvbW1hbmQgYW5kIHZlcmlmaWVzIGlkeCBmaWxlIGFuZCB0aGUKK2NvcnJlc3BvbmRpbmcgcGFjayBmaWxlLgorCitPUFRJT05TCistLS0tLS0tCis8cGFjaz4uaWR4IC4uLjo6CisJVGhlIGlkeCBmaWxlcyB0byB2ZXJpZnkuCisKKy12OjoKKwlBZnRlciB2ZXJpZnlpbmcgdGhlIHBhY2ssIHNob3cgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5lZAorCWluIHRoZSBwYWNrLgorXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCitPVVRQVVQgRk9STUFUCistLS0tLS0tLS0tLS0tCitXaGVuIHNwZWNpZnlpbmcgdGhlIC12IG9wdGlvbiB0aGUgZm9ybWF0IHVzZWQgaXM6CisKKwlTSEExIHR5cGUgc2l6ZSBvZmZzZXQtaW4tcGFja2ZpbGUKKworZm9yIG9iamVjdHMgdGhhdCBhcmUgbm90IGRlbHRpZmllZCBpbiB0aGUgcGFjaywgYW5kCisKKwlTSEExIHR5cGUgc2l6ZSBvZmZzZXQtaW4tcGFja2ZpbGUgZGVwdGggYmFzZS1TSEExCisKK2ZvciBvYmplY3RzIHRoYXQgYXJlIGRlbHRpZmllZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXRhZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC12ZXJpZnktdGFnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjliZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXRhZy50eHQKQEAgLTAsMCArMSwzMiBAQAorZ2l0LXZlcmlmeS10YWcoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC12ZXJpZnktdGFnIC0gQ2hlY2sgdGhlIEdQRyBzaWduYXR1cmUgb2YgdGFnCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC12ZXJpZnktdGFnJyA8dGFnPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1ZhbGlkYXRlcyB0aGUgZ3BnIHNpZ25hdHVyZSBjcmVhdGVkIGJ5IGdpdC10YWcuCisKK09QVElPTlMKKy0tLS0tLS0KKzx0YWc+OjoKKwlTSEExIGlkZW50aWZpZXIgb2YgYSBnaXQgdGFnIG9iamVjdC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSmFuIEhhcmtlcyA8amFoYXJrZXNAY3MuY211LmVkdT4gYW5kIEVyaWMgVy4gQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjIxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC13aGF0Y2hhbmdlZC50eHQKQEAgLTAsMCArMSw4MSBAQAorZ2l0LXdoYXRjaGFuZ2VkKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXdoYXRjaGFuZ2VkIC0gU2hvdyBsb2dzIHdpdGggZGlmZmVyZW5jZSBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXdoYXRjaGFuZ2VkJyA8b3B0aW9uPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Nob3dzIGNvbW1pdCBsb2dzIGFuZCBkaWZmIG91dHB1dCBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzLiAgVGhlCitjb21tYW5kIGludGVybmFsbHkgaW52b2tlcyAnZ2l0LXJldi1saXN0JyBwaXBlZCB0bworJ2dpdC1kaWZmLXRyZWUnLCBhbmQgdGFrZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGJvdGggb2YKK3RoZXNlIGNvbW1hbmRzLgorCitUaGlzIG1hbnVhbCBwYWdlIGRlc2NyaWJlcyBvbmx5IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcHRpb25zLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1wOjoKKwlTaG93IHRleHR1YWwgZGlmZnMsIGluc3RlYWQgb2YgdGhlIGdpdCBpbnRlcm5hbCBkaWZmCisJb3V0cHV0IGZvcm1hdCB0aGF0IGlzIHVzZWZ1bCBvbmx5IHRvIHRlbGwgdGhlIGNoYW5nZWQKKwlwYXRocyBhbmQgdGhlaXIgbmF0dXJlIG9mIGNoYW5nZXMuCisKKy0tbWF4LWNvdW50PTxuPjo6CisJTGltaXQgb3V0cHV0IHRvIDxuPiBjb21taXRzLgorCis8c2luY2U+Li48dW50aWw+OjoKKwlMaW1pdCBvdXRwdXQgdG8gYmV0d2VlbiB0aGUgdHdvIG5hbWVkIGNvbW1pdHMgKGJvdHRvbQorCWV4Y2x1c2l2ZSwgdG9wIGluY2x1c2l2ZSkuCisKKy1yOjoKKwlTaG93IGdpdCBpbnRlcm5hbCBkaWZmIG91dHB1dCwgYnV0IGZvciB0aGUgd2hvbGUgdHJlZSwKKwlub3QganVzdCB0aGUgdG9wIGxldmVsLgorCistLXByZXR0eT08Zm9ybWF0Pjo6CisJQ29udHJvbHMgdGhlIG91dHB1dCBmb3JtYXQgZm9yIHRoZSBjb21taXQgbG9ncy4KKwk8Zm9ybWF0PiBjYW4gYmUgb25lIG9mICdyYXcnLCAnbWVkaXVtJywgJ3Nob3J0JywgJ2Z1bGwnLAorCWFuZCAnb25lbGluZScuCisKKy1tOjoKKwlCeSBkZWZhdWx0LCBkaWZmZXJlbmNlcyBmb3IgbWVyZ2UgY29tbWl0cyBhcmUgbm90IHNob3duLgorCVdpdGggdGhpcyBmbGFnLCBzaG93IGRpZmZlcmVuY2VzIHRvIHRoYXQgY29tbWl0IGZyb20gYWxsCisJb2YgaXRzIHBhcmVudHMuCisrCitIb3dldmVyLCBpdCBpcyBub3QgdmVyeSB1c2VmdWwgaW4gZ2VuZXJhbCwgYWx0aG91Z2ggaXQKKyppcyogdXNlZnVsIG9uIGEgZmlsZS1ieS1maWxlIGJhc2lzLgorCitFeGFtcGxlcworLS0tLS0tLS0KK2dpdC13aGF0Y2hhbmdlZCAtcCB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFzIHBhdGNoZXMgdGhlIGNvbW1pdHMgc2luY2UgdmVyc2lvbiAndjIuNi4xMicgdGhhdCBjaGFuZ2VkCisJYW55IGZpbGUgaW4gdGhlIGluY2x1ZGUvc2NzaSBvciBkcml2ZXJzL3Njc2kgc3ViZGlyZWN0b3JpZXMKKworZ2l0LXdoYXRjaGFuZ2VkIC0tc2luY2U9IjIgd2Vla3MgYWdvIiBcLS0gZ2l0azo6CisKKwlTaG93IHRoZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGFzdCB0d28gd2Vla3MgdG8gdGhlIGZpbGUgJ2dpdGsnLgorCVRoZSAiLS0iIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgKmJyYW5jaCogbmFtZWQKKwknZ2l0aycKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd3JpdGUtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC13cml0ZS10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UxMmNiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtd3JpdGUtdHJlZS50eHQKQEAgLTAsMCArMSw0NCBAQAorZ2l0LXdyaXRlLXRyZWUoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC13cml0ZS10cmVlIC0gQ3JlYXRlcyBhIHRyZWUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtd3JpdGUtdHJlZScgWy0tbWlzc2luZy1va10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDcmVhdGVzIGEgdHJlZSBvYmplY3QgdXNpbmcgdGhlIGN1cnJlbnQgaW5kZXguCisKK1RoZSBpbmRleCBtdXN0IGJlIGluIGEgZnVsbHkgbWVyZ2VkIHN0YXRlLgorCitDb25jZXB0dWFsbHksIGBnaXQtd3JpdGUtdHJlZWAgc3luYygpcyB0aGUgY3VycmVudCBpbmRleCBjb250ZW50cworaW50byBhIHNldCBvZiB0cmVlIGZpbGVzLgorSW4gb3JkZXIgdG8gaGF2ZSB0aGF0IG1hdGNoIHdoYXQgaXMgYWN0dWFsbHkgaW4geW91ciBkaXJlY3RvcnkgcmlnaHQKK25vdywgeW91IG5lZWQgdG8gaGF2ZSBkb25lIGEgYGdpdC11cGRhdGUtaW5kZXhgIHBoYXNlIGJlZm9yZSB5b3UgZGlkIHRoZQorYGdpdC13cml0ZS10cmVlYC4KKworCitPUFRJT05TCistLS0tLS0tCistLW1pc3Npbmctb2s6OgorCU5vcm1hbGx5IGBnaXQtd3JpdGUtdHJlZWAgZW5zdXJlcyB0aGF0IHRoZSBvYmplY3RzIHJlZmVyZW5jZWQgYnkgdGhlCisJZGlyZWN0b3J5IGV4aXN0IGluIHRoZSBvYmplY3QgZGF0YWJhc2UuICBUaGlzIG9wdGlvbiBkaXNhYmxlcyB0aGlzCisJY2hlY2suCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0NzJiNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dApAQCAtMCwwICsxLDY0MiBAQAorZ2l0KDcpCis9PT09PT0KKworTkFNRQorLS0tLQorZ2l0IC0gdGhlIHN0dXBpZCBjb250ZW50IHRyYWNrZXIKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQnIFstLXZlcnNpb25dIFstLWV4ZWMtcGF0aFs9R0lUX0VYRUNfUEFUSF1dIFstLWhlbHBdIENPTU1BTkQgW0FSR1NdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l0IGlzIGEgZmFzdCwgc2NhbGFibGUsIGRpc3RyaWJ1dGVkIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtIHdpdGggYW4KK3VudXN1YWxseSByaWNoIGNvbW1hbmQgc2V0IHRoYXQgcHJvdmlkZXMgYm90aCBoaWdoLWxldmVsIG9wZXJhdGlvbnMKK2FuZCBmdWxsIGFjY2VzcyB0byBpbnRlcm5hbHMuCisKK1NlZSB0aGlzIGxpbms6dHV0b3JpYWwuaHRtbFt0dXRvcmlhbF0gdG8gZ2V0IHN0YXJ0ZWQsIHRoZW4gc2VlCitsaW5rOmV2ZXJ5ZGF5Lmh0bWxbRXZlcnlkYXkgR2l0XSBmb3IgYSB1c2VmdWwgbWluaW11bSBzZXQgb2YgY29tbWFuZHMsIGFuZAorIm1hbiBnaXQtY29tbWFuZG5hbWUiIGZvciBkb2N1bWVudGF0aW9uIG9mIGVhY2ggY29tbWFuZC4gIENWUyB1c2VycyBtYXkKK2Fsc28gd2FudCB0byByZWFkIGxpbms6Y3ZzLW1pZ3JhdGlvbi5odG1sW0NWUyBtaWdyYXRpb25dLgorCitUaGUgQ09NTUFORCBpcyBlaXRoZXIgYSBuYW1lIG9mIGEgR2l0IGNvbW1hbmQgKHNlZSBiZWxvdykgb3IgYW4gYWxpYXMKK2FzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoc2VlIGdpdGxpbms6Z2l0LXJlcG8tY29uZmlnWzFdKS4KKworT1BUSU9OUworLS0tLS0tLQorLS12ZXJzaW9uOjoKKwlQcmludHMgdGhlIGdpdCBzdWl0ZSB2ZXJzaW9uIHRoYXQgdGhlICdnaXQnIHByb2dyYW0gY2FtZSBmcm9tLgorCistLWhlbHA6OgorCVByaW50cyB0aGUgc3lub3BzaXMgYW5kIGEgbGlzdCBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkCisJY29tbWFuZHMuICBJZiBhIGdpdCBjb21tYW5kIGlzIG5hbWVkIHRoaXMgb3B0aW9uIHdpbGwgYnJpbmcgdXAKKwl0aGUgbWFuLXBhZ2UgZm9yIHRoYXQgY29tbWFuZC4gSWYgdGhlIG9wdGlvbiAnLS1hbGwnIG9yICctYScgaXMKKwlnaXZlbiB0aGVuIGFsbCBhdmFpbGFibGUgY29tbWFuZHMgYXJlIHByaW50ZWQuCisKKy0tZXhlYy1wYXRoOjoKKwlQYXRoIHRvIHdoZXJldmVyIHlvdXIgY29yZSBnaXQgcHJvZ3JhbXMgYXJlIGluc3RhbGxlZC4KKwlUaGlzIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgYnkgc2V0dGluZyB0aGUgR0lUX0VYRUNfUEFUSAorCWVudmlyb25tZW50IHZhcmlhYmxlLiBJZiBubyBwYXRoIGlzIGdpdmVuICdnaXQnIHdpbGwgcHJpbnQKKwl0aGUgY3VycmVudCBzZXR0aW5nIGFuZCB0aGVuIGV4aXQuCisKKworRlVSVEhFUiBET0NVTUVOVEFUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIHRoZSByZWZlcmVuY2VzIGFib3ZlIHRvIGdldCBzdGFydGVkIHVzaW5nIGdpdC4gIFRoZSBmb2xsb3dpbmcgaXMKK3Byb2JhYmx5IG1vcmUgZGV0YWlsIHRoYW4gbmVjZXNzYXJ5IGZvciBhIGZpcnN0LXRpbWUgdXNlci4KKworVGhlIDw8RGlzY3Vzc2lvbixEaXNjdXNzaW9uPj4gc2VjdGlvbiBiZWxvdyBhbmQgdGhlCitsaW5rOmNvcmUtdHV0b3JpYWwuaHRtbFtDb3JlIHR1dG9yaWFsXSBib3RoIHByb3ZpZGUgaW50cm9kdWN0aW9ucyB0byB0aGUKK3VuZGVybHlpbmcgZ2l0IGFyY2hpdGVjdHVyZS4KKworU2VlIGFsc28gdGhlIGxpbms6aG93dG8taW5kZXguaHRtbFtob3d0b10gZG9jdW1lbnRzIGZvciBzb21lIHVzZWZ1bAorZXhhbXBsZXMuCisKK0dJVCBDT01NQU5EUworLS0tLS0tLS0tLS0tCisKK1dlIGRpdmlkZSBnaXQgaW50byBoaWdoIGxldmVsICgicG9yY2VsYWluIikgY29tbWFuZHMgYW5kIGxvdyBsZXZlbAorKCJwbHVtYmluZyIpIGNvbW1hbmRzLgorCitMb3ctbGV2ZWwgY29tbWFuZHMgKHBsdW1iaW5nKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWx0aG91Z2ggZ2l0IGluY2x1ZGVzIGl0cworb3duIHBvcmNlbGFpbiBsYXllciwgaXRzIGxvdy1sZXZlbCBjb21tYW5kcyBhcmUgc3VmZmljaWVudCB0byBzdXBwb3J0CitkZXZlbG9wbWVudCBvZiBhbHRlcm5hdGl2ZSBwb3JjZWxhaW5zLiAgRGV2ZWxvcGVycyBvZiBzdWNoIHBvcmNlbGFpbnMKK21pZ2h0IHN0YXJ0IGJ5IHJlYWRpbmcgYWJvdXQgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdIGFuZAorZ2l0bGluazpnaXQtcmVhZC10cmVlWzFdLgorCitXZSBkaXZpZGUgdGhlIGxvdy1sZXZlbCBjb21tYW5kcyBpbnRvIGNvbW1hbmRzIHRoYXQgbWFuaXB1bGF0ZSBvYmplY3RzIChpbgordGhlIHJlcG9zaXRvcnksIGluZGV4LCBhbmQgd29ya2luZyB0cmVlKSwgY29tbWFuZHMgdGhhdCBpbnRlcnJvZ2F0ZSBhbmQKK2NvbXBhcmUgb2JqZWN0cywgYW5kIGNvbW1hbmRzIHRoYXQgbW92ZSBvYmplY3RzIGFuZCByZWZlcmVuY2VzIGJldHdlZW4KK3JlcG9zaXRvcmllcy4KKworTWFuaXB1bGF0aW9uIGNvbW1hbmRzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2dpdGxpbms6Z2l0LWFwcGx5WzFdOjoKKwlSZWFkcyBhICJkaWZmIC11cDEiIG9yIGdpdCBnZW5lcmF0ZWQgcGF0Y2ggZmlsZSBhbmQKKwlhcHBsaWVzIGl0IHRvIHRoZSB3b3JraW5nIHRyZWUuCisKK2dpdGxpbms6Z2l0LWNoZWNrb3V0LWluZGV4WzFdOjoKKwlDb3B5IGZpbGVzIGZyb20gdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIHRyZWUuCisKK2dpdGxpbms6Z2l0LWNvbW1pdC10cmVlWzFdOjoKKwlDcmVhdGVzIGEgbmV3IGNvbW1pdCBvYmplY3QuCisKK2dpdGxpbms6Z2l0LWhhc2gtb2JqZWN0WzFdOjoKKwlDb21wdXRlcyB0aGUgb2JqZWN0IElEIGZyb20gYSBmaWxlLgorCitnaXRsaW5rOmdpdC1pbmRleC1wYWNrWzFdOjoKKwlCdWlsZCBwYWNrIGlkeCBmaWxlIGZvciBhbiBleGlzdGluZyBwYWNrZWQgYXJjaGl2ZS4KKworZ2l0bGluazpnaXQtaW5pdC1kYlsxXTo6CisJQ3JlYXRlcyBhbiBlbXB0eSBnaXQgb2JqZWN0IGRhdGFiYXNlLCBvciByZWluaXRpYWxpemUgYW4KKwlleGlzdGluZyBvbmUuCisKK2dpdGxpbms6Z2l0LW1lcmdlLWluZGV4WzFdOjoKKwlSdW5zIGEgbWVyZ2UgZm9yIGZpbGVzIG5lZWRpbmcgbWVyZ2luZy4KKworZ2l0bGluazpnaXQtbWt0YWdbMV06OgorCUNyZWF0ZXMgYSB0YWcgb2JqZWN0LgorCitnaXRsaW5rOmdpdC1ta3RyZWVbMV06OgorCUJ1aWxkIGEgdHJlZS1vYmplY3QgZnJvbSBscy10cmVlIGZvcm1hdHRlZCB0ZXh0LgorCitnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV06OgorCUNyZWF0ZXMgYSBwYWNrZWQgYXJjaGl2ZSBvZiBvYmplY3RzLgorCitnaXRsaW5rOmdpdC1wcnVuZS1wYWNrZWRbMV06OgorCVJlbW92ZSBleHRyYSBvYmplY3RzIHRoYXQgYXJlIGFscmVhZHkgaW4gcGFjayBmaWxlcy4KKworZ2l0bGluazpnaXQtcmVhZC10cmVlWzFdOjoKKwlSZWFkcyB0cmVlIGluZm9ybWF0aW9uIGludG8gdGhlIGluZGV4LgorCitnaXRsaW5rOmdpdC1yZXBvLWNvbmZpZ1sxXTo6CisJR2V0IGFuZCBzZXQgb3B0aW9ucyBpbiAuZ2l0L2NvbmZpZy4KKworZ2l0bGluazpnaXQtdW5wYWNrLW9iamVjdHNbMV06OgorCVVucGFja3Mgb2JqZWN0cyBvdXQgb2YgYSBwYWNrZWQgYXJjaGl2ZS4KKworZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdOjoKKwlSZWdpc3RlcnMgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSB0byB0aGUgaW5kZXguCisKK2dpdGxpbms6Z2l0LXdyaXRlLXRyZWVbMV06OgorCUNyZWF0ZXMgYSB0cmVlIGZyb20gdGhlIGluZGV4LgorCisKK0ludGVycm9nYXRpb24gY29tbWFuZHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworZ2l0bGluazpnaXQtY2F0LWZpbGVbMV06OgorCVByb3ZpZGUgY29udGVudCBvciB0eXBlL3NpemUgaW5mb3JtYXRpb24gZm9yIHJlcG9zaXRvcnkgb2JqZWN0cy4KKworZ2l0bGluazpnaXQtZGVzY3JpYmVbMV06OgorCVNob3cgdGhlIG1vc3QgcmVjZW50IHRhZyB0aGF0IGlzIHJlYWNoYWJsZSBmcm9tIGEgY29tbWl0LgorCitnaXRsaW5rOmdpdC1kaWZmLWluZGV4WzFdOjoKKwlDb21wYXJlcyBjb250ZW50IGFuZCBtb2RlIG9mIGJsb2JzIGJldHdlZW4gdGhlIGluZGV4IGFuZCByZXBvc2l0b3J5LgorCitnaXRsaW5rOmdpdC1kaWZmLWZpbGVzWzFdOjoKKwlDb21wYXJlcyBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXguCisKK2dpdGxpbms6Z2l0LWRpZmYtc3RhZ2VzWzFdOjoKKwlDb21wYXJlcyB0d28gIm1lcmdlIHN0YWdlcyIgaW4gdGhlIGluZGV4LgorCitnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV06OgorCUNvbXBhcmVzIHRoZSBjb250ZW50IGFuZCBtb2RlIG9mIGJsb2JzIGZvdW5kIHZpYSB0d28gdHJlZSBvYmplY3RzLgorCitnaXRsaW5rOmdpdC1mc2NrLW9iamVjdHNbMV06OgorCVZlcmlmaWVzIHRoZSBjb25uZWN0aXZpdHkgYW5kIHZhbGlkaXR5IG9mIHRoZSBvYmplY3RzIGluIHRoZSBkYXRhYmFzZS4KKworZ2l0bGluazpnaXQtbHMtZmlsZXNbMV06OgorCUluZm9ybWF0aW9uIGFib3V0IGZpbGVzIGluIHRoZSBpbmRleCBhbmQgdGhlIHdvcmtpbmcgdHJlZS4KKworZ2l0bGluazpnaXQtbHMtdHJlZVsxXTo6CisJRGlzcGxheXMgYSB0cmVlIG9iamVjdCBpbiBodW1hbiByZWFkYWJsZSBmb3JtLgorCitnaXRsaW5rOmdpdC1tZXJnZS1iYXNlWzFdOjoKKwlGaW5kcyBhcyBnb29kIGNvbW1vbiBhbmNlc3RvcnMgYXMgcG9zc2libGUgZm9yIGEgbWVyZ2UuCisKK2dpdGxpbms6Z2l0LW5hbWUtcmV2WzFdOjoKKwlGaW5kIHN5bWJvbGljIG5hbWVzIGZvciBnaXZlbiByZXZzLgorCitnaXRsaW5rOmdpdC1wYWNrLXJlZHVuZGFudFsxXTo6CisJRmluZCByZWR1bmRhbnQgcGFjayBmaWxlcy4KKworZ2l0bGluazpnaXQtcmV2LWxpc3RbMV06OgorCUxpc3RzIGNvbW1pdCBvYmplY3RzIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworZ2l0bGluazpnaXQtc2hvdy1pbmRleFsxXTo6CisJRGlzcGxheXMgY29udGVudHMgb2YgYSBwYWNrIGlkeCBmaWxlLgorCitnaXRsaW5rOmdpdC10YXItdHJlZVsxXTo6CisJQ3JlYXRlcyBhIHRhciBhcmNoaXZlIG9mIHRoZSBmaWxlcyBpbiB0aGUgbmFtZWQgdHJlZSBvYmplY3QuCisKK2dpdGxpbms6Z2l0LXVucGFjay1maWxlWzFdOjoKKwlDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgd2l0aCBhIGJsb2IncyBjb250ZW50cy4KKworZ2l0bGluazpnaXQtdmFyWzFdOjoKKwlEaXNwbGF5cyBhIGdpdCBsb2dpY2FsIHZhcmlhYmxlLgorCitnaXRsaW5rOmdpdC12ZXJpZnktcGFja1sxXTo6CisJVmFsaWRhdGVzIHBhY2tlZCBnaXQgYXJjaGl2ZSBmaWxlcy4KKworSW4gZ2VuZXJhbCwgdGhlIGludGVycm9nYXRlIGNvbW1hbmRzIGRvIG5vdCB0b3VjaCB0aGUgZmlsZXMgaW4KK3RoZSB3b3JraW5nIHRyZWUuCisKKworU3luY2hpbmcgcmVwb3NpdG9yaWVzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworZ2l0bGluazpnaXQtY2xvbmUtcGFja1sxXTo6CisJQ2xvbmVzIGEgcmVwb3NpdG9yeSBpbnRvIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkgKGVuZ2luZQorCWZvciBzc2ggYW5kIGxvY2FsIHRyYW5zcG9ydCkuCisKK2dpdGxpbms6Z2l0LWZldGNoLXBhY2tbMV06OgorCVVwZGF0ZXMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IChlbmdpbmUgZm9yIHNzaCBhbmQKKwlsb2NhbCB0cmFuc3BvcnQpLgorCitnaXRsaW5rOmdpdC1odHRwLWZldGNoWzFdOjoKKwlEb3dubG9hZHMgYSByZW1vdGUgZ2l0IHJlcG9zaXRvcnkgdmlhIEhUVFAgYnkgd2Fsa2luZworCWNvbW1pdCBjaGFpbi4KKworZ2l0bGluazpnaXQtbG9jYWwtZmV0Y2hbMV06OgorCUR1cGxpY2F0ZXMgYW5vdGhlciBnaXQgcmVwb3NpdG9yeSBvbiBhIGxvY2FsIHN5c3RlbSBieQorCXdhbGtpbmcgY29tbWl0IGNoYWluLgorCitnaXRsaW5rOmdpdC1wZWVrLXJlbW90ZVsxXTo6CisJTGlzdHMgcmVmZXJlbmNlcyBvbiBhIHJlbW90ZSByZXBvc2l0b3J5IHVzaW5nCisJdXBsb2FkLXBhY2sgcHJvdG9jb2wgKGVuZ2luZSBmb3Igc3NoIGFuZCBsb2NhbAorCXRyYW5zcG9ydCkuCisKK2dpdGxpbms6Z2l0LXJlY2VpdmUtcGFja1sxXTo6CisJSW52b2tlZCBieSAnZ2l0LXNlbmQtcGFjaycgdG8gcmVjZWl2ZSB3aGF0IGlzIHB1c2hlZCB0byBpdC4KKworZ2l0bGluazpnaXQtc2VuZC1wYWNrWzFdOjoKKwlQdXNoZXMgdG8gYSByZW1vdGUgcmVwb3NpdG9yeSwgaW50ZWxsaWdlbnRseS4KKworZ2l0bGluazpnaXQtaHR0cC1wdXNoWzFdOjoKKwlQdXNoIG1pc3Npbmcgb2JqZWN0cyB1c2luZyBIVFRQL0RBVi4KKworZ2l0bGluazpnaXQtc2hlbGxbMV06OgorCVJlc3RyaWN0ZWQgc2hlbGwgZm9yIEdJVC1vbmx5IFNTSCBhY2Nlc3MuCisKK2dpdGxpbms6Z2l0LXNzaC1mZXRjaFsxXTo6CisJUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24gYnkKKwl3YWxraW5nIGNvbW1pdCBjaGFpbi4KKworZ2l0bGluazpnaXQtc3NoLXVwbG9hZFsxXTo6CisJSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtZmV0Y2guCisKK2dpdGxpbms6Z2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb1sxXTo6CisJVXBkYXRlcyBhdXhpbGlhcnkgaW5mb3JtYXRpb24gb24gYSBkdW1iIHNlcnZlciB0byBoZWxwCisJY2xpZW50cyBkaXNjb3ZlciByZWZlcmVuY2VzIGFuZCBwYWNrcyBvbiBpdC4KKworZ2l0bGluazpnaXQtdXBsb2FkLXBhY2tbMV06OgorCUludm9rZWQgYnkgJ2dpdC1jbG9uZS1wYWNrJyBhbmQgJ2dpdC1mZXRjaC1wYWNrJyB0byBwdXNoCisJd2hhdCBhcmUgYXNrZWQgZm9yLgorCitnaXRsaW5rOmdpdC11cGxvYWQtdGFyWzFdOjoKKwlJbnZva2VkIGJ5ICdnaXQtdGFyLXRyZWUgLS1yZW1vdGUnIHRvIHJldHVybiB0aGUgdGFyCisJYXJjaGl2ZSB0aGUgb3RoZXIgZW5kIGFza2VkIGZvci4KKworCitIaWdoLWxldmVsIGNvbW1hbmRzIChwb3JjZWxhaW4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHNlcGFyYXRlIHRoZSBwb3JjZWxhaW4gY29tbWFuZHMgaW50byB0aGUgbWFpbiBjb21tYW5kcyBhbmQgc29tZQorYW5jaWxsYXJ5IHVzZXIgdXRpbGl0aWVzLgorCitNYWluIHBvcmNlbGFpbiBjb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworZ2l0bGluazpnaXQtYWRkWzFdOjoKKwlBZGQgcGF0aHMgdG8gdGhlIGluZGV4LgorCitnaXRsaW5rOmdpdC1hbVsxXTo6CisJQXBwbHkgcGF0Y2hlcyBmcm9tIGEgbWFpbGJveCwgYnV0IGNvb2xlci4KKworZ2l0bGluazpnaXQtYXBwbHltYm94WzFdOjoKKwlBcHBseSBwYXRjaGVzIGZyb20gYSBtYWlsYm94LCBvcmlnaW5hbCB2ZXJzaW9uIGJ5IExpbnVzLgorCitnaXRsaW5rOmdpdC1iaXNlY3RbMV06OgorCUZpbmQgdGhlIGNoYW5nZSB0aGF0IGludHJvZHVjZWQgYSBidWcgYnkgYmluYXJ5IHNlYXJjaC4KKworZ2l0bGluazpnaXQtYnJhbmNoWzFdOjoKKwlDcmVhdGUgYW5kIFNob3cgYnJhbmNoZXMuCisKK2dpdGxpbms6Z2l0LWNoZWNrb3V0WzFdOjoKKwlDaGVja291dCBhbmQgc3dpdGNoIHRvIGEgYnJhbmNoLgorCitnaXRsaW5rOmdpdC1jaGVycnktcGlja1sxXTo6CisJQ2hlcnJ5LXBpY2sgdGhlIGVmZmVjdCBvZiBhbiBleGlzdGluZyBjb21taXQuCisKK2dpdGxpbms6Z2l0LWNsZWFuWzFdOjoKKwlSZW1vdmUgdW50cmFja2VkIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgdHJlZS4KKworZ2l0bGluazpnaXQtY2xvbmVbMV06OgorCUNsb25lcyBhIHJlcG9zaXRvcnkgaW50byBhIG5ldyBkaXJlY3RvcnkuCisKK2dpdGxpbms6Z2l0LWNvbW1pdFsxXTo6CisJUmVjb3JkIGNoYW5nZXMgdG8gdGhlIHJlcG9zaXRvcnkuCisKK2dpdGxpbms6Z2l0LWRpZmZbMV06OgorCVNob3cgY2hhbmdlcyBiZXR3ZWVuIGNvbW1pdHMsIGNvbW1pdCBhbmQgd29ya2luZyB0cmVlLCBldGMuCisKK2dpdGxpbms6Z2l0LWZldGNoWzFdOjoKKwlEb3dubG9hZCBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgdmlhIHZhcmlvdXMgcHJvdG9jb2xzLgorCitnaXRsaW5rOmdpdC1mb3JtYXQtcGF0Y2hbMV06OgorCVByZXBhcmUgcGF0Y2hlcyBmb3IgZS1tYWlsIHN1Ym1pc3Npb24uCisKK2dpdGxpbms6Z2l0LWdyZXBbMV06OgorCVByaW50IGxpbmVzIG1hdGNoaW5nIGEgcGF0dGVybi4KKworZ2l0bGluazpnaXQtbG9nWzFdOjoKKwlTaG93cyBjb21taXQgbG9ncy4KKworZ2l0bGluazpnaXQtbHMtcmVtb3RlWzFdOjoKKwlTaG93cyByZWZlcmVuY2VzIGluIGEgcmVtb3RlIG9yIGxvY2FsIHJlcG9zaXRvcnkuCisKK2dpdGxpbms6Z2l0LW1lcmdlWzFdOjoKKwlHcmFuZCB1bmlmaWVkIG1lcmdlIGRyaXZlci4KKworZ2l0bGluazpnaXQtbXZbMV06OgorCU1vdmUgb3IgcmVuYW1lIGEgZmlsZSwgYSBkaXJlY3RvcnksIG9yIGEgc3ltbGluay4KKworZ2l0bGluazpnaXQtcHVsbFsxXTo6CisJRmV0Y2ggZnJvbSBhbmQgbWVyZ2Ugd2l0aCBhIHJlbW90ZSByZXBvc2l0b3J5LgorCitnaXRsaW5rOmdpdC1wdXNoWzFdOjoKKwlVcGRhdGUgcmVtb3RlIHJlZnMgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIG9iamVjdHMuCisKK2dpdGxpbms6Z2l0LXJlYmFzZVsxXTo6CisJUmViYXNlIGxvY2FsIGNvbW1pdHMgdG8gdGhlIHVwZGF0ZWQgdXBzdHJlYW0gaGVhZC4KKworZ2l0bGluazpnaXQtcmVwYWNrWzFdOjoKKwlQYWNrIHVucGFja2VkIG9iamVjdHMgaW4gYSByZXBvc2l0b3J5LgorCitnaXRsaW5rOmdpdC1yZXJlcmVbMV06OgorCVJldXNlIHJlY29yZGVkIHJlc29sdXRpb24gb2YgY29uZmxpY3RlZCBtZXJnZXMuCisKK2dpdGxpbms6Z2l0LXJlc2V0WzFdOjoKKwlSZXNldCBjdXJyZW50IEhFQUQgdG8gdGhlIHNwZWNpZmllZCBzdGF0ZS4KKworZ2l0bGluazpnaXQtcmVzb2x2ZVsxXTo6CisJTWVyZ2UgdHdvIGNvbW1pdHMuCisKK2dpdGxpbms6Z2l0LXJldmVydFsxXTo6CisJUmV2ZXJ0IGFuIGV4aXN0aW5nIGNvbW1pdC4KKworZ2l0bGluazpnaXQtcm1bMV06OgorCVJlbW92ZSBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUgYW5kIGZyb20gdGhlIGluZGV4LgorCitnaXRsaW5rOmdpdC1zaG9ydGxvZ1sxXTo6CisJU3VtbWFyaXplcyAnZ2l0IGxvZycgb3V0cHV0LgorCitnaXRsaW5rOmdpdC1zaG93WzFdOjoKKwlTaG93IG9uZSBjb21taXQgbG9nIGFuZCBpdHMgZGlmZi4KKworZ2l0bGluazpnaXQtc2hvdy1icmFuY2hbMV06OgorCVNob3cgYnJhbmNoZXMgYW5kIHRoZWlyIGNvbW1pdHMuCisKK2dpdGxpbms6Z2l0LXN0YXR1c1sxXTo6CisJU2hvd3MgdGhlIHdvcmtpbmcgdHJlZSBzdGF0dXMuCisKK2dpdGxpbms6Z2l0LXZlcmlmeS10YWdbMV06OgorCUNoZWNrIHRoZSBHUEcgc2lnbmF0dXJlIG9mIHRhZy4KKworZ2l0bGluazpnaXQtd2hhdGNoYW5nZWRbMV06OgorCVNob3dzIGNvbW1pdCBsb2dzIGFuZCBkaWZmZXJlbmNlcyB0aGV5IGludHJvZHVjZS4KKworCitBbmNpbGxhcnkgQ29tbWFuZHMKK35+fn5+fn5+fn5+fn5+fn5+fgorTWFuaXB1bGF0b3JzOgorCitnaXRsaW5rOmdpdC1hcHBseXBhdGNoWzFdOjoKKwlBcHBseSBvbmUgcGF0Y2ggZXh0cmFjdGVkIGZyb20gYW4gZS1tYWlsLgorCitnaXRsaW5rOmdpdC1hcmNoaW1wb3J0WzFdOjoKKwlJbXBvcnQgYW4gYXJjaCByZXBvc2l0b3J5IGludG8gZ2l0LgorCitnaXRsaW5rOmdpdC1jb252ZXJ0LW9iamVjdHNbMV06OgorCUNvbnZlcnRzIG9sZC1zdHlsZSBnaXQgcmVwb3NpdG9yeS4KKworZ2l0bGluazpnaXQtY3ZzaW1wb3J0WzFdOjoKKwlTYWx2YWdlIHlvdXIgZGF0YSBvdXQgb2YgYW5vdGhlciBTQ00gcGVvcGxlIGxvdmUgdG8gaGF0ZS4KKworZ2l0bGluazpnaXQtY3ZzZXhwb3J0Y29tbWl0WzFdOjoKKwlFeHBvcnQgYSBzaW5nbGUgY29tbWl0IHRvIGEgQ1ZTIGNoZWNrb3V0LgorCitnaXRsaW5rOmdpdC1jdnNzZXJ2ZXJbMV06OgorCUEgQ1ZTIHNlcnZlciBlbXVsYXRvciBmb3IgZ2l0LgorCitnaXRsaW5rOmdpdC1sb3N0LWZvdW5kWzFdOjoKKwlSZWNvdmVyIGxvc3QgcmVmcyB0aGF0IGx1Y2tpbHkgaGF2ZSBub3QgeWV0IGJlZW4gcHJ1bmVkLgorCitnaXRsaW5rOmdpdC1tZXJnZS1vbmUtZmlsZVsxXTo6CisJVGhlIHN0YW5kYXJkIGhlbHBlciBwcm9ncmFtIHRvIHVzZSB3aXRoIGBnaXQtbWVyZ2UtaW5kZXhgLgorCitnaXRsaW5rOmdpdC1wcnVuZVsxXTo6CisJUHJ1bmVzIGFsbCB1bnJlYWNoYWJsZSBvYmplY3RzIGZyb20gdGhlIG9iamVjdCBkYXRhYmFzZS4KKworZ2l0bGluazpnaXQtcXVpbHRpbXBvcnRbMV06OgorCUFwcGxpZXMgYSBxdWlsdCBwYXRjaHNldCBvbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4KKworZ2l0bGluazpnaXQtcmVsaW5rWzFdOjoKKwlIYXJkbGluayBjb21tb24gb2JqZWN0cyBpbiBsb2NhbCByZXBvc2l0b3JpZXMuCisKK2dpdGxpbms6Z2l0LXN2bmltcG9ydFsxXTo6CisJSW1wb3J0IGEgU1ZOIHJlcG9zaXRvcnkgaW50byBnaXQuCisKK2dpdGxpbms6Z2l0LXNoLXNldHVwWzFdOjoKKwlDb21tb24gZ2l0IHNoZWxsIHNjcmlwdCBzZXR1cCBjb2RlLgorCitnaXRsaW5rOmdpdC1zeW1ib2xpYy1yZWZbMV06OgorCVJlYWQgYW5kIG1vZGlmeSBzeW1ib2xpYyByZWZzLgorCitnaXRsaW5rOmdpdC10YWdbMV06OgorCUFuIGV4YW1wbGUgc2NyaXB0IHRvIGNyZWF0ZSBhIHRhZyBvYmplY3Qgc2lnbmVkIHdpdGggR1BHLgorCitnaXRsaW5rOmdpdC11cGRhdGUtcmVmWzFdOjoKKwlVcGRhdGUgdGhlIG9iamVjdCBuYW1lIHN0b3JlZCBpbiBhIHJlZiBzYWZlbHkuCisKKworSW50ZXJyb2dhdG9yczoKKworZ2l0bGluazpnaXQtYW5ub3RhdGVbMV06OgorCUFubm90YXRlIGZpbGUgbGluZXMgd2l0aCBjb21taXQgaW5mby4KKworZ2l0bGluazpnaXQtYmxhbWVbMV06OgorCUJsYW1lIGZpbGUgbGluZXMgb24gY29tbWl0cy4KKworZ2l0bGluazpnaXQtY2hlY2stcmVmLWZvcm1hdFsxXTo6CisJTWFrZSBzdXJlIHJlZiBuYW1lIGlzIHdlbGwgZm9ybWVkLgorCitnaXRsaW5rOmdpdC1jaGVycnlbMV06OgorCUZpbmQgY29tbWl0cyBub3QgbWVyZ2VkIHVwc3RyZWFtLgorCitnaXRsaW5rOmdpdC1jb3VudC1vYmplY3RzWzFdOjoKKwlDb3VudCB1bnBhY2tlZCBudW1iZXIgb2Ygb2JqZWN0cyBhbmQgdGhlaXIgZGlzayBjb25zdW1wdGlvbi4KKworZ2l0bGluazpnaXQtZGFlbW9uWzFdOjoKKwlBIHJlYWxseSBzaW1wbGUgc2VydmVyIGZvciBnaXQgcmVwb3NpdG9yaWVzLgorCitnaXRsaW5rOmdpdC1mbXQtbWVyZ2UtbXNnWzFdOjoKKwlQcm9kdWNlIGEgbWVyZ2UgY29tbWl0IG1lc3NhZ2UuCisKK2dpdGxpbms6Z2l0LWdldC10YXItY29tbWl0LWlkWzFdOjoKKwlFeHRyYWN0IGNvbW1pdCBJRCBmcm9tIGFuIGFyY2hpdmUgY3JlYXRlZCB1c2luZyBnaXQtdGFyLXRyZWUuCisKK2dpdGxpbms6Z2l0LWltYXAtc2VuZFsxXTo6CisJRHVtcCBhIG1haWxib3ggZnJvbSBzdGRpbiBpbnRvIGFuIGltYXAgZm9sZGVyLgorCitnaXRsaW5rOmdpdC1tYWlsaW5mb1sxXTo6CisJRXh0cmFjdHMgcGF0Y2ggYW5kIGF1dGhvcnNoaXAgaW5mb3JtYXRpb24gZnJvbSBhIHNpbmdsZQorCWUtbWFpbCBtZXNzYWdlLCBvcHRpb25hbGx5IHRyYW5zbGl0ZXJhdGluZyB0aGUgY29tbWl0CisJbWVzc2FnZSBpbnRvIHV0Zi04LgorCitnaXRsaW5rOmdpdC1tYWlsc3BsaXRbMV06OgorCUEgc3R1cGlkIHByb2dyYW0gdG8gc3BsaXQgVU5JWCBtYm94IGZvcm1hdCBtYWlsYm94IGludG8KKwlpbmRpdmlkdWFsIHBpZWNlcyBvZiBlLW1haWwuCisKK2dpdGxpbms6Z2l0LW1lcmdlLXRyZWVbMV06OgorCVNob3cgdGhyZWUtd2F5IG1lcmdlIHdpdGhvdXQgdG91Y2hpbmcgaW5kZXguCisKK2dpdGxpbms6Z2l0LXBhdGNoLWlkWzFdOjoKKwlDb21wdXRlIHVuaXF1ZSBJRCBmb3IgYSBwYXRjaC4KKworZ2l0bGluazpnaXQtcGFyc2UtcmVtb3RlWzFdOjoKKwlSb3V0aW5lcyB0byBoZWxwIHBhcnNpbmcgYCRHSVRfRElSL3JlbW90ZXMvYCBmaWxlcy4KKworZ2l0bGluazpnaXQtcmVxdWVzdC1wdWxsWzFdOjoKKwlnaXQtcmVxdWVzdC1wdWxsLgorCitnaXRsaW5rOmdpdC1yZXYtcGFyc2VbMV06OgorCVBpY2sgb3V0IGFuZCBtYXNzYWdlIHBhcmFtZXRlcnMuCisKK2dpdGxpbms6Z2l0LXNlbmQtZW1haWxbMV06OgorCVNlbmQgcGF0Y2ggZS1tYWlscyBvdXQgb2YgImZvcm1hdC1wYXRjaCAtLW1ib3giIG91dHB1dC4KKworZ2l0bGluazpnaXQtc3ltYm9saWMtcmVmWzFdOjoKKwlSZWFkIGFuZCBtb2RpZnkgc3ltYm9saWMgcmVmcy4KKworZ2l0bGluazpnaXQtc3RyaXBzcGFjZVsxXTo6CisJRmlsdGVyIG91dCBlbXB0eSBsaW5lcy4KKworCitDb21tYW5kcyBub3QgeWV0IGRvY3VtZW50ZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitnaXRsaW5rOmdpdGtbMV06OgorCVRoZSBnaXRrIHJlcG9zaXRvcnkgYnJvd3Nlci4KKworCitDb25maWd1cmF0aW9uIE1lY2hhbmlzbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3RhcnRpbmcgZnJvbSAwLjk5LjkgKGFjdHVhbGx5IG1pZCAwLjk5LjguR0lUKSwgYC5naXQvY29uZmlnYCBmaWxlCitpcyB1c2VkIHRvIGhvbGQgcGVyLXJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgSXQgaXMgYQorc2ltcGxlIHRleHQgZmlsZSBtb2RlbGxlZCBhZnRlciBgLmluaWAgZm9ybWF0IGZhbWlsaWFyIHRvIHNvbWUKK3Blb3BsZS4gIEhlcmUgaXMgYW4gZXhhbXBsZToKKworLS0tLS0tLS0tLS0tCisjCisjIEEgJyMnIG9yICc7JyBjaGFyYWN0ZXIgaW5kaWNhdGVzIGEgY29tbWVudC4KKyMKKworOyBjb3JlIHZhcmlhYmxlcworW2NvcmVdCisJOyBEb24ndCB0cnVzdCBmaWxlIG1vZGVzCisJZmlsZW1vZGUgPSBmYWxzZQorCis7IHVzZXIgaWRlbnRpdHkKK1t1c2VyXQorCW5hbWUgPSAiSnVuaW8gQyBIYW1hbm8iCisJZW1haWwgPSAianVua2lvQHR3aW5zdW4uY29tIgorCistLS0tLS0tLS0tLS0KKworVmFyaW91cyBjb21tYW5kcyByZWFkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgYWRqdXN0Cit0aGVpciBvcGVyYXRpb24gYWNjb3JkaW5nbHkuCisKKworSWRlbnRpZmllciBUZXJtaW5vbG9neQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPG9iamVjdD46OgorCUluZGljYXRlcyB0aGUgb2JqZWN0IG5hbWUgZm9yIGFueSB0eXBlIG9mIG9iamVjdC4KKworPGJsb2I+OjoKKwlJbmRpY2F0ZXMgYSBibG9iIG9iamVjdCBuYW1lLgorCis8dHJlZT46OgorCUluZGljYXRlcyBhIHRyZWUgb2JqZWN0IG5hbWUuCisKKzxjb21taXQ+OjoKKwlJbmRpY2F0ZXMgYSBjb21taXQgb2JqZWN0IG5hbWUuCisKKzx0cmVlLWlzaD46OgorCUluZGljYXRlcyBhIHRyZWUsIGNvbW1pdCBvciB0YWcgb2JqZWN0IG5hbWUuICBBCisJY29tbWFuZCB0aGF0IHRha2VzIGEgPHRyZWUtaXNoPiBhcmd1bWVudCB1bHRpbWF0ZWx5IHdhbnRzIHRvCisJb3BlcmF0ZSBvbiBhIDx0cmVlPiBvYmplY3QgYnV0IGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2VzCisJPGNvbW1pdD4gYW5kIDx0YWc+IG9iamVjdHMgdGhhdCBwb2ludCBhdCBhIDx0cmVlPi4KKworPHR5cGU+OjoKKwlJbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3QgdHlwZSBpcyByZXF1aXJlZC4KKwlDdXJyZW50bHkgb25lIG9mOiBgYmxvYmAsIGB0cmVlYCwgYGNvbW1pdGAsIG9yIGB0YWdgLgorCis8ZmlsZT46OgorCUluZGljYXRlcyBhIGZpbGVuYW1lIC0gYWxtb3N0IGFsd2F5cyByZWxhdGl2ZSB0byB0aGUKKwlyb290IG9mIHRoZSB0cmVlIHN0cnVjdHVyZSBgR0lUX0lOREVYX0ZJTEVgIGRlc2NyaWJlcy4KKworU3ltYm9saWMgSWRlbnRpZmllcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbnkgZ2l0IGNvbW1hbmQgYWNjZXB0aW5nIGFueSA8b2JqZWN0PiBjYW4gYWxzbyB1c2UgdGhlIGZvbGxvd2luZworc3ltYm9saWMgbm90YXRpb246CisKK0hFQUQ6OgorCWluZGljYXRlcyB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2ggKGkuZS4gdGhlCisJY29udGVudHMgb2YgYCRHSVRfRElSL0hFQURgKS4KKworPHRhZz46OgorCWEgdmFsaWQgdGFnICduYW1lJworCShpLmUuIHRoZSBjb250ZW50cyBvZiBgJEdJVF9ESVIvcmVmcy90YWdzLzx0YWc+YCkuCisKKzxoZWFkPjo6CisJYSB2YWxpZCBoZWFkICduYW1lJworCShpLmUuIHRoZSBjb250ZW50cyBvZiBgJEdJVF9ESVIvcmVmcy9oZWFkcy88aGVhZD5gKS4KKworCitGaWxlL0RpcmVjdG9yeSBTdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQbGVhc2Ugc2VlIGxpbms6cmVwb3NpdG9yeS1sYXlvdXQuaHRtbFtyZXBvc2l0b3J5IGxheW91dF0gZG9jdW1lbnQuCisKK1JlYWQgbGluazpob29rcy5odG1sW2hvb2tzXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGVhY2ggaG9vay4KKworSGlnaGVyIGxldmVsIFNDTXMgbWF5IHByb3ZpZGUgYW5kIG1hbmFnZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZQorYCRHSVRfRElSYC4KKworCitUZXJtaW5vbG9neQorLS0tLS0tLS0tLS0KK1BsZWFzZSBzZWUgbGluazpnbG9zc2FyeS5odG1sW2dsb3NzYXJ5XSBkb2N1bWVudC4KKworCitFbnZpcm9ubWVudCBWYXJpYWJsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVmFyaW91cyBnaXQgY29tbWFuZHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorCitUaGUgZ2l0IFJlcG9zaXRvcnkKK35+fn5+fn5+fn5+fn5+fn5+fgorVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFwcGx5IHRvICdhbGwnIGNvcmUgZ2l0IGNvbW1hbmRzLiBOYjogaXQKK2lzIHdvcnRoIG5vdGluZyB0aGF0IHRoZXkgbWF5IGJlIHVzZWQvb3ZlcnJpZGRlbiBieSBTQ01TIHNpdHRpbmcgYWJvdmUKK2dpdCBzbyB0YWtlIGNhcmUgaWYgdXNpbmcgQ29naXRvIGV0Yy4KKworJ0dJVF9JTkRFWF9GSUxFJzo6CisJVGhpcyBlbnZpcm9ubWVudCBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgYW4gYWx0ZXJuYXRlCisJaW5kZXggZmlsZS4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb2YgYCRHSVRfRElSL2luZGV4YAorCWlzIHVzZWQuCisKKydHSVRfT0JKRUNUX0RJUkVDVE9SWSc6OgorCUlmIHRoZSBvYmplY3Qgc3RvcmFnZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHZpYSB0aGlzCisJZW52aXJvbm1lbnQgdmFyaWFibGUgdGhlbiB0aGUgc2hhMSBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZAorCXVuZGVybmVhdGggLSBvdGhlcndpc2UgdGhlIGRlZmF1bHQgYCRHSVRfRElSL29iamVjdHNgCisJZGlyZWN0b3J5IGlzIHVzZWQuCisKKydHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUyc6OgorCUR1ZSB0byB0aGUgaW1tdXRhYmxlIG5hdHVyZSBvZiBnaXQgb2JqZWN0cywgb2xkIG9iamVjdHMgY2FuIGJlCisJYXJjaGl2ZWQgaW50byBzaGFyZWQsIHJlYWQtb25seSBkaXJlY3Rvcmllcy4gVGhpcyB2YXJpYWJsZQorCXNwZWNpZmllcyBhICI6IiBzZXBhcmF0ZWQgbGlzdCBvZiBnaXQgb2JqZWN0IGRpcmVjdG9yaWVzIHdoaWNoCisJY2FuIGJlIHVzZWQgdG8gc2VhcmNoIGZvciBnaXQgb2JqZWN0cy4gTmV3IG9iamVjdHMgd2lsbCBub3QgYmUKKwl3cml0dGVuIHRvIHRoZXNlIGRpcmVjdG9yaWVzLgorCisnR0lUX0RJUic6OgorCUlmIHRoZSAnR0lUX0RJUicgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRoZW4gaXQKKwlzcGVjaWZpZXMgYSBwYXRoIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGAuZ2l0YAorCWZvciB0aGUgYmFzZSBvZiB0aGUgcmVwb3NpdG9yeS4KKworZ2l0IENvbW1pdHMKK35+fn5+fn5+fn5+CisnR0lUX0FVVEhPUl9OQU1FJzo6CisnR0lUX0FVVEhPUl9FTUFJTCc6OgorJ0dJVF9BVVRIT1JfREFURSc6OgorJ0dJVF9DT01NSVRURVJfTkFNRSc6OgorJ0dJVF9DT01NSVRURVJfRU1BSUwnOjoKKwlzZWUgZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV0KKworZ2l0IERpZmZzCit+fn5+fn5+fn4KKydHSVRfRElGRl9PUFRTJzo6CisnR0lUX0VYVEVSTkFMX0RJRkYnOjoKKwlzZWUgdGhlICJnZW5lcmF0aW5nIHBhdGNoZXMiIHNlY3Rpb24gaW4gOgorCWdpdGxpbms6Z2l0LWRpZmYtaW5kZXhbMV07CisJZ2l0bGluazpnaXQtZGlmZi1maWxlc1sxXTsKKwlnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0KKworRGlzY3Vzc2lvbltbRGlzY3Vzc2lvbl1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OlJFQURNRVtdCisKK0F1dGhvcnMKKy0tLS0tLS0KKyogZ2l0J3MgZm91bmRpbmcgZmF0aGVyIGlzIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4uCisqIFRoZSBjdXJyZW50IGdpdCBudXJzZSBpcyBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+LgorKiBUaGUgZ2l0IHBvdHR5IHdhcyB3cml0dGVuIGJ5IEFuZHJlcyBFcmljc3NvbiA8YWVAb3A1LnNlPi4KKyogR2VuZXJhbCB1cGJyaW5naW5nIGlzIGhhbmRsZWQgYnkgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK1RoZSBkb2N1bWVudGF0aW9uIGZvciBnaXQgc3VpdGUgd2FzIHN0YXJ0ZWQgYnkgRGF2aWQgR3JlYXZlcworPGRhdmlkQGRncmVhdmVzLmNvbT4sIGFuZCBsYXRlciBlbmhhbmNlZCBncmVhdGx5IGJ5IHRoZQorY29udHJpYnV0b3JzIG9uIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdGsudHh0IGIvRG9jdW1lbnRhdGlvbi9naXRrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ4MmJmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXRrLnR4dApAQCAtMCwwICsxLDUxIEBACitnaXRrKDEpCis9PT09PT09CisKK05BTUUKKy0tLS0KK2dpdGsgLSBTb21lIGdpdCBjb21tYW5kIG5vdCB5ZXQgZG9jdW1lbnRlZC4KKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXRrJyBbIC0tb3B0aW9uIF0gPGFyZ3M+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRG9lcyBzb21ldGhpbmcgbm90IHlldCBkb2N1bWVudGVkLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tb3B0aW9uOjoKKwlTb21lIG9wdGlvbiBub3QgeWV0IGRvY3VtZW50ZWQuCisKKzxhcmdzPi4uLjo6CisJU29tZSBhcmd1bWVudCBub3QgeWV0IGRvY3VtZW50ZWQuCisKKworRXhhbXBsZXMKKy0tLS0tLS0tCitnaXRrIHYyLjYuMTIuLiBpbmNsdWRlL3Njc2kgZHJpdmVycy9zY3NpOjoKKworCVNob3cgYXMgdGhlIGNoYW5nZXMgc2luY2UgdmVyc2lvbiAndjIuNi4xMicgdGhhdCBjaGFuZ2VkIGFueQorCWZpbGUgaW4gdGhlIGluY2x1ZGUvc2NzaSBvciBkcml2ZXJzL3Njc2kgc3ViZGlyZWN0b3JpZXMKKworZ2l0ayAtLXNpbmNlPSIyIHdlZWtzIGFnbyIgXC0tIGdpdGs6OgorCisJU2hvdyB0aGUgY2hhbmdlcyBkdXJpbmcgdGhlIGxhc3QgdHdvIHdlZWtzIHRvIHRoZSBmaWxlICdnaXRrJy4KKwlUaGUgIi0tIiBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggdGhlICpicmFuY2gqIG5hbWVkCisJJ2dpdGsnCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2xvc3NhcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9nbG9zc2FyeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2ZGRiNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2xvc3NhcnkudHh0CkBAIC0wLDAgKzEsMzMzIEBACithbHRlcm5hdGUgb2JqZWN0IGRhdGFiYXNlOjoKKwlWaWEgdGhlIGFsdGVybmF0ZXMgbWVjaGFuaXNtLCBhIHJlcG9zaXRvcnkgY2FuIGluaGVyaXQgcGFydCBvZiBpdHMKKwlvYmplY3QgZGF0YWJhc2UgZnJvbSBhbm90aGVyIG9iamVjdCBkYXRhYmFzZSwgd2hpY2ggaXMgY2FsbGVkCisJImFsdGVybmF0ZSIuCisKK2JhcmUgcmVwb3NpdG9yeTo6CisJQSBiYXJlIHJlcG9zaXRvcnkgaXMgbm9ybWFsbHkgYW4gYXBwcm9wcmlhdGVseSBuYW1lZAorCWRpcmVjdG9yeSB3aXRoIGEgYC5naXRgIHN1ZmZpeCB0aGF0IGRvZXMgbm90IGhhdmUgYQorCWxvY2FsbHkgY2hlY2tlZC1vdXQgY29weSBvZiBhbnkgb2YgdGhlIGZpbGVzIHVuZGVyIHJldmlzaW9uCisJY29udHJvbC4gIFRoYXQgaXMsIGFsbCBvZiB0aGUgYGdpdGAgYWRtaW5pc3RyYXRpdmUgYW5kCisJY29udHJvbCBmaWxlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHByZXNlbnQgaW4gdGhlCisJaGlkZGVuIGAuZ2l0YCBzdWItZGlyZWN0b3J5IGFyZSBkaXJlY3RseSBwcmVzZW50IGluCisJdGhlIGByZXBvc2l0b3J5LmdpdGAgZGlyZWN0b3J5IGluc3RlYWQsIGFuZCBubyBvdGhlciBmaWxlcworCWFyZSBwcmVzZW50IGFuZCBjaGVja2VkIG91dC4gIFVzdWFsbHkgcHVibGlzaGVycyBvZiBwdWJsaWMKKwlyZXBvc2l0b3JpZXMgbWFrZSBiYXJlIHJlcG9zaXRvcmllcyBhdmFpbGFibGUuCisKK2Jsb2Igb2JqZWN0OjoKKwlVbnR5cGVkIG9iamVjdCwgZS5nLiB0aGUgY29udGVudHMgb2YgYSBmaWxlLgorCiticmFuY2g6OgorCUEgbm9uLWN5Y2xpY2FsIGdyYXBoIG9mIHJldmlzaW9ucywgaS5lLiB0aGUgY29tcGxldGUgaGlzdG9yeSBvZgorCWEgcGFydGljdWxhciByZXZpc2lvbiwgd2hpY2ggaXMgY2FsbGVkIHRoZSBicmFuY2ggaGVhZC4gVGhlCisJYnJhbmNoIGhlYWRzIGFyZSBzdG9yZWQgaW4gYCRHSVRfRElSL3JlZnMvaGVhZHMvYC4KKworY2FjaGU6OgorCU9ic29sZXRlIGZvcjogaW5kZXguCisKK2NoYWluOjoKKwlBIGxpc3Qgb2Ygb2JqZWN0cywgd2hlcmUgZWFjaCBvYmplY3QgaW4gdGhlIGxpc3QgY29udGFpbnMgYQorCXJlZmVyZW5jZSB0byBpdHMgc3VjY2Vzc29yIChmb3IgZXhhbXBsZSwgdGhlIHN1Y2Nlc3NvciBvZiBhIGNvbW1pdAorCWNvdWxkIGJlIG9uZSBvZiBpdHMgcGFyZW50cykuCisKK2NoYW5nZXNldDo6CisJQml0S2VlcGVyL2N2c3BzIHNwZWFrIGZvciAiY29tbWl0Ii4gU2luY2UgZ2l0IGRvZXMgbm90IHN0b3JlCisJY2hhbmdlcywgYnV0IHN0YXRlcywgaXQgcmVhbGx5IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdXNlCisJdGhlIHRlcm0gImNoYW5nZXNldHMiIHdpdGggZ2l0LgorCitjaGVja291dDo6CisJVGhlIGFjdGlvbiBvZiB1cGRhdGluZyB0aGUgd29ya2luZyB0cmVlIHRvIGEgcmV2aXNpb24gd2hpY2ggd2FzCisJc3RvcmVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UuCisKK2NoZXJyeS1waWNraW5nOjoKKwlJbiBTQ00gamFyZ29uLCAiY2hlcnJ5IHBpY2siIG1lYW5zIHRvIGNob29zZSBhIHN1YnNldCBvZgorCWNoYW5nZXMgb3V0IG9mIGEgc2VyaWVzIG9mIGNoYW5nZXMgKHR5cGljYWxseSBjb21taXRzKQorCWFuZCByZWNvcmQgdGhlbSBhcyBhIG5ldyBzZXJpZXMgb2YgY2hhbmdlcyBvbiB0b3Agb2YKKwlkaWZmZXJlbnQgY29kZWJhc2UuICBJbiBHSVQsIHRoaXMgaXMgcGVyZm9ybWVkIGJ5CisJImdpdCBjaGVycnktcGljayIgY29tbWFuZCB0byBleHRyYWN0IHRoZSBjaGFuZ2UKKwlpbnRyb2R1Y2VkIGJ5IGFuIGV4aXN0aW5nIGNvbW1pdCBhbmQgdG8gcmVjb3JkIGl0IGJhc2VkCisJb24gdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2ggYXMgYSBuZXcgY29tbWl0LgorCitjbGVhbjo6CisJQSB3b3JraW5nIHRyZWUgaXMgY2xlYW4sIGlmIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSByZXZpc2lvbgorCXJlZmVyZW5jZWQgYnkgdGhlIGN1cnJlbnQgaGVhZC4gIEFsc28gc2VlICJkaXJ0eSIuCisKK2NvbW1pdDo6CisJQXMgYSB2ZXJiOiBUaGUgYWN0aW9uIG9mIHN0b3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGluZGV4IGluIHRoZQorCW9iamVjdCBkYXRhYmFzZS4gVGhlIHJlc3VsdCBpcyBhIHJldmlzaW9uLgorCUFzIGEgbm91bjogU2hvcnQgaGFuZCBmb3IgY29tbWl0IG9iamVjdC4KKworY29tbWl0IG9iamVjdDo6CisJQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIKKwlyZXZpc2lvbiwgc3VjaCBhcyBwYXJlbnRzLCBjb21taXR0ZXIsIGF1dGhvciwgZGF0ZSBhbmQgdGhlCisJdHJlZSBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHRvcCBkaXJlY3Rvcnkgb2YgdGhlCisJc3RvcmVkIHJldmlzaW9uLgorCitjb3JlIGdpdDo6CisJRnVuZGFtZW50YWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB1dGlsaXRpZXMgb2YgZ2l0LiBFeHBvc2VzIG9ubHkKKwlsaW1pdGVkIHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQgdG9vbHMuCisKK0RBRzo6CisJRGlyZWN0ZWQgYWN5Y2xpYyBncmFwaC4gVGhlIGNvbW1pdCBvYmplY3RzIGZvcm0gYSBkaXJlY3RlZCBhY3ljbGljCisJZ3JhcGgsIGJlY2F1c2UgdGhleSBoYXZlIHBhcmVudHMgKGRpcmVjdGVkKSwgYW5kIHRoZSBncmFwaCBvZiBjb21taXQKKwlvYmplY3RzIGlzIGFjeWNsaWMgKHRoZXJlIGlzIG5vIGNoYWluIHdoaWNoIGJlZ2lucyBhbmQgZW5kcyB3aXRoIHRoZQorCXNhbWUgb2JqZWN0KS4KKworZGlyY2FjaGU6OgorCVlvdSBhcmUgKndhYWFhYXkqIGJlaGluZC4KKworZGlydHk6OgorCUEgd29ya2luZyB0cmVlIGlzIHNhaWQgdG8gYmUgZGlydHkgaWYgaXQgY29udGFpbnMgbW9kaWZpY2F0aW9ucworCXdoaWNoIGhhdmUgbm90IGJlZW4gY29tbWl0dGVkIHRvIHRoZSBjdXJyZW50IGJyYW5jaC4KKworZGlyZWN0b3J5OjoKKwlUaGUgbGlzdCB5b3UgZ2V0IHdpdGggImxzIiA6LSkKKworZW50OjoKKwlGYXZvcml0ZSBzeW5vbnltIHRvICJ0cmVlLWlzaCIgYnkgc29tZSB0b3RhbCBnZWVrcy4gU2VlCisJYGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW50XyhNaWRkbGUtZWFydGgpYCBmb3IgYW4gaW4tZGVwdGgKKwlleHBsYW5hdGlvbi4KKworZmFzdCBmb3J3YXJkOjoKKwlBIGZhc3QtZm9yd2FyZCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBtZXJnZSB3aGVyZSB5b3UgaGF2ZQorCWEgcmV2aXNpb24gYW5kIHlvdSBhcmUgIm1lcmdpbmciIGFub3RoZXIgYnJhbmNoJ3MgY2hhbmdlcworCXRoYXQgaGFwcGVuIHRvIGJlIGEgZGVzY2VuZGFudCBvZiB3aGF0IHlvdSBoYXZlLgorCUluIHN1Y2ggdGhlc2UgY2FzZXMsIHlvdSBkbyBub3QgbWFrZSBhIG5ldyBtZXJnZSBjb21taXQgYnV0CisJaW5zdGVhZCBqdXN0IHVwZGF0ZSB0byBoaXMgcmV2aXNpb24uIFRoaXMgd2lsbCBoYXBwZW4KKwlmcmVxdWVudGx5IG9uIGEgdHJhY2tpbmcgYnJhbmNoIG9mIGEgcmVtb3RlIHJlcG9zaXRvcnkuCisKK2ZldGNoOjoKKwlGZXRjaGluZyBhIGJyYW5jaCBtZWFucyB0byBnZXQgdGhlIGJyYW5jaCdzIGhlYWQgcmVmIGZyb20gYQorCXJlbW90ZSByZXBvc2l0b3J5LCB0byBmaW5kIG91dCB3aGljaCBvYmplY3RzIGFyZSBtaXNzaW5nIGZyb20KKwl0aGUgbG9jYWwgb2JqZWN0IGRhdGFiYXNlLCBhbmQgdG8gZ2V0IHRoZW0sIHRvby4KKworZmlsZSBzeXN0ZW06OgorCUxpbnVzIFRvcnZhbGRzIG9yaWdpbmFsbHkgZGVzaWduZWQgZ2l0IHRvIGJlIGEgdXNlciBzcGFjZSBmaWxlCisJc3lzdGVtLCBpLmUuIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBob2xkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKwlUaGF0IGVuc3VyZWQgdGhlIGVmZmljaWVuY3kgYW5kIHNwZWVkIG9mIGdpdC4KKworZ2l0IGFyY2hpdmU6OgorCVN5bm9ueW0gZm9yIHJlcG9zaXRvcnkgKGZvciBhcmNoIHBlb3BsZSkuCisKK2dyYWZ0czo6CisJR3JhZnRzIGVuYWJsZXMgdHdvIG90aGVyd2lzZSBkaWZmZXJlbnQgbGluZXMgb2YgZGV2ZWxvcG1lbnQgdG8gYmUKKwlqb2luZWQgdG9nZXRoZXIgYnkgcmVjb3JkaW5nIGZha2UgYW5jZXN0cnkgaW5mb3JtYXRpb24gZm9yIGNvbW1pdHMuCisJVGhpcyB3YXkgeW91IGNhbiBtYWtlIGdpdCBwcmV0ZW5kIHRoZSBzZXQgb2YgcGFyZW50cyBhIGNvbW1pdAorCWhhcyBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IHdhcyByZWNvcmRlZCB3aGVuIHRoZSBjb21taXQgd2FzIGNyZWF0ZWQuCisJQ29uZmlndXJlZCB2aWEgdGhlIGAuZ2l0L2luZm8vZ3JhZnRzYCBmaWxlLgorCitoYXNoOjoKKwlJbiBnaXQncyBjb250ZXh0LCBzeW5vbnltIHRvIG9iamVjdCBuYW1lLgorCitoZWFkOjoKKwlUaGUgdG9wIG9mIGEgYnJhbmNoLiBJdCBjb250YWlucyBhIHJlZiB0byB0aGUgY29ycmVzcG9uZGluZworCWNvbW1pdCBvYmplY3QuCisKK2hlYWQgcmVmOjoKKwlBIHJlZiBwb2ludGluZyB0byBhIGhlYWQuIE9mdGVuLCB0aGlzIGlzIGFiYnJldmlhdGVkIHRvICJoZWFkIi4KKwlIZWFkIHJlZnMgYXJlIHN0b3JlZCBpbiBgJEdJVF9ESVIvcmVmcy9oZWFkcy9gLgorCitob29rOjoKKwlEdXJpbmcgdGhlIG5vcm1hbCBleGVjdXRpb24gb2Ygc2V2ZXJhbCBnaXQgY29tbWFuZHMsCisJY2FsbC1vdXRzIGFyZSBtYWRlIHRvIG9wdGlvbmFsIHNjcmlwdHMgdGhhdCBhbGxvdworCWEgZGV2ZWxvcGVyIHRvIGFkZCBmdW5jdGlvbmFsaXR5IG9yIGNoZWNraW5nLgorCVR5cGljYWxseSwgdGhlIGhvb2tzIGFsbG93IGZvciBhIGNvbW1hbmQgdG8gYmUgcHJlLXZlcmlmaWVkCisJYW5kIHBvdGVudGlhbGx5IGFib3J0ZWQsIGFuZCBhbGxvdyBmb3IgYSBwb3N0LW5vdGlmaWNhdGlvbgorCWFmdGVyIHRoZSBvcGVyYXRpb24gaXMgZG9uZS4KKwlUaGUgaG9vayBzY3JpcHRzIGFyZSBmb3VuZCBpbiB0aGUgYCRHSVRfRElSL2hvb2tzL2AgZGlyZWN0b3J5LAorCWFuZCBhcmUgZW5hYmxlZCBieSBzaW1wbHkgbWFraW5nIHRoZW0gZXhlY3V0YWJsZS4KKworaW5kZXg6OgorCUEgY29sbGVjdGlvbiBvZiBmaWxlcyB3aXRoIHN0YXQgaW5mb3JtYXRpb24sIHdob3NlIGNvbnRlbnRzIGFyZQorCXN0b3JlZCBhcyBvYmplY3RzLiBUaGUgaW5kZXggaXMgYSBzdG9yZWQgdmVyc2lvbiBvZiB5b3VyIHdvcmtpbmcKKwl0cmVlLiBUcnV0aCBiZSB0b2xkLCBpdCBjYW4gYWxzbyBjb250YWluIGEgc2Vjb25kLCBhbmQgZXZlbiBhIHRoaXJkCisJdmVyc2lvbiBvZiBhIHdvcmtpbmcgdHJlZSwgd2hpY2ggYXJlIHVzZWQgd2hlbiBtZXJnaW5nLgorCitpbmRleCBlbnRyeTo6CisJVGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhIHBhcnRpY3VsYXIgZmlsZSwgc3RvcmVkIGluIHRoZSBpbmRleC4KKwlBbiBpbmRleCBlbnRyeSBjYW4gYmUgdW5tZXJnZWQsIGlmIGEgbWVyZ2Ugd2FzIHN0YXJ0ZWQsIGJ1dCBub3QKKwl5ZXQgZmluaXNoZWQgKGkuZS4gaWYgdGhlIGluZGV4IGNvbnRhaW5zIG11bHRpcGxlIHZlcnNpb25zIG9mCisJdGhhdCBmaWxlKS4KKworbWFzdGVyOjoKKwlUaGUgZGVmYXVsdCBkZXZlbG9wbWVudCBicmFuY2guIFdoZW5ldmVyIHlvdSBjcmVhdGUgYSBnaXQKKwlyZXBvc2l0b3J5LCBhIGJyYW5jaCBuYW1lZCAibWFzdGVyIiBpcyBjcmVhdGVkLCBhbmQgYmVjb21lcworCXRoZSBhY3RpdmUgYnJhbmNoLiBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnRhaW5zIHRoZSBsb2NhbAorCWRldmVsb3BtZW50LCB0aG91Z2ggdGhhdCBpcyBwdXJlbHkgY29udmVudGlvbmFsIGFuZCBub3QgcmVxdWlyZWQuCisKK21lcmdlOjoKKwlUbyBtZXJnZSBicmFuY2hlcyBtZWFucyB0byB0cnkgdG8gYWNjdW11bGF0ZSB0aGUgY2hhbmdlcyBzaW5jZSBhCisJY29tbW9uIGFuY2VzdG9yIGFuZCBhcHBseSB0aGVtIHRvIHRoZSBmaXJzdCBicmFuY2guIEFuIGF1dG9tYXRpYworCW1lcmdlIHVzZXMgaGV1cmlzdGljcyB0byBhY2NvbXBsaXNoIHRoYXQuIEV2aWRlbnRseSwgYW4gYXV0b21hdGljCisJbWVyZ2UgY2FuIGZhaWwuCisKK29iamVjdDo6CisJVGhlIHVuaXQgb2Ygc3RvcmFnZSBpbiBnaXQuIEl0IGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkKKwl0aGUgU0hBMSBvZiBpdHMgY29udGVudHMuIENvbnNlcXVlbnRseSwgYW4gb2JqZWN0IGNhbiBub3QKKwliZSBjaGFuZ2VkLgorCitvYmplY3QgZGF0YWJhc2U6OgorCVN0b3JlcyBhIHNldCBvZiAib2JqZWN0cyIsIGFuZCBhbiBpbmRpdmlkdWFsIG9iamVjdCBpcyBpZGVudGlmaWVkCisJYnkgaXRzIG9iamVjdCBuYW1lLiBUaGUgb2JqZWN0cyB1c3VhbGx5IGxpdmUgaW4gYCRHSVRfRElSL29iamVjdHMvYC4KKworb2JqZWN0IGlkZW50aWZpZXI6OgorCVN5bm9ueW0gZm9yIG9iamVjdCBuYW1lLgorCitvYmplY3QgbmFtZTo6CisJVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGFuIG9iamVjdC4gVGhlIGhhc2ggb2YgdGhlIG9iamVjdCdzIGNvbnRlbnRzCisJdXNpbmcgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSAxIGFuZCB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IHRoZSA0MAorCWNoYXJhY3RlciBoZXhhZGVjaW1hbCBlbmNvZGluZyBvZiB0aGUgaGFzaCBvZiB0aGUgb2JqZWN0IChwb3NzaWJseQorCWZvbGxvd2VkIGJ5IGEgd2hpdGUgc3BhY2UpLgorCitvYmplY3QgdHlwZToKKwlPbmUgb2YgdGhlIGlkZW50aWZpZXJzICJjb21taXQiLCJ0cmVlIiwidGFnIiBhbmQgImJsb2IiIGRlc2NyaWJpbmcKKwl0aGUgdHlwZSBvZiBhbiBvYmplY3QuCisKK29jdG9wdXM6OgorCVRvIG1lcmdlIG1vcmUgdGhhbiB0d28gYnJhbmNoZXMuIEFsc28gZGVub3RlcyBhbiBpbnRlbGxpZ2VudAorCXByZWRhdG9yLgorCitvcmlnaW46OgorCVRoZSBkZWZhdWx0IHVwc3RyZWFtIHRyYWNraW5nIGJyYW5jaC4gTW9zdCBwcm9qZWN0cyBoYXZlIGF0CisJbGVhc3Qgb25lIHVwc3RyZWFtIHByb2plY3Qgd2hpY2ggdGhleSB0cmFjay4gQnkgZGVmYXVsdAorCSdvcmlnaW4nIGlzIHVzZWQgZm9yIHRoYXQgcHVycG9zZS4gIE5ldyB1cHN0cmVhbSB1cGRhdGVzCisJd2lsbCBiZSBmZXRjaGVkIGludG8gdGhpcyBicmFuY2g7IHlvdSBzaG91bGQgbmV2ZXIgY29tbWl0CisJdG8gaXQgeW91cnNlbGYuCisKK3BhY2s6OgorCUEgc2V0IG9mIG9iamVjdHMgd2hpY2ggaGF2ZSBiZWVuIGNvbXByZXNzZWQgaW50byBvbmUgZmlsZSAodG8gc2F2ZQorCXNwYWNlIG9yIHRvIHRyYW5zbWl0IHRoZW0gZWZmaWNpZW50bHkpLgorCitwYWNrIGluZGV4OjoKKwlUaGUgbGlzdCBvZiBpZGVudGlmaWVycywgYW5kIG90aGVyIGluZm9ybWF0aW9uLCBvZiB0aGUgb2JqZWN0cyBpbiBhCisJcGFjaywgdG8gYXNzaXN0IGluIGVmZmljaWVudGx5IGFjY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYSBwYWNrLgorCitwYXJlbnQ6OgorCUEgY29tbWl0IG9iamVjdCBjb250YWlucyBhIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiB0aGUgbG9naWNhbAorCXByZWRlY2Vzc29yKHMpIGluIHRoZSBsaW5lIG9mIGRldmVsb3BtZW50LCBpLmUuIGl0cyBwYXJlbnRzLgorCitwaWNrYXhlOjoKKwlUaGUgdGVybSBwaWNrYXhlIHJlZmVycyB0byBhbiBvcHRpb24gdG8gdGhlIGRpZmZjb3JlIHJvdXRpbmVzCisJdGhhdCBoZWxwIHNlbGVjdCBjaGFuZ2VzIHRoYXQgYWRkIG9yIGRlbGV0ZSBhIGdpdmVuIHRleHQgc3RyaW5nLgorCVdpdGggdGhlIC0tcGlja2F4ZS1hbGwgb3B0aW9uLCBpdCBjYW4gYmUgdXNlZCB0byB2aWV3IHRoZQorCWZ1bGwgY2hhbmdlc2V0IHRoYXQgaW50cm9kdWNlZCBvciByZW1vdmVkLCBzYXksIGEgcGFydGljdWxhcgorCWxpbmUgb2YgdGV4dC4gIFNlZSBnaXRsaW5rOmdpdC1kaWZmWzFdLgorCitwbHVtYmluZzo6CisJQ3V0ZSBuYW1lIGZvciBjb3JlIGdpdC4KKworcG9yY2VsYWluOjoKKwlDdXRlIG5hbWUgZm9yIHByb2dyYW1zIGFuZCBwcm9ncmFtIHN1aXRlcyBkZXBlbmRpbmcgb24gY29yZSBnaXQsCisJcHJlc2VudGluZyBhIGhpZ2ggbGV2ZWwgYWNjZXNzIHRvIGNvcmUgZ2l0LiBQb3JjZWxhaW5zIGV4cG9zZQorCW1vcmUgb2YgYSBTQ00gaW50ZXJmYWNlIHRoYW4gdGhlIHBsdW1iaW5nLgorCitwdWxsOjoKKwlQdWxsaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGZldGNoIGl0IGFuZCBtZXJnZSBpdC4KKworcHVzaDo6CisJUHVzaGluZyBhIGJyYW5jaCBtZWFucyB0byBnZXQgdGhlIGJyYW5jaCdzIGhlYWQgcmVmIGZyb20gYSByZW1vdGUKKwlyZXBvc2l0b3J5LCBmaW5kIG91dCBpZiBpdCBpcyBhbiBhbmNlc3RvciB0byB0aGUgYnJhbmNoJ3MgbG9jYWwKKwloZWFkIHJlZiBpcyBhIGRpcmVjdCwgYW5kIGluIHRoYXQgY2FzZSwgcHV0dGluZyBhbGwgb2JqZWN0cywgd2hpY2gKKwlhcmUgcmVhY2hhYmxlIGZyb20gdGhlIGxvY2FsIGhlYWQgcmVmLCBhbmQgd2hpY2ggYXJlIG1pc3NpbmcgZnJvbQorCXRoZSByZW1vdGUgcmVwb3NpdG9yeSwgaW50byB0aGUgcmVtb3RlIG9iamVjdCBkYXRhYmFzZSwgYW5kIHVwZGF0aW5nCisJdGhlIHJlbW90ZSBoZWFkIHJlZi4gSWYgdGhlIHJlbW90ZSBoZWFkIGlzIG5vdCBhbiBhbmNlc3RvciB0byB0aGUKKwlsb2NhbCBoZWFkLCB0aGUgcHVzaCBmYWlscy4KKworcmVhY2hhYmxlOjoKKwlBbiBvYmplY3QgaXMgcmVhY2hhYmxlIGZyb20gYSByZWYvY29tbWl0L3RyZWUvdGFnLCBpZiB0aGVyZSBpcyBhCisJY2hhaW4gbGVhZGluZyBmcm9tIHRoZSBsYXR0ZXIgdG8gdGhlIGZvcm1lci4KKworcmViYXNlOjoKKwlUbyBjbGVhbiBhIGJyYW5jaCBieSBzdGFydGluZyBmcm9tIHRoZSBoZWFkIG9mIHRoZSBtYWluIGxpbmUgb2YKKwlkZXZlbG9wbWVudCAoIm1hc3RlciIpLCBhbmQgcmVhcHBseSB0aGUgKHBvc3NpYmx5IGNoZXJyeS1waWNrZWQpCisJY2hhbmdlcyBmcm9tIHRoYXQgYnJhbmNoLgorCityZWY6OgorCUEgNDAtYnl0ZSBoZXggcmVwcmVzZW50YXRpb24gb2YgYSBTSEExIG9yIGEgbmFtZSB0aGF0IGRlbm90ZXMKKwlhIHBhcnRpY3VsYXIgb2JqZWN0LiBUaGVzZSBtYXkgYmUgc3RvcmVkIGluIGAkR0lUX0RJUi9yZWZzL2AuCisKK3JlZnNwZWM6OgorCUEgcmVmc3BlYyBpcyB1c2VkIGJ5IGZldGNoIGFuZCBwdXNoIHRvIGRlc2NyaWJlIHRoZSBtYXBwaW5nCisJYmV0d2VlbiByZW1vdGUgcmVmIGFuZCBsb2NhbCByZWYuICBUaGV5IGFyZSBjb21iaW5lZCB3aXRoCisJYSBjb2xvbiBpbiB0aGUgZm9ybWF0IDxzcmM+Ojxkc3Q+LCBwcmVjZWRlZCBieSBhbiBvcHRpb25hbAorCXBsdXMgc2lnbiwgKy4gIEZvciBleGFtcGxlOgorCWBnaXQgZmV0Y2ggJFVSTCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL29yaWdpbmAKKwltZWFucyAiZ3JhYiB0aGUgbWFzdGVyIGJyYW5jaCBoZWFkIGZyb20gdGhlICRVUkwgYW5kIHN0b3JlCisJaXQgYXMgbXkgb3JpZ2luIGJyYW5jaCBoZWFkIi4KKwlBbmQgYGdpdCBwdXNoICRVUkwgcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy90by11cHN0cmVhbWAKKwltZWFucyAicHVibGlzaCBteSBtYXN0ZXIgYnJhbmNoIGhlYWQgYXMgdG8tdXBzdHJlYW0gbWFzdGVyIGhlYWQKKwlhdCAkVVJMIi4gICBTZWUgYWxzbyBnaXRsaW5rOmdpdC1wdXNoWzFdCisKK3JlcG9zaXRvcnk6OgorCUEgY29sbGVjdGlvbiBvZiByZWZzIHRvZ2V0aGVyIHdpdGggYW4gb2JqZWN0IGRhdGFiYXNlIGNvbnRhaW5pbmcKKwlhbGwgb2JqZWN0cywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSByZWZzLCBwb3NzaWJseSBhY2NvbXBhbmllZAorCWJ5IG1ldGEgZGF0YSBmcm9tIG9uZSBvciBtb3JlIHBvcmNlbGFpbnMuIEEgcmVwb3NpdG9yeSBjYW4KKwlzaGFyZSBhbiBvYmplY3QgZGF0YWJhc2Ugd2l0aCBvdGhlciByZXBvc2l0b3JpZXMuCisKK3Jlc29sdmU6OgorCVRoZSBhY3Rpb24gb2YgZml4aW5nIHVwIG1hbnVhbGx5IHdoYXQgYSBmYWlsZWQgYXV0b21hdGljIG1lcmdlCisJbGVmdCBiZWhpbmQuCisKK3JldmlzaW9uOjoKKwlBIHBhcnRpY3VsYXIgc3RhdGUgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdoaWNoIHdhcyBzdG9yZWQgaW4KKwl0aGUgb2JqZWN0IGRhdGFiYXNlLiBJdCBpcyByZWZlcmVuY2VkIGJ5IGEgY29tbWl0IG9iamVjdC4KKworcmV3aW5kOjoKKwlUbyB0aHJvdyBhd2F5IHBhcnQgb2YgdGhlIGRldmVsb3BtZW50LCBpLmUuIHRvIGFzc2lnbiB0aGUgaGVhZCB0bworCWFuIGVhcmxpZXIgcmV2aXNpb24uCisKK1NDTTo6CisJU291cmNlIGNvZGUgbWFuYWdlbWVudCAodG9vbCkuCisKK1NIQTE6OgorCVN5bm9ueW0gZm9yIG9iamVjdCBuYW1lLgorCit0b3BpYyBicmFuY2g6OgorCUEgcmVndWxhciBnaXQgYnJhbmNoIHRoYXQgaXMgdXNlZCBieSBhIGRldmVsb3BlciB0bworCWlkZW50aWZ5IGEgY29uY2VwdHVhbCBsaW5lIG9mIGRldmVsb3BtZW50LiAgU2luY2UgYnJhbmNoZXMKKwlhcmUgdmVyeSBlYXN5IGFuZCBpbmV4cGVuc2l2ZSwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvCisJaGF2ZSBzZXZlcmFsIHNtYWxsIGJyYW5jaGVzIHRoYXQgZWFjaCBjb250YWluIHZlcnkgd2VsbAorCWRlZmluZWQgY29uY2VwdHMgb3Igc21hbGwgaW5jcmVtZW50YWwgeWV0IHJlbGF0ZWQgY2hhbmdlcy4KKwordHJhY2tpbmcgYnJhbmNoOjoKKwlBIHJlZ3VsYXIgZ2l0IGJyYW5jaCB0aGF0IGlzIHVzZWQgdG8gZm9sbG93IGNoYW5nZXMgZnJvbQorCWFub3RoZXIgcmVwb3NpdG9yeS4gIEEgdHJhY2tpbmcgYnJhbmNoIHNob3VsZCBub3QgY29udGFpbgorCWRpcmVjdCBtb2RpZmljYXRpb25zIG9yIGhhdmUgbG9jYWwgY29tbWl0cyBtYWRlIHRvIGl0LgorCUEgdHJhY2tpbmcgYnJhbmNoIGNhbiB1c3VhbGx5IGJlIGlkZW50aWZpZWQgYXMgdGhlCisJcmlnaHQtaGFuZC1zaWRlIHJlZiBpbiBhIFB1bGw6IHJlZnNwZWMuCisKK3RyZWUgb2JqZWN0OjoKKwlBbiBvYmplY3QgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZSBuYW1lcyBhbmQgbW9kZXMgYWxvbmcgd2l0aCByZWZzCisJdG8gdGhlIGFzc29jaWF0ZWQgYmxvYiBhbmQvb3IgdHJlZSBvYmplY3RzLiBBIHRyZWUgaXMgZXF1aXZhbGVudAorCXRvIGEgZGlyZWN0b3J5LgorCit0cmVlOjoKKwlFaXRoZXIgYSB3b3JraW5nIHRyZWUsIG9yIGEgdHJlZSBvYmplY3QgdG9nZXRoZXIgd2l0aCB0aGUKKwlkZXBlbmRlbnQgYmxvYiBhbmQgdHJlZSBvYmplY3RzIChpLmUuIGEgc3RvcmVkIHJlcHJlc2VudGF0aW9uCisJb2YgYSB3b3JraW5nIHRyZWUpLgorCit0cmVlLWlzaDo6CisJQSByZWYgcG9pbnRpbmcgdG8gZWl0aGVyIGEgY29tbWl0IG9iamVjdCwgYSB0cmVlIG9iamVjdCwgb3IgYQorCXRhZyBvYmplY3QgcG9pbnRpbmcgdG8gYSB0YWcgb3IgY29tbWl0IG9yIHRyZWUgb2JqZWN0LgorCit0YWcgb2JqZWN0OjoKKwlBbiBvYmplY3QgY29udGFpbmluZyBhIHJlZiBwb2ludGluZyB0byBhbm90aGVyIG9iamVjdCwgd2hpY2ggY2FuCisJY29udGFpbiBhIG1lc3NhZ2UganVzdCBsaWtlIGEgY29tbWl0IG9iamVjdC4gSXQgY2FuIGFsc28KKwljb250YWluIGEgKFBHUCkgc2lnbmF0dXJlLCBpbiB3aGljaCBjYXNlIGl0IGlzIGNhbGxlZCBhICJzaWduZWQKKwl0YWcgb2JqZWN0Ii4KKwordGFnOjoKKwlBIHJlZiBwb2ludGluZyB0byBhIHRhZyBvciBjb21taXQgb2JqZWN0LiBJbiBjb250cmFzdCB0byBhIGhlYWQsCisJYSB0YWcgaXMgbm90IGNoYW5nZWQgYnkgYSBjb21taXQuIFRhZ3MgKG5vdCB0YWcgb2JqZWN0cykgYXJlCisJc3RvcmVkIGluIGAkR0lUX0RJUi9yZWZzL3RhZ3MvYC4gQSBnaXQgdGFnIGhhcyBub3RoaW5nIHRvIGRvIHdpdGgKKwlhIExpc3AgdGFnICh3aGljaCBpcyBjYWxsZWQgb2JqZWN0IHR5cGUgaW4gZ2l0J3MgY29udGV4dCkuCisJQSB0YWcgaXMgbW9zdCB0eXBpY2FsbHkgdXNlZCB0byBtYXJrIGEgcGFydGljdWxhciBwb2ludCBpbiB0aGUKKwljb21taXQgYW5jZXN0cnkgY2hhaW4uCisKK3VubWVyZ2VkIGluZGV4OgorCUFuIGluZGV4IHdoaWNoIGNvbnRhaW5zIHVubWVyZ2VkIGluZGV4IGVudHJpZXMuCisKK3dvcmtpbmcgdHJlZTo6CisJVGhlIHNldCBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgY3VycmVudGx5IGJlaW5nIHdvcmtlZCBvbiwKKwlpLmUuIHlvdSBjYW4gd29yayBpbiB5b3VyIHdvcmtpbmcgdHJlZSB3aXRob3V0IHVzaW5nIGdpdCBhdCBhbGwuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG9va3MudHh0IGIvRG9jdW1lbnRhdGlvbi9ob29rcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4YjRhYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG9va3MudHh0CkBAIC0wLDAgKzEsMTYwIEBACitIb29rcyB1c2VkIGJ5IGdpdAorPT09PT09PT09PT09PT09PT0KKworSG9va3MgYXJlIGxpdHRsZSBzY3JpcHRzIHlvdSBjYW4gcGxhY2UgaW4gYCRHSVRfRElSL2hvb2tzYAorZGlyZWN0b3J5IHRvIHRyaWdnZXIgYWN0aW9uIGF0IGNlcnRhaW4gcG9pbnRzLiAgV2hlbgorYGdpdC1pbml0LWRiYCBpcyBydW4sIGEgaGFuZGZ1bCBleGFtcGxlIGhvb2tzIGFyZSBjb3BpZWQgaW4gdGhlCitgaG9va3NgIGRpcmVjdG9yeSBvZiB0aGUgbmV3IHJlcG9zaXRvcnksIGJ1dCBieSBkZWZhdWx0IHRoZXkgYXJlCithbGwgZGlzYWJsZWQuICBUbyBlbmFibGUgYSBob29rLCBtYWtlIGl0IGV4ZWN1dGFibGUgd2l0aCBgY2htb2QKKyt4YC4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGN1cnJlbnRseSBkZWZpbmVkIGhvb2tzLgorCithcHBseXBhdGNoLW1zZworLS0tLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1hcHBseXBhdGNoYCBzY3JpcHQsIHdoaWNoIGlzCit0eXBpY2FsbHkgaW52b2tlZCBieSBgZ2l0LWFwcGx5bWJveGAuICBJdCB0YWtlcyBhIHNpbmdsZQorcGFyYW1ldGVyLCB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGhvbGRzIHRoZSBwcm9wb3NlZCBjb21taXQKK2xvZyBtZXNzYWdlLiAgRXhpdGluZyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBjYXVzZXMgdGhlCisnZ2l0LWFwcGx5cGF0Y2gnIHRvIGFib3J0IGJlZm9yZSBhcHBseWluZyB0aGUgcGF0Y2guCisKK1RoZSBob29rIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGUgbWVzc2FnZSBmaWxlIGluIHBsYWNlLCBhbmQgY2FuCitiZSB1c2VkIHRvIG5vcm1hbGl6ZSB0aGUgbWVzc2FnZSBpbnRvIHNvbWUgcHJvamVjdCBzdGFuZGFyZAorZm9ybWF0IChpZiB0aGUgcHJvamVjdCBoYXMgb25lKS4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byByZWZ1c2UKK3RoZSBjb21taXQgYWZ0ZXIgaW5zcGVjdGluZyB0aGUgbWVzc2FnZSBmaWxlLgorCitUaGUgZGVmYXVsdCBhcHBseXBhdGNoLW1zZyBob29rLCB3aGVuIGVuYWJsZWQsIHJ1bnMgdGhlCitjb21taXQtbXNnIGhvb2ssIGlmIHRoZSBsYXR0ZXIgaXMgZW5hYmxlZC4KKworcHJlLWFwcGx5cGF0Y2gKKy0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtYXBwbHlwYXRjaGAgc2NyaXB0LCB3aGljaCBpcwordHlwaWNhbGx5IGludm9rZWQgYnkgYGdpdC1hcHBseW1ib3hgLiAgSXQgdGFrZXMgbm8gcGFyYW1ldGVyLAorYW5kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHBhdGNoIGlzIGFwcGxpZWQsIGJ1dCBiZWZvcmUgYSBjb21taXQKK2lzIG1hZGUuICBFeGl0aW5nIHdpdGggbm9uLXplcm8gc3RhdHVzIGNhdXNlcyB0aGUgd29ya2luZyB0cmVlCithZnRlciBhcHBsaWNhdGlvbiBvZiB0aGUgcGF0Y2ggbm90IGNvbW1pdHRlZC4KKworSXQgY2FuIGJlIHVzZWQgdG8gaW5zcGVjdCB0aGUgY3VycmVudCB3b3JraW5nIHRyZWUgYW5kIHJlZnVzZSB0bworbWFrZSBhIGNvbW1pdCBpZiBpdCBkb2VzIG5vdCBwYXNzIGNlcnRhaW4gdGVzdC4KKworVGhlIGRlZmF1bHQgcHJlLWFwcGx5cGF0Y2ggaG9vaywgd2hlbiBlbmFibGVkLCBydW5zIHRoZQorcHJlLWNvbW1pdCBob29rLCBpZiB0aGUgbGF0dGVyIGlzIGVuYWJsZWQuCisKK3Bvc3QtYXBwbHlwYXRjaAorLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtYXBwbHlwYXRjaGAgc2NyaXB0LCB3aGljaCBpcwordHlwaWNhbGx5IGludm9rZWQgYnkgYGdpdC1hcHBseW1ib3hgLiAgSXQgdGFrZXMgbm8gcGFyYW1ldGVyLAorYW5kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHBhdGNoIGlzIGFwcGxpZWQgYW5kIGEgY29tbWl0IGlzIG1hZGUuCisKK1RoaXMgaG9vayBpcyBtZWFudCBwcmltYXJpbHkgZm9yIG5vdGlmaWNhdGlvbiwgYW5kIGNhbm5vdCBhZmZlY3QKK3RoZSBvdXRjb21lIG9mIGBnaXQtYXBwbHlwYXRjaGAuCisKK3ByZS1jb21taXQKKy0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1jb21taXRgLCBhbmQgY2FuIGJlIGJ5cGFzc2VkCit3aXRoIGBcLS1uby12ZXJpZnlgIG9wdGlvbi4gIEl0IHRha2VzIG5vIHBhcmFtZXRlciwgYW5kIGlzCitpbnZva2VkIGJlZm9yZSBvYnRhaW5pbmcgdGhlIHByb3Bvc2VkIGNvbW1pdCBsb2cgbWVzc2FnZSBhbmQKK21ha2luZyBhIGNvbW1pdC4gIEV4aXRpbmcgd2l0aCBub24temVybyBzdGF0dXMgZnJvbSB0aGlzIHNjcmlwdAorY2F1c2VzIHRoZSBgZ2l0LWNvbW1pdGAgdG8gYWJvcnQuCisKK1RoZSBkZWZhdWx0IHByZS1jb21taXQgaG9vaywgd2hlbiBlbmFibGVkLCBjYXRjaGVzIGludHJvZHVjdGlvbgorb2YgbGluZXMgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhbmQgYWJvcnRzIHRoZSBjb21taXQgd2hlbgorYSBzdWNoIGxpbmUgaXMgZm91bmQuCisKK2NvbW1pdC1tc2cKKy0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1jb21taXRgLCBhbmQgY2FuIGJlIGJ5cGFzc2VkCit3aXRoIGBcLS1uby12ZXJpZnlgIG9wdGlvbi4gIEl0IHRha2VzIGEgc2luZ2xlIHBhcmFtZXRlciwgdGhlCituYW1lIG9mIHRoZSBmaWxlIHRoYXQgaG9sZHMgdGhlIHByb3Bvc2VkIGNvbW1pdCBsb2cgbWVzc2FnZS4KK0V4aXRpbmcgd2l0aCBub24temVybyBzdGF0dXMgY2F1c2VzIHRoZSBgZ2l0LWNvbW1pdGAgdG8KK2Fib3J0LgorCitUaGUgaG9vayBpcyBhbGxvd2VkIHRvIGVkaXQgdGhlIG1lc3NhZ2UgZmlsZSBpbiBwbGFjZSwgYW5kIGNhbgorYmUgdXNlZCB0byBub3JtYWxpemUgdGhlIG1lc3NhZ2UgaW50byBzb21lIHByb2plY3Qgc3RhbmRhcmQKK2Zvcm1hdCAoaWYgdGhlIHByb2plY3QgaGFzIG9uZSkuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmdXNlCit0aGUgY29tbWl0IGFmdGVyIGluc3BlY3RpbmcgdGhlIG1lc3NhZ2UgZmlsZS4KKworVGhlIGRlZmF1bHQgY29tbWl0LW1zZyBob29rLCB3aGVuIGVuYWJsZWQsIGRldGVjdHMgZHVwbGljYXRlCitTaWduZWQtb2ZmLWJ5OiBsaW5lcywgYW5kIGFib3J0cyB0aGUgY29tbWl0IHdoZW4gb25lIGlzIGZvdW5kLgorCitwb3N0LWNvbW1pdAorLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1jb21taXRgLiAgSXQgdGFrZXMgbm8KK3BhcmFtZXRlciwgYW5kIGlzIGludm9rZWQgYWZ0ZXIgYSBjb21taXQgaXMgbWFkZS4KKworVGhpcyBob29rIGlzIG1lYW50IHByaW1hcmlseSBmb3Igbm90aWZpY2F0aW9uLCBhbmQgY2Fubm90IGFmZmVjdAordGhlIG91dGNvbWUgb2YgYGdpdC1jb21taXRgLgorCitUaGUgZGVmYXVsdCBwb3N0LWNvbW1pdCBob29rLCB3aGVuIGVuYWJsZWQsIGRlbW9uc3RyYXRlcyBob3cgdG8KK3NlbmQgb3V0IGEgY29tbWl0IG5vdGlmaWNhdGlvbiBlLW1haWwuCisKK3VwZGF0ZQorLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtcmVjZWl2ZS1wYWNrYCBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnksCit3aGljaCBpcyBoYXBwZW5zIHdoZW4gYSBgZ2l0IHB1c2hgIGlzIGRvbmUgb24gYSBsb2NhbCByZXBvc2l0b3J5LgorSnVzdCBiZWZvcmUgdXBkYXRpbmcgdGhlIHJlZiBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnksIHRoZSB1cGRhdGUgaG9vaworaXMgaW52b2tlZC4gIEl0cyBleGl0IHN0YXR1cyBkZXRlcm1pbmVzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YKK3RoZSByZWYgdXBkYXRlLgorCitUaGUgaG9vayBleGVjdXRlcyBvbmNlIGZvciBlYWNoIHJlZiB0byBiZSB1cGRhdGVkLCBhbmQgdGFrZXMKK3RocmVlIHBhcmFtZXRlcnM6CisgICAgLSB0aGUgbmFtZSBvZiB0aGUgcmVmIGJlaW5nIHVwZGF0ZWQsCisgICAgLSB0aGUgb2xkIG9iamVjdCBuYW1lIHN0b3JlZCBpbiB0aGUgcmVmLAorICAgIC0gYW5kIHRoZSBuZXcgb2JqZWN0bmFtZSB0byBiZSBzdG9yZWQgaW4gdGhlIHJlZi4KKworQSB6ZXJvIGV4aXQgZnJvbSB0aGUgdXBkYXRlIGhvb2sgYWxsb3dzIHRoZSByZWYgdG8gYmUgdXBkYXRlZC4KK0V4aXRpbmcgd2l0aCBhIG5vbi16ZXJvIHN0YXR1cyBwcmV2ZW50cyBgZ2l0LXJlY2VpdmUtcGFja2AKK2Zyb20gdXBkYXRpbmcgdGhlIHJlZi4KKworVGhpcyBob29rIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgJ2ZvcmNlZCcgdXBkYXRlIG9uIGNlcnRhaW4gcmVmcyBieQorbWFraW5nIHN1cmUgdGhhdCB0aGUgb2JqZWN0IG5hbWUgaXMgYSBjb21taXQgb2JqZWN0IHRoYXQgaXMgYQorZGVzY2VuZGFudCBvZiB0aGUgY29tbWl0IG9iamVjdCBuYW1lZCBieSB0aGUgb2xkIG9iamVjdCBuYW1lLgorVGhhdCBpcywgdG8gZW5mb3JjZSBhICJmYXN0IGZvcndhcmQgb25seSIgcG9saWN5LgorCitJdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gbG9nIHRoZSBvbGQuLm5ldyBzdGF0dXMuICBIb3dldmVyLCBpdAorZG9lcyBub3Qga25vdyB0aGUgZW50aXJlIHNldCBvZiBicmFuY2hlcywgc28gaXQgd291bGQgZW5kIHVwCitmaXJpbmcgb25lIGUtbWFpbCBwZXIgcmVmIHdoZW4gdXNlZCBuYWl2ZWx5LCB0aG91Z2guCisKK0Fub3RoZXIgdXNlIHN1Z2dlc3RlZCBvbiB0aGUgbWFpbGluZyBsaXN0IGlzIHRvIHVzZSB0aGlzIGhvb2sgdG8KK2ltcGxlbWVudCBhY2Nlc3MgY29udHJvbCB3aGljaCBpcyBmaW5lciBncmFpbmVkIHRoYW4gdGhlIG9uZQorYmFzZWQgb24gZmlsZXN5c3RlbSBncm91cC4KKworVGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGlzIGhvb2sgaXMgc2VudCB0byAvZGV2L251bGw7IGlmIHlvdQord2FudCB0byByZXBvcnQgc29tZXRoaW5nIHRvIHRoZSBnaXQtc2VuZC1wYWNrIG9uIHRoZSBvdGhlciBlbmQsCit5b3UgY2FuIHJlZGlyZWN0IHlvdXIgb3V0cHV0IHRvIHlvdXIgc3RkZXJyLgorCisKK3Bvc3QtdXBkYXRlCistLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LXJlY2VpdmUtcGFja2Agb24gdGhlIHJlbW90ZSByZXBvc2l0b3J5LAord2hpY2ggaXMgaGFwcGVucyB3aGVuIGEgYGdpdCBwdXNoYCBpcyBkb25lIG9uIGEgbG9jYWwgcmVwb3NpdG9yeS4KK0l0IGV4ZWN1dGVzIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSBvbmNlIGFmdGVyIGFsbCB0aGUgcmVmcyBoYXZlCitiZWVuIHVwZGF0ZWQuCisKK0l0IHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMsIGVhY2ggb2Ygd2hpY2ggaXMgdGhlCituYW1lIG9mIHJlZiB0aGF0IHdhcyBhY3R1YWxseSB1cGRhdGVkLgorCitUaGlzIGhvb2sgaXMgbWVhbnQgcHJpbWFyaWx5IGZvciBub3RpZmljYXRpb24sIGFuZCBjYW5ub3QgYWZmZWN0Cit0aGUgb3V0Y29tZSBvZiBgZ2l0LXJlY2VpdmUtcGFja2AuCisKK1RoZSBwb3N0LXVwZGF0ZSBob29rIGNhbiB0ZWxsIHdoYXQgYXJlIHRoZSBoZWFkcyB0aGF0IHdlcmUgcHVzaGVkLAorYnV0IGl0IGRvZXMgbm90IGtub3cgd2hhdCB0aGVpciBvcmlnaW5hbCBhbmQgdXBkYXRlZCB2YWx1ZXMgYXJlLAorc28gaXQgaXMgYSBwb29yIHBsYWNlIHRvIGRvIGxvZyBvbGQuLm5ldy4KKworVGhlIGRlZmF1bHQgcG9zdC11cGRhdGUgaG9vaywgd2hlbiBlbmFibGVkLCBydW5zCitgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSBkdW1iCit0cmFuc3BvcnRzIChlLmcuLCBodHRwKSB1cC10by1kYXRlLiAgSWYgeW91IGFyZSBwdWJsaXNoaW5nCithIGdpdCByZXBvc2l0b3J5IHRoYXQgaXMgYWNjZXNzaWJsZSB2aWEgaHR0cCwgeW91IHNob3VsZAorcHJvYmFibHkgZW5hYmxlIHRoaXMgaG9vay4KKworVGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGlzIGhvb2sgaXMgc2VudCB0byAvZGV2L251bGw7IGlmIHlvdQord2FudCB0byByZXBvcnQgc29tZXRoaW5nIHRvIHRoZSBnaXQtc2VuZC1wYWNrIG9uIHRoZSBvdGhlciBlbmQsCit5b3UgY2FuIHJlZGlyZWN0IHlvdXIgb3V0cHV0IHRvIHlvdXIgc3RkZXJyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by1pbmRleC5zaCBiL0RvY3VtZW50YXRpb24vaG93dG8taW5kZXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzRhYTMwYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8taW5kZXguc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoCisKK2NhdCA8PFxFT0YKK0dJVCBIb3d0byBJbmRleAorPT09PT09PT09PT09PT09CisKK0hlcmUgaXMgYSBjb2xsZWN0aW9uIG9mIG1haWxpbmcgbGlzdCBwb3N0aW5ncyBtYWRlIGJ5IHZhcmlvdXMKK3Blb3BsZSBkZXNjcmliaW5nIGhvdyB0aGV5IHVzZSBnaXQgaW4gdGhlaXIgd29ya2Zsb3cuCisKK0VPRgorCitmb3IgdHh0CitkbworCXRpdGxlPWBleHByICIkdHh0IiA6ICcuKi9cKC4qXClcLnR4dCQnYAorCWZyb209YHNlZCAtbmUgJworCS9eJC9xCisJL15Gcm9tOlsgCV0veworCQlzLy8vCisJCXMvXlsgCV0qLy8KKwkJcy9bIAldKiQvLworCQlzL14vYnkgLworCQlwCisJfQorCScgIiR0eHQiYAorCisJYWJzdHJhY3Q9YHNlZCAtbmUgJworCS9eQWJzdHJhY3Q6WyAJXS97CisJCXMvXlteIAldKi8vCisJCXgKKwkJcy8uKi8vCisJCXgKKwkJOiBhZ2FpbgorCQkvXlsgCV0veworCQkJcy9eWyAJXSovLworCQkJSAorCQkJbgorCQkJYiBhZ2FpbgorCQl9CisJCXgKKwkJcAorCQlxCisJfScgIiR0eHQiYAorCisJaWYgZ3JlcCAnQ29udGVudC10eXBlOiB0ZXh0L2FzY2lpZG9jJyA+L2Rldi9udWxsICR0eHQKKwl0aGVuCisJCWZpbGU9YGV4cHIgIiR0eHQiIDogJ1woLipcKVwudHh0JCdgLmh0bWwKKwllbHNlCisJCWZpbGU9IiR0eHQiCisJZmkKKworCWVjaG8gIiogbGluazokZmlsZVskdGl0bGVdICRmcm9tCiskYWJzdHJhY3QKKworIgorCitkb25lCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL2lzb2xhdGUtYnVncy13aXRoLWJpc2VjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL2lzb2xhdGUtYnVncy13aXRoLWJpc2VjdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiY2Q0YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vaXNvbGF0ZS1idWdzLXdpdGgtYmlzZWN0LnR4dApAQCAtMCwwICsxLDY1IEBACitGcm9tOglMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHMgKCkgb3NkbCAhIG9yZz4KK1RvOglnaXRAdmdlci5rZXJuZWwub3JnCitEYXRlOgkyMDA1LTExLTA4IDE6MzE6MzQKK1N1YmplY3Q6IFJlYWwtbGlmZSBrZXJuZWwgZGVidWdnaW5nIHNjZW5hcmlvCitBYnN0cmFjdDogU2hvcnQtbi1zd2VldCwgTGludXMgdGVsbHMgdXMgaG93IHRvIGxldmVyYWdlIGBnaXQtYmlzZWN0YCB0byBwZXJmb3JtCisJYnVnIGlzb2xhdGlvbiBvbiBhIHJlcG9zaXRvcnkgd2hlcmUgImdvb2QiIGFuZCAiYmFkIiByZXZpc2lvbnMgYXJlIGtub3duCisJaW4gb3JkZXIgdG8gaWRlbnRpZnkgYSBzdXNwZWN0IGNvbW1pdC4KKworCitIb3cgVG8gVXNlIGdpdC1iaXNlY3QgVG8gSXNvbGF0ZSBhIEJvZ3VzIENvbW1pdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHdheSB0byB1c2UgImdpdCBiaXNlY3QiIGNvdWxkbid0IGJlIGVhc2llci4KKworRmlndXJlIG91dCB3aGF0IHRoZSBvbGRlc3QgYmFkIHN0YXRlIHlvdSBrbm93IGFib3V0IGlzICh0aGF0J3MgdXN1YWxseSB0aGUgCitoZWFkIG9mICJtYXN0ZXIiLCBzaW5jZSB0aGF0J3Mgd2hhdCB5b3UganVzdCB0cmllZCB0byBib290IGFuZCBmYWlsZWQgYXQpLiAKK0Fsc28sIGZpZ3VyZSBvdXQgdGhlIG1vc3QgcmVjZW50IGtub3duLWdvb2QgY29tbWl0ICh1c3VhbGx5IHRoZSBfcHJldmlvdXNfIAora2VybmVsIHlvdSByYW46IGFuZCBpZiB5b3UndmUgb25seSBkb25lIGEgc2luZ2xlICJwdWxsIiBpbiBiZXR3ZWVuLCBpdCAKK3dpbGwgYmUgT1JJR19IRUFEKS4KKworVGhlbiBkbworCisJZ2l0IGJpc2VjdCBzdGFydAorCWdpdCBiaXNlY3QgYmFkIG1hc3RlcgkJPC0gbWFyayAibWFzdGVyIiBhcyB0aGUgYmFkIHN0YXRlCisJZ2l0IGJpc2VjdCBnb29kIE9SSUdfSEVBRAk8LSBtYXJrIE9SSUdfSEVBRCBhcyBnb29kIChvcgorCQkJCQkgICB3aGF0ZXZlciBvdGhlciBrbm93bi1nb29kIAorCQkJCQkgICB0aGluZyB5b3UgYm9vdGVkIGxhc3QpCisKK2FuZCBhdCB0aGlzIHBvaW50ICJnaXQgYmlzZWN0IiB3aWxsIGNodXJuIGZvciBhIHdoaWxlLCBhbmQgdGVsbCB5b3Ugd2hhdCAKK3RoZSBtaWQtcG9pbnQgYmV0d2VlbiB0aG9zZSB0d28gY29tbWl0cyBhcmUsIGFuZCBjaGVjayB0aGF0IHN0YXRlIG91dCBhcyAKK3RoZSBoZWFkIG9mIHRoZSBiZXcgImJpc2VjdCIgYnJhbmNoLgorCitDb21waWxlIGFuZCByZWJvb3QuCisKK0lmIGl0J3MgZ29vZCwganVzdCBkbworCisJZ2l0IGJpc2VjdCBnb29kCQk8LSBtYXJrIGN1cnJlbnQgaGVhZCBhcyBnb29kCisKK290aGVyd2lzZSwgcmVib290IGludG8gYSBnb29kIGtlcm5lbCBpbnN0ZWFkLCBhbmQgZG8gKHN1cnByaXNlIHN1cnByaXNlLCAKK2dpdCByZWFsbHkgaXMgdmVyeSBpbnR1aXRpdmUpOgorCisJZ2l0IGJpc2VjdCBiYWQJCTwtIG1hcmsgY3VycmVudCBoZWFkIGFzIGJhZAorCithbmQgd2hhdGV2ZXIgeW91IGRvLCBnaXQgd2lsbCBzZWxlY3QgYSBuZXcgaGFsZi13YXkgcG9pbnQuIERvIHRoaXMgZm9yIGEgCit3aGlsZSwgdW50aWwgZ2l0IHRlbGxzIHlvdSBleGFjdGx5IHdoaWNoIGNvbW1pdCB3YXMgdGhlIGZpcnN0IGJhZCBjb21taXQuIAorVGhhdCdzIHlvdXIgY3VscHJpdC4KKworSXQgcmVhbGx5IHdvcmtzIHdvbmRlcmZ1bGx5IHdlbGwsIGV4Y2VwdCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgd2FzIAorX2Fub3RoZXJfIGNvbW1pdCB0aGF0IGJyb2tlIHNvbWV0aGluZyBpbiBiZXR3ZWVuLCBsaWtlIGludHJvZHVjZWQgc29tZSAKK3N0dXBpZCBjb21waWxlIGVycm9yLiBJbiB0aGF0IGNhc2UgeW91IHNob3VsZCBub3QgbWFyayB0aGF0IGNvbW1pdCBnb29kIG9yIAorYmFkOiB5b3Ugc2hvdWxkIHRyeSB0byBmaW5kIGFub3RoZXIgY29tbWl0IGNsb3NlLWJ5LCBhbmQgZG8gYSAiZ2l0IHJlc2V0IAorLS1oYXJkIDxuZXdjb21taXQ+IiB0byB0cnkgb3V0IF90aGF0XyBjb21taXQgaW5zdGVhZCwgYW5kIHRoZW4gdGVzdCB0aGF0IAoraW5zdGVhZCAoYW5kIG1hcmsgaXQgZ29vZCBvciBiYWQpLgorCitZb3UgY2FuIGRvICJnaXQgYmlzZWN0IHZpc3VhbGl6ZSIgd2hpbGUgeW91IGRvIGFsbCB0aGlzIHRvIHNlZSB3aGF0J3MgCitnb2luZyBvbiBieSBzdGFydGluZyB1cCBnaXRrIG9uIHRoZSBiaXNlY3Rpb24gcmFuZ2UuCisKK0ZpbmFsbHksIG9uY2UgeW91J3ZlIGZpZ3VyZWQgb3V0IGV4YWN0bHkgd2hpY2ggY29tbWl0IHdhcyBiYWQsIHlvdSBjYW4gCit0aGVuIGdvIGJhY2sgdG8gdGhlIG1hc3RlciBicmFuY2gsIGFuZCB0cnkgcmV2ZXJ0aW5nIGp1c3QgdGhhdCBjb21taXQ6CisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyCisJZ2l0IHJldmVydCA8YmFkLWNvbW1pdC1pZD4KKwordG8gdmVyaWZ5IHRoYXQgdGhlIHRvcC1vZi1rZXJuZWwgd29ya3Mgd2l0aCB0aGF0IHNpbmdsZSBjb21taXQgcmV2ZXJ0ZWQuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vbWFrZS1kaXN0LnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vbWFrZS1kaXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGUzMzBiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9tYWtlLWRpc3QudHh0CkBAIC0wLDAgKzEsNTIgQEAKK0RhdGU6ICAgRnJpLCAxMiBBdWcgMjAwNSAyMjozOTo0OCAtMDcwMCAoUERUKQorRnJvbTogTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorVG86IERhdmUgSm9uZXMgPGRhdmVqQHJlZGhhdC5jb20+CitjYzogZ2l0QHZnZXIua2VybmVsLm9yZworU3ViamVjdDogUmU6IEZ3ZDogUmU6IGdpdCBjaGVja291dCAtZiBicmFuY2ggZG9lc24ndCByZW1vdmUgZXh0cmEgZmlsZXMKK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIExpbnVzIHRhbGtzIGFib3V0IGJ1aWxkaW5nIGEgdGFyYmFsbCwKKyBpbmNyZW1lbnRhbCBwYXRjaCwgYW5kIENoYW5nZUxvZywgZ2l2ZW4gYSBiYXNlIHJlbGVhc2UgYW5kIHR3bworIHJjIHJlbGVhc2VzLCBmb2xsb3dpbmcgdGhlIGNvbnZlbnRpb24gb2YgZ2l2aW5nIHRoZSBwYXRjaCBmcm9tCisgdGhlIGJhc2UgcmVsZWFzZSBhbmQgdGhlIGxhdGVzdCByYywgd2l0aCBDaGFuZ2VMb2cgYmV0d2VlbiB0aGUKKyBsYXN0IHJjIGFuZCB0aGUgbGF0ZXN0IHJjLgorCitPbiBTYXQsIDEzIEF1ZyAyMDA1LCBEYXZlIEpvbmVzIHdyb3RlOgorPgorPiAgPiBHaXQgYWN0dWFsbHkgaGFzIGEgX2xvdF8gb2YgbmlmdHkgdG9vbHMuIEkgZGlkbid0IHJlYWxpemUgdGhhdCBwZW9wbGUKKz4gID4gZGlkbid0IGtub3cgYWJvdXQgc3VjaCBiYXNpYyBzdHVmZiBhcyAiZ2l0LXRhci10cmVlIiBhbmQgImdpdC1scy1maWxlcyIuCis+Cis+IE1heWJlIGl0cyBiZWNhdXNlIHRoaW5ncyBhcmUgbW92aW5nIHNvIGZhc3QgOikgIE9yIG1heWJlIEkganVzdCB3YXNuJ3QKKz4gcGF5aW5nIGF0dGVudGlvbiBvbiB0aGF0IGRheS4gKEkgZXZlbiByZWFkIHRoZSBnaXQgY2hhbmdlcyB2aWEgUlNTLAorPiBzbyBJIHNob3VsZCBoYXZlIG5vIGV4Y3VzZSkuCisKK1dlbGwsIGdpdC10YXItdHJlZSBoYXMgYmVlbiB0aGVyZSBzaW5jZSBsYXRlIEFwcmlsIC0gaXQncyBhY3R1YWxseSBvbmUgb2YKK3Rob3NlIHJlYWxseSBlYXJseSBjb21tYW5kcy4gSSdtIHByZXR0eSBzdXJlIHRoZSBSU1MgZmVlZCBjYW1lIGxhdGVyIDspCisKK0kgdXNlIGl0IGFsbCB0aGUgdGltZSBpbiBkb2luZyByZWxlYXNlcywgaXQncyBhIGxvdCBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhCit0YXIgdHJlZSBieSByZWFkaW5nIHRoZSBmaWxlc3lzdGVtIChldmVuIGlmIHlvdSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoaW5ncworb3V0KS4gQSBoaWRkZW4gcGVhcmwuCisKK1RoaXMgaXMgbXkgY3JhcHB5ICJyZWxlYXNlLXNjcmlwdCI6CisKKyAgICAgICAgW3RvcnZhbGRzQGc1IH5dJCBjYXQgYmluL3JlbGVhc2Utc2NyaXB0CisgICAgICAgICMhL2Jpbi9zaAorICAgICAgICBzdGFibGU9IiQxIgorICAgICAgICBsYXN0PSIkMiIKKyAgICAgICAgbmV3PSIkMyIKKyAgICAgICAgZWNobyAiIyBnaXQtdGFnIHYkbmV3IgorICAgICAgICBlY2hvICJnaXQtdGFyLXRyZWUgdiRuZXcgbGludXgtJG5ldyB8IGd6aXAgLTkgPiAuLi9saW51eC0kbmV3LnRhci5neiIKKyAgICAgICAgZWNobyAiZ2l0LWRpZmYtdHJlZSAtcCB2JHN0YWJsZSB2JG5ldyB8IGd6aXAgLTkgPiAuLi9wYXRjaC0kbmV3Lmd6IgorICAgICAgICBlY2hvICJnaXQtcmV2LWxpc3QgLS1wcmV0dHkgdiRuZXcgXnYkbGFzdCA+IC4uL0NoYW5nZUxvZy0kbmV3IgorICAgICAgICBlY2hvICJnaXQtcmV2LWxpc3QgLS1wcmV0dHk9c2hvcnQgdiRuZXcgXnYkbGFzdCB8IGdpdC1zaG9ydGxvZyA+IC4uL1Nob3J0TG9nIgorICAgICAgICBlY2hvICJnaXQtZGlmZi10cmVlIC1wIHYkbGFzdCB2JG5ldyB8IGdpdC1hcHBseSAtLXN0YXQgPiAuLi9kaWZmc3RhdC0kbmV3IgorCithbmQgd2hlbiBJIHdhbnQgdG8gZG8gYSBuZXcga2VybmVsIHJlbGVhc2UgSSBsaXRlcmFsbHkgZmlyc3QgdGFnIGl0LCBhbmQKK3RoZW4gZG8KKworICAgICAgICByZWxlYXNlLXNjcmlwdCAyLjYuMTIgMi42LjEzLXJjNiAyLjYuMTMtcmM3CisKK2FuZCBjaGVjayB0aGF0IHRoaW5ncyBsb29rIHNhbmUsIGFuZCB0aGVuIGp1c3QgY3V0LWFuZC1wYXN0ZSB0aGUgY29tbWFuZHMuCisKK1llYWgsIGl0J3Mgc3R1cGlkLgorCisgICAgICAgICAgICAgICAgTGludXMKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtYW5kLWVkaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtYW5kLWVkaXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmM1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1hbmQtZWRpdC50eHQKQEAgLTAsMCArMSw4MSBAQAorRGF0ZToJU2F0LCAxMyBBdWcgMjAwNSAyMjoxNjowMiAtMDcwMCAoUERUKQorRnJvbToJTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorVG86CVN0ZXZlIEZyZW5jaCA8c21mcmVuY2hAYXVzdGluLnJyLmNvbT4KK2NjOglnaXRAdmdlci5rZXJuZWwub3JnCitTdWJqZWN0OiBSZTogc2VuZGluZyBjaGFuZ2VzZXRzIGZyb20gdGhlIG1pZGRsZSBvZiBhIGdpdCB0cmVlCitBYnN0cmFjdDogSW4gdGhpcyBhcnRpY2xlLCBMaW51cyBkZW1vbnN0cmF0ZXMgaG93IGEgYnJva2VuIGNvbW1pdAorIGluIGEgc2VxdWVuY2Ugb2YgY29tbWl0cyBjYW4gYmUgcmVtb3ZlZCBieSByZXdpbmRpbmcgdGhlIGhlYWQgYW5kCisgcmVhcHBseWluZyBzZWxlY3RlZCBjaGFuZ2VzLgorCitPbiBTYXQsIDEzIEF1ZyAyMDA1LCBMaW51cyBUb3J2YWxkcyB3cm90ZToKKworPiBUaGF0J3MgY29ycmVjdC4gU2FtZSB0aGluZ3MgYXBwbHk6IHlvdSBjYW4gbW92ZSBhIHBhdGNoIG92ZXIsIGFuZCBjcmVhdGUgYSAKKz4gbmV3IG9uZSB3aXRoIGEgbW9kaWZpZWQgY29tbWVudCwgYnV0IGJhc2ljYWxseSB0aGUgX29sZF8gY29tbWl0IHdpbGwgYmUgCis+IGltbXV0YWJsZS4KKworTGV0IG1lIGNsYXJpZnkuCisKK1lvdSBjYW4gZW50aXJlbHkgX2Ryb3BfIG9sZCBicmFuY2hlcywgc28gY29tbWl0cyBtYXkgYmUgaW1tdXRhYmxlLCBidXQKK25vdGhpbmcgZm9yY2VzIHlvdSB0byBrZWVwIHRoZW0uIE9mIGNvdXJzZSwgd2hlbiB5b3UgZHJvcCBhIGNvbW1pdCwgeW91J2xsIAorYWx3YXlzIGVuZCB1cCBkcm9wcGluZyBhbGwgdGhlIGNvbW1pdHMgdGhhdCBkZXBlbmRlZCBvbiBpdCwgYW5kIGlmIHlvdSAKK2FjdHVhbGx5IGdvdCBzb21lYm9keSBlbHNlIHRvIHB1bGwgdGhhdCBjb21taXQgeW91IGNhbid0IGRyb3AgaXQgZnJvbSAKK190aGVpcl8gcmVwb3NpdG9yeSwgYnV0IHVuZG9pbmcgdGhpbmdzIGlzIG5vdCBpbXBvc3NpYmxlLgorCitGb3IgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgeW91J3ZlIG1hZGUgYSBtZXNzIG9mIHRoaW5nczogeW91J3ZlIGNvbW1pdHRlZAordGhyZWUgY29tbWl0cyAib2xkLT5hLT5iLT5jIiwgYW5kIHlvdSBub3RpY2UgdGhhdCAiYSIgd2FzIGJyb2tlbiwgYnV0IHlvdQord2FudCB0byBzYXZlICJiIiBhbmQgImMiLiBXaGF0IHlvdSBjYW4gZG8gaXMKKworCSMgQ3JlYXRlIGEgYnJhbmNoICJicm9rZW4iIHRoYXQgaXMgdGhlIGN1cnJlbnQgY29kZQorCSMgZm9yIHJlZmVyZW5jZQorCWdpdCBicmFuY2ggYnJva2VuCisKKwkjIFJlc2V0IHRoZSBtYWluIGJyYW5jaCB0byB0aHJlZSBwYXJlbnRzIGJhY2s6IHRoaXMgCisJIyBlZmZlY3RpdmVseSB1bmRvZXMgdGhlIHRocmVlIHRvcCBjb21taXRzCisJZ2l0IHJlc2V0IEhFQUReXl4KKwlnaXQgY2hlY2tvdXQgLWYKKworCSMgQ2hlY2sgdGhlIHJlc3VsdCB2aXN1YWxseSB0byBtYWtlIHN1cmUgeW91IGtub3cgd2hhdCdzCisJIyBnb2luZyBvbgorCWdpdGsgLS1hbGwKKworCSMgUmUtYXBwbHkgdGhlIHR3byB0b3Agb25lcyBmcm9tICJicm9rZW4iCisJIworCSMgRmlyc3QgInBhcmVudCBvZiBicm9rZW4iIChha2EgYik6CisJZ2l0LWRpZmYtdHJlZSAtcCBicm9rZW5eIHwgZ2l0LWFwcGx5IC0taW5kZXgKKwlnaXQgY29tbWl0IC0tcmVlZGl0PWJyb2tlbl4KKworCSMgVGhlbiAidG9wIG9mIGJyb2tlbiIgKGFrYSBjKToKKwlnaXQtZGlmZi10cmVlIC1wIGJyb2tlbiB8IGdpdC1hcHBseSAtLWluZGV4CisJZ2l0IGNvbW1pdCAtLXJlZWRpdD1icm9rZW4KKworYW5kIHlvdSd2ZSBub3cgcmUtYXBwbGllZCAoYW5kIHBvc3NpYmx5IGVkaXRlZCB0aGUgY29tbWVudHMpIHRoZSB0d28KK2NvbW1pdHMgYi9jLCBhbmQgY29tbWl0ICJhIiBpcyBiYXNpY2FsbHkgZ29uZSAoaXQgc3RpbGwgZXhpc3RzIGluIHRoZQorImJyb2tlbiIgYnJhbmNoLCBvZiBjb3Vyc2UpLgorCitGaW5hbGx5LCBjaGVjayBvdXQgdGhlIGVuZCByZXN1bHQgYWdhaW46CisKKwkjIExvb2sgYXQgdGhlIG5ldyBjb21taXQgaGlzdG9yeQorCWdpdGsgLS1hbGwKKwordG8gc2VlIHRoYXQgZXZlcnl0aGluZyBsb29rcyBzZW5zaWJsZS4KKworQW5kIHRoZW4sIHlvdSBjYW4ganVzdCByZW1vdmUgdGhlIGJyb2tlbiBicmFuY2ggaWYgeW91IGRlY2lkZSB5b3UgcmVhbGx5IAorZG9uJ3Qgd2FudCBpdDoKKworCSMgcmVtb3ZlICdicm9rZW4nIGJyYW5jaAorCWdpdCBicmFuY2ggLWQgYnJva2VuCisKKwkjIFBydW5lIG9sZCBvYmplY3RzIGlmIHlvdSdyZSByZWFsbHkgcmVhbGx5IHN1cmUKKwlnaXQgcHJ1bmUKKworQW5kIHllYWgsIEknbSBzdXJlIHRoZXJlIGFyZSBvdGhlciB3YXlzIG9mIGRvaW5nIHRoaXMuIEFuZCBhcyB1c3VhbCwgdGhlIAorYWJvdmUgaXMgdG90YWxseSB1bnRlc3RlZCwgYW5kIEkganVzdCB3cm90ZSBpdCBkb3duIGluIHRoaXMgZW1haWwsIHNvIGlmIAorSSd2ZSBkb25lIHNvbWV0aGluZyB3cm9uZywgeW91J2xsIGhhdmUgdG8gZmlndXJlIGl0IG91dCBvbiB5b3VyIG93biA7KQorCisJCQlMaW51cworLQorVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGdpdCIgaW4KK3RoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCitNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1mcm9tLWludGVybmFsLWJyYW5jaC50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1mcm9tLWludGVybmFsLWJyYW5jaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkNGE5MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vcmViYXNlLWZyb20taW50ZXJuYWwtYnJhbmNoLnR4dApAQCAtMCwwICsxLDE2NSBAQAorRnJvbToJSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorVG86CWdpdEB2Z2VyLmtlcm5lbC5vcmcKK0NjOglQZXRyIEJhdWRpcyA8cGFza3lAc3VzZS5jej4sIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK1N1YmplY3Q6IFJlOiBzZW5kaW5nIGNoYW5nZXNldHMgZnJvbSB0aGUgbWlkZGxlIG9mIGEgZ2l0IHRyZWUKK0RhdGU6CVN1biwgMTQgQXVnIDIwMDUgMTg6Mzc6MzkgLTA3MDAKK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIEpDIHRhbGtzIGFib3V0IGhvdyBoZSByZWJhc2VzIHRoZQorIHB1YmxpYyAicHUiIGJyYW5jaCB1c2luZyB0aGUgY29yZSBHSVQgdG9vbHMgd2hlbiBoZSB1cGRhdGVzCisgdGhlICJtYXN0ZXIiIGJyYW5jaCwgYW5kIGhvdyAicmViYXNlIiB3b3Jrcy4gIEFsc28gZGlzY3Vzc2VkCisgaXMgaG93IHRoaXMgYXBwbGllcyB0byBpbmRpdmlkdWFsIGRldmVsb3BlcnMgd2hvIHNlbmRzIHBhdGNoZXMKKyB1cHN0cmVhbS4KKworUGV0ciBCYXVkaXMgPHBhc2t5QHN1c2UuY3o+IHdyaXRlczoKKworPiBEZWFyIGRpYXJ5LCBvbiBTdW4sIEF1ZyAxNCwgMjAwNSBhdCAwOTo1NzoxM0FNIENFU1QsIEkgZ290IGEgbGV0dGVyCis+IHdoZXJlIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gdG9sZCBtZSB0aGF0Li4uCis+PiBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IHdyaXRlczoKKz4+IAorPj4gPiBKdW5pbywgbWF5YmUgeW91IHdhbnQgdG8gdGFsayBhYm91dCBob3cgeW91IG1vdmUgcGF0Y2hlcyBmcm9tIHlvdXIgInB1IiAKKz4+ID4gYnJhbmNoIHRvIHRoZSByZWFsIGJyYW5jaGVzLgorPj4gCis+IEFjdHVhbGx5LCB3b3VsZG4ndCB0aGlzIGJlIGFsc28gcHJlY2lzZWx5IGZvciB3aGF0IFN0R0lUIGlzIGludGVuZGVkIHRvPworCitFeGFjdGx5IG15IGZlZWxpbmcuICBJIHdhcyBzb3J0IG9mIHdhaXRpbmcgZm9yIENhdGFsaW4gdG8gc3BlYWsKK3VwLiAgV2l0aCBpdHMgYmFzaW5nIHBoaWxvc29waGljYWwgYW5jZXN0cnkgb24gcXVpbHQsIHRoaXMgaXMKK3RoZSBraW5kIG9mIHRhc2sgU3RHSVQgaXMgZGVzaWduZWQgdG8gZG8uCisKK0kganVzdCBoYXZlIGRvbmUgYSBzaW1wbGVyIG9uZSwgdGhpcyB0aW1lIHVzaW5nIG9ubHkgdGhlIGNvcmUKK0dJVCB0b29scy4KKworSSBoYWQgYSBoYW5kZnVsIGNvbW1pdHMgdGhhdCB3ZXJlIGFoZWFkIG9mIG1hc3RlciBpbiBwdSwgYW5kIEkKK3dhbnRlZCB0byBhZGQgc29tZSBkb2N1bWVudGF0aW9uIGJ5cGFzc2luZyBteSB1c3VhbCBoYWJpdCBvZgorcGxhY2luZyBuZXcgdGhpbmdzIGluIHB1IGZpcnN0LiAgQXQgdGhlIGJlZ2lubmluZywgdGhlIGNvbW1pdAorYW5jZXN0cnkgZ3JhcGggbG9va2VkIGxpa2UgdGhpczoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqInB1IiBoZWFkCisgICAgbWFzdGVyIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisKK1NvIEkgc3RhcnRlZCBmcm9tIG1hc3RlciwgbWFkZSBhIGJ1bmNoIG9mIGVkaXRzLCBhbmQgY29tbWl0dGVkOgorCisgICAgJCBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgJCBjZCBEb2N1bWVudGF0aW9uOyBlZCBnaXQudHh0IC4uLgorICAgICQgY2QgLi47IGdpdCBhZGQgRG9jdW1lbnRhdGlvbi8qLnR4dAorICAgICQgZ2l0IGNvbW1pdCAtcworCitBZnRlciB0aGUgY29tbWl0LCB0aGUgYW5jZXN0cnkgZ3JhcGggd291bGQgbG9vayBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoicHUiIGhlYWQKKyAgICBtYXN0ZXJeIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisgICAgICAgICAgXAorICAgICAgICAgICAgXC0tLT4gbWFzdGVyCisKK1RoZSBvbGQgbWFzdGVyIGlzIG5vdyBtYXN0ZXJeICh0aGUgZmlyc3QgcGFyZW50IG9mIHRoZSBtYXN0ZXIpLgorVGhlIG5ldyBtYXN0ZXIgY29tbWl0IGhvbGRzIG15IGRvY3VtZW50YXRpb24gdXBkYXRlcy4KKworTm93IEkgaGF2ZSB0byBkZWFsIHdpdGggInB1IiBicmFuY2guCisKK1RoaXMgaXMgdGhlIGtpbmQgb2Ygc2l0dWF0aW9uIEkgdXNlZCB0byBoYXZlIGFsbCB0aGUgdGltZSB3aGVuCitMaW51cyB3YXMgdGhlIG1haW50YWluZXIgYW5kIEkgd2FzIGEgY29udHJpYnV0b3IsIHdoZW4geW91IGxvb2sKK2F0ICJtYXN0ZXIiIGJyYW5jaCBiZWluZyB0aGUgIm1haW50YWluZXIiIGJyYW5jaCwgYW5kICJwdSIKK2JyYW5jaCBiZWluZyB0aGUgImNvbnRyaWJ1dG9yIiBicmFuY2guICBZb3VyIHdvcmsgc3RhcnRlZCBhdCB0aGUKK3RpcCBvZiB0aGUgIm1haW50YWluZXIiIGJyYW5jaCBzb21lIHRpbWUgYWdvLCB5b3UgbWFkZSBhIGxvdCBvZgorcHJvZ3Jlc3MgaW4gdGhlIG1lYW50aW1lLCBhbmQgbm93IHRoZSBtYWludGFpbmVyIGJyYW5jaCBoYXMgc29tZQorb3RoZXIgY29tbWl0cyB5b3UgZG8gbm90IGhhdmUgeWV0LiAgQW5kICJnaXQgcmViYXNlIiB3YXMgd3JpdHRlbgord2l0aCB0aGUgZXhwbGljaXQgcHVycG9zZSBvZiBoZWxwaW5nIHRvIG1haW50YWluIGJyYW5jaGVzIGxpa2UKKyJwdSIuICBZb3UgX2NvdWxkXyBtZXJnZSBtYXN0ZXIgdG8gcHUgYW5kIGtlZXAgZ29pbmcsIGJ1dCBpZiB5b3UKK2V2ZW50dWFsbHkgd2FudCB0byBjaGVycnlwaWNrIGFuZCBtZXJnZSBzb21lIGJ1dCBub3QgbmVjZXNzYXJpbHkKK2FsbCBjaGFuZ2VzIGJhY2sgdG8gdGhlIG1hc3RlciBicmFuY2gsIGl0IG9mdGVuIG1ha2VzIGxhdGVyCitvcGVyYXRpb25zIGZvciBfeW91XyBlYXNpZXIgaWYgeW91IHJlYmFzZSAoaS5lLiBjYXJyeSBmb3J3YXJkCit5b3VyIGNoYW5nZXMpICJwdSIgcmF0aGVyIHRoYW4gbWVyZ2UuICBTbyBJIHJhbiAiZ2l0IHJlYmFzZSI6CisKKyAgICAkIGdpdCBjaGVja291dCBwdQorICAgICQgZ2l0IHJlYmFzZSBtYXN0ZXIgcHUKKworV2hhdCB0aGlzIGRvZXMgaXMgdG8gcGljayBhbGwgdGhlIGNvbW1pdHMgc2luY2UgdGhlIGN1cnJlbnQKK2JyYW5jaCAobm90ZSB0aGF0IEkgbm93IGFtIG9uICJwdSIgYnJhbmNoKSBmb3JrZWQgZnJvbSB0aGUKK21hc3RlciBicmFuY2gsIGFuZCBmb3J3YXJkIHBvcnQgdGhlc2UgY2hhbmdlcy4KKworICAgIG1hc3Rlcl4gLS0+ICMxIC0tPiAjMiAtLT4gIzMKKyAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoicHUiIGhlYWQKKyAgICAgICAgICAgIFwtLS0+IG1hc3RlciAtLT4gIzEnIC0tPiAjMicgLS0+ICMzJworCitUaGUgZGlmZiBiZXR3ZWVuIG1hc3Rlcl4gYW5kICMxIGlzIGFwcGxpZWQgdG8gbWFzdGVyIGFuZAorY29tbWl0dGVkIHRvIGNyZWF0ZSAjMScgY29tbWl0IHdpdGggdGhlIGNvbW1pdCBpbmZvcm1hdGlvbiAobG9nLAorYXV0aG9yIGFuZCBkYXRlKSB0YWtlbiBmcm9tIGNvbW1pdCAjMS4gIE9uIHRvcCBvZiB0aGF0ICMyJyBhbmQgIzMnCitjb21taXRzIGFyZSBtYWRlIHNpbWlsYXJseSBvdXQgb2YgIzIgYW5kICMzIGNvbW1pdHMuCisKK09sZCAjMyBpcyBub3QgcmVjb3JkZWQgaW4gYW55IG9mIHRoZSAuZ2l0L3JlZnMvaGVhZHMvIGZpbGUKK2FueW1vcmUsIHNvIGFmdGVyIGRvaW5nIHRoaXMgeW91IHdpbGwgaGF2ZSBkYW5nbGluZyBjb21taXQgaWYKK3lvdSByYW4gZnNjay1jYWNoZSwgd2hpY2ggaXMgbm9ybWFsLiAgQWZ0ZXIgdGVzdGluZyAicHUiLCB5b3UKK2NhbiBydW4gImdpdCBwcnVuZSIgdG8gZ2V0IHJpZCBvZiB0aG9zZSBvcmlnaW5hbCB0aHJlZSBjb21taXRzLgorCitXaGlsZSBJIGFtIHRhbGtpbmcgYWJvdXQgImdpdCByZWJhc2UiLCBJIHNob3VsZCB0YWxrIGFib3V0IGhvdwordG8gZG8gY2hlcnJ5cGlja2luZyB1c2luZyBvbmx5IHRoZSBjb3JlIEdJVCB0b29scy4KKworTGV0J3MgZ28gYmFjayB0byB0aGUgZWFybGllciBwaWN0dXJlLCB3aXRoIGRpZmZlcmVudCBsYWJlbHMuCisKK1lvdSwgYXMgYW4gaW5kaXZpZHVhbCBkZXZlbG9wZXIsIGNsb25lZCB1cHN0cmVhbSByZXBvc2l0b3J5IGFuZAorbWFkZSBhIGNvdXBsZSBvZiBjb21taXRzIG9uIHRvcCBvZiBpdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnlvdXIgIm1hc3RlciIgaGVhZAorICAgdXBzdHJlYW0gLS0+ICMxIC0tPiAjMiAtLT4gIzMKKworWW91IHdvdWxkIHdhbnQgY2hhbmdlcyAjMiBhbmQgIzMgaW5jb3Jwb3JhdGVkIGluIHRoZSB1cHN0cmVhbSwKK3doaWxlIHlvdSBmZWVsIHRoYXQgIzEgbWF5IG5lZWQgZnVydGhlciBpbXByb3ZlbWVudHMuICBTbyB5b3UKK3ByZXBhcmUgIzIgYW5kICMzIGZvciBlLW1haWwgc3VibWlzc2lvbi4KKworICAgICQgZ2l0IGZvcm1hdC1wYXRjaCBtYXN0ZXJeXiBtYXN0ZXIKKworVGhpcyBjcmVhdGVzIHR3byBmaWxlcywgMDAwMS1YWFhYLnR4dCBhbmQgMDAwMi1YWFhYLnR4dC4gIFNlbmQKK3RoZW0gb3V0ICJUbzogIiB5b3VyIHByb2plY3QgbWFpbnRhaW5lciBhbmQgIkNjOiAiIHlvdXIgbWFpbGluZworbGlzdC4gIFlvdSBjb3VsZCB1c2UgY29udHJpYnV0ZWQgc2NyaXB0IGdpdC1zZW5kLWVtYWlsIGlmCit5b3VyIGhvc3QgaGFzIG5lY2Vzc2FyeSBwZXJsIG1vZHVsZXMgZm9yIHRoaXMsIGJ1dCB5b3VyIHVzdWFsCitNVUEgd291bGQgZG8gYXMgbG9uZyBhcyBpdCBkb2VzIG5vdCBjb3JydXB0IHdoaXRlc3BhY2VzIGluIHRoZQorcGF0Y2guCisKK1RoZW4geW91IHdvdWxkIHdhaXQsIGFuZCB5b3UgZmluZCBvdXQgdGhhdCB0aGUgdXBzdHJlYW0gcGlja2VkCit1cCB5b3VyIGNoYW5nZXMsIGFsb25nIHdpdGggb3RoZXIgY2hhbmdlcy4KKworICAgd2hlcmUgICAgICAgICAgICAgICAgICAgICAgKnlvdXIgIm1hc3RlciIgaGVhZAorICB1cHN0cmVhbSAtLT4gIzEgLS0+ICMyIC0tPiAjMworICAgIHVzZWQgICBcIAorICAgdG8gYmUgICAgIFwtLT4gI0EgLS0+ICMyJyAtLT4gIzMnIC0tPiAjQiAtLT4gI0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cHN0cmVhbSBoZWFkCisKK1RoZSB0d28gY29tbWl0cyAjMicgYW5kICMzJyBpbiB0aGUgYWJvdmUgcGljdHVyZSByZWNvcmQgdGhlIHNhbWUKK2NoYW5nZXMgeW91ciBlLW1haWwgc3VibWlzc2lvbiBmb3IgIzIgYW5kICMzIGNvbnRhaW5lZCwgYnV0Citwcm9iYWJseSB3aXRoIHRoZSBuZXcgc2lnbi1vZmYgbGluZSBhZGRlZCBieSB0aGUgdXBzdGVhbQorbWFpbnRhaW5lciBhbmQgZGVmaW5pdGVseSB3aXRoIGRpZmZlcmVudCBjb21taXR0ZXIgYW5kIGFuY2VzdHJ5CitpbmZvcm1hdGlvbiwgdGhleSBhcmUgZGlmZmVyZW50IG9iamVjdHMgZnJvbSAjMiBhbmQgIzMgY29tbWl0cy4KKworWW91IGZldGNoIGZyb20gdXBzdHJlYW0sIGJ1dCBub3QgbWVyZ2UuCisKKyAgICAkIGdpdCBmZXRjaCB1cHN0cmVhbQorCitUaGlzIGxlYXZlcyB0aGUgdXBkYXRlZCB1cHN0cmVhbSBoZWFkIGluIC5naXQvRkVUQ0hfSEVBRCBidXQKK2RvZXMgbm90IHRvdWNoIHlvdXIgLmdpdC9IRUFEIG5vciAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyLiAgCitZb3UgcnVuICJnaXQgcmViYXNlIiBub3cuCisKKyAgICAkIGdpdCByZWJhc2UgRkVUQ0hfSEVBRCBtYXN0ZXIKKworRWFybGllciwgSSBzYWlkIHRoYXQgcmViYXNlIGFwcGxpZXMgYWxsIHRoZSBjb21taXRzIGZyb20geW91cgorYnJhbmNoIG9uIHRvcCBvZiB0aGUgdXBzdHJlYW0gaGVhZC4gIFdlbGwsIEkgbGllZC4gICJnaXQgcmViYXNlIgoraXMgYSBiaXQgc21hcnRlciB0aGFuIHRoYXQgYW5kIG5vdGljZXMgdGhhdCAjMiBhbmQgIzMgbmVlZCBub3QKK2JlIGFwcGxpZWQsIHNvIGl0IG9ubHkgYXBwbGllcyAjMS4gIFRoZSBjb21taXQgYW5jZXN0cnkgZ3JhcGgKK2JlY29tZXMgc29tZXRoaW5nIGxpa2UgdGhpczoKKworICAgd2hlcmUgICAgICAgICAgICAgICAgICAgICAqeW91ciBvbGQgIm1hc3RlciIgaGVhZAorICB1cHN0cmVhbSAtLT4gIzEgLS0+ICMyIC0tPiAjMworICAgIHVzZWQgICBcICAgICAgICAgICAgICAgICAgICAgIHlvdXIgbmV3ICJtYXN0ZXIiIGhlYWQqCisgICB0byBiZSAgICAgXC0tPiAjQSAtLT4gIzInIC0tPiAjMycgLS0+ICNCIC0tPiAjQyAtLT4gIzEnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQKKworQWdhaW4sICJnaXQgcHJ1bmUiIHdvdWxkIGRpc2NhcmQgdGhlIGRpc3VzZWQgY29tbWl0cyAjMS0jMyBhbmQKK3lvdSBjb250aW51ZSBvbiBzdGFydGluZyBmcm9tIHRoZSBuZXcgIm1hc3RlciIgaGVhZCwgd2hpY2ggaXMKK3RoZSAjMScgY29tbWl0LgorCistamMKKworLQorVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGdpdCIgaW4KK3RoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCitNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYnVpbGQtZnJvbS11cGRhdGUtaG9vay50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYnVpbGQtZnJvbS11cGRhdGUtaG9vay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2MjFiNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vcmVidWlsZC1mcm9tLXVwZGF0ZS1ob29rLnR4dApAQCAtMCwwICsxLDg3IEBACitTdWJqZWN0OiBbSE9XVE9dIFVzaW5nIHBvc3QtdXBkYXRlIGhvb2sKK01lc3NhZ2UtSUQ6IDw3dnk4Nm82dXN4LmZzZkBhc3NpZ25lZC1ieS1kaGNwLmNveC5uZXQ+CitGcm9tOiBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CitEYXRlOiBGcmksIDI2IEF1ZyAyMDA1IDE4OjE5OjEwIC0wNzAwCitBYnN0cmFjdDogSW4gdGhpcyBob3ctdG8gYXJ0aWNsZSwgSkMgdGFsa3MgYWJvdXQgaG93IGhlCisgdXNlcyB0aGUgcG9zdC11cGRhdGUgaG9vayB0byBhdXRvbWF0ZSBnaXQgZG9jdW1lbnRhdGlvbiBwYWdlCisgc2hvd24gYXQgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvLgorCitUaGUgcGFnZXMgdW5kZXIgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvCithcmUgYnVpbHQgZnJvbSBEb2N1bWVudGF0aW9uLyBkaXJlY3Rvcnkgb2YgdGhlIGdpdC5naXQgcHJvamVjdAorYW5kIG5lZWRlZCB0byBiZSBrZXB0IHVwLXRvLWRhdGUuICBUaGUgd3d3Lmtlcm5lbC5vcmcvIHNlcnZlcnMKK2FyZSBtaXJyb3JlZCBhbmQgSSB3YXMgdG9sZCB0aGF0IHRoZSBvcmlnaW4gb2YgdGhlIG1pcnJvciBpcyBvbgordGhlIG1hY2hpbmUgJHNvbWUua2VybmVsLm9yZywgb24gd2hpY2ggSSB3YXMgZ2l2ZW4gYW4gYWNjb3VudAord2hlbiBJIHRvb2sgb3ZlciBnaXQgbWFpbnRhaW5lcnNoaXAgZnJvbSBMaW51cy4KKworVGhlIGRpcmVjdG9yaWVzIHJlbGV2YW50IHRvIHRoaXMgaG93LXRvIGFyZSB0aGVzZSB0d286CisKKyAgICAvcHViL3NjbS9naXQvZ2l0LmdpdC8JVGhlIHB1YmxpYyBnaXQgcmVwb3NpdG9yeS4KKyAgICAvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8JVGhlIEhUTUwgZG9jdW1lbnRhdGlvbiBwYWdlLgorCitTbyBJIG1hZGUgYSByZXBvc2l0b3J5IHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uIHVuZGVyIG15Citob21lIGRpcmVjdG9yeSBvdmVyIHRoZXJlLgorCisgICAgJCBjZAorICAgICQgbWtkaXIgZG9jLWdpdCAmJiBjZCBkb2MtZ2l0CisgICAgJCBnaXQgY2xvbmUgL3B1Yi9zY20vZ2l0L2dpdC5naXQvIGRvY2dlbgorCitXaGF0IG5lZWRzIHRvIGhhcHBlbiBpcyB0byB1cGRhdGUgdGhlICRIT01FL2RvYy1naXQvZG9jZ2VuLword29ya2luZyB0cmVlLCBidWlsZCBIVE1MIGRvY3MgdGhlcmUgYW5kIGluc3RhbGwgdGhlIHJlc3VsdCBpbgorL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvIGRpcmVjdG9yeS4gIFNvIEkgd3JvdGUgYSBsaXR0bGUKK3NjcmlwdDoKKworICAgICQgY2F0ID5kb2RvZG9jLnNoIDw8XEVPRgorICAgICMhL2Jpbi9zaAorICAgIGNkICRIT01FL2RvYy1naXQvZG9jZ2VuIHx8IGV4aXQKKworICAgIHVuc2V0IEdJVF9ESVIKKworICAgIGdpdCBwdWxsIC9wdWIvc2NtL2dpdC9naXQuZ2l0LyBtYXN0ZXIgJiYKKyAgICBjZCBEb2N1bWVudGF0aW9uICYmCisgICAgbWFrZSBpbnN0YWxsLXdlYmRvYworICAgIEVPRgorCitJbml0aWFsbHkgSSB1c2VkIHRvIHJ1biB0aGlzIGJ5IGhhbmQgd2hlbmV2ZXIgSSBwdXNoIGludG8gdGhlCitwdWJsaWMgZ2l0IHJlcG9zaXRvcnkuICBUaGVuIEkgZGlkIGEgY3JvbiBqb2IgdGhhdCByYW4gdHdpY2UgYQorZGF5LiAgVGhlIGN1cnJlbnQgcm91bmQgdXNlcyB0aGUgcG9zdC11cGRhdGUgaG9vayBtZWNoYW5pc20sCitsaWtlIHRoaXM6CisKKyAgICAkIGNhdCA+L3B1Yi9zY20vZ2l0L2dpdC5naXQvaG9va3MvcG9zdC11cGRhdGUgPDxcRU9GCisgICAgIyEvYmluL3NoCisgICAgIworICAgICMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBwcmVwYXJlIGEgcGFja2VkIHJlcG9zaXRvcnkgZm9yIHVzZSBvdmVyCisgICAgIyBkdW1iIHRyYW5zcG9ydHMuCisgICAgIworICAgICMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZSBieSAiY2htb2QgK3ggcG9zdC11cGRhdGUiLgorCisgICAgY2FzZSAiICQqICIgaW4KKyAgICAqJyByZWZzL2hlYWRzL21hc3RlciAnKikKKyAgICAgICAgICAgIGVjaG8gJEhPTUUvZG9jLWdpdC9kb2RvZG9jLnNoIHwgYXQgbm93CisgICAgICAgICAgICA7OworICAgIGVzYWMKKyAgICBleGVjIGdpdC11cGRhdGUtc2VydmVyLWluZm8KKyAgICBFT0YKKyAgICAkIGNobW9kICt4IC9wdWIvc2NtL2dpdC9naXQuZ2l0L2hvb2tzL3Bvc3QtdXBkYXRlCisKK1RoZXJlIGFyZSBmb3VyIHRoaW5ncyB3b3J0aCBtZW50aW9uaW5nOgorCisgLSBUaGUgdXBkYXRlLWhvb2sgaXMgcnVuIGFmdGVyIHRoZSByZXBvc2l0b3J5IGFjY2VwdHMgYSAiZ2l0CisgICBwdXNoIiwgdW5kZXIgbXkgdXNlciBwcml2aWxlZ2UuICBJdCBpcyBnaXZlbiB0aGUgZnVsbCBuYW1lcworICAgb2YgcmVmcyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIGFzIGFyZ3VtZW50cy4gIE15IHBvc3QtdXBkYXRlCisgICBydW5zIHRoZSBkb2RvZG9jLnNoIHNjcmlwdCBvbmx5IHdoZW4gdGhlIG1hc3RlciBoZWFkIGlzCisgICB1cGRhdGVkLgorCisgLSBXaGVuIHVwZGF0ZS1ob29rIGlzIHJ1biwgR0lUX0RJUiBpcyBzZXQgdG8gJy4nIGJ5IHRoZSBjYWxsaW5nCisgICByZWNlaXZlLXBhY2suICBUaGlzIGlzIGluaGVyaXRlZCBieSB0aGUgZG9kb2RvYy5zaCBydW4gdmlhCisgICB0aGUgImF0IiBjb21tYW5kLCBhbmQgbmVlZHMgdG8gYmUgdW5zZXQ7IG90aGVyd2lzZSwgImdpdAorICAgcHVsbCIgaXQgZG9lcyBpbnRvICRIT01FL2RvYy1naXQvZG9jZ2VuLyByZXBvc2l0b3J5IHdvdWxkIG5vdAorICAgd29yayBjb3JyZWN0bHkuCisKKyAtIFRoZSBzdGRvdXQgb2YgdXBkYXRlIGhvb2sgc2NyaXB0IGlzIG5vdCBjb25uZWN0ZWQgdG8gZ2l0CisgICBwdXNoOyBJIHJ1biB0aGUgaGVhdnkgcGFydCBvZiB0aGUgY29tbWFuZCBpbnNpZGUgImF0IiwgdG8KKyAgIHJlY2VpdmUgdGhlIGV4ZWN1dGlvbiByZXBvcnQgdmlhIGUtbWFpbC4KKworIC0gVGhpcyBpcyBzdGlsbCBjcnVkZSBhbmQgZG9lcyBub3QgcHJvdGVjdCBhZ2FpbnN0IHNpbXVsdGFuZW91cworICAgbWFrZSBpbnZvY2F0aW9ucyBzdG9tcGluZyBvbiBlYWNoIG90aGVyLiAgSSB3b3VsZCBuZWVkIHRvIGFkZAorICAgc29tZSBsb2NraW5nIG1lY2hhbmlzbSBmb3IgdGhpcy4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9yZXZlcnQtYnJhbmNoLXJlYmFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JldmVydC1icmFuY2gtcmViYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA0NzZiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZXZlcnQtYnJhbmNoLXJlYmFzZS50eHQKQEAgLTAsMCArMSwyMDAgQEAKK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK1RvOiBnaXRAdmdlci5rZXJuZWwub3JnCitTdWJqZWN0OiBbSE9XVE9dIFJldmVydGluZyBhbiBleGlzdGluZyBjb21taXQKK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIEpDIGdpdmVzIGEgc21hbGwgcmVhbC1saWZlIGV4YW1wbGUgb2YgdXNpbmcKKyAnZ2l0IHJldmVydCcgY29tbWFuZCwgYW5kIHVzaW5nIGEgdGVtcG9yYXJ5IGJyYW5jaCBhbmQgdGFnIGZvciBzYWZldHkKKyBhbmQgZWFzaWVyIHNhbml0eSBjaGVja2luZy4KK0RhdGU6IE1vbiwgMjkgQXVnIDIwMDUgMjE6Mzk6MDIgLTA3MDAKK0NvbnRlbnQtdHlwZTogdGV4dC9hc2NpaWRvYworTWVzc2FnZS1JRDogPDd2b2U3ZzN1b3AuZnNmQGFzc2lnbmVkLWJ5LWRoY3AuY294Lm5ldD4KKworUmV2ZXJ0aW5nIGFuIGV4aXN0aW5nIGNvbW1pdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPbmUgb2YgdGhlIGNoYW5nZXMgSSBwdWxsZWQgaW50byB0aGUgJ21hc3RlcicgYnJhbmNoIHR1cm5zIG91dCB0bworYnJlYWsgYnVpbGRpbmcgR0lUIHdpdGggR0NDIDIuOTUuICBXaGlsZSB0aGV5IHdlcmUgd2VsbCBpbnRlbnRpb25lZAorcG9ydGFiaWxpdHkgZml4ZXMsIGtlZXBpbmcgdGhpbmdzIHdvcmtpbmcgd2l0aCBnY2MtMi45NSB3YXMgYWxzbworaW1wb3J0YW50LiAgSGVyZSBpcyB3aGF0IEkgZGlkIHRvIHJldmVydCB0aGUgY2hhbmdlIGluIHRoZSAnbWFzdGVyJworYnJhbmNoIGFuZCB0byBhZGp1c3QgdGhlICdwdScgYnJhbmNoLCB1c2luZyBjb3JlIEdJVCB0b29scyBhbmQKK2JhcmVib25lIFBvcmNlbGFpbi4KKworRmlyc3QsIHByZXBhcmUgYSB0aHJvdy1hd2F5IGJyYW5jaCBpbiBjYXNlIEkgc2NyZXcgdGhpbmdzIHVwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIHJldmVydC1jOTkgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IEkgYW0gb24gdGhlICdyZXZlcnQtYzk5JyBicmFuY2guICBMZXQncyBmaWd1cmUgb3V0IHdoaWNoIGNvbW1pdCB0bworcmV2ZXJ0LiAgSSBoYXBwZW4gdG8ga25vdyB0aGF0IHRoZSB0b3Agb2YgdGhlICdtYXN0ZXInIGJyYW5jaCBpcyBhCittZXJnZSwgYW5kIGl0cyBzZWNvbmQgcGFyZW50IChpLmUuIGZvcmVpZ24gY29tbWl0IEkgbWVyZ2VkIGZyb20pIGhhcwordGhlIGNoYW5nZSBJIHdvdWxkIHdhbnQgdG8gdW5kby4gIEZ1cnRoZXIgSSBoYXBwZW4gdG8ga25vdyB0aGF0IHRoYXQKK21lcmdlIGludHJvZHVjZWQgNSBjb21taXRzIG9yIHNvOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIC0tbW9yZT00IG1hc3RlciBtYXN0ZXJeMiB8IGhlYWQKKyogW21hc3Rlcl0gTWVyZ2UgcmVmcy9oZWFkcy9wb3J0YWJsZSBmcm9tIGh0dHA6Ly93d3cuY3MuYmVya2VsZXkuLi4uCisgISBbbWFzdGVyXjJdIFJlcGxhY2UgQzk5IGFycmF5IGluaXRpYWxpemVycyB3aXRoIGNvZGUuCistLQorLSAgW21hc3Rlcl0gTWVyZ2UgcmVmcy9oZWFkcy9wb3J0YWJsZSBmcm9tIGh0dHA6Ly93d3cuY3MuYmVya2VsZXkuLi4uCisqKyBbbWFzdGVyXjJdIFJlcGxhY2UgQzk5IGFycmF5IGluaXRpYWxpemVycyB3aXRoIGNvZGUuCisqKyBbbWFzdGVyXjJ+MV0gUmVwbGFjZSB1bnNldGVudigpIGFuZCBzZXRlbnYoKSB3aXRoIG9sZGVyIHB1dGVudigpLgorKisgW21hc3Rlcl4yfjJdIEluY2x1ZGUgc3lzL3RpbWUuaCBpbiBkYWVtb24uYy4KKyorIFttYXN0ZXJeMn4zXSBGaXggPzogc3RhdGVtZW50cy4KKyorIFttYXN0ZXJeMn40XSBSZXBsYWNlIHplcm8tbGVuZ3RoIGFycmF5IGRlY2xzIHdpdGggW10uCisqICBbbWFzdGVyfjFdIHR1dG9yaWFsIG5vdGUgYWJvdXQgZ2l0IGJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAnLS1tb3JlPTQnIGFib3ZlIG1lYW5zICJhZnRlciB3ZSByZWFjaCB0aGUgbWVyZ2UgYmFzZSBvZiByZWZzLAorc2hvdyB1bnRpbCB3ZSBkaXNwbGF5IGZvdXIgbW9yZSBjb21tb24gY29tbWl0cyIuICBUaGF0IGxhc3QgY29tbWl0Cit3b3VsZCBoYXZlIGJlZW4gd2hlcmUgdGhlICJwb3J0YWJsZSIgYnJhbmNoIHdhcyBmb3JrZWQgZnJvbSB0aGUgbWFpbgorZ2l0LmdpdCByZXBvc2l0b3J5LCBzbyB0aGlzIHdvdWxkIHNob3cgZXZlcnl0aGluZyBvbiBib3RoIGJyYW5jaGVzCitzaW5jZSB0aGVuLiAgSSBqdXN0IGxpbWl0ZWQgdGhlIG91dHB1dCB0byB0aGUgZmlyc3QgaGFuZGZ1bCB1c2luZworJ2hlYWQnLgorCitOb3cgSSBrbm93ICdtYXN0ZXJeMn40JyAocHJvbm91bmNlIGl0IGFzICJmaW5kIHRoZSBzZWNvbmQgcGFyZW50IG9mCit0aGUgJ21hc3RlcicsIGFuZCB0aGVuIGdvIGZvdXIgZ2VuZXJhdGlvbnMgYmFjayBmb2xsb3dpbmcgdGhlIGZpcnN0CitwYXJlbnQiKSBpcyB0aGUgb25lIEkgd291bGQgd2FudCB0byByZXZlcnQuICBTaW5jZSBJIGFsc28gd2FudCB0byBzYXkKK3doeSBJIGFtIHJldmVydGluZyBpdCwgdGhlICctbicgZmxhZyBpcyBnaXZlbiB0byAnZ2l0IHJldmVydCcuICBUaGlzCitwcmV2ZW50cyBpdCBmcm9tIGFjdHVhbGx5IG1ha2luZyBhIGNvbW1pdCwgYW5kIGluc3RlYWQgJ2dpdCByZXZlcnQnCitsZWF2ZXMgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpdCB3YW50ZWQgdG8gdXNlIGluICcubXNnJyBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJldmVydCAtbiBtYXN0ZXJeMn40CiskIGNhdCAubXNnCitSZXZlcnQgIlJlcGxhY2UgemVyby1sZW5ndGggYXJyYXkgZGVjbHMgd2l0aCBbXS4iCisKK1RoaXMgcmV2ZXJ0cyA2YzVmOWJhYTNiYzBkNjNlMTQxZTBhZmMyMzExMDIwNTM3OTkwNWE0IGNvbW1pdC4KKyQgZ2l0IGRpZmYgSEVBRCA7IyB0byBtYWtlIHN1cmUgd2hhdCB3ZSBhcmUgcmV2ZXJ0aW5nIG1ha2VzIHNlbnNlLgorJCBtYWtlIENDPWdjYy0yLjk1IGNsZWFuIHRlc3QgOyMgbWFrZSBzdXJlIGl0IGZpeGVkIHRoZSBicmVha2FnZS4KKyQgbWFrZSBjbGVhbiB0ZXN0IDsjIG1ha2Ugc3VyZSBpdCBkaWQgbm90IGNhdXNlIG90aGVyIGJyZWFrYWdlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSByZXZlcnRlZCBjaGFuZ2UgbWFrZXMgc2Vuc2UgKGZyb20gcmVhZGluZyB0aGUgJ2RpZmYnIG91dHB1dCksIGRvZXMKK2ZpeCB0aGUgcHJvYmxlbSAoZnJvbSAnbWFrZSBDQz1nY2MtMi45NScgdGVzdCksIGFuZCBkb2VzIG5vdCBjYXVzZSBuZXcKK2JyZWFrYWdlIChmcm9tIHRoZSBsYXN0ICdtYWtlIHRlc3QnKS4gIEknbSByZWFkeSB0byBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC1hIC1zIDsjIHJlYWQgLm1zZyBpbnRvIHRoZSBsb2csCisgICAgICAgICAgICAgICAgICAgICMgYW5kIGV4cGxhaW4gd2h5IEkgYW0gcmV2ZXJ0aW5nLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0kgY291bGQgaGF2ZSBzY3Jld2VkIHVwIGluIGFueSBvZiB0aGUgYWJvdmUgc3RlcHMsIGJ1dCBpbiB0aGUgd29yc3QKK2Nhc2UgSSBjb3VsZCBqdXN0IGhhdmUgZG9uZSAnZ2l0IGNoZWNrb3V0IG1hc3RlcicgdG8gc3RhcnQgb3Zlci4KK0ZvcnR1bmF0ZWx5IEkgZGlkIG5vdCBoYXZlIHRvOyB3aGF0IEkgaGF2ZSBpbiB0aGUgY3VycmVudCBicmFuY2gKKydyZXZlcnQtYzk5JyBpcyB3aGF0IEkgd2FudC4gIFNvIG1lcmdlIHRoYXQgYmFjayBpbnRvICdtYXN0ZXInOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgcmVzb2x2ZSBtYXN0ZXIgcmV2ZXJ0LWM5OSBmYXN0IDsjIHRoaXMgc2hvdWxkIGJlIGEgZmFzdCBmb3J3YXJkCitVcGRhdGluZyBmcm9tIDEwZDc4MWI5Y2FhNGY3MTQ5NWM3YjM0OTYzYmVmMTM3MjE2Zjg2YTggdG8gZTNhNjkzYy4uLgorIGNhY2hlLmggICAgICAgIHwgICAgOCArKysrLS0tLQorIGNvbW1pdC5jICAgICAgIHwgICAgMiArLQorIGxzLWZpbGVzLmMgICAgIHwgICAgMiArLQorIHJlY2VpdmUtcGFjay5jIHwgICAgMiArLQorIHNlcnZlci1pbmZvLmMgIHwgICAgMiArLQorIDUgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAnZmFzdCcgaW4gdGhlIGFib3ZlICdnaXQgcmVzb2x2ZScgaXMgbm90IGEgbWFnaWMuICBJIGtuZXcgdGhpcworJ3Jlc29sdmUnIHdvdWxkIHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZCBtZXJnZSwgYW5kIGlmIG5vdCwgdGhlcmUgaXMKK3NvbWV0aGluZyB2ZXJ5IHdyb25nIChzbyBJIHdvdWxkIGRvICdnaXQgcmVzZXQnIG9uIHRoZSAnbWFzdGVyJyBicmFuY2gKK2FuZCBleGFtaW5lIHRoZSBzaXR1YXRpb24pLiAgV2hlbiBhIGZhc3QgZm9yd2FyZCBtZXJnZSBpcyBkb25lLCB0aGUKK21lc3NhZ2UgcGFyYW1ldGVyIHRvICdnaXQgcmVzb2x2ZScgaXMgZGlzY2FyZGVkLCBiZWNhdXNlIG5vIG5ldyBjb21taXQKK2lzIGNyZWF0ZWQuICBZb3UgY291bGQgaGF2ZSBzYWlkICdqdW5rJyBvciAnbm90aGluZycgdGhlcmUgYXMgd2VsbC4KKworVGhlcmUgaXMgbm8gbmVlZCB0byByZWRvIHRoZSB0ZXN0IGF0IHRoaXMgcG9pbnQuICBXZSBmYXN0IGZvcndhcmRlZAorYW5kIHdlIGtub3cgJ21hc3RlcicgbWF0Y2hlcyAncmV2ZXJ0LWM5OScgZXhhY3RseS4gIEluIGZhY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiBtYXN0ZXIuLnJldmVydC1jOTkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzYXlzIG5vdGhpbmcuCisKK1RoZW4gd2UgcmViYXNlIHRoZSAncHUnIGJyYW5jaCBhcyB1c3VhbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBwdQorJCBnaXQgdGFnIHB1LWFuY2hvciBwdQorJCBnaXQgcmViYXNlIG1hc3RlcgorKiBBcHBseWluZzogUmVkbyAicmV2ZXJ0IiB1c2luZyB0aHJlZS13YXkgbWVyZ2UgbWFjaGluZXJ5LgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IFJlbW92ZSBnaXQtYXBwbHktcGF0Y2gtc2NyaXB0LgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK1NpbXBsZSBjaGVycnktcGljayBmYWlsczsgdHJ5aW5nIEF1dG9tYXRpYyBjaGVycnktcGljay4KK1JlbW92aW5nIERvY3VtZW50YXRpb24vZ2l0LWFwcGx5LXBhdGNoLXNjcmlwdC50eHQKK1JlbW92aW5nIGdpdC1hcHBseS1wYXRjaC1zY3JpcHQKK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IERvY3VtZW50ICJnaXQgY2hlcnJ5LXBpY2siIGFuZCAiZ2l0IHJldmVydCIKK0ZpcnN0IHRyeWluZyBzaW1wbGUgbWVyZ2Ugc3RyYXRlZ3kgdG8gY2hlcnJ5LXBpY2suCitGaW5pc2hlZCBvbmUgY2hlcnJ5LXBpY2suCisqIEFwcGx5aW5nOiBtYWlsaW5mbyBhbmQgYXBwbHltYm94IHVwZGF0ZXMKK0ZpcnN0IHRyeWluZyBzaW1wbGUgbWVyZ2Ugc3RyYXRlZ3kgdG8gY2hlcnJ5LXBpY2suCitGaW5pc2hlZCBvbmUgY2hlcnJ5LXBpY2suCisqIEFwcGx5aW5nOiBTaG93IGNvbW1pdHMgaW4gdG9wbyBvcmRlciBhbmQgbmFtZSBhbGwgY29tbWl0cy4KK0ZpcnN0IHRyeWluZyBzaW1wbGUgbWVyZ2Ugc3RyYXRlZ3kgdG8gY2hlcnJ5LXBpY2suCitGaW5pc2hlZCBvbmUgY2hlcnJ5LXBpY2suCisqIEFwcGx5aW5nOiBNb3JlIGRvY3VtZW50YXRpb24gdXBkYXRlcy4KK0ZpcnN0IHRyeWluZyBzaW1wbGUgbWVyZ2Ugc3RyYXRlZ3kgdG8gY2hlcnJ5LXBpY2suCitGaW5pc2hlZCBvbmUgY2hlcnJ5LXBpY2suCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRlbXBvcmFyeSB0YWcgJ3B1LWFuY2hvcicgaXMgbWUganVzdCBiZWluZyBjYXJlZnVsLCBpbiBjYXNlICdnaXQKK3JlYmFzZScgc2NyZXdzIHVwLiAgQWZ0ZXIgdGhpcywgSSBjYW4gZG8gdGhlc2UgZm9yIHNhbml0eSBjaGVjazoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHB1LWFuY2hvci4ucHUgOyMgbWFrZSBzdXJlIHdlIGdvdCB0aGUgbWFzdGVyIGZpeC4KKyQgbWFrZSBDQz1nY2MtMi45NSBjbGVhbiB0ZXN0IDsjIG1ha2Ugc3VyZSBpdCBmaXhlZCB0aGUgYnJlYWthZ2UuCiskIG1ha2UgY2xlYW4gdGVzdCA7IyBtYWtlIHN1cmUgaXQgZGlkIG5vdCBjYXVzZSBvdGhlciBicmVha2FnZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFdmVyeXRoaW5nIGlzIGluIHRoZSBnb29kIG9yZGVyLiAgSSBkbyBub3QgbmVlZCB0aGUgdGVtcG9yYXJ5IGJyYW5jaAorbm9yIHRhZyBhbnltb3JlLCBzbyByZW1vdmUgdGhlbToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIHJtIC1mIC5naXQvcmVmcy90YWdzL3B1LWFuY2hvciAKKyQgZ2l0IGJyYW5jaCAtZCByZXZlcnQtYzk5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgd2FzIGFuIGVtZXJnZW5jeSBmaXgsIHNvIHdlIG1pZ2h0IGFzIHdlbGwgbWVyZ2UgaXQgaW50byB0aGUKKydyZWxlYXNlIGNhbmRpZGF0ZScgYnJhbmNoLCBhbHRob3VnaCBJIGV4cGVjdCB0aGUgbmV4dCByZWxlYXNlIHdvdWxkCitiZSBzb21lIGRheXMgb2ZmOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IHJjCiskIGdpdCBwdWxsIC4gbWFzdGVyCitQYWNraW5nIDAgb2JqZWN0cworVW5wYWNraW5nIDAgb2JqZWN0cworCisqIGNvbW1pdHRpc2g6IGUzYTY5M2MuLi4JcmVmcy9oZWFkcy9tYXN0ZXIgZnJvbSAuCitUcnlpbmcgdG8gbWVyZ2UgZTNhNjkzYy4uLiBpbnRvIDhjMWY1ZjAuLi4gdXNpbmcgMTBkNzgxYi4uLgorQ29tbWl0dGVkIG1lcmdlIDdmYjliNzI2MmExZDFlMGE0N2JiZmRjYmJjZjUwY2UwNjM1ZDNmOGYKKyBjYWNoZS5oICAgICAgICB8ICAgIDggKysrKy0tLS0KKyBjb21taXQuYyAgICAgICB8ICAgIDIgKy0KKyBscy1maWxlcy5jICAgICB8ICAgIDIgKy0KKyByZWNlaXZlLXBhY2suYyB8ICAgIDIgKy0KKyBzZXJ2ZXItaW5mby5jICB8ICAgIDIgKy0KKyA1IGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbmQgdGhlIGZpbmFsIHJlcG9zaXRvcnkgc3RhdHVzIGxvb2tzIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaCAtLW1vcmU9MSBtYXN0ZXIgcHUgcmMKKyEgW21hc3Rlcl0gUmV2ZXJ0ICJSZXBsYWNlIHplcm8tbGVuZ3RoIGFycmF5IGRlY2xzIHdpdGggW10uIgorICEgW3B1XSBnaXQtcmVwYWNrOiBBZGQgb3B0aW9uIHRvIHJlcGFjayBhbGwgb2JqZWN0cy4KKyAgKiBbcmNdIE1lcmdlIHJlZnMvaGVhZHMvbWFzdGVyIGZyb20gLgorLS0tCisgKyAgW3B1XSBnaXQtcmVwYWNrOiBBZGQgb3B0aW9uIHRvIHJlcGFjayBhbGwgb2JqZWN0cy4KKyArICBbcHV+MV0gTW9yZSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisgKyAgW3B1fjJdIFNob3cgY29tbWl0cyBpbiB0b3BvIG9yZGVyIGFuZCBuYW1lIGFsbCBjb21taXRzLgorICsgIFtwdX4zXSBtYWlsaW5mbyBhbmQgYXBwbHltYm94IHVwZGF0ZXMKKyArICBbcHV+NF0gRG9jdW1lbnQgImdpdCBjaGVycnktcGljayIgYW5kICJnaXQgcmV2ZXJ0IgorICsgIFtwdX41XSBSZW1vdmUgZ2l0LWFwcGx5LXBhdGNoLXNjcmlwdC4KKyArICBbcHV+Nl0gUmVkbyAicmV2ZXJ0IiB1c2luZyB0aHJlZS13YXkgbWVyZ2UgbWFjaGluZXJ5LgorICAtIFtyY10gTWVyZ2UgcmVmcy9oZWFkcy9tYXN0ZXIgZnJvbSAuCisrKyogW21hc3Rlcl0gUmV2ZXJ0ICJSZXBsYWNlIHplcm8tbGVuZ3RoIGFycmF5IGRlY2xzIHdpdGggW10uIgorICAtIFtyY34xXSBNZXJnZSByZWZzL2hlYWRzL21hc3RlciBmcm9tIC4KKy4uLiBbbWFzdGVyfjFdIE1lcmdlIHJlZnMvaGVhZHMvcG9ydGFibGUgZnJvbSBodHRwOi8vd3d3LmNzLmJlcmtlbGV5Li4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3NlcGFyYXRpbmctdG9waWMtYnJhbmNoZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by9zZXBhcmF0aW5nLXRvcGljLWJyYW5jaGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBlMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9zZXBhcmF0aW5nLXRvcGljLWJyYW5jaGVzLnR4dApAQCAtMCwwICsxLDkxIEBACitGcm9tOiBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CitTdWJqZWN0OiBTZXBhcmF0aW5nIHRvcGljIGJyYW5jaGVzCitBYnN0cmFjdDogSW4gdGhpcyBhcnRpY2xlLCBKQyBkZXNjcmliZXMgaG93IHRvIHNlcGFyYXRlIHRvcGljIGJyYW5jaGVzLgorCitUaGlzIHRleHQgd2FzIG9yaWdpbmFsbHkgYSBmb290bm90ZSB0byBhIGRpc2N1c3Npb24gYWJvdXQgdGhlCitiZWhhdmlvdXIgb2YgdGhlIGdpdCBkaWZmIGNvbW1hbmRzLgorCitPZnRlbiBJIGZpbmQgbXlzZWxmIGRvaW5nIHRoYXQgW3J1bm5pbmcgZGlmZiBhZ2FpbnN0IHNvbWV0aGluZyBvdGhlcgordGhhbiBIRUFEXSB3aGlsZSByZXdyaXRpbmcgbWVzc3kgZGV2ZWxvcG1lbnQgaGlzdG9yeS4gIEZvciBleGFtcGxlLCBJCitzdGFydCBkb2luZyBzb21lIHdvcmsgd2l0aG91dCBrbm93aW5nIGV4YWN0bHkgd2hlcmUgaXQgbGVhZHMsIGFuZCBlbmQKK3VwIHdpdGggYSBoaXN0b3J5IGxpa2UgdGhpczoKKworICAgICAgICAgICAgIm1hc3RlciIKKyAgICAgICAgby0tLW8KKyAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAidG9waWMiIAorICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tby0tLW8KKworQXQgdGhpcyBwb2ludCwgInRvcGljIiBjb250YWlucyBzb21ldGhpbmcgSSBrbm93IEkgd2FudCwgYnV0IGl0Citjb250YWlucyB0d28gY29uY2VwdHMgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQuCitBbmQgb2Z0ZW4sIG9uZSB0b3BpYyBjb21wb25lbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIG90aGVyLiAgSXQgbWF5Citjb250YWluIG1vcmUgdGhhbiB0d28gdG9waWNzLgorCitJbiBvcmRlciB0byByZXdyaXRlIHRoaXMgbWVzcyB0byBiZSBtb3JlIG1hbmFnZWFibGUsIEkgd291bGQgZmlyc3QgZG8KKyJkaWZmIG1hc3Rlci4udG9waWMiLCB0byBleHRyYWN0IHRoZSBjaGFuZ2VzIGludG8gYSBzaW5nbGUgcGF0Y2gsIHN0YXJ0CitwaWNraW5nIHBpZWNlcyBmcm9tIGl0IHRvIGdldCBsb2dpY2FsbHkgc2VsZi1jb250YWluZWQgdW5pdHMsIGFuZAorc3RhcnQgYnVpbGRpbmcgb24gdG9wIG9mICJtYXN0ZXIiOgorCisgICAgICAgICQgZ2l0IGRpZmYgbWFzdGVyLi50b3BpYyA+UC5kaWZmCisgICAgICAgICQgZ2l0IGNoZWNrb3V0IC1iIHRvcGljQSBtYXN0ZXIKKyAgICAgICAgLi4uIHBpY2sgYW5kIGFwcGx5IHBpZWNlcyBmcm9tIFAuZGlmZiB0byBidWlsZAorICAgICAgICAuLi4gY29tbWl0cyBvbiB0b3BpY0EgYnJhbmNoLgorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBvLS0tby0tLW8KKyAgICAgICAgICAgICAvICAgICAgICAidG9waWNBIgorICAgICAgICBvLS0tbyJtYXN0ZXIiCisgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgInRvcGljIiAKKyAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8tLS1vCisKK0JlZm9yZSBkb2luZyBlYWNoIGNvbW1pdCBvbiAidG9waWNBIiBIRUFELCBJIHJ1biAiZGlmZiBIRUFEIgorYmVmb3JlIHVwZGF0ZS1pbmRleCB0aGUgYWZmZWN0ZWQgcGF0aHMsIG9yICJkaWZmIC0tY2FjaGVkIEhFQUQiCithZnRlci4gIEFsc28gSSB3b3VsZCBydW4gImRpZmYgLS1jYWNoZWQgbWFzdGVyIiB0byBtYWtlIHN1cmUKK3RoYXQgdGhlIGNoYW5nZXMgYXJlIG9ubHkgdGhlIG9uZXMgcmVsYXRlZCB0byAidG9waWNBIi4gIFVzdWFsbHkKK0kgZG8gdGhpcyBmb3Igc21hbGxlciB0b3BpY3MgZmlyc3QuCisKK0FmdGVyIHRoYXQsIEknZCBkbyB0aGUgcmVtYWluZGVyIG9mIHRoZSBvcmlnaW5hbCAidG9waWMiLCBidXQKK2ZvciB0aGF0LCBJIGRvIG5vdCBzdGFydCBmcm9tIHRoZSBwYXRjaGZpbGUgSSBleHRyYWN0ZWQgYnkKK2NvbXBhcmluZyAibWFzdGVyIiBhbmQgInRvcGljIiBJIHVzZWQgaW5pdGlhbGx5LiAgU3RpbGwgb24KKyJ0b3BpY0EiLCBJIGV4dHJhY3QgImRpZmYgdG9waWMiLCBhbmQgdXNlIGl0IHRvIHJlYnVpbGQgdGhlCitvdGhlciB0b3BpYzoKKworICAgICAgICAkIGdpdCBkaWZmIC1SIHRvcGljID5QLmRpZmYgOyMgLS1jYWNoZWQgYWxzbyB3b3VsZCB3b3JrIGZpbmUKKyAgICAgICAgJCBnaXQgY2hlY2tvdXQgLWIgdG9waWNCIG1hc3RlcgorICAgICAgICAuLi4gcGljayBhbmQgYXBwbHkgcGllY2VzIGZyb20gUC5kaWZmIHRvIGJ1aWxkCisgICAgICAgIC4uLiBjb21taXRzIG9uIHRvcGljQiBicmFuY2guCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvcGljQiIKKyAgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vCisgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAvby0tLW8tLS1vCisgICAgICAgICAgICB8LyAgICAgICAgInRvcGljQSIKKyAgICAgICAgby0tLW8ibWFzdGVyIgorICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgICJ0b3BpYyIgCisgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vLS0tbworCitBZnRlciBJIGFtIGRvbmUsIEknZCB0cnkgYSBwcmV0ZW5kLW1lcmdlIGJldHdlZW4gInRvcGljQSIgYW5kCisidG9waWNCIiBpbiBvcmRlciB0byBtYWtlIHN1cmUgSSBoYXZlIG5vdCBtaXNzZWQgYW55dGhpbmc6CisKKyAgICAgICAgJCBnaXQgcHVsbCAuIHRvcGljQSA7IyBtZXJnZSBpdCBpbnRvIGN1cnJlbnQgInRvcGljQiIKKyAgICAgICAgJCBnaXQgZGlmZiB0b3BpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9waWNCIgorICAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8tLS0qIChwcmV0ZW5kIG1lcmdlKQorICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAvby0tLW8tLS1vLS0tLS0tLS0tLScKKyAgICAgICAgICAgIHwvICAgICAgICAidG9waWNBIgorICAgICAgICBvLS0tbyJtYXN0ZXIiCisgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgInRvcGljIiAKKyAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8tLS1vCisKK1RoZSBsYXN0IGRpZmYgYmV0dGVyIG5vdCB0byBzaG93IGFueXRoaW5nIG90aGVyIHRoYW4gY2xlYW51cHMKK2ZvciBjcnVmdHMuICBUaGVuIEkgY2FuIGZpbmFsbHkgY2xlYW4gdGhpbmdzIHVwOgorCisgICAgICAgICQgZ2l0IGJyYW5jaCAtRCB0b3BpYworICAgICAgICAkIGdpdCByZXNldCAtLWhhcmQgSEVBRF4gOyMgbnVrZSBwcmV0ZW5kIG1lcmdlCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvcGljQiIKKyAgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vCisgICAgICAgICAgICAgIC8gCisgICAgICAgICAgICAgL28tLS1vLS0tbworICAgICAgICAgICAgfC8gICAgICAgICJ0b3BpY0EiCisgICAgICAgIG8tLS1vIm1hc3RlciIKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzMzY5NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHQKQEAgLTAsMCArMSwxNzIgQEAKK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gYW5kIENhcmwgQmFsZHdpbiA8Y25iQGZjLmhwLmNvbT4KK1N1YmplY3Q6IGNvbnRyb2wgYWNjZXNzIHRvIGJyYW5jaGVzLgorRGF0ZTogVGh1LCAxNyBOb3YgMjAwNSAyMzo1NTozMiAtMDgwMAorTWVzc2FnZS1JRDogPDd2ZnlwdW1sdTMuZnNmQGFzc2lnbmVkLWJ5LWRoY3AuY294Lm5ldD4KK0Fic3RyYWN0OiBBbiBleGFtcGxlIGhvb2tzL3VwZGF0ZSBzY3JpcHQgaXMgcHJlc2VudGVkIHRvCisgaW1wbGVtZW50IHJlcG9zaXRvcnkgbWFpbnRlbmFuY2UgcG9saWNpZXMsIHN1Y2ggYXMgd2hvIGNhbiBwdXNoCisgaW50byB3aGljaCBicmFuY2ggYW5kIHdobyBjYW4gbWFrZSBhIHRhZy4KKworV2hlbiB5b3VyIGRldmVsb3BlciBydW5zIGdpdC1wdXNoIGludG8gdGhlIHJlcG9zaXRvcnksCitnaXQtcmVjZWl2ZS1wYWNrIGlzIHJ1biAoZWl0aGVyIGxvY2FsbHkgb3Igb3ZlciBzc2gpIGFzIHRoYXQKK2RldmVsb3Blciwgc28gaXMgaG9va3MvdXBkYXRlIHNjcmlwdC4gIFF1b3RpbmcgZnJvbSB0aGUgcmVsZXZhbnQKK3NlY3Rpb24gb2YgdGhlIGRvY3VtZW50YXRpb246CisKKyAgICBCZWZvcmUgZWFjaCByZWYgaXMgdXBkYXRlZCwgaWYgJEdJVF9ESVIvaG9va3MvdXBkYXRlIGZpbGUgZXhpc3RzCisgICAgYW5kIGV4ZWN1dGFibGUsIGl0IGlzIGNhbGxlZCB3aXRoIHRocmVlIHBhcmFtZXRlcnM6CisKKyAgICAgICAgICAgJEdJVF9ESVIvaG9va3MvdXBkYXRlIHJlZm5hbWUgc2hhMS1vbGQgc2hhMS1uZXcKKworICAgIFRoZSByZWZuYW1lIHBhcmFtZXRlciBpcyByZWxhdGl2ZSB0byAkR0lUX0RJUjsgZS5nLiBmb3IgdGhlCisgICAgbWFzdGVyIGhlYWQgdGhpcyBpcyAicmVmcy9oZWFkcy9tYXN0ZXIiLiAgVHdvIHNoYTEgYXJlIHRoZQorICAgIG9iamVjdCBuYW1lcyBmb3IgdGhlIHJlZm5hbWUgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlLiAgTm90ZQorICAgIHRoYXQgdGhlIGhvb2sgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcmVmbmFtZSBpcyB1cGRhdGVkLCBzbyBlaXRoZXIKKyAgICBzaGExLW9sZCBpcyAwezQwfSAobWVhbmluZyB0aGVyZSBpcyBubyBzdWNoIHJlZiB5ZXQpLCBvciBpdAorICAgIHNob3VsZCBtYXRjaCB3aGF0IGlzIHJlY29yZGVkIGluIHJlZm5hbWUuCisKK1NvIGlmIHlvdXIgcG9saWN5IGlzICgxKSBhbHdheXMgcmVxdWlyZSBmYXN0LWZvcndhcmQgcHVzaAorKGkuZS4gbmV2ZXIgYWxsb3cgImdpdC1wdXNoIHJlcG8gK2JyYW5jaDpicmFuY2giKSwgKDIpIHlvdQoraGF2ZSBhIGxpc3Qgb2YgdXNlcnMgYWxsb3dlZCB0byB1cGRhdGUgZWFjaCBicmFuY2gsIGFuZCAoMykgeW91CitkbyBub3QgbGV0IHRhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4sIHRoZW4geW91IGNhbiB1c2Ugc29tZXRoaW5nCitsaWtlIHRoaXMgYXMgeW91ciBob29rcy91cGRhdGUgc2NyaXB0LgorCitbamM6IGVkaXRvcmlhbCBub3RlLiAgVGhpcyBpcyBhIG11Y2ggaW1wcm92ZWQgdmVyc2lvbiBieSBDYXJsCitzaW5jZSBJIHBvc3RlZCB0aGUgb3JpZ2luYWwgb3V0bGluZV0KKworLS0gPjggLS0gYmVnaW5uaW5nIG9mIHNjcmlwdCAtLSA+OCAtLQorCisjIS9iaW4vYmFzaAorCit1bWFzayAwMDIKKworIyBJZiB5b3UgYXJlIGhhdmluZyB0cm91YmxlIHdpdGggdGhpcyBhY2Nlc3MgY29udHJvbCBob29rIHNjcmlwdAorIyB5b3UgY2FuIHRyeSBzZXR0aW5nIHRoaXMgdG8gdHJ1ZS4gIEl0IHdpbGwgdGVsbCB5b3UgZXhhY3RseQorIyB3aHkgYSB1c2VyIGlzIGJlaW5nIGFsbG93ZWQvZGVuaWVkIGFjY2Vzcy4KKwordmVyYm9zZT1mYWxzZQorCisjIERlZmF1bHQgc2hlbGwgZ2xvYmJpbmcgbWVzc2VzIHRoaW5ncyB1cCBkb3duc3RyZWFtCitHTE9CSUdOT1JFPSoKKworZnVuY3Rpb24gZ3JhbnQgeworICAkdmVyYm9zZSAmJiBlY2hvID4mMiAiLUdyYW50LQkJJDEiCisgIGVjaG8gZ3JhbnQKKyAgZXhpdCAwCit9CisKK2Z1bmN0aW9uIGRlbnkgeworICAkdmVyYm9zZSAmJiBlY2hvID4mMiAiLURlbnktCQkkMSIKKyAgZWNobyBkZW55CisgIGV4aXQgMQorfQorCitmdW5jdGlvbiBpbmZvIHsKKyAgJHZlcmJvc2UgJiYgZWNobyA+JjIgIi1JbmZvLQkJJDEiCit9CisKKyMgSW1wbGVtZW50IGdlbmVyaWMgYnJhbmNoIGFuZCB0YWcgcG9saWNpZXMuCisjIC0gVGFncyBzaG91bGQgbm90IGJlIHVwZGF0ZWQgb25jZSBjcmVhdGVkLgorIyAtIEJyYW5jaGVzIHNob3VsZCBvbmx5IGJlIGZhc3QtZm9yd2FyZGVkLgorY2FzZSAiJDEiIGluCisgIHJlZnMvdGFncy8qKQorICAgIFsgLWYgIiRHSVRfRElSLyQxIiBdICYmCisgICAgZGVueSA+L2Rldi9udWxsICJZb3UgY2FuJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRhZyIKKyAgICA7OworICByZWZzL2hlYWRzLyopCisgICAgIyBObyByZWJhc2luZyBvciByZXdpbmRpbmcKKyAgICBpZiBleHByICIkMiIgOiAnMCokJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICBpbmZvICJUaGUgYnJhbmNoICckMScgaXMgbmV3Li4uIgorICAgIGVsc2UKKyAgICAgICMgdXBkYXRpbmcgLS0gbWFrZSBzdXJlIGl0IGlzIGEgZmFzdCBmb3J3YXJkCisgICAgICBtYj0kKGdpdC1tZXJnZS1iYXNlICIkMiIgIiQzIikKKyAgICAgIGNhc2UgIiRtYiwkMiIgaW4KKyAgICAgICAgIiQyLCRtYiIpIGluZm8gIlVwZGF0ZSBpcyBmYXN0LWZvcndhcmQiIDs7CisgICAgICAgICopICAgICAgICBkZW55ID4vZGV2L251bGwgICJUaGlzIGlzIG5vdCBhIGZhc3QtZm9yd2FyZCB1cGRhdGUuIiA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBkZW55ID4vZGV2L251bGwgXAorICAgICJCcmFuY2ggaXMgbm90IHVuZGVyIHJlZnMvaGVhZHMgb3IgcmVmcy90YWdzLiAgV2hhdCBhcmUgeW91IHRyeWluZyB0byBkbz8iCisgICAgOzsKK2VzYWMKKworIyBJbXBsZW1lbnQgcGVyLWJyYW5jaCBjb250cm9scyBiYXNlZCBvbiB1c2VybmFtZQorYWxsb3dlZF91c2Vyc19maWxlPSRHSVRfRElSL2luZm8vYWxsb3dlZC11c2VycwordXNlcm5hbWU9JChpZCAtdSAtbikKK2luZm8gIlRoZSB1c2VyIGlzOiAnJHVzZXJuYW1lJyIKKworaWYgWyAtZiAiJGFsbG93ZWRfdXNlcnNfZmlsZSIgXTsgdGhlbgorICByYz0kKGNhdCAkYWxsb3dlZF91c2Vyc19maWxlIHwgZ3JlcCAtdiAnXiMnIHwgZ3JlcCAtdiAnXiQnIHwKKyAgICB3aGlsZSByZWFkIGhlYWRfcGF0dGVybiB1c2VyX3BhdHRlcm5zOyBkbworICAgICAgbWF0Y2hsZW49JChleHByICIkMSIgOiAiJGhlYWRfcGF0dGVybiIpCisgICAgICBpZiBbICIkbWF0Y2hsZW4iID09ICIkeyMxfSIgXTsgdGhlbgorICAgICAgICBpbmZvICJGb3VuZCBtYXRjaGluZyBoZWFkIHBhdHRlcm46ICckaGVhZF9wYXR0ZXJuJyIKKyAgICAgICAgZm9yIHVzZXJfcGF0dGVybiBpbiAkdXNlcl9wYXR0ZXJuczsgZG8KKyAgICAgICAgICBpbmZvICJDaGVja2luZyB1c2VyOiAnJHVzZXJuYW1lJyBhZ2FpbnN0IHBhdHRlcm46ICckdXNlcl9wYXR0ZXJuJyIKKyAgICAgICAgICBtYXRjaGxlbj0kKGV4cHIgIiR1c2VybmFtZSIgOiAiJHVzZXJfcGF0dGVybiIpCisgICAgICAgICAgaWYgWyAiJG1hdGNobGVuIiA9PSAiJHsjdXNlcm5hbWV9IiBdOyB0aGVuCisgICAgICAgICAgICBncmFudCAiQWxsb3dpbmcgdXNlcjogJyR1c2VybmFtZScgd2l0aCBwYXR0ZXJuOiAnJHVzZXJfcGF0dGVybiciCisgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgICAgICBkZW55ICJUaGUgdXNlciBpcyBub3QgaW4gdGhlIGFjY2VzcyBsaXN0IGZvciB0aGlzIGJyYW5jaCIKKyAgICAgIGZpCisgICAgZG9uZQorICApCisgIGNhc2UgIiRyYyIgaW4KKyAgICBncmFudCkgZ3JhbnQgPi9kZXYvbnVsbCAiR3JhbnRpbmcgYWNjZXNzIGJhc2VkIG9uICRhbGxvd2VkX3VzZXJzX2ZpbGUiIDs7CisgICAgZGVueSkgIGRlbnkgID4vZGV2L251bGwgIkRlbnlpbmcgIGFjY2VzcyBiYXNlZCBvbiAkYWxsb3dlZF91c2Vyc19maWxlIiA7OworICAgICopIDs7CisgIGVzYWMKK2ZpCisKK2FsbG93ZWRfZ3JvdXBzX2ZpbGU9JEdJVF9ESVIvaW5mby9hbGxvd2VkLWdyb3VwcworZ3JvdXBzPSQoaWQgLUcgLW4pCitpbmZvICJUaGUgdXNlciBiZWxvbmdzIHRvIHRoZSBmb2xsb3dpbmcgZ3JvdXBzOiIKK2luZm8gIickZ3JvdXBzJyIKKworaWYgWyAtZiAiJGFsbG93ZWRfZ3JvdXBzX2ZpbGUiIF07IHRoZW4KKyAgcmM9JChjYXQgJGFsbG93ZWRfZ3JvdXBzX2ZpbGUgfCBncmVwIC12ICdeIycgfCBncmVwIC12ICdeJCcgfAorICAgIHdoaWxlIHJlYWQgaGVhZF9wYXR0ZXJuIGdyb3VwX3BhdHRlcm5zOyBkbworICAgICAgbWF0Y2hsZW49JChleHByICIkMSIgOiAiJGhlYWRfcGF0dGVybiIpCisgICAgICBpZiBbICIkbWF0Y2hsZW4iID09ICIkeyMxfSIgXTsgdGhlbgorICAgICAgICBpbmZvICJGb3VuZCBtYXRjaGluZyBoZWFkIHBhdHRlcm46ICckaGVhZF9wYXR0ZXJuJyIKKyAgICAgICAgZm9yIGdyb3VwX3BhdHRlcm4gaW4gJGdyb3VwX3BhdHRlcm5zOyBkbworICAgICAgICAgIGZvciBncm91cG5hbWUgaW4gJGdyb3VwczsgZG8KKyAgICAgICAgICAgIGluZm8gIkNoZWNraW5nIGdyb3VwOiAnJGdyb3VwbmFtZScgYWdhaW5zdCBwYXR0ZXJuOiAnJGdyb3VwX3BhdHRlcm4nIgorICAgICAgICAgICAgbWF0Y2hsZW49JChleHByICIkZ3JvdXBuYW1lIiA6ICIkZ3JvdXBfcGF0dGVybiIpCisgICAgICAgICAgICBpZiBbICIkbWF0Y2hsZW4iID09ICIkeyNncm91cG5hbWV9IiBdOyB0aGVuCisgICAgICAgICAgICAgIGdyYW50ICJBbGxvd2luZyBncm91cDogJyRncm91cG5hbWUnIHdpdGggcGF0dGVybjogJyRncm91cF9wYXR0ZXJuJyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgICAgIGRlbnkgIk5vbmUgb2YgdGhlIHVzZXIncyBncm91cHMgYXJlIGluIHRoZSBhY2Nlc3MgbGlzdCBmb3IgdGhpcyBicmFuY2giCisgICAgICBmaQorICAgIGRvbmUKKyAgKQorICBjYXNlICIkcmMiIGluCisgICAgZ3JhbnQpIGdyYW50ID4vZGV2L251bGwgIkdyYW50aW5nIGFjY2VzcyBiYXNlZCBvbiAkYWxsb3dlZF9ncm91cHNfZmlsZSIgOzsKKyAgICBkZW55KSAgZGVueSAgPi9kZXYvbnVsbCAiRGVueWluZyAgYWNjZXNzIGJhc2VkIG9uICRhbGxvd2VkX2dyb3Vwc19maWxlIiA7OworICAgICopIDs7CisgIGVzYWMKK2ZpCisKK2RlbnkgPi9kZXYvbnVsbCAiVGhlcmUgYXJlIG5vIG1vcmUgcnVsZXMgdG8gY2hlY2suICBEZW55aW5nIGFjY2VzcyIKKworLS0gPjggLS0gZW5kIG9mIHNjcmlwdCAtLSA+OCAtLQorCitUaGlzIHVzZXMgdHdvIGZpbGVzLCAkR0lUX0RJUi9pbmZvL2FsbG93ZWQtdXNlcnMgYW5kCithbGxvd2VkLWdyb3VwcywgdG8gZGVzY3JpYmUgd2hpY2ggaGVhZHMgY2FuIGJlIHB1c2hlZCBpbnRvIGJ5Cit3aG9tLiAgVGhlIGZvcm1hdCBvZiBlYWNoIGZpbGUgd291bGQgbG9vayBsaWtlIHRoaXM6CisKKwlyZWZzL2hlYWRzL21hc3RlcglqdW5pbworICAgICAgICByZWZzL2hlYWRzL2NvZ2l0byQJcGFza3kKKwlyZWZzL2hlYWRzL2J3LwkJbGludXMKKyAgICAgICAgcmVmcy9oZWFkcy90bXAvCQkqCisgICAgICAgIHJlZnMvdGFncy92WzAtOV0qCWp1bmlvCisKK1dpdGggdGhpcywgTGludXMgY2FuIHB1c2ggb3IgY3JlYXRlICJidy9wZW5ndWluIiBvciAiYncvemVicmEiCitvciAiYncvcGFuZGEiIGJyYW5jaGVzLCBQYXNreSBjYW4gZG8gb25seSAiY29naXRvIiwgYW5kIEpDIGNhbgorZG8gbWFzdGVyIGJyYW5jaCBhbmQgbWFrZSB2ZXJzaW9uZWQgdGFncy4gIEFuZCBhbnlib2R5IGNhbiBkbwordG1wL2JsYWggYnJhbmNoZXMuCisKKy0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by91c2luZy10b3BpYy1icmFuY2hlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3VzaW5nLXRvcGljLWJyYW5jaGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk4MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by91c2luZy10b3BpYy1icmFuY2hlcy50eHQKQEAgLTAsMCArMSwyOTYgQEAKK0RhdGU6IE1vbiwgMTUgQXVnIDIwMDUgMTI6MTc6NDEgLTA3MDAKK0Zyb206IHRvbnkubHVja0BpbnRlbC5jb20KK1N1YmplY3Q6IFNvbWUgdHV0b3JpYWwgdGV4dCAod2FzIGdpdC9jb2dpdG8gd29ya3Nob3AvYm9mIGF0IGxpbnV4Y29uZiBhdT8pCitBYnN0cmFjdDogSW4gdGhpcyBhcnRpY2xlLCBUb255IEx1Y2sgZGlzY3Vzc2VzIGhvdyBoZSB1c2VzIEdJVAorIGFzIGEgTGludXggc3Vic3lzdGVtIG1haW50YWluZXIuCisKK0hlcmUncyBzb21ldGhpbmcgdGhhdCBJJ3ZlIGJlZW4gcHV0dGluZyB0b2dldGhlciBvbiBob3cgSSdtIHVzaW5nCitHSVQgYXMgYSBMaW51eCBzdWJzeXN0ZW0gbWFpbnRhaW5lci4KKworLVRvbnkKKworTGFzdCB1cGRhdGVkIHcuci50LiBHSVQgMS4xCisKK0xpbnV4IHN1YnN5c3RlbSBtYWludGVuYW5jZSB1c2luZyBHSVQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTXkgcmVxdWlyZW1lbnRzIGhlcmUgYXJlIHRvIGJlIGFibGUgdG8gY3JlYXRlIHR3byBwdWJsaWMgdHJlZXM6CisKKzEpIEEgInRlc3QiIHRyZWUgaW50byB3aGljaCBwYXRjaGVzIGFyZSBpbml0aWFsbHkgcGxhY2VkIHNvIHRoYXQgdGhleQorY2FuIGdldCBzb21lIGV4cG9zdXJlIHdoZW4gaW50ZWdyYXRlZCB3aXRoIG90aGVyIG9uZ29pbmcgZGV2ZWxvcG1lbnQuCitUaGlzIHRyZWUgaXMgYXZhaWxhYmxlIHRvIEFuZHJldyBmb3IgcHVsbGluZyBpbnRvIC1tbSB3aGVuZXZlciBoZSB3YW50cy4KKworMikgQSAicmVsZWFzZSIgdHJlZSBpbnRvIHdoaWNoIHRlc3RlZCBwYXRjaGVzIGFyZSBtb3ZlZCBmb3IgZmluYWwKK3Nhbml0eSBjaGVja2luZywgYW5kIGFzIGEgdmVoaWNsZSB0byBzZW5kIHRoZW0gdXBzdHJlYW0gdG8gTGludXMKKyhieSBzZW5kaW5nIGhpbSBhICJwbGVhc2UgcHVsbCIgcmVxdWVzdC4pCisKK05vdGUgdGhhdCB0aGUgcGVyaW9kIG9mIHRpbWUgdGhhdCBlYWNoIHBhdGNoIHNwZW5kcyBpbiB0aGUgInRlc3QiIHRyZWUKK2lzIGRlcGVuZGVudCBvbiB0aGUgY29tcGxleGl0eSBvZiB0aGUgY2hhbmdlLiAgU2luY2UgR0lUIGRvZXMgbm90IHN1cHBvcnQKK2NoZXJyeSBwaWNraW5nLCBpdCBpcyBub3QgcHJhY3RpY2FsIHRvIHNpbXBseSBhcHBseSBhbGwgcGF0Y2hlcyB0byB0aGUKK3Rlc3QgdHJlZSBhbmQgdGhlbiBwdWxsIHRvIHRoZSByZWxlYXNlIHRyZWUgYXMgdGhhdCB3b3VsZCBsZWF2ZSB0cml2aWFsCitwYXRjaGVzIGJsb2NrZWQgaW4gdGhlIHRlc3QgdHJlZSB3YWl0aW5nIGZvciBjb21wbGV4IGNoYW5nZXMgdG8gYWNjdW11bGF0ZQorZW5vdWdoIHRlc3QgdGltZSB0byBncmFkdWF0ZS4KKworQmFjayBpbiB0aGUgQml0S2VlcGVyIGRheXMgSSBhY2hpZXZlZCB0aGlzIGJ5IGNyZWF0aW5nIHNtYWxsIGZvcmVzdHMgb2YKK3RlbXBvcmFyeSB0cmVlcywgb25lIHRyZWUgZm9yIGVhY2ggbG9naWNhbCBncm91cGluZyBvZiBwYXRjaGVzLCBhbmQgdGhlbgorcHVsbGluZyBjaGFuZ2VzIGZyb20gdGhlc2UgdHJlZXMgZmlyc3QgdG8gdGhlIHRlc3QgdHJlZSwgYW5kIHRoZW4gdG8gdGhlCityZWxlYXNlIHRyZWUuICBBdCBmaXJzdCBJIHJlcGxpY2F0ZWQgdGhpcyBpbiBHSVQsIGJ1dCB0aGVuIEkgcmVhbGlzZWQKK3RoYXQgSSBjb3VsZCBzbyB0aGlzIGZhciBtb3JlIGVmZmljaWVudGx5IHVzaW5nIGJyYW5jaGVzIGluc2lkZSBhIHNpbmdsZQorR0lUIHJlcG9zaXRvcnkuCisKK1NvIGhlcmUgaXMgdGhlIHN0ZXAtYnktc3RlcCBndWlkZSBob3cgdGhpcyBhbGwgd29ya3MgZm9yIG1lLgorCitGaXJzdCBjcmVhdGUgeW91ciB3b3JrIHRyZWUgYnkgY2xvbmluZyBMaW51cydzIHB1YmxpYyB0cmVlOgorCisgJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LTIuNi5naXQgd29yaworCitDaGFuZ2UgZGlyZWN0b3J5IGludG8gdGhlIGNsb25lZCB0cmVlIHlvdSBqdXN0IGNyZWF0ZWQKKworICQgY2Qgd29yaworCitTZXQgdXAgYSByZW1vdGVzIGZpbGUgc28gdGhhdCB5b3UgY2FuIGZldGNoIHRoZSBsYXRlc3QgZnJvbSBMaW51cycgbWFzdGVyCiticmFuY2ggaW50byBhIGxvY2FsIGJyYW5jaCBuYW1lZCAibGludXMiOgorCisgJCBjYXQgPiAuZ2l0L3JlbW90ZXMvbGludXMKKyBVUkw6IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90b3J2YWxkcy9saW51eC0yLjYuZ2l0CisgUHVsbDogbWFzdGVyOmxpbnVzCisgXkQKKworYW5kIGNyZWF0ZSB0aGUgbGludXMgYnJhbmNoOgorCisgJCBnaXQgYnJhbmNoIGxpbnVzCisKK1RoZSAibGludXMiIGJyYW5jaCB3aWxsIGJlIHVzZWQgdG8gdHJhY2sgdGhlIHVwc3RyZWFtIGtlcm5lbC4gIFRvIHVwZGF0ZSBpdCwKK3lvdSBzaW1wbHkgcnVuOgorCisgJCBnaXQgZmV0Y2ggbGludXMKKworeW91IGNhbiBkbyB0aGlzIGZyZXF1ZW50bHkgKGFuZCBpdCBzaG91bGQgYmUgc2FmZSB0byBkbyBzbyB3aXRoIHBlbmRpbmcKK3dvcmsgaW4geW91ciB0cmVlLCBidXQgcGVyaGFwcyBub3QgaWYgeW91IGFyZSBpbiBtaWQtbWVyZ2UpLgorCitJZiB5b3UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIG90aGVyIHB1YmxpYyB0cmVlcywgeW91IGNhbiBhZGQgcmVtb3RlIGJyYW5jaGVzCitmb3IgdGhlbSB0b286CisKKyAkIGdpdCBicmFuY2ggYW5vdGhlcgorICQgY2F0ID4gLmdpdC9yZW1vdGVzL2Fub3RoZXIKKyBVUkw6IC4uLiBpbnNlcnQgVVJMIGhlcmUgLi4uCisgUHVsbDogbmFtZS1vZi1icmFuY2gtaW4tdGhpcy1yZW1vdGUtdHJlZTphbm90aGVyCisgXkQKKworYW5kIHJ1bjoKKworICQgZ2l0IGZldGNoIGFub3RoZXIKKworTm93IGNyZWF0ZSB0aGUgYnJhbmNoZXMgaW4gd2hpY2ggeW91IGFyZSBnb2luZyB0byB3b3JrLCB0aGVzZSBzdGFydAorb3V0IGF0IHRoZSBjdXJyZW50IHRpcCBvZiB0aGUgbGludXMgYnJhbmNoLgorCisgJCBnaXQgYnJhbmNoIHRlc3QgbGludXMKKyAkIGdpdCBicmFuY2ggcmVsZWFzZSBsaW51cworCitUaGVzZSBjYW4gYmUgZWFzaWx5IGtlcHQgdXAgdG8gZGF0ZSBieSBtZXJnaW5nIGZyb20gdGhlICJsaW51cyIgYnJhbmNoOgorCisgJCBnaXQgY2hlY2tvdXQgdGVzdCAmJiBnaXQgbWVyZ2UgIkF1dG8tdXBkYXRlIGZyb20gdXBzdHJlYW0iIHRlc3QgbGludXMKKyAkIGdpdCBjaGVja291dCByZWxlYXNlICYmIGdpdCBtZXJnZSAiQXV0by11cGRhdGUgZnJvbSB1cHN0cmVhbSIgcmVsZWFzZSBsaW51cworCitJbXBvcnRhbnQgbm90ZSEgIElmIHlvdSBoYXZlIGFueSBsb2NhbCBjaGFuZ2VzIGluIHRoZXNlIGJyYW5jaGVzLCB0aGVuCit0aGlzIG1lcmdlIHdpbGwgY3JlYXRlIGEgY29tbWl0IG9iamVjdCBpbiB0aGUgaGlzdG9yeSAod2l0aCBubyBsb2NhbAorY2hhbmdlcyBnaXQgd2lsbCBzaW1wbHkgZG8gYSAiRmFzdCBmb3J3YXJkIiBtZXJnZSkuICBNYW55IHBlb3BsZSBkaXNsaWtlCit0aGUgIm5vaXNlIiB0aGF0IHRoaXMgY3JlYXRlcyBpbiB0aGUgTGludXggaGlzdG9yeSwgc28geW91IHNob3VsZCBhdm9pZAorZG9pbmcgdGhpcyBjYXByaWNpb3VzbHkgaW4gdGhlICJyZWxlYXNlIiBicmFuY2gsIGFzIHRoZXNlIG5vaXN5IGNvbW1pdHMKK3dpbGwgYmVjb21lIHBhcnQgb2YgdGhlIHBlcm1hbmVudCBoaXN0b3J5IHdoZW4geW91IGFzayBMaW51cyB0byBwdWxsCitmcm9tIHRoZSByZWxlYXNlIGJyYW5jaC4KKworU2V0IHVwIHNvIHRoYXQgeW91IGNhbiBwdXNoIHVwc3RyZWFtIHRvIHlvdXIgcHVibGljIHRyZWUgKHlvdSBuZWVkIHRvCitsb2ctaW4gdG8gdGhlIHJlbW90ZSBzeXN0ZW0gYW5kIGNyZWF0ZSBhbiBlbXB0eSB0cmVlIHRoZXJlIGJlZm9yZSB0aGUKK2ZpcnN0IHB1c2gpLgorCisgJCBjYXQgPiAuZ2l0L3JlbW90ZXMvbXl0cmVlCisgVVJMOiBtYXN0ZXIua2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FlZ2wvbGludXgtMi42LmdpdAorIFB1c2g6IHJlbGVhc2UKKyBQdXNoOiB0ZXN0CisgXkQKKworYW5kIHRoZSBwdXNoIGJvdGggdGhlIHRlc3QgYW5kIHJlbGVhc2UgdHJlZXMgdXNpbmc6CisKKyAkIGdpdCBwdXNoIG15dHJlZQorCitvciBwdXNoIGp1c3Qgb25lIG9mIHRoZSB0ZXN0IGFuZCByZWxlYXNlIGJyYW5jaGVzIHVzaW5nOgorCisgJCBnaXQgcHVzaCBteXRyZWUgdGVzdAorb3IKKyAkIGdpdCBwdXNoIG15dHJlZSByZWxlYXNlCisKK05vdyB0byBhcHBseSBzb21lIHBhdGNoZXMgZnJvbSB0aGUgY29tbXVuaXR5LiAgVGhpbmsgb2YgYSBzaG9ydAorc25hcHB5IG5hbWUgZm9yIGEgYnJhbmNoIHRvIGhvbGQgdGhpcyBwYXRjaCAob3IgcmVsYXRlZCBncm91cCBvZgorcGF0Y2hlcyksIGFuZCBjcmVhdGUgYSBuZXcgYnJhbmNoIGZyb20gdGhlIGN1cnJlbnQgdGlwIG9mIHRoZQorbGludXMgYnJhbmNoOgorCisgJCBnaXQgY2hlY2tvdXQgLWIgc3BlZWQtdXAtc3BpbmxvY2tzIGxpbnVzCisKK05vdyB5b3UgYXBwbHkgdGhlIHBhdGNoKGVzKSwgcnVuIHNvbWUgdGVzdHMsIGFuZCBjb21taXQgdGhlIGNoYW5nZShzKS4gIElmCit0aGUgcGF0Y2ggaXMgYSBtdWx0aS1wYXJ0IHNlcmllcywgdGhlbiB5b3Ugc2hvdWxkIGFwcGx5IGVhY2ggYXMgYSBzZXBhcmF0ZQorY29tbWl0IHRvIHRoaXMgYnJhbmNoLgorCisgJCAuLi4gcGF0Y2ggLi4uIHRlc3QgIC4uLiBjb21taXQgWyAuLi4gcGF0Y2ggLi4uIHRlc3QgLi4uIGNvbW1pdCBdKgorCitXaGVuIHlvdSBhcmUgaGFwcHkgd2l0aCB0aGUgc3RhdGUgb2YgdGhpcyBjaGFuZ2UsIHlvdSBjYW4gcHVsbCBpdCBpbnRvIHRoZQorInRlc3QiIGJyYW5jaCBpbiBwcmVwYXJhdGlvbiB0byBtYWtlIGl0IHB1YmxpYzoKKworICQgZ2l0IGNoZWNrb3V0IHRlc3QgJiYgZ2l0IG1lcmdlICJQdWxsIHNwZWVkLXVwLXNwaW5sb2NrIGNoYW5nZXMiIHRlc3Qgc3BlZWQtdXAtc3BpbmxvY2tzCisKK0l0IGlzIHVubGlrZWx5IHRoYXQgeW91IHdvdWxkIGhhdmUgYW55IGNvbmZsaWN0cyBoZXJlIC4uLiBidXQgeW91IG1pZ2h0IGlmIHlvdQorc3BlbnQgYSB3aGlsZSBvbiB0aGlzIHN0ZXAgYW5kIGhhZCBhbHNvIHB1bGxlZCBuZXcgdmVyc2lvbnMgZnJvbSB1cHN0cmVhbS4KKworU29tZSB0aW1lIGxhdGVyIHdoZW4gZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBhbmQgdGVzdGluZyBkb25lLCB5b3UgY2FuIHB1bGwgdGhlCitzYW1lIGJyYW5jaCBpbnRvIHRoZSAicmVsZWFzZSIgdHJlZSByZWFkeSB0byBnbyB1cHN0cmVhbS4gIFRoaXMgaXMgd2hlcmUgeW91CitzZWUgdGhlIHZhbHVlIG9mIGtlZXBpbmcgZWFjaCBwYXRjaCAob3IgcGF0Y2ggc2VyaWVzKSBpbiBpdHMgb3duIGJyYW5jaC4gIEl0CittZWFucyB0aGF0IHRoZSBwYXRjaGVzIGNhbiBiZSBtb3ZlZCBpbnRvIHRoZSAicmVsZWFzZSIgdHJlZSBpbiBhbnkgb3JkZXIuCisKKyAkIGdpdCBjaGVja291dCByZWxlYXNlICYmIGdpdCBtZXJnZSAiUHVsbCBzcGVlZC11cC1zcGlubG9jayBjaGFuZ2VzIiByZWxlYXNlIHNwZWVkLXVwLXNwaW5sb2NrcworCitBZnRlciBhIHdoaWxlLCB5b3Ugd2lsbCBoYXZlIGEgbnVtYmVyIG9mIGJyYW5jaGVzLCBhbmQgZGVzcGl0ZSB0aGUKK3dlbGwgY2hvc2VuIG5hbWVzIHlvdSBwaWNrZWQgZm9yIGVhY2ggb2YgdGhlbSwgeW91IG1heSBmb3JnZXQgd2hhdAordGhleSBhcmUgZm9yLCBvciB3aGF0IHN0YXR1cyB0aGV5IGFyZSBpbi4gIFRvIGdldCBhIHJlbWluZGVyIG9mIHdoYXQKK2NoYW5nZXMgYXJlIGluIGEgc3BlY2lmaWMgYnJhbmNoLCB1c2U6CisKKyAkIGdpdC13aGF0Y2hhbmdlZCBicmFuY2huYW1lIF5saW51cyB8IGdpdC1zaG9ydGxvZworCitUbyBzZWUgd2hldGhlciBpdCBoYXMgYWxyZWFkeSBiZWVuIG1lcmdlZCBpbnRvIHRoZSB0ZXN0IG9yIHJlbGVhc2UgYnJhbmNoZXMKK3VzZToKKworICQgZ2l0LXJldi1saXN0IGJyYW5jaG5hbWUgXnRlc3QKK29yCisgJCBnaXQtcmV2LWxpc3QgYnJhbmNobmFtZSBecmVsZWFzZQorCitbSWYgdGhpcyBicmFuY2ggaGFzIG5vdCB5ZXQgYmVlbiBtZXJnZWQgeW91IHdpbGwgc2VlIGEgc2V0IG9mIFNIQTEgdmFsdWVzCitmb3IgdGhlIGNvbW1pdHMsIGlmIGl0IGhhcyBiZWVuIG1lcmdlZCwgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIG91dHB1dF0KKworT25jZSBhIHBhdGNoIGNvbXBsZXRlcyB0aGUgZ3JlYXQgY3ljbGUgKG1vdmluZyBmcm9tIHRlc3QgdG8gcmVsZWFzZSwgdGhlbgorcHVsbGVkIGJ5IExpbnVzLCBhbmQgZmluYWxseSBjb21pbmcgYmFjayBpbnRvIHlvdXIgbG9jYWwgImxpbnVzIiBicmFuY2gpCit0aGUgYnJhbmNoIGZvciB0aGlzIGNoYW5nZSBpcyBubyBsb25nZXIgbmVlZGVkLiAgWW91IGRldGVjdCB0aGlzIHdoZW4gdGhlCitvdXRwdXQgZnJvbToKKworICQgZ2l0LXJldi1saXN0IGJyYW5jaG5hbWUgXmxpbnVzCisKK2lzIGVtcHR5LiAgQXQgdGhpcyBwb2ludCB0aGUgYnJhbmNoIGNhbiBiZSBkZWxldGVkOgorCisgJCBnaXQgYnJhbmNoIC1kIGJyYW5jaG5hbWUKKworU29tZSBjaGFuZ2VzIGFyZSBzbyB0cml2aWFsIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBzZXBhcmF0ZQorYnJhbmNoIGFuZCB0aGVuIG1lcmdlIGludG8gZWFjaCBvZiB0aGUgdGVzdCBhbmQgcmVsZWFzZSBicmFuY2hlcy4gIEZvcgordGhlc2UgY2hhbmdlcywganVzdCBhcHBseSBkaXJlY3RseSB0byB0aGUgInJlbGVhc2UiIGJyYW5jaCwgYW5kIHRoZW4KK21lcmdlIHRoYXQgaW50byB0aGUgInRlc3QiIGJyYW5jaC4KKworVG8gY3JlYXRlIGRpZmZzdGF0IGFuZCBzaG9ydGxvZyBzdW1tYXJpZXMgb2YgY2hhbmdlcyB0byBpbmNsdWRlIGluIGEgInBsZWFzZQorcHVsbCIgcmVxdWVzdCB0byBMaW51cyB5b3UgY2FuIHVzZToKKworICQgZ2l0LXdoYXRjaGFuZ2VkIC1wIHJlbGVhc2UgXmxpbnVzIHwgZGlmZnN0YXQgLXAxCithbmQKKyAkIGdpdC13aGF0Y2hhbmdlZCByZWxlYXNlIF5saW51cyB8IGdpdC1zaG9ydGxvZworCisKK0hlcmUgYXJlIHNvbWUgb2YgdGhlIHNjcmlwdHMgdGhhdCBJIHVzZSB0byBzaW1wbGlmeSBhbGwgdGhpcyBldmVuIGZ1cnRoZXIuCisKKz09PT0gdXBkYXRlIHNjcmlwdCA9PT09CisjIFVwZGF0ZSBhIGJyYW5jaCBpbiBteSBHSVQgdHJlZS4gIElmIHRoZSBicmFuY2ggdG8gYmUgdXBkYXRlZAorIyBpcyAibGludXMiLCB0aGVuIHB1bGwgZnJvbSBrZXJuZWwub3JnLiAgT3RoZXJ3aXNlIG1lcmdlIGxvY2FsCisjIGxpbnVzIGJyYW5jaCBpbnRvIHRlc3R8cmVsZWFzZSBicmFuY2gKKworY2FzZSAiJDEiIGluCit0ZXN0fHJlbGVhc2UpCisJZ2l0IGNoZWNrb3V0ICQxICYmIGdpdCBtZXJnZSAiQXV0by11cGRhdGUgZnJvbSB1cHN0cmVhbSIgJDEgbGludXMKKwk7OworbGludXMpCisJYmVmb3JlPSQoY2F0IC5naXQvcmVmcy9oZWFkcy9saW51cykKKwlnaXQgZmV0Y2ggbGludXMKKwlhZnRlcj0kKGNhdCAuZ2l0L3JlZnMvaGVhZHMvbGludXMpCisJaWYgWyAkYmVmb3JlICE9ICRhZnRlciBdCisJdGhlbgorCQlnaXQtd2hhdGNoYW5nZWQgJGFmdGVyIF4kYmVmb3JlIHwgZ2l0LXNob3J0bG9nCisJZmkKKwk7OworKikKKwllY2hvICJVc2FnZTogJDAgbGludXN8dGVzdHxyZWxlYXNlIiAxPiYyCisJZXhpdCAxCisJOzsKK2VzYWMKKworPT09PSBtZXJnZSBzY3JpcHQgPT09PQorIyBNZXJnZSBhIGJyYW5jaCBpbnRvIGVpdGhlciB0aGUgdGVzdCBvciByZWxlYXNlIGJyYW5jaAorCitwbmFtZT0kMAorCit1c2FnZSgpCit7CisJZWNobyAiVXNhZ2U6ICRwbmFtZSBicmFuY2ggdGVzdHxyZWxlYXNlIiAxPiYyCisJZXhpdCAxCit9CisKK2lmIFsgISAtZiAuZ2l0L3JlZnMvaGVhZHMvIiQxIiBdCit0aGVuCisJZWNobyAiQ2FuJ3Qgc2VlIGJyYW5jaCA8JDE+IiAxPiYyCisJdXNhZ2UKK2ZpCisKK2Nhc2UgIiQyIiBpbgordGVzdHxyZWxlYXNlKQorCWlmIFsgJChnaXQtcmV2LWxpc3QgJDEgXiQyIHwgd2MgLWMpIC1lcSAwIF0KKwl0aGVuCisJCWVjaG8gJDEgYWxyZWFkeSBtZXJnZWQgaW50byAkMiAxPiYyCisJCWV4aXQgMQorCWZpCisJZ2l0IGNoZWNrb3V0ICQyICYmIGdpdCBtZXJnZSAiUHVsbCAkMSBpbnRvICQyIGJyYW5jaCIgJDIgJDEKKwk7OworKikKKwl1c2FnZQorCTs7Citlc2FjCisKKz09PT0gc3RhdHVzIHNjcmlwdCA9PT09CisjIHJlcG9ydCBvbiBzdGF0dXMgb2YgbXkgaWE2NCBHSVQgdHJlZQorCitnYj0kKHRwdXQgc2V0YWIgMikKK3JiPSQodHB1dCBzZXRhYiAxKQorcmVzdG9yZT0kKHRwdXQgc2V0YWIgOSkKKworaWYgWyBgZ2l0LXJldi1saXN0IHJlbGVhc2UgXnRlc3QgfCB3YyAtY2AgLWd0IDAgXQordGhlbgorCWVjaG8gJHJiIFdhcm5pbmc6IGNvbW1pdHMgaW4gcmVsZWFzZSB0aGF0IGFyZSBub3QgaW4gdGVzdCAkcmVzdG9yZQorCWdpdC13aGF0Y2hhbmdlZCByZWxlYXNlIF50ZXN0CitmaQorCitmb3IgYnJhbmNoIGluIGBscyAuZ2l0L3JlZnMvaGVhZHNgCitkbworCWlmIFsgJGJyYW5jaCA9IGxpbnVzIC1vICRicmFuY2ggPSB0ZXN0IC1vICRicmFuY2ggPSByZWxlYXNlIF0KKwl0aGVuCisJCWNvbnRpbnVlCisJZmkKKworCWVjaG8gLW4gJGdiID09PT09PT0gJGJyYW5jaCA9PT09PT0gJHJlc3RvcmUgIiAiCisJc3RhdHVzPQorCWZvciByZWYgaW4gdGVzdCByZWxlYXNlIGxpbnVzCisJZG8KKwkJaWYgWyBgZ2l0LXJldi1saXN0ICRicmFuY2ggXiRyZWYgfCB3YyAtY2AgLWd0IDAgXQorCQl0aGVuCisJCQlzdGF0dXM9JHN0YXR1cyR7cmVmOjA6MX0KKwkJZmkKKwlkb25lCisJY2FzZSAkc3RhdHVzIGluCisJdHJsKQorCQllY2hvICRyYiBOZWVkIHRvIHB1bGwgaW50byB0ZXN0ICRyZXN0b3JlCisJCTs7CisJcmwpCisJCWVjaG8gIkluIHRlc3QiCisJCTs7CisJbCkKKwkJZWNobyAiV2FpdGluZyBmb3IgbGludXMiCisJCTs7CisJIiIpCisJCWVjaG8gJHJiIEFsbCBkb25lICRyZXN0b3JlCisJCTs7CisJKikKKwkJZWNobyAkcmIgIjwkc3RhdHVzPiIgJHJlc3RvcmUKKwkJOzsKKwllc2FjCisJZ2l0LXdoYXRjaGFuZ2VkICRicmFuY2ggXmxpbnVzIHwgZ2l0LXNob3J0bG9nCitkb25lCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luc3RhbGwtd2ViZG9jLnNoIGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLXdlYmRvYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MDIxMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLXdlYmRvYy5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vc2gKKworVD0iJDEiCisKK2ZvciBoIGluICouaHRtbCAqLnR4dCBob3d0by8qLnR4dCBob3d0by8qLmh0bWwKK2RvCisJaWYgdGVzdCAtZiAiJFQvJGgiICYmCisJICAgZGlmZiAtdSAtSSdMYXN0IHVwZGF0ZWQgWzAtOV1bMC05XS1bQS1aXVthLXpdW2Etel0tJyAiJFQvJGgiICIkaCIKKwl0aGVuCisJCTo7ICMgdXAgdG8gZGF0ZQorCWVsc2UKKwkJZWNobyA+JjIgIiMgaW5zdGFsbCAkaCAkVC8kaCIKKwkJcm0gLWYgIiRULyRoIgorCQlta2RpciAtcCBgZGlybmFtZSAiJFQvJGgiYAorCQljcCAiJGgiICIkVC8kaCIKKwlmaQorZG9uZQorc3RyaXBfbGVhZGluZz1gZWNobyAiJFQvIiB8IHNlZCAtZSAnc3wufC58ZydgCitmb3IgdGggaW4gIiRUIi8qLmh0bWwgIiRUIi8qLnR4dCAiJFQiL2hvd3RvLyoudHh0ICIkVCIvaG93dG8vKi5odG1sCitkbworCWg9YGV4cHIgIiR0aCIgOiAiJHN0cmlwX2xlYWRpbmciJ1woLipcKSdgCisJY2FzZSAiJGgiIGluCisJaW5kZXguaHRtbCkgY29udGludWUgOzsKKwllc2FjCisJdGVzdCAtZiAiJGgiICYmIGNvbnRpbnVlCisJZWNobyA+JjIgIiMgcm0gLWYgJHRoIgorCXJtIC1mICIkdGgiCitkb25lCitsbiAtc2YgZ2l0Lmh0bWwgIiRUL2luZGV4Lmh0bWwiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lcmdlLW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2NjMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1vcHRpb25zLnR4dApAQCAtMCwwICsxLDE2IEBACistbiwgXC0tbm8tc3VtbWFyeTo6CisJRG8gbm90IHNob3cgZGlmZnN0YXQgYXQgdGhlIGVuZCBvZiB0aGUgbWVyZ2UuCisKKy0tbm8tY29tbWl0OjoKKwlQZXJmb3JtIHRoZSBtZXJnZSBidXQgcHJldGVuZCB0aGUgbWVyZ2UgZmFpbGVkIGFuZCBkbworCW5vdCBhdXRvY29tbWl0LCB0byBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgYW5kCisJZnVydGhlciB0d2VhayB0aGUgbWVyZ2UgcmVzdWx0IGJlZm9yZSBjb21taXR0aW5nLgorCisKKy1zIDxzdHJhdGVneT4sIFwtLXN0cmF0ZWd5PTxzdHJhdGVneT46OgorCVVzZSB0aGUgZ2l2ZW4gbWVyZ2Ugc3RyYXRlZ3k7IGNhbiBiZSBzdXBwbGllZCBtb3JlIHRoYW4KKwlvbmNlIHRvIHNwZWNpZnkgdGhlbSBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgdHJpZWQuCisJSWYgdGhlcmUgaXMgbm8gYC1zYCBvcHRpb24sIGEgYnVpbHQtaW4gbGlzdCBvZiBzdHJhdGVnaWVzCisJaXMgdXNlZCBpbnN0ZWFkIChgZ2l0LW1lcmdlLXJlY3Vyc2l2ZWAgd2hlbiBtZXJnaW5nIGEgc2luZ2xlCisJaGVhZCwgYGdpdC1tZXJnZS1vY3RvcHVzYCBvdGhlcndpc2UpLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lcmdlLXN0cmF0ZWdpZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1zdHJhdGVnaWVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGYwMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1zdHJhdGVnaWVzLnR4dApAQCAtMCwwICsxLDM1IEBACitNRVJHRSBTVFJBVEVHSUVTCistLS0tLS0tLS0tLS0tLS0tCisKK3Jlc29sdmU6OgorCVRoaXMgY2FuIG9ubHkgcmVzb2x2ZSB0d28gaGVhZHMgKGkuZS4gdGhlIGN1cnJlbnQgYnJhbmNoCisJYW5kIGFub3RoZXIgYnJhbmNoIHlvdSBwdWxsZWQgZnJvbSkgdXNpbmcgMy13YXkgbWVyZ2UKKwlhbGdvcml0aG0uICBJdCB0cmllcyB0byBjYXJlZnVsbHkgZGV0ZWN0IGNyaXNzLWNyb3NzCisJbWVyZ2UgYW1iaWd1aXRpZXMgYW5kIGlzIGNvbnNpZGVyZWQgZ2VuZXJhbGx5IHNhZmUgYW5kCisJZmFzdC4KKworcmVjdXJzaXZlOjoKKwlUaGlzIGNhbiBvbmx5IHJlc29sdmUgdHdvIGhlYWRzIHVzaW5nIDMtd2F5IG1lcmdlCisJYWxnb3JpdGhtLiAgV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBjb21tb24KKwlhbmNlc3RvcnMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgMy13YXkgbWVyZ2UsIGl0IGNyZWF0ZXMgYQorCW1lcmdlZCB0cmVlIG9mIHRoZSBjb21tb24gYW5jZXN0b3JzIGFuZCB1c2VzIHRoYXQgYXMKKwl0aGUgcmVmZXJlbmNlIHRyZWUgZm9yIHRoZSAzLXdheSBtZXJnZS4gIFRoaXMgaGFzIGJlZW4KKwlyZXBvcnRlZCB0byByZXN1bHQgaW4gZmV3ZXIgbWVyZ2UgY29uZmxpY3RzIHdpdGhvdXQKKwljYXVzaW5nIG1pcy1tZXJnZXMgYnkgdGVzdHMgZG9uZSBvbiBhY3R1YWwgbWVyZ2UgY29tbWl0cworCXRha2VuIGZyb20gTGludXggMi42IGtlcm5lbCBkZXZlbG9wbWVudCBoaXN0b3J5LgorCUFkZGl0aW9uYWxseSB0aGlzIGNhbiBkZXRlY3QgYW5kIGhhbmRsZSBtZXJnZXMgaW52b2x2aW5nCisJcmVuYW1lcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgd2hlbgorCXB1bGxpbmcgb3IgbWVyZ2luZyBvbmUgYnJhbmNoLgorCitvY3RvcHVzOjoKKwlUaGlzIHJlc29sdmVzIG1vcmUgdGhhbiB0d28taGVhZCBjYXNlLCBidXQgcmVmdXNlcyB0byBkbworCWNvbXBsZXggbWVyZ2UgdGhhdCBuZWVkcyBtYW51YWwgcmVzb2x1dGlvbi4gIEl0IGlzCisJcHJpbWFyaWx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIGJ1bmRsaW5nIHRvcGljIGJyYW5jaAorCWhlYWRzIHRvZ2V0aGVyLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBtZXJnZSBzdHJhdGVneSB3aGVuCisJcHVsbGluZyBvciBtZXJnaW5nIG1vcmUgdGhhbiBvbmUgYnJhbmNoZXMuCisKK291cnM6OgorCVRoaXMgcmVzb2x2ZXMgYW55IG51bWJlciBvZiBoZWFkcywgYnV0IHRoZSByZXN1bHQgb2YgdGhlCisJbWVyZ2UgaXMgYWx3YXlzIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkLiAgSXQgaXMgbWVhbnQgdG8KKwliZSB1c2VkIHRvIHN1cGVyc2VkZSBvbGQgZGV2ZWxvcG1lbnQgaGlzdG9yeSBvZiBzaWRlCisJYnJhbmNoZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3B1bGwtZmV0Y2gtcGFyYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9wdWxsLWZldGNoLXBhcmFtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODUyZjQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wdWxsLWZldGNoLXBhcmFtLnR4dApAQCAtMCwwICsxLDY5IEBACis8cmVwb3NpdG9yeT46OgorCVRoZSAicmVtb3RlIiByZXBvc2l0b3J5IHRoYXQgaXMgdGhlIHNvdXJjZSBvZiBhIGZldGNoCisJb3IgcHVsbCBvcGVyYXRpb24uICBTZWUgdGhlIHNlY3Rpb24gPDxVUkxTLEdJVCBVUkxTPj4gYmVsb3cuCisKKzxyZWZzcGVjPjo6CisJVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYSA8cmVmc3BlYz4gcGFyYW1ldGVyIGlzCisJYCs/PHNyYz46PGRzdD5gOyB0aGF0IGlzLCBhbiBvcHRpb25hbCBwbHVzIGArYCwgZm9sbG93ZWQKKwlieSB0aGUgc291cmNlIHJlZiwgZm9sbG93ZWQgYnkgYSBjb2xvbiBgOmAsIGZvbGxvd2VkIGJ5CisJdGhlIGRlc3RpbmF0aW9uIHJlZi4KKysKK1RoZSByZW1vdGUgcmVmIHRoYXQgbWF0Y2hlcyA8c3JjPgoraXMgZmV0Y2hlZCwgYW5kIGlmIDxkc3Q+IGlzIG5vdCBlbXB0eSBzdHJpbmcsIHRoZSBsb2NhbAorcmVmIHRoYXQgbWF0Y2hlcyBpdCBpcyBmYXN0IGZvcndhcmRlZCB1c2luZyA8c3JjPi4KK0FnYWluLCBpZiB0aGUgb3B0aW9uYWwgcGx1cyBgK2AgaXMgdXNlZCwgdGhlIGxvY2FsIHJlZgoraXMgdXBkYXRlZCBldmVuIGlmIGl0IGRvZXMgbm90IHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZAordXBkYXRlLgorKworW05PVEVdCitJZiB0aGUgcmVtb3RlIGJyYW5jaCBmcm9tIHdoaWNoIHlvdSB3YW50IHRvIHB1bGwgaXMKK21vZGlmaWVkIGluIG5vbi1saW5lYXIgd2F5cyBzdWNoIGFzIGJlaW5nIHJld291bmQgYW5kCityZWJhc2VkIGZyZXF1ZW50bHksIHRoZW4gYSBwdWxsIHdpbGwgYXR0ZW1wdCBhIG1lcmdlIHdpdGgKK2FuIG9sZGVyIHZlcnNpb24gb2YgaXRzZWxmLCBsaWtlbHkgY29uZmxpY3QsIGFuZCBmYWlsLgorSXQgaXMgdW5kZXIgdGhlc2UgY29uZGl0aW9ucyB0aGF0IHlvdSB3b3VsZCB3YW50IHRvIHVzZQordGhlIGArYCBzaWduIHRvIGluZGljYXRlIG5vbi1mYXN0LWZvcndhcmQgdXBkYXRlcyB3aWxsCitiZSBuZWVkZWQuICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gZWFzeSB3YXkgdG8gZGV0ZXJtaW5lCitvciBkZWNsYXJlIHRoYXQgYSBicmFuY2ggd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBpbiBhCityZXBvc2l0b3J5IHdpdGggdGhpcyBiZWhhdmlvcjsgdGhlIHB1bGxpbmcgdXNlciBzaW1wbHkKK211c3Qga25vdyB0aGlzIGlzIHRoZSBleHBlY3RlZCB1c2FnZSBwYXR0ZXJuIGZvciBhIGJyYW5jaC4KKysKK1tOT1RFXQorWW91IG5ldmVyIGRvIHlvdXIgb3duIGRldmVsb3BtZW50IG9uIGJyYW5jaGVzIHRoYXQgYXBwZWFyCitvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgPHJlZnNwZWM+IGNvbG9uIG9uIGBQdWxsOmAgbGluZXM7Cit0aGV5IGFyZSB0byBiZSB1cGRhdGVkIGJ5IGBnaXQtZmV0Y2hgLiAgSWYgeW91IGludGVuZCB0byBkbworZGV2ZWxvcG1lbnQgZGVyaXZlZCBmcm9tIGEgcmVtb3RlIGJyYW5jaCBgQmAsIGhhdmUgYSBgUHVsbDpgCitsaW5lIHRvIHRyYWNrIGl0IChpLmUuIGBQdWxsOiBCOnJlbW90ZS1CYCksIGFuZCBoYXZlIGEgc2VwYXJhdGUKK2JyYW5jaCBgbXktQmAgdG8gZG8geW91ciBkZXZlbG9wbWVudCBvbiB0b3Agb2YgaXQuICBUaGUgbGF0dGVyCitpcyBjcmVhdGVkIGJ5IGBnaXQgYnJhbmNoIG15LUIgcmVtb3RlLUJgIChvciBpdHMgZXF1aXZhbGVudCBgZ2l0CitjaGVja291dCAtYiBteS1CIHJlbW90ZS1CYCkuICBSdW4gYGdpdCBmZXRjaGAgdG8ga2VlcCB0cmFjayBvZgordGhlIHByb2dyZXNzIG9mIHRoZSByZW1vdGUgc2lkZSwgYW5kIHdoZW4geW91IHNlZSBzb21ldGhpbmcgbmV3CitvbiB0aGUgcmVtb3RlIGJyYW5jaCwgbWVyZ2UgaXQgaW50byB5b3VyIGRldmVsb3BtZW50IGJyYW5jaCB3aXRoCitgZ2l0IHB1bGwgLiByZW1vdGUtQmAsIHdoaWxlIHlvdSBhcmUgb24gYG15LUJgIGJyYW5jaC4KK1RoZSBjb21tb24gYFB1bGw6IG1hc3RlcjpvcmlnaW5gIG1hcHBpbmcgb2YgYSByZW1vdGUgYG1hc3RlcmAKK2JyYW5jaCB0byBhIGxvY2FsIGBvcmlnaW5gIGJyYW5jaCwgd2hpY2ggaXMgdGhlbiBtZXJnZWQgdG8gYQorbG9jYWwgZGV2ZWxvcG1lbnQgYnJhbmNoLCBhZ2FpbiB0eXBpY2FsbHkgbmFtZWQgYG1hc3RlcmAsIGlzIG1hZGUKK3doZW4geW91IHJ1biBgZ2l0IGNsb25lYCBmb3IgeW91IHRvIGZvbGxvdyB0aGlzIHBhdHRlcm4uCisrCitbTk9URV0KK1RoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGxpc3RpbmcgbXVsdGlwbGUgPHJlZnNwZWM+CitkaXJlY3RseSBvbiBgZ2l0LXB1bGxgIGNvbW1hbmQgbGluZSBhbmQgaGF2aW5nIG11bHRpcGxlCitgUHVsbDpgIDxyZWZzcGVjPiBsaW5lcyBmb3IgYSA8cmVwb3NpdG9yeT4gYW5kIHJ1bm5pbmcKK2BnaXQtcHVsbGAgY29tbWFuZCB3aXRob3V0IGFueSBleHBsaWNpdCA8cmVmc3BlYz4gcGFyYW1ldGVycy4KKzxyZWZzcGVjPiBsaXN0ZWQgZXhwbGljaXRseSBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBhbHdheXMKK21lcmdlZCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCBhZnRlciBmZXRjaGluZy4gIEluIG90aGVyIHdvcmRzLAoraWYgeW91IGxpc3QgbW9yZSB0aGFuIG9uZSByZW1vdGUgcmVmcywgeW91IHdvdWxkIGJlIG1ha2luZworYW4gT2N0b3B1cy4gIFdoaWxlIGBnaXQtcHVsbGAgcnVuIHdpdGhvdXQgYW55IGV4cGxpY2l0IDxyZWZzcGVjPgorcGFyYW1ldGVyIHRha2VzIGRlZmF1bHQgPHJlZnNwZWM+cyBmcm9tIGBQdWxsOmAgbGluZXMsIGl0CittZXJnZXMgb25seSB0aGUgZmlyc3QgPHJlZnNwZWM+IGZvdW5kIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLAorYWZ0ZXIgZmV0Y2hpbmcgYWxsIHRoZSByZW1vdGUgcmVmcy4gIFRoaXMgaXMgYmVjYXVzZSBtYWtpbmcgYW4KK09jdG9wdXMgZnJvbSByZW1vdGUgcmVmcyBpcyByYXJlbHkgZG9uZSwgd2hpbGUga2VlcGluZyB0cmFjaworb2YgbXVsdGlwbGUgcmVtb3RlIGhlYWRzIGluIG9uZS1nbyBieSBmZXRjaGluZyBtb3JlIHRoYW4gb25lCitpcyBvZnRlbiB1c2VmdWwuCisrCitTb21lIHNob3J0LWN1dCBub3RhdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVkLgorKworKiBgdGFnIDx0YWc+YCBtZWFucyB0aGUgc2FtZSBhcyBgcmVmcy90YWdzLzx0YWc+OnJlZnMvdGFncy88dGFnPmA7IAorICBpdCByZXF1ZXN0cyBmZXRjaGluZyBldmVyeXRoaW5nIHVwIHRvIHRoZSBnaXZlbiB0YWcuCisqIEEgcGFyYW1ldGVyIDxyZWY+IHdpdGhvdXQgYSBjb2xvbiBpcyBlcXVpdmFsZW50IHRvCisgIDxyZWY+OiB3aGVuIHB1bGxpbmcvZmV0Y2hpbmcsIHNvIGl0IG1lcmdlcyA8cmVmPiBpbnRvIHRoZSBjdXJyZW50CisgIGJyYW5jaCB3aXRob3V0IHN0b3JpbmcgdGhlIHJlbW90ZSBicmFuY2ggYW55d2hlcmUgbG9jYWxseQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZXBvc2l0b3J5LWxheW91dC50eHQgYi9Eb2N1bWVudGF0aW9uL3JlcG9zaXRvcnktbGF5b3V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTJkZmRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9yZXBvc2l0b3J5LWxheW91dC50eHQKQEAgLTAsMCArMSwxNDEgQEAKK2dpdCByZXBvc2l0b3J5IGxheW91dAorPT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBtYXkgZmluZCB0aGVzZSB0aGluZ3MgaW4geW91ciBnaXQgcmVwb3NpdG9yeSAoYC5naXRgCitkaXJlY3RvcnkgZm9yIGEgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggeW91ciB3b3JraW5nIHRyZWUsIG9yCitgJ3Byb2plY3QnLmdpdGAgZGlyZWN0b3J5IGZvciBhIHB1YmxpYyAnYmFyZScgcmVwb3NpdG9yeSkuCisKK29iamVjdHM6OgorCU9iamVjdCBzdG9yZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5LiAgVXN1YWxseQorCWFuIG9iamVjdCBzdG9yZSBpcyBzZWxmIHN1ZmZpY2llbnQgKGkuZS4gYWxsIHRoZSBvYmplY3RzCisJdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkgYW4gb2JqZWN0IGZvdW5kIGluIGl0IGFyZSBhbHNvCisJZm91bmQgaW4gaXQpLCBidXQgdGhlcmUgYXJlIGNvdXBsZSBvZiB3YXlzIHRvIHZpb2xhdGUKKwlpdC4KKysKKy4gWW91IGNvdWxkIHBvcHVsYXRlIHRoZSByZXBvc2l0b3J5IGJ5IHJ1bm5pbmcgYSBjb21taXQgd2Fsa2VyCit3aXRob3V0IGAtYWAgb3B0aW9uLiAgRGVwZW5kaW5nIG9uIHdoaWNoIG9wdGlvbnMgYXJlIGdpdmVuLCB5b3UKK2NvdWxkIGhhdmUgb25seSBjb21taXQgb2JqZWN0cyB3aXRob3V0IGFzc29jaWF0ZWQgYmxvYnMgYW5kCit0cmVlcyB0aGlzIHdheSwgZm9yIGV4YW1wbGUuICBBIHJlcG9zaXRvcnkgd2l0aCB0aGlzIGtpbmQgb2YKK2luY29tcGxldGUgb2JqZWN0IHN0b3JlIGlzIG5vdCBzdWl0YWJsZSB0byBiZSBwdWJsaXNoZWQgdG8gdGhlCitvdXRzaWRlIHdvcmxkIGJ1dCBzb21ldGltZXMgdXNlZnVsIGZvciBwcml2YXRlIHJlcG9zaXRvcnkuCisuIFlvdSBjYW4gYmUgdXNpbmcgYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBtZWNoYW5pc20sIG9yCitgJEdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTYCBtZWNoYW5pc20gdG8gJ2JvcnJvdycKK29iamVjdHMgZnJvbSBvdGhlciBvYmplY3Qgc3RvcmVzLiAgQSByZXBvc2l0b3J5IHdpdGggdGhpcyBraW5kCitvZiBpbmNvbXBsZXRlIG9iamVjdCBzdG9yZSBpcyBub3Qgc3VpdGFibGUgdG8gYmUgcHVibGlzaGVkIGZvcgordXNlIHdpdGggZHVtYiB0cmFuc3BvcnRzIGJ1dCBvdGhlcndpc2UgaXMgT0sgYXMgbG9uZyBhcworYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBwb2ludHMgYXQgdGhlIHJpZ2h0IG9iamVjdCBzdG9yZXMKK2l0IGJvcnJvd3MgZnJvbS4KKworb2JqZWN0cy9bMC05YS1mXVswLTlhLWZdOjoKKwlUcmFkaXRpb25hbGx5LCBlYWNoIG9iamVjdCBpcyBzdG9yZWQgaW4gaXRzIG93biBmaWxlLgorCVRoZXkgYXJlIHNwbGl0IGludG8gMjU2IHN1YmRpcmVjdG9yaWVzIHVzaW5nIHRoZSBmaXJzdAorCXR3byBsZXR0ZXJzIGZyb20gaXRzIG9iamVjdCBuYW1lIHRvIGtlZXAgdGhlIG51bWJlciBvZgorCWRpcmVjdG9yeSBlbnRyaWVzIGBvYmplY3RzYCBkaXJlY3RvcnkgaXRzZWxmIG5lZWRzIHRvCisJaG9sZC4gIE9iamVjdHMgZm91bmQgaGVyZSBhcmUgb2Z0ZW4gY2FsbGVkICd1bnBhY2tlZCcKKwlvYmplY3RzLgorCitvYmplY3RzL3BhY2s6OgorCVBhY2tzIChmaWxlcyB0aGF0IHN0b3JlIG1hbnkgb2JqZWN0IGluIGNvbXByZXNzZWQgZm9ybSwKKwlhbG9uZyB3aXRoIGluZGV4IGZpbGVzIHRvIGFsbG93IHRoZW0gdG8gYmUgcmFuZG9tbHkKKwlhY2Nlc3NlZCkgYXJlIGZvdW5kIGluIHRoaXMgZGlyZWN0b3J5LgorCitvYmplY3RzL2luZm86OgorCUFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBzdG9yZSBpcworCXJlY29yZGVkIGluIHRoaXMgZGlyZWN0b3J5LgorCitvYmplY3RzL2luZm8vcGFja3M6OgorCVRoaXMgZmlsZSBpcyB0byBoZWxwIGR1bWIgdHJhbnNwb3J0cyBkaXNjb3ZlciB3aGF0IHBhY2tzCisJYXJlIGF2YWlsYWJsZSBpbiB0aGlzIG9iamVjdCBzdG9yZS4gIFdoZW5ldmVyIGEgcGFjayBpcworCWFkZGVkIG9yIHJlbW92ZWQsIGBnaXQgdXBkYXRlLXNlcnZlci1pbmZvYCBzaG91bGQgYmUgcnVuCisJdG8ga2VlcCB0aGlzIGZpbGUgdXAtdG8tZGF0ZSBpZiB0aGUgcmVwb3NpdG9yeSBpcworCXB1Ymxpc2hlZCBmb3IgZHVtYiB0cmFuc3BvcnRzLiAgYGdpdCByZXBhY2tgIGRvZXMgdGhpcworCWJ5IGRlZmF1bHQuCisKK29iamVjdHMvaW5mby9hbHRlcm5hdGVzOjoKKwlUaGlzIGZpbGUgcmVjb3JkcyBhYnNvbHV0ZSBmaWxlc3lzdGVtIHBhdGhzIG9mIGFsdGVybmF0ZQorCW9iamVjdCBzdG9yZXMgdGhhdCB0aGlzIG9iamVjdCBzdG9yZSBib3Jyb3dzIG9iamVjdHMKKwlmcm9tLCBvbmUgcGF0aG5hbWUgcGVyIGxpbmUuCisKK3JlZnM6OgorCVJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiBzdWJkaXJlY3RvcmllcyBvZiB0aGlzCisJZGlyZWN0b3J5LiAgVGhlIGBnaXQgcHJ1bmVgIGNvbW1hbmQga25vd3MgdG8ga2VlcAorCW9iamVjdHMgcmVhY2hhYmxlIGZyb20gcmVmcyBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSBhbmQKKwlpdHMgc3ViZGlyZWN0b3JpZXMuCisKK3JlZnMvaGVhZHMvYG5hbWVgOjoKKwlyZWNvcmRzIHRpcC1vZi10aGUtdHJlZSBjb21taXQgb2JqZWN0cyBvZiBicmFuY2ggYG5hbWVgCisKK3JlZnMvdGFncy9gbmFtZWA6OgorCXJlY29yZHMgYW55IG9iamVjdCBuYW1lIChub3QgbmVjZXNzYXJpbHkgYSBjb21taXQKKwlvYmplY3QsIG9yIGEgdGFnIG9iamVjdCB0aGF0IHBvaW50cyBhdCBhIGNvbW1pdCBvYmplY3QpLgorCitIRUFEOjoKKwlBIHN5bWxpbmsgb2YgdGhlIGZvcm0gYHJlZnMvaGVhZHMvJ25hbWUnYCB0byBwb2ludCBhdAorCXRoZSBjdXJyZW50IGJyYW5jaCwgaWYgZXhpc3RzLiAgSXQgZG9lcyBub3QgbWVhbiBtdWNoIGlmCisJdGhlIHJlcG9zaXRvcnkgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgd29ya2luZyB0cmVlCisJKGkuZS4gYSAnYmFyZScgcmVwb3NpdG9yeSksIGJ1dCBhIHZhbGlkIGdpdCByZXBvc2l0b3J5CisJKm11c3QqIGhhdmUgc3VjaCBhIHN5bWxpbmsgaGVyZS4gIEl0IGlzIGxlZ2FsIGlmIHRoZQorCW5hbWVkIGJyYW5jaCAnbmFtZScgZG9lcyBub3QgKHlldCkgZXhpc3QuCisKK2JyYW5jaGVzOjoKKwlBIHNsaWdodGx5IGRlcHJlY2F0ZWQgd2F5IHRvIHN0b3JlIHNob3J0aGFuZHMgdG8gYmUgdXNlZAorCXRvIHNwZWNpZnkgVVJMIHRvIGBnaXQgZmV0Y2hgLCBgZ2l0IHB1bGxgIGFuZCBgZ2l0IHB1c2hgCisJY29tbWFuZHMgaXMgdG8gc3RvcmUgYSBmaWxlIGluIGBicmFuY2hlcy8nbmFtZSdgIGFuZAorCWdpdmUgJ25hbWUnIHRvIHRoZXNlIGNvbW1hbmRzIGluIHBsYWNlIG9mICdyZXBvc2l0b3J5JworCWFyZ3VtZW50LgorCitob29rczo6CisJSG9va3MgYXJlIGN1c3RvbWl6YXRpb24gc2NyaXB0cyB1c2VkIGJ5IHZhcmlvdXMgZ2l0CisJY29tbWFuZHMuICBBIGhhbmRmdWwgb2Ygc2FtcGxlIGhvb2tzIGFyZSBpbnN0YWxsZWQgd2hlbgorCWBnaXQgaW5pdC1kYmAgaXMgcnVuLCBidXQgYWxsIG9mIHRoZW0gYXJlIGRpc2FibGVkIGJ5CisJZGVmYXVsdC4gIFRvIGVuYWJsZSwgdGhleSBuZWVkIHRvIGJlIG1hZGUgZXhlY3V0YWJsZS4KKwlSZWFkIGxpbms6aG9va3MuaHRtbFtob29rc10gZm9yIG1vcmUgZGV0YWlscyBhYm91dAorCWVhY2ggaG9vay4KKworaW5kZXg6OgorCVRoZSBjdXJyZW50IGluZGV4IGZpbGUgZm9yIHRoZSByZXBvc2l0b3J5LiAgSXQgaXMKKwl1c3VhbGx5IG5vdCBmb3VuZCBpbiBhIGJhcmUgcmVwb3NpdG9yeS4KKworaW5mbzo6CisJQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVwb3NpdG9yeSBpcyByZWNvcmRlZAorCWluIHRoaXMgZGlyZWN0b3J5LgorCitpbmZvL3JlZnM6OgorCVRoaXMgZmlsZSBpcyB0byBoZWxwIGR1bWIgdHJhbnNwb3J0cyB0byBkaXNjb3ZlciB3aGF0CisJcmVmcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeS4gIFdoZW5ldmVyIHlvdQorCWNyZWF0ZS9kZWxldGUgYSBuZXcgYnJhbmNoIG9yIGEgbmV3IHRhZywgYGdpdAorCXVwZGF0ZS1zZXJ2ZXItaW5mb2Agc2hvdWxkIGJlIHJ1biB0byBrZWVwIHRoaXMgZmlsZQorCXVwLXRvLWRhdGUgaWYgdGhlIHJlcG9zaXRvcnkgaXMgcHVibGlzaGVkIGZvciBkdW1iCisJdHJhbnNwb3J0cy4gIFRoZSBgZ2l0LXJlY2VpdmUtcGFja2AgY29tbWFuZCwgd2hpY2ggaXMKKwlydW4gb24gYSByZW1vdGUgcmVwb3NpdG9yeSB3aGVuIHlvdSBgZ2l0IHB1c2hgIGludG8gaXQsCisJcnVucyBgaG9va3MvdXBkYXRlYCBob29rIHRvIGhlbHAgeW91IGFjaGlldmUgdGhpcy4KKworaW5mby9ncmFmdHM6OgorCVRoaXMgZmlsZSByZWNvcmRzIGZha2UgY29tbWl0IGFuY2VzdHJ5IGluZm9ybWF0aW9uLCB0bworCXByZXRlbmQgdGhlIHNldCBvZiBwYXJlbnRzIGEgY29tbWl0IGhhcyBpcyBkaWZmZXJlbnQKKwlmcm9tIGhvdyB0aGUgY29tbWl0IHdhcyBhY3R1YWxseSBjcmVhdGVkLiAgT25lIHJlY29yZAorCXBlciBsaW5lIGRlc2NyaWJlcyBhIGNvbW1pdCBhbmQgaXRzIGZha2UgcGFyZW50cyBieQorCWxpc3RpbmcgdGhlaXIgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QgbmFtZXMgc2VwYXJhdGVkCisJYnkgYSBzcGFjZSBhbmQgdGVybWluYXRlZCBieSBhIG5ld2xpbmUuCisKK2luZm8vZXhjbHVkZTo6CisJVGhpcyBmaWxlLCBieSBjb252ZW50aW9uIGFtb25nIFBvcmNlbGFpbnMsIHN0b3JlcyB0aGUKKwlleGNsdWRlIHBhdHRlcm4gbGlzdC4gIGBnaXQgc3RhdHVzYCBsb29rcyBhdCBpdCwgYnV0CisJb3RoZXJ3aXNlIGl0IGlzIG5vdCBsb29rZWQgYXQgYnkgYW55IG9mIHRoZSBjb3JlIGdpdAorCWNvbW1hbmRzLgorCityZW1vdGVzOjoKKwlTdG9yZXMgc2hvcnRoYW5kcyB0byBiZSB1c2VkIHRvIGdpdmUgVVJMIGFuZCBkZWZhdWx0CisJcmVmbmFtZXMgdG8gaW50ZXJhY3Qgd2l0aCByZW1vdGUgcmVwb3NpdG9yeSB0byBgZ2l0CisJZmV0Y2hgLCBgZ2l0IHB1bGxgIGFuZCBgZ2l0IHB1c2hgIGNvbW1hbmRzLgorCitsb2dzOjoKKwlSZWNvcmRzIG9mIGNoYW5nZXMgbWFkZSB0byByZWZzIGFyZSBzdG9yZWQgaW4gdGhpcworCWRpcmVjdG9yeS4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBnaXQtdXBkYXRlLXJlZgorCWZvciBtb3JlIGluZm9ybWF0aW9uLgorCitsb2dzL3JlZnMvaGVhZHMvYG5hbWVgOjoKKwlSZWNvcmRzIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlIGJyYW5jaCB0aXAgbmFtZWQgYG5hbWVgLgorCitsb2dzL3JlZnMvdGFncy9gbmFtZWA6OgorCVJlY29yZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgdGFnIG5hbWVkIGBuYW1lYC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc29ydF9nbG9zc2FyeS5wbCBiL0RvY3VtZW50YXRpb24vc29ydF9nbG9zc2FyeS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGJjNTUyYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc29ydF9nbG9zc2FyeS5wbApAQCAtMCwwICsxLDY5IEBACisjIS91c3IvYmluL3BlcmwKKworJXRlcm1zPSgpOworCit3aGlsZSg8PikgeworCWlmKC9eKFxTLiopOjokLykgeworCQlteSAkdGVybT0kMTsKKwkJaWYoZGVmaW5lZCgkdGVybXN7JHRlcm19KSkgeworCQkJZGllICIkMSBkZWZpbmVkIHR3aWNlXG4iOworCQl9CisJCSR0ZXJtc3skdGVybX09IiI7CisJCUxPT1A6IHdoaWxlKDw+KSB7CisJCQlpZigvXiQvKSB7CisJCQkJbGFzdCBMT09QOworCQkJfQorCQkJaWYoL14JXFMvKSB7CisJCQkJJHRlcm1zeyR0ZXJtfS49JF87CisJCQl9IGVsc2UgeworCQkJCWRpZSAiRXJyb3IgMTogJF8iOworCQkJfQorCQl9CisJfQorfQorCitzdWIgZm9ybWF0X3RhYl84MCAoJCkgeworCW15ICR0ZXh0PSRfWzBdOworCW15ICRyZXN1bHQ9IiI7CisJJHRleHQ9fnMvXHMrLyAvZzsKKwkkdGV4dD1+cy9eXHMrLy87CisJd2hpbGUoJHRleHQ9fi9eKC57MSw3Mn0pKHxccysoXFMuKik/KSQvKSB7CisJCSRyZXN1bHQuPSIJIi4kMS4iXG4iOworCQkkdGV4dD0kMzsKKwl9CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKK3N1YiBub19zcGFjZXMgKCQpIHsKKwlteSAkcmVzdWx0PSRfWzBdOworCSRyZXN1bHQ9fnRyLyAvXy87CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKK3ByaW50ICdHSVQgR2xvc3NhcnkKKz09PT09PT09PT09PQorCitUaGlzIGxpc3QgaXMgc29ydGVkIGFscGhhYmV0aWNhbGx5OgorCisnOworCitAa2V5cz1zb3J0IHt1YygkYSkgY21wIHVjKCRiKX0ga2V5cyAldGVybXM7CiskcGF0dGVybj0nKFxiKD88IWxpbms6Z2l0LSknLmpvaW4oJ1xifFxiKD88IWxpbms6Z2l0LSknLHJldmVyc2UgQGtleXMpLidcYiknOworZm9yZWFjaCAka2V5IChAa2V5cykgeworCSR0ZXJtc3ska2V5fT1+cy8kcGF0dGVybi9zcHJpbnRmICI8PHJlZl8iLm5vX3NwYWNlcygkMSkuIiwkMT4+IjsvZWc7CisJcHJpbnQgJ1tbcmVmXycubm9fc3BhY2VzKCRrZXkpLiddXScuJGtleS4iOjpcbiIKKwkJLmZvcm1hdF90YWJfODAoJHRlcm1zeyRrZXl9KS4iXG4iOworfQorCitwcmludCAnCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4gPEpvaGFubmVzLlNjaGluZGVsaW5AZ214LmRlPiBhbmQKK3RoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rOmdpdC5odG1sW2dpdF0gc3VpdGUKKyc7CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stZm9ybWF0LnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTFmZmIyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1mb3JtYXQudHh0CkBAIC0wLDAgKzEsMTE2IEBACitHSVQgcGFjayBmb3JtYXQKKz09PT09PT09PT09PT09PQorCis9IHBhY2stKi5wYWNrIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgICAtIFRoZSBoZWFkZXIgYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgIDQtYnl0ZSBzaWduYXR1cmU6CisgICAgICAgICBUaGUgc2lnbmF0dXJlIGlzOiB7J1AnLCAnQScsICdDJywgJ0snfQorCisgICAgIDQtYnl0ZSB2ZXJzaW9uIG51bWJlciAobmV0d29yayBieXRlIG9yZGVyKToKKyAgICAgICAgIEdJVCBjdXJyZW50bHkgYWNjZXB0cyB2ZXJzaW9uIG51bWJlciAyIG9yIDMgYnV0CisgICAgICAgICBnZW5lcmF0ZXMgdmVyc2lvbiAyIG9ubHkuCisKKyAgICAgNC1ieXRlIG51bWJlciBvZiBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgcGFjayAobmV0d29yayBieXRlIG9yZGVyKQorCisgICAgIE9ic2VydmF0aW9uOiB3ZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gNEcgdmVyc2lvbnMgOy0pIGFuZAorICAgICBtb3JlIHRoYW4gNEcgb2JqZWN0cyBpbiBhIHBhY2suCisKKyAgIC0gVGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBudW1iZXIgb2Ygb2JqZWN0IGVudHJpZXMsIGVhY2ggb2YKKyAgICAgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgorCisgICAgICh1bmRlbHRpZmllZCByZXByZXNlbnRhdGlvbikKKyAgICAgbi1ieXRlIHR5cGUgYW5kIGxlbmd0aCAoNC1iaXQgdHlwZSwgKG4tMSkqNys0LWJpdCBsZW5ndGgpCisgICAgIGNvbXByZXNzZWQgZGF0YQorCisgICAgIChkZWx0aWZpZWQgcmVwcmVzZW50YXRpb24pCisgICAgIG4tYnl0ZSB0eXBlIGFuZCBsZW5ndGggKDQtYml0IHR5cGUsIChuLTEpKjcrNC1iaXQgbGVuZ3RoKQorICAgICAyMC1ieXRlIGJhc2Ugb2JqZWN0IG5hbWUKKyAgICAgY29tcHJlc3NlZCBkZWx0YSBkYXRhCisKKyAgICAgT2JzZXJ2YXRpb246IGxlbmd0aCBvZiBlYWNoIG9iamVjdCBpcyBlbmNvZGVkIGluIGEgdmFyaWFibGUKKyAgICAgbGVuZ3RoIGZvcm1hdCBhbmQgaXMgbm90IGNvbnN0cmFpbmVkIHRvIDMyLWJpdCBvciBhbnl0aGluZy4KKworICAtIFRoZSB0cmFpbGVyIHJlY29yZHMgMjAtYnl0ZSBTSEExIGNoZWNrc3VtIG9mIGFsbCBvZiB0aGUgYWJvdmUuCisKKz0gcGFjay0qLmlkeCBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAtIFRoZSBoZWFkZXIgY29uc2lzdHMgb2YgMjU2IDQtYnl0ZSBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAgICBpbnRlZ2Vycy4gIE4tdGggZW50cnkgb2YgdGhpcyB0YWJsZSByZWNvcmRzIHRoZSBudW1iZXIgb2YKKyAgICBvYmplY3RzIGluIHRoZSBjb3JyZXNwb25kaW5nIHBhY2ssIHRoZSBmaXJzdCBieXRlIG9mIHdob3NlCisgICAgb2JqZWN0IG5hbWUgYXJlIHNtYWxsZXIgdGhhbiBOLiAgVGhpcyBpcyBjYWxsZWQgdGhlCisgICAgJ2ZpcnN0LWxldmVsIGZhbi1vdXQnIHRhYmxlLgorCisgICAgT2JzZXJ2YXRpb246IHdlIHdvdWxkIG5lZWQgdG8gZXh0ZW5kIHRoaXMgdG8gYW4gYXJyYXkgb2YKKyAgICA4LWJ5dGUgaW50ZWdlcnMgdG8gZ28gYmV5b25kIDRHIG9iamVjdHMgcGVyIHBhY2ssIGJ1dCBpdCBpcworICAgIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkuCisKKyAgLSBUaGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IHNvcnRlZCAyNC1ieXRlIGVudHJpZXMsIG9uZSBlbnRyeQorICAgIHBlciBvYmplY3QgaW4gdGhlIHBhY2suICBFYWNoIGVudHJ5IGlzOgorCisgICAgNC1ieXRlIG5ldHdvcmsgYnl0ZSBvcmRlciBpbnRlZ2VyLCByZWNvcmRpbmcgd2hlcmUgdGhlCisgICAgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUgcGFja2ZpbGUgYXMgdGhlIG9mZnNldCBmcm9tIHRoZQorICAgIGJlZ2lubmluZy4KKworICAgIDIwLWJ5dGUgb2JqZWN0IG5hbWUuCisKKyAgICBPYnNlcnZhdGlvbjogd2Ugd291bGQgZGVmaW5pdGVseSBuZWVkIHRvIGV4dGVuZCB0aGlzIHRvCisgICAgOC1ieXRlIGludGVnZXIgcGx1cyAyMC1ieXRlIG9iamVjdCBuYW1lIHRvIGhhbmRsZSBhIHBhY2tmaWxlCisgICAgdGhhdCBpcyBsYXJnZXIgdGhhbiA0R0IuCisKKyAgLSBUaGUgZmlsZSBpcyBjb25jbHVkZWQgd2l0aCBhIHRyYWlsZXI6CisKKyAgICBBIGNvcHkgb2YgdGhlIDIwLWJ5dGUgU0hBMSBjaGVja3N1bSBhdCB0aGUgZW5kIG9mCisgICAgY29ycmVzcG9uZGluZyBwYWNrZmlsZS4KKworICAgIDIwLWJ5dGUgU0hBMS1jaGVja3N1bSBvZiBhbGwgb2YgdGhlIGFib3ZlLgorCitQYWNrIElkeCBmaWxlOgorCisJaWR4CisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgICAgfCBmYW5vdXRbMF0gPSAyICAgICAgICAgICAgICAgICAgfC0uCisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorCSAgICB8IGZhbm91dFsxXSAgICAgICAgICAgICAgICAgICAgICB8IHwKKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8CisJICAgIHwgZmFub3V0WzJdICAgICAgICAgICAgICAgICAgICAgIHwgfAorCSAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IHwKKwkgICAgfCBmYW5vdXRbMjU1XSAgICAgICAgICAgICAgICAgICAgfCB8CisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorbWFpbgkgICAgfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CitpbmRleAkgICAgfCBvYmplY3QgbmFtZSAwMFhYWFhYWFhYWFhYWFhYWFggfCB8Cit0YWJsZQkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8IAorCSAgICB8IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKwkgICAgfCBvYmplY3QgbmFtZSAwMFhYWFhYWFhYWFhYWFhYWFggfCB8CisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorCSAgLi18IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8PCsKKwkgIHwgfCBvYmplY3QgbmFtZSAwMVhYWFhYWFhYWFhYWFhYWFggfAorCSAgfCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICB8IHwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgIHwgfCBvYmplY3QgbmFtZSAwMVhYWFhYWFhYWFhYWFhYWFggfAorCSAgfCB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisJICB8IHwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgIHwgfCBvYmplY3QgbmFtZSBGRlhYWFhYWFhYWFhYWFhYWFggfAorCSAgfCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit0cmFpbGVyCSAgfCB8IHBhY2tmaWxlIGNoZWNrc3VtICAgICAgICAgICAgICB8CisJICB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgIHwgfCBpZHhmaWxlIGNoZWNrc3VtICAgICAgICAgICAgICAgfAorCSAgfCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgLi0tLS0tLS0uICAgICAgCisgICAgICAgICAgICAgICAgICB8CitQYWNrIGZpbGUgZW50cnk6IDwrCisKKyAgICAgcGFja2VkIG9iamVjdCBoZWFkZXI6CisJMS1ieXRlIHR5cGUgKHVwcGVyIDQtYml0KQorCSAgICAgICBzaXplMCAobG93ZXIgNC1iaXQpIAorICAgICAgICBuLWJ5dGUgc2l6ZU4gKGFzIGxvbmcgYXMgTVNCIGlzIHNldCwgZWFjaCA3LWJpdCkKKwkJc2l6ZTAuLnNpemVOIGZvcm0gNCs3KzcrLi4rNyBiaXQgaW50ZWdlciwgc2l6ZTAKKwkJaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydC4KKyAgICAgcGFja2VkIG9iamVjdCBkYXRhOgorICAgICAgICBJZiBpdCBpcyBub3QgREVMVEEsIHRoZW4gZGVmbGF0ZWQgYnl0ZXMgKHRoZSBzaXplIGFib3ZlCisJCWlzIHRoZSBzaXplIGJlZm9yZSBjb21wcmVzc2lvbikuCisJSWYgaXQgaXMgREVMVEEsIHRoZW4KKwkgIDIwLWJ5dGUgYmFzZSBvYmplY3QgbmFtZSBTSEExICh0aGUgc2l6ZSBhYm92ZSBpcyB0aGUKKwkgIAlzaXplIG9mIHRoZSBkZWx0YSBkYXRhIHRoYXQgZm9sbG93cykuCisgICAgICAgICAgZGVsdGEgZGF0YSwgZGVmbGF0ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLWhldXJpc3RpY3MudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1oZXVyaXN0aWNzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWFkZDVjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1oZXVyaXN0aWNzLnR4dApAQCAtMCwwICsxLDQ2NiBAQAorICAgICAgICBDb25jZXJuaW5nIEdpdCdzIFBhY2tpbmcgSGV1cmlzdGljcworICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE9oLCBoZXJlJ3MgYSByZWFsbHkgc3R1cGlkIHF1ZXN0aW9uOgorCisgICAgICAgICAgICAgICAgICBXaGVyZSBkbyBJIGdvCisgICAgICAgICAgICAgICB0byBsZWFybiB0aGUgZGV0YWlscworCSAgICBvZiBnaXQncyBwYWNraW5nIGhldXJpc3RpY3M/CisKK0JlIGNhcmVmdWwgd2hhdCB5b3UgYXNrIQorCitGb2xsb3dlcnMgb2YgdGhlIGdpdCwgcGxlYXNlIG9wZW4gdGhlIGdpdCBJUkMgTG9nIGFuZCB0dXJuIHRvCitGZWJydWFyeSAxMCwgMjAwNi4KKworSXQncyBhIHJhcmUgb2NjYXNpb24sIGFuZCB3ZSBhcmUgam9pbmVkIGJ5IHRoZSBLaW5nIEdpdCBIaW1zZWxmLAorTGludXMgVG9ydmFsZHMgKGxpbnVzKS4gIE5hdGhhbmllbCBTbWl0aCwgKG5qc2ApLCBoYXMgdGhlIGZsb29yCithbmQgc2Vla3MgZW5saWdodGVubWVudC4gIE90aGVycyBhcmUgcHJlc2VudCwgYnV0IHNpbGVudC4KKworTGV0J3MgbGlzdGVuIGluIQorCisgICAgPG5qc2A+IE9oLCBoZXJlJ3MgYSByZWFsbHkgc3R1cGlkIHF1ZXN0aW9uIC0tIHdoZXJlIGRvIEkgZ28gdG8KKyAgICAgICAgbGVhcm4gdGhlIGRldGFpbHMgb2YgZ2l0J3MgcGFja2luZyBoZXVyaXN0aWNzPyAgZ29vZ2xlIGF2YWlscworICAgICAgICBtZSBub3QsIHJlYWRpbmcgdGhlIHNvdXJjZSBkaWRuJ3QgaGVscCBhIGxvdCwgYW5kIHdhZGluZworICAgICAgICB0aHJvdWdoIHRoZSB3aG9sZSBtYWlsaW5nIGxpc3Qgc2VlbXMgbGVzcyBlZmZpY2llbnQgdGhhbiBhbnkKKyAgICAgICAgb2YgdGhhdC4KKworSXQgaXMgYSBib2xkIHN0YXJ0ISAgQSBwbGVhIGZvciBoZWxwIGNvbWJpbmVkIHdpdGggYSBzaW11bHRhbmVvdXMKK3RyaS1wYXJ0IGF0dGFjayBvbiBzb21lIG9mIHRoZSB0cmllZCBhbmQgdHJ1ZSBtYWluc3RheXMgaW4gdGhlIHF1ZXN0Citmb3IgZW5saWdodGVubWVudC4gIEJyYXNoIGFjY3VzYXRpb25zIG9mIGdvb2dsZSBiZWluZyB1c2VsZXNzLiBIdWJyaXMhCitNYWxpZ25pbmcgdGhlIHNvdXJjZS4gIEhlcmVzeSEgIERpc2RhaW4gZm9yIHRoZSBtYWlsaW5nIGxpc3QgYXJjaGl2ZXMuCitXb2UuCisKKyAgICA8cGFza3k+IHllcywgdGhlIHBhY2tpbmctcmVsYXRlZCBkZWx0YSBzdHVmZiBpcyBzb21ld2hhdAorICAgICAgICBteXN0ZXJpb3VzIGV2ZW4gZm9yIG1lIDspCisKK0FoISAgTW9kZXN0eSBhZnRlciBhbGwuCisKKyAgICA8bGludXM+IG5qcywgSSBkb24ndCB0aGluayB0aGUgZG9jcyBleGlzdC4gVGhhdCdzIHNvbWV0aGluZyB3aGVyZQorCSBJIGRvbid0IHRoaW5rIGFueWJvZHkgZWxzZSB0aGFuIG1lIGV2ZW4gcmVhbGx5IGdvdCBpbnZvbHZlZC4KKwkgTW9zdCBvZiB0aGUgcmVzdCBvZiBnaXQgb3RoZXJzIGhhdmUgYmVlbiBidXN5IHdpdGggKGVzcGVjaWFsbHkKKwkgSnVuaW8pLCBidXQgcGFja2luZyBub2JvZHkgdG91Y2hlZCBhZnRlciBJIGRpZCBpdC4KKworSXQncyBjcnlwdGljLCB5ZXQgdmFndWUuICBMaW51cyBpbiBzdHlsZSBmb3Igc3VyZS4gIFdpc2UgbWVuCitpbnRlcnByZXQgdGhpcyBhcyBhbiBhcG9sb2d5LiAgQSBmZXcgYXJndWUgaXQgaXMgbWVyZWx5IGEKK3N0YXRlbWVudCBvZiBmYWN0LgorCisgICAgPG5qc2A+IEkgZ3Vlc3MgdGhlIG5leHQgc3RlcCBpcyAicmVhZCB0aGUgc291cmNlIGFnYWluIiwgYnV0IEkKKyAgICAgICAgaGF2ZSB0byBidWlsZCB1cCBhIGNlcnRhaW4gbGV2ZWwgb2YgZ3VtcHRpb24gZmlyc3QgOi0pCisKK0luZGVlZCEgIE9uIGJvdGggcG9pbnRzLgorCisgICAgPGxpbnVzPiBUaGUgcGFja2luZyBoZXVyaXN0aWMgaXMgYWN0dWFsbHkgcmVhbGx5IHJlYWxseSBzaW1wbGUuCisKK0JhaXQuLi4KKworICAgIDxsaW51cz4gQnV0IHN0cmFuZ2UuCisKK0FuZCBzd2l0Y2guICBUaGF0IG91Z2h0IHRvIGRvIGl0IQorCisgICAgPGxpbnVzPiBSZW1lbWJlcjogZ2l0IHJlYWxseSBkb2Vzbid0IGZvbGxvdyBmaWxlcy4gU28gd2hhdCBpdCBkb2VzIGlzCisgICAgICAgIC0gZ2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBvYmplY3RzCisgICAgICAgIC0gc29ydCB0aGUgbGlzdCBhY2NvcmRpbmcgdG8gbWFnaWMgaGV1cmlzdGljcworICAgICAgICAtIHdhbGsgdGhlIGxpc3QsIHVzaW5nIGEgc2xpZGluZyB3aW5kb3csIHNlZWluZyBpZiBhbiBvYmplY3QKKyAgICAgICAgICBjYW4gYmUgZGlmZmVkIGFnYWluc3QgYW5vdGhlciBvYmplY3QgaW4gdGhlIHdpbmRvdworICAgICAgICAtIHdyaXRlIG91dCB0aGUgbGlzdCBpbiByZWNlbmN5IG9yZGVyCisKK1RoZSB0cmFkaXRpb25hbCB1bmRlcnN0YXRlbWVudDoKKworICAgIDxuanNgPiBJIHN1c3BlY3QgdGhhdCB3aGF0IEknbSBtaXNzaW5nIGlzIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gb2YKKyAgICAgICAgdGhlIHdvcmQgIm1hZ2ljIgorCitUaGUgdHJhZGl0aW9uYWwgaW5zaWdodDoKKworICAgIDxwYXNreT4geWVzCisKK0FuZCBCYWJsZS1saWtlIGNvbmZ1c2lvbiBmbG93ZWQuCisKKyAgICA8bmpzYD4gb2gsIGhtbSwgYW5kIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgc2xpZGluZyB3aW5kb3cgbWVhbnMgZWl0aGVyCisKKyAgICA8cGFza3k+IGlpcmMsIGl0IGFwcGVhcmVkIHRvIG1lIHRvIGJlIGp1c3QgdGhlIHNoYTEgb2YgdGhlIG9iamVjdAorICAgICAgICB3aGVuIHJlYWRpbmcgdGhlIGNvZGUgY2FzdWFsbHkgLi4uCisKKyAgICAgICAgLi4uIHdoaWNoIHNpbXBseSBkb2Vzbid0IHNvdW5kIGFzIGEgdmVyeSBnb29kIGhldXJpc3RpY3MsIHRob3VnaCA7KQorCisgICAgPG5qc2A+IC4uLi4uYW5kIHJlY2VuY3kgb3JkZXIuICBva2F5LCBJIHRoaW5rIGl0J3MgY2xlYXIgSSBkaWRuJ3QKKyAgICAgICBldmVuIHJlYWxpemUgaG93IG11Y2ggSSB3YXNuJ3QgcmVhbGl6aW5nIDotKQorCitBaCwgZ3Jhc3Nob3BwZXIhICBBbmQgdGh1cyB0aGUgZW5saWdodGVubWVudCBiZWdpbnMgYW5ldy4KKworICAgIDxsaW51cz4gVGhlICJtYWdpYyIgaXMgYWN0dWFsbHkgaW4gdGhlb3J5IHRvdGFsbHkgYXJiaXRyYXJ5LgorICAgICAgICBBTlkgb3JkZXIgd2lsbCBnaXZlIHlvdSBhIHdvcmtpbmcgcGFjaywgYnV0IG5vLCBpdCdzIG5vdAorICAgICAgICBvcmRlcmVkIGJ5IFNIQTEuCisKKyAgICAgICAgQmVmb3JlIHRhbGtpbmcgYWJvdXQgdGhlIG9yZGVyaW5nIGZvciB0aGUgc2xpZGluZyBkZWx0YQorICAgICAgICB3aW5kb3csIGxldCdzIHRhbGsgYWJvdXQgdGhlIHJlY2VuY3kgb3JkZXIuIFRoYXQncyBtb3JlCisgICAgICAgIGltcG9ydGFudCBpbiBvbmUgd2F5LgorCisgICAgPG5qc2A+IFJpZ2h0LCBidXQgaWYgYWxsIHlvdSB3YW50IGlzIGEgd29ya2luZyB3YXkgdG8gcGFjayB0aGluZ3MKKyAgICAgICAgdG9nZXRoZXIsIHlvdSBjb3VsZCBqdXN0IHVzZSBjYXQgYW5kIHNhdmUgeW91cnNlbGYgc29tZQorICAgICAgICB0cm91YmxlLi4uCisKK1dhYWFpdCBmb3IgaXQuLi4uCisKKyAgICA8bGludXM+IFRoZSByZWNlbmN5IG9yZGVyaW5nICh3aGljaCBpcyBiYXNpY2FsbHk6IHB1dCBvYmplY3RzCisgICAgICAgIF9waHlzaWNhbGx5XyBpbnRvIHRoZSBwYWNrIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlCisgICAgICAgICJyZWFjaGFibGUiIGZyb20gdGhlIGhlYWQpIGlzIGltcG9ydGFudC4KKworICAgIDxuanNgPiBva2F5CisKKyAgICA8bGludXM+IEl0J3MgaW1wb3J0YW50IGJlY2F1c2UgdGhhdCdzIHRoZSB0aGluZyB0aGF0IGdpdmVzIHBhY2tzCisgICAgICAgIGdvb2QgbG9jYWxpdHkuIEl0IGtlZXBzIHRoZSBvYmplY3RzIGNsb3NlIHRvIHRoZSBoZWFkICh3aGV0aGVyCisgICAgICAgIHRoZXkgYXJlIG9sZCBvciBuZXcsIGJ1dCB0aGV5IGFyZSBfcmVhY2hhYmxlXyBmcm9tIHRoZSBoZWFkKQorICAgICAgICBhdCB0aGUgaGVhZCBvZiB0aGUgcGFjay4gU28gcGFja3MgYWN0dWFsbHkgaGF2ZSBhYnNvbHV0ZWx5CisgICAgICAgIF93b25kZXJmdWxfIElPIHBhdHRlcm5zLgorCitSZWFkIHRoYXQgYWdhaW4sIGJlY2F1c2UgaXQgaXMgaW1wb3J0YW50LgorCisgICAgPGxpbnVzPiBCdXQgcmVjZW5jeSBvcmRlcmluZyBpcyB0b3RhbGx5IHVzZWxlc3MgZm9yIGRlY2lkaW5nIGhvdworICAgICAgICB0byBhY3R1YWxseSBnZW5lcmF0ZSB0aGUgZGVsdGFzLCBzbyB0aGUgZGVsdGEgb3JkZXJpbmcgaXMKKyAgICAgICAgc29tZXRoaW5nIGVsc2UuCisKKyAgICAgICAgVGhlIGRlbHRhIG9yZGVyaW5nIGlzICh3YWl0IGZvciBpdCk6CisgICAgICAgIC0gZmlyc3Qgc29ydCBieSB0aGUgImJhc2VuYW1lIiBvZiB0aGUgb2JqZWN0LCBhcyBkZWZpbmVkIGJ5CisgICAgICAgICAgdGhlIG5hbWUgdGhlIG9iamVjdCB3YXMgX2ZpcnN0XyByZWFjaGVkIHRocm91Z2ggd2hlbgorICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIG9iamVjdCBsaXN0CisgICAgICAgIC0gd2l0aGluIHRoZSBzYW1lIGJhc2VuYW1lLCBzb3J0IGJ5IHNpemUgb2YgdGhlIG9iamVjdAorICAgICAgICAtIGJ1dCBhbHdheXMgc29ydCBkaWZmZXJlbnQgdHlwZXMgc2VwYXJhdGVseSAoY29tbWl0cyBmaXJzdCkuCisKKyAgICAgICAgVGhhdCdzIG5vdCBleGFjdGx5IGl0LCBidXQgaXQncyB2ZXJ5IGNsb3NlLgorCisgICAgPG5qc2A+IFRoZSAiX2ZpcnN0XyByZWFjaGVkIiB0aGluZyBpcyBub3QgdG9vIGltcG9ydGFudCwganVzdCB5b3UKKyAgICAgICAgbmVlZCBzb21lIHdheSB0byBicmVhayB0aWVzIHNpbmNlIHRoZSBzYW1lIG9iamVjdHMgbWF5IGJlCisgICAgICAgIHJlYWNoYWJsZSBtYW55IHdheXMsIHllcz8KKworQW5kIGFzIGlmIHRvIGNsYXJpZnk6CisKKyAgICA8bGludXM+IFRoZSBwb2ludCBpcyB0aGF0IGl0J3MgYWxsIHJlYWxseSBqdXN0IGFueSByYW5kb20KKyAgICAgICAgaGV1cmlzdGljLCBhbmQgdGhlIG9yZGVyaW5nIGlzIHRvdGFsbHkgdW5pbXBvcnRhbnQgZm9yCisgICAgICAgIGNvcnJlY3RuZXNzLCBidXQgaXQgaGVscHMgYSBsb3QgaWYgdGhlIGhldXJpc3RpYyBnaXZlcworICAgICAgICAiY2x1bXBpbmciIGZvciB0aGluZ3MgdGhhdCBhcmUgbGlrZWx5IHRvIGRlbHRhIHdlbGwgYWdhaW5zdAorICAgICAgICBlYWNoIG90aGVyLgorCitJdCBpcyBhbiBpbXBvcnRhbnQgcG9pbnQsIHNvIHNlY3JldGx5LCBJIGRpZCBteSBvd24gcmVzZWFyY2ggYW5kIGhhdmUKK2luY2x1ZGVkIG15IHJlc3VsdHMgYmVsb3cuICBUbyBiZSBmYWlyLCBpdCBoYXMgY2hhbmdlZCBzb21lIG92ZXIgdGltZS4KK0FuZCB0aHJvdWdoIHRoZSBtYWdpYyBvZiBSZXZpc2lvbmlzdGljIEhpc3RvcnksIEkgZHJhdyB1cG9uIHRoaXMgZW50cnkKK2Zyb20gVGhlIEdpdCBJUkMgTG9ncyBvbiBteSBmYXRoZXIncyBiaXJ0aGRheSwgTWFyY2ggMToKKworICAgIDxnaXRzdGVyPiBUaGUgcXVvdGUgZnJvbSB0aGUgYWJvdmUgbGludXMgc2hvdWxkIGJlIHJld3JpdHRlbiBhCisgICAgICAgIGJpdCAod2FpdCBmb3IgaXQpOgorICAgICAgICAtIGZpcnN0IHNvcnQgYnkgdHlwZS4gIERpZmZlcmVudCBvYmplY3RzIG5ldmVyIGRlbHRhIHdpdGgKKwkgIGVhY2ggb3RoZXIuCisgICAgICAgIC0gdGhlbiBzb3J0IGJ5IGZpbGVuYW1lL2Rpcm5hbWUuICBoYXNoIG9mIHRoZSBiYXNlbmFtZQorICAgICAgICAgIG9jY3VwaWVzIHRoZSB0b3AgQklUU19QRVJfSU5ULURJUl9CSVRTIGJpdHMsIGFuZCBib3R0b20KKyAgICAgICAgICBESVJfQklUUyBhcmUgZm9yIHRoZSBoYXNoIG9mIGxlYWRpbmcgcGF0aCBlbGVtZW50cy4KKyAgICAgICAgLSB0aGVuIGlmIHdlIGFyZSBkb2luZyAidGhpbiIgcGFjaywgdGhlIG9iamVjdHMgd2UgYXJlIF9ub3RfCisgICAgICAgICAgZ29pbmcgdG8gcGFjayBidXQgd2Uga25vdyBhYm91dCBhcmUgc29ydGVkIGVhcmxpZXIgdGhhbgorICAgICAgICAgIG90aGVyIG9iamVjdHMuCisgICAgICAgIC0gYW5kIGZpbmFsbHkgc29ydCBieSBzaXplLCBsYXJnZXIgdG8gc21hbGxlci4KKworSW4gb25lIHN3ZWxsLWZvb3AsIGNsYXJpZmljYXRpb24gYW5kIG9ic2N1cmlmaWNhdGlvbiEgIE5vbmV0aGVsZXNzLAorYXV0aG9yaXRhdGl2ZS4gIENyeXB0aWMsIHlldCBjb25jaXNlLiAgSXQgZXZlbiBzb2xpY2l0cyBub3Rpb25zIG9mCitxdW90ZXMgZnJvbSBUaGUgU291cmNlIENvZGUuICBDbGVhcmx5LCBtb3JlIHN0dWR5IGlzIG5lZWRlZC4KKworICAgIDxnaXRzdGVyPiBUaGF0J3MgdGhlIHNvcnQgb3JkZXIuICBXaGF0IHRoaXMgbWVhbnMgaXM6CisgICAgICAgIC0gd2UgZG8gbm90IGRlbHRhIGRpZmZlcmVudCBvYmplY3QgdHlwZXMuCisJLSB3ZSBwcmVmZXIgdG8gZGVsdGEgdGhlIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBmdWxsIHBhdGgsIGJ1dAorICAgICAgICAgIGFsbG93IGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBmcm9tIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KKwktIHdlIGFsd2F5cyBwcmVmZXIgdG8gZGVsdGEgYWdhaW5zdCBvYmplY3RzIHdlIGFyZSBub3QgZ29pbmcKKyAgICAgICAgICB0byBzZW5kLCBpZiB0aGVyZSBhcmUgc29tZS4KKwktIHdlIHByZWZlciB0byBkZWx0YSBhZ2FpbnN0IGxhcmdlciBvYmplY3RzLCBzbyB0aGF0IHdlIGhhdmUKKyAgICAgICAgICBsb3RzIG9mIHJlbW92YWxzLgorCisgICAgICAgIFRoZSBwZW51bHRpbWF0ZSBydWxlIGlzIGZvciAidGhpbiIgcGFja3MuICBJdCBpcyB1c2VkIHdoZW4KKyAgICAgICAgdGhlIG90aGVyIHNpZGUgaXMga25vd24gdG8gaGF2ZSBzdWNoIG9iamVjdHMuCisKK1RoZXJlIGl0IGlzIGFnYWluLiAiVGhpbiIgcGFja3MuICBJJ20gdGhpbmtpbmcgdG8gbXlzZWxmLCAiV2hhdAoraXMgYSAndGhpbicgcGFjaz8iICBTbyBJIGFzazoKKworICAgIDxqZGw+IFdoYXQgaXMgYSAidGhpbiIgcGFjaz8KKworICAgIDxnaXRzdGVyPiBVc2Ugb2YgLS1vYmplY3RzLWVkZ2UgdG8gcmV2LWxpc3QgYXMgdGhlIHVwc3RyZWFtIG9mCisgICAgICAgIHBhY2stb2JqZWN0cy4gIFRoZSBwYWNrIHRyYW5zZmVyIHByb3RvY29sIG5lZ290aWF0ZXMgdGhhdC4KKworV29vIGhvbyEgIENsZWFyZWQgdGhhdCBfcmlnaHRfIHVwIQorCisgICAgPGdpdHN0ZXI+IFRoZXJlIGFyZSB0d28gZGlyZWN0aW9ucyAtIHB1c2ggYW5kIGZldGNoLgorCitUaGVyZSEgIERpZCB5b3Ugc2VlIGl0PyAgSXQgaXMgbm90ICcicHVzaCIgYW5kICJwdWxsIichICBIb3cgb2Z0ZW4gdGhlCitjb25mdXNpb24gaGFzIHN0YXJ0ZWQgaGVyZS4gIFNvIGNhc3VhbGx5IG1lbnRpb25lZCwgdG9vIQorCisgICAgPGdpdHN0ZXI+IEZvciBwdXNoLCBnaXQtc2VuZC1wYWNrIGludm9rZXMgZ2l0LXJlY2VpdmUtcGFjayBvbiB0aGUKKyAgICAgICAgb3RoZXIgZW5kLiAgVGhlIHJlY2VpdmUtcGFjayBzYXlzICJJIGhhdmUgdXAgdG8gdGhlc2UgY29tbWl0cyIuCisgICAgICAgIHNlbmQtcGFjayBsb29rcyBhdCB0aGVtLCBhbmQgY29tcHV0ZXMgd2hhdCBhcmUgbWlzc2luZyBmcm9tCisgICAgICAgIHRoZSBvdGhlciBlbmQuICBTbyAidGhpbiIgY291bGQgYmUgdGhlIGRlZmF1bHQgdGhlcmUuCisKKyAgICAgICAgSW4gdGhlIG90aGVyIGRpcmVjdGlvbiwgZmV0Y2gsIGdpdC1mZXRjaC1wYWNrIGFuZAorICAgICAgICBnaXQtY2xvbmUtcGFjayBpbnZva2VzIGdpdC11cGxvYWQtcGFjayBvbiB0aGUgb3RoZXIgZW5kCisJKHZpYSBzc2ggb3IgYnkgdGFsa2luZyB0byB0aGUgZGFlbW9uKS4KKworCVRoZXJlIGFyZSB0d28gY2FzZXM6IGZldGNoLXBhY2sgd2l0aCAtayBhbmQgY2xvbmUtcGFjayBpcyBvbmUsCisgICAgICAgIGZldGNoLXBhY2sgd2l0aG91dCAtayBpcyB0aGUgb3RoZXIuICBjbG9uZS1wYWNrIGFuZCBmZXRjaC1wYWNrCisgICAgICAgIHdpdGggLWsgd2lsbCBrZWVwIHRoZSBkb3dubG9hZGVkIHBhY2tmaWxlIHdpdGhvdXQgZXhwYW5kZWQsIHNvCisgICAgICAgIHdlIGRvIG5vdCB1c2UgdGhpbiBwYWNrIHRyYW5zZmVyLiAgT3RoZXJ3aXNlLCB0aGUgZ2VuZXJhdGVkCisgICAgICAgIHBhY2sgd2lsbCBoYXZlIGRlbHRhIHdpdGhvdXQgYmFzZSBvYmplY3QgaW4gdGhlIHNhbWUgcGFjay4KKworICAgICAgICBCdXQgZmV0Y2gtcGFjayB3aXRob3V0IC1rIHdpbGwgZXhwbG9kZSB0aGUgcmVjZWl2ZWQgcGFjayBpbnRvCisgICAgICAgIGluZGl2aWR1YWwgb2JqZWN0cywgc28gd2UgYXV0b21hdGljYWxseSBhc2sgdXBsb2FkLXBhY2sgdG8KKyAgICAgICAgZ2l2ZSB1cyBhIHRoaW4gcGFjayBpZiB1cGxvYWQtcGFjayBzdXBwb3J0cyBpdC4KKworT0sgdGhlbi4KKworVWguCisKK0xldCdzIHJldHVybiB0byB0aGUgcHJldmlvdXMgY29udmVyc2F0aW9uIHN0aWxsIGluIHByb2dyZXNzLgorCisgICAgPG5qc2A+IGFuZCAiYmFzZW5hbWUiIG1lYW5zIHNvbWV0aGluZyBsaWtlICJ0aGUgdGFpbCBvZiBlbmQgb2YKKyAgICAgICAgcGF0aCBvZiBmaWxlIG9iamVjdHMgYW5kIGRpciBvYmplY3RzLCBhcyBwZXIgYmFzZW5hbWUoMyksIGFuZAorICAgICAgICB3ZSBqdXN0IGRlY2xhcmUgYWxsIGNvbW1pdCBhbmQgdGFnIG9iamVjdHMgdG8gaGF2ZSB0aGUgc2FtZQorICAgICAgICBiYXNlbmFtZSIgb3Igc29tZXRoaW5nPworCitMdWNraWx5LCB0aGF0IHRvbyBpcyBhIHBvaW50IHRoYXQgZ2l0c3RlciBjbGFyaWZpZWQgZm9yIHVzIQorCitJZiBJIG1pZ2h0IGFkZCwgdGhlIHRyaWNrIGlzIHRvIG1ha2UgZmlsZXMgdGhhdCBfbWlnaHRfIGJlIHNpbWlsYXIgYmUKK2xvY2F0ZWQgY2xvc2UgdG8gZWFjaCBvdGhlciBpbiB0aGUgaGFzaCBidWNrZXRzIGJhc2VkIG9uIHRoZWlyIGZpbGUKK25hbWVzLiAgSXQgdXNlZCB0byBiZSB0aGF0ICJmb28vTWFrZWZpbGUiLCAiYmFyL2Jhei9xdXV4L01ha2VmaWxlIiBhbmQKKyJNYWtlZmlsZSIgYWxsIGxhbmRlZCBpbiB0aGUgc2FtZSBidWNrZXQgZHVlIHRvIHRoZWlyIGNvbW1vbiBiYXNlbmFtZSwKKyJNYWtlZmlsZSIuIEhvd2V2ZXIsIG5vdyB0aGV5IGxhbmQgaW4gImNsb3NlIiBidWNrZXRzLgorCitUaGUgYWxnb3JpdGhtIGFsbG93cyBub3QganVzdCBmb3IgdGhlIF9zYW1lXyBidWNrZXQsIGJ1dCBmb3IgX2Nsb3NlXworYnVja2V0cyB0byBiZSBjb25zaWRlcmVkIGRlbHRhIGNhbmRpZGF0ZXMuICBUaGUgcmF0aW9uYWxlIGlzCitlc3NlbnRpYWxseSB0aGF0IGZpbGVzLCBsaWtlIE1ha2VmaWxlcywgb2Z0ZW4gaGF2ZSB2ZXJ5IHNpbWlsYXIKK2NvbnRlbnQgbm8gbWF0dGVyIHdoYXQgZGlyZWN0b3J5IHRoZXkgbGl2ZSBpbi4KKworICAgIDxsaW51cz4gSSBwbGF5ZWQgYXJvdW5kIHdpdGggZGlmZmVyZW50IGRlbHRhIGFsZ29yaXRobXMsIGFuZCB3aXRoCisgICAgICAgIG1ha2luZyB0aGUgImRlbHRhIHdpbmRvdyIgYmlnZ2VyLCBidXQgaGF2aW5nIHRvbyBiaWcgb2YgYQorICAgICAgICBzbGlkaW5nIHdpbmRvdyBtYWtlcyBpdCB2ZXJ5IGV4cGVuc2l2ZSB0byBnZW5lcmF0ZSB0aGUgcGFjazoKKyAgICAgICAgeW91IG5lZWQgdG8gY29tcGFyZSBldmVyeSBvYmplY3Qgd2l0aCBhIF90b25fIG9mIG90aGVyIG9iamVjdHMuCisKKyAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIHRyaXZpYWwgaGV1cmlzdGljcyB0b28sIHdoaWNoCisgICAgICAgIGJhc2ljYWxseSBib2lsIGRvd24gdG8gImRvbid0IGJvdGhlciBldmVuIHRyeWluZyB0byBkZWx0YSB0aGlzCisgICAgICAgIHBhaXIiIGlmIHdlIGNhbiB0ZWxsIGJlZm9yZS1oYW5kIHRoYXQgdGhlIGRlbHRhIGlzbid0IHdvcnRoIGl0CisgICAgICAgIChkdWUgdG8gc2l6ZSBkaWZmZXJlbmNlcywgd2hlcmUgd2UgY2FuIHRha2UgYSBwcmV2aW91cyBkZWx0YQorICAgICAgICByZXN1bHQgaW50byBhY2NvdW50IHRvIGRlY2lkZSB0aGF0ICJvaywgbm8gcG9pbnQgaW4gdHJ5aW5nCisgICAgICAgIHRoYXQgb25lLCBpdCB3aWxsIGJlIHdvcnNlIikuCisKKyAgICAgICAgRW5kIHJlc3VsdDogcGFja2luZyBpcyBhY3R1YWxseSB2ZXJ5IHNpemUgZWZmaWNpZW50LiBJdCdzCisgICAgICAgIHNvbWV3aGF0IENQVS13YXN0ZWZ1bCwgYnV0IG9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSB5b3UncmUKKyAgICAgICAgcmVhbGx5IG9ubHkgc3VwcG9zZWQgdG8gZG8gaXQgbWF5YmUgb25jZSBhIG1vbnRoIChhbmQgeW91IGNhbgorICAgICAgICBkbyBpdCBkdXJpbmcgdGhlIG5pZ2h0KSwgbm9ib2R5IHJlYWxseSBzZWVtcyB0byBjYXJlLgorCitOaWNlIEVuZ2luZWVyaW5nIFRvdWNoLCB0aGVyZS4gIEZpbmQgd2hlbiBpdCBkb2Vzbid0IG1hdHRlciwgYW5kCitwcm9jbGFpbSBpdCBhIG5vbi1pc3N1ZS4gIEdvb2Qgc3R5bGUgdG9vIQorCisgICAgPG5qc2A+IFNvLCBqdXN0IHRvIHJlcGVhdCB0byBzZWUgaWYgSSdtIGZvbGxvd2luZywgd2Ugc3RhcnQgYnkKKyAgICAgICAgZ2V0dGluZyBhIGxpc3Qgb2YgdGhlIG9iamVjdHMgd2Ugd2FudCB0byBwYWNrLCB3ZSBzb3J0IGl0IGJ5CisgICAgICAgIHRoaXMgaGV1cmlzdGljIChiYXNpY2FsbHkgbGV4aWNvZ3JhcGhpY2FsbHkgb24gdGhlIHR1cGxlCisgICAgICAgICh0eXBlLCBiYXNlbmFtZSwgc2l6ZSkpLgorCisgICAgICAgIFRoZW4gd2Ugd2FsayB0aHJvdWdoIHRoaXMgbGlzdCwgYW5kIGNhbGN1bGF0ZSBhIGRlbHRhIG9mCisgICAgICAgIGVhY2ggb2JqZWN0IGFnYWluc3QgdGhlIGxhc3QgbiAodHVuYWJsZSBwYXJhbWF0ZXIpIG9iamVjdHMsCisgICAgICAgIGFuZCBwaWNrIHRoZSBzbWFsbGVzdCBvZiB0aGVzZSBkZWx0YXMuCisKK1Zhc3RseSBzaW1wbGlmaWVkLCBidXQgdGhlIGVzc2VuY2UgaXMgdGhlcmUhCisKKyAgICA8bGludXM+IENvcnJlY3QuCisKKyAgICA8bmpzYD4gQW5kIHRoZW4gb25jZSB3ZSBoYXZlIHBpY2tlZCBhIGRlbHRhIG9yIGZ1bGx0ZXh0IHRvCisgICAgICAgIHJlcHJlc2VudCBlYWNoIG9iamVjdCwgd2UgcmUtc29ydCBieSByZWNlbmN5LCBhbmQgd3JpdGUgdGhlbQorICAgICAgICBvdXQgaW4gdGhhdCBvcmRlci4KKworICAgIDxsaW51cz4gWXVwLiBTb21lIG90aGVyIHNtYWxsIGRldGFpbHM6CisKK0FuZCBvZiBjb3Vyc2UgdGhlcmUgaXMgdGhlICJPdGhlciBTaG9lIiBGYWN0b3IgdG9vLgorCisgICAgPGxpbnVzPiAtIFdlIGxpbWl0IHRoZSBkZWx0YSBkZXB0aCB0byBhbm90aGVyIG1hZ2ljIHZhbHVlIChyaWdodAorICAgICAgICBub3cgYm90aCB0aGUgd2luZG93IGFuZCBkZWx0YSBkZXB0aCBtYWdpYyB2YWx1ZXMgYXJlIGp1c3QgIjEwIikKKworICAgIDxuanNgPiBIcm0sIG15IGludHVpdGlvbiBpcyB0aGF0IHlvdSdkIGVuZCB1cCB3aXRoIHJlYWxseSBfYmFkXyBJTworICAgICAgICBwYXR0ZXJucywgYmVjYXVzZSB0aGUgdGhpbmdzIHlvdSB3YW50IGFyZSBuZWFyIGJ5LCBidXQgdG8KKyAgICAgICAgYWN0dWFsbHkgcmVjb25zdHJ1Y3QgdGhlbSB5b3UgbWF5IGhhdmUgdG8ganVtcCBhbGwgb3ZlciBpbgorICAgICAgICByYW5kb20gd2F5cy4KKworICAgIDxsaW51cz4gLSBXaGVuIHdlIHdyaXRlIG91dCBhIGRlbHRhLCBhbmQgd2UgaGF2ZW4ndCB5ZXQgd3JpdHRlbgorICAgICAgICBvdXQgdGhlIG9iamVjdCBpdCBpcyBhIGRlbHRhIGFnYWluc3QsIHdlIHdyaXRlIG91dCB0aGUgYmFzZQorICAgICAgICBvYmplY3QgZmlyc3QuICBBbmQgbm8sIHdoZW4gd2UgcmVjb25zdHJ1Y3QgdGhlbSwgd2UgYWN0dWFsbHkKKyAgICAgICAgZ2V0IG5pY2UgSU8gcGF0dGVybnMsIGJlY2F1c2U6CisgICAgICAgIC0gbGFyZ2VyIG9iamVjdHMgdGVuZCB0byBiZSAibW9yZSByZWNlbnQiIChMaW51cycgbGF3OiBmaWxlcyBncm93KQorICAgICAgICAtIHdlIGFjdGl2ZWx5IHRyeSB0byBnZW5lcmF0ZSBkZWx0YXMgZnJvbSBhIGxhcmdlciBvYmplY3QgdG8gYQorICAgICAgICAgIHNtYWxsZXIgb25lCisgICAgICAgIC0gdGhpcyBtZWFucyB0aGF0IHRoZSB0b3Atb2YtdHJlZSB2ZXJ5IHNlbGRvbSBoYXMgZGVsdGFzCisgICAgICAgICAgKGkuZS4gZGVsdGFzIGluIF9wcmFjdGljZV8gYXJlICJiYWNrd2FyZHMgZGVsdGFzIikKKworQWdhaW4sIHdlIHNob3VsZCByZXJlYWQgdGhhdCB3aG9sZSBwYXJhZ3JhcGguICBOb3QganVzdCBiZWNhdXNlCitMaW51cyBoYXMgc2xpcHBlZCBMaW51cydzIExhdyBpbiB0aGVyZSBvbiB1cywgYnV0IGJlY2F1c2UgaXQgaXMKK2ltcG9ydGFudC4gIExldCdzIG1ha2Ugc3VyZSB3ZSBjbGFyaWZ5IHNvbWUgb2YgdGhlIHBvaW50cyBoZXJlOgorCisgICAgPG5qc2A+IFNvIHRoZSBwb2ludCBpcyBqdXN0IHRoYXQgaW4gcHJhY3RpY2UsIGRlbHRhIG9yZGVyIGFuZAorICAgICAgICByZWNlbmN5IG9yZGVyIG1hdGNoIGVhY2ggb3RoZXIgcXVpdGUgd2VsbC4KKworICAgIDxsaW51cz4gWWVzLiBUaGVyZSdzIGFub3RoZXIgbmljZSBzaWRlIHRvIHRoaXMgKGFuZCB5ZXMsIGl0IHdhcworCWRlc2lnbmVkIHRoYXQgd2F5IDspOgorICAgICAgICAtIHRoZSByZWFzb24gd2UgZ2VuZXJhdGUgZGVsdGFzIGFnYWluc3QgdGhlIGxhcmdlciBvYmplY3QgaXMKKwkgIGFjdHVhbGx5IGEgYmlnIHNwYWNlIHNhdmVyIHRvbyEKKworICAgIDxuanNgPiBIbW0sIGJ1dCB5b3VyIGxhc3QgY29tbWVudCAoaWYgIndlIGhhdmVuJ3QgeWV0IHdyaXR0ZW4gb3V0CisgICAgICAgIHRoZSBvYmplY3QgaXQgaXMgYSBkZWx0YSBhZ2FpbnN0LCB3ZSB3cml0ZSBvdXQgdGhlIGJhc2Ugb2JqZWN0CisgICAgICAgIGZpcnN0IiksIHNlZW1zIGxpa2UgaXQgd291bGQgbWFrZSB0aGVzZSBmYWN0cyBtb3N0bHkKKyAgICAgICAgaXJyZWxldmFudCBiZWNhdXNlIGV2ZW4gaWYgaW4gcHJhY3RpY2UgeW91IHdvdWxkIG5vdCBoYXZlIHRvCisgICAgICAgIHdhbmRlciBhcm91bmQgbXVjaCwgaW4gZmFjdCB5b3UganVzdCBicnV0ZS1mb3JjZSBzYXkgdGhhdCBpbgorICAgICAgICB0aGUgY2FzZXMgd2hlcmUgeW91IG1pZ2h0IGhhdmUgdG8gd2FuZGVyLCBkb24ndCBkbyB0aGF0IDotKQorCisgICAgPGxpbnVzPiBZZXMgYW5kIG5vLiBOb3RpY2UgdGhlIHJ1bGU6IHdlIG9ubHkgd3JpdGUgb3V0IHRoZSBiYXNlCisgICAgICAgIG9iamVjdCBmaXJzdCBpZiB0aGUgZGVsdGEgYWdhaW5zdCBpdCB3YXMgbW9yZSByZWNlbnQuICBUaGF0CisgICAgICAgIG1lYW5zIHRoYXQgeW91IGNhbiBhY3R1YWxseSBoYXZlIGRlbHRhcyB0aGF0IHJlZmVyIHRvIGEgYmFzZQorICAgICAgICBvYmplY3QgdGhhdCBpcyBfbm90XyBjbG9zZSB0byB0aGUgZGVsdGEgb2JqZWN0LCBidXQgdGhhdCBvbmx5CisgICAgICAgIGhhcHBlbnMgd2hlbiB0aGUgZGVsdGEgaXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIF9vbGRfIG9iamVjdC4KKworICAgIDxsaW51cz4gU2VlPworCitZZWFoLCBuby4gIEkgbWlzc2VkIHRoYXQgb24gdGhlIGZpcnN0IHR3byBvciB0aHJlZSByZWFkaW5ncyBteXNlbGYuCisKKyAgICA8bGludXM+IFRoaXMga2VlcHMgdGhlIGZyb250IG9mIHRoZSBwYWNrIGRlbnNlLiBUaGUgZnJvbnQgb2YgdGhlCisgICAgICAgIHBhY2sgbmV2ZXIgY29udGFpbnMgZGF0YSB0aGF0IGlzbid0IHJlbGV2YW50IHRvIGEgInJlY2VudCIKKyAgICAgICAgb2JqZWN0LiAgVGhlIHNpemUgb3B0aW1pemF0aW9uIGNvbWVzIGZyb20gb3VyIHVzZSBvZiB4ZGVsdGEKKyAgICAgICAgKGJ1dCBpcyB0cnVlIGZvciBtYW55IG90aGVyIGRlbHRhIGFsZ29yaXRobXMpOiByZW1vdmluZyBkYXRhCisgICAgICAgIGlzIGNoZWFwZXIgKGluIHNpemUpIHRoYW4gYWRkaW5nIGRhdGEuCisKKyAgICAgICAgV2hlbiB5b3UgcmVtb3ZlIGRhdGEsIHlvdSBvbmx5IG5lZWQgdG8gc2F5ICJjb3B5IGJ5dGVzIG4tLW0iLgorCUluIGNvbnRyYXN0LCBpbiBhIGRlbHRhIHRoYXQgX2FkZHNfIGRhdGEsIHlvdSBoYXZlIHRvIHNheSAiYWRkCisgICAgICAgIHRoZXNlIGJ5dGVzOiAnYWN0dWFsIGRhdGEgZ29lcyBoZXJlJyIKKworICAgICoqKiBuanNgIGhhcyBxdWl0OiBSZWFkIGVycm9yOiAxMDQgKENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcikKKworICAgIDxsaW51cz4gVWhodWguIEkgaG9wZSBJIGRpZG4ndCBibG93IG5qc2AgbWluZC4KKworICAgICoqKiBuanNgIGhhcyBqb2luZWQgY2hhbm5lbCAjZ2l0CisKKyAgICA8cGFza3k+IDopCisKK1RoZSBzaWxlbnQgb2JzZXJ2ZXJzIGFyZSBhbXVzZWQuICBPZiBjb3Vyc2UuCisKK0FuZCBhcyBpZiBuanNgIHdhcyBleHBlY3RlZCB0byBiZSBvbW5pc2NpZW50OgorCisgICAgPGxpbnVzPiBuanMgLSBkaWQgeW91IG1pc3MgYW55dGhpbmc/CisKK09LLCBJJ2xsIHNwZWxsIGl0IG91dC4gIFRoYXQncyBHZWVrIEh1bW9yLiAgSWYgbmpzYCB3YXMgbm90IGFjdHVhbGx5Citjb25uZWN0ZWQgZm9yIGEgbGl0dGxlIGJpdCB0aGVyZSwgaG93IHdvdWxkIGhlIGtub3cgaWYgbWlzc2VkIGFueXRoaW5nCit3aGlsZSBoZSB3YXMgZGlzY29ubmVjdGVkPyAgSGUncyBhIGJlbmV2b2xlbnQgZGljdGF0b3Igd2l0aCBhIHNlbnNlIG9mCitodW1vciEgIFdlbGwgbm90ZWQhCisKKyAgICA8bmpzYD4gU3R1cGlkIHJvdXRlci4gIE9yIGdyZW1saW5zLCBvciB3aGF0ZXZlci4KKworSXQncyBhIGNoZWFwIHNob3QgYXQgQ2lzY28uICBUYWtlICdlbSB3aGVuIHlvdSBjYW4uCisKKyAgICA8bmpzYD4gWWVzIGFuZCBuby4gTm90aWNlIHRoZSBydWxlOiB3ZSBvbmx5IHdyaXRlIG91dCB0aGUgYmFzZQorICAgICAgICBvYmplY3QgZmlyc3QgaWYgdGhlIGRlbHRhIGFnYWluc3QgaXQgd2FzIG1vcmUgcmVjZW50LgorCisgICAgICAgIEknbSBnZXR0aW5nIGxvc3QgaW4gYWxsIHRoZXNlIG9yZGVycywgbGV0IG1lIHJlLXJlYWQgOi0pCisJU28gdGhlIHdyaXRlLW91dCBvcmRlciBpcyBmcm9tIG1vc3QgcmVjZW50IHRvIGxlYXN0IHJlY2VudD8KKyAgICAgICAgKENvbmNlaXZhYmx5IGl0IGNvdWxkIGJlIHRoZSBvcHBvc2l0ZSB3YXkgdG9vLCBJJ20gbm90IHN1cmUgaWYKKyAgICAgICAgd2UndmUgc2FpZCkgdGhvdWdoIG15IGNvbm5lY3Rpb24gYmFjayBhdCBob21lIGlzIGxvZ2dpbmcsIHNvIEkKKyAgICAgICAgY2FuIGp1c3QgcmVhZCB3aGF0IHlvdSBzYWlkIHRoZXJlIDotKQorCitBbmQgZm9yIHRob3NlIG9mIHlvdSBwYXlpbmcgYXR0ZW50aW9uLCB0aGUgT21uaXNjaWVudCBUcmljayBoYXMganVzdAorYmVlbiBkZXRhaWxlZCEKKworICAgIDxsaW51cz4gWWVzLCB3ZSBhbHdheXMgd3JpdGUgb3V0IG1vc3QgcmVjZW50IGZpcnN0CisKK0ZvciB0aGUgb3RoZXIgcmVjb3JkOgorCisgICAgPHBhc2t5PiBuanNgOiBodHRwOi8vcGFzdGViaW4uY29tLzU0Nzk2NQorCitUaGUgJ25ldCBuZXZlciBmb3JnZXRzLCBzbyB0aGF0IHNob3VsZCBiZSBnb29kIHVudGlsIHRoZSBlbmQgb2YgdGltZS4KKworICAgIDxuanNgPiBBbmQsIHllYWgsIEkgZ290IHRoZSBwYXJ0IGFib3V0IGRlZXBlci1pbi1oaXN0b3J5IHN0dWZmCisgICAgICAgIGhhdmluZyB3b3JzZSBJTyBjaGFyYWN0ZXJpc3RpY3MsIG9uZSBzb3J0IG9mIGRvZXNuJ3QgY2FyZS4KKworICAgIDxsaW51cz4gV2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgdGhlICJtb3N0IHJlY2VudCIgbmVlZHMgYW4gb2xkZXIKKyAgICAgICAgb2JqZWN0IHRvIGRlbHRhIGFnYWluc3QgKGhleSwgc2hyaW5raW5nIHNvbWV0aW1lcyBkb2VzCisgICAgICAgIGhhcHBlbiksIHdlIHdyaXRlIG91dCB0aGUgb2xkIG9iamVjdCB3aXRoIHRoZSBkZWx0YS4KKworICAgIDxuanNgPiAoaWYgb25seSBpdCBoYXBwZW5lZCBtb3JlLi4uKQorCisgICAgPGxpbnVzPiBBbnl3YXksIHRoZSBwYWNrLWZpbGUgY291bGQgZWFzaWx5IGJlIGRlbnNlciBzdGlsbCwgYnV0CisgICAgICAgIGJlY2F1c2UgaXQncyB1c2VkIGJvdGggZm9yIHN0cmVhbWluZyAodGhlIGdpdCBwcm90b2NvbCkgYW5kCisgICAgICAgIGZvciBvbi1kaXNrLCBpdCBoYXMgYSBmZXcgcGVzc2ltaXphdGlvbnMuCisKK0FjdHVhbGx5LCBpdCBpcyBhIG1hZGUtdXAgd29yZC4gQnV0IGl0IGlzIGEgbWFkZS11cCB3b3JkIGJlaW5nCit1c2VkIGFzIHNldHVwIGZvciBhIGxhdGVyIG9wdGltaXphdGlvbiwgd2hpY2ggaXMgYSByZWFsIHdvcmQ6CisKKyAgICA8bGludXM+IEluIHBhcnRpY3VsYXIsIHdoaWxlIHRoZSBwYWNrLWZpbGUgaXMgdGhlbiBjb21wcmVzc2VkLAorICAgICAgICBpdCdzIGNvbXByZXNzZWQganVzdCBvbmUgb2JqZWN0IGF0IGEgdGltZSwgc28gdGhlIGFjdHVhbAorICAgICAgICBjb21wcmVzc2lvbiBmYWN0b3IgaXMgbGVzcyB0aGFuIGl0IGNvdWxkIGJlIGluIHRoZW9yeS4gQnV0IGl0CisgICAgICAgIG1lYW5zIHRoYXQgaXQncyBhbGwgbmljZSByYW5kb20tYWNjZXNzIHdpdGggYSBzaW1wbGUgaW5kZXggdG8KKyAgICAgICAgZG8gIm9iamVjdCBuYW1lLT5sb2NhdGlvbiBpbiBwYWNrZmlsZSIgdHJhbnNsYXRpb24uCisKKyAgICA8bmpzYD4gSSdtIGFzc3VtaW5nIHRoZSByZWFsIHdpbiBmb3IgZGVsdGEtaW5nIGxhcmdlLT5zbWFsbCBpcworICAgICAgICBtb3JlIGhvbW9nZW5vdXMgc3RhdGlzdGljcyBmb3IgZ3ppcCB0byBydW4gb3Zlcj8KKworICAgICAgICAoWW91IGhhdmUgdG8gcHV0IHRoZSBieXRlcyBpbiBvbmUgcGxhY2Ugb3IgYW5vdGhlciwgYnV0CisgICAgICAgIHB1dHRpbmcgdGhlbSBpbiBhIGxhcmdlciBibG9iIHdpbnMgb24gY29tcHJlc3Npb24pCisKKyAgICAgICAgQWN0dWFsbHksIHdoYXQgaXMgdGhlIGNvbXByZXNzaW9uIHN0cmF0ZWd5IC0tIGVhY2ggZGVsdGEKKyAgICAgICAgaW5kaXZpZHVhbGx5IGd6aXBwZWQsIHRoZSB3aG9sZSBmaWxlIGd6aXBwZWQsIHNvbWV3aGVyZSBpbgorICAgICAgICBiZXR3ZWVuLCBubyBjb21wcmVzc2lvbiBhdCBhbGwsIC4uLi4/CisKKyAgICAgICAgUmlnaHQuCisKK1JlYWxpdHkgSVJDIHNldHMgaW4uICBGb3IgZXhhbXBsZToKKworICAgIDxwYXNreT4gSSdsbCByZWFkIHRoZSByZXN0IGluIHRoZSBtb3JuaW5nLCBJIHJlYWxseSBoYXZlIHRvIGdvCisgICAgICAgIHNsZWVwIG9yIHRoZXJlJ3Mgbm8gaG9wZSB3aGF0c29ldmVyIGZvciBtZSBhdCB0aGUgdG9kYXkncworICAgICAgICBleGFtLi4uIGcnbml0ZSBhbGwuCisKK0hlaC4KKworICAgIDxsaW51cz4gcGFza3k6IGcnbml0ZQorCisgICAgPG5qc2A+IHBhc2t5OiAnbHVjaworCisgICAgPGxpbnVzPiBSaWdodDogbGFyZ2UtPnNtYWxsIG1hdHRlcnMgZXhhY3RseSBiZWNhdXNlIG9mIGNvbXByZXNzaW9uCisgICAgICAgIGJlaGF2aW91ci4gSWYgaXQgd2FzIG5vbi1jb21wcmVzc2VkLCBpdCBwcm9iYWJseSB3b3VsZG4ndCBtYWtlCisgICAgICAgIGFueSBkaWZmZXJlbmNlLgorCisgICAgPG5qc2A+IHllYWgKKworICAgIDxsaW51cz4gQW55d2F5OiBJJ20gbm90IGV2ZW4gdHJ5aW5nIHRvIGNsYWltIHRoYXQgdGhlIHBhY2stZmlsZXMKKyAgICAgICAgYXJlIHBlcmZlY3QsIGJ1dCB0aGV5IGRvIHRlbmQgdG8gaGF2ZSBhIG5pY2UgYmFsYW5jZSBvZgorICAgICAgICBkZW5zaXR5IHZzIGVhc2Utb2YgdXNlLgorCitHYXNwISAgT0ssIHNhdmVkLiAgVGhhdCdzIGEgZmFpciBFbmdpbmVlcmluZyB0cmFkZSBvZmYuICBDbG9zZSBjYWxsIQorSW4gZmFjdCwgTGludXMgcmVmbGVjdHMgb24gc29tZSBCYXNpYyBFbmdpbmVlcmluZyBGdW5kYW1lbnRhbHMsCitkZXNpZ24gb3B0aW9ucywgZXRjLgorCisgICAgPGxpbnVzPiBNb3JlIGltcG9ydGFudGx5LCB0aGV5IGFsbG93IGdpdCB0byBzdGlsbCBfY29uY2VwdHVhbGx5XworICAgICAgICBuZXZlciBkZWFsIHdpdGggZGVsdGFzIGF0IGFsbCwgYW5kIGJlIGEgIndob2xlIG9iamVjdCIgc3RvcmUuCisKKyAgICAgICAgV2hpY2ggaGFzIHNvbWUgcHJvYmxlbXMgKHdlIGRpc2N1c3NlZCBiYWQgaHVnZS1maWxlCisgICAgICAgIGJlaGF2aW91ciBvbiB0aGUgZ2l0IGxpc3RzIHRoZSBvdGhlciBkYXkpLCBidXQgaXQgZG9lcyBtZWFuCisgICAgICAgIHRoYXQgdGhlIGJhc2ljIGdpdCBjb25jZXB0cyBhcmUgcmVhbGx5IHJlYWxseSBzaW1wbGUgYW5kCisgICAgICAgIHN0cmFpZ2h0Zm9yd2FyZC4KKworICAgICAgICBJdCdzIGFsbCBiZWVuIHF1aXRlIHN0YWJsZS4KKworICAgICAgICBXaGljaCBJIHRoaW5rIGlzIHZlcnkgbXVjaCBhIHJlc3VsdCBvZiBoYXZpbmcgdmVyeSBzaW1wbGUKKyAgICAgICAgYmFzaWMgaWRlYXMsIHNvIHRoYXQgdGhlcmUncyBuZXZlciBhbnkgY29uZnVzaW9uIGFib3V0IHdoYXQncworICAgICAgICBnb2luZyBvbi4KKworICAgICAgICBCdWdzIGhhcHBlbiwgYnV0IHRoZXkgYXJlICJzaW1wbGUiIGJ1Z3MuIEFuZCBidWdzIHRoYXQKKyAgICAgICAgYWN0dWFsbHkgZ2V0IHNvbWUgb2JqZWN0IHN0b3JlIGRldGFpbCB3cm9uZyBhcmUgYWxtb3N0IGFsd2F5cworICAgICAgICBzbyBvYmlvdXMgdGhhdCB0aGV5IG5ldmVyIGdvIGFueXdoZXJlLgorCisgICAgPG5qc2A+IFllYWguCisKK051ZmYgc2FpZC4KKworICAgIDxsaW51cz4gQW55d2F5LiAgSSdtIG9mZiBmb3IgYmVkLiBJdCdzIG5vdCA2QU0gaGVyZSwgYnV0IEkndmUgZ290CisJIHRocmVlIGtpZHMsIGFuZCBoYXZlIHRvIGdldCB1cCBlYXJseSBpbiB0aGUgbW9ybmluZyB0byBzZW5kCisJIHRoZW0gb2ZmLiBJIG5lZWQgbXkgYmVhdXR5IHNsZWVwLgorCisgICAgPG5qc2A+IDotKQorCisgICAgPG5qc2A+IGFwcHJlY2lhdGUgdGhlIGluZm9kdW1wLCBJIHJlYWxseSB3YXMgZmFpbGluZyB0byBmaW5kIHRoZQorICAgICAgICBkZXRhaWxzIG9uIGdpdCBwYWNrcyA6LSkKKworQW5kIG5vdyB5b3Uga25vdyB0aGUgcmVzdCBvZiB0aGUgc3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLXByb3RvY29sLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stcHJvdG9jb2wudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDQ4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLXByb3RvY29sLnR4dApAQCAtMCwwICsxLDQxIEBACitQYWNrIHRyYW5zZmVyIHByb3RvY29scworPT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgYXJlIHR3byBQYWNrIHB1c2gtcHVsbCBwcm90b2NvbHMuCisKK3VwbG9hZC1wYWNrIChTKSB8IGZldGNoL2Nsb25lLXBhY2sgKEMpIHByb3RvY29sOgorCisJIyBUZWxsIHRoZSBwdWxsZXIgd2hhdCBjb21taXRzIHdlIGhhdmUgYW5kIHdoYXQgdGhlaXIgbmFtZXMgYXJlCisJUzogU0hBMSBuYW1lCisJUzogLi4uCisJUzogU0hBMSBuYW1lCisJUzogIyBmbHVzaCAtLSBpdCdzIHlvdXIgdHVybgorCSMgVGVsbCB0aGUgcHVzaGVyIHdoYXQgY29tbWl0cyB3ZSB3YW50LCBhbmQgd2hhdCB3ZSBoYXZlCisJQzogd2FudCBuYW1lCisJQzogLi4KKwlDOiB3YW50IG5hbWUKKwlDOiBoYXZlIFNIQTEKKwlDOiBoYXZlIFNIQTEKKwlDOiAuLi4KKwlDOiAjIGZsdXNoIC0tIG9jY2FzaW9uYWxseSBhc2sgImhhZCBlbm91Z2g/IgorCVM6IE5BSworCUM6IGhhdmUgU0hBMQorCUM6IC4uLgorCUM6IGhhdmUgU0hBMQorCVM6IEFDSworCUM6IGRvbmUKKwlTOiBYWFhYWFhYIC0tIHBhY2tmaWxlIGNvbnRlbnRzLgorCitzZW5kLXBhY2sgfCByZWNlaXZlLXBhY2sgcHJvdG9jb2wuCisKKwkjIFRlbGwgdGhlIHB1c2hlciB3aGF0IGNvbW1pdHMgd2UgaGF2ZSBhbmQgd2hhdCB0aGVpciBuYW1lcyBhcmUKKwlDOiBTSEExIG5hbWUKKwlDOiAuLi4KKwlDOiBTSEExIG5hbWUKKwlDOiAjIGZsdXNoIC0tIGl0J3MgeW91ciB0dXJuCisJIyBUZWxsIHRoZSBwdWxsZXIgd2hhdCB0aGUgcHVzaGVyIGhhcworCVM6IG9sZC1TSEExIG5ldy1TSEExIG5hbWUKKwlTOiBvbGQtU0hBMSBuZXctU0hBMSBuYW1lCisJUzogLi4uCisJUzogIyBmbHVzaCAtLSBkb25lIHdpdGggdGhlIGxpc3QKKwlTOiBYWFhYWFhYIC0tLSBwYWNrZmlsZSBjb250ZW50cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3RyaXZpYWwtbWVyZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvdHJpdmlhbC1tZXJnZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjODQxMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3RyaXZpYWwtbWVyZ2UudHh0CkBAIC0wLDAgKzEsMTIxIEBACitUcml2aWFsIG1lcmdlIHJ1bGVzCis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBvdXRjb21lcyBvZiB0aGUgdHJpdmlhbCBtZXJnZSBsb2dpYyBpbiByZWFkLXRyZWUuCisKK09uZS13YXkgbWVyZ2UKKy0tLS0tLS0tLS0tLS0KKworVGhpcyByZXBsYWNlcyB0aGUgaW5kZXggd2l0aCBhIGRpZmZlcmVudCB0cmVlLCBrZWVwaW5nIHRoZSBzdGF0IGluZm8KK2ZvciBlbnRyaWVzIHRoYXQgZG9uJ3QgY2hhbmdlLCBhbmQgYWxsb3dpbmcgLXUgdG8gbWFrZSB0aGUgbWluaW11bQorcmVxdWlyZWQgY2hhbmdlcyB0byB0aGUgd29ya2luZyB0cmVlIHRvIGhhdmUgaXQgbWF0Y2guCisKK0VudHJpZXMgbWFya2VkICcrJyBoYXZlIHN0YXQgaW5mb3JtYXRpb24uIFNwYWNlcyBtYXJrZWQgJyonIGRvbid0CithZmZlY3QgdGhlIHJlc3VsdC4KKworICAgaW5kZXggICB0cmVlICAgIHJlc3VsdAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgKGVtcHR5KSAoZW1wdHkpCisgICAoZW1wdHkpIHRyZWUgICAgdHJlZQorICAgaW5kZXgrICB0cmVlICAgIHRyZWUKKyAgIGluZGV4KyAgaW5kZXggICBpbmRleCsKKworVHdvLXdheSBtZXJnZQorLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBpbmRleCB0byBsYWNrIGFuIGVudHJ5OyB0aGlzIGRvZXMgbm90IHByZXZlbnQKK2FueSBjYXNlIGZyb20gYXBwbHlpbmcuCisKK0lmIHRoZSBpbmRleCBleGlzdHMsIGl0IGlzIGFuIGVycm9yIGZvciBpdCBub3QgdG8gbWF0Y2ggZWl0aGVyIHRoZSBvbGQKK29yIHRoZSByZXN1bHQuCisKK0lmIG11bHRpcGxlIGNhc2VzIGFwcGx5LCB0aGUgb25lIHVzZWQgaXMgbGlzdGVkIGZpcnN0LgorCitBIHJlc3VsdCB3aGljaCBjaGFuZ2VzIHRoZSBpbmRleCBpcyBhbiBlcnJvciBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5CithbmQgbm90IHVwLXRvLWRhdGUuCisKK0VudHJpZXMgbWFya2VkICcrJyBoYXZlIHN0YXQgaW5mb3JtYXRpb24uIFNwYWNlcyBtYXJrZWQgJyonIGRvbid0CithZmZlY3QgdGhlIHJlc3VsdC4KKworIGNhc2UgIGluZGV4ICAgb2xkICAgICBuZXcgICAgIHJlc3VsdAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwLzIgICAoZW1wdHkpICogICAgICAgKGVtcHR5KSAoZW1wdHkpCisgMS8zICAgKGVtcHR5KSAqICAgICAgIG5ldyAgICAgbmV3CisgNC81ICAgaW5kZXgrICAoZW1wdHkpIChlbXB0eSkgaW5kZXgrCisgNi83ICAgaW5kZXgrICAoZW1wdHkpIGluZGV4ICAgaW5kZXgrCisgMTAgICAgaW5kZXgrICBpbmRleCAgIChlbXB0eSkgKGVtcHR5KQorIDE0LzE1IGluZGV4KyAgb2xkICAgICBvbGQgICAgIGluZGV4KworIDE4LzE5IGluZGV4KyAgb2xkICAgICBpbmRleCAgIGluZGV4KworIDIwICAgIGluZGV4KyAgaW5kZXggICBuZXcgICAgIG5ldworCitUaHJlZS13YXkgbWVyZ2UKKy0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBpbmRleCB0byBsYWNrIGFuIGVudHJ5OyB0aGlzIGRvZXMgbm90IHByZXZlbnQKK2FueSBjYXNlIGZyb20gYXBwbHlpbmcuCisKK0lmIHRoZSBpbmRleCBleGlzdHMsIGl0IGlzIGFuIGVycm9yIGZvciBpdCBub3QgdG8gbWF0Y2ggZWl0aGVyIHRoZQoraGVhZCBvciAoaWYgdGhlIG1lcmdlIGlzIHRyaXZpYWwpIHRoZSByZXN1bHQuCisKK0lmIG11bHRpcGxlIGNhc2VzIGFwcGx5LCB0aGUgb25lIHVzZWQgaXMgbGlzdGVkIGZpcnN0LgorCitBIHJlc3VsdCBvZiAibm8gbWVyZ2UiIG1lYW5zIHRoYXQgaW5kZXggaXMgbGVmdCBpbiBzdGFnZSAwLCBhbmNlc3QgaW4KK3N0YWdlIDEsIGhlYWQgaW4gc3RhZ2UgMiwgYW5kIHJlbW90ZSBpbiBzdGFnZSAzIChpZiBhbnkgb2YgdGhlc2UgYXJlCitlbXB0eSwgbm8gZW50cnkgaXMgbGVmdCBmb3IgdGhhdCBzdGFnZSkuIE90aGVyd2lzZSwgdGhlIGdpdmVuIGVudHJ5IGlzCitsZWZ0IGluIHN0YWdlIDAsIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgZW50cmllcy4KKworQSByZXN1bHQgb2YgIm5vIG1lcmdlIiBpcyBhbiBlcnJvciBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5IGFuZCBub3QKK3VwLXRvLWRhdGUuCisKKyplbXB0eSogbWVhbnMgdGhhdCB0aGUgdHJlZSBtdXN0IG5vdCBoYXZlIGEgZGlyZWN0b3J5LWZpbGUgY29uZmxpY3QKKyB3aXRoIHRoZSBlbnRyeS4KKworRm9yIG11bHRpcGxlIGFuY2VzdG9ycywgYSAnKycgbWVhbnMgdGhhdCB0aGlzIGNhc2UgYXBwbGllcyBldmVuIGlmCitvbmx5IG9uZSBhbmNlc3RvciBvciByZW1vdGUgZml0czsgYSAnXicgbWVhbnMgYWxsIG9mIHRoZSBhbmNlc3RvcnMKK211c3QgYmUgdGhlIHNhbWUuCisKK2Nhc2UgIGFuY2VzdCAgICBoZWFkICAgIHJlbW90ZSAgICByZXN1bHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEgICAgIChlbXB0eSkrICAoZW1wdHkpIChlbXB0eSkgICAoZW1wdHkpCisyQUxUICAoZW1wdHkpKyAgKmVtcHR5KiByZW1vdGUgICAgcmVtb3RlCisyICAgICAoZW1wdHkpXiAgKGVtcHR5KSByZW1vdGUgICAgbm8gbWVyZ2UKKzNBTFQgIChlbXB0eSkrICBoZWFkICAgICplbXB0eSogICBoZWFkCiszICAgICAoZW1wdHkpXiAgaGVhZCAgICAoZW1wdHkpICAgbm8gbWVyZ2UKKzQgICAgIChlbXB0eSleICBoZWFkICAgIHJlbW90ZSAgICBubyBtZXJnZQorNUFMVCAgKiAgICAgICAgIGhlYWQgICAgaGVhZCAgICAgIGhlYWQKKzYgICAgIGFuY2VzdCsgICAoZW1wdHkpIChlbXB0eSkgICBubyBtZXJnZQorOCAgICAgYW5jZXN0XiAgIChlbXB0eSkgYW5jZXN0ICAgIG5vIG1lcmdlCis3ICAgICBhbmNlc3QrICAgKGVtcHR5KSByZW1vdGUgICAgbm8gbWVyZ2UKKzEwICAgIGFuY2VzdF4gICBhbmNlc3QgIChlbXB0eSkgICBubyBtZXJnZQorOSAgICAgYW5jZXN0KyAgIGhlYWQgICAgKGVtcHR5KSAgIG5vIG1lcmdlCisxNiAgICBhbmMxL2FuYzIgYW5jMSAgICBhbmMyICAgICAgbm8gbWVyZ2UKKzEzICAgIGFuY2VzdCsgICBoZWFkICAgIGFuY2VzdCAgICBoZWFkCisxNCAgICBhbmNlc3QrICAgYW5jZXN0ICByZW1vdGUgICAgcmVtb3RlCisxMSAgICBhbmNlc3QrICAgaGVhZCAgICByZW1vdGUgICAgbm8gbWVyZ2UKKworT25seSAjMkFMVCBhbmQgIzNBTFQgdXNlICplbXB0eSosIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBvbmx5IGNhc2VzCit3aGVyZSB0aGVyZSBjYW4gYmUgY29uZmxpY3RzIHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZS4gTm90ZSB0aGF0IHdlCithbGxvdyBkaXJlY3RvcnktZmlsZSBjb25mbGljdHMgYmV0d2VlbiB0aGluZ3MgaW4gZGlmZmVyZW50IHN0YWdlcworYWZ0ZXIgdGhlIHRyaXZpYWwgbWVyZ2UuCisKK0EgcG9zc2libGUgYWx0ZXJuYXRpdmUgZm9yICM2IGlzIChlbXB0eSksIHdoaWNoIHdvdWxkIG1ha2UgaXQgbGlrZQorIzEuIFRoaXMgaXMgbm90IHVzZWQsIGR1ZSB0byB0aGUgbGlrZWxpaG9vZCB0aGF0IGl0IGFyaXNlcyBkdWUgdG8KK21vdmluZyB0aGUgZmlsZSB0byBtdWx0aXBsZSBkaWZmZXJlbnQgbG9jYXRpb25zIG9yIG1vdmluZyBhbmQgZGVsZXRpbmcKK2l0IGluIGRpZmZlcmVudCBicmFuY2hlcy4KKworQ2FzZSAjMSBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzLCBhbmQgYWxzbyBpbiBjYXNlIHdlIGRlY2lkZSB0bworcHV0IG9uICcrJyBtYXJraW5nczsgYW55IHBhdGggdGhhdCBpcyBuZXZlciBtZW50aW9uZWQgYXQgYWxsIGlzbid0CitoYW5kbGVkLgorCitOb3RlIHRoYXQgIzE2IGlzIHdoZW4gYm90aCAjMTMgYW5kICMxNCBhcHBseTsgaW4gdGhpcyBjYXNlLCB3ZSByZWZ1c2UKK3RoZSB0cml2aWFsIG1lcmdlLCBiZWNhdXNlIHdlIGNhbid0IHRlbGwgZnJvbSB0aGlzIGRhdGEgd2hpY2ggaXMKK3JpZ2h0LiBUaGlzIGlzIGEgY2FzZSBvZiBhIHJldmVydGVkIHBhdGNoIChpbiBzb21lIGRpcmVjdGlvbiwgbWF5YmUKK211bHRpcGxlIHRpbWVzKSwgYW5kIHRoZSByaWdodCBhbnN3ZXIgZGVwZW5kcyBvbiBsb29raW5nIGF0IGNyb3NzaW5ncworb2YgaGlzdG9yeSBvciBjb21tb24gYW5jZXN0b3JzIG9mIHRoZSBhbmNlc3RvcnMuCisKK05vdGUgdGhhdCwgYmV0d2VlbiAjNiwgIzcsICM5LCBhbmQgIzExLCBhbGwgY2FzZXMgbm90IG90aGVyd2lzZQorY292ZXJlZCBhcmUgaGFuZGxlZCBpbiB0aGlzIHRhYmxlLgorCitGb3IgIzggYW5kICMxMCwgdGhlcmUgaXMgYWx0ZXJuYXRpdmUgYmVoYXZpb3IsIG5vdCBjdXJyZW50bHkKK2ltcGxlbWVudGVkLCB3aGVyZSB0aGUgcmVzdWx0IGlzIChlbXB0eSkuIEFzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCwKK3RoZSBhdXRvbWF0aWMgbWVyZ2Ugd2lsbCBnZW5lcmFsbHkgZ2l2ZSB0aGlzIGVmZmVjdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHV0b3JpYWwtMi50eHQgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGNhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLTIudHh0CkBAIC0wLDAgKzEsMzkxIEBACitBIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0byBnaXQ6IHBhcnQgdHdvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBzaG91bGQgd29yayB0aHJvdWdoIGxpbms6dHV0b3JpYWwuaHRtbFtBIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0bworZ2l0XSBiZWZvcmUgcmVhZGluZyB0aGlzIHR1dG9yaWFsLgorCitUaGUgZ29hbCBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIGludHJvZHVjZSB0d28gZnVuZGFtZW50YWwgcGllY2VzIG9mCitnaXQncyBhcmNoaXRlY3R1cmUtLXRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIHRoZSBpbmRleCBmaWxlLS1hbmQgdG8KK3Byb3ZpZGUgdGhlIHJlYWRlciB3aXRoIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHVuZGVyc3RhbmQgdGhlIHJlc3QKK29mIHRoZSBnaXQgZG9jdW1lbnRhdGlvbi4KKworVGhlIGdpdCBvYmplY3QgZGF0YWJhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xldCdzIHN0YXJ0IGEgbmV3IHByb2plY3QgYW5kIGNyZWF0ZSBhIHNtYWxsIGFtb3VudCBvZiBoaXN0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgdGVzdC1wcm9qZWN0CiskIGNkIHRlc3QtcHJvamVjdAorJCBnaXQgaW5pdC1kYgorZGVmYXVsdGluZyB0byBsb2NhbCBzdG9yYWdlIGFyZWEKKyQgZWNobyAnaGVsbG8gd29ybGQnID4gZmlsZS50eHQKKyQgZ2l0IGFkZCAuCiskIGdpdCBjb21taXQgLWEgLW0gImluaXRpYWwgY29tbWl0IgorQ29tbWl0dGluZyBpbml0aWFsIHRyZWUgOTJiOGI2OTRmZmIxNjc1ZTU5NzUxNDhlMTEyMTgxMDA4MWRiZGZmZQorJCBlY2hvICdoZWxsbyB3b3JsZCEnID5maWxlLnR4dAorJCBnaXQgY29tbWl0IC1hIC1tICJhZGQgZW1waGFzaXMiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdCBhcmUgdGhlIDQwIGRpZ2l0cyBvZiBoZXggdGhhdCBnaXQgcmVzcG9uZGVkIHRvIHRoZSBmaXJzdCBjb21taXQKK3dpdGg/CisKK1dlIHNhdyBpbiBwYXJ0IG9uZSBvZiB0aGUgdHV0b3JpYWwgdGhhdCBjb21taXRzIGhhdmUgbmFtZXMgbGlrZSB0aGlzLgorSXQgdHVybnMgb3V0IHRoYXQgZXZlcnkgb2JqZWN0IGluIHRoZSBnaXQgaGlzdG9yeSBpcyBzdG9yZWQgdW5kZXIKK3N1Y2ggYSA0MC1kaWdpdCBoZXggbmFtZS4gIFRoYXQgbmFtZSBpcyB0aGUgU0hBMSBoYXNoIG9mIHRoZSBvYmplY3QncworY29udGVudHM7IGFtb25nIG90aGVyIHRoaW5ncywgdGhpcyBlbnN1cmVzIHRoYXQgZ2l0IHdpbGwgbmV2ZXIgc3RvcmUKK3RoZSBzYW1lIGRhdGEgdHdpY2UgKHNpbmNlIGlkZW50aWNhbCBkYXRhIGlzIGdpdmVuIGFuIGlkZW50aWNhbCBTSEExCituYW1lKSwgYW5kIHRoYXQgdGhlIGNvbnRlbnRzIG9mIGEgZ2l0IG9iamVjdCB3aWxsIG5ldmVyIGNoYW5nZSAoc2luY2UKK3RoYXQgd291bGQgY2hhbmdlIHRoZSBvYmplY3QncyBuYW1lIGFzIHdlbGwpLgorCitXZSBjYW4gYXNrIGdpdCBhYm91dCB0aGlzIHBhcnRpY3VsYXIgb2JqZWN0IHdpdGggdGhlIGNhdC1maWxlCitjb21tYW5kLS1qdXN0IGN1dC1hbmQtcGFzdGUgZnJvbSB0aGUgcmVwbHkgdG8gdGhlIGluaXRpYWwgY29tbWl0LCB0bworc2F2ZSB5b3Vyc2VsZiB0eXBpbmcgYWxsIDQwIGhleCBkaWdpdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgLXQgOTJiOGI2OTRmZmIxNjc1ZTU5NzUxNDhlMTEyMTgxMDA4MWRiZGZmZQordHJlZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgdHJlZSBjYW4gcmVmZXIgdG8gb25lIG9yIG1vcmUgImJsb2IiIG9iamVjdHMsIGVhY2ggY29ycmVzcG9uZGluZyB0bworYSBmaWxlLiAgSW4gYWRkaXRpb24sIGEgdHJlZSBjYW4gYWxzbyByZWZlciB0byBvdGhlciB0cmVlIG9iamVjdHMsCit0aHVzIGNyZWF0aW5nIGEgZGlyZWN0b3J5IGhpZXJhcmNoeS4gIFlvdSBjYW4gZXhhbWluZSB0aGUgY29udGVudHMgb2YKK2FueSB0cmVlIHVzaW5nIGxzLXRyZWUgKHJlbWVtYmVyIHRoYXQgYSBsb25nIGVub3VnaCBpbml0aWFsIHBvcnRpb24KK29mIHRoZSBTSEExIHdpbGwgYWxzbyB3b3JrKToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy10cmVlIDkyYjhiNjk0CisxMDA2NDQgYmxvYiAzYjE4ZTUxMmRiYTc5ZTRjODMwMGRkMDhhZWIzN2Y4ZTcyOGI4ZGFkICAgIGZpbGUudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGh1cyB3ZSBzZWUgdGhhdCB0aGlzIHRyZWUgaGFzIG9uZSBmaWxlIGluIGl0LiAgVGhlIFNIQTEgaGFzaCBpcyBhCityZWZlcmVuY2UgdG8gdGhhdCBmaWxlJ3MgZGF0YToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjYXQtZmlsZSAtdCAzYjE4ZTUxMgorYmxvYgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgImJsb2IiIGlzIGp1c3QgZmlsZSBkYXRhLCB3aGljaCB3ZSBjYW4gYWxzbyBleGFtaW5lIHdpdGggY2F0LWZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgYmxvYiAzYjE4ZTUxMgoraGVsbG8gd29ybGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgdGhpcyBpcyB0aGUgb2xkIGZpbGUgZGF0YTsgc28gdGhlIG9iamVjdCB0aGF0IGdpdCBuYW1lZCBpbgoraXRzIHJlc3BvbnNlIHRvIHRoZSBpbml0aWFsIHRyZWUgd2FzIGEgdHJlZSB3aXRoIGEgc25hcHNob3Qgb2YgdGhlCitkaXJlY3Rvcnkgc3RhdGUgdGhhdCB3YXMgcmVjb3JkZWQgYnkgdGhlIGZpcnN0IGNvbW1pdC4KKworQWxsIG9mIHRoZXNlIG9iamVjdHMgYXJlIHN0b3JlZCB1bmRlciB0aGVpciBTSEExIG5hbWVzIGluc2lkZSB0aGUgZ2l0CitkaXJlY3Rvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBmaW5kIC5naXQvb2JqZWN0cy8KKy5naXQvb2JqZWN0cy8KKy5naXQvb2JqZWN0cy9wYWNrCisuZ2l0L29iamVjdHMvaW5mbworLmdpdC9vYmplY3RzLzNiCisuZ2l0L29iamVjdHMvM2IvMThlNTEyZGJhNzllNGM4MzAwZGQwOGFlYjM3ZjhlNzI4YjhkYWQKKy5naXQvb2JqZWN0cy85MgorLmdpdC9vYmplY3RzLzkyL2I4YjY5NGZmYjE2NzVlNTk3NTE0OGUxMTIxODEwMDgxZGJkZmZlCisuZ2l0L29iamVjdHMvNTQKKy5naXQvb2JqZWN0cy81NC8xOTZjYzI3MDNkYzE2NWNiZDM3M2E2NWE0ZGNmMjJkNTBhZTdmNworLmdpdC9vYmplY3RzL2EwCisuZ2l0L29iamVjdHMvYTAvNDIzODk2OTczNjQ0NzcxNDk3YmRjMDNlYjk5ZDUyODE2MTViNTEKKy5naXQvb2JqZWN0cy9kMAorLmdpdC9vYmplY3RzL2QwLzQ5MmIzNjhiNjZiZGFiZjJhYzFmZDhjOTJiMzlkM2RiOTE2ZTU5CisuZ2l0L29iamVjdHMvYzQKKy5naXQvb2JqZWN0cy9jNC9kNTlmMzkwYjljZmQ0MzE4MTE3YWZkZTExZDYwMWMxMDg1ZjI0MQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB0aGUgY29udGVudHMgb2YgdGhlc2UgZmlsZXMgaXMganVzdCB0aGUgY29tcHJlc3NlZCBkYXRhIHBsdXMgYQoraGVhZGVyIGlkZW50aWZ5aW5nIHRoZWlyIGxlbmd0aCBhbmQgdGhlaXIgdHlwZS4gIFRoZSB0eXBlIGlzIGVpdGhlciBhCitibG9iLCBhIHRyZWUsIGEgY29tbWl0LCBvciBhIHRhZy4gIFdlJ3ZlIHNlZW4gYSBibG9iIGFuZCBhIHRyZWUgbm93LAorc28gbmV4dCB3ZSBzaG91bGQgbG9vayBhdCBhIGNvbW1pdC4KKworVGhlIHNpbXBsZXN0IGNvbW1pdCB0byBmaW5kIGlzIHRoZSBIRUFEIGNvbW1pdCwgd2hpY2ggd2UgY2FuIGZpbmQKK2Zyb20gLmdpdC9IRUFEOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvSEVBRAorcmVmOiByZWZzL2hlYWRzL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIHlvdSBjYW4gc2VlLCB0aGlzIHRlbGxzIHVzIHdoaWNoIGJyYW5jaCB3ZSdyZSBjdXJyZW50bHkgb24sIGFuZCBpdAordGVsbHMgdXMgdGhpcyBieSBuYW1pbmcgYSBmaWxlIHVuZGVyIHRoZSAuZ2l0IGRpcmVjdG9yeSwgd2hpY2ggaXRzZWxmCitjb250YWlucyBhIFNIQTEgbmFtZSByZWZlcnJpbmcgdG8gYSBjb21taXQgb2JqZWN0LCB3aGljaCB3ZSBjYW4KK2V4YW1pbmUgd2l0aCBjYXQtZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCitjNGQ1OWYzOTBiOWNmZDQzMTgxMTdhZmRlMTFkNjAxYzEwODVmMjQxCiskIGdpdCBjYXQtZmlsZSAtdCBjNGQ1OWYzOQorY29tbWl0CiskIGdpdCBjYXQtZmlsZSBjb21taXQgYzRkNTlmMzkKK3RyZWUgZDA0OTJiMzY4YjY2YmRhYmYyYWMxZmQ4YzkyYjM5ZDNkYjkxNmU1OQorcGFyZW50IDU0MTk2Y2MyNzAzZGMxNjVjYmQzNzNhNjVhNGRjZjIyZDUwYWU3ZjcKK2F1dGhvciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxODcwMiAtMDUwMAorY29tbWl0dGVyIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0BwdXp6bGUuZmllbGRzZXMub3JnPiAxMTQzNDE4NzAyIC0wNTAwCisKK2FkZCBlbXBoYXNpcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAidHJlZSIgb2JqZWN0IGhlcmUgcmVmZXJzIHRvIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHRyZWU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbHMtdHJlZSBkMDQ5MmIzNgorMTAwNjQ0IGJsb2IgYTA0MjM4OTY5NzM2NDQ3NzE0OTdiZGMwM2ViOTlkNTI4MTYxNWI1MSAgICBmaWxlLnR4dAorJCBnaXQgY2F0LWZpbGUgYmxvYiBhMDQyMzg5NgoraGVsbG8gd29ybGQhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZSAicGFyZW50IiBvYmplY3QgcmVmZXJzIHRvIHRoZSBwcmV2aW91cyBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgY29tbWl0IDU0MTk2Y2MyCit0cmVlIDkyYjhiNjk0ZmZiMTY3NWU1OTc1MTQ4ZTExMjE4MTAwODFkYmRmZmUKK2F1dGhvciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxNDY2OCAtMDUwMAorY29tbWl0dGVyIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0BwdXp6bGUuZmllbGRzZXMub3JnPiAxMTQzNDE0NjY4IC0wNTAwCisKK2luaXRpYWwgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRyZWUgb2JqZWN0IGlzIHRoZSB0cmVlIHdlIGV4YW1pbmVkIGZpcnN0LCBhbmQgdGhpcyBjb21taXQgaXMKK3VudXN1YWwgaW4gdGhhdCBpdCBsYWNrcyBhbnkgcGFyZW50LgorCitNb3N0IGNvbW1pdHMgaGF2ZSBvbmx5IG9uZSBwYXJlbnQsIGJ1dCBpdCBpcyBhbHNvIGNvbW1vbiBmb3IgYSBjb21taXQKK3RvIGhhdmUgbXVsdGlwbGUgcGFyZW50cy4gICBJbiB0aGF0IGNhc2UgdGhlIGNvbW1pdCByZXByZXNlbnRzIGEKK21lcmdlLCB3aXRoIHRoZSBwYXJlbnQgcmVmZXJlbmNlcyBwb2ludGluZyB0byB0aGUgaGVhZHMgb2YgdGhlIG1lcmdlZAorYnJhbmNoZXMuCisKK0Jlc2lkZXMgYmxvYnMsIHRyZWVzLCBhbmQgY29tbWl0cywgdGhlIG9ubHkgcmVtYWluaW5nIHR5cGUgb2Ygb2JqZWN0CitpcyBhICJ0YWciLCB3aGljaCB3ZSB3b24ndCBkaXNjdXNzIGhlcmU7IHJlZmVyIHRvIGdpdGxpbms6Z2l0LXRhZ1sxXQorZm9yIGRldGFpbHMuCisKK1NvIG5vdyB3ZSBrbm93IGhvdyBnaXQgdXNlcyB0aGUgb2JqZWN0IGRhdGFiYXNlIHRvIHJlcHJlc2VudCBhCitwcm9qZWN0J3MgaGlzdG9yeToKKworICAqICJjb21taXQiIG9iamVjdHMgcmVmZXIgdG8gInRyZWUiIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZQorICAgIHNuYXBzaG90IG9mIGEgZGlyZWN0b3J5IHRyZWUgYXQgYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZQorICAgIGhpc3RvcnksIGFuZCByZWZlciB0byAicGFyZW50IiBjb21taXRzIHRvIHNob3cgaG93IHRoZXkncmUKKyAgICBjb25uZWN0ZWQgaW50byB0aGUgcHJvamVjdCBoaXN0b3J5LgorICAqICJ0cmVlIiBvYmplY3RzIHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgYSBzaW5nbGUgZGlyZWN0b3J5LAorICAgIGFzc29jaWF0aW5nIGRpcmVjdG9yeSBuYW1lcyB0byAiYmxvYiIgb2JqZWN0cyBjb250YWluaW5nIGZpbGUKKyAgICBkYXRhIGFuZCAidHJlZSIgb2JqZWN0cyBjb250YWluaW5nIHN1YmRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgKiAiYmxvYiIgb2JqZWN0cyBjb250YWluIGZpbGUgZGF0YSB3aXRob3V0IGFueSBvdGhlciBzdHJ1Y3R1cmUuCisgICogUmVmZXJlbmNlcyB0byBjb21taXQgb2JqZWN0cyBhdCB0aGUgaGVhZCBvZiBlYWNoIGJyYW5jaCBhcmUKKyAgICBzdG9yZWQgaW4gZmlsZXMgdW5kZXIgLmdpdC9yZWZzL2hlYWRzLy4KKyAgKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2ggaXMgc3RvcmVkIGluIC5naXQvSEVBRC4KKworTm90ZSwgYnkgdGhlIHdheSwgdGhhdCBsb3RzIG9mIGNvbW1hbmRzIHRha2UgYSB0cmVlIGFzIGFuIGFyZ3VtZW50LgorQnV0IGFzIHdlIGNhbiBzZWUgYWJvdmUsIGEgdHJlZSBjYW4gYmUgcmVmZXJyZWQgdG8gaW4gbWFueSBkaWZmZXJlbnQKK3dheXMtLWJ5IHRoZSBTSEExIG5hbWUgZm9yIHRoYXQgdHJlZSwgYnkgdGhlIG5hbWUgb2YgYSBjb21taXQgdGhhdAorcmVmZXJzIHRvIHRoZSB0cmVlLCBieSB0aGUgbmFtZSBvZiBhIGJyYW5jaCB3aG9zZSBoZWFkIHJlZmVycyB0byB0aGF0Cit0cmVlLCBldGMuLS1hbmQgbW9zdCBzdWNoIGNvbW1hbmRzIGNhbiBhY2NlcHQgYW55IG9mIHRoZXNlIG5hbWVzLgorCitJbiBjb21tYW5kIHN5bm9wc2VzLCB0aGUgd29yZCAidHJlZS1pc2giIGlzIHNvbWV0aW1lcyB1c2VkIHRvCitkZXNpZ25hdGUgc3VjaCBhbiBhcmd1bWVudC4KKworVGhlIGluZGV4IGZpbGUKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBwcmltYXJ5IHRvb2wgd2UndmUgYmVlbiB1c2luZyB0byBjcmVhdGUgY29tbWl0cyBpcyAiZ2l0IGNvbW1pdAorLWEiLCB3aGljaCBjcmVhdGVzIGEgY29tbWl0IGluY2x1ZGluZyBldmVyeSBjaGFuZ2UgeW91J3ZlIG1hZGUgdG8KK3lvdXIgd29ya2luZyB0cmVlLiAgQnV0IHdoYXQgaWYgeW91IHdhbnQgdG8gY29tbWl0IGNoYW5nZXMgb25seSB0bworY2VydGFpbiBmaWxlcz8gIE9yIG9ubHkgY2VydGFpbiBjaGFuZ2VzIHRvIGNlcnRhaW4gZmlsZXM/CisKK0lmIHdlIGxvb2sgYXQgdGhlIHdheSBjb21taXRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoZSBjb3Zlciwgd2UnbGwgc2VlCit0aGF0IHRoZXJlIGFyZSBtb3JlIGZsZXhpYmxlIHdheXMgY3JlYXRpbmcgY29tbWl0cy4KKworQ29udGludWluZyB3aXRoIG91ciB0ZXN0LXByb2plY3QsIGxldCdzIG1vZGlmeSBmaWxlLnR4dCBhZ2FpbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gImhlbGxvIHdvcmxkLCBhZ2FpbiIgPj5maWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2J1dCB0aGlzIHRpbWUgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBtYWtpbmcgdGhlIGNvbW1pdCwgbGV0J3MgdGFrZSBhbgoraW50ZXJtZWRpYXRlIHN0ZXAsIGFuZCBhc2sgZm9yIGRpZmZzIGFsb25nIHRoZSB3YXkgdG8ga2VlcCB0cmFjayBvZgord2hhdCdzIGhhcHBlbmluZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmCistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKyQgZ2l0IHVwZGF0ZS1pbmRleCBmaWxlLnR4dAorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBsYXN0IGRpZmYgaXMgZW1wdHksIGJ1dCBubyBuZXcgY29tbWl0cyBoYXZlIGJlZW4gbWFkZSwgYW5kIHRoZQoraGVhZCBzdGlsbCBkb2Vzbid0IGNvbnRhaW4gdGhlIG5ldyBsaW5lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYgSEVBRAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IGEwNDIzODkuLjUxM2ZlYmEgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyAiZ2l0IGRpZmYiIGlzIGNvbXBhcmluZyBhZ2FpbnN0IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBoZWFkLgorVGhlIHRoaW5nIHRoYXQgaXQncyBjb21wYXJpbmcgYWdhaW5zdCBpcyBhY3R1YWxseSB0aGUgaW5kZXggZmlsZSwKK3doaWNoIGlzIHN0b3JlZCBpbiAuZ2l0L2luZGV4IGluIGEgYmluYXJ5IGZvcm1hdCwgYnV0IHdob3NlIGNvbnRlbnRzCit3ZSBjYW4gZXhhbWluZSB3aXRoIGxzLWZpbGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UKKzEwMDY0NCA1MTNmZWJhMmU1M2ViYmQyNTMyNDE5ZGVkODQ4YmExOWRlODhiYTAwIDAgICAgICAgZmlsZS50eHQKKyQgZ2l0IGNhdC1maWxlIC10IDUxM2ZlYmEyCitibG9iCiskIGdpdCBjYXQtZmlsZSBibG9iIDUxM2ZlYmEyCitoZWxsbyB3b3JsZCwgYWdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyB3aGF0IG91ciAiZ2l0IHVwZGF0ZS1pbmRleCIgZGlkIHdhcyBzdG9yZSBhIG5ldyBibG9iIGFuZCB0aGVuIHB1dAorYSByZWZlcmVuY2UgdG8gaXQgaW4gdGhlIGluZGV4IGZpbGUuICBJZiB3ZSBtb2RpZnkgdGhlIGZpbGUgYWdhaW4sCit3ZSdsbCBzZWUgdGhhdCB0aGUgbmV3IG1vZGlmaWNhdGlvbnMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgImdpdC1kaWZmIgorb3V0cHV0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZWNobyAnYWdhaW4/JyA+PmZpbGUudHh0CiskIGdpdCBkaWZmCitpbmRleCA1MTNmZWJhLi5iYTNkYTdiIDEwMDY0NAorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSwyICsxLDMgQEAKKyBoZWxsbyB3b3JsZCEKKyBoZWxsbyB3b3JsZCwgYWdhaW4KKythZ2Fpbj8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaXRoIHRoZSByaWdodCBhcmd1bWVudHMsIGdpdCBkaWZmIGNhbiBhbHNvIHNob3cgdXMgdGhlIGRpZmZlcmVuY2UKK2JldHdlZW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCB0aGUgbGFzdCBjb21taXQsIG9yIGJldHdlZW4gdGhlCitpbmRleCBhbmQgdGhlIGxhc3QgY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgSEVBRAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IGEwNDIzODkuLmJhM2RhN2IgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDMgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKythZ2Fpbj8KKyQgZ2l0IGRpZmYgLS1jYWNoZWQKK2RpZmYgLS1naXQgYS9maWxlLnR4dCBiL2ZpbGUudHh0CitpbmRleCBhMDQyMzg5Li41MTNmZWJhIDEwMDY0NAorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSArMSwyIEBACisgaGVsbG8gd29ybGQhCisraGVsbG8gd29ybGQsIGFnYWluCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXQgYW55IHRpbWUsIHdlIGNhbiBjcmVhdGUgYSBuZXcgY29tbWl0IHVzaW5nICJnaXQgY29tbWl0IiAod2l0aG91dAordGhlIC1hIG9wdGlvbiksIGFuZCB2ZXJpZnkgdGhhdCB0aGUgc3RhdGUgY29tbWl0dGVkIG9ubHkgaW5jbHVkZXMgdGhlCitjaGFuZ2VzIHN0b3JlZCBpbiB0aGUgaW5kZXggZmlsZSwgbm90IHRoZSBhZGRpdGlvbmFsIGNoYW5nZSB0aGF0IGlzCitzdGlsbCBvbmx5IGluIG91ciB3b3JraW5nIHRyZWU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC1tICJyZXBlYXQiCiskIGdpdCBkaWZmIEhFQUQKK2RpZmYgLS1naXQgYS9maWxlLnR4dCBiL2ZpbGUudHh0CitpbmRleCA1MTNmZWJhLi5iYTNkYTdiIDEwMDY0NAorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSwyICsxLDMgQEAKKyBoZWxsbyB3b3JsZCEKKyBoZWxsbyB3b3JsZCwgYWdhaW4KKythZ2Fpbj8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyBieSBkZWZhdWx0ICJnaXQgY29tbWl0IiB1c2VzIHRoZSBpbmRleCB0byBjcmVhdGUgdGhlIGNvbW1pdCwgbm90Cit0aGUgd29ya2luZyB0cmVlOyB0aGUgLWEgb3B0aW9uIHRvIGNvbW1pdCB0ZWxscyBpdCB0byBmaXJzdCB1cGRhdGUKK3RoZSBpbmRleCB3aXRoIGFsbCBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUuCisKK0ZpbmFsbHksIGl0J3Mgd29ydGggbG9va2luZyBhdCB0aGUgZWZmZWN0IG9mICJnaXQgYWRkIiBvbiB0aGUgaW5kZXgKK2ZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBlY2hvICJnb29kYnllLCB3b3JsZCIgPmNsb3NpbmcudHh0CiskIGdpdCBhZGQgY2xvc2luZy50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZWZmZWN0IG9mIHRoZSAiZ2l0IGFkZCIgd2FzIHRvIGFkZCBvbmUgZW50cnkgdG8gdGhlIGluZGV4IGZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbHMtZmlsZXMgLS1zdGFnZQorMTAwNjQ0IDhiOTc0M2IyMGQ0YjE1YmUzOTU1ZmM4ZDVjZDJiMDljZDIzMzYxMzggMCAgICAgICBjbG9zaW5nLnR4dAorMTAwNjQ0IDUxM2ZlYmEyZTUzZWJiZDI1MzI0MTlkZWQ4NDhiYTE5ZGU4OGJhMDAgMCAgICAgICBmaWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FuZCwgYXMgeW91IGNhbiBzZWUgd2l0aCBjYXQtZmlsZSwgdGhpcyBuZXcgZW50cnkgcmVmZXJzIHRvIHRoZQorY3VycmVudCBjb250ZW50cyBvZiB0aGUgZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjYXQtZmlsZSBibG9iIGE2YjExZjdhCitnb29kYnllLCB3b3JkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJzdGF0dXMiIGNvbW1hbmQgaXMgYSB1c2VmdWwgd2F5IHRvIGdldCBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlCitzaXR1YXRpb246CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc3RhdHVzCisjCisjIFVwZGF0ZWQgYnV0IG5vdCBjaGVja2VkIGluOgorIyAgICh3aWxsIGNvbW1pdCkKKyMKKyMgICAgICAgbmV3IGZpbGU6IGNsb3NpbmcudHh0CisjCisjCisjIENoYW5nZWQgYnV0IG5vdCB1cGRhdGVkOgorIyAgICh1c2UgZ2l0LXVwZGF0ZS1pbmRleCB0byBtYXJrIGZvciBjb21taXQpCisjCisjICAgICAgIG1vZGlmaWVkOiBmaWxlLnR4dAorIworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbmNlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGNsb3NpbmcudHh0IGlzIGNhY2hlZCBpbiB0aGUgaW5kZXggZmlsZSwKK2l0IGlzIGxpc3RlZCBhcyAidXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iLiAgU2luY2UgZmlsZS50eHQgaGFzCitjaGFuZ2VzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0aGF0IGFyZW4ndCByZWZsZWN0ZWQgaW4gdGhlIGluZGV4LAoraXQgaXMgbWFya2VkICJjaGFuZ2VkIGJ1dCBub3QgdXBkYXRlZCIuICBBdCB0aGlzIHBvaW50LCBydW5uaW5nICJnaXQKK2NvbW1pdCIgd291bGQgY3JlYXRlIGEgY29tbWl0IHRoYXQgYWRkZWQgY2xvc2luZy50eHQgKHdpdGggaXRzIG5ldworY29udGVudHMpLCBidXQgdGhhdCBkaWRuJ3QgbW9kaWZ5IGZpbGUudHh0LgorCitBbHNvLCBub3RlIHRoYXQgYSBiYXJlICJnaXQgZGlmZiIgc2hvd3MgdGhlIGNoYW5nZXMgdG8gZmlsZS50eHQsIGJ1dAorbm90IHRoZSBhZGRpdGlvbiBvZiBjbG9zaW5nLnR4dCwgYmVjYXVzZSB0aGUgdmVyc2lvbiBvZiBjbG9zaW5nLnR4dAoraW4gdGhlIGluZGV4IGZpbGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorCitJbiBhZGRpdGlvbiB0byBiZWluZyB0aGUgc3RhZ2luZyBhcmVhIGZvciBuZXcgY29tbWl0cywgdGhlIGluZGV4IGZpbGUKK2lzIGFsc28gcG9wdWxhdGVkIGZyb20gdGhlIG9iamVjdCBkYXRhYmFzZSB3aGVuIGNoZWNraW5nIG91dCBhCiticmFuY2gsIGFuZCBpcyB1c2VkIHRvIGhvbGQgdGhlIHRyZWVzIGludm9sdmVkIGluIGEgbWVyZ2Ugb3BlcmF0aW9uLgorU2VlIHRoZSBsaW5rOmNvcmUtdHV0b3JpYWwudHh0W2NvcmUgdHV0b3JpYWxdIGFuZCB0aGUgcmVsZXZhbnQgbWFuCitwYWdlcyBmb3IgZGV0YWlscy4KKworV2hhdCBuZXh0PworLS0tLS0tLS0tLQorCitBdCB0aGlzIHBvaW50IHlvdSBzaG91bGQga25vdyBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byByZWFkIHRoZSBtYW4KK3BhZ2VzIGZvciBhbnkgb2YgdGhlIGdpdCBjb21tYW5kczsgb25lIGdvb2QgcGxhY2UgdG8gc3RhcnQgd291bGQgYmUKK3dpdGggdGhlIGNvbW1hbmRzIG1lbnRpb25lZCBpbiBsaW5rOmV2ZXJ5ZGF5Lmh0bWxbRXZlcnlkYXkgZ2l0XS4gIFlvdQorc2hvdWxkIGJlIGFibGUgdG8gZmluZCBhbnkgdW5rbm93biBqYXJnb24gaW4gdGhlCitsaW5rOmdsb3NzYXJ5Lmh0bWxbR2xvc3NhcnldLgorCitUaGUgbGluazpjdnMtbWlncmF0aW9uLmh0bWxbQ1ZTIG1pZ3JhdGlvbl0gZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvCitpbXBvcnQgYSBDVlMgcmVwb3NpdG9yeSBpbnRvIGdpdCwgYW5kIHNob3dzIGhvdyB0byB1c2UgZ2l0IGluIGEKK0NWUy1saWtlIHdheS4KKworRm9yIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgb2YgZ2l0IHVzZSwgc2VlIHRoZQorbGluazpob3d0by1pbmRleC5odG1sW2hvd3Rvc10uCisKK0ZvciBnaXQgZGV2ZWxvcGVycywgdGhlIGxpbms6Y29yZS10dXRvcmlhbC5odG1sW0NvcmUgdHV0b3JpYWxdIGdvZXMKK2ludG8gZGV0YWlsIG9uIHRoZSBsb3dlci1sZXZlbCBnaXQgbWVjaGFuaXNtcyBpbnZvbHZlZCBpbiwgZm9yCitleGFtcGxlLCBjcmVhdGluZyBhIG5ldyBjb21taXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdHV0b3JpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dApAQCAtMCwwICsxLDQ4NyBAQAorQSB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gZ2l0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyB0dXRvcmlhbCBleHBsYWlucyBob3cgdG8gaW1wb3J0IGEgbmV3IHByb2plY3QgaW50byBnaXQsIG1ha2UKK2NoYW5nZXMgdG8gaXQsIGFuZCBzaGFyZSBjaGFuZ2VzIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4KKworRmlyc3QsIG5vdGUgdGhhdCB5b3UgY2FuIGdldCBkb2N1bWVudGF0aW9uIGZvciBhIGNvbW1hbmQgc3VjaCBhcyAiZ2l0CitkaWZmIiB3aXRoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWFuIGdpdC1kaWZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW1wb3J0aW5nIGEgbmV3IHByb2plY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fzc3VtZSB5b3UgaGF2ZSBhIHRhcmJhbGwgcHJvamVjdC50YXIuZ3ogd2l0aCB5b3VyIGluaXRpYWwgd29yay4gIFlvdQorY2FuIHBsYWNlIGl0IHVuZGVyIGdpdCByZXZpc2lvbiBjb250cm9sIGFzIGZvbGxvd3MuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCB0YXIgeHpmIHByb2plY3QudGFyLmd6CiskIGNkIHByb2plY3QKKyQgZ2l0IGluaXQtZGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHaXQgd2lsbCByZXBseQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZmF1bHRpbmcgdG8gbG9jYWwgc3RvcmFnZSBhcmVhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91J3ZlIG5vdyBpbml0aWFsaXplZCB0aGUgd29ya2luZyBkaXJlY3RvcnktLXlvdSBtYXkgbm90aWNlIGEgbmV3CitkaXJlY3RvcnkgY3JlYXRlZCwgbmFtZWQgIi5naXQiLiAgVGVsbCBnaXQgdGhhdCB5b3Ugd2FudCBpdCB0byB0cmFjaworZXZlcnkgZmlsZSB1bmRlciB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmluYWxseSwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHByb21wdCB5b3UgZm9yIGEgY29tbWl0IG1lc3NhZ2UsIHRoZW4gcmVjb3JkIHRoZSBjdXJyZW50IHN0YXRlCitvZiBhbGwgdGhlIGZpbGVzIHRvIHRoZSByZXBvc2l0b3J5LgorCitUcnkgbW9kaWZ5aW5nIHNvbWUgZmlsZXMsIHRoZW4gcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHJldmlldyB5b3VyIGNoYW5nZXMuICBXaGVuIHlvdSdyZSBkb25lLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgYWdhaW4gcHJvbXB0IHlvdXIgZm9yIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UsIGFuZCB0aGVuCityZWNvcmQgdGhlIG5ldyB2ZXJzaW9ucyBvZiB0aGUgbW9kaWZpZWQgZmlsZXMuCisKK0Egbm90ZSBvbiBjb21taXQgbWVzc2FnZXM6IFRob3VnaCBub3QgcmVxdWlyZWQsIGl0J3MgYSBnb29kIGlkZWEgdG8KK2JlZ2luIHRoZSBjb21taXQgbWVzc2FnZSB3aXRoIGEgc2luZ2xlIHNob3J0IChsZXNzIHRoYW4gNTAgY2hhcmFjdGVyKQorbGluZSBzdW1tYXJpemluZyB0aGUgY2hhbmdlLCBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgYW5kIHRoZW4gYSBtb3JlCit0aG9yb3VnaCBkZXNjcmlwdGlvbi4gIFRvb2xzIHRoYXQgdHVybiBjb21taXRzIGludG8gZW1haWwsIGZvcgorZXhhbXBsZSwgdXNlIHRoZSBmaXJzdCBsaW5lIG9uIHRoZSBTdWJqZWN0IGxpbmUgYW5kIHRoZSByZXN0IG9mIHRoZQorY29tbWl0IGluIHRoZSBib2R5LgorCitUbyBhZGQgYSBuZXcgZmlsZSwgZmlyc3QgY3JlYXRlIHRoZSBmaWxlLCB0aGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYWRkIHBhdGgvdG8vbmV3L2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGVuIGNvbW1pdCBhcyB1c3VhbC4gIE5vIHNwZWNpYWwgY29tbWFuZCBpcyByZXF1aXJlZCB3aGVuIHJlbW92aW5nIGEKK2ZpbGU7IGp1c3QgcmVtb3ZlIGl0LCB0aGVuIGNvbW1pdC4KKworQXQgYW55IHBvaW50IHlvdSBjYW4gdmlldyB0aGUgaGlzdG9yeSBvZiB5b3VyIGNoYW5nZXMgdXNpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgYWxzbyB3YW50IHRvIHNlZSBjb21wbGV0ZSBkaWZmcyBhdCBlYWNoIHN0ZXAsIHVzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hbmFnaW5nIGJyYW5jaGVzCistLS0tLS0tLS0tLS0tLS0tLQorCitBIHNpbmdsZSBnaXQgcmVwb3NpdG9yeSBjYW4gbWFpbnRhaW4gbXVsdGlwbGUgYnJhbmNoZXMgb2YKK2RldmVsb3BtZW50LiAgVG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCAiZXhwZXJpbWVudGFsIiwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBub3cgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworeW91J2xsIGdldCBhIGxpc3Qgb2YgYWxsIGV4aXN0aW5nIGJyYW5jaGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZXhwZXJpbWVudGFsCisqIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAiZXhwZXJpbWVudGFsIiBicmFuY2ggaXMgdGhlIG9uZSB5b3UganVzdCBjcmVhdGVkLCBhbmQgdGhlCisibWFzdGVyIiBicmFuY2ggaXMgYSBkZWZhdWx0IGJyYW5jaCB0aGF0IHdhcyBjcmVhdGVkIGZvciB5b3UKK2F1dG9tYXRpY2FsbHkuICBUaGUgYXN0ZXJpc2sgbWFya3MgdGhlIGJyYW5jaCB5b3UgYXJlIGN1cnJlbnRseSBvbjsKK3R5cGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBleHBlcmltZW50YWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byBzd2l0Y2ggdG8gdGhlIGV4cGVyaW1lbnRhbCBicmFuY2guICBOb3cgZWRpdCBhIGZpbGUsIGNvbW1pdCB0aGUKK2NoYW5nZSwgYW5kIHN3aXRjaCBiYWNrIHRvIHRoZSBtYXN0ZXIgYnJhbmNoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhlZGl0IGZpbGUpCiskIGdpdCBjb21taXQgLWEKKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NoZWNrIHRoYXQgdGhlIGNoYW5nZSB5b3UgbWFkZSBpcyBubyBsb25nZXIgdmlzaWJsZSwgc2luY2UgaXQgd2FzCittYWRlIG9uIHRoZSBleHBlcmltZW50YWwgYnJhbmNoIGFuZCB5b3UncmUgYmFjayBvbiB0aGUgbWFzdGVyIGJyYW5jaC4KKworWW91IGNhbiBtYWtlIGEgZGlmZmVyZW50IGNoYW5nZSBvbiB0aGUgbWFzdGVyIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisoZWRpdCBmaWxlKQorJCBnaXQgY29tbWl0IC1hCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXQgdGhpcyBwb2ludCB0aGUgdHdvIGJyYW5jaGVzIGhhdmUgZGl2ZXJnZWQsIHdpdGggZGlmZmVyZW50IGNoYW5nZXMKK21hZGUgaW4gZWFjaC4gIFRvIG1lcmdlIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhlIHR3byBicmFuY2hlcywgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbCAuIGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBjaGFuZ2VzIGRvbid0IGNvbmZsaWN0LCB5b3UncmUgZG9uZS4gIElmIHRoZXJlIGFyZSBjb25mbGljdHMsCittYXJrZXJzIHdpbGwgYmUgbGVmdCBpbiB0aGUgcHJvYmxlbWF0aWMgZmlsZXMgc2hvd2luZyB0aGUgY29uZmxpY3Q7CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB0aGlzLiAgT25jZSB5b3UndmUgZWRpdGVkIHRoZSBmaWxlcyB0byByZXNvbHZlIHRoZQorY29uZmxpY3RzLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgY29tbWl0IHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLiBGaW5hbGx5LAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0aworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyBhIG5pY2UgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgaGlzdG9yeS4KKworSWYgeW91IGRldmVsb3Agb24gYSBicmFuY2ggY3JhenktaWRlYSwgdGhlbiByZWdyZXQgaXQsIHlvdSBjYW4gYWx3YXlzCitkZWxldGUgdGhlIGJyYW5jaCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCAtRCBjcmF6eS1pZGVhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JyYW5jaGVzIGFyZSBjaGVhcCBhbmQgZWFzeSwgc28gdGhpcyBpcyBhIGdvb2Qgd2F5IHRvIHRyeSBzb21ldGhpbmcKK291dC4KKworVXNpbmcgZ2l0IGZvciBjb2xsYWJvcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB0aGF0IEFsaWNlIGhhcyBzdGFydGVkIGEgbmV3IHByb2plY3Qgd2l0aCBhIGdpdCByZXBvc2l0b3J5IGluCisvaG9tZS9hbGljZS9wcm9qZWN0LCBhbmQgdGhhdCBCb2IsIHdobyBoYXMgYSBob21lIGRpcmVjdG9yeSBvbiB0aGUKK3NhbWUgbWFjaGluZSwgd2FudHMgdG8gY29udHJpYnV0ZS4KKworQm9iIGJlZ2lucyB3aXRoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIC9ob21lL2FsaWNlL3Byb2plY3QgbXlyZXBvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBjcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSAibXlyZXBvIiBjb250YWluaW5nIGEgY2xvbmUgb2YgQWxpY2UncworcmVwb3NpdG9yeS4gIFRoZSBjbG9uZSBpcyBvbiBhbiBlcXVhbCBmb290aW5nIHdpdGggdGhlIG9yaWdpbmFsCitwcm9qZWN0LCBwb3NzZXNzaW5nIGl0cyBvd24gY29weSBvZiB0aGUgb3JpZ2luYWwgcHJvamVjdCdzIGhpc3RvcnkuCisKK0JvYiB0aGVuIG1ha2VzIHNvbWUgY2hhbmdlcyBhbmQgY29tbWl0cyB0aGVtOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhlZGl0IGZpbGVzKQorJCBnaXQgY29tbWl0IC1hCisocmVwZWF0IGFzIG5lY2Vzc2FyeSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIGhlJ3MgcmVhZHksIGhlIHRlbGxzIEFsaWNlIHRvIHB1bGwgY2hhbmdlcyBmcm9tIHRoZSByZXBvc2l0b3J5CithdCAvaG9tZS9ib2IvbXlyZXBvLiAgU2hlIGRvZXMgdGhpcyB3aXRoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2QgL2hvbWUvYWxpY2UvcHJvamVjdAorJCBnaXQgcHVsbCAvaG9tZS9ib2IvbXlyZXBvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBhY3R1YWxseSBwdWxscyBjaGFuZ2VzIGZyb20gdGhlIGJyYW5jaCBpbiBCb2IncyByZXBvc2l0b3J5IG5hbWVkCisibWFzdGVyIi4gIEFsaWNlIGNvdWxkIHJlcXVlc3QgYSBkaWZmZXJlbnQgYnJhbmNoIGJ5IGFkZGluZyB0aGUgbmFtZQorb2YgdGhlIGJyYW5jaCB0byB0aGUgZW5kIG9mIHRoZSBnaXQgcHVsbCBjb21tYW5kIGxpbmUuCisKK1RoaXMgbWVyZ2VzIEJvYidzIGNoYW5nZXMgaW50byBoZXIgcmVwb3NpdG9yeTsgImdpdCBsb2ciIHdpbGwKK25vdyBzaG93IHRoZSBuZXcgY29tbWl0cy4gIElmIEFsaWNlIGhhcyBtYWRlIGhlciBvd24gY2hhbmdlcyBpbiB0aGUKK21lYW50aW1lLCB0aGVuIEJvYidzIGNoYW5nZXMgd2lsbCBiZSBtZXJnZWQgaW4sIGFuZCBzaGUgd2lsbCBuZWVkIHRvCittYW51YWxseSBmaXggYW55IGNvbmZsaWN0cy4KKworQSBtb3JlIGNhdXRpb3VzIEFsaWNlIG1pZ2h0IHdpc2ggdG8gZXhhbWluZSBCb2IncyBjaGFuZ2VzIGJlZm9yZQorcHVsbGluZyB0aGVtLiAgU2hlIGNhbiBkbyB0aGlzIGJ5IGNyZWF0aW5nIGEgdGVtcG9yYXJ5IGJyYW5jaCBqdXN0Citmb3IgdGhlIHB1cnBvc2Ugb2Ygc3R1ZHlpbmcgQm9iJ3MgY2hhbmdlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggL2hvbWUvYm9iL215cmVwbyBtYXN0ZXI6Ym9iLWluY29taW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGZldGNoZXMgdGhlIGNoYW5nZXMgZnJvbSBCb2IncyBtYXN0ZXIgYnJhbmNoIGludG8gYSBuZXcgYnJhbmNoCituYW1lZCBib2ItaW5jb21pbmcuICAoVW5saWtlIGdpdCBwdWxsLCBnaXQgZmV0Y2gganVzdCBmZXRjaGVzIGEgY29weQorb2YgQm9iJ3MgbGluZSBvZiBkZXZlbG9wbWVudCB3aXRob3V0IGRvaW5nIGFueSBtZXJnaW5nKS4gIFRoZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wIG1hc3Rlci4uYm9iLWluY29taW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGNoYW5nZXMgdGhhdCBCb2IgbWFkZSBzaW5jZSBoZSBicmFuY2hlZCBmcm9tCitBbGljZSdzIG1hc3RlciBicmFuY2guCisKK0FmdGVyIGV4YW1pbmluZyB0aG9zZSBjaGFuZ2VzLCBhbmQgcG9zc2libHkgZml4aW5nIHRoaW5ncywgQWxpY2UgY2FuCitwdWxsIHRoZSBjaGFuZ2VzIGludG8gaGVyIG1hc3RlciBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgcHVsbCAuIGJvYi1pbmNvbWluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbGFzdCBjb21tYW5kIGlzIGEgcHVsbCBmcm9tIHRoZSAiYm9iLWluY29taW5nIiBicmFuY2ggaW4gQWxpY2Uncworb3duIHJlcG9zaXRvcnkuCisKK0xhdGVyLCBCb2IgY2FuIHVwZGF0ZSBoaXMgcmVwbyB3aXRoIEFsaWNlJ3MgbGF0ZXN0IGNoYW5nZXMgdXNpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgaGUgZG9lc24ndCBuZWVkIHRvIGdpdmUgdGhlIHBhdGggdG8gQWxpY2UncyByZXBvc2l0b3J5Oword2hlbiBCb2IgY2xvbmVkIEFsaWNlJ3MgcmVwb3NpdG9yeSwgZ2l0IHN0b3JlZCB0aGUgbG9jYXRpb24gb2YgaGVyCityZXBvc2l0b3J5IGluIHRoZSBmaWxlIC5naXQvcmVtb3Rlcy9vcmlnaW4sIGFuZCB0aGF0IGxvY2F0aW9uIGlzIHVzZWQKK2FzIHRoZSBkZWZhdWx0IGZvciBwdWxscy4KKworQm9iIG1heSBhbHNvIG5vdGljZSBhIGJyYW5jaCBpbiBoaXMgcmVwb3NpdG9yeSB0aGF0IGhlIGRpZG4ndCBjcmVhdGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaAorKiBtYXN0ZXIKKyAgb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAib3JpZ2luIiBicmFuY2gsIHdoaWNoIHdhcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgImdpdCBjbG9uZSIsCitpcyBhIHByaXN0aW5lIGNvcHkgb2YgQWxpY2UncyBtYXN0ZXIgYnJhbmNoOyBCb2Igc2hvdWxkIG5ldmVyIGNvbW1pdAordG8gaXQuCisKK0lmIEJvYiBsYXRlciBkZWNpZGVzIHRvIHdvcmsgZnJvbSBhIGRpZmZlcmVudCBob3N0LCBoZSBjYW4gc3RpbGwKK3BlcmZvcm0gY2xvbmVzIGFuZCBwdWxscyB1c2luZyB0aGUgc3NoIHByb3RvY29sOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBhbGljZS5vcmc6L2hvbWUvYWxpY2UvcHJvamVjdCBteXJlcG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWx0ZXJuYXRpdmVseSwgZ2l0IGhhcyBhIG5hdGl2ZSBwcm90b2NvbCwgb3IgY2FuIHVzZSByc3luYyBvciBodHRwOworc2VlIGdpdGxpbms6Z2l0LXB1bGxbMV0gZm9yIGRldGFpbHMuCisKK0dpdCBjYW4gYWxzbyBiZSB1c2VkIGluIGEgQ1ZTLWxpa2UgbW9kZSwgd2l0aCBhIGNlbnRyYWwgcmVwb3NpdG9yeQordGhhdCB2YXJpb3VzIHVzZXJzIHB1c2ggY2hhbmdlcyB0bzsgc2VlIGdpdGxpbms6Z2l0LXB1c2hbMV0gYW5kCitsaW5rOmN2cy1taWdyYXRpb24uaHRtbFtnaXQgZm9yIENWUyB1c2Vyc10uCisKK0V4cGxvcmluZyBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLQorCitHaXQgaGlzdG9yeSBpcyByZXByZXNlbnRlZCBhcyBhIHNlcmllcyBvZiBpbnRlcnJlbGF0ZWQgY29tbWl0cy4gIFdlCitoYXZlIGFscmVhZHkgc2VlbiB0aGF0IHRoZSBnaXQgbG9nIGNvbW1hbmQgY2FuIGxpc3QgdGhvc2UgY29tbWl0cy4KK05vdGUgdGhhdCBmaXJzdCBsaW5lIG9mIGVhY2ggZ2l0IGxvZyBlbnRyeSBhbHNvIGdpdmVzIGEgbmFtZSBmb3IgdGhlCitjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZworY29tbWl0IGM4MmEyMmMzOWNiYzMyNTc2ZjY0ZjVjNmIzZjI0Yjk5ZWE4MTQ5YzcKK0F1dGhvcjogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorRGF0ZTogICBUdWUgTWF5IDE2IDE3OjE4OjIyIDIwMDYgLTA3MDAKKworICAgIG1lcmdlLWJhc2U6IENsYXJpZnkgdGhlIGNvbW1lbnRzIG9uIHBvc3QgcHJvY2Vzc2luZy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2UgY2FuIGdpdmUgdGhpcyBuYW1lIHRvIGdpdCBzaG93IHRvIHNlZSB0aGUgZGV0YWlscyBhYm91dCB0aGlzCitjb21taXQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgYzgyYTIyYzM5Y2JjMzI1NzZmNjRmNWM2YjNmMjRiOTllYTgxNDljNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCdXQgdGhlcmUgb3RoZXIgd2F5cyB0byByZWZlciB0byBjb21taXRzLiAgWW91IGNhbiB1c2UgYW55IGluaXRpYWwKK3BhcnQgb2YgdGhlIG5hbWUgdGhhdCBpcyBsb25nIGVub3VnaCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IGM4MmEyMmMzOWMJIyB0aGUgZmlyc3QgZmV3IGNoYXJhY3RlcnMgb2YgdGhlIG5hbWUgYXJlCisJCQkjIHVzdWFsbHkgZW5vdWdoCiskIGdpdCBzaG93IEhFQUQJCSMgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gKKyQgZ2l0IHNob3cgZXhwZXJpbWVudGFsCSMgdGhlIHRpcCBvZiB0aGUgImV4cGVyaW1lbnRhbCIgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZXJ5IGNvbW1pdCBoYXMgYXQgbGVhc3Qgb25lICJwYXJlbnQiIGNvbW1pdCwgd2hpY2ggcG9pbnRzIHRvIHRoZQorcHJldmlvdXMgc3RhdGUgb2YgdGhlIHByb2plY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgSEVBRF4gICMgdG8gc2VlIHRoZSBwYXJlbnQgb2YgSEVBRAorJCBnaXQgc2hvdyBIRUFEXl4gIyB0byBzZWUgdGhlIGdyYW5kcGFyZW50IG9mIEhFQUQKKyQgZ2l0IHNob3cgSEVBRH40ICMgdG8gc2VlIHRoZSBncmVhdC1ncmVhdCBncmFuZHBhcmVudCBvZiBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBtZXJnZSBjb21taXRzIG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgcGFyZW50OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IEhFQUReMSAjIHNob3cgdGhlIGZpcnN0IHBhcmVudCBvZiBIRUFEIChzYW1lIGFzIEhFQUReKQorJCBnaXQgc2hvdyBIRUFEXjIgIyBzaG93IHRoZSBzZWNvbmQgcGFyZW50IG9mIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGdpdmUgY29tbWl0cyBuYW1lcyBvZiB5b3VyIG93bjsgYWZ0ZXIgcnVubmluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC10YWcgdjIuNSAxYjJlMWQ2M2ZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3lvdSBjYW4gcmVmZXIgdG8gMWIyZTFkNjNmZiBieSB0aGUgbmFtZSAidjIuNSIuICBJZiB5b3UgaW50ZW5kIHRvCitzaGFyZSB0aGlzIG5hbWUgd2l0aCBvdGhlciBwZW9wbGUgKGZvciBleGFtcGxlLCB0byBpZGVudGlmeSBhIHJlbGVhc2UKK3ZlcnNpb24pLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhICJ0YWciIG9iamVjdCwgYW5kIHBlcmhhcHMgc2lnbiBpdDsgc2VlCitnaXRsaW5rOmdpdC10YWdbMV0gZm9yIGRldGFpbHMuCisKK0FueSBnaXQgY29tbWFuZCB0aGF0IG5lZWRzIHRvIGtub3cgYSBjb21taXQgY2FuIHRha2UgYW55IG9mIHRoZXNlCituYW1lcy4gIEZvciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHYyLjUgSEVBRAkgIyBjb21wYXJlIHRoZSBjdXJyZW50IEhFQUQgdG8gdjIuNQorJCBnaXQgYnJhbmNoIHN0YWJsZSB2Mi41ICMgc3RhcnQgYSBuZXcgYnJhbmNoIG5hbWVkICJzdGFibGUiIGJhc2VkCisJCQkgIyBhdCB2Mi41CiskIGdpdCByZXNldCAtLWhhcmQgSEVBRF4gIyByZXNldCB5b3VyIGN1cnJlbnQgYnJhbmNoIGFuZCB3b3JraW5nCisJCQkgIyBkaXJlY3RvcnkgdG8gaXRzIHN0YXRlIGF0IEhFQUReCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JlIGNhcmVmdWwgd2l0aCB0aGF0IGxhc3QgY29tbWFuZDogaW4gYWRkaXRpb24gdG8gbG9zaW5nIGFueSBjaGFuZ2VzCitpbiB0aGUgd29ya2luZyBkaXJlY3RvcnksIGl0IHdpbGwgYWxzbyByZW1vdmUgYWxsIGxhdGVyIGNvbW1pdHMgZnJvbQordGhpcyBicmFuY2guICBJZiB0aGlzIGJyYW5jaCBpcyB0aGUgb25seSBicmFuY2ggY29udGFpbmluZyB0aG9zZQorY29tbWl0cywgdGhleSB3aWxsIGJlIGxvc3QuICAoQWxzbywgZG9uJ3QgdXNlICJnaXQgcmVzZXQiIG9uIGEKK3B1YmxpY2x5LXZpc2libGUgYnJhbmNoIHRoYXQgb3RoZXIgZGV2ZWxvcGVycyBwdWxsIGZyb20sIGFzIGdpdCB3aWxsCitiZSBjb25mdXNlZCBieSBoaXN0b3J5IHRoYXQgZGlzYXBwZWFycyBpbiB0aGlzIHdheS4pCisKK1RoZSBnaXQgZ3JlcCBjb21tYW5kIGNhbiBzZWFyY2ggZm9yIHN0cmluZ3MgaW4gYW55IHZlcnNpb24gb2YgeW91cgorcHJvamVjdCwgc28KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZ3JlcCAiaGVsbG8iIHYyLjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2VhcmNoZXMgZm9yIGFsbCBvY2N1cnJlbmNlcyBvZiAiaGVsbG8iIGluIHYyLjUuCisKK0lmIHlvdSBsZWF2ZSBvdXQgdGhlIGNvbW1pdCBuYW1lLCBnaXQgZ3JlcCB3aWxsIHNlYXJjaCBhbnkgb2YgdGhlCitmaWxlcyBpdCBtYW5hZ2VzIGluIHlvdXIgY3VycmVudCBkaXJlY3RvcnkuICBTbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBncmVwICJoZWxsbyIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaXMgYSBxdWljayB3YXkgdG8gc2VhcmNoIGp1c3QgdGhlIGZpbGVzIHRoYXQgYXJlIHRyYWNrZWQgYnkgZ2l0LgorCitNYW55IGdpdCBjb21tYW5kcyBhbHNvIHRha2Ugc2V0cyBvZiBjb21taXRzLCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkCitpbiBhIG51bWJlciBvZiB3YXlzLiAgSGVyZSBhcmUgc29tZSBleGFtcGxlcyB3aXRoIGdpdCBsb2c6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyB2Mi41Li52Mi42ICAgICAgICAgICAgIyBjb21taXRzIGJldHdlZW4gdjIuNSBhbmQgdjIuNgorJCBnaXQgbG9nIHYyLjUuLiAgICAgICAgICAgICAgICAjIGNvbW1pdHMgc2luY2UgdjIuNQorJCBnaXQgbG9nIC0tc2luY2U9IjIgd2Vla3MgYWdvIiAjIGNvbW1pdHMgZnJvbSB0aGUgbGFzdCAyIHdlZWtzCiskIGdpdCBsb2cgdjIuNS4uIE1ha2VmaWxlICAgICAgICMgY29tbWl0cyBzaW5jZSB2Mi41IHdoaWNoIG1vZGlmeQorCQkJCSMgTWFrZWZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGdpdmUgZ2l0IGxvZyBhICJyYW5nZSIgb2YgY29tbWl0cyB3aGVyZSB0aGUgZmlyc3QgaXMgbm90CituZWNlc3NhcmlseSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kOyBmb3IgZXhhbXBsZSwgaWYgdGhlIHRpcHMgb2YKK3RoZSBicmFuY2hlcyAic3RhYmxlLXJlbGVhc2UiIGFuZCAibWFzdGVyIiBkaXZlcmdlZCBmcm9tIGEgY29tbW9uCitjb21taXQgc29tZSB0aW1lIGFnbywgdGhlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgc3RhYmxlLi5leHBlcmltZW50YWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCBsaXN0IGNvbW1pdHMgbWFkZSBpbiB0aGUgZXhwZXJpbWVudGFsIGJyYW5jaCBidXQgbm90IGluIHRoZQorc3RhYmxlIGJyYW5jaCwgd2hpbGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIGV4cGVyaW1lbnRhbC4uc3RhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB0aGUgbGlzdCBvZiBjb21taXRzIG1hZGUgb24gdGhlIHN0YWJsZSBicmFuY2ggYnV0IG5vdAordGhlIGV4cGVyaW1lbnRhbCBicmFuY2guCisKK1RoZSAiZ2l0IGxvZyIgY29tbWFuZCBoYXMgYSB3ZWFrbmVzczogaXQgbXVzdCBwcmVzZW50IGNvbW1pdHMgaW4gYQorbGlzdC4gIFdoZW4gdGhlIGhpc3RvcnkgaGFzIGxpbmVzIG9mIGRldmVsb3BtZW50IHRoYXQgZGl2ZXJnZWQgYW5kCit0aGVuIG1lcmdlZCBiYWNrIHRvZ2V0aGVyLCB0aGUgb3JkZXIgaW4gd2hpY2ggImdpdCBsb2ciIHByZXNlbnRzCit0aG9zZSBjb21taXRzIGlzIG1lYW5pbmdsZXNzLgorCitNb3N0IHByb2plY3RzIHdpdGggbXVsdGlwbGUgY29udHJpYnV0b3JzIChzdWNoIGFzIHRoZSBsaW51eCBrZXJuZWwsCitvciBnaXQgaXRzZWxmKSBoYXZlIGZyZXF1ZW50IG1lcmdlcywgYW5kIGdpdGsgZG9lcyBhIGJldHRlciBqb2Igb2YKK3Zpc3VhbGl6aW5nIHRoZWlyIGhpc3RvcnkuICBGb3IgZXhhbXBsZSwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXRrIC0tc2luY2U9IjIgd2Vla3MgYWdvIiBkcml2ZXJzLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbGxvd3MgeW91IHRvIGJyb3dzZSBhbnkgY29tbWl0cyBmcm9tIHRoZSBsYXN0IDIgd2Vla3Mgb2YgY29tbWl0cwordGhhdCBtb2RpZmllZCBmaWxlcyB1bmRlciB0aGUgImRyaXZlcnMiIGRpcmVjdG9yeS4gIChOb3RlOiB5b3UgY2FuCithZGp1c3QgZ2l0aydzIGZvbnRzIGJ5IGhvbGRpbmcgZG93biB0aGUgY29udHJvbCBrZXkgd2hpbGUgcHJlc3NpbmcKKyItIiBvciAiKyIuKQorCitGaW5hbGx5LCBtb3N0IGNvbW1hbmRzIHRoYXQgdGFrZSBmaWxlbmFtZXMgd2lsbCBvcHRpb25hbGx5IGFsbG93IHlvdQordG8gcHJlY2VkZSBhbnkgZmlsZW5hbWUgYnkgYSBjb21taXQsIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHZlcnNpb24KK29mIHRoZSBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHYyLjU6TWFrZWZpbGUgSEVBRDpNYWtlZmlsZS5pbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsc28gdXNlICJnaXQgY2F0LWZpbGUgLXAiIHRvIHNlZSBhbnkgc3VjaCBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjYXQtZmlsZSAtcCB2Mi41Ok1ha2VmaWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05leHQgU3RlcHMKKy0tLS0tLS0tLS0KKworVGhpcyB0dXRvcmlhbCBzaG91bGQgYmUgZW5vdWdoIHRvIHBlcmZvcm0gYmFzaWMgZGlzdHJpYnV0ZWQgcmV2aXNpb24KK2NvbnRyb2wgZm9yIHlvdXIgcHJvamVjdHMuICBIb3dldmVyLCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBkZXB0aAorYW5kIHBvd2VyIG9mIGdpdCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIHR3byBzaW1wbGUgaWRlYXMgb24gd2hpY2ggaXQKK2lzIGJhc2VkOgorCisgICogVGhlIG9iamVjdCBkYXRhYmFzZSBpcyB0aGUgcmF0aGVyIGVsZWdhbnQgc3lzdGVtIHVzZWQgdG8KKyAgICBzdG9yZSB0aGUgaGlzdG9yeSBvZiB5b3VyIHByb2plY3QtLWZpbGVzLCBkaXJlY3RvcmllcywgYW5kCisgICAgY29tbWl0cy4KKworICAqIFRoZSBpbmRleCBmaWxlIGlzIGEgY2FjaGUgb2YgdGhlIHN0YXRlIG9mIGEgZGlyZWN0b3J5IHRyZWUsCisgICAgdXNlZCB0byBjcmVhdGUgY29tbWl0cywgY2hlY2sgb3V0IHdvcmtpbmcgZGlyZWN0b3JpZXMsIGFuZAorICAgIGhvbGQgdGhlIHZhcmlvdXMgdHJlZXMgaW52b2x2ZWQgaW4gYSBtZXJnZS4KKworbGluazp0dXRvcmlhbC0yLmh0bWxbUGFydCB0d28gb2YgdGhpcyB0dXRvcmlhbF0gZXhwbGFpbnMgdGhlIG9iamVjdAorZGF0YWJhc2UsIHRoZSBpbmRleCBmaWxlLCBhbmQgYSBmZXcgb3RoZXIgb2RkcyBhbmQgZW5kcyB0aGF0IHlvdSdsbAorbmVlZCB0byBtYWtlIHRoZSBtb3N0IG9mIGdpdC4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gY29uc2lkZXIgd2l0aCB0aGF0IHJpZ2h0IGF3YXksIGEgZmV3IG90aGVyCitkaWdyZXNzaW9ucyB0aGF0IG1heSBiZSBpbnRlcmVzdGluZyBhdCB0aGlzIHBvaW50IGFyZToKKworICAqIGdpdGxpbms6Z2l0LWZvcm1hdC1wYXRjaFsxXSwgZ2l0bGluazpnaXQtYW1bMV06IFRoZXNlIGNvbnZlcnQKKyAgICBzZXJpZXMgb2YgZ2l0IGNvbW1pdHMgaW50byBlbWFpbGVkIHBhdGNoZXMsIGFuZCB2aWNlIHZlcnNhLAorICAgIHVzZWZ1bCBmb3IgcHJvamVjdHMgc3VjaCBhcyB0aGUgbGludXgga2VybmVsIHdoaWNoIHJlbHkgaGVhdmlseQorICAgIG9uIGVtYWlsZWQgcGF0Y2hlcy4KKworICAqIGdpdGxpbms6Z2l0LWJpc2VjdFsxXTogV2hlbiB0aGVyZSBpcyBhIHJlZ3Jlc3Npb24gaW4geW91cgorICAgIHByb2plY3QsIG9uZSB3YXkgdG8gdHJhY2sgZG93biB0aGUgYnVnIGlzIGJ5IHNlYXJjaGluZyB0aHJvdWdoCisgICAgdGhlIGhpc3RvcnkgdG8gZmluZCB0aGUgZXhhY3QgY29tbWl0IHRoYXQncyB0byBibGFtZS4gIEdpdCBiaXNlY3QKKyAgICBjYW4gaGVscCB5b3UgcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoYXQgY29tbWl0LiAgSXQgaXMKKyAgICBzbWFydCBlbm91Z2ggdG8gcGVyZm9ybSBhIGNsb3NlLXRvLW9wdGltYWwgc2VhcmNoIGV2ZW4gaW4gdGhlCisgICAgY2FzZSBvZiBjb21wbGV4IG5vbi1saW5lYXIgaGlzdG9yeSB3aXRoIGxvdHMgb2YgbWVyZ2VkIGJyYW5jaGVzLgorCisgICogbGluazpldmVyeWRheS5odG1sW0V2ZXJ5ZGF5IEdJVCB3aXRoIDIwIENvbW1hbmRzIE9yIFNvXQorCisgICogbGluazpjdnMtbWlncmF0aW9uLmh0bWxbZ2l0IGZvciBDVlMgdXNlcnNdLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91cmxzLnR4dCBiL0RvY3VtZW50YXRpb24vdXJscy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NzQxMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdXJscy50eHQKQEAgLTAsMCArMSw2OCBAQAorR0lUIFVSTFNbW1VSTFNdXQorLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGZvbGxvd2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQKK3RvIG5hbWUgdGhlIHJlbW90ZSByZXBvc2l0b3J5OgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gcnN5bmM6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGh0dHA6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGh0dHBzOi8vaG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBnaXQ6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGdpdDovL2hvc3QueHovfnVzZXIvcGF0aC90by9yZXBvLmdpdC8KKy0gc3NoOi8vaG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBzc2g6Ly9ob3N0Lnh6L351c2VyL3BhdGgvdG8vcmVwby5naXQvCistIHNzaDovL2hvc3QueHovfi9wYXRoL3RvL3JlcG8uZ2l0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU1NIIElzIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCBwcm90b2NvbCBhbmQgYWxzbyBzdXBwb3J0cyBhbgorc2NwLWxpa2Ugc3ludGF4LiAgQm90aCBzeW50YXhlcyBzdXBwb3J0IHVzZXJuYW1lIGV4cGFuc2lvbiwKK2FzIGRvZXMgdGhlIG5hdGl2ZSBnaXQgcHJvdG9jb2wuIFRoZSBmb2xsb3dpbmcgdGhyZWUgYXJlCitpZGVudGljYWwgdG8gdGhlIGxhc3QgdGhyZWUgYWJvdmUsIHJlc3BlY3RpdmVseToKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIGhvc3QueHo6L3BhdGgvdG8vcmVwby5naXQvCistIGhvc3QueHo6fnVzZXIvcGF0aC90by9yZXBvLmdpdC8KKy0gaG9zdC54ejpwYXRoL3RvL3JlcG8uZ2l0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVG8gc3luYyB3aXRoIGEgbG9jYWwgZGlyZWN0b3J5LCB1c2U6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLSAvcGF0aC90by9yZXBvLmdpdC8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSRU1PVEVTCistLS0tLS0tCisKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgYXMgYSBzaG9ydC1oYW5kLCB0aGUgbmFtZSBvZiBhCitmaWxlIGluIGAkR0lUX0RJUi9yZW1vdGVzYCBkaXJlY3RvcnkgY2FuIGJlIGdpdmVuOyB0aGUKK25hbWVkIGZpbGUgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisJVVJMOiBvbmUgb2YgdGhlIGFib3ZlIFVSTCBmb3JtYXQKKwlQdXNoOiA8cmVmc3BlYz4KKwlQdWxsOiA8cmVmc3BlYz4KKworVGhlbiBzdWNoIGEgc2hvcnQtaGFuZCBpcyBzcGVjaWZpZWQgaW4gcGxhY2Ugb2YKKzxyZXBvc2l0b3J5PiB3aXRob3V0IDxyZWZzcGVjPiBwYXJhbWV0ZXJzIG9uIHRoZSBjb21tYW5kCitsaW5lLCA8cmVmc3BlYz4gc3BlY2lmaWVkIG9uIGBQdXNoOmAgbGluZXMgb3IgYFB1bGw6YAorbGluZXMgYXJlIHVzZWQgZm9yIGBnaXQtcHVzaGAgYW5kIGBnaXQtZmV0Y2hgL2BnaXQtcHVsbGAsCityZXNwZWN0aXZlbHkuICBNdWx0aXBsZSBgUHVzaDpgIGFuZCBhbmQgYFB1bGw6YCBsaW5lcyBtYXkKK2JlIHNwZWNpZmllZCBmb3IgYWRkaXRpb25hbCBicmFuY2ggbWFwcGluZ3MuCisKK1RoZSBuYW1lIG9mIGEgZmlsZSBpbiBgJEdJVF9ESVIvYnJhbmNoZXNgIGRpcmVjdG9yeSBjYW4gYmUKK3NwZWNpZmllZCBhcyBhbiBvbGRlciBub3RhdGlvbiBzaG9ydC1oYW5kOyB0aGUgbmFtZWQKK2ZpbGUgc2hvdWxkIGNvbnRhaW4gYSBzaW5nbGUgbGluZSwgYSBVUkwgaW4gb25lIG9mIHRoZQorYWJvdmUgZm9ybWF0cywgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGhhc2ggYCNgIGFuZCB0aGUKK25hbWUgb2YgcmVtb3RlIGhlYWQgKFVSTCBmcmFnbWVudCBub3RhdGlvbikuCitgJEdJVF9ESVIvYnJhbmNoZXMvPHJlbW90ZT5gIGZpbGUgdGhhdCBzdG9yZXMgYSA8dXJsPgord2l0aG91dCB0aGUgZnJhZ21lbnQgaXMgZXF1aXZhbGVudCB0byBoYXZlIHRoaXMgaW4gdGhlCitjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIGAkR0lUX0RJUi9yZW1vdGVzL2AgZGlyZWN0b3J5LgorCisJVVJMOiA8dXJsPgorCVB1bGw6IHJlZnMvaGVhZHMvbWFzdGVyOjxyZW1vdGU+CisKK3doaWxlIGhhdmluZyBgPHVybD4jPGhlYWQ+YCBpcyBlcXVpdmFsZW50IHRvCisKKwlVUkw6IDx1cmw+CisJUHVsbDogcmVmcy9oZWFkcy88aGVhZD46PHJlbW90ZT4KZGlmZiAtLWdpdCBhL0dJVC1WRVJTSU9OLUdFTiBiL0dJVC1WRVJTSU9OLUdFTgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDYxNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvR0lULVZFUlNJT04tR0VOCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCitHVkY9R0lULVZFUlNJT04tRklMRQorREVGX1ZFUj12MS4zLkdJVAorCisjIEZpcnN0IHRyeSBnaXQtZGVzY3JpYmUsIHRoZW4gc2VlIGlmIHRoZXJlIGlzIGEgdmVyc2lvbiBmaWxlCisjIChpbmNsdWRlZCBpbiByZWxlYXNlIHRhcmJhbGxzKSwgdGhlbiBkZWZhdWx0CitpZiBWTj0kKGdpdCBkZXNjcmliZSAtLWFiYnJldj00IEhFQUQgMj4vZGV2L251bGwpOyB0aGVuCisJVk49JChlY2hvICIkVk4iIHwgc2VkIC1lICdzLy0vLi9nJyk7CitlbGlmIHRlc3QgLWYgdmVyc2lvbgordGhlbgorCVZOPSQoY2F0IHZlcnNpb24pIHx8IFZOPSIkREVGX1ZFUiIKK2Vsc2UKKwlWTj0iJERFRl9WRVIiCitmaQorCitWTj0kKGV4cHIgIiRWTiIgOiB2KidcKC4qXCknKQorCitkaXJ0eT0kKHNoIC1jICdnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEJyAyPi9kZXYvbnVsbCkgfHwgZGlydHk9CitjYXNlICIkZGlydHkiIGluCisnJykKKwk7OworKikKKwlWTj0iJFZOLWRpcnR5IiA7OworZXNhYworCitpZiB0ZXN0IC1yICRHVkYKK3RoZW4KKwlWQz0kKHNlZCAtZSAncy9eR0lUX1ZFUlNJT04gPSAvLycgPCRHVkYpCitlbHNlCisJVkM9dW5zZXQKK2ZpCit0ZXN0ICIkVk4iID0gIiRWQyIgfHwgeworCWVjaG8gPiYyICJHSVRfVkVSU0lPTiA9ICRWTiIKKwllY2hvICJHSVRfVkVSU0lPTiA9ICRWTiIgPiRHVkYKK30KKworCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2FmOGVjCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDExNCBAQAorCisJCUdpdCBpbnN0YWxsYXRpb24KKworTm9ybWFsbHkgeW91IGNhbiBqdXN0IGRvICJtYWtlIiBmb2xsb3dlZCBieSAibWFrZSBpbnN0YWxsIiwgYW5kIHRoYXQKK3dpbGwgaW5zdGFsbCB0aGUgZ2l0IHByb2dyYW1zIGluIHlvdXIgb3duIH4vYmluLyBkaXJlY3RvcnkuICBJZiB5b3Ugd2FudAordG8gZG8gYSBnbG9iYWwgaW5zdGFsbCwgeW91IGNhbiBkbworCisJJCBtYWtlIHByZWZpeD0vdXNyIGFsbCBkb2MgOyMgYXMgeW91cnNlbGYKKwkjIG1ha2UgcHJlZml4PS91c3IgaW5zdGFsbCBpbnN0YWxsLWRvYyA7IyBhcyByb290CisKKyhvciBwcmVmaXg9L3Vzci9sb2NhbCwgb2YgY291cnNlKS4gIEp1c3QgbGlrZSBhbnkgcHJvZ3JhbSBzdWl0ZQordGhhdCB1c2VzICRwcmVmaXgsIHRoZSBidWlsdCByZXN1bHRzIGhhdmUgc29tZSBwYXRocyBlbmNvZGVkLAord2hpY2ggYXJlIGRlcml2ZWQgZnJvbSAkcHJlZml4LCBzbyAibWFrZSBhbGw7IG1ha2UgcHJlZml4PS91c3IKK2luc3RhbGwiIHdvdWxkIG5vdCB3b3JrLgorCitJc3N1ZXMgb2Ygbm90ZToKKworIC0gZ2l0IG5vcm1hbGx5IGluc3RhbGxzIGEgaGVscGVyIHNjcmlwdCB3cmFwcGVyIGNhbGxlZCAiZ2l0Iiwgd2hpY2gKKyAgIGNvbmZsaWN0cyB3aXRoIGEgc2ltaWxhcmx5IG5hbWVkICJHTlUgaW50ZXJhY3RpdmUgdG9vbHMiIHByb2dyYW0uCisKKyAgIFRvdWdoLiAgRWl0aGVyIGRvbid0IHVzZSB0aGUgd3JhcHBlciBzY3JpcHQsIG9yIGRlbGV0ZSB0aGUgb2xkIEdOVQorICAgaW50ZXJhY3RpdmUgdG9vbHMuICBOb25lIG9mIHRoZSBjb3JlIGdpdCBzdHVmZiBuZWVkcyB0aGUgd3JhcHBlciwKKyAgIGl0J3MganVzdCBhIGNvbnZlbmllbnQgc2hvcnRoYW5kIGFuZCB3aGlsZSBpdCBpcyBkb2N1bWVudGVkIGluIHNvbWUKKyAgIHBsYWNlcywgeW91IGNhbiBhbHdheXMgcmVwbGFjZSAiZ2l0IGNvbW1pdCIgd2l0aCAiZ2l0LWNvbW1pdCIKKyAgIGluc3RlYWQuIAorCisgICBCdXQgbGV0J3MgZmFjZSBpdCwgbW9zdCBvZiB1cyBkb24ndCBoYXZlIEdOVSBpbnRlcmFjdGl2ZSB0b29scywgYW5kCisgICBldmVuIGlmIHdlIGhhZCBpdCwgd2Ugd291bGRuJ3Qga25vdyB3aGF0IGl0IGRvZXMuICBJIGRvbid0IHRoaW5rIGl0CisgICBoYXMgYmVlbiBhY3RpdmVseSBkZXZlbG9wZWQgc2luY2UgMTk5NywgYW5kIHBlb3BsZSBoYXZlIG1vdmVkIG92ZXIgdG8KKyAgIGdyYXBoaWNhbCBmaWxlIG1hbmFnZXJzLgorCisgLSBHaXQgaXMgcmVhc29uYWJseSBzZWxmLXN1ZmZpY2llbnQsIGJ1dCBkb2VzIGRlcGVuZCBvbiBhIGZldyBleHRlcm5hbAorICAgcHJvZ3JhbXMgYW5kIGxpYnJhcmllczoKKworCS0gInpsaWIiLCB0aGUgY29tcHJlc3Npb24gbGlicmFyeS4gR2l0IHdvbid0IGJ1aWxkIHdpdGhvdXQgaXQuCisKKwktICJvcGVuc3NsIi4gIFRoZSBnaXQtcmV2LWxpc3QgcHJvZ3JhbSB1c2VzIGJpZ251bSBzdXBwb3J0IGZyb20KKwkgIG9wZW5zc2wsIGFuZCB1bmxlc3MgeW91IHNwZWNpZnkgb3RoZXJ3aXNlLCB5b3UnbGwgYWxzbyBnZXQgdGhlCisJICBTSEExIGxpYnJhcnkgZnJvbSBoZXJlLgorCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBvcGVuc3NsLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIFNIQTEgbGlicmFyaWVzCisJICB0aGF0IGNvbWUgd2l0aCBnaXQgKGdpdCBpbmNsdWRlcyB0aGUgb25lIGZyb20gTW96aWxsYSwgYW5kIGhhcworCSAgaXRzIG93biBQb3dlclBDIGFuZCBBUk0gb3B0aW1pemVkIG9uZXMgdG9vIC0gc2VlIHRoZSBNYWtlZmlsZSkuCisKKwktICJsaWJjdXJsIiBhbmQgImN1cmwiIGV4ZWN1dGFibGUuICBnaXQtaHR0cC1mZXRjaCBhbmQKKwkgIGdpdC1mZXRjaCB1c2UgdGhlbS4gIElmIHlvdSBkbyBub3QgdXNlIGh0dHAKKwkgIHRyYW5zZmVyLCB5b3UgYXJlIHByb2JhYmFseSBPSyBpZiB5b3UgZG8gbm90IGhhdmUKKwkgIHRoZW0uCisKKwktIGV4cGF0IGxpYnJhcnk7IGdpdC1odHRwLXB1c2ggdXNlcyBpdCBmb3IgcmVtb3RlIGxvY2sKKwkgIG1hbmFnZW1lbnQgb3ZlciBEQVYuICBTaW1pbGFyIHRvICJjdXJsIiBhYm92ZSwgdGhpcyBpcyBvcHRpb25hbC4KKworCS0gIkdOVSBkaWZmIiB0byBnZW5lcmF0ZSBwYXRjaGVzLiAgT2YgY291cnNlLCB5b3UgZG9uJ3QgX2hhdmVfIHRvCisJICBnZW5lcmF0ZSBwYXRjaGVzIGlmIHlvdSBkb24ndCB3YW50IHRvLCBidXQgbGV0J3MgZmFjZSBpdCwgeW91J2xsCisJICBiZSB3YW50aW5nIHRvLiBPciB3aHkgZGlkIHlvdSBnZXQgZ2l0IGluIHRoZSBmaXJzdCBwbGFjZT8KKworCSAgTm9uLUdOVSB2ZXJzaW9ucyBvZiB0aGUgZGlmZi9wYXRjaCBwcm9ncmFtcyBkb24ndCBnZW5lcmFsbHkgc3VwcG9ydAorCSAgdGhlIHVuaWZpZWQgcGF0Y2ggZm9ybWF0ICh3aGljaCBpcyB0aGUgb25lIGdpdCB1c2VzKSwgc28geW91CisJICByZWFsbHkgZG8gd2FudCB0byBnZXQgdGhlIEdOVSBvbmUuICBUcnVzdCBtZSwgeW91IHdpbGwgd2FudCB0bworCSAgZG8gdGhhdCBldmVuIGlmIGl0IHdhc24ndCBmb3IgZ2l0LiAgVGhlcmUncyBubyBwb2ludCBpbiBsaXZpbmcKKwkgIGluIHRoZSBkYXJrIGFnZXMgYW55IG1vcmUuIAorCisJLSAibWVyZ2UiLCB0aGUgc3RhbmRhcmQgVU5JWCB0aHJlZS13YXkgbWVyZ2UgcHJvZ3JhbS4gIEl0IHVzdWFsbHkKKwkgIGNvbWVzIHdpdGggdGhlICJyY3MiIHBhY2thZ2Ugb24gbW9zdCBMaW51eCBkaXN0cmlidXRpb25zLCBzbyBpZgorCSAgeW91IGhhdmUgYSBkZXZlbG9wZXIgaW5zdGFsbCB5b3UgcHJvYmFibHkgaGF2ZSBpdCBhbHJlYWR5LCBidXQgYQorCSAgImdyYXBoaWNhbCB1c2VyIGRlc2t0b3AiIGluc3RhbGwgbWlnaHQgaGF2ZSBsZWZ0IGl0IG91dC4KKworCSAgWW91J2xsIG9ubHkgbmVlZCB0aGUgbWVyZ2UgcHJvZ3JhbSBpZiB5b3UgZG8gZGV2ZWxvcG1lbnQgdXNpbmcKKwkgIGdpdCwgYW5kIGlmIHlvdSBvbmx5IHVzZSBnaXQgdG8gdHJhY2sgb3RoZXIgcGVvcGxlcyB3b3JrIHlvdSdsbAorCSAgbmV2ZXIgbm90aWNlIHRoZSBsYWNrIG9mIGl0LiAKKworICAgICAgICAtICJ3aXNoIiwgdGhlIFRDTC9UayB3aW5kb3dpbmcgc2hlbGwgaXMgdXNlZCBpbiBnaXRrIHRvIHNob3cgdGhlCisgICAgICAgICAgaGlzdG9yeSBncmFwaGljYWxseQorCisJLSAic3NoIiBpcyB1c2VkIHRvIHB1c2ggYW5kIHB1bGwgb3ZlciB0aGUgbmV0CisKKwktICJwZXJsIiBhbmQgUE9TSVgtY29tcGxpYW50IHNoZWxscyBhcmUgbmVlZGVkIHRvIHVzZSBtb3N0IG9mCisJICB0aGUgYmFyZWJvbmUgUG9yY2VsYWluaXNoIHNjcmlwdHMuCisKKwktICJweXRob24iIDIuMyBvciBtb3JlIHJlY2VudDsgaWYgeW91IGhhdmUgMi4zLCB5b3UgbWF5IG5lZWQKKyAgICAgICAgICB0byBidWlsZCB3aXRoICJtYWtlIFdJVEhfT1dOX1NVQlBST0NFU1NfUFk9WWVzUGxlYXNlIi4KKworIC0gU29tZSBwbGF0Zm9ybSBzcGVjaWZpYyBpc3N1ZXMgYXJlIGRlYWx0IHdpdGggTWFrZWZpbGUgcnVsZXMsCisgICBidXQgZGVwZW5kaW5nIG9uIHlvdXIgc3BlY2lmaWMgaW5zdGFsbGF0aW9uLCB5b3UgbWF5IG5vdAorICAgaGF2ZSBhbGwgdGhlIGxpYnJhcmllcy90b29scyBuZWVkZWQsIG9yIHlvdSBtYXkgaGF2ZQorICAgbmVjZXNzYXJ5IGxpYnJhcmllcyBhdCB1bnVzdWFsIGxvY2F0aW9ucy4gIFBsZWFzZSBsb29rIGF0IHRoZQorICAgdG9wIG9mIHRoZSBNYWtlZmlsZSB0byBzZWUgd2hhdCBjYW4gYmUgYWRqdXN0ZWQgZm9yIHlvdXIgbmVlZHMuCisgICBZb3UgY2FuIHBsYWNlIGxvY2FsIHNldHRpbmdzIGluIGNvbmZpZy5tYWsgYW5kIHRoZSBNYWtlZmlsZQorICAgd2lsbCBpbmNsdWRlIHRoZW0uICBOb3RlIHRoYXQgY29uZmlnLm1hayBpcyBub3QgZGlzdHJpYnV0ZWQ7CisgICB0aGUgbmFtZSBpcyByZXNlcnZlZCBmb3IgbG9jYWwgc2V0dGluZ3MuCisKKyAtIFRvIGJ1aWxkIGFuZCBpbnN0YWxsIGRvY3VtZW50YXRpb24gc3VpdGUsIHlvdSBuZWVkIHRvIGhhdmUgdGhlCisgICBhc2NpaWRvYy94bWx0byB0b29sY2hhaW4uICBBbHRlcm5hdGl2ZWx5LCBwcmUtZm9ybWF0dGVkCisgICBkb2N1bWVudGF0aW9uIGFyZSBhdmFpbGFibGUgaW4gImh0bWwiIGFuZCAibWFuIiBicmFuY2hlcyBvZiB0aGUgZ2l0CisgICByZXBvc2l0b3J5IGl0c2VsZi4gIEZvciBleGFtcGxlLCB5b3UgY291bGQ6CisKKwkkIG1rZGlyIG1hbnVhbCAmJiBjZCBtYW51YWwKKwkkIGdpdCBpbml0LWRiCisJJCBnaXQgY2xvbmUtcGFjayBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0IG1hbiBodG1sIHwKKwkgIHdoaWxlIHJlYWQgYSBiCisJICBkbworCSAgICBlY2hvICRhID4uZ2l0LyRiCisJICBkb25lCisJJCBjcCAuZ2l0L3JlZnMvaGVhZHMvbWFuIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKKwkkIGdpdCBjaGVja291dAorCisgICB0byBjaGVja291dCB0aGUgcHJlLWJ1aWx0IG1hbiBwYWdlcy4gIEFsc28gaW4gdGhpcyByZXBvc2l0b3J5OgorCisJJCBnaXQgY2hlY2tvdXQgaHRtbAorCisgICB3b3VsZCBpbnN0ZWFkIGdpdmUgeW91IGEgY29weSBvZiB3aGF0IHlvdSBzZWUgYXQ6CisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8KKwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTFlNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUKQEAgLTAsMCArMSw3MzYgQEAKKyMgVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoaXMgTWFrZWZpbGUgaXMuLi4KK2FsbDoKKworIyBEZWZpbmUgTU9aSUxMQV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgY29taW5nIGZyb20gTW96aWxsYS4gSXQgaXMgR1BMJ2QgYW5kIHNob3VsZCBiZSBmYXN0CisjIG9uIG5vbi14ODYgYXJjaGl0ZWN0dXJlcyAoZS5nLiBQb3dlclBDKSwgd2hpbGUgdGhlIE9wZW5TU0wgdmVyc2lvbiAoZGVmYXVsdAorIyBjaG9pY2UpIGhhcyB2ZXJ5IGZhc3QgdmVyc2lvbiBvcHRpbWl6ZWQgZm9yIGk1ODYuCisjCisjIERlZmluZSBOT19PUEVOU1NMIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdSBkbyBub3QgaGF2ZSBPcGVuU1NMLgorIyBUaGlzIGFsc28gaW1wbGllcyBNT1pJTExBX1NIQTEuCisjCisjIERlZmluZSBOT19DVVJMIGlmIHlvdSBkbyBub3QgaGF2ZSBjdXJsIGluc3RhbGxlZC4gIGdpdC1odHRwLXB1bGwgYW5kCisjIGdpdC1odHRwLXB1c2ggYXJlIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgdXNlIGh0dHA6Ly8gYW5kIGh0dHBzOi8vCisjIHRyYW5zcG9ydHMuCisjCisjIERlZmluZSBDVVJMRElSPS9mb28vYmFyIGlmIHlvdXIgY3VybCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KKyMKKyMgRGVmaW5lIE5PX0VYUEFUIGlmIHlvdSBkbyBub3QgaGF2ZSBleHBhdCBpbnN0YWxsZWQuICBnaXQtaHR0cC1wdXNoIGlzCisjIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgcHVzaCB1c2luZyBodHRwOi8vIGFuZCBodHRwczovLyB0cmFuc3BvcnRzLgorIworIyBEZWZpbmUgTk9fRF9JTk9fSU5fRElSRU5UIGlmIHlvdSBkb24ndCBoYXZlIGRfaW5vIGluIHlvdXIgc3RydWN0IGRpcmVudC4KKyMKKyMgRGVmaW5lIE5PX0RfVFlQRV9JTl9ESVJFTlQgaWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzIERUX1VOS05PV04gYnV0IGxhY2tzCisjIGRfdHlwZSBpbiBzdHJ1Y3QgZGlyZW50IChsYXRlc3QgQ3lnd2luIC0tIHdpbGwgYmUgZml4ZWQgc29vbmlzaCkuCisjCisjIERlZmluZSBOT19TVFJDQVNFU1RSIGlmIHlvdSBkb24ndCBoYXZlIHN0cmNhc2VzdHIuCisjCisjIERlZmluZSBOT19TRVRFTlYgaWYgeW91IGRvbid0IGhhdmUgc2V0ZW52IGluIHRoZSBDIGxpYnJhcnkuCisjCisjIERlZmluZSBOT19TWU1MSU5LX0hFQUQgaWYgeW91IG5ldmVyIHdhbnQgLmdpdC9IRUFEIHRvIGJlIGEgc3ltYm9saWMgbGluay4KKyMgRW5hYmxlIGl0IG9uIFdpbmRvd3MuICBCeSBkZWZhdWx0LCBzeW1yZWZzIGFyZSBzdGlsbCB1c2VkLgorIworIyBEZWZpbmUgUFBDX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBvcHRpbWl6ZWQgZm9yIFBvd2VyUEMuCisjCisjIERlZmluZSBBUk1fU0hBMSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgbWFrZSB0byBtYWtlIHVzZSBvZgorIyBhIGJ1bmRsZWQgU0hBMSByb3V0aW5lIG9wdGltaXplZCBmb3IgQVJNLgorIworIyBEZWZpbmUgTkVFRFNfU1NMX1dJVEhfQ1JZUFRPIGlmIHlvdSBuZWVkIC1sY3J5cHRvIHdpdGggLWxzc2wgKERhcndpbikuCisjCisjIERlZmluZSBORUVEU19MSUJJQ09OViBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChEYXJ3aW4pLgorIworIyBEZWZpbmUgTkVFRFNfU09DS0VUIGlmIGxpbmtpbmcgd2l0aCBsaWJjIGlzIG5vdCBlbm91Z2ggKFN1bk9TLAorIyBQYXRyaWNrIE1hdXJpdHopLgorIworIyBEZWZpbmUgTk9fTU1BUCBpZiB5b3Ugd2FudCB0byBhdm9pZCBtbWFwLgorIworIyBEZWZpbmUgV0lUSF9PV05fU1VCUFJPQ0VTU19QWSBpZiB5b3Ugd2FudCB0byB1c2Ugd2l0aCBweXRob24gMi4zLgorIworIyBEZWZpbmUgTk9fSVBWNiBpZiB5b3UgbGFjayBJUHY2IHN1cHBvcnQgYW5kIGdldGFkZHJpbmZvKCkuCisjCisjIERlZmluZSBOT19TT0NLQUREUl9TVE9SQUdFIGlmIHlvdXIgcGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBzdHJ1Y3QKKyMgc29ja2FkZHJfc3RvcmFnZS4KKyMKKyMgRGVmaW5lIE5PX0lDT05WIGlmIHlvdXIgbGliYyBkb2VzIG5vdCBwcm9wZXJseSBzdXBwb3J0IGljb252LgorIworIyBEZWZpbmUgTk9fQUNDVVJBVEVfRElGRiBpZiB5b3VyIGRpZmYgcHJvZ3JhbSBhdCBsZWFzdCBzb21ldGltZXMgbWlzc2VzCisjIGEgbWlzc2luZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisjCisjIERlZmluZSBOT19QWVRIT04gaWYgeW91IHdhbnQgdG8gbG9vc2UgYWxsIGJlbmVmaXRzIG9mIHRoZSByZWN1cnNpdmUgbWVyZ2UuCisjCisjIERlZmluZSBDT0xMSVNJT05fQ0hFQ0sgYmVsb3cgaWYgeW91IGJlbGlldmUgdGhhdCBTSEExJ3MKKyMgMTQ2MTUwMTYzNzMzMDkwMjkxODIwMzY4NDgzMjcxNjI4MzAxOTY1NTkzMjU0Mjk3NiBoYXNoZXMgZG8gbm90IGdpdmUgeW91CisjIHN1ZmZpY2llbnQgZ3VhcmFudGVlIHRoYXQgbm8gY29sbGlzaW9ucyBiZXR3ZWVuIG9iamVjdHMgd2lsbCBldmVyIGhhcHBlbi4KKworIyBEZWZpbmUgVVNFX05TRUMgYmVsb3cgaWYgeW91IHdhbnQgZ2l0IHRvIGNhcmUgYWJvdXQgc3ViLXNlY29uZCBmaWxlIG10aW1lcworIyBhbmQgY3RpbWVzLiBOb3RlIHRoYXQgeW91IG5lZWQgcmVjZW50IGdsaWJjIChhdCBsZWFzdCAyLjIuNCkgZm9yIHRoaXMsIGFuZAorIyBpdCB3aWxsIEJSRUFLIFlPVVIgTE9DQUwgRElGRlMhIHNob3ctZGlmZiBhbmQgYW55dGhpbmcgdXNpbmcgaXQgd2lsbCBsaWtlbHkKKyMgcmFuZG9tbHkgYnJlYWsgdW5sZXNzIHlvdXIgdW5kZXJseWluZyBmaWxlc3lzdGVtIHN1cHBvcnRzIHRob3NlIHN1Yi1zZWNvbmQKKyMgdGltZXMgKG15IGV4dDMgZG9lc24ndCkuCisKKyMgRGVmaW5lIFVTRV9TVERFViBiZWxvdyBpZiB5b3Ugd2FudCBnaXQgdG8gY2FyZSBhYm91dCB0aGUgdW5kZXJseWluZyBkZXZpY2UKKyMgY2hhbmdlIGJlaW5nIGNvbnNpZGVyZWQgYW4gaW5vZGUgY2hhbmdlIGZyb20gdGhlIHVwZGF0ZS1jYWNoZSBwZXJzcGVjdGl2ZS4KKworR0lULVZFUlNJT04tRklMRTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUKKwlAJChTSEVMTF9QQVRIKSAuL0dJVC1WRVJTSU9OLUdFTgorLWluY2x1ZGUgR0lULVZFUlNJT04tRklMRQorCit1bmFtZV9TIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1zIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX00gOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLW0gMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQordW5hbWVfTyA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtbyAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9SIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1yIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX1AgOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLXAgMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQorCisjIENGTEFHUyBhbmQgTERGTEFHUyBhcmUgZm9yIHRoZSB1c2VycyB0byBvdmVycmlkZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKK0NGTEFHUyA9IC1nIC1PMiAtV2FsbAorTERGTEFHUyA9CitBTExfQ0ZMQUdTID0gJChDRkxBR1MpCitBTExfTERGTEFHUyA9ICQoTERGTEFHUykKK1NUUklQID89IHN0cmlwCisKK3ByZWZpeCA9ICQoSE9NRSkKK2JpbmRpciA9ICQocHJlZml4KS9iaW4KK2dpdGV4ZWNkaXIgPSAkKGJpbmRpcikKK3RlbXBsYXRlX2RpciA9ICQocHJlZml4KS9zaGFyZS9naXQtY29yZS90ZW1wbGF0ZXMvCitHSVRfUFlUSE9OX0RJUiA9ICQocHJlZml4KS9zaGFyZS9naXQtY29yZS9weXRob24KKyMgREVTVERJUj0KKworQ0MgPSBnY2MKK0FSID0gYXIKK1RBUiA9IHRhcgorSU5TVEFMTCA9IGluc3RhbGwKK1JQTUJVSUxEID0gcnBtYnVpbGQKKworIyBzcGFyc2UgaXMgYXJjaGl0ZWN0dXJlLW5ldXRyYWwsIHdoaWNoIG1lYW5zIHRoYXQgd2UgbmVlZCB0byB0ZWxsIGl0CisjIGV4cGxpY2l0bHkgd2hhdCBhcmNoaXRlY3R1cmUgdG8gY2hlY2sgZm9yLiBGaXggdGhpcyB1cCBmb3IgeW91cnMuLgorU1BBUlNFX0ZMQUdTID0gLURfX0JJR19FTkRJQU5fXyAtRF9fcG93ZXJwY19fCisKKworCisjIyMgLS0tIEVORCBDT05GSUdVUkFUSU9OIFNFQ1RJT04gLS0tCisKK1NDUklQVF9TSCA9IFwKKwlnaXQtYmlzZWN0LnNoIGdpdC1icmFuY2guc2ggZ2l0LWNoZWNrb3V0LnNoIFwKKwlnaXQtY2hlcnJ5LnNoIGdpdC1jbGVhbi5zaCBnaXQtY2xvbmUuc2ggZ2l0LWNvbW1pdC5zaCBcCisJZ2l0LWZldGNoLnNoIFwKKwlnaXQtbHMtcmVtb3RlLnNoIFwKKwlnaXQtbWVyZ2Utb25lLWZpbGUuc2ggZ2l0LXBhcnNlLXJlbW90ZS5zaCBcCisJZ2l0LXBydW5lLnNoIGdpdC1wdWxsLnNoIGdpdC1yZWJhc2Uuc2ggXAorCWdpdC1yZXBhY2suc2ggZ2l0LXJlcXVlc3QtcHVsbC5zaCBnaXQtcmVzZXQuc2ggXAorCWdpdC1yZXNvbHZlLnNoIGdpdC1yZXZlcnQuc2ggZ2l0LXNoLXNldHVwLnNoIFwKKwlnaXQtdGFnLnNoIGdpdC12ZXJpZnktdGFnLnNoIFwKKwlnaXQtYXBwbHltYm94LnNoIGdpdC1hcHBseXBhdGNoLnNoIGdpdC1hbS5zaCBcCisJZ2l0LW1lcmdlLnNoIGdpdC1tZXJnZS1zdHVwaWQuc2ggZ2l0LW1lcmdlLW9jdG9wdXMuc2ggXAorCWdpdC1tZXJnZS1yZXNvbHZlLnNoIGdpdC1tZXJnZS1vdXJzLnNoIFwKKwlnaXQtbG9zdC1mb3VuZC5zaCBnaXQtcXVpbHRpbXBvcnQuc2gKKworU0NSSVBUX1BFUkwgPSBcCisJZ2l0LWFyY2hpbXBvcnQucGVybCBnaXQtY3ZzaW1wb3J0LnBlcmwgZ2l0LXJlbGluay5wZXJsIFwKKwlnaXQtc2hvcnRsb2cucGVybCBnaXQtZm10LW1lcmdlLW1zZy5wZXJsIGdpdC1yZXJlcmUucGVybCBcCisJZ2l0LWFubm90YXRlLnBlcmwgZ2l0LWN2c3NlcnZlci5wZXJsIFwKKwlnaXQtc3ZuaW1wb3J0LnBlcmwgZ2l0LW12LnBlcmwgZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsIFwKKwlnaXQtc2VuZC1lbWFpbC5wZXJsCisKK1NDUklQVF9QWVRIT04gPSBcCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZS5weQorCitTQ1JJUFRTID0gJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSBcCisJICAkKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKSBcCisJICAkKHBhdHN1YnN0ICUucHksJSwkKFNDUklQVF9QWVRIT04pKSBcCisJICBnaXQtY2hlcnJ5LXBpY2sgZ2l0LXN0YXR1cworCisjIFRoZSBvbmVzIHRoYXQgZG8gbm90IGhhdmUgdG8gbGluayB3aXRoIGxjcnlwdG8sIGx6IG5vciB4ZGlmZi4KK1NJTVBMRV9QUk9HUkFNUyA9IFwKKwlnaXQtbWFpbHNwbGl0JFggXAorCWdpdC1zdHJpcHNwYWNlJFggZ2l0LWRhZW1vbiRYCisKKyMgLi4uIGFuZCBhbGwgdGhlIHJlc3QgdGhhdCBjb3VsZCBiZSBtb3ZlZCBvdXQgb2YgYmluZGlyIHRvIGdpdGV4ZWNkaXIKK1BST0dSQU1TID0gXAorCWdpdC1jaGVja291dC1pbmRleCRYIGdpdC1jbG9uZS1wYWNrJFggXAorCWdpdC1jb252ZXJ0LW9iamVjdHMkWCBnaXQtZmV0Y2gtcGFjayRYIGdpdC1mc2NrLW9iamVjdHMkWCBcCisJZ2l0LWhhc2gtb2JqZWN0JFggZ2l0LWluZGV4LXBhY2skWCBnaXQtbG9jYWwtZmV0Y2gkWCBcCisJZ2l0LW1haWxpbmZvJFggZ2l0LW1lcmdlLWJhc2UkWCBcCisJZ2l0LW1lcmdlLWluZGV4JFggZ2l0LW1rdGFnJFggZ2l0LW1rdHJlZSRYIGdpdC1wYWNrLW9iamVjdHMkWCBnaXQtcGF0Y2gtaWQkWCBcCisJZ2l0LXBlZWstcmVtb3RlJFggZ2l0LXBydW5lLXBhY2tlZCRYIGdpdC1yZWNlaXZlLXBhY2skWCBcCisJZ2l0LXNlbmQtcGFjayRYIGdpdC1zaGVsbCRYIFwKKwlnaXQtc2hvdy1pbmRleCRYIGdpdC1zc2gtZmV0Y2gkWCBcCisJZ2l0LXNzaC11cGxvYWQkWCBnaXQtdW5wYWNrLWZpbGUkWCBcCisJZ2l0LXVucGFjay1vYmplY3RzJFggZ2l0LXVwZGF0ZS1pbmRleCRYIGdpdC11cGRhdGUtc2VydmVyLWluZm8kWCBcCisJZ2l0LXVwbG9hZC1wYWNrJFggZ2l0LXZlcmlmeS1wYWNrJFggZ2l0LXdyaXRlLXRyZWUkWCBcCisJZ2l0LXVwZGF0ZS1yZWYkWCBnaXQtc3ltYm9saWMtcmVmJFggXAorCWdpdC1uYW1lLXJldiRYIGdpdC1wYWNrLXJlZHVuZGFudCRYIGdpdC1yZXBvLWNvbmZpZyRYIGdpdC12YXIkWCBcCisJZ2l0LWRlc2NyaWJlJFggZ2l0LW1lcmdlLXRyZWUkWCBnaXQtYmxhbWUkWCBnaXQtaW1hcC1zZW5kJFgKKworQlVJTFRfSU5TID0gZ2l0LWxvZyRYIGdpdC13aGF0Y2hhbmdlZCRYIGdpdC1zaG93JFggXAorCWdpdC1jb3VudC1vYmplY3RzJFggZ2l0LWRpZmYkWCBnaXQtcHVzaCRYIFwKKwlnaXQtZ3JlcCRYIGdpdC1hZGQkWCBnaXQtcm0kWCBnaXQtcmV2LWxpc3QkWCBcCisJZ2l0LWNoZWNrLXJlZi1mb3JtYXQkWCBnaXQtcmV2LXBhcnNlJFggXAorCWdpdC1pbml0LWRiJFggZ2l0LXRhci10cmVlJFggZ2l0LXVwbG9hZC10YXIkWCBnaXQtZm9ybWF0LXBhdGNoJFggXAorCWdpdC1scy1maWxlcyRYIGdpdC1scy10cmVlJFggZ2l0LWdldC10YXItY29tbWl0LWlkJFggXAorCWdpdC1yZWFkLXRyZWUkWCBnaXQtY29tbWl0LXRyZWUkWCBcCisJZ2l0LWFwcGx5JFggZ2l0LXNob3ctYnJhbmNoJFggZ2l0LWRpZmYtZmlsZXMkWCBcCisJZ2l0LWRpZmYtaW5kZXgkWCBnaXQtZGlmZi1zdGFnZXMkWCBnaXQtZGlmZi10cmVlJFggZ2l0LWNhdC1maWxlJFgKKworIyB3aGF0ICdhbGwnIHdpbGwgYnVpbGQgYW5kICdpbnN0YWxsJyB3aWxsIGluc3RhbGwsIGluIGdpdGV4ZWNkaXIKK0FMTF9QUk9HUkFNUyA9ICQoUFJPR1JBTVMpICQoU0lNUExFX1BST0dSQU1TKSAkKFNDUklQVFMpCisKKyMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtLSB0byBiZSByZW1vdmVkIGFmdGVyIDEuMAorUFJPR1JBTVMgKz0gZ2l0LXNzaC1wdWxsJFggZ2l0LXNzaC1wdXNoJFgKKworIyBTZXQgcGF0aHMgdG8gdG9vbHMgZWFybHkgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGZvciB2ZXJzaW9uIHRlc3RzLgoraWZuZGVmIFNIRUxMX1BBVEgKKwlTSEVMTF9QQVRIID0gL2Jpbi9zaAorZW5kaWYKK2lmbmRlZiBQRVJMX1BBVEgKKwlQRVJMX1BBVEggPSAvdXNyL2Jpbi9wZXJsCitlbmRpZgoraWZuZGVmIFBZVEhPTl9QQVRICisJUFlUSE9OX1BBVEggPSAvdXNyL2Jpbi9weXRob24KK2VuZGlmCisKK1BZTU9EVUxFUyA9IFwKKwlnaXRNZXJnZUNvbW1vbi5weQorCitMSUJfRklMRT1saWJnaXQuYQorWERJRkZfTElCPXhkaWZmL2xpYi5hCisKK0xJQl9IID0gXAorCWJsb2IuaCBjYWNoZS5oIGNvbW1pdC5oIGNzdW0tZmlsZS5oIGRlbHRhLmggXAorCWRpZmYuaCBvYmplY3QuaCBwYWNrLmggcGt0LWxpbmUuaCBxdW90ZS5oIHJlZnMuaCBcCisJcnVuLWNvbW1hbmQuaCBzdHJidWYuaCB0YWcuaCB0cmVlLmggZ2l0LWNvbXBhdC11dGlsLmggcmV2aXNpb24uaCBcCisJdHJlZS13YWxrLmggbG9nLXRyZWUuaCBkaXIuaAorCitESUZGX09CSlMgPSBcCisJZGlmZi5vIGRpZmYtbGliLm8gZGlmZmNvcmUtYnJlYWsubyBkaWZmY29yZS1vcmRlci5vIFwKKwlkaWZmY29yZS1waWNrYXhlLm8gZGlmZmNvcmUtcmVuYW1lLm8gdHJlZS1kaWZmLm8gY29tYmluZS1kaWZmLm8gXAorCWRpZmZjb3JlLWRlbHRhLm8gbG9nLXRyZWUubworCitMSUJfT0JKUyA9IFwKKwlibG9iLm8gY29tbWl0Lm8gY29ubmVjdC5vIGNzdW0tZmlsZS5vIGNhY2hlLXRyZWUubyBiYXNlODUubyBcCisJZGF0ZS5vIGRpZmYtZGVsdGEubyBlbnRyeS5vIGV4ZWNfY21kLm8gaWRlbnQubyBsb2NrZmlsZS5vIFwKKwlvYmplY3QubyBwYWNrLWNoZWNrLm8gcGF0Y2gtZGVsdGEubyBwYXRoLm8gcGt0LWxpbmUubyBcCisJcXVvdGUubyByZWFkLWNhY2hlLm8gcmVmcy5vIHJ1bi1jb21tYW5kLm8gZGlyLm8gXAorCXNlcnZlci1pbmZvLm8gc2V0dXAubyBzaGExX2ZpbGUubyBzaGExX25hbWUubyBzdHJidWYubyBcCisJdGFnLm8gdHJlZS5vIHVzYWdlLm8gY29uZmlnLm8gZW52aXJvbm1lbnQubyBjdHlwZS5vIGNvcHkubyBcCisJZmV0Y2gtY2xvbmUubyByZXZpc2lvbi5vIHBhZ2VyLm8gdHJlZS13YWxrLm8geGRpZmYtaW50ZXJmYWNlLm8gXAorCSQoRElGRl9PQkpTKQorCitCVUlMVElOX09CSlMgPSBcCisJYnVpbHRpbi1sb2cubyBidWlsdGluLWhlbHAubyBidWlsdGluLWNvdW50Lm8gYnVpbHRpbi1kaWZmLm8gYnVpbHRpbi1wdXNoLm8gXAorCWJ1aWx0aW4tZ3JlcC5vIGJ1aWx0aW4tYWRkLm8gYnVpbHRpbi1yZXYtbGlzdC5vIGJ1aWx0aW4tY2hlY2stcmVmLWZvcm1hdC5vIFwKKwlidWlsdGluLXJtLm8gYnVpbHRpbi1pbml0LWRiLm8gYnVpbHRpbi1yZXYtcGFyc2UubyBcCisJYnVpbHRpbi10YXItdHJlZS5vIGJ1aWx0aW4tdXBsb2FkLXRhci5vIFwKKwlidWlsdGluLWxzLWZpbGVzLm8gYnVpbHRpbi1scy10cmVlLm8gXAorCWJ1aWx0aW4tcmVhZC10cmVlLm8gYnVpbHRpbi1jb21taXQtdHJlZS5vIFwKKwlidWlsdGluLWFwcGx5Lm8gYnVpbHRpbi1zaG93LWJyYW5jaC5vIGJ1aWx0aW4tZGlmZi1maWxlcy5vIFwKKwlidWlsdGluLWRpZmYtaW5kZXgubyBidWlsdGluLWRpZmYtc3RhZ2VzLm8gYnVpbHRpbi1kaWZmLXRyZWUubyBcCisJYnVpbHRpbi1jYXQtZmlsZS5vCisKK0dJVExJQlMgPSAkKExJQl9GSUxFKSAkKFhESUZGX0xJQikKK0xJQlMgPSAkKEdJVExJQlMpIC1segorCisjCisjIFBsYXRmb3JtIHNwZWNpZmljIHR3ZWFrcworIworCisjIFdlIGNob29zZSB0byBhdm9pZCAiaWYgLi4gZWxzZSBpZiAuLiBlbHNlIC4uIGVuZGlmIGVuZGlmIgorIyBiZWNhdXNlIG1haW50YWluaW5nIHRoZSBuZXN0aW5nIHRvIG1hdGNoIGlzIGEgcGFpbi4gIElmCisjIHdlIGhhZCAiZWxpZiIgdGhpbmdzIHdvdWxkIGhhdmUgYmVlbiBtdWNoIG5pY2VyLi4uCisKK2lmZXEgKCQodW5hbWVfUyksRGFyd2luKQorCU5FRURTX1NTTF9XSVRIX0NSWVBUTyA9IFllc1BsZWFzZQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJIyMgZmluaworCWlmZXEgKCQoc2hlbGwgdGVzdCAtZCAvc3cvbGliICYmIGVjaG8geSkseSkKKwkJQUxMX0NGTEFHUyArPSAtSS9zdy9pbmNsdWRlCisJCUFMTF9MREZMQUdTICs9IC1ML3N3L2xpYgorCWVuZGlmCisJIyMgZGFyd2lucG9ydHMKKwlpZmVxICgkKHNoZWxsIHRlc3QgLWQgL29wdC9sb2NhbC9saWIgJiYgZWNobyB5KSx5KQorCQlBTExfQ0ZMQUdTICs9IC1JL29wdC9sb2NhbC9pbmNsdWRlCisJCUFMTF9MREZMQUdTICs9IC1ML29wdC9sb2NhbC9saWIKKwllbmRpZgorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksU3VuT1MpCisJTkVFRFNfU09DS0VUID0gWWVzUGxlYXNlCisJTkVFRFNfTlNMID0gWWVzUGxlYXNlCisJU0hFTExfUEFUSCA9IC9iaW4vYmFzaAorCU5PX1NUUkNBU0VTVFIgPSBZZXNQbGVhc2UKKwlpZmVxICgkKHVuYW1lX1IpLDUuOCkKKwkJTkVFRFNfTElCSUNPTlYgPSBZZXNQbGVhc2UKKwkJTk9fVU5TRVRFTlYgPSBZZXNQbGVhc2UKKwkJTk9fU0VURU5WID0gWWVzUGxlYXNlCisJZW5kaWYKKwlpZmVxICgkKHVuYW1lX1IpLDUuOSkKKwkJTk9fVU5TRVRFTlYgPSBZZXNQbGVhc2UKKwkJTk9fU0VURU5WID0gWWVzUGxlYXNlCisJZW5kaWYKKwlJTlNUQUxMID0gZ2luc3RhbGwKKwlUQVIgPSBndGFyCisJQUxMX0NGTEFHUyArPSAtRF9fRVhURU5TSU9OU19fCitlbmRpZgoraWZlcSAoJCh1bmFtZV9PKSxDeWd3aW4pCisJTk9fRF9UWVBFX0lOX0RJUkVOVCA9IFllc1BsZWFzZQorCU5PX0RfSU5PX0lOX0RJUkVOVCA9IFllc1BsZWFzZQorCU5PX1NUUkNBU0VTVFIgPSBZZXNQbGVhc2UKKwlOT19TWU1MSU5LX0hFQUQgPSBZZXNQbGVhc2UKKwlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCSMgVGhlcmUgYXJlIGNvbmZsaWN0aW5nIHJlcG9ydHMgYWJvdXQgdGhpcy4KKwkjIE9uIHNvbWUgYm94ZXMgTk9fTU1BUCBpcyBuZWVkZWQsIGFuZCBub3Qgc28gZWxzZXdoZXJlLgorCSMgVHJ5IHVuY29tbWVudGluZyB0aGlzIGlmIHlvdSBzZWUgdGhpbmdzIGJyZWFrIC0tIFlNTVYuCisJIyBOT19NTUFQID0gWWVzUGxlYXNlCisJTk9fSVBWNiA9IFllc1BsZWFzZQorCVggPSAuZXhlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxGcmVlQlNEKQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJQUxMX0NGTEFHUyArPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorCUFMTF9MREZMQUdTICs9IC1ML3Vzci9sb2NhbC9saWIKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLE9wZW5CU0QpCisJTk9fU1RSQ0FTRVNUUiA9IFllc1BsZWFzZQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJQUxMX0NGTEFHUyArPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorCUFMTF9MREZMQUdTICs9IC1ML3Vzci9sb2NhbC9saWIKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLE5ldEJTRCkKKwlpZmVxICgkKHNoZWxsIGV4cHIgIiQodW5hbWVfUikiIDogJ1swMV1cLicpLDIpCisJCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJZW5kaWYKKwlBTExfQ0ZMQUdTICs9IC1JL3Vzci9wa2cvaW5jbHVkZQorCUFMTF9MREZMQUdTICs9IC1ML3Vzci9wa2cvbGliIC1XbCwtcnBhdGgsL3Vzci9wa2cvbGliCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxBSVgpCisJTk9fU1RSQ0FTRVNUUj1ZZXNQbGVhc2UKKwlORUVEU19MSUJJQ09OVj1ZZXNQbGVhc2UKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLElSSVg2NCkKKwlOT19JUFY2PVllc1BsZWFzZQorCU5PX1NFVEVOVj1ZZXNQbGVhc2UKKwlOT19TVFJDQVNFU1RSPVllc1BsZWFzZQorCU5PX1NPQ0tBRERSX1NUT1JBR0U9WWVzUGxlYXNlCisJU0hFTExfUEFUSD0vdXNyL2dudS9iaW4vYmFzaAorCUFMTF9DRkxBR1MgKz0gLURQQVRIX01BWD0xMDI0CisJIyBmb3Igbm93LCBidWlsZCAzMi1iaXQgdmVyc2lvbgorCUFMTF9MREZMQUdTICs9IC1ML3Vzci9saWIzMgorZW5kaWYKK2lmbmVxICgsJChmaW5kc3RyaW5nIGFybSwkKHVuYW1lX00pKSkKKwlBUk1fU0hBMSA9IFllc1BsZWFzZQorZW5kaWYKKworLWluY2x1ZGUgY29uZmlnLm1haworCitpZmRlZiBXSVRIX09XTl9TVUJQUk9DRVNTX1BZCisJUFlNT0RVTEVTICs9IGNvbXBhdC9zdWJwcm9jZXNzLnB5CitlbHNlCisJaWZlcSAoJChOT19QWVRIT04pLCkKKwkJaWZuZXEgKCQoc2hlbGwgJChQWVRIT05fUEFUSCkgLWMgJ2ltcG9ydCBzdWJwcm9jZXNzO3ByaW50Ik9LIicgMj4vZGV2L251bGwpLE9LKQorCQkJUFlNT0RVTEVTICs9IGNvbXBhdC9zdWJwcm9jZXNzLnB5CisJCWVuZGlmCisJZW5kaWYKK2VuZGlmCisKK2lmbmRlZiBOT19DVVJMCisJaWZkZWYgQ1VSTERJUgorCQkjIFRoaXMgaXMgc3RpbGwgcHJvYmxlbWF0aWMgLS0gZ2NjIGRvZXMgbm90IGFsd2F5cyB3YW50IC1SLgorCQlBTExfQ0ZMQUdTICs9IC1JJChDVVJMRElSKS9pbmNsdWRlCisJCUNVUkxfTElCQ1VSTCA9IC1MJChDVVJMRElSKS9saWIgLVIkKENVUkxESVIpL2xpYiAtbGN1cmwKKwllbHNlCisJCUNVUkxfTElCQ1VSTCA9IC1sY3VybAorCWVuZGlmCisJUFJPR1JBTVMgKz0gZ2l0LWh0dHAtZmV0Y2gkWAorCWN1cmxfY2hlY2sgOj0gJChzaGVsbCAoZWNobyAwNzA5MDg7IGN1cmwtY29uZmlnIC0tdmVybnVtKSB8IHNvcnQgLXIgfCBzZWQgLW5lIDJwKQorCWlmZXEgIiQoY3VybF9jaGVjaykiICIwNzA5MDgiCisJCWlmbmRlZiBOT19FWFBBVAorCQkJUFJPR1JBTVMgKz0gZ2l0LWh0dHAtcHVzaCRYCisJCWVuZGlmCisJZW5kaWYKKwlpZm5kZWYgTk9fRVhQQVQKKwkJRVhQQVRfTElCRVhQQVQgPSAtbGV4cGF0CisJZW5kaWYKK2VuZGlmCisKK2lmbmRlZiBOT19PUEVOU1NMCisJT1BFTlNTTF9MSUJTU0wgPSAtbHNzbAorCWlmZGVmIE9QRU5TU0xESVIKKwkJIyBBZ2FpbiB0aGlzIG1heSBiZSBwcm9ibGVtYXRpYyAtLSBnY2MgZG9lcyBub3QgYWx3YXlzIHdhbnQgLVIuCisJCUFMTF9DRkxBR1MgKz0gLUkkKE9QRU5TU0xESVIpL2luY2x1ZGUKKwkJT1BFTlNTTF9MSU5LID0gLUwkKE9QRU5TU0xESVIpL2xpYiAtUiQoT1BFTlNTTERJUikvbGliCisJZWxzZQorCQlPUEVOU1NMX0xJTksgPQorCWVuZGlmCitlbHNlCisJQUxMX0NGTEFHUyArPSAtRE5PX09QRU5TU0wKKwlNT1pJTExBX1NIQTEgPSAxCisJT1BFTlNTTF9MSUJTU0wgPQorZW5kaWYKK2lmZGVmIE5FRURTX1NTTF9XSVRIX0NSWVBUTworCUxJQl80X0NSWVBUTyA9ICQoT1BFTlNTTF9MSU5LKSAtbGNyeXB0byAtbHNzbAorZWxzZQorCUxJQl80X0NSWVBUTyA9ICQoT1BFTlNTTF9MSU5LKSAtbGNyeXB0bworZW5kaWYKK2lmZGVmIE5FRURTX0xJQklDT05WCisJaWZkZWYgSUNPTlZESVIKKwkJIyBBZ2FpbiB0aGlzIG1heSBiZSBwcm9ibGVtYXRpYyAtLSBnY2MgZG9lcyBub3QgYWx3YXlzIHdhbnQgLVIuCisJCUFMTF9DRkxBR1MgKz0gLUkkKElDT05WRElSKS9pbmNsdWRlCisJCUlDT05WX0xJTksgPSAtTCQoSUNPTlZESVIpL2xpYiAtUiQoSUNPTlZESVIpL2xpYgorCWVsc2UKKwkJSUNPTlZfTElOSyA9CisJZW5kaWYKKwlMSUJfNF9JQ09OViA9ICQoSUNPTlZfTElOSykgLWxpY29udgorZWxzZQorCUxJQl80X0lDT05WID0KK2VuZGlmCitpZmRlZiBORUVEU19TT0NLRVQKKwlMSUJTICs9IC1sc29ja2V0CisJU0lNUExFX0xJQiArPSAtbHNvY2tldAorZW5kaWYKK2lmZGVmIE5FRURTX05TTAorCUxJQlMgKz0gLWxuc2wKKwlTSU1QTEVfTElCICs9IC1sbnNsCitlbmRpZgoraWZkZWYgTk9fRF9UWVBFX0lOX0RJUkVOVAorCUFMTF9DRkxBR1MgKz0gLUROT19EX1RZUEVfSU5fRElSRU5UCitlbmRpZgoraWZkZWYgTk9fRF9JTk9fSU5fRElSRU5UCisJQUxMX0NGTEFHUyArPSAtRE5PX0RfSU5PX0lOX0RJUkVOVAorZW5kaWYKK2lmZGVmIE5PX1NZTUxJTktfSEVBRAorCUFMTF9DRkxBR1MgKz0gLUROT19TWU1MSU5LX0hFQUQKK2VuZGlmCitpZmRlZiBOT19TVFJDQVNFU1RSCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX1NUUkNBU0VTVFIKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc3RyY2FzZXN0ci5vCitlbmRpZgoraWZkZWYgTk9fU0VURU5WCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX1NFVEVOVgorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9zZXRlbnYubworZW5kaWYKK2lmZGVmIE5PX1NFVEVOVgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19VTlNFVEVOVgorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC91bnNldGVudi5vCitlbmRpZgoraWZkZWYgTk9fTU1BUAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19NTUFQCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L21tYXAubworZW5kaWYKK2lmZGVmIE5PX0lQVjYKKwlBTExfQ0ZMQUdTICs9IC1ETk9fSVBWNgorZW5kaWYKK2lmZGVmIE5PX1NPQ0tBRERSX1NUT1JBR0UKK2lmZGVmIE5PX0lQVjYKKwlBTExfQ0ZMQUdTICs9IC1Ec29ja2FkZHJfc3RvcmFnZT1zb2NrYWRkcl9pbgorZWxzZQorCUFMTF9DRkxBR1MgKz0gLURzb2NrYWRkcl9zdG9yYWdlPXNvY2thZGRyX2luNgorZW5kaWYKK2VuZGlmCitpZmRlZiBOT19JTkVUX05UT1AKKwlMSUJfT0JKUyArPSBjb21wYXQvaW5ldF9udG9wLm8KK2VuZGlmCisKK2lmZGVmIE5PX0lDT05WCisJQUxMX0NGTEFHUyArPSAtRE5PX0lDT05WCitlbmRpZgorCitpZmRlZiBQUENfU0hBMQorCVNIQTFfSEVBREVSID0gInBwYy9zaGExLmgiCisJTElCX09CSlMgKz0gcHBjL3NoYTEubyBwcGMvc2hhMXBwYy5vCitlbHNlCitpZmRlZiBBUk1fU0hBMQorCVNIQTFfSEVBREVSID0gImFybS9zaGExLmgiCisJTElCX09CSlMgKz0gYXJtL3NoYTEubyBhcm0vc2hhMV9hcm0ubworZWxzZQoraWZkZWYgTU9aSUxMQV9TSEExCisJU0hBMV9IRUFERVIgPSAibW96aWxsYS1zaGExL3NoYTEuaCIKKwlMSUJfT0JKUyArPSBtb3ppbGxhLXNoYTEvc2hhMS5vCitlbHNlCisJU0hBMV9IRUFERVIgPSA8b3BlbnNzbC9zaGEuaD4KKwlMSUJTICs9ICQoTElCXzRfQ1JZUFRPKQorZW5kaWYKK2VuZGlmCitlbmRpZgoraWZkZWYgTk9fQUNDVVJBVEVfRElGRgorCUFMTF9DRkxBR1MgKz0gLUROT19BQ0NVUkFURV9ESUZGCitlbmRpZgorCisjIFNoZWxsIHF1b3RlIChkbyBub3QgdXNlICQoY2FsbCkgdG8gYWNjb21vZGF0ZSBhbmNpZW50IHNldHVwcyk7CisKK1NIQTFfSEVBREVSX1NRID0gJChzdWJzdCAnLCdcJycsJChTSEExX0hFQURFUikpCisKK0RFU1RESVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKERFU1RESVIpKQorYmluZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChiaW5kaXIpKQorZ2l0ZXhlY2Rpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoZ2l0ZXhlY2RpcikpCit0ZW1wbGF0ZV9kaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHRlbXBsYXRlX2RpcikpCisKK1NIRUxMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEgpKQorUEVSTF9QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChQRVJMX1BBVEgpKQorUFlUSE9OX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFBZVEhPTl9QQVRIKSkKK0dJVF9QWVRIT05fRElSX1NRID0gJChzdWJzdCAnLCdcJycsJChHSVRfUFlUSE9OX0RJUikpCisKK0FMTF9DRkxBR1MgKz0gLURTSEExX0hFQURFUj0nJChTSEExX0hFQURFUl9TUSknICQoQ09NUEFUX0NGTEFHUykKK0FMTF9DRkxBR1MgKz0gLURERUZBVUxUX0dJVF9URU1QTEFURV9ESVI9JyIkKHRlbXBsYXRlX2Rpcl9TUSkiJworTElCX09CSlMgKz0gJChDT01QQVRfT0JKUykKK2V4cG9ydCBwcmVmaXggVEFSIElOU1RBTEwgREVTVERJUiBTSEVMTF9QQVRIIHRlbXBsYXRlX2RpcgorIyMjIEJ1aWxkIHJ1bGVzCisKK2FsbDogJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWCBnaXRrCisKK2FsbDoKKwkkKE1BS0UpIC1DIHRlbXBsYXRlcworCitzdHJpcDogJChQUk9HUkFNUykgZ2l0JFgKKwkkKFNUUklQKSAkKFNUUklQX09QVFMpICQoUFJPR1JBTVMpIGdpdCRYCisKK2dpdCRYOiBnaXQuYyBjb21tb24tY21kcy5oICQoQlVJTFRJTl9PQkpTKSAkKEdJVExJQlMpCisJJChDQykgLURHSVRfVkVSU0lPTj0nIiQoR0lUX1ZFUlNJT04pIicgXAorCQkkKEFMTF9DRkxBR1MpIC1vICRAICQoZmlsdGVyICUuYywkXikgXAorCQkkKEJVSUxUSU5fT0JKUykgJChBTExfTERGTEFHUykgJChMSUJTKQorCitidWlsdGluLWhlbHAubzogY29tbW9uLWNtZHMuaAorCiskKEJVSUxUX0lOUyk6IGdpdCRYCisJcm0gLWYgJEAgJiYgbG4gZ2l0JFggJEAKKworY29tbW9uLWNtZHMuaDogRG9jdW1lbnRhdGlvbi9naXQtKi50eHQKKwkuL2dlbmVyYXRlLWNtZGxpc3Quc2ggPiAkQCsKKwltdiAkQCsgJEAKKworJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSA6ICUgOiAlLnNoCisJcm0gLWYgJEAgJEArCisJc2VkIC1lICcxc3wjIS4qL3NofCMhJChTSEVMTF9QQVRIX1NRKXwnIFwKKwkgICAgLWUgJ3MvQEBHSVRfVkVSU0lPTkBALyQoR0lUX1ZFUlNJT04pL2cnIFwKKwkgICAgLWUgJ3MvQEBOT19DVVJMQEAvJChOT19DVVJMKS9nJyBcCisJICAgIC1lICdzL0BATk9fUFlUSE9OQEAvJChOT19QWVRIT04pL2cnIFwKKwkgICAgJEAuc2ggPiRAKworCWNobW9kICt4ICRAKworCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKSA6ICUgOiAlLnBlcmwKKwlybSAtZiAkQCAkQCsKKwlzZWQgLWUgJzFzfCMhLipwZXJsfCMhJChQRVJMX1BBVEhfU1EpfCcgXAorCSAgICAtZSAncy9AQEdJVF9WRVJTSU9OQEAvJChHSVRfVkVSU0lPTikvZycgXAorCSAgICAkQC5wZXJsID4kQCsKKwljaG1vZCAreCAkQCsKKwltdiAkQCsgJEAKKworJChwYXRzdWJzdCAlLnB5LCUsJChTQ1JJUFRfUFlUSE9OKSkgOiAlIDogJS5weQorCXJtIC1mICRAICRAKworCXNlZCAtZSAnMXN8IyEuKnB5dGhvbnwjISQoUFlUSE9OX1BBVEhfU1EpfCcgXAorCSAgICAtZSAnc3xAQEdJVF9QWVRIT05fUEFUSEBAfCQoR0lUX1BZVEhPTl9ESVJfU1EpfGcnIFwKKwkgICAgLWUgJ3MvQEBHSVRfVkVSU0lPTkBALyQoR0lUX1ZFUlNJT04pL2cnIFwKKwkgICAgJEAucHkgPiRAKworCWNobW9kICt4ICRAKworCW12ICRAKyAkQAorCitnaXQtY2hlcnJ5LXBpY2s6IGdpdC1yZXZlcnQKKwljcCAkPCAkQCsKKwltdiAkQCsgJEAKKworZ2l0LXN0YXR1czogZ2l0LWNvbW1pdAorCWNwICQ8ICRAKworCW12ICRAKyAkQAorCisjIFRoZXNlIGNhbiByZWNvcmQgR0lUX1ZFUlNJT04KK2dpdCRYIGdpdC5zcGVjIFwKKwkkKHBhdHN1YnN0ICUuc2gsJSwkKFNDUklQVF9TSCkpIFwKKwkkKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKSBcCisJJChwYXRzdWJzdCAlLnB5LCUsJChTQ1JJUFRfUFlUSE9OKSkgXAorCTogR0lULVZFUlNJT04tRklMRQorCislLm86ICUuYworCSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAkPAorJS5vOiAlLlMKKwkkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgJDwKKworZXhlY19jbWQubzogZXhlY19jbWQuYworCSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAnLURHSVRfRVhFQ19QQVRIPSIkKGdpdGV4ZWNkaXJfU1EpIicgJDwKKworaHR0cC5vOiBodHRwLmMKKwkkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgLURHSVRfVVNFUl9BR0VOVD0nImdpdC8kKEdJVF9WRVJTSU9OKSInICQ8CisKK2lmZGVmIE5PX0VYUEFUCitodHRwLWZldGNoLm86IGh0dHAtZmV0Y2guYyBodHRwLmgKKwkkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgLUROT19FWFBBVCAkPAorZW5kaWYKKworZ2l0LSUkWDogJS5vICQoR0lUTElCUykKKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgJChMSUJTKQorCiskKFNJTVBMRV9QUk9HUkFNUykgOiAkKExJQl9GSUxFKQorJChTSU1QTEVfUFJPR1JBTVMpIDogZ2l0LSUkWCA6ICUubworCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSBcCisJCSQoTElCX0ZJTEUpICQoU0lNUExFX0xJQikKKworZ2l0LW1haWxpbmZvJFg6IG1haWxpbmZvLm8gJChMSUJfRklMRSkKKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgXAorCQkkKExJQl9GSUxFKSAkKFNJTVBMRV9MSUIpICQoTElCXzRfSUNPTlYpCisKK2dpdC1sb2NhbC1mZXRjaCRYOiBmZXRjaC5vCitnaXQtc3NoLWZldGNoJFg6IHJzaC5vIGZldGNoLm8KK2dpdC1zc2gtdXBsb2FkJFg6IHJzaC5vCitnaXQtc3NoLXB1bGwkWDogcnNoLm8gZmV0Y2gubworZ2l0LXNzaC1wdXNoJFg6IHJzaC5vCisKK2dpdC1pbWFwLXNlbmQkWDogaW1hcC1zZW5kLm8gJChMSUJfRklMRSkKKworaHR0cC5vIGh0dHAtZmV0Y2gubyBodHRwLXB1c2gubzogaHR0cC5oCitnaXQtaHR0cC1mZXRjaCRYOiBmZXRjaC5vIGh0dHAubyBodHRwLWZldGNoLm8gJChMSUJfRklMRSkKKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgXAorCQkkKExJQlMpICQoQ1VSTF9MSUJDVVJMKSAkKEVYUEFUX0xJQkVYUEFUKQorCitnaXQtaHR0cC1wdXNoJFg6IHJldmlzaW9uLm8gaHR0cC5vIGh0dHAtcHVzaC5vICQoTElCX0ZJTEUpCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pIFwKKwkJJChMSUJTKSAkKENVUkxfTElCQ1VSTCkgJChFWFBBVF9MSUJFWFBBVCkKKworJChMSUJfT0JKUykgJChCVUlMVElOX09CSlMpOiAkKExJQl9IKQorJChwYXRzdWJzdCBnaXQtJSRYLCUubywkKFBST0dSQU1TKSk6ICQoR0lUTElCUykKKyQoRElGRl9PQkpTKTogZGlmZmNvcmUuaAorCiskKExJQl9GSUxFKTogJChMSUJfT0JKUykKKwlybSAtZiAkQCAmJiAkKEFSKSByY3MgJEAgJChMSUJfT0JKUykKKworWERJRkZfT0JKUz14ZGlmZi94ZGlmZmkubyB4ZGlmZi94cHJlcGFyZS5vIHhkaWZmL3h1dGlscy5vIHhkaWZmL3hlbWl0Lm8KKworJChYRElGRl9MSUIpOiAkKFhESUZGX09CSlMpCisJcm0gLWYgJEAgJiYgJChBUikgcmNzICRAICQoWERJRkZfT0JKUykKKworCitkb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGFsbAorCitUQUdTOgorCXJtIC1mIFRBR1MKKwlmaW5kIC4gLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGV0YWdzIC1hCisKK3RhZ3M6CisJcm0gLWYgdGFncworCWZpbmQgLiAtbmFtZSAnKi5baGNTXScgLXByaW50IHwgeGFyZ3MgY3RhZ3MgLWEKKworIyMjIFRlc3RpbmcgcnVsZXMKKworIyBHTlUgbWFrZSBzdXBwb3J0cyBleHBvcnRpbmcgYWxsIHZhcmlhYmxlcyBieSAiZXhwb3J0IiB3aXRob3V0IHBhcmFtZXRlcnMuCisjIEhvd2V2ZXIsIHRoZSBlbnZpcm9ubWVudCBnZXRzIHF1aXRlIGJpZywgYW5kIHNvbWUgcHJvZ3JhbXMgaGF2ZSBwcm9ibGVtcworIyB3aXRoIHRoYXQuCisKK2V4cG9ydCBOT19QWVRIT04KKwordGVzdDogYWxsCisJJChNQUtFKSAtQyB0LyBhbGwKKwordGVzdC1kYXRlJFg6IHRlc3QtZGF0ZS5jIGRhdGUubyBjdHlwZS5vCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSB0ZXN0LWRhdGUuYyBkYXRlLm8gY3R5cGUubworCit0ZXN0LWRlbHRhJFg6IHRlc3QtZGVsdGEuYyBkaWZmLWRlbHRhLm8gcGF0Y2gtZGVsdGEubworCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJF4KKwordGVzdC1kdW1wLWNhY2hlLXRyZWUkWDogZHVtcC1jYWNoZS10cmVlLm8gJChHSVRMSUJTKQorCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSAkKExJQlMpCisKK2NoZWNrOgorCWZvciBpIGluICouYzsgZG8gc3BhcnNlICQoQUxMX0NGTEFHUykgJChTUEFSU0VfRkxBR1MpICQkaSB8fCBleGl0OyBkb25lCisKKworCisjIyMgSW5zdGFsbGF0aW9uIHJ1bGVzCisKK2luc3RhbGw6IGFsbAorCSQoSU5TVEFMTCkgLWQgLW03NTUgJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSknCisJJChJTlNUQUxMKSAtZCAtbTc1NSAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSknCisJJChJTlNUQUxMKSAkKEFMTF9QUk9HUkFNUykgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpJworCSQoSU5TVEFMTCkgZ2l0JFggZ2l0ayAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKScKKwkkKE1BS0UpIC1DIHRlbXBsYXRlcyBpbnN0YWxsCisJJChJTlNUQUxMKSAtZCAtbTc1NSAnJChERVNURElSX1NRKSQoR0lUX1BZVEhPTl9ESVJfU1EpJworCSQoSU5TVEFMTCkgJChQWU1PRFVMRVMpICckKERFU1RESVJfU1EpJChHSVRfUFlUSE9OX0RJUl9TUSknCisJaWYgdGVzdCAneiQoYmluZGlyX1NRKScgIT0gJ3okKGdpdGV4ZWNkaXJfU1EpJzsgXAorCXRoZW4gXAorCQlsbiAtZiAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKS9naXQkWCcgXAorCQkJJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpL2dpdCRYJyB8fCBcCisJCWNwICckKERFU1RESVJfU1EpJChiaW5kaXJfU1EpL2dpdCRYJyBcCisJCQknJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvZ2l0JFgnOyBcCisJZmkKKwkkKGZvcmVhY2ggcCwkKEJVSUxUX0lOUyksIHJtIC1mICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS8kcCcgJiYgbG4gJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpL2dpdCRYJyAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvJHAnIDspCisKK2luc3RhbGwtZG9jOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBpbnN0YWxsCisKKworCisKKyMjIyBNYWludGFpbmVyJ3MgZGlzdCBydWxlcworCitnaXQuc3BlYzogZ2l0LnNwZWMuaW4KKwlzZWQgLWUgJ3MvQEBWRVJTSU9OQEAvJChHSVRfVkVSU0lPTikvZycgPCAkPCA+ICRAKworCW12ICRAKyAkQAorCitHSVRfVEFSTkFNRT1naXQtJChHSVRfVkVSU0lPTikKK2Rpc3Q6IGdpdC5zcGVjIGdpdC10YXItdHJlZQorCS4vZ2l0LXRhci10cmVlIEhFQUQgJChHSVRfVEFSTkFNRSkgPiAkKEdJVF9UQVJOQU1FKS50YXIKKwlAbWtkaXIgLXAgJChHSVRfVEFSTkFNRSkKKwlAY3AgZ2l0LnNwZWMgJChHSVRfVEFSTkFNRSkKKwlAZWNobyAkKEdJVF9WRVJTSU9OKSA+ICQoR0lUX1RBUk5BTUUpL3ZlcnNpb24KKwkkKFRBUikgcmYgJChHSVRfVEFSTkFNRSkudGFyIFwKKwkJJChHSVRfVEFSTkFNRSkvZ2l0LnNwZWMgJChHSVRfVEFSTkFNRSkvdmVyc2lvbgorCUBybSAtcmYgJChHSVRfVEFSTkFNRSkKKwlnemlwIC1mIC05ICQoR0lUX1RBUk5BTUUpLnRhcgorCitycG06IGRpc3QKKwkkKFJQTUJVSUxEKSAtdGEgJChHSVRfVEFSTkFNRSkudGFyLmd6CisKK2h0bWxkb2NzID0gZ2l0LWh0bWxkb2NzLSQoR0lUX1ZFUlNJT04pCittYW5wYWdlcyA9IGdpdC1tYW5wYWdlcy0kKEdJVF9WRVJTSU9OKQorZGlzdC1kb2M6CisJcm0gLWZyIC5kb2MtdG1wLWRpcgorCW1rZGlyIC5kb2MtdG1wLWRpcgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBXRUJET0NfREVTVD0uLi8uZG9jLXRtcC1kaXIgaW5zdGFsbC13ZWJkb2MKKwljZCAuZG9jLXRtcC1kaXIgJiYgJChUQVIpIGNmIC4uLyQoaHRtbGRvY3MpLnRhciAuCisJZ3ppcCAtbiAtOSAtZiAkKGh0bWxkb2NzKS50YXIKKwk6CisJcm0gLWZyIC5kb2MtdG1wLWRpcgorCW1rZGlyIC5kb2MtdG1wLWRpciAuZG9jLXRtcC1kaXIvbWFuMSAuZG9jLXRtcC1kaXIvbWFuNworCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBERVNURElSPS4vIFwKKwkJbWFuMT0uLi8uZG9jLXRtcC1kaXIvbWFuMSBcCisJCW1hbjc9Li4vLmRvYy10bXAtZGlyL21hbjcgXAorCQlpbnN0YWxsCisJY2QgLmRvYy10bXAtZGlyICYmICQoVEFSKSBjZiAuLi8kKG1hbnBhZ2VzKS50YXIgLgorCWd6aXAgLW4gLTkgLWYgJChtYW5wYWdlcykudGFyCisJcm0gLWZyIC5kb2MtdG1wLWRpcgorCisjIyMgQ2xlYW5pbmcgcnVsZXMKKworY2xlYW46CisJcm0gLWYgKi5vIG1vemlsbGEtc2hhMS8qLm8gYXJtLyoubyBwcGMvKi5vIGNvbXBhdC8qLm8geGRpZmYvKi5vIFwKKwkJJChMSUJfRklMRSkgJChYRElGRl9MSUIpCisJcm0gLWYgJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWAorCXJtIC1mICouc3BlYyAqLnB5YyAqLnB5byAqLyoucHljICovKi5weW8gY29tbW9uLWNtZHMuaCBUQUdTIHRhZ3MKKwlybSAtcmYgJChHSVRfVEFSTkFNRSkgLmRvYy10bXAtZGlyCisJcm0gLWYgJChHSVRfVEFSTkFNRSkudGFyLmd6IGdpdC1jb3JlXyQoR0lUX1ZFUlNJT04pLSoudGFyLmd6CisJcm0gLWYgJChodG1sZG9jcykudGFyLmd6ICQobWFucGFnZXMpLnRhci5negorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbi8gY2xlYW4KKwkkKE1BS0UpIC1DIHRlbXBsYXRlcyBjbGVhbgorCSQoTUFLRSkgLUMgdC8gY2xlYW4KKwlybSAtZiBHSVQtVkVSU0lPTi1GSUxFCisKKy5QSE9OWTogYWxsIGluc3RhbGwgY2xlYW4gc3RyaXAKKy5QSE9OWTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUgVEFHUyB0YWdzCisKKyMjIyBDaGVjayBkb2N1bWVudGF0aW9uCisjCitjaGVjay1kb2NzOjoKKwlAZm9yIHYgaW4gJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWCBnaXRrOyBcCisJZG8gXAorCQljYXNlICIkJHYiIGluIFwKKwkJZ2l0LW1lcmdlLW9jdG9wdXMgfCBnaXQtbWVyZ2Utb3VycyB8IGdpdC1tZXJnZS1yZWN1cnNpdmUgfCBcCisJCWdpdC1tZXJnZS1yZXNvbHZlIHwgZ2l0LW1lcmdlLXN0dXBpZCB8IFwKKwkJZ2l0LXNzaC1wdWxsIHwgZ2l0LXNzaC1wdXNoICkgY29udGludWUgOzsgXAorCQllc2FjIDsgXAorCQl0ZXN0IC1mICJEb2N1bWVudGF0aW9uLyQkdi50eHQiIHx8IFwKKwkJZWNobyAibm8gZG9jOiAkJHYiOyBcCisJCWdyZXAgLXEgIl5naXRsaW5rOiQkdlxbWzAtOV1cXTo6IiBEb2N1bWVudGF0aW9uL2dpdC50eHQgfHwgXAorCQljYXNlICIkJHYiIGluIFwKKwkJZ2l0KSA7OyBcCisJCSopIGVjaG8gIm5vIGxpbms6ICQkdiI7OyBcCisJCWVzYWMgOyBcCisJZG9uZSB8IHNvcnQKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCAzMDE0ZDczLi5jZWU3ZTQzIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0xLDE2ICsxLDU4OSBAQAotR0lUIHdlYiBJbnRlcmZhY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotVGhlIG9uZSB3b3JraW5nIG9uOgotICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZ2l0LworCUdJVCAtIHRoZSBzdHVwaWQgY29udGVudCB0cmFja2VyCiAKLUdldCB0aGUgZ2l0d2ViLmNnaSBieSBmdHA6Ci0gIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0d2ViLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworImdpdCIgY2FuIG1lYW4gYW55dGhpbmcsIGRlcGVuZGluZyBvbiB5b3VyIG1vb2QuCiAKLUl0IHJlcWlyZXMgdGhlIGdpdC1jb3JlIGJpbmFyaWVzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtOgotICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZ2l0Lz9wPWdpdC9naXQuZ2l0O2E9c3VtbWFyeQorIC0gcmFuZG9tIHRocmVlLWxldHRlciBjb21iaW5hdGlvbiB0aGF0IGlzIHByb25vdW5jZWFibGUsIGFuZCBub3QKKyAgIGFjdHVhbGx5IHVzZWQgYnkgYW55IGNvbW1vbiBVTklYIGNvbW1hbmQuICBUaGUgZmFjdCB0aGF0IGl0IGlzIGEKKyAgIG1pc3Byb251bmNpYXRpb24gb2YgImdldCIgbWF5IG9yIG1heSBub3QgYmUgcmVsZXZhbnQuCisgLSBzdHVwaWQuIGNvbnRlbXB0aWJsZSBhbmQgZGVzcGljYWJsZS4gc2ltcGxlLiBUYWtlIHlvdXIgcGljayBmcm9tIHRoZQorICAgZGljdGlvbmFyeSBvZiBzbGFuZy4KKyAtICJnbG9iYWwgaW5mb3JtYXRpb24gdHJhY2tlciI6IHlvdSdyZSBpbiBhIGdvb2QgbW9vZCwgYW5kIGl0IGFjdHVhbGx5CisgICB3b3JrcyBmb3IgeW91LiBBbmdlbHMgc2luZywgYW5kIGEgbGlnaHQgc3VkZGVubHkgZmlsbHMgdGhlIHJvb20uIAorIC0gImdvZGRhbW4gaWRpb3RpYyB0cnVja2xvYWQgb2Ygc2gqdCI6IHdoZW4gaXQgYnJlYWtzCiAKLVRoZSBnaXR3ZWIgcmVwb3NpdG9yeSBpcyBoZXJlOgotICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZ2l0Lz9wPWdpdC9naXR3ZWIuZ2l0O2E9c3VtbWFyeQorVGhpcyBpcyBhIHN0dXBpZCAoYnV0IGV4dHJlbWVseSBmYXN0KSBkaXJlY3RvcnkgY29udGVudCBtYW5hZ2VyLiAgSXQKK2RvZXNuJ3QgZG8gYSB3aG9sZSBsb3QsIGJ1dCB3aGF0IGl0ICdkb2VzJyBkbyBpcyB0cmFjayBkaXJlY3RvcnkKK2NvbnRlbnRzIGVmZmljaWVudGx5LiAKIAotQW55IGNvbW1lbnQvcXVlc3Rpb24vY29uY2VybiB0bzoKLSAgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorVGhlcmUgYXJlIHR3byBvYmplY3QgYWJzdHJhY3Rpb25zOiB0aGUgIm9iamVjdCBkYXRhYmFzZSIsIGFuZCB0aGUKKyJjdXJyZW50IGRpcmVjdG9yeSBjYWNoZSIgYWthICJpbmRleCIuCisKK1RoZSBPYmplY3QgRGF0YWJhc2UKK35+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZSBvYmplY3QgZGF0YWJhc2UgaXMgbGl0ZXJhbGx5IGp1c3QgYSBjb250ZW50LWFkZHJlc3NhYmxlIGNvbGxlY3Rpb24KK29mIG9iamVjdHMuICBBbGwgb2JqZWN0cyBhcmUgbmFtZWQgYnkgdGhlaXIgY29udGVudCwgd2hpY2ggaXMKK2FwcHJveGltYXRlZCBieSB0aGUgU0hBMSBoYXNoIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAgT2JqZWN0cyBtYXkgcmVmZXIKK3RvIG90aGVyIG9iamVjdHMgKGJ5IHJlZmVyZW5jaW5nIHRoZWlyIFNIQTEgaGFzaCksIGFuZCBzbyB5b3UgY2FuCitidWlsZCB1cCBhIGhpZXJhcmNoeSBvZiBvYmplY3RzLgorCitBbGwgb2JqZWN0cyBoYXZlIGEgc3RhdGljYWxseSBkZXRlcm1pbmVkICJ0eXBlIiBha2EgInRhZyIsIHdoaWNoIGlzCitkZXRlcm1pbmVkIGF0IG9iamVjdCBjcmVhdGlvbiB0aW1lLCBhbmQgd2hpY2ggaWRlbnRpZmllcyB0aGUgZm9ybWF0IG9mCit0aGUgb2JqZWN0IChpLmUuIGhvdyBpdCBpcyB1c2VkLCBhbmQgaG93IGl0IGNhbiByZWZlciB0byBvdGhlcgorb2JqZWN0cykuICBUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgZGlmZmVyZW50IG9iamVjdCB0eXBlczogImJsb2IiLAorInRyZWUiLCAiY29tbWl0IiBhbmQgInRhZyIuCisKK0EgImJsb2IiIG9iamVjdCBjYW5ub3QgcmVmZXIgdG8gYW55IG90aGVyIG9iamVjdCwgYW5kIGlzLCBsaWtlIHRoZSB0eXBlCitpbXBsaWVzLCBhIHB1cmUgc3RvcmFnZSBvYmplY3QgY29udGFpbmluZyBzb21lIHVzZXIgZGF0YS4gIEl0IGlzIHVzZWQgdG8KK2FjdHVhbGx5IHN0b3JlIHRoZSBmaWxlIGRhdGEsIGkuZS4gYSBibG9iIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggc29tZQorcGFydGljdWxhciB2ZXJzaW9uIG9mIHNvbWUgZmlsZS4gCisKK0EgInRyZWUiIG9iamVjdCBpcyBhbiBvYmplY3QgdGhhdCB0aWVzIG9uZSBvciBtb3JlICJibG9iIiBvYmplY3RzIGludG8gYQorZGlyZWN0b3J5IHN0cnVjdHVyZS4gSW4gYWRkaXRpb24sIGEgdHJlZSBvYmplY3QgY2FuIHJlZmVyIHRvIG90aGVyIHRyZWUKK29iamVjdHMsIHRodXMgY3JlYXRpbmcgYSBkaXJlY3RvcnkgaGllcmFyY2h5LiAKKworQSAiY29tbWl0IiBvYmplY3QgdGllcyBzdWNoIGRpcmVjdG9yeSBoaWVyYXJjaGllcyB0b2dldGhlciBpbnRvCithIERBRyBvZiByZXZpc2lvbnMgLSBlYWNoICJjb21taXQiIGlzIGFzc29jaWF0ZWQgd2l0aCBleGFjdGx5IG9uZSB0cmVlCisodGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkgYXQgdGhlIHRpbWUgb2YgdGhlIGNvbW1pdCkuIEluIGFkZGl0aW9uLCBhCisiY29tbWl0IiByZWZlcnMgdG8gb25lIG9yIG1vcmUgInBhcmVudCIgY29tbWl0IG9iamVjdHMgdGhhdCBkZXNjcmliZSB0aGUKK2hpc3Rvcnkgb2YgaG93IHdlIGFycml2ZWQgYXQgdGhhdCBkaXJlY3RvcnkgaGllcmFyY2h5LgorCitBcyBhIHNwZWNpYWwgY2FzZSwgYSBjb21taXQgb2JqZWN0IHdpdGggbm8gcGFyZW50cyBpcyBjYWxsZWQgdGhlICJyb290Igorb2JqZWN0LCBhbmQgaXMgdGhlIHBvaW50IG9mIGFuIGluaXRpYWwgcHJvamVjdCBjb21taXQuICBFYWNoIHByb2plY3QKK211c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcm9vdCwgYW5kIHdoaWxlIHlvdSBjYW4gdGllIHNldmVyYWwgZGlmZmVyZW50Cityb290IG9iamVjdHMgdG9nZXRoZXIgaW50byBvbmUgcHJvamVjdCBieSBjcmVhdGluZyBhIGNvbW1pdCBvYmplY3Qgd2hpY2gKK2hhcyB0d28gb3IgbW9yZSBzZXBhcmF0ZSByb290cyBhcyBpdHMgdWx0aW1hdGUgcGFyZW50cywgdGhhdCdzIHByb2JhYmx5CitqdXN0IGdvaW5nIHRvIGNvbmZ1c2UgcGVvcGxlLiAgU28gYWltIGZvciB0aGUgbm90aW9uIG9mICJvbmUgcm9vdCBvYmplY3QKK3BlciBwcm9qZWN0IiwgZXZlbiBpZiBnaXQgaXRzZWxmIGRvZXMgbm90IGVuZm9yY2UgdGhhdC4gCisKK0EgInRhZyIgb2JqZWN0IHN5bWJvbGljYWxseSBpZGVudGlmaWVzIGFuZCBjYW4gYmUgdXNlZCB0byBzaWduIG90aGVyCitvYmplY3RzLiBJdCBjb250YWlucyB0aGUgaWRlbnRpZmllciBhbmQgdHlwZSBvZiBhbm90aGVyIG9iamVjdCwgYQorc3ltYm9saWMgbmFtZSAob2YgY291cnNlISkgYW5kLCBvcHRpb25hbGx5LCBhIHNpZ25hdHVyZS4KKworUmVnYXJkbGVzcyBvZiBvYmplY3QgdHlwZSwgYWxsIG9iamVjdHMgc2hhcmUgdGhlIGZvbGxvd2luZworY2hhcmFjdGVyaXN0aWNzOiB0aGV5IGFyZSBhbGwgZGVmbGF0ZWQgd2l0aCB6bGliLCBhbmQgaGF2ZSBhIGhlYWRlcgordGhhdCBub3Qgb25seSBzcGVjaWZpZXMgdGhlaXIgdHlwZSwgYnV0IGFsc28gcHJvdmlkZXMgc2l6ZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIGRhdGEgaW4gdGhlIG9iamVjdC4gIEl0J3Mgd29ydGggbm90aW5nIHRoYXQgdGhlIFNIQTEgaGFzaAordGhhdCBpcyB1c2VkIHRvIG5hbWUgdGhlIG9iamVjdCBpcyB0aGUgaGFzaCBvZiB0aGUgb3JpZ2luYWwgZGF0YQorcGx1cyB0aGlzIGhlYWRlciwgc28gYHNoYTFzdW1gICdmaWxlJyBkb2VzIG5vdCBtYXRjaCB0aGUgb2JqZWN0IG5hbWUKK2ZvciAnZmlsZScuCisoSGlzdG9yaWNhbCBub3RlOiBpbiB0aGUgZGF3biBvZiB0aGUgYWdlIG9mIGdpdCB0aGUgaGFzaAord2FzIHRoZSBzaGExIG9mIHRoZSAnY29tcHJlc3NlZCcgb2JqZWN0LikKKworQXMgYSByZXN1bHQsIHRoZSBnZW5lcmFsIGNvbnNpc3RlbmN5IG9mIGFuIG9iamVjdCBjYW4gYWx3YXlzIGJlIHRlc3RlZAoraW5kZXBlbmRlbnRseSBvZiB0aGUgY29udGVudHMgb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdDogYWxsIG9iamVjdHMgY2FuCitiZSB2YWxpZGF0ZWQgYnkgdmVyaWZ5aW5nIHRoYXQgKGEpIHRoZWlyIGhhc2hlcyBtYXRjaCB0aGUgY29udGVudCBvZiB0aGUKK2ZpbGUgYW5kIChiKSB0aGUgb2JqZWN0IHN1Y2Nlc3NmdWxseSBpbmZsYXRlcyB0byBhIHN0cmVhbSBvZiBieXRlcyB0aGF0Citmb3JtcyBhIHNlcXVlbmNlIG9mIDxhc2NpaSB0eXBlIHdpdGhvdXQgc3BhY2U+ICsgPHNwYWNlPiArIDxhc2NpaSBkZWNpbWFsCitzaXplPiArIDxieXRlXDA+ICsgPGJpbmFyeSBvYmplY3QgZGF0YT4uIAorCitUaGUgc3RydWN0dXJlZCBvYmplY3RzIGNhbiBmdXJ0aGVyIGhhdmUgdGhlaXIgc3RydWN0dXJlIGFuZAorY29ubmVjdGl2aXR5IHRvIG90aGVyIG9iamVjdHMgdmVyaWZpZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IGRvbmUgd2l0aAordGhlIGBnaXQtZnNjay1vYmplY3RzYCBwcm9ncmFtLCB3aGljaCBnZW5lcmF0ZXMgYSBmdWxsIGRlcGVuZGVuY3kgZ3JhcGgKK29mIGFsbCBvYmplY3RzLCBhbmQgdmVyaWZpZXMgdGhlaXIgaW50ZXJuYWwgY29uc2lzdGVuY3kgKGluIGFkZGl0aW9uCit0byBqdXN0IHZlcmlmeWluZyB0aGVpciBzdXBlcmZpY2lhbCBjb25zaXN0ZW5jeSB0aHJvdWdoIHRoZSBoYXNoKS4KKworVGhlIG9iamVjdCB0eXBlcyBpbiBzb21lIG1vcmUgZGV0YWlsOgorCitCbG9iIE9iamVjdAorfn5+fn5+fn5+fn4KK0EgImJsb2IiIG9iamVjdCBpcyBub3RoaW5nIGJ1dCBhIGJpbmFyeSBibG9iIG9mIGRhdGEsIGFuZCBkb2Vzbid0CityZWZlciB0byBhbnl0aGluZyBlbHNlLiAgVGhlcmUgaXMgbm8gc2lnbmF0dXJlIG9yIGFueSBvdGhlcgordmVyaWZpY2F0aW9uIG9mIHRoZSBkYXRhLCBzbyB3aGlsZSB0aGUgb2JqZWN0IGlzIGNvbnNpc3RlbnQgKGl0ICdpcycKK2luZGV4ZWQgYnkgaXRzIHNoYTEgaGFzaCwgc28gdGhlIGRhdGEgaXRzZWxmIGlzIGNlcnRhaW5seSBjb3JyZWN0KSwgaXQKK2hhcyBhYnNvbHV0ZWx5IG5vIG90aGVyIGF0dHJpYnV0ZXMuICBObyBuYW1lIGFzc29jaWF0aW9ucywgbm8KK3Blcm1pc3Npb25zLiAgSXQgaXMgcHVyZWx5IGEgYmxvYiBvZiBkYXRhIChpLmUuIG5vcm1hbGx5ICJmaWxlCitjb250ZW50cyIpLgorCitJbiBwYXJ0aWN1bGFyLCBzaW5jZSB0aGUgYmxvYiBpcyBlbnRpcmVseSBkZWZpbmVkIGJ5IGl0cyBkYXRhLCBpZiB0d28KK2ZpbGVzIGluIGEgZGlyZWN0b3J5IHRyZWUgKG9yIGluIG11bHRpcGxlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKK3JlcG9zaXRvcnkpIGhhdmUgdGhlIHNhbWUgY29udGVudHMsIHRoZXkgd2lsbCBzaGFyZSB0aGUgc2FtZSBibG9iCitvYmplY3QuIFRoZSBvYmplY3QgaXMgdG90YWxseSBpbmRlcGVuZGVudCBvZiBpdHMgbG9jYXRpb24gaW4gdGhlCitkaXJlY3RvcnkgdHJlZSwgYW5kIHJlbmFtaW5nIGEgZmlsZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG9iamVjdCB0aGF0CitmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBpbiBhbnkgd2F5LgorCitBIGJsb2IgaXMgdHlwaWNhbGx5IGNyZWF0ZWQgd2hlbiBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0KK2lzIHJ1biwgYW5kIGl0cyBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBieSBnaXRsaW5rOmdpdC1jYXQtZmlsZVsxXS4KKworVHJlZSBPYmplY3QKK35+fn5+fn5+fn5+CitUaGUgbmV4dCBoaWVyYXJjaGljYWwgb2JqZWN0IHR5cGUgaXMgdGhlICJ0cmVlIiBvYmplY3QuICBBIHRyZWUgb2JqZWN0CitpcyBhIGxpc3Qgb2YgbW9kZS9uYW1lL2Jsb2IgZGF0YSwgc29ydGVkIGJ5IG5hbWUuICBBbHRlcm5hdGl2ZWx5LCB0aGUKK21vZGUgZGF0YSBtYXkgc3BlY2lmeSBhIGRpcmVjdG9yeSBtb2RlLCBpbiB3aGljaCBjYXNlIGluc3RlYWQgb2YKK25hbWluZyBhIGJsb2IsIHRoYXQgbmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBUUkVFIG9iamVjdC4KKworTGlrZSB0aGUgImJsb2IiIG9iamVjdCwgYSB0cmVlIG9iamVjdCBpcyB1bmlxdWVseSBkZXRlcm1pbmVkIGJ5IHRoZQorc2V0IGNvbnRlbnRzLCBhbmQgc28gdHdvIHNlcGFyYXRlIGJ1dCBpZGVudGljYWwgdHJlZXMgd2lsbCBhbHdheXMKK3NoYXJlIHRoZSBleGFjdCBzYW1lIG9iamVjdC4gVGhpcyBpcyB0cnVlIGF0IGFsbCBsZXZlbHMsIGkuZS4gaXQncwordHJ1ZSBmb3IgYSAibGVhZiIgdHJlZSAod2hpY2ggZG9lcyBub3QgcmVmZXIgdG8gYW55IG90aGVyIHRyZWVzLCBvbmx5CitibG9icykgYXMgd2VsbCBhcyBmb3IgYSB3aG9sZSBzdWJkaXJlY3RvcnkuCisKK0ZvciB0aGF0IHJlYXNvbiBhICJ0cmVlIiBvYmplY3QgaXMganVzdCBhIHB1cmUgZGF0YSBhYnN0cmFjdGlvbjogaXQKK2hhcyBubyBoaXN0b3J5LCBubyBzaWduYXR1cmVzLCBubyB2ZXJpZmljYXRpb24gb2YgdmFsaWRpdHksIGV4Y2VwdAordGhhdCBzaW5jZSB0aGUgY29udGVudHMgYXJlIGFnYWluIHByb3RlY3RlZCBieSB0aGUgaGFzaCBpdHNlbGYsIHdlIGNhbgordHJ1c3QgdGhhdCB0aGUgdHJlZSBpcyBpbW11dGFibGUgYW5kIGl0cyBjb250ZW50cyBuZXZlciBjaGFuZ2UuCisKK1NvIHlvdSBjYW4gdHJ1c3QgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSB0byBiZSB2YWxpZCwgdGhlIHNhbWUgd2F5IHlvdQorY2FuIHRydXN0IHRoZSBjb250ZW50cyBvZiBhIGJsb2IsIGJ1dCB5b3UgZG9uJ3Qga25vdyB3aGVyZSB0aG9zZQorY29udGVudHMgJ2NhbWUnIGZyb20uCisKK1NpZGUgbm90ZSBvbiB0cmVlczogc2luY2UgYSAidHJlZSIgb2JqZWN0IGlzIGEgc29ydGVkIGxpc3Qgb2YKKyJmaWxlbmFtZStjb250ZW50IiwgeW91IGNhbiBjcmVhdGUgYSBkaWZmIGJldHdlZW4gdHdvIHRyZWVzIHdpdGhvdXQKK2FjdHVhbGx5IGhhdmluZyB0byB1bnBhY2sgdHdvIHRyZWVzLiAgSnVzdCBpZ25vcmUgYWxsIGNvbW1vbiBwYXJ0cywKK2FuZCB5b3VyIGRpZmYgd2lsbCBsb29rIHJpZ2h0LiAgSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gZWZmZWN0aXZlbHkKKyhhbmQgZWZmaWNpZW50bHkpIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbnkgdHdvIHJhbmRvbSB0cmVlcyBieQorTyhuKSB3aGVyZSAibiIgaXMgdGhlIHNpemUgb2YgdGhlIGRpZmZlcmVuY2UsIHJhdGhlciB0aGFuIHRoZSBzaXplIG9mCit0aGUgdHJlZS4KKworU2lkZSBub3RlIDIgb24gdHJlZXM6IHNpbmNlIHRoZSBuYW1lIG9mIGEgImJsb2IiIGRlcGVuZHMgZW50aXJlbHkgYW5kCitleGNsdXNpdmVseSBvbiBpdHMgY29udGVudHMgKGkuZS4gdGhlcmUgYXJlIG5vIG5hbWVzIG9yIHBlcm1pc3Npb25zCitpbnZvbHZlZCksIHlvdSBjYW4gc2VlIHRyaXZpYWwgcmVuYW1lcyBvciBwZXJtaXNzaW9uIGNoYW5nZXMgYnkKK25vdGljaW5nIHRoYXQgdGhlIGJsb2Igc3RheWVkIHRoZSBzYW1lLiAgSG93ZXZlciwgcmVuYW1lcyB3aXRoIGRhdGEKK2NoYW5nZXMgbmVlZCBhIHNtYXJ0ZXIgImRpZmYiIGltcGxlbWVudGF0aW9uLgorCitBIHRyZWUgaXMgY3JlYXRlZCB3aXRoIGdpdGxpbms6Z2l0LXdyaXRlLXRyZWVbMV0gYW5kCitpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtbHMtdHJlZVsxXS4KK1R3byB0cmVlcyBjYW4gYmUgY29tcGFyZWQgd2l0aCBnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0uCisKK0NvbW1pdCBPYmplY3QKK35+fn5+fn5+fn5+fn4KK1RoZSAiY29tbWl0IiBvYmplY3QgaXMgYW4gb2JqZWN0IHRoYXQgaW50cm9kdWNlcyB0aGUgbm90aW9uIG9mCitoaXN0b3J5IGludG8gdGhlIHBpY3R1cmUuICBJbiBjb250cmFzdCB0byB0aGUgb3RoZXIgb2JqZWN0cywgaXQKK2RvZXNuJ3QganVzdCBkZXNjcmliZSB0aGUgcGh5c2ljYWwgc3RhdGUgb2YgYSB0cmVlLCBpdCBkZXNjcmliZXMgaG93Cit3ZSBnb3QgdGhlcmUsIGFuZCB3aHkuCisKK0EgImNvbW1pdCIgaXMgZGVmaW5lZCBieSB0aGUgdHJlZS1vYmplY3QgdGhhdCBpdCByZXN1bHRzIGluLCB0aGUKK3BhcmVudCBjb21taXRzICh6ZXJvLCBvbmUgb3IgbW9yZSkgdGhhdCBsZWQgdXAgdG8gdGhhdCBwb2ludCwgYW5kIGEKK2NvbW1lbnQgb24gd2hhdCBoYXBwZW5lZC4gIEFnYWluLCBhIGNvbW1pdCBpcyBub3QgdHJ1c3RlZCBwZXIgc2U6Cit0aGUgY29udGVudHMgYXJlIHdlbGwtZGVmaW5lZCBhbmQgInNhZmUiIGR1ZSB0byB0aGUgY3J5cHRvZ3JhcGhpY2FsbHkKK3N0cm9uZyBzaWduYXR1cmVzIGF0IGFsbCBsZXZlbHMsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gdG8gYmVsaWV2ZQordGhhdCB0aGUgdHJlZSBpcyAiZ29vZCIgb3IgdGhhdCB0aGUgbWVyZ2UgaW5mb3JtYXRpb24gbWFrZXMgc2Vuc2UuCitUaGUgcGFyZW50cyBkbyBub3QgaGF2ZSB0byBhY3R1YWxseSBoYXZlIGFueSByZWxhdGlvbnNoaXAgd2l0aCB0aGUKK3Jlc3VsdCwgZm9yIGV4YW1wbGUuCisKK05vdGUgb24gY29tbWl0czogdW5saWtlIHJlYWwgU0NNJ3MsIGNvbW1pdHMgZG8gbm90IGNvbnRhaW4KK3JlbmFtZSBpbmZvcm1hdGlvbiBvciBmaWxlIG1vZGUgY2hhbmdlIGluZm9ybWF0aW9uLiAgQWxsIG9mIHRoYXQgaXMKK2ltcGxpY2l0IGluIHRoZSB0cmVlcyBpbnZvbHZlZCAodGhlIHJlc3VsdCB0cmVlLCBhbmQgdGhlIHJlc3VsdCB0cmVlcworb2YgdGhlIHBhcmVudHMpLCBhbmQgZGVzY3JpYmluZyB0aGF0IG1ha2VzIG5vIHNlbnNlIGluIHRoaXMgaWRpb3RpYworZmlsZSBtYW5hZ2VyLgorCitBIGNvbW1pdCBpcyBjcmVhdGVkIHdpdGggZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV0gYW5kCitpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0uCisKK1RydXN0Cit+fn5+fgorQW4gYXNpZGUgb24gdGhlIG5vdGlvbiBvZiAidHJ1c3QiLiBUcnVzdCBpcyByZWFsbHkgb3V0c2lkZSB0aGUgc2NvcGUKK29mICJnaXQiLCBidXQgaXQncyB3b3J0aCBub3RpbmcgYSBmZXcgdGhpbmdzLiAgRmlyc3Qgb2ZmLCBzaW5jZQorZXZlcnl0aGluZyBpcyBoYXNoZWQgd2l0aCBTSEExLCB5b3UgJ2NhbicgdHJ1c3QgdGhhdCBhbiBvYmplY3QgaXMKK2ludGFjdCBhbmQgaGFzIG5vdCBiZWVuIG1lc3NlZCB3aXRoIGJ5IGV4dGVybmFsIHNvdXJjZXMuICBTbyB0aGUgbmFtZQorb2YgYW4gb2JqZWN0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBrbm93biBzdGF0ZSAtIGp1c3Qgbm90IGEgc3RhdGUgdGhhdAoreW91IG1heSB3YW50IHRvIHRydXN0LgorCitGdXJ0aGVybW9yZSwgc2luY2UgdGhlIFNIQTEgc2lnbmF0dXJlIG9mIGEgY29tbWl0IHJlZmVycyB0byB0aGUKK1NIQTEgc2lnbmF0dXJlcyBvZiB0aGUgdHJlZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGggYW5kIHRoZSBzaWduYXR1cmVzCitvZiB0aGUgcGFyZW50LCBhIHNpbmdsZSBuYW1lZCBjb21taXQgc3BlY2lmaWVzIHVuaXF1ZWx5IGEgd2hvbGUgc2V0CitvZiBoaXN0b3J5LCB3aXRoIGZ1bGwgY29udGVudHMuICBZb3UgY2FuJ3QgbGF0ZXIgZmFrZSBhbnkgc3RlcCBvZiB0aGUKK3dheSBvbmNlIHlvdSBoYXZlIHRoZSBuYW1lIG9mIGEgY29tbWl0LgorCitTbyB0byBpbnRyb2R1Y2Ugc29tZSByZWFsIHRydXN0IGluIHRoZSBzeXN0ZW0sIHRoZSBvbmx5IHRoaW5nIHlvdSBuZWVkCit0byBkbyBpcyB0byBkaWdpdGFsbHkgc2lnbiBqdXN0ICdvbmUnIHNwZWNpYWwgbm90ZSwgd2hpY2ggaW5jbHVkZXMgdGhlCituYW1lIG9mIGEgdG9wLWxldmVsIGNvbW1pdC4gIFlvdXIgZGlnaXRhbCBzaWduYXR1cmUgc2hvd3Mgb3RoZXJzCit0aGF0IHlvdSB0cnVzdCB0aGF0IGNvbW1pdCwgYW5kIHRoZSBpbW11dGFiaWxpdHkgb2YgdGhlIGhpc3Rvcnkgb2YKK2NvbW1pdHMgdGVsbHMgb3RoZXJzIHRoYXQgdGhleSBjYW4gdHJ1c3QgdGhlIHdob2xlIGhpc3RvcnkuCisKK0luIG90aGVyIHdvcmRzLCB5b3UgY2FuIGVhc2lseSB2YWxpZGF0ZSBhIHdob2xlIGFyY2hpdmUgYnkganVzdAorc2VuZGluZyBvdXQgYSBzaW5nbGUgZW1haWwgdGhhdCB0ZWxscyB0aGUgcGVvcGxlIHRoZSBuYW1lIChTSEExIGhhc2gpCitvZiB0aGUgdG9wIGNvbW1pdCwgYW5kIGRpZ2l0YWxseSBzaWduIHRoYXQgZW1haWwgdXNpbmcgc29tZXRoaW5nCitsaWtlIEdQRy9QR1AuCisKK1RvIGFzc2lzdCBpbiB0aGlzLCBnaXQgYWxzbyBwcm92aWRlcyB0aGUgdGFnIG9iamVjdC4uLgorCitUYWcgT2JqZWN0Cit+fn5+fn5+fn5+CitHaXQgcHJvdmlkZXMgdGhlICJ0YWciIG9iamVjdCB0byBzaW1wbGlmeSBjcmVhdGluZywgbWFuYWdpbmcgYW5kCitleGNoYW5naW5nIHN5bWJvbGljIGFuZCBzaWduZWQgdG9rZW5zLiAgVGhlICJ0YWciIG9iamVjdCBhdCBpdHMKK3NpbXBsZXN0IHNpbXBseSBzeW1ib2xpY2FsbHkgaWRlbnRpZmllcyBhbm90aGVyIG9iamVjdCBieSBjb250YWluaW5nCit0aGUgc2hhMSwgdHlwZSBhbmQgc3ltYm9saWMgbmFtZS4KKworSG93ZXZlciBpdCBjYW4gb3B0aW9uYWxseSBjb250YWluIGFkZGl0aW9uYWwgc2lnbmF0dXJlIGluZm9ybWF0aW9uCisod2hpY2ggZ2l0IGRvZXNuJ3QgY2FyZSBhYm91dCBhcyBsb25nIGFzIHRoZXJlJ3MgbGVzcyB0aGFuIDhrIG9mCitpdCkuIFRoaXMgY2FuIHRoZW4gYmUgdmVyaWZpZWQgZXh0ZXJuYWxseSB0byBnaXQuCisKK05vdGUgdGhhdCBkZXNwaXRlIHRoZSB0YWcgZmVhdHVyZXMsICJnaXQiIGl0c2VsZiBvbmx5IGhhbmRsZXMgY29udGVudAoraW50ZWdyaXR5OyB0aGUgdHJ1c3QgZnJhbWV3b3JrIChhbmQgc2lnbmF0dXJlIHByb3Zpc2lvbiBhbmQKK3ZlcmlmaWNhdGlvbikgaGFzIHRvIGNvbWUgZnJvbSBvdXRzaWRlLgorCitBIHRhZyBpcyBjcmVhdGVkIHdpdGggZ2l0bGluazpnaXQtbWt0YWdbMV0sCitpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0sCithbmQgdGhlIHNpZ25hdHVyZSBjYW4gYmUgdmVyaWZpZWQgYnkKK2dpdGxpbms6Z2l0LXZlcmlmeS10YWdbMV0uCisKKworVGhlICJpbmRleCIgYWthICJDdXJyZW50IERpcmVjdG9yeSBDYWNoZSIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgaW5kZXggaXMgYSBzaW1wbGUgYmluYXJ5IGZpbGUsIHdoaWNoIGNvbnRhaW5zIGFuIGVmZmljaWVudAorcmVwcmVzZW50YXRpb24gb2YgYSB2aXJ0dWFsIGRpcmVjdG9yeSBjb250ZW50IGF0IHNvbWUgcmFuZG9tIHRpbWUuICBJdAorZG9lcyBzbyBieSBhIHNpbXBsZSBhcnJheSB0aGF0IGFzc29jaWF0ZXMgYSBzZXQgb2YgbmFtZXMsIGRhdGVzLAorcGVybWlzc2lvbnMgYW5kIGNvbnRlbnQgKGFrYSAiYmxvYiIpIG9iamVjdHMgdG9nZXRoZXIuICBUaGUgY2FjaGUgaXMKK2Fsd2F5cyBrZXB0IG9yZGVyZWQgYnkgbmFtZSwgYW5kIG5hbWVzIGFyZSB1bmlxdWUgKHdpdGggYSBmZXcgdmVyeQorc3BlY2lmaWMgcnVsZXMpIGF0IGFueSBwb2ludCBpbiB0aW1lLCBidXQgdGhlIGNhY2hlIGhhcyBubyBsb25nLXRlcm0KK21lYW5pbmcsIGFuZCBjYW4gYmUgcGFydGlhbGx5IHVwZGF0ZWQgYXQgYW55IHRpbWUuCisKK0luIHBhcnRpY3VsYXIsIHRoZSBpbmRleCBjZXJ0YWlubHkgZG9lcyBub3QgbmVlZCB0byBiZSBjb25zaXN0ZW50IHdpdGgKK3RoZSBjdXJyZW50IGRpcmVjdG9yeSBjb250ZW50cyAoaW4gZmFjdCwgbW9zdCBvcGVyYXRpb25zIHdpbGwgZGVwZW5kIG9uCitkaWZmZXJlbnQgd2F5cyB0byBtYWtlIHRoZSBpbmRleCAnbm90JyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGRpcmVjdG9yeQoraGllcmFyY2h5KSwgYnV0IGl0IGhhcyB0aHJlZSB2ZXJ5IGltcG9ydGFudCBhdHRyaWJ1dGVzOgorCisnKGEpIGl0IGNhbiByZS1nZW5lcmF0ZSB0aGUgZnVsbCBzdGF0ZSBpdCBjYWNoZXMgKG5vdCBqdXN0IHRoZQorZGlyZWN0b3J5IHN0cnVjdHVyZTogaXQgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlICJibG9iIiBvYmplY3RzIHNvCit0aGF0IGl0IGNhbiByZWdlbmVyYXRlIHRoZSBkYXRhIHRvbyknCisKK0FzIGEgc3BlY2lhbCBjYXNlLCB0aGVyZSBpcyBhIGNsZWFyIGFuZCB1bmFtYmlndW91cyBvbmUtd2F5IG1hcHBpbmcKK2Zyb20gYSBjdXJyZW50IGRpcmVjdG9yeSBjYWNoZSB0byBhICJ0cmVlIG9iamVjdCIsIHdoaWNoIGNhbiBiZQorZWZmaWNpZW50bHkgY3JlYXRlZCBmcm9tIGp1c3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNhY2hlIHdpdGhvdXQKK2FjdHVhbGx5IGxvb2tpbmcgYXQgYW55IG90aGVyIGRhdGEuICBTbyBhIGRpcmVjdG9yeSBjYWNoZSBhdCBhbnkgb25lCit0aW1lIHVuaXF1ZWx5IHNwZWNpZmllcyBvbmUgYW5kIG9ubHkgb25lICJ0cmVlIiBvYmplY3QgKGJ1dCBoYXMKK2FkZGl0aW9uYWwgZGF0YSB0byBtYWtlIGl0IGVhc3kgdG8gbWF0Y2ggdXAgdGhhdCB0cmVlIG9iamVjdCB3aXRoIHdoYXQKK2hhcyBoYXBwZW5lZCBpbiB0aGUgZGlyZWN0b3J5KQorCisnKGIpIGl0IGhhcyBlZmZpY2llbnQgbWV0aG9kcyBmb3IgZmluZGluZyBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGF0CitjYWNoZWQgc3RhdGUgKCJ0cmVlIG9iamVjdCB3YWl0aW5nIHRvIGJlIGluc3RhbnRpYXRlZCIpIGFuZCB0aGUKK2N1cnJlbnQgc3RhdGUuJworCisnKGMpIGl0IGNhbiBhZGRpdGlvbmFsbHkgZWZmaWNpZW50bHkgcmVwcmVzZW50IGluZm9ybWF0aW9uIGFib3V0IG1lcmdlCitjb25mbGljdHMgYmV0d2VlbiBkaWZmZXJlbnQgdHJlZSBvYmplY3RzLCBhbGxvd2luZyBlYWNoIHBhdGhuYW1lIHRvIGJlCithc3NvY2lhdGVkIHdpdGggc3VmZmljaWVudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJlZXMgaW52b2x2ZWQgdGhhdAoreW91IGNhbiBjcmVhdGUgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGVtLicKKworVGhvc2UgYXJlIHRoZSB0aHJlZSBPTkxZIHRoaW5ncyB0aGF0IHRoZSBkaXJlY3RvcnkgY2FjaGUgZG9lcy4gIEl0J3MgYQorY2FjaGUsIGFuZCB0aGUgbm9ybWFsIG9wZXJhdGlvbiBpcyB0byByZS1nZW5lcmF0ZSBpdCBjb21wbGV0ZWx5IGZyb20gYQora25vd24gdHJlZSBvYmplY3QsIG9yIHVwZGF0ZS9jb21wYXJlIGl0IHdpdGggYSBsaXZlIHRyZWUgdGhhdCBpcyBiZWluZworZGV2ZWxvcGVkLiAgSWYgeW91IGJsb3cgdGhlIGRpcmVjdG9yeSBjYWNoZSBhd2F5IGVudGlyZWx5LCB5b3UgZ2VuZXJhbGx5CitoYXZlbid0IGxvc3QgYW55IGluZm9ybWF0aW9uIGFzIGxvbmcgYXMgeW91IGhhdmUgdGhlIG5hbWUgb2YgdGhlIHRyZWUKK3RoYXQgaXQgZGVzY3JpYmVkLiAKKworQXQgdGhlIHNhbWUgdGltZSwgdGhlIGluZGV4IGlzIGF0IHRoZSBzYW1lIHRpbWUgYWxzbyB0aGUKK3N0YWdpbmcgYXJlYSBmb3IgY3JlYXRpbmcgbmV3IHRyZWVzLCBhbmQgY3JlYXRpbmcgYSBuZXcgdHJlZSBhbHdheXMKK2ludm9sdmVzIGEgY29udHJvbGxlZCBtb2RpZmljYXRpb24gb2YgdGhlIGluZGV4IGZpbGUuICBJbiBwYXJ0aWN1bGFyLAordGhlIGluZGV4IGZpbGUgY2FuIGhhdmUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVybWVkaWF0ZSB0cmVlIHRoYXQKK2hhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkLiAgU28gdGhlIGluZGV4IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEKK3dyaXRlLWJhY2sgY2FjaGUsIHdoaWNoIGNhbiBjb250YWluIGRpcnR5IGluZm9ybWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQKK2JlZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN0b3JlLgorCisKKworVGhlIFdvcmtmbG93CistLS0tLS0tLS0tLS0KK0dlbmVyYWxseSwgYWxsICJnaXQiIG9wZXJhdGlvbnMgd29yayBvbiB0aGUgaW5kZXggZmlsZS4gU29tZSBvcGVyYXRpb25zCit3b3JrICpwdXJlbHkqIG9uIHRoZSBpbmRleCBmaWxlIChzaG93aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQoraW5kZXgpLCBidXQgbW9zdCBvcGVyYXRpb25zIG1vdmUgZGF0YSB0byBhbmQgZnJvbSB0aGUgaW5kZXggZmlsZS4gRWl0aGVyCitmcm9tIHRoZSBkYXRhYmFzZSBvciBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gVGh1cyB0aGVyZSBhcmUgZm91cgorbWFpbiBjb21iaW5hdGlvbnM6IAorCisxKSB3b3JraW5nIGRpcmVjdG9yeSAtPiBpbmRleAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHVwZGF0ZSB0aGUgaW5kZXggd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aXRoCit0aGUgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdIGNvbW1hbmQuICBZb3UKK2dlbmVyYWxseSB1cGRhdGUgdGhlIGluZGV4IGluZm9ybWF0aW9uIGJ5IGp1c3Qgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUKK3lvdSB3YW50IHRvIHVwZGF0ZSwgbGlrZSBzbzoKKworCWdpdC11cGRhdGUtaW5kZXggZmlsZW5hbWUKKworYnV0IHRvIGF2b2lkIGNvbW1vbiBtaXN0YWtlcyB3aXRoIGZpbGVuYW1lIGdsb2JiaW5nIGV0YywgdGhlIGNvbW1hbmQKK3dpbGwgbm90IG5vcm1hbGx5IGFkZCB0b3RhbGx5IG5ldyBlbnRyaWVzIG9yIHJlbW92ZSBvbGQgZW50cmllcywKK2kuZS4gaXQgd2lsbCBub3JtYWxseSBqdXN0IHVwZGF0ZSBleGlzdGluZyBjYWNoZSBlbnRyaWVzLgorCitUbyB0ZWxsIGdpdCB0aGF0IHllcywgeW91IHJlYWxseSBkbyByZWFsaXplIHRoYXQgY2VydGFpbiBmaWxlcyBubworbG9uZ2VyIGV4aXN0LCBvciB0aGF0IG5ldyBmaWxlcyBzaG91bGQgYmUgYWRkZWQsIHlvdQorc2hvdWxkIHVzZSB0aGUgYC0tcmVtb3ZlYCBhbmQgYC0tYWRkYCBmbGFncyByZXNwZWN0aXZlbHkuCisKK05PVEUhIEEgYC0tcmVtb3ZlYCBmbGFnIGRvZXMgJ25vdCcgbWVhbiB0aGF0IHN1YnNlcXVlbnQgZmlsZW5hbWVzIHdpbGwKK25lY2Vzc2FyaWx5IGJlIHJlbW92ZWQ6IGlmIHRoZSBmaWxlcyBzdGlsbCBleGlzdCBpbiB5b3VyIGRpcmVjdG9yeQorc3RydWN0dXJlLCB0aGUgaW5kZXggd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlaXIgbmV3IHN0YXR1cywgbm90CityZW1vdmVkLiBUaGUgb25seSB0aGluZyBgLS1yZW1vdmVgIG1lYW5zIGlzIHRoYXQgdXBkYXRlLWNhY2hlIHdpbGwgYmUKK2NvbnNpZGVyaW5nIGEgcmVtb3ZlZCBmaWxlIHRvIGJlIGEgdmFsaWQgdGhpbmcsIGFuZCBpZiB0aGUgZmlsZSByZWFsbHkKK2RvZXMgbm90IGV4aXN0IGFueSBtb3JlLCBpdCB3aWxsIHVwZGF0ZSB0aGUgaW5kZXggYWNjb3JkaW5nbHkuCisKK0FzIGEgc3BlY2lhbCBjYXNlLCB5b3UgY2FuIGFsc28gZG8gYGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoYCwgd2hpY2gKK3dpbGwgcmVmcmVzaCB0aGUgInN0YXQiIGluZm9ybWF0aW9uIG9mIGVhY2ggaW5kZXggdG8gbWF0Y2ggdGhlIGN1cnJlbnQKK3N0YXQgaW5mb3JtYXRpb24uIEl0IHdpbGwgJ25vdCcgdXBkYXRlIHRoZSBvYmplY3Qgc3RhdHVzIGl0c2VsZiwgYW5kCitpdCB3aWxsIG9ubHkgdXBkYXRlIHRoZSBmaWVsZHMgdGhhdCBhcmUgdXNlZCB0byBxdWlja2x5IHRlc3Qgd2hldGhlcgorYW4gb2JqZWN0IHN0aWxsIG1hdGNoZXMgaXRzIG9sZCBiYWNraW5nIHN0b3JlIG9iamVjdC4KKworMikgaW5kZXggLT4gb2JqZWN0IGRhdGFiYXNlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHdyaXRlIHlvdXIgY3VycmVudCBpbmRleCBmaWxlIHRvIGEgInRyZWUiIG9iamVjdCB3aXRoIHRoZSBwcm9ncmFtCisKKwlnaXQtd3JpdGUtdHJlZQorCit0aGF0IGRvZXNuJ3QgY29tZSB3aXRoIGFueSBvcHRpb25zIC0gaXQgd2lsbCBqdXN0IHdyaXRlIG91dCB0aGUKK2N1cnJlbnQgaW5kZXggaW50byB0aGUgc2V0IG9mIHRyZWUgb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHRoYXQgc3RhdGUsCithbmQgaXQgd2lsbCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyB0b3AtbGV2ZWwgdHJlZS4gWW91IGNhbgordXNlIHRoYXQgdHJlZSB0byByZS1nZW5lcmF0ZSB0aGUgaW5kZXggYXQgYW55IHRpbWUgYnkgZ29pbmcgaW4gdGhlCitvdGhlciBkaXJlY3Rpb246CisKKzMpIG9iamVjdCBkYXRhYmFzZSAtPiBpbmRleAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSByZWFkIGEgInRyZWUiIGZpbGUgZnJvbSB0aGUgb2JqZWN0IGRhdGFiYXNlLCBhbmQgdXNlIHRoYXQgdG8KK3BvcHVsYXRlIChhbmQgb3ZlcndyaXRlIC0gZG9uJ3QgZG8gdGhpcyBpZiB5b3VyIGluZGV4IGNvbnRhaW5zIGFueQordW5zYXZlZCBzdGF0ZSB0aGF0IHlvdSBtaWdodCB3YW50IHRvIHJlc3RvcmUgbGF0ZXIhKSB5b3VyIGN1cnJlbnQKK2luZGV4LiAgTm9ybWFsIG9wZXJhdGlvbiBpcyBqdXN0CisKKwkJZ2l0LXJlYWQtdHJlZSA8c2hhMSBvZiB0cmVlPgorCithbmQgeW91ciBpbmRleCBmaWxlIHdpbGwgbm93IGJlIGVxdWl2YWxlbnQgdG8gdGhlIHRyZWUgdGhhdCB5b3Ugc2F2ZWQKK2VhcmxpZXIuIEhvd2V2ZXIsIHRoYXQgaXMgb25seSB5b3VyICdpbmRleCcgZmlsZTogeW91ciB3b3JraW5nCitkaXJlY3RvcnkgY29udGVudHMgaGF2ZSBub3QgYmVlbiBtb2RpZmllZC4KKworNCkgaW5kZXggLT4gd29ya2luZyBkaXJlY3RvcnkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSB1cGRhdGUgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBmcm9tIHRoZSBpbmRleCBieSAiY2hlY2tpbmcgb3V0IgorZmlsZXMuIFRoaXMgaXMgbm90IGEgdmVyeSBjb21tb24gb3BlcmF0aW9uLCBzaW5jZSBub3JtYWxseSB5b3UnZCBqdXN0CitrZWVwIHlvdXIgZmlsZXMgdXBkYXRlZCwgYW5kIHJhdGhlciB0aGFuIHdyaXRlIHRvIHlvdXIgd29ya2luZworZGlyZWN0b3J5LCB5b3UnZCB0ZWxsIHRoZSBpbmRleCBmaWxlcyBhYm91dCB0aGUgY2hhbmdlcyBpbiB5b3VyCit3b3JraW5nIGRpcmVjdG9yeSAoaS5lLiBgZ2l0LXVwZGF0ZS1pbmRleGApLgorCitIb3dldmVyLCBpZiB5b3UgZGVjaWRlIHRvIGp1bXAgdG8gYSBuZXcgdmVyc2lvbiwgb3IgY2hlY2sgb3V0IHNvbWVib2R5CitlbHNlJ3MgdmVyc2lvbiwgb3IganVzdCByZXN0b3JlIGEgcHJldmlvdXMgdHJlZSwgeW91J2QgcG9wdWxhdGUgeW91cgoraW5kZXggZmlsZSB3aXRoIHJlYWQtdHJlZSwgYW5kIHRoZW4geW91IG5lZWQgdG8gY2hlY2sgb3V0IHRoZSByZXN1bHQKK3dpdGgKKworCQlnaXQtY2hlY2tvdXQtaW5kZXggZmlsZW5hbWUKKworb3IsIGlmIHlvdSB3YW50IHRvIGNoZWNrIG91dCBhbGwgb2YgdGhlIGluZGV4LCB1c2UgYC1hYC4KKworTk9URSEgZ2l0LWNoZWNrb3V0LWluZGV4IG5vcm1hbGx5IHJlZnVzZXMgdG8gb3ZlcndyaXRlIG9sZCBmaWxlcywgc28KK2lmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIGFscmVhZHkgY2hlY2tlZCBvdXQsIHlvdSB3aWxsCituZWVkIHRvIHVzZSB0aGUgIi1mIiBmbGFnICgnYmVmb3JlJyB0aGUgIi1hIiBmbGFnIG9yIHRoZSBmaWxlbmFtZSkgdG8KKydmb3JjZScgdGhlIGNoZWNrb3V0LgorCisKK0ZpbmFsbHksIHRoZXJlIGFyZSBhIGZldyBvZGRzIGFuZCBlbmRzIHdoaWNoIGFyZSBub3QgcHVyZWx5IG1vdmluZworZnJvbSBvbmUgcmVwcmVzZW50YXRpb24gdG8gdGhlIG90aGVyOgorCis1KSBUeWluZyBpdCBhbGwgdG9nZXRoZXIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVG8gY29tbWl0IGEgdHJlZSB5b3UgaGF2ZSBpbnN0YW50aWF0ZWQgd2l0aCAiZ2l0LXdyaXRlLXRyZWUiLCB5b3UnZAorY3JlYXRlIGEgImNvbW1pdCIgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoYXQgdHJlZSBhbmQgdGhlIGhpc3RvcnkKK2JlaGluZCBpdCAtIG1vc3Qgbm90YWJseSB0aGUgInBhcmVudCIgY29tbWl0cyB0aGF0IHByZWNlZGVkIGl0IGluCitoaXN0b3J5LgorCitOb3JtYWxseSBhICJjb21taXQiIGhhcyBvbmUgcGFyZW50OiB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHRyZWUKK2JlZm9yZSBhIGNlcnRhaW4gY2hhbmdlIHdhcyBtYWRlLiBIb3dldmVyLCBzb21ldGltZXMgaXQgY2FuIGhhdmUgdHdvCitvciBtb3JlIHBhcmVudCBjb21taXRzLCBpbiB3aGljaCBjYXNlIHdlIGNhbGwgaXQgYSAibWVyZ2UiLCBkdWUgdG8gdGhlCitmYWN0IHRoYXQgc3VjaCBhIGNvbW1pdCBicmluZ3MgdG9nZXRoZXIgKCJtZXJnZXMiKSB0d28gb3IgbW9yZQorcHJldmlvdXMgc3RhdGVzIHJlcHJlc2VudGVkIGJ5IG90aGVyIGNvbW1pdHMuCisKK0luIG90aGVyIHdvcmRzLCB3aGlsZSBhICJ0cmVlIiByZXByZXNlbnRzIGEgcGFydGljdWxhciBkaXJlY3Rvcnkgc3RhdGUKK29mIGEgd29ya2luZyBkaXJlY3RvcnksIGEgImNvbW1pdCIgcmVwcmVzZW50cyB0aGF0IHN0YXRlIGluICJ0aW1lIiwKK2FuZCBleHBsYWlucyBob3cgd2UgZ290IHRoZXJlLgorCitZb3UgY3JlYXRlIGEgY29tbWl0IG9iamVjdCBieSBnaXZpbmcgaXQgdGhlIHRyZWUgdGhhdCBkZXNjcmliZXMgdGhlCitzdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgY29tbWl0LCBhbmQgYSBsaXN0IG9mIHBhcmVudHM6CisKKwlnaXQtY29tbWl0LXRyZWUgPHRyZWU+IC1wIDxwYXJlbnQ+IFstcCA8cGFyZW50Mj4gLi5dCisKK2FuZCB0aGVuIGdpdmluZyB0aGUgcmVhc29uIGZvciB0aGUgY29tbWl0IG9uIHN0ZGluIChlaXRoZXIgdGhyb3VnaAorcmVkaXJlY3Rpb24gZnJvbSBhIHBpcGUgb3IgZmlsZSwgb3IgYnkganVzdCB0eXBpbmcgaXQgYXQgdGhlIHR0eSkuCisKK2dpdC1jb21taXQtdHJlZSB3aWxsIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cwordGhhdCBjb21taXQsIGFuZCB5b3Ugc2hvdWxkIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlLiBOb3JtYWxseSwKK3lvdSdkIGNvbW1pdCBhIG5ldyBgSEVBRGAgc3RhdGUsIGFuZCB3aGlsZSBnaXQgZG9lc24ndCBjYXJlIHdoZXJlIHlvdQorc2F2ZSB0aGUgbm90ZSBhYm91dCB0aGF0IHN0YXRlLCBpbiBwcmFjdGljZSB3ZSB0ZW5kIHRvIGp1c3Qgd3JpdGUgdGhlCityZXN1bHQgdG8gdGhlIGZpbGUgcG9pbnRlZCBhdCBieSBgLmdpdC9IRUFEYCwgc28gdGhhdCB3ZSBjYW4gYWx3YXlzIHNlZQord2hhdCB0aGUgbGFzdCBjb21taXR0ZWQgc3RhdGUgd2FzLgorCitIZXJlIGlzIGFuIEFTQ0lJIGFydCBieSBKb24gTG9lbGlnZXIgdGhhdCBpbGx1c3RyYXRlcyBob3cKK3ZhcmlvdXMgcGllY2VzIGZpdCB0b2dldGhlci4KKworLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1pdC10cmVlCisgICAgICAgICAgICAgICAgICAgICAgY29tbWl0IG9iagorICAgICAgICAgICAgICAgICAgICAgICArLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBWICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8IE9iamVjdCBEQiB8CisgICAgICAgICAgICAgICAgICAgIHwgIEJhY2tpbmcgIHwKKyAgICAgICAgICAgICAgICAgICAgfCAgIFN0b3JlICAgfAorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgd3JpdGUtdHJlZSAgfCAgICAgfAorICAgICAgICAgICAgIHRyZWUgb2JqICB8ICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgIHJlYWQtdHJlZQorICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICB0cmVlIG9iagorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCAgIEluZGV4ICAgfAorICAgICAgICAgICAgICAgICAgICB8ICAiY2FjaGUiICB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgIHVwZGF0ZS1pbmRleCAgXgorICAgICAgICAgICAgIGJsb2Igb2JqICB8ICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKKyAgICBjaGVja291dC1pbmRleCAtdSAgfCAgICAgfCAgY2hlY2tvdXQtaW5kZXgKKyAgICAgICAgICAgICBzdGF0ICAgICAgfCAgICAgfCAgYmxvYiBvYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgIHwgIFdvcmtpbmcgIHwKKyAgICAgICAgICAgICAgICAgICAgfCBEaXJlY3RvcnkgfAorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisKKy0tLS0tLS0tLS0tLQorCisKKzYpIEV4YW1pbmluZyB0aGUgZGF0YQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSBjYW4gZXhhbWluZSB0aGUgZGF0YSByZXByZXNlbnRlZCBpbiB0aGUgb2JqZWN0IGRhdGFiYXNlIGFuZCB0aGUKK2luZGV4IHdpdGggdmFyaW91cyBoZWxwZXIgdG9vbHMuIEZvciBldmVyeSBvYmplY3QsIHlvdSBjYW4gdXNlCitnaXRsaW5rOmdpdC1jYXQtZmlsZVsxXSB0byBleGFtaW5lIGRldGFpbHMgYWJvdXQgdGhlCitvYmplY3Q6CisKKwkJZ2l0LWNhdC1maWxlIC10IDxvYmplY3RuYW1lPgorCitzaG93cyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LCBhbmQgb25jZSB5b3UgaGF2ZSB0aGUgdHlwZSAod2hpY2ggaXMKK3VzdWFsbHkgaW1wbGljaXQgaW4gd2hlcmUgeW91IGZpbmQgdGhlIG9iamVjdCksIHlvdSBjYW4gdXNlCisKKwkJZ2l0LWNhdC1maWxlIGJsb2J8dHJlZXxjb21taXR8dGFnIDxvYmplY3RuYW1lPgorCit0byBzaG93IGl0cyBjb250ZW50cy4gTk9URSEgVHJlZXMgaGF2ZSBiaW5hcnkgY29udGVudCwgYW5kIGFzIGEgcmVzdWx0Cit0aGVyZSBpcyBhIHNwZWNpYWwgaGVscGVyIGZvciBzaG93aW5nIHRoYXQgY29udGVudCwgY2FsbGVkCitgZ2l0LWxzLXRyZWVgLCB3aGljaCB0dXJucyB0aGUgYmluYXJ5IGNvbnRlbnQgaW50byBhIG1vcmUgZWFzaWx5CityZWFkYWJsZSBmb3JtLgorCitJdCdzIGVzcGVjaWFsbHkgaW5zdHJ1Y3RpdmUgdG8gbG9vayBhdCAiY29tbWl0IiBvYmplY3RzLCBzaW5jZSB0aG9zZQordGVuZCB0byBiZSBzbWFsbCBhbmQgZmFpcmx5IHNlbGYtZXhwbGFuYXRvcnkuIEluIHBhcnRpY3VsYXIsIGlmIHlvdQorZm9sbG93IHRoZSBjb252ZW50aW9uIG9mIGhhdmluZyB0aGUgdG9wIGNvbW1pdCBuYW1lIGluIGAuZ2l0L0hFQURgLAoreW91IGNhbiBkbworCisJCWdpdC1jYXQtZmlsZSBjb21taXQgSEVBRAorCit0byBzZWUgd2hhdCB0aGUgdG9wIGNvbW1pdCB3YXMuCisKKzcpIE1lcmdpbmcgbXVsdGlwbGUgdHJlZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworR2l0IGhlbHBzIHlvdSBkbyBhIHRocmVlLXdheSBtZXJnZSwgd2hpY2ggeW91IGNhbiBleHBhbmQgdG8gbi13YXkgYnkKK3JlcGVhdGluZyB0aGUgbWVyZ2UgcHJvY2VkdXJlIGFyYml0cmFyeSB0aW1lcyB1bnRpbCB5b3UgZmluYWxseQorImNvbW1pdCIgdGhlIHN0YXRlLiAgVGhlIG5vcm1hbCBzaXR1YXRpb24gaXMgdGhhdCB5b3UnZCBvbmx5IGRvIG9uZQordGhyZWUtd2F5IG1lcmdlICh0d28gcGFyZW50cyksIGFuZCBjb21taXQgaXQsIGJ1dCBpZiB5b3UgbGlrZSB0bywgeW91CitjYW4gZG8gbXVsdGlwbGUgcGFyZW50cyBpbiBvbmUgZ28uCisKK1RvIGRvIGEgdGhyZWUtd2F5IG1lcmdlLCB5b3UgbmVlZCB0aGUgdHdvIHNldHMgb2YgImNvbW1pdCIgb2JqZWN0cwordGhhdCB5b3Ugd2FudCB0byBtZXJnZSwgdXNlIHRob3NlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgY29tbW9uIHBhcmVudCAoYQordGhpcmQgImNvbW1pdCIgb2JqZWN0KSwgYW5kIHRoZW4gdXNlIHRob3NlIGNvbW1pdCBvYmplY3RzIHRvIGZpbmQgdGhlCitzdGF0ZSBvZiB0aGUgZGlyZWN0b3J5ICgidHJlZSIgb2JqZWN0KSBhdCB0aGVzZSBwb2ludHMuCisKK1RvIGdldCB0aGUgImJhc2UiIGZvciB0aGUgbWVyZ2UsIHlvdSBmaXJzdCBsb29rIHVwIHRoZSBjb21tb24gcGFyZW50CitvZiB0d28gY29tbWl0cyB3aXRoCisKKwkJZ2l0LW1lcmdlLWJhc2UgPGNvbW1pdDE+IDxjb21taXQyPgorCit3aGljaCB3aWxsIHJldHVybiB5b3UgdGhlIGNvbW1pdCB0aGV5IGFyZSBib3RoIGJhc2VkIG9uLiAgWW91IHNob3VsZAorbm93IGxvb2sgdXAgdGhlICJ0cmVlIiBvYmplY3RzIG9mIHRob3NlIGNvbW1pdHMsIHdoaWNoIHlvdSBjYW4gZWFzaWx5CitkbyB3aXRoIChmb3IgZXhhbXBsZSkKKworCQlnaXQtY2F0LWZpbGUgY29tbWl0IDxjb21taXRuYW1lPiB8IGhlYWQgLTEKKworc2luY2UgdGhlIHRyZWUgb2JqZWN0IGluZm9ybWF0aW9uIGlzIGFsd2F5cyB0aGUgZmlyc3QgbGluZSBpbiBhIGNvbW1pdAorb2JqZWN0LgorCitPbmNlIHlvdSBrbm93IHRoZSB0aHJlZSB0cmVlcyB5b3UgYXJlIGdvaW5nIHRvIG1lcmdlICh0aGUgb25lCisib3JpZ2luYWwiIHRyZWUsIGFrYSB0aGUgY29tbW9uIGNhc2UsIGFuZCB0aGUgdHdvICJyZXN1bHQiIHRyZWVzLCBha2EKK3RoZSBicmFuY2hlcyB5b3Ugd2FudCB0byBtZXJnZSksIHlvdSBkbyBhICJtZXJnZSIgcmVhZCBpbnRvIHRoZQoraW5kZXguIFRoaXMgd2lsbCBjb21wbGFpbiBpZiBpdCBoYXMgdG8gdGhyb3cgYXdheSB5b3VyIG9sZCBpbmRleCBjb250ZW50cywgc28geW91IHNob3VsZAorbWFrZSBzdXJlIHRoYXQgeW91J3ZlIGNvbW1pdHRlZCB0aG9zZSAtIGluIGZhY3QgeW91IHdvdWxkIG5vcm1hbGx5CithbHdheXMgZG8gYSBtZXJnZSBhZ2FpbnN0IHlvdXIgbGFzdCBjb21taXQgKHdoaWNoIHNob3VsZCB0aHVzIG1hdGNoCit3aGF0IHlvdSBoYXZlIGluIHlvdXIgY3VycmVudCBpbmRleCBhbnl3YXkpLgorCitUbyBkbyB0aGUgbWVyZ2UsIGRvCisKKwkJZ2l0LXJlYWQtdHJlZSAtbSAtdSA8b3JpZ3RyZWU+IDx5b3VydHJlZT4gPHRhcmdldHRyZWU+CisKK3doaWNoIHdpbGwgZG8gYWxsIHRyaXZpYWwgbWVyZ2Ugb3BlcmF0aW9ucyBmb3IgeW91IGRpcmVjdGx5IGluIHRoZQoraW5kZXggZmlsZSwgYW5kIHlvdSBjYW4ganVzdCB3cml0ZSB0aGUgcmVzdWx0IG91dCB3aXRoCitgZ2l0LXdyaXRlLXRyZWVgLgorCitIaXN0b3JpY2FsIG5vdGUuICBXZSBkaWQgbm90IGhhdmUgYC11YCBmYWNpbGl0eSB3aGVuIHRoaXMKK3NlY3Rpb24gd2FzIGZpcnN0IHdyaXR0ZW4sIHNvIHdlIHVzZWQgdG8gd2FybiB0aGF0Cit0aGUgbWVyZ2UgaXMgZG9uZSBpbiB0aGUgaW5kZXggZmlsZSwgbm90IGluIHlvdXIKK3dvcmtpbmcgdHJlZSwgYW5kIHlvdXIgd29ya2luZyB0cmVlIHdpbGwgbm90IG1hdGNoIHlvdXIKK2luZGV4IGFmdGVyIHRoaXMgc3RlcC4KK1RoaXMgaXMgbm8gbG9uZ2VyIHRydWUuICBUaGUgYWJvdmUgY29tbWFuZCwgdGhhbmtzIHRvIGAtdWAKK29wdGlvbiwgdXBkYXRlcyB5b3VyIHdvcmtpbmcgdHJlZSB3aXRoIHRoZSBtZXJnZSByZXN1bHRzIGZvcgorcGF0aHMgdGhhdCBoYXZlIGJlZW4gdHJpdmlhbGx5IG1lcmdlZC4KKworCis4KSBNZXJnaW5nIG11bHRpcGxlIHRyZWVzLCBjb250aW51ZWQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitTYWRseSwgbWFueSBtZXJnZXMgYXJlbid0IHRyaXZpYWwuIElmIHRoZXJlIGFyZSBmaWxlcyB0aGF0IGhhdmUKK2JlZW4gYWRkZWQubW92ZWQgb3IgcmVtb3ZlZCwgb3IgaWYgYm90aCBicmFuY2hlcyBoYXZlIG1vZGlmaWVkIHRoZQorc2FtZSBmaWxlLCB5b3Ugd2lsbCBiZSBsZWZ0IHdpdGggYW4gaW5kZXggdHJlZSB0aGF0IGNvbnRhaW5zICJtZXJnZQorZW50cmllcyIgaW4gaXQuIFN1Y2ggYW4gaW5kZXggdHJlZSBjYW4gJ05PVCcgYmUgd3JpdHRlbiBvdXQgdG8gYSB0cmVlCitvYmplY3QsIGFuZCB5b3Ugd2lsbCBoYXZlIHRvIHJlc29sdmUgYW55IHN1Y2ggbWVyZ2UgY2xhc2hlcyB1c2luZworb3RoZXIgdG9vbHMgYmVmb3JlIHlvdSBjYW4gd3JpdGUgb3V0IHRoZSByZXN1bHQuCisKK1lvdSBjYW4gZXhhbWluZSBzdWNoIGluZGV4IHN0YXRlIHdpdGggYGdpdC1scy1maWxlcyAtLXVubWVyZ2VkYAorY29tbWFuZC4gIEFuIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tICRvcmlnIEhFQUQgJHRhcmdldAorJCBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZAorMTAwNjQ0IDI2MzQxNGY0MjNkMGU0ZDcwZGFlOGZlNTNmYTM0NjE0ZmYzZTI4NjAgMQloZWxsby5jCisxMDA2NDQgMDZmYTZhMjQyNTZkYzdlNTYwZWZhNTY4N2ZhODRiNTFmMDI2M2MzYSAyCWhlbGxvLmMKKzEwMDY0NCBjYzQ0YzczZWI3ODM1NjVkYTU4MzFiNGQ4MjBjOTYyOTU0MDE5YjY5IDMJaGVsbG8uYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VhY2ggbGluZSBvZiB0aGUgYGdpdC1scy1maWxlcyAtLXVubWVyZ2VkYCBvdXRwdXQgYmVnaW5zIHdpdGgKK3RoZSBibG9iIG1vZGUgYml0cywgYmxvYiBTSEExLCAnc3RhZ2UgbnVtYmVyJywgYW5kIHRoZQorZmlsZW5hbWUuICBUaGUgJ3N0YWdlIG51bWJlcicgaXMgZ2l0J3Mgd2F5IHRvIHNheSB3aGljaCB0cmVlIGl0CitjYW1lIGZyb206IHN0YWdlIDEgY29ycmVzcG9uZHMgdG8gYCRvcmlnYCB0cmVlLCBzdGFnZSAyIGBIRUFEYAordHJlZSwgYW5kIHN0YWdlMyBgJHRhcmdldGAgdHJlZS4KKworRWFybGllciB3ZSBzYWlkIHRoYXQgdHJpdmlhbCBtZXJnZXMgYXJlIGRvbmUgaW5zaWRlCitgZ2l0LXJlYWQtdHJlZSAtbWAuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpbGUgZGlkIG5vdCBjaGFuZ2UKK2Zyb20gYCRvcmlnYCB0byBgSEVBRGAgbm9yIGAkdGFyZ2V0YCwgb3IgaWYgdGhlIGZpbGUgY2hhbmdlZAorZnJvbSBgJG9yaWdgIHRvIGBIRUFEYCBhbmQgYCRvcmlnYCB0byBgJHRhcmdldGAgdGhlIHNhbWUgd2F5LAorb2J2aW91c2x5IHRoZSBmaW5hbCBvdXRjb21lIGlzIHdoYXQgaXMgaW4gYEhFQURgLiAgV2hhdCB0aGUKK2Fib3ZlIGV4YW1wbGUgc2hvd3MgaXMgdGhhdCBmaWxlIGBoZWxsby5jYCB3YXMgY2hhbmdlZCBmcm9tCitgJG9yaWdgIHRvIGBIRUFEYCBhbmQgYCRvcmlnYCB0byBgJHRhcmdldGAgaW4gYSBkaWZmZXJlbnQgd2F5LgorWW91IGNvdWxkIHJlc29sdmUgdGhpcyBieSBydW5uaW5nIHlvdXIgZmF2b3JpdGUgMy13YXkgbWVyZ2UKK3Byb2dyYW0sIGUuZy4gIGBkaWZmM2Agb3IgYG1lcmdlYCwgb24gdGhlIGJsb2Igb2JqZWN0cyBmcm9tCit0aGVzZSB0aHJlZSBzdGFnZXMgeW91cnNlbGYsIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSBibG9iIDI2MzQxNGYuLi4gPmhlbGxvLmN+MQorJCBnaXQtY2F0LWZpbGUgYmxvYiAwNmZhNmEyLi4uID5oZWxsby5jfjIKKyQgZ2l0LWNhdC1maWxlIGJsb2IgY2M0NGM3My4uLiA+aGVsbG8uY34zCiskIG1lcmdlIGhlbGxvLmN+MiBoZWxsby5jfjEgaGVsbG8uY34zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB3b3VsZCBsZWF2ZSB0aGUgbWVyZ2UgcmVzdWx0IGluIGBoZWxsby5jfjJgIGZpbGUsIGFsb25nCit3aXRoIGNvbmZsaWN0IG1hcmtlcnMgaWYgdGhlcmUgYXJlIGNvbmZsaWN0cy4gIEFmdGVyIHZlcmlmeWluZwordGhlIG1lcmdlIHJlc3VsdCBtYWtlcyBzZW5zZSwgeW91IGNhbiB0ZWxsIGdpdCB3aGF0IHRoZSBmaW5hbAorbWVyZ2UgcmVzdWx0IGZvciB0aGlzIGZpbGUgaXMgYnk6CisKKwltdiAtZiBoZWxsby5jfjIgaGVsbG8uYworCWdpdC11cGRhdGUtaW5kZXggaGVsbG8uYworCitXaGVuIGEgcGF0aCBpcyBpbiB1bm1lcmdlZCBzdGF0ZSwgcnVubmluZyBgZ2l0LXVwZGF0ZS1pbmRleGAgZm9yCit0aGF0IHBhdGggdGVsbHMgZ2l0IHRvIG1hcmsgdGhlIHBhdGggcmVzb2x2ZWQuCisKK1RoZSBhYm92ZSBpcyB0aGUgZGVzY3JpcHRpb24gb2YgYSBnaXQgbWVyZ2UgYXQgdGhlIGxvd2VzdCBsZXZlbCwKK3RvIGhlbHAgeW91IHVuZGVyc3RhbmQgd2hhdCBjb25jZXB0dWFsbHkgaGFwcGVucyB1bmRlciB0aGUgaG9vZC4KK0luIHByYWN0aWNlLCBub2JvZHksIG5vdCBldmVuIGdpdCBpdHNlbGYsIHVzZXMgdGhyZWUgYGdpdC1jYXQtZmlsZWAKK2ZvciB0aGlzLiAgVGhlcmUgaXMgYGdpdC1tZXJnZS1pbmRleGAgcHJvZ3JhbSB0aGF0IGV4dHJhY3RzIHRoZQorc3RhZ2VzIHRvIHRlbXBvcmFyeSBmaWxlcyBhbmQgY2FsbHMgYSAibWVyZ2UiIHNjcmlwdCBvbiBpdDoKKworCWdpdC1tZXJnZS1pbmRleCBnaXQtbWVyZ2Utb25lLWZpbGUgaGVsbG8uYworCithbmQgdGhhdCBpcyB3aGF0IGhpZ2hlciBsZXZlbCBgZ2l0IHJlc29sdmVgIGlzIGltcGxlbWVudGVkIHdpdGguCmRpZmYgLS1naXQgYS9hcm0vc2hhMS5jIGIvYXJtL3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIxYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJtL3NoYTEuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gb3B0aW1pemVkIGZvciBBUk0KKyAqCisgKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDUgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogQ3JlYXRlZDogICAgIFNlcHRlbWJlciAxNywgMjAwNQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzaGExLmgiCisKK2V4dGVybiB2b2lkIHNoYV90cmFuc2Zvcm0odWludDMyX3QgKmhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90ICpXKTsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqYykKK3sKKwljLT5sZW4gPSAwOworCWMtPmhhc2hbMF0gPSAweDY3NDUyMzAxOworCWMtPmhhc2hbMV0gPSAweGVmY2RhYjg5OworCWMtPmhhc2hbMl0gPSAweDk4YmFkY2ZlOworCWMtPmhhc2hbM10gPSAweDEwMzI1NDc2OworCWMtPmhhc2hbNF0gPSAweGMzZDJlMWYwOworfQorCit2b2lkIFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl1aW50MzJfdCB3b3Jrc3BhY2VbODBdOworCXVuc2lnbmVkIGludCBwYXJ0aWFsOworCXVuc2lnbmVkIGxvbmcgZG9uZTsKKworCXBhcnRpYWwgPSBjLT5sZW4gJiAweDNmOworCWMtPmxlbiArPSBuOworCWlmICgocGFydGlhbCArIG4pID49IDY0KSB7CisJCWlmIChwYXJ0aWFsKSB7CisJCQlkb25lID0gNjQgLSBwYXJ0aWFsOworCQkJbWVtY3B5KGMtPmJ1ZmZlciArIHBhcnRpYWwsIHAsIGRvbmUpOworCQkJc2hhX3RyYW5zZm9ybShjLT5oYXNoLCBjLT5idWZmZXIsIHdvcmtzcGFjZSk7CisJCQlwYXJ0aWFsID0gMDsKKwkJfSBlbHNlCisJCQlkb25lID0gMDsKKwkJd2hpbGUgKG4gPj0gZG9uZSArIDY0KSB7CisJCQlzaGFfdHJhbnNmb3JtKGMtPmhhc2gsIHAgKyBkb25lLCB3b3Jrc3BhY2UpOworCQkJZG9uZSArPSA2NDsKKwkJfQorCX0gZWxzZQorCQlkb25lID0gMDsKKwlpZiAobiAtIGRvbmUpCisJCW1lbWNweShjLT5idWZmZXIgKyBwYXJ0aWFsLCBwICsgZG9uZSwgbiAtIGRvbmUpOworfQorCit2b2lkIFNIQTFfRmluYWwodW5zaWduZWQgY2hhciAqaGFzaCwgU0hBX0NUWCAqYykKK3sKKwl1aW50NjRfdCBiaXRsZW47CisJdWludDMyX3QgYml0bGVuX2hpLCBiaXRsZW5fbG87IAorCXVuc2lnbmVkIGludCBpLCBvZmZzZXQsIHBhZGxlbjsKKwl1bnNpZ25lZCBjaGFyIGJpdHNbOF07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGFkZGluZ1s2NF0gPSB7IDB4ODAsIH07CisKKwliaXRsZW4gPSBjLT5sZW4gPDwgMzsKKwlvZmZzZXQgPSBjLT5sZW4gJiAweDNmOworCXBhZGxlbiA9ICgob2Zmc2V0IDwgNTYpID8gNTYgOiAoNjQgKyA1NikpIC0gb2Zmc2V0OworCVNIQTFfVXBkYXRlKGMsIHBhZGRpbmcsIHBhZGxlbik7CisKKwliaXRsZW5faGkgPSBiaXRsZW4gPj4gMzI7CisJYml0bGVuX2xvID0gYml0bGVuICYgMHhmZmZmZmZmZjsKKwliaXRzWzBdID0gYml0bGVuX2hpID4+IDI0OworCWJpdHNbMV0gPSBiaXRsZW5faGkgPj4gMTY7CisJYml0c1syXSA9IGJpdGxlbl9oaSA+PiA4OworCWJpdHNbM10gPSBiaXRsZW5faGk7CisJYml0c1s0XSA9IGJpdGxlbl9sbyA+PiAyNDsKKwliaXRzWzVdID0gYml0bGVuX2xvID4+IDE2OworCWJpdHNbNl0gPSBiaXRsZW5fbG8gPj4gODsKKwliaXRzWzddID0gYml0bGVuX2xvOworCVNIQTFfVXBkYXRlKGMsIGJpdHMsIDgpOyAKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdWludDMyX3QgdiA9IGMtPmhhc2hbaV07CisJCWhhc2hbMF0gPSB2ID4+IDI0OworCQloYXNoWzFdID0gdiA+PiAxNjsKKwkJaGFzaFsyXSA9IHYgPj4gODsKKwkJaGFzaFszXSA9IHY7CisJCWhhc2ggKz0gNDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcm0vc2hhMS5oIGIvYXJtL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTUyNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJtL3NoYTEuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gb3B0aW1pemVkIGZvciBBUk0KKyAqCisgKiBDb3B5cmlnaHQ6CShDKSAyMDA1IGJ5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqIENyZWF0ZWQ6CVNlcHRlbWJlciAxNywgMjAwNQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3Qgc2hhX2NvbnRleHQgeworCXVpbnQ2NF90IGxlbjsKKwl1aW50MzJfdCBoYXNoWzVdOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XTsKK30gU0hBX0NUWDsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqYyk7Cit2b2lkIFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbik7Cit2b2lkIFNIQTFfRmluYWwodW5zaWduZWQgY2hhciAqaGFzaCwgU0hBX0NUWCAqYyk7CmRpZmYgLS1naXQgYS9hcm0vc2hhMV9hcm0uUyBiL2FybS9zaGExX2FybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTJkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcm0vc2hhMV9hcm0uUwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqICBTSEEgdHJhbnNmb3JtIG9wdGltaXplZCBmb3IgQVJNCisgKgorICogIENvcHlyaWdodDoJKEMpIDIwMDUgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogIENyZWF0ZWQ6CVNlcHRlbWJlciAxNywgMjAwNQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworCS50ZXh0CisJLmdsb2JsCXNoYV90cmFuc2Zvcm0KKworLyoKKyAqIHZvaWQgc2hhX3RyYW5zZm9ybSh1aW50MzJfdCAqaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdWludDMyX3QgKlcpOworICoKKyAqIG5vdGU6IHRoZSAiZGF0YSIgcG9pbnRlciBtYXkgYmUgdW5hbGlnbmVkLgorICovCisKK3NoYV90cmFuc2Zvcm06CisKKwlzdG1mZAlzcCEsIHtyNCAtIHI4LCBscn0KKworCUAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJQCAgICAgICAgIFdbaV0gPSBudG9obCgoKHVpbnQzMl90ICopZGF0YSlbaV0pOyAqLworCisjaWZkZWYgX19BUk1FQl9fCisJbW92CXI0LCByMAorCW1vdglyMCwgcjIKKwltb3YJcjIsICM2NAorCWJsCW1lbWNweQorCW1vdglyMiwgcjAKKwltb3YJcjAsIHI0CisjZWxzZQorCW1vdglyMywgcjIKKwltb3YJbHIsICMxNgorMToJbGRyYglyNCwgW3IxXSwgIzEKKwlsZHJiCXI1LCBbcjFdLCAjMQorCWxkcmIJcjYsIFtyMV0sICMxCisJbGRyYglyNywgW3IxXSwgIzEKKwlzdWJzCWxyLCBsciwgIzEKKwlvcnIJcjUsIHI1LCByNCwgbHNsICM4CisJb3JyCXI2LCByNiwgcjUsIGxzbCAjOAorCW9ycglyNywgcjcsIHI2LCBsc2wgIzgKKwlzdHIJcjcsIFtyM10sICM0CisJYm5lCTFiCisjZW5kaWYKKworCUAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJQCAgICAgICAgIFdbaSsxNl0gPSByb3IoV1tpKzEzXSBeIFdbaSs4XSBeIFdbaSsyXSBeIFdbaV0sIDMxKTsKKworCXN1YglyMywgcjIsICM0CisJbW92CWxyLCAjNjQKKzI6CWxkcglyNCwgW3IzLCAjNF0hCisJc3VicwlsciwgbHIsICMxCisJbGRyCXI1LCBbcjMsICM4XQorCWxkcglyNiwgW3IzLCAjMzJdCisJbGRyCXI3LCBbcjMsICM1Ml0KKwllb3IJcjQsIHI0LCByNQorCWVvcglyNCwgcjQsIHI2CisJZW9yCXI0LCByNCwgcjcKKwltb3YJcjQsIHI0LCByb3IgIzMxCisJc3RyCXI0LCBbcjMsICM2NF0KKwlibmUJMmIKKworCS8qCisJICogVGhlIFNIQSBmdW5jdGlvbnMgYXJlOgorCSAqCisJICogZjEoQixDLEQpID0gKEQgXiAoQiAmIChDIF4gRCkpKQorCSAqIGYyKEIsQyxEKSA9IChCIF4gQyBeIEQpCisJICogZjMoQixDLEQpID0gKChCICYgQykgfCAoRCAmIChCIHwgQykpKQorCSAqCisJICogVGhlbiB0aGUgc3ViLWJsb2NrcyBhcmUgcHJvY2Vzc2VkIGFzIGZvbGxvd3M6CisJICoKKwkgKiBBJyA9IHJvcihBLCAyNykgKyBmKEIsQyxEKSArIEUgKyBLICsgKlcrKworCSAqIEInID0gQQorCSAqIEMnID0gcm9yKEIsIDIpCisJICogRCcgPSBDCisJICogRScgPSBECisJICoKKwkgKiBXZSB0aGVyZWZvcmUgdW5yb2xsIGVhY2ggbG9vcCA1IHRpbWVzIHRvIGF2b2lkIHJlZ2lzdGVyIHNodWZmbGluZy4KKwkgKiBBbHNvIHRoZSByb3IgZm9yIEMgKGFuZCBhbHNvIEQgYW5kIEUgd2hpY2ggYXJlIHN1Y2Nlc3NpdmVseWRlcml2ZWQKKwkgKiBmcm9tIGl0KSBpcyBhcHBsaWVkIGluIHBsYWNlIHRvIGN1dCBvbiBhbiBhZGRpdGlvbmFsIG1vdiBpbnNuIGZvcgorCSAqIGVhY2ggcm91bmQuCisJICovCisKKwkubWFjcm8Jc2hhX2YxLCBBLCBCLCBDLCBELCBFCisJbGRyCXIzLCBbcjJdLCAjNAorCWVvcglpcCwgXEMsIFxECisJYWRkCVxFLCByMSwgXEUsIHJvciAjMgorCWFuZAlpcCwgXEIsIGlwLCByb3IgIzIKKwlhZGQJXEUsIFxFLCBcQSwgcm9yICMyNworCWVvcglpcCwgaXAsIFxELCByb3IgIzIKKwlhZGQJXEUsIFxFLCByMworCWFkZAlcRSwgXEUsIGlwCisJLmVuZG0KKworCS5tYWNybwlzaGFfZjIsIEEsIEIsIEMsIEQsIEUKKwlsZHIJcjMsIFtyMl0sICM0CisJYWRkCVxFLCByMSwgXEUsIHJvciAjMgorCWVvcglpcCwgXEIsIFxDLCByb3IgIzIKKwlhZGQJXEUsIFxFLCBcQSwgcm9yICMyNworCWVvcglpcCwgaXAsIFxELCByb3IgIzIKKwlhZGQJXEUsIFxFLCByMworCWFkZAlcRSwgXEUsIGlwCisJLmVuZG0KKworCS5tYWNybwlzaGFfZjMsIEEsIEIsIEMsIEQsIEUKKwlsZHIJcjMsIFtyMl0sICM0CisJYWRkCVxFLCByMSwgXEUsIHJvciAjMgorCW9ycglpcCwgXEIsIFxDLCByb3IgIzIKKwlhZGQJXEUsIFxFLCBcQSwgcm9yICMyNworCWFuZAlpcCwgaXAsIFxELCByb3IgIzIKKwlhZGQJXEUsIFxFLCByMworCWFuZAlyMywgXEIsIFxDLCByb3IgIzIKKwlvcnIJaXAsIGlwLCByMworCWFkZAlcRSwgXEUsIGlwCisJLmVuZG0KKworCWxkbWlhCXIwLCB7cjQgLSByOH0KKworCW1vdglsciwgIzQKKwlsZHIJcjEsIC5MX3NoYV9LICsgMAorCisJLyogYWRqdXN0IGluaXRpYWwgdmFsdWVzICovCisJbW92CXI2LCByNiwgcm9yICMzMAorCW1vdglyNywgcjcsIHJvciAjMzAKKwltb3YJcjgsIHI4LCByb3IgIzMwCisKKzM6CXN1YnMJbHIsIGxyLCAjMQorCXNoYV9mMQlyNCwgcjUsIHI2LCByNywgcjgKKwlzaGFfZjEJcjgsIHI0LCByNSwgcjYsIHI3CisJc2hhX2YxCXI3LCByOCwgcjQsIHI1LCByNgorCXNoYV9mMQlyNiwgcjcsIHI4LCByNCwgcjUKKwlzaGFfZjEJcjUsIHI2LCByNywgcjgsIHI0CisJYm5lCTNiCisKKwlsZHIJcjEsIC5MX3NoYV9LICsgNAorCW1vdglsciwgIzQKKworNDoJc3VicwlsciwgbHIsICMxCisJc2hhX2YyCXI0LCByNSwgcjYsIHI3LCByOAorCXNoYV9mMglyOCwgcjQsIHI1LCByNiwgcjcKKwlzaGFfZjIJcjcsIHI4LCByNCwgcjUsIHI2CisJc2hhX2YyCXI2LCByNywgcjgsIHI0LCByNQorCXNoYV9mMglyNSwgcjYsIHI3LCByOCwgcjQKKwlibmUJNGIKKworCWxkcglyMSwgLkxfc2hhX0sgKyA4CisJbW92CWxyLCAjNAorCis1OglzdWJzCWxyLCBsciwgIzEKKwlzaGFfZjMJcjQsIHI1LCByNiwgcjcsIHI4CisJc2hhX2YzCXI4LCByNCwgcjUsIHI2LCByNworCXNoYV9mMwlyNywgcjgsIHI0LCByNSwgcjYKKwlzaGFfZjMJcjYsIHI3LCByOCwgcjQsIHI1CisJc2hhX2YzCXI1LCByNiwgcjcsIHI4LCByNAorCWJuZQk1YgorCisJbGRyCXIxLCAuTF9zaGFfSyArIDEyCisJbW92CWxyLCAjNAorCis2OglzdWJzCWxyLCBsciwgIzEKKwlzaGFfZjIJcjQsIHI1LCByNiwgcjcsIHI4CisJc2hhX2YyCXI4LCByNCwgcjUsIHI2LCByNworCXNoYV9mMglyNywgcjgsIHI0LCByNSwgcjYKKwlzaGFfZjIJcjYsIHI3LCByOCwgcjQsIHI1CisJc2hhX2YyCXI1LCByNiwgcjcsIHI4LCByNAorCWJuZQk2YgorCisJbGRtaWEJcjAsIHtyMSwgcjIsIHIzLCBpcCwgbHJ9CisJYWRkCXI0LCByMSwgcjQKKwlhZGQJcjUsIHIyLCByNQorCWFkZAlyNiwgcjMsIHI2LCByb3IgIzIKKwlhZGQJcjcsIGlwLCByNywgcm9yICMyCisJYWRkCXI4LCBsciwgcjgsIHJvciAjMgorCXN0bWlhCXIwLCB7cjQgLSByOH0KKworCWxkbWZkCXNwISwge3I0IC0gcjgsIHBjfQorCisuTF9zaGFfSzoKKwkud29yZAkweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2CisKZGlmZiAtLWdpdCBhL2Jhc2U4NS5jIGIvYmFzZTg1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllOTdmOAotLS0gL2Rldi9udWxsCisrKyBiL2Jhc2U4NS5jCkBAIC0wLDAgKzEsMTQwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworI3VuZGVmIERFQlVHXzg1CisKKyNpZmRlZiBERUJVR184NQorI2RlZmluZSBzYXkoYSkgZnByaW50ZihzdGRlcnIsIGEpCisjZGVmaW5lIHNheTEoYSxiKSBmcHJpbnRmKHN0ZGVyciwgYSwgYikKKyNkZWZpbmUgc2F5MihhLGIsYykgZnByaW50ZihzdGRlcnIsIGEsIGIsIGMpCisjZWxzZQorI2RlZmluZSBzYXkoYSkgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgc2F5MShhLGIpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIHNheTIoYSxiLGMpIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgZW44NVtdID0geworCScwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKwknQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsCisJJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLAorCSdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsCisJJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLAorCSdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywKKwkndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLAorCSchJywgJyMnLCAnJCcsICclJywgJyYnLCAnKCcsICcpJywgJyonLCAnKycsICctJywKKwknOycsICc8JywgJz0nLCAnPicsICc/JywgJ0AnLCAnXicsICdfJywJJ2AnLCAneycsCisJJ3wnLCAnfScsICd+JworfTsKKworc3RhdGljIGNoYXIgZGU4NVsyNTZdOworc3RhdGljIHZvaWQgcHJlcF9iYXNlODUodm9pZCkKK3sKKwlpbnQgaTsKKwlpZiAoZGU4NVsnWiddKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZW44NSk7IGkrKykgeworCQlpbnQgY2ggPSBlbjg1W2ldOworCQlkZTg1W2NoXSA9IGkgKyAxOworCX0KK30KKworaW50IGRlY29kZV84NShjaGFyICpkc3QsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlwcmVwX2Jhc2U4NSgpOworCisJc2F5MigiZGVjb2RlIDg1IDwlLipzPiIsIGxlbi80KjUsIGJ1ZmZlcik7CisJd2hpbGUgKGxlbikgeworCQl1bnNpZ25lZCBhY2MgPSAwOworCQlpbnQgZGUsIGNudCA9IDQ7CisJCXVuc2lnbmVkIGNoYXIgY2g7CisJCWRvIHsKKwkJCWNoID0gKmJ1ZmZlcisrOworCQkJZGUgPSBkZTg1W2NoXTsKKwkJCWlmICgtLWRlIDwgMCkKKwkJCQlyZXR1cm4gZXJyb3IoImludmFsaWQgYmFzZTg1IGFscGhhYmV0ICVjIiwgY2gpOworCQkJYWNjID0gYWNjICogODUgKyBkZTsKKwkJfSB3aGlsZSAoLS1jbnQpOworCQljaCA9ICpidWZmZXIrKzsKKwkJZGUgPSBkZTg1W2NoXTsKKwkJaWYgKC0tZGUgPCAwKQorCQkJcmV0dXJuIGVycm9yKCJpbnZhbGlkIGJhc2U4NSBhbHBoYWJldCAlYyIsIGNoKTsKKwkJLyoKKwkJICogRGV0ZWN0IG92ZXJmbG93LiAgVGhlIGxhcmdlc3QKKwkJICogNS1sZXR0ZXIgcG9zc2libGUgaXMgInxOc0MwIiB0bworCQkgKiBlbmNvZGUgMHhmZmZmZmZmZiwgYW5kICJ8TnNDIiBnaXZlcworCQkgKiAweDAzMDMwMzAzIGF0IHRoaXMgcG9pbnQgKGkuZS4KKwkJICogMHhmZmZmZmZmZiA9IDB4MDMwMzAzMDMgKiA4NSkuCisJCSAqLworCQlpZiAoMHgwMzAzMDMwMyA8IGFjYyB8fAorCQkgICAgMHhmZmZmZmZmZiAtIGRlIDwgKGFjYyAqPSA4NSkpCisJCQllcnJvcigiaW52YWxpZCBiYXNlODUgc2VxdWVuY2UgJS41cyIsIGJ1ZmZlci01KTsKKwkJYWNjICs9IGRlOworCQlzYXkxKCIgJTA4eCIsIGFjYyk7CisKKwkJY250ID0gKGxlbiA8IDQpID8gbGVuIDogNDsKKwkJbGVuIC09IGNudDsKKwkJZG8geworCQkJYWNjID0gKGFjYyA8PCA4KSB8IChhY2MgPj4gMjQpOworCQkJKmRzdCsrID0gYWNjOworCQl9IHdoaWxlICgtLWNudCk7CisJfQorCXNheSgiXG4iKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuY29kZV84NShjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBieXRlcykKK3sKKwlwcmVwX2Jhc2U4NSgpOworCisJc2F5KCJlbmNvZGUgODUiKTsKKwl3aGlsZSAoYnl0ZXMpIHsKKwkJdW5zaWduZWQgYWNjID0gMDsKKwkJaW50IGNudDsKKwkJZm9yIChjbnQgPSAyNDsgY250ID49IDA7IGNudCAtPSA4KSB7CisJCQlpbnQgY2ggPSAqZGF0YSsrOworCQkJYWNjIHw9IGNoIDw8IGNudDsKKwkJCWlmICgtLWJ5dGVzID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJc2F5MSgiICUwOHgiLCBhY2MpOworCQlmb3IgKGNudCA9IDQ7IGNudCA+PSAwOyBjbnQtLSkgeworCQkJaW50IHZhbCA9IGFjYyAlIDg1OworCQkJYWNjIC89IDg1OworCQkJYnVmW2NudF0gPSBlbjg1W3ZhbF07CisJCX0KKwkJYnVmICs9IDU7CisJfQorCXNheSgiXG4iKTsKKworCSpidWYgPSAwOworfQorCisjaWZkZWYgREVCVUdfODUKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWNoYXIgYnVmWzEwMjRdOworCisJaWYgKCFzdHJjbXAoYXZbMV0sICItZSIpKSB7CisJCWludCBsZW4gPSBzdHJsZW4oYXZbMl0pOworCQllbmNvZGVfODUoYnVmLCBhdlsyXSwgbGVuKTsKKwkJaWYgKGxlbiA8PSAyNikgbGVuID0gbGVuICsgJ0EnIC0gMTsKKwkJZWxzZSBsZW4gPSBsZW4gKyAnYScgLSAyNiArIDE7CisJCXByaW50ZigiZW5jb2RlZDogJWMlc1xuIiwgbGVuLCBidWYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoYXZbMV0sICItZCIpKSB7CisJCWludCBsZW4gPSAqYXZbMl07CisJCWlmICgnQScgPD0gbGVuICYmIGxlbiA8PSAnWicpIGxlbiA9IGxlbiAtICdBJyArIDE7CisJCWVsc2UgbGVuID0gbGVuIC0gJ2EnICsgMjYgKyAxOworCQlkZWNvZGVfODUoYnVmLCBhdlsyXSsxLCBsZW4pOworCQlwcmludGYoImRlY29kZWQ6ICUuKnNcbiIsIGxlbiwgYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKGF2WzFdLCAiLXQiKSkgeworCQljaGFyIHRbNF0gPSB7IC0xLC0xLC0xLC0xIH07CisJCWVuY29kZV84NShidWYsIHQsIDQpOworCQlwcmludGYoImVuY29kZWQ6IEQlc1xuIiwgYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ibGFtZS5jIGIvYmxhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJmZWMyCi0tLSAvZGV2L251bGwKKysrIGIvYmxhbWUuYwpAQCAtMCwwICsxLDkwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgRnJlZHJpayBLdWl2aW5lbiA8ZnJla3UwNDVAc3R1ZGVudC5saXUuc2U+CisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKworI2RlZmluZSBERUJVRyAwCisKK3N0YXRpYyBjb25zdCBjaGFyIGJsYW1lX3VzYWdlW10gPSAiWy1jXSBbLWxdIFstLV0gZmlsZSBbY29tbWl0XVxuIgorCSIgIC1jLCAtLWNvbXBhYmlsaXR5IFVzZSB0aGUgc2FtZSBvdXRwdXQgbW9kZSBhcyBnaXQtYW5ub3RhdGUgKERlZmF1bHQ6IG9mZilcbiIKKwkiICAtbCwgLS1sb25nICAgICAgICBTaG93IGxvbmcgY29tbWl0IFNIQTEgKERlZmF1bHQ6IG9mZilcbiIKKwkiICAtaCwgLS1oZWxwICAgICAgICBUaGlzIG1lc3NhZ2UiOworCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqKmJsYW1lX2xpbmVzOworc3RhdGljIGludCBudW1fYmxhbWVfbGluZXM7CitzdGF0aWMgY2hhciogYmxhbWVfY29udGVudHM7CitzdGF0aWMgaW50IGJsYW1lX2xlbjsKKworc3RydWN0IHV0aWxfaW5mbyB7CisJaW50ICpsaW5lX21hcDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOwkvKiBibG9iIHNoYSwgbm90IGNvbW1pdCEgKi8KKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBudW1fbGluZXM7CisJY29uc3QgY2hhciogcGF0aG5hbWU7CisKKwl2b2lkKiB0b3BvX2RhdGE7Cit9OworCitzdHJ1Y3QgY2h1bmsgeworCWludCBvZmYxLCBsZW4xOwkvLyAtLS0KKwlpbnQgb2ZmMiwgbGVuMjsJLy8gKysrCit9OworCitzdHJ1Y3QgcGF0Y2ggeworCXN0cnVjdCBjaHVuayAqY2h1bmtzOworCWludCBudW07Cit9OworCitzdGF0aWMgdm9pZCBnZXRfYmxvYihzdHJ1Y3QgY29tbWl0ICpjb21taXQpOworCisvKiBPbmx5IHVzZWQgZm9yIHN0YXRpc3RpY3MgKi8KK3N0YXRpYyBpbnQgbnVtX2dldF9wYXRjaCA9IDA7CitzdGF0aWMgaW50IG51bV9jb21taXRzID0gMDsKK3N0YXRpYyBpbnQgcGF0Y2hfdGltZSA9IDA7CisKK3N0cnVjdCBibGFtZV9kaWZmX3N0YXRlIHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKwlzdHJ1Y3QgcGF0Y2ggKnJldDsKK307CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdTBfZGlmZih2b2lkICpzdGF0ZV8sIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBibGFtZV9kaWZmX3N0YXRlICpzdGF0ZSA9IHN0YXRlXzsKKwlzdHJ1Y3QgY2h1bmsgKmNodW5rOworCisJaWYgKGxlbiA8IDQgfHwgbGluZVswXSAhPSAnQCcgfHwgbGluZVsxXSAhPSAnQCcpCisJCXJldHVybjsKKworCWlmIChERUJVRykKKwkJcHJpbnRmKCJjaHVuayBsaW5lOiAlLipzIiwgKGludClsZW4sIGxpbmUpOworCXN0YXRlLT5yZXQtPm51bSsrOworCXN0YXRlLT5yZXQtPmNodW5rcyA9IHhyZWFsbG9jKHN0YXRlLT5yZXQtPmNodW5rcywKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGNodW5rKSAqIHN0YXRlLT5yZXQtPm51bSk7CisJY2h1bmsgPSAmc3RhdGUtPnJldC0+Y2h1bmtzW3N0YXRlLT5yZXQtPm51bSAtIDFdOworCisJYXNzZXJ0KCFzdHJuY21wKGxpbmUsICJAQCAtIiwgNCkpOworCisJaWYgKHBhcnNlX2h1bmtfaGVhZGVyKGxpbmUsIGxlbiwKKwkJCSAgICAgICZjaHVuay0+b2ZmMSwgJmNodW5rLT5sZW4xLAorCQkJICAgICAgJmNodW5rLT5vZmYyLCAmY2h1bmstPmxlbjIpKSB7CisJCXN0YXRlLT5yZXQtPm51bS0tOworCQlyZXR1cm47CisJfQorCisJaWYgKGNodW5rLT5sZW4xID09IDApCisJCWNodW5rLT5vZmYxKys7CisJaWYgKGNodW5rLT5sZW4yID09IDApCisJCWNodW5rLT5vZmYyKys7CisKKwlpZiAoY2h1bmstPm9mZjEgPiAwKQorCQljaHVuay0+b2ZmMS0tOworCWlmIChjaHVuay0+b2ZmMiA+IDApCisJCWNodW5rLT5vZmYyLS07CisKKwlhc3NlcnQoY2h1bmstPm9mZjEgPj0gMCk7CisJYXNzZXJ0KGNodW5rLT5vZmYyID49IDApOworfQorCitzdGF0aWMgc3RydWN0IHBhdGNoICpnZXRfcGF0Y2goc3RydWN0IGNvbW1pdCAqY29tbWl0LCBzdHJ1Y3QgY29tbWl0ICpvdGhlcikKK3sKKwlzdHJ1Y3QgYmxhbWVfZGlmZl9zdGF0ZSBzdGF0ZTsKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwltbWZpbGVfdCBmaWxlX2MsIGZpbGVfbzsKKwl4ZGVtaXRjYl90IGVjYjsKKwlzdHJ1Y3QgdXRpbF9pbmZvICppbmZvX2MgPSAoc3RydWN0IHV0aWxfaW5mbyAqKWNvbW1pdC0+b2JqZWN0LnV0aWw7CisJc3RydWN0IHV0aWxfaW5mbyAqaW5mb19vID0gKHN0cnVjdCB1dGlsX2luZm8gKilvdGhlci0+b2JqZWN0LnV0aWw7CisJc3RydWN0IHRpbWV2YWwgdHZfc3RhcnQsIHR2X2VuZDsKKworCWdldF9ibG9iKGNvbW1pdCk7CisJZmlsZV9jLnB0ciA9IGluZm9fYy0+YnVmOworCWZpbGVfYy5zaXplID0gaW5mb19jLT5zaXplOworCisJZ2V0X2Jsb2Iob3RoZXIpOworCWZpbGVfby5wdHIgPSBpbmZvX28tPmJ1ZjsKKwlmaWxlX28uc2l6ZSA9IGluZm9fby0+c2l6ZTsKKworCWdldHRpbWVvZmRheSgmdHZfc3RhcnQsIE5VTEwpOworCisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwl4ZWNmZy5jdHhsZW4gPSAwOworCXhlY2ZnLmZsYWdzID0gMDsKKwllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJZWNiLnByaXYgPSAmc3RhdGU7CisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdGUueG0uY29uc3VtZSA9IHByb2Nlc3NfdTBfZGlmZjsKKwlzdGF0ZS5yZXQgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgcGF0Y2gpKTsKKwlzdGF0ZS5yZXQtPmNodW5rcyA9IE5VTEw7CisJc3RhdGUucmV0LT5udW0gPSAwOworCisJeGRsX2RpZmYoJmZpbGVfYywgJmZpbGVfbywgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKworCWdldHRpbWVvZmRheSgmdHZfZW5kLCBOVUxMKTsKKwlwYXRjaF90aW1lICs9IDEwMDAwMDAgKiAodHZfZW5kLnR2X3NlYyAtIHR2X3N0YXJ0LnR2X3NlYykgKworCQl0dl9lbmQudHZfdXNlYyAtIHR2X3N0YXJ0LnR2X3VzZWM7CisKKwludW1fZ2V0X3BhdGNoKys7CisJcmV0dXJuIHN0YXRlLnJldDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYXRjaChzdHJ1Y3QgcGF0Y2ggKnApCit7CisJZnJlZShwLT5jaHVua3MpOworCWZyZWUocCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jsb2Jfc2hhMV9pbnRlcm5hbChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpiYXNlLAorCQkJCSAgaW50IGJhc2VsZW4sIGNvbnN0IGNoYXIgKnBhdGhuYW1lLAorCQkJCSAgdW5zaWduZWQgbW9kZSwgaW50IHN0YWdlKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmxvYl9zaGExWzIwXTsKK3N0YXRpYyBjb25zdCBjaGFyKiBibGFtZV9maWxlOworc3RhdGljIGludCBnZXRfYmxvYl9zaGExKHN0cnVjdCB0cmVlICp0LCBjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJCSB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnBhdGhzcGVjWzJdOworCWJsYW1lX2ZpbGUgPSBwYXRobmFtZTsKKwlwYXRoc3BlY1swXSA9IHBhdGhuYW1lOworCXBhdGhzcGVjWzFdID0gTlVMTDsKKwltZW1zZXQoYmxvYl9zaGExLCAwLCBzaXplb2YoYmxvYl9zaGExKSk7CisJcmVhZF90cmVlX3JlY3Vyc2l2ZSh0LCAiIiwgMCwgMCwgcGF0aHNwZWMsIGdldF9ibG9iX3NoYTFfaW50ZXJuYWwpOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJaWYgKGJsb2Jfc2hhMVtpXSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gMjApCisJCXJldHVybiAtMTsKKworCW1lbWNweShzaGExLCBibG9iX3NoYTEsIDIwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYmxvYl9zaGExX2ludGVybmFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJhc2UsCisJCQkJICBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aG5hbWUsCisJCQkJICB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiBSRUFEX1RSRUVfUkVDVVJTSVZFOworCisJaWYgKHN0cm5jbXAoYmxhbWVfZmlsZSwgYmFzZSwgYmFzZWxlbikgfHwKKwkgICAgc3RyY21wKGJsYW1lX2ZpbGUgKyBiYXNlbGVuLCBwYXRobmFtZSkpCisJCXJldHVybiAtMTsKKworCW1lbWNweShibG9iX3NoYTEsIHNoYTEsIDIwKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9ibG9iKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvICppbmZvID0gY29tbWl0LT5vYmplY3QudXRpbDsKKwljaGFyIHR5cGVbMjBdOworCisJaWYgKGluZm8tPmJ1ZikKKwkJcmV0dXJuOworCisJaW5mby0+YnVmID0gcmVhZF9zaGExX2ZpbGUoaW5mby0+c2hhMSwgdHlwZSwgJmluZm8tPnNpemUpOworCisJYXNzZXJ0KCFzdHJjbXAodHlwZSwgYmxvYl90eXBlKSk7Cit9CisKKy8qIEZvciBkZWJ1Z2dpbmcgb25seSAqLworc3RhdGljIHZvaWQgcHJpbnRfcGF0Y2goc3RydWN0IHBhdGNoICpwKQoreworCWludCBpOworCXByaW50ZigiTnVtIGNodW5rczogJWRcbiIsIHAtPm51bSk7CisJZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKSB7CisJCXByaW50ZigiJWQsJWQgJWQsJWRcbiIsIHAtPmNodW5rc1tpXS5vZmYxLCBwLT5jaHVua3NbaV0ubGVuMSwKKwkJICAgICAgIHAtPmNodW5rc1tpXS5vZmYyLCBwLT5jaHVua3NbaV0ubGVuMik7CisJfQorfQorCisjaWYgREVCVUcKKy8qIEZvciBkZWJ1Z2dpbmcgb25seSAqLworc3RhdGljIHZvaWQgcHJpbnRfbWFwKHN0cnVjdCBjb21taXQgKmNtaXQsIHN0cnVjdCBjb21taXQgKm90aGVyKQoreworCXN0cnVjdCB1dGlsX2luZm8gKnV0aWwgPSBjbWl0LT5vYmplY3QudXRpbDsKKwlzdHJ1Y3QgdXRpbF9pbmZvICp1dGlsMiA9IG90aGVyLT5vYmplY3QudXRpbDsKKworCWludCBpOworCWludCBtYXggPQorCSAgICB1dGlsLT5udW1fbGluZXMgPgorCSAgICB1dGlsMi0+bnVtX2xpbmVzID8gdXRpbC0+bnVtX2xpbmVzIDogdXRpbDItPm51bV9saW5lczsKKwlpbnQgbnVtOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCXByaW50ZigiaTogJWQgIiwgaSk7CisJCW51bSA9IC0xOworCisJCWlmIChpIDwgdXRpbC0+bnVtX2xpbmVzKSB7CisJCQludW0gPSB1dGlsLT5saW5lX21hcFtpXTsKKwkJCXByaW50ZigiJWRcdCIsIG51bSk7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJcdCIpOworCisJCWlmIChpIDwgdXRpbDItPm51bV9saW5lcykgeworCQkJaW50IG51bTIgPSB1dGlsMi0+bGluZV9tYXBbaV07CisJCQlwcmludGYoIiVkXHQiLCBudW0yKTsKKwkJCWlmIChudW0gIT0gLTEgJiYgbnVtMiAhPSBudW0pCisJCQkJcHJpbnRmKCItLS0iKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIlx0Iik7CisKKwkJcHJpbnRmKCJcbiIpOworCX0KK30KKyNlbmRpZgorCisvLyBwIGlzIGEgcGF0Y2ggZnJvbSBjb21taXQgdG8gb3RoZXIuCitzdGF0aWMgdm9pZCBmaWxsX2xpbmVfbWFwKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqb3RoZXIsCisJCQkgIHN0cnVjdCBwYXRjaCAqcCkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvICp1dGlsID0gY29tbWl0LT5vYmplY3QudXRpbDsKKwlzdHJ1Y3QgdXRpbF9pbmZvICp1dGlsMiA9IG90aGVyLT5vYmplY3QudXRpbDsKKwlpbnQgKm1hcCA9IHV0aWwtPmxpbmVfbWFwOworCWludCAqbWFwMiA9IHV0aWwyLT5saW5lX21hcDsKKwlpbnQgY3VyX2NodW5rID0gMDsKKwlpbnQgaTEsIGkyOworCisJaWYgKHAtPm51bSAmJiBERUJVRykKKwkJcHJpbnRfcGF0Y2gocCk7CisKKwlpZiAoREVCVUcpCisJCXByaW50ZigibnVtIGxpbmVzIDE6ICVkIG51bSBsaW5lcyAyOiAlZFxuIiwgdXRpbC0+bnVtX2xpbmVzLAorCQkgICAgICAgdXRpbDItPm51bV9saW5lcyk7CisKKwlmb3IgKGkxID0gMCwgaTIgPSAwOyBpMSA8IHV0aWwtPm51bV9saW5lczsgaTErKywgaTIrKykgeworCQlzdHJ1Y3QgY2h1bmsgKmNodW5rID0gTlVMTDsKKwkJaWYgKGN1cl9jaHVuayA8IHAtPm51bSkKKwkJCWNodW5rID0gJnAtPmNodW5rc1tjdXJfY2h1bmtdOworCisJCWlmIChjaHVuayAmJiBjaHVuay0+b2ZmMSA9PSBpMSkgeworCQkJaWYgKERFQlVHICYmIGkyICE9IGNodW5rLT5vZmYyKQorCQkJCXByaW50ZigiaTI6ICVkIG9mZjI6ICVkXG4iLCBpMiwgY2h1bmstPm9mZjIpOworCisJCQlhc3NlcnQoaTIgPT0gY2h1bmstPm9mZjIpOworCisJCQlpMS0tOworCQkJaTItLTsKKwkJCWlmIChjaHVuay0+bGVuMSA+IDApCisJCQkJaTEgKz0gY2h1bmstPmxlbjE7CisKKwkJCWlmIChjaHVuay0+bGVuMiA+IDApCisJCQkJaTIgKz0gY2h1bmstPmxlbjI7CisKKwkJCWN1cl9jaHVuaysrOworCQl9IGVsc2UgeworCQkJaWYgKGkyID49IHV0aWwyLT5udW1fbGluZXMpCisJCQkJYnJlYWs7CisKKwkJCWlmIChtYXBbaTFdICE9IG1hcDJbaTJdICYmIG1hcFtpMV0gIT0gLTEpIHsKKwkJCQlpZiAoREVCVUcpCisJCQkJCXByaW50ZigibWFwOiBpMTogJWQgJWQgJXAgaTI6ICVkICVkICVwXG4iLAorCQkJCQkgICAgICAgaTEsIG1hcFtpMV0sCisJCQkJCSAgICAgICBpMSAhPSAtMSA/IGJsYW1lX2xpbmVzW21hcFtpMV1dIDogTlVMTCwKKwkJCQkJICAgICAgIGkyLCBtYXAyW2kyXSwKKwkJCQkJICAgICAgIGkyICE9IC0xID8gYmxhbWVfbGluZXNbbWFwMltpMl1dIDogTlVMTCk7CisJCQkJaWYgKG1hcDJbaTJdICE9IC0xICYmCisJCQkJICAgIGJsYW1lX2xpbmVzW21hcFtpMV1dICYmCisJCQkJICAgICFibGFtZV9saW5lc1ttYXAyW2kyXV0pCisJCQkJCW1hcFtpMV0gPSBtYXAyW2kyXTsKKwkJCX0KKworCQkJaWYgKG1hcFtpMV0gPT0gLTEgJiYgbWFwMltpMl0gIT0gLTEpCisJCQkJbWFwW2kxXSA9IG1hcDJbaTJdOworCQl9CisKKwkJaWYgKERFQlVHID4gMSkKKwkJCXByaW50ZigibDE6ICVkIGwyOiAlZCBpMTogJWQgaTI6ICVkXG4iLAorCQkJICAgICAgIG1hcFtpMV0sIG1hcDJbaTJdLCBpMSwgaTIpOworCX0KK30KKworc3RhdGljIGludCBtYXBfbGluZShzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBsaW5lKQoreworCXN0cnVjdCB1dGlsX2luZm8gKmluZm8gPSBjb21taXQtPm9iamVjdC51dGlsOworCWFzc2VydChsaW5lID49IDAgJiYgbGluZSA8IGluZm8tPm51bV9saW5lcyk7CisJcmV0dXJuIGluZm8tPmxpbmVfbWFwW2xpbmVdOworfQorCitzdGF0aWMgc3RydWN0IHV0aWxfaW5mbyogZ2V0X3V0aWwoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCB1dGlsX2luZm8gKnV0aWwgPSBjb21taXQtPm9iamVjdC51dGlsOworCisJaWYgKHV0aWwpCisJCXJldHVybiB1dGlsOworCisJdXRpbCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCB1dGlsX2luZm8pKTsKKwl1dGlsLT5idWYgPSBOVUxMOworCXV0aWwtPnNpemUgPSAwOworCXV0aWwtPmxpbmVfbWFwID0gTlVMTDsKKwl1dGlsLT5udW1fbGluZXMgPSAtMTsKKwl1dGlsLT5wYXRobmFtZSA9IE5VTEw7CisJY29tbWl0LT5vYmplY3QudXRpbCA9IHV0aWw7CisJcmV0dXJuIHV0aWw7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF91dGlsX2luZm8oc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCB1dGlsX2luZm8gKnV0aWwgPSBjb21taXQtPm9iamVjdC51dGlsOworCisJYXNzZXJ0KHV0aWwpOworCWFzc2VydCh1dGlsLT5wYXRobmFtZSk7CisKKwlpZiAoZ2V0X2Jsb2Jfc2hhMShjb21taXQtPnRyZWUsIHV0aWwtPnBhdGhuYW1lLCB1dGlsLT5zaGExKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWxsb2NfbGluZV9tYXAoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCB1dGlsX2luZm8gKnV0aWwgPSBjb21taXQtPm9iamVjdC51dGlsOworCWludCBpOworCisJaWYgKHV0aWwtPmxpbmVfbWFwKQorCQlyZXR1cm47CisKKwlnZXRfYmxvYihjb21taXQpOworCisJdXRpbC0+bnVtX2xpbmVzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdXRpbC0+c2l6ZTsgaSsrKSB7CisJCWlmICh1dGlsLT5idWZbaV0gPT0gJ1xuJykKKwkJCXV0aWwtPm51bV9saW5lcysrOworCX0KKwlpZih1dGlsLT5idWZbdXRpbC0+c2l6ZSAtIDFdICE9ICdcbicpCisJCXV0aWwtPm51bV9saW5lcysrOworCisJdXRpbC0+bGluZV9tYXAgPSB4bWFsbG9jKHNpemVvZihpbnQpICogdXRpbC0+bnVtX2xpbmVzKTsKKworCWZvciAoaSA9IDA7IGkgPCB1dGlsLT5udW1fbGluZXM7IGkrKykKKwkJdXRpbC0+bGluZV9tYXBbaV0gPSAtMTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9maXJzdF9jb21taXQoc3RydWN0IGNvbW1pdCogY29tbWl0LCBjb25zdCBjaGFyKiBmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvKiB1dGlsID0gY29tbWl0LT5vYmplY3QudXRpbDsKKwlpbnQgaTsKKworCXV0aWwtPnBhdGhuYW1lID0gZmlsZW5hbWU7CisJaWYgKGZpbGxfdXRpbF9pbmZvKGNvbW1pdCkpCisJCWRpZSgiZmlsbF91dGlsX2luZm8gZmFpbGVkIik7CisKKwlhbGxvY19saW5lX21hcChjb21taXQpOworCisJdXRpbCA9IGNvbW1pdC0+b2JqZWN0LnV0aWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXRpbC0+bnVtX2xpbmVzOyBpKyspCisJCXV0aWwtPmxpbmVfbWFwW2ldID0gaTsKK30KKworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NvbW1pdHMoc3RydWN0IHJldl9pbmZvICpyZXYsIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgICAgc3RydWN0IGNvbW1pdCoqIGluaXRpYWwpCit7CisJaW50IGk7CisJc3RydWN0IHV0aWxfaW5mbyogdXRpbDsKKwlpbnQgbGluZXNfbGVmdDsKKwlpbnQgKmJsYW1lX3A7CisJaW50ICpuZXdfbGluZXM7CisJaW50IG5ld19saW5lc19sZW47CisKKwlzdHJ1Y3QgY29tbWl0KiBjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2KTsKKwlhc3NlcnQoY29tbWl0KTsKKwlpbml0X2ZpcnN0X2NvbW1pdChjb21taXQsIHBhdGgpOworCisJdXRpbCA9IGNvbW1pdC0+b2JqZWN0LnV0aWw7CisJbnVtX2JsYW1lX2xpbmVzID0gdXRpbC0+bnVtX2xpbmVzOworCWJsYW1lX2xpbmVzID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1pdCAqKSAqIG51bV9ibGFtZV9saW5lcyk7CisJYmxhbWVfY29udGVudHMgPSB1dGlsLT5idWY7CisJYmxhbWVfbGVuID0gdXRpbC0+c2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxhbWVfbGluZXM7IGkrKykKKwkJYmxhbWVfbGluZXNbaV0gPSBOVUxMOworCisJbGluZXNfbGVmdCA9IG51bV9ibGFtZV9saW5lczsKKwlibGFtZV9wID0geG1hbGxvYyhzaXplb2YoaW50KSAqIG51bV9ibGFtZV9saW5lcyk7CisJbmV3X2xpbmVzID0geG1hbGxvYyhzaXplb2YoaW50KSAqIG51bV9ibGFtZV9saW5lcyk7CisJZG8geworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCWludCBudW1fcGFyZW50czsKKwkJc3RydWN0IHV0aWxfaW5mbyAqdXRpbDsKKworCQlpZiAoREVCVUcpCisJCQlwcmludGYoIlxuUHJvY2Vzc2luZyBjb21taXQ6ICVkICVzXG4iLCBudW1fY29tbWl0cywKKwkJCSAgICAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisKKwkJaWYgKGxpbmVzX2xlZnQgPT0gMCkKKwkJCXJldHVybjsKKworCQludW1fY29tbWl0cysrOworCQltZW1zZXQoYmxhbWVfcCwgMCwgc2l6ZW9mKGludCkgKiBudW1fYmxhbWVfbGluZXMpOworCQluZXdfbGluZXNfbGVuID0gMDsKKwkJbnVtX3BhcmVudHMgPSAwOworCQlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCSAgICAgcGFyZW50cyAhPSBOVUxMOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkKKwkJCW51bV9wYXJlbnRzKys7CisKKwkJaWYobnVtX3BhcmVudHMgPT0gMCkKKwkJCSppbml0aWFsID0gY29tbWl0OworCisJCWlmIChmaWxsX3V0aWxfaW5mbyhjb21taXQpKQorCQkJY29udGludWU7CisKKwkJYWxsb2NfbGluZV9tYXAoY29tbWl0KTsKKwkJdXRpbCA9IGNvbW1pdC0+b2JqZWN0LnV0aWw7CisKKwkJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQkgICAgIHBhcmVudHMgIT0gTlVMTDsgcGFyZW50cyA9IHBhcmVudHMtPm5leHQpIHsKKwkJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisJCQlzdHJ1Y3QgcGF0Y2ggKnBhdGNoOworCisJCQlpZiAocGFyc2VfY29tbWl0KHBhcmVudCkgPCAwKQorCQkJCWRpZSgicGFyc2VfY29tbWl0IGVycm9yIik7CisKKwkJCWlmIChERUJVRykKKwkJCQlwcmludGYoInBhcmVudDogJXNcbiIsCisJCQkJICAgICAgIHNoYTFfdG9faGV4KHBhcmVudC0+b2JqZWN0LnNoYTEpKTsKKworCQkJaWYgKGZpbGxfdXRpbF9pbmZvKHBhcmVudCkpIHsKKwkJCQludW1fcGFyZW50cy0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwYXRjaCA9IGdldF9wYXRjaChwYXJlbnQsIGNvbW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19saW5lX21hcChwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9saW5lX21hcChwYXJlbnQsIGNvbW1pdCwgcGF0Y2gpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2gtPm51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IHBhdGNoLT5jaHVua3NbaV0ubGVuMjsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXBwZWRfbGluZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfbGluZShjb21taXQsIHBhdGNoLT5jaHVua3NbaV0ub2ZmMiArIGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkX2xpbmUgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW1lX3BbbWFwcGVkX2xpbmVdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxhbWVfcFttYXBwZWRfbGluZV0gPT0gbnVtX3BhcmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmVzW25ld19saW5lc19sZW4rK10gPSBtYXBwZWRfbGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGF0Y2gocGF0Y2gpOworCQl9CisKKwkJaWYgKERFQlVHKQorCQkJcHJpbnRmKCJwYXJlbnRzOiAlZFxuIiwgbnVtX3BhcmVudHMpOworCisJCWZvciAoaSA9IDA7IGkgPCBuZXdfbGluZXNfbGVuOyBpKyspIHsKKwkJCWludCBtYXBwZWRfbGluZSA9IG5ld19saW5lc1tpXTsKKwkJCWlmIChibGFtZV9saW5lc1ttYXBwZWRfbGluZV0gPT0gTlVMTCkgeworCQkJCWJsYW1lX2xpbmVzW21hcHBlZF9saW5lXSA9IGNvbW1pdDsKKwkJCQlsaW5lc19sZWZ0LS07CisJCQkJaWYgKERFQlVHKQorCQkJCQlwcmludGYoImJsYW1lOiBtYXBwZWQ6ICVkIGk6ICVkXG4iLAorCQkJCQkgICAgICAgbWFwcGVkX2xpbmUsIGkpOworCQkJfQorCQl9CisJfSB3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbihyZXYpKSAhPSBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IGNvbXBhcmVfdHJlZV9wYXRoKHN0cnVjdCByZXZfaW5mbyogcmV2cywKKwkJCSAgICAgc3RydWN0IGNvbW1pdCogYzEsIHN0cnVjdCBjb21taXQqIGMyKQoreworCWludCByZXQ7CisJY29uc3QgY2hhciogcGF0aHNbMl07CisJc3RydWN0IHV0aWxfaW5mbyogdXRpbCA9IGMyLT5vYmplY3QudXRpbDsKKwlwYXRoc1swXSA9IHV0aWwtPnBhdGhuYW1lOworCXBhdGhzWzFdID0gTlVMTDsKKworCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhnZXRfcGF0aHNwZWMocmV2cy0+cHJlZml4LCBwYXRocyksCisJCQkgICAgICAmcmV2cy0+cHJ1bmluZyk7CisJcmV0ID0gcmV2X2NvbXBhcmVfdHJlZShyZXZzLCBjMS0+dHJlZSwgYzItPnRyZWUpOworCWRpZmZfdHJlZV9yZWxlYXNlX3BhdGhzKCZyZXZzLT5wcnVuaW5nKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgc2FtZV90cmVlX2FzX2VtcHR5X3BhdGgoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgdHJlZSogdDEsCisJCQkJICAgY29uc3QgY2hhciogcGF0aCkKK3sKKwlpbnQgcmV0OworCWNvbnN0IGNoYXIqIHBhdGhzWzJdOworCXBhdGhzWzBdID0gcGF0aDsKKwlwYXRoc1sxXSA9IE5VTEw7CisKKwlkaWZmX3RyZWVfc2V0dXBfcGF0aHMoZ2V0X3BhdGhzcGVjKHJldnMtPnByZWZpeCwgcGF0aHMpLAorCQkJICAgICAgJnJldnMtPnBydW5pbmcpOworCXJldCA9IHJldl9zYW1lX3RyZWVfYXNfZW1wdHkocmV2cywgdDEpOworCWRpZmZfdHJlZV9yZWxlYXNlX3BhdGhzKCZyZXZzLT5wcnVuaW5nKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciogZmluZF9yZW5hbWUoc3RydWN0IGNvbW1pdCogY29tbWl0LCBzdHJ1Y3QgY29tbWl0KiBwYXJlbnQpCit7CisJc3RydWN0IHV0aWxfaW5mbyogY3V0aWwgPSBjb21taXQtPm9iamVjdC51dGlsOworCXN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZl9vcHRzOworCWNvbnN0IGNoYXIgKnBhdGhzWzFdOworCWludCBpOworCisJaWYgKERFQlVHKSB7CisJCXByaW50ZigiZmluZF9yZW5hbWUgY29tbWl0OiAlcyAiLAorCQkgICAgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQlwdXRzKHNoYTFfdG9faGV4KHBhcmVudC0+b2JqZWN0LnNoYTEpKTsKKwl9CisKKwlkaWZmX3NldHVwKCZkaWZmX29wdHMpOworCWRpZmZfb3B0cy5yZWN1cnNpdmUgPSAxOworCWRpZmZfb3B0cy5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCXBhdGhzWzBdID0gTlVMTDsKKwlkaWZmX3RyZWVfc2V0dXBfcGF0aHMocGF0aHMsICZkaWZmX29wdHMpOworCWlmIChkaWZmX3NldHVwX2RvbmUoJmRpZmZfb3B0cykgPCAwKQorCQlkaWUoImRpZmZfc2V0dXBfZG9uZSBmYWlsZWQiKTsKKworCWRpZmZfdHJlZV9zaGExKGNvbW1pdC0+dHJlZS0+b2JqZWN0LnNoYTEsIHBhcmVudC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCSAgICAgICAiIiwgJmRpZmZfb3B0cyk7CisJZGlmZmNvcmVfc3RkKCZkaWZmX29wdHMpOworCisJZm9yIChpID0gMDsgaSA8IGRpZmZfcXVldWVkX2RpZmYubnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IGRpZmZfcXVldWVkX2RpZmYucXVldWVbaV07CisKKwkJaWYgKHAtPnN0YXR1cyA9PSAnUicgJiYgIXN0cmNtcChwLT5vbmUtPnBhdGgsIGN1dGlsLT5wYXRobmFtZSkpIHsKKwkJCWlmIChERUJVRykKKwkJCQlwcmludGYoInJlbmFtZSAlcyAtPiAlc1xuIiwgcC0+b25lLT5wYXRoLCBwLT50d28tPnBhdGgpOworCQkJcmV0dXJuIHAtPnR3by0+cGF0aDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaW1wbGlmeV9jb21taXQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAsICpwYXJlbnQ7CisKKwlpZiAoIWNvbW1pdC0+dHJlZSkKKwkJcmV0dXJuOworCisJaWYgKCFjb21taXQtPnBhcmVudHMpIHsKKwkJc3RydWN0IHV0aWxfaW5mbyogdXRpbCA9IGNvbW1pdC0+b2JqZWN0LnV0aWw7CisJCWlmICghc2FtZV90cmVlX2FzX2VtcHR5X3BhdGgocmV2cywgY29tbWl0LT50cmVlLAorCQkJCQkgICAgIHV0aWwtPnBhdGhuYW1lKSkKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRSRUVDSEFOR0U7CisJCXJldHVybjsKKwl9CisKKwlwcCA9ICZjb21taXQtPnBhcmVudHM7CisJd2hpbGUgKChwYXJlbnQgPSAqcHApICE9IE5VTEwpIHsKKwkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKworCQlpZiAocC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJcHAgPSAmcGFyZW50LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQlwYXJzZV9jb21taXQocCk7CisJCXN3aXRjaCAoY29tcGFyZV90cmVlX3BhdGgocmV2cywgcCwgY29tbWl0KSkgeworCQljYXNlIFJFVl9UUkVFX1NBTUU6CisJCQlwYXJlbnQtPm5leHQgPSBOVUxMOworCQkJY29tbWl0LT5wYXJlbnRzID0gcGFyZW50OworCQkJZ2V0X3V0aWwocCktPnBhdGhuYW1lID0gZ2V0X3V0aWwoY29tbWl0KS0+cGF0aG5hbWU7CisJCQlyZXR1cm47CisKKwkJY2FzZSBSRVZfVFJFRV9ORVc6CisJCXsKKworCQkJc3RydWN0IHV0aWxfaW5mbyogdXRpbCA9IGNvbW1pdC0+b2JqZWN0LnV0aWw7CisJCQlpZiAocmV2cy0+cmVtb3ZlX2VtcHR5X3RyZWVzICYmCisJCQkgICAgc2FtZV90cmVlX2FzX2VtcHR5X3BhdGgocmV2cywgcC0+dHJlZSwKKwkJCQkJCSAgICB1dGlsLT5wYXRobmFtZSkpIHsKKwkJCQljb25zdCBjaGFyKiBuZXdfbmFtZSA9IGZpbmRfcmVuYW1lKGNvbW1pdCwgcCk7CisJCQkJaWYgKG5ld19uYW1lKSB7CisJCQkJCXN0cnVjdCB1dGlsX2luZm8qIHB1dGlsID0gZ2V0X3V0aWwocCk7CisJCQkJCWlmICghcHV0aWwtPnBhdGhuYW1lKQorCQkJCQkJcHV0aWwtPnBhdGhuYW1lID0gc3RyZHVwKG5ld19uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQkqcHAgPSBwYXJlbnQtPm5leHQ7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgUkVWX1RSRUVfRElGRkVSRU5UOgorCQkJcHAgPSAmcGFyZW50LT5uZXh0OworCQkJaWYgKCFnZXRfdXRpbChwKS0+cGF0aG5hbWUpCisJCQkJZ2V0X3V0aWwocCktPnBhdGhuYW1lID0KKwkJCQkJZ2V0X3V0aWwoY29tbWl0KS0+cGF0aG5hbWU7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoImJhZCB0cmVlIGNvbXBhcmUgZm9yIGNvbW1pdCAlcyIsCisJCSAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJfQorCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRSRUVDSEFOR0U7Cit9CisKKworc3RydWN0IGNvbW1pdF9pbmZvCit7CisJY2hhciogYXV0aG9yOworCWNoYXIqIGF1dGhvcl9tYWlsOworCXVuc2lnbmVkIGxvbmcgYXV0aG9yX3RpbWU7CisJY2hhciogYXV0aG9yX3R6OworfTsKKworc3RhdGljIHZvaWQgZ2V0X2NvbW1pdF9pbmZvKHN0cnVjdCBjb21taXQqIGNvbW1pdCwgc3RydWN0IGNvbW1pdF9pbmZvKiByZXQpCit7CisJaW50IGxlbjsKKwljaGFyKiB0bXA7CisJc3RhdGljIGNoYXIgYXV0aG9yX2J1ZlsxMDI0XTsKKworCXRtcCA9IHN0cnN0cihjb21taXQtPmJ1ZmZlciwgIlxuYXV0aG9yICIpICsgODsKKwlsZW4gPSBzdHJjaHIodG1wLCAnXG4nKSAtIHRtcDsKKwlyZXQtPmF1dGhvciA9IGF1dGhvcl9idWY7CisJbWVtY3B5KHJldC0+YXV0aG9yLCB0bXAsIGxlbik7CisKKwl0bXAgPSByZXQtPmF1dGhvcjsKKwl0bXAgKz0gbGVuOworCSp0bXAgPSAwOworCXdoaWxlKCp0bXAgIT0gJyAnKQorCQl0bXAtLTsKKwlyZXQtPmF1dGhvcl90eiA9IHRtcCsxOworCisJKnRtcCA9IDA7CisJd2hpbGUoKnRtcCAhPSAnICcpCisJCXRtcC0tOworCXJldC0+YXV0aG9yX3RpbWUgPSBzdHJ0b3VsKHRtcCwgTlVMTCwgMTApOworCisJKnRtcCA9IDA7CisJd2hpbGUoKnRtcCAhPSAnICcpCisJCXRtcC0tOworCXJldC0+YXV0aG9yX21haWwgPSB0bXAgKyAxOworCisJKnRtcCA9IDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBmb3JtYXRfdGltZSh1bnNpZ25lZCBsb25nIHRpbWUsIGNvbnN0IGNoYXIqIHR6X3N0cikKK3sKKwlzdGF0aWMgY2hhciB0aW1lX2J1ZlsxMjhdOworCXRpbWVfdCB0ID0gdGltZTsKKwlpbnQgbWludXRlcywgdHo7CisJc3RydWN0IHRtICp0bTsKKworCXR6ID0gYXRvaSh0el9zdHIpOworCW1pbnV0ZXMgPSB0eiA8IDAgPyAtdHogOiB0ejsKKwltaW51dGVzID0gKG1pbnV0ZXMgLyAxMDApKjYwICsgKG1pbnV0ZXMgJSAxMDApOworCW1pbnV0ZXMgPSB0eiA8IDAgPyAtbWludXRlcyA6IG1pbnV0ZXM7CisJdCA9IHRpbWUgKyBtaW51dGVzICogNjA7CisJdG0gPSBnbXRpbWUoJnQpOworCisJc3RyZnRpbWUodGltZV9idWYsIHNpemVvZih0aW1lX2J1ZiksICIlWS0lbS0lZCAlSDolTTolUyAiLCB0bSk7CisJc3RyY2F0KHRpbWVfYnVmLCB0el9zdHIpOworCXJldHVybiB0aW1lX2J1ZjsKK30KKworc3RhdGljIHZvaWQgdG9wb19zZXR0ZXIoc3RydWN0IGNvbW1pdCogYywgdm9pZCogZGF0YSkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvKiB1dGlsID0gYy0+b2JqZWN0LnV0aWw7CisJdXRpbC0+dG9wb19kYXRhID0gZGF0YTsKK30KKworc3RhdGljIHZvaWQqIHRvcG9fZ2V0dGVyKHN0cnVjdCBjb21taXQqIGMpCit7CisJc3RydWN0IHV0aWxfaW5mbyogdXRpbCA9IGMtPm9iamVjdC51dGlsOworCXJldHVybiB1dGlsLT50b3BvX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9hbmNlc3RyeShjb25zdCBjaGFyICpncmFmdF9maWxlLAorCQkJIHVuc2lnbmVkIGNoYXIgKipzdGFydF9zaGExKQoreworCUZJTEUgKmZwID0gZm9wZW4oZ3JhZnRfZmlsZSwgInIiKTsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQkvKiBUaGUgZm9ybWF0IGlzIGp1c3QgIkNvbW1pdCBQYXJlbnQxIFBhcmVudDIgLi4uXG4iICovCisJCWludCBsZW4gPSBzdHJsZW4oYnVmKTsKKwkJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPSByZWFkX2dyYWZ0X2xpbmUoYnVmLCBsZW4pOworCQlyZWdpc3Rlcl9jb21taXRfZ3JhZnQoZ3JhZnQsIDApOworCQlpZiAoISpzdGFydF9zaGExKQorCQkJKnN0YXJ0X3NoYTEgPSBncmFmdC0+c2hhMTsKKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBpOworCXN0cnVjdCBjb21taXQgKmluaXRpYWwgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF0sICpzaGExX3AgPSBOVUxMOworCisJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBOVUxMLCAqY29tbWl0ID0gTlVMTDsKKwljaGFyIGZpbGVuYW1lX2J1ZlsyNTZdOworCWludCBzaGExX2xlbiA9IDg7CisJaW50IGNvbXBhYmlsaXR5ID0gMDsKKwlpbnQgb3B0aW9ucyA9IDE7CisJc3RydWN0IGNvbW1pdCogc3RhcnRfY29tbWl0OworCisJY29uc3QgY2hhciogYXJnc1sxMF07CisJc3RydWN0IHJldl9pbmZvIHJldjsKKworCXN0cnVjdCBjb21taXRfaW5mbyBjaTsKKwljb25zdCBjaGFyICpidWY7CisJaW50IG1heF9kaWdpdHM7CisJaW50IGxvbmdlc3RfZmlsZSwgbG9uZ2VzdF9hdXRob3I7CisJaW50IGZvdW5kX3JlbmFtZTsKKworCWNvbnN0IGNoYXIqIHByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlmb3IoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYob3B0aW9ucykgeworCQkJaWYoIXN0cmNtcChhcmd2W2ldLCAiLWgiKSB8fAorCQkJICAgIXN0cmNtcChhcmd2W2ldLCAiLS1oZWxwIikpCisJCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCQkJZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItbCIpIHx8CisJCQkJIXN0cmNtcChhcmd2W2ldLCAiLS1sb25nIikpIHsKKwkJCQlzaGExX2xlbiA9IDQwOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmKCFzdHJjbXAoYXJndltpXSwgIi1jIikgfHwKKwkJCQkgICFzdHJjbXAoYXJndltpXSwgIi0tY29tcGFiaWxpdHkiKSkgeworCQkJCWNvbXBhYmlsaXR5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItUyIpKSB7CisJCQkJaWYgKGkgKyAxIDwgYXJnYyAmJgorCQkJCSAgICAhcmVhZF9hbmNlc3RyeShhcmd2W2kgKyAxXSwgJnNoYTFfcCkpIHsKKwkJCQkJY29tcGFiaWxpdHkgPSAxOworCQkJCQlpKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQl1c2FnZShibGFtZV91c2FnZSk7CisJCQl9IGVsc2UgaWYoIXN0cmNtcChhcmd2W2ldLCAiLS0iKSkgeworCQkJCW9wdGlvbnMgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmKGFyZ3ZbaV1bMF0gPT0gJy0nKQorCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJCWVsc2UKKwkJCQlvcHRpb25zID0gMDsKKwkJfQorCisJCWlmKCFvcHRpb25zKSB7CisJCQlpZighZmlsZW5hbWUpCisJCQkJZmlsZW5hbWUgPSBhcmd2W2ldOworCQkJZWxzZSBpZighY29tbWl0KQorCQkJCWNvbW1pdCA9IGFyZ3ZbaV07CisJCQllbHNlCisJCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCQl9CisJfQorCisJaWYoIWZpbGVuYW1lKQorCQl1c2FnZShibGFtZV91c2FnZSk7CisJaWYgKGNvbW1pdCAmJiBzaGExX3ApCisJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwllbHNlIGlmKCFjb21taXQpCisJCWNvbW1pdCA9ICJIRUFEIjsKKworCWlmKHByZWZpeCkKKwkJc3ByaW50ZihmaWxlbmFtZV9idWYsICIlcyVzIiwgcHJlZml4LCBmaWxlbmFtZSk7CisJZWxzZQorCQlzdHJjcHkoZmlsZW5hbWVfYnVmLCBmaWxlbmFtZSk7CisJZmlsZW5hbWUgPSBmaWxlbmFtZV9idWY7CisKKwlpZiAoIXNoYTFfcCkgeworCQlpZiAoZ2V0X3NoYTEoY29tbWl0LCBzaGExKSkKKwkJCWRpZSgiZ2V0X3NoYTEgZmFpbGVkLCBjb21taXQgJyVzJyBub3QgZm91bmQiLCBjb21taXQpOworCQlzaGExX3AgPSBzaGExOworCX0KKwlzdGFydF9jb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExX3ApOworCWdldF91dGlsKHN0YXJ0X2NvbW1pdCktPnBhdGhuYW1lID0gZmlsZW5hbWU7CisJaWYgKGZpbGxfdXRpbF9pbmZvKHN0YXJ0X2NvbW1pdCkpIHsKKwkJcHJpbnRmKCIlcyBub3QgZm91bmQgaW4gJXNcbiIsIGZpbGVuYW1lLCBjb21taXQpOworCQlyZXR1cm4gMTsKKwl9CisKKworCWluaXRfcmV2aXNpb25zKCZyZXYpOworCXJldi5yZW1vdmVfZW1wdHlfdHJlZXMgPSAxOworCXJldi50b3BvX29yZGVyID0gMTsKKwlyZXYucHJ1bmVfZm4gPSBzaW1wbGlmeV9jb21taXQ7CisJcmV2LnRvcG9fc2V0dGVyID0gdG9wb19zZXR0ZXI7CisJcmV2LnRvcG9fZ2V0dGVyID0gdG9wb19nZXR0ZXI7CisJcmV2LnBhcmVudHMgPSAxOworCXJldi5saW1pdGVkID0gMTsKKworCWNvbW1pdF9saXN0X2luc2VydChzdGFydF9jb21taXQsICZyZXYuY29tbWl0cyk7CisKKwlhcmdzWzBdID0gZmlsZW5hbWU7CisJYXJnc1sxXSA9IE5VTEw7CisJZGlmZl90cmVlX3NldHVwX3BhdGhzKGFyZ3MsICZyZXYucHJ1bmluZyk7CisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXYpOworCXByb2Nlc3NfY29tbWl0cygmcmV2LCBmaWxlbmFtZSwgJmluaXRpYWwpOworCisJYnVmID0gYmxhbWVfY29udGVudHM7CisJZm9yIChtYXhfZGlnaXRzID0gMSwgaSA9IDEwOyBpIDw9IG51bV9ibGFtZV9saW5lcyArIDE7IG1heF9kaWdpdHMrKykKKwkJaSAqPSAxMDsKKworCWxvbmdlc3RfZmlsZSA9IDA7CisJbG9uZ2VzdF9hdXRob3IgPSAwOworCWZvdW5kX3JlbmFtZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9ibGFtZV9saW5lczsgaSsrKSB7CisJCXN0cnVjdCBjb21taXQgKmMgPSBibGFtZV9saW5lc1tpXTsKKwkJc3RydWN0IHV0aWxfaW5mbyogdTsKKwkJaWYgKCFjKQorCQkJYyA9IGluaXRpYWw7CisJCXUgPSBjLT5vYmplY3QudXRpbDsKKworCQlpZiAoIWZvdW5kX3JlbmFtZSAmJiBzdHJjbXAoZmlsZW5hbWUsIHUtPnBhdGhuYW1lKSkKKwkJCWZvdW5kX3JlbmFtZSA9IDE7CisJCWlmIChsb25nZXN0X2ZpbGUgPCBzdHJsZW4odS0+cGF0aG5hbWUpKQorCQkJbG9uZ2VzdF9maWxlID0gc3RybGVuKHUtPnBhdGhuYW1lKTsKKwkJZ2V0X2NvbW1pdF9pbmZvKGMsICZjaSk7CisJCWlmIChsb25nZXN0X2F1dGhvciA8IHN0cmxlbihjaS5hdXRob3IpKQorCQkJbG9uZ2VzdF9hdXRob3IgPSBzdHJsZW4oY2kuYXV0aG9yKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2JsYW1lX2xpbmVzOyBpKyspIHsKKwkJc3RydWN0IGNvbW1pdCAqYyA9IGJsYW1lX2xpbmVzW2ldOworCQlzdHJ1Y3QgdXRpbF9pbmZvKiB1OworCisJCWlmICghYykKKwkJCWMgPSBpbml0aWFsOworCisJCXUgPSBjLT5vYmplY3QudXRpbDsKKwkJZ2V0X2NvbW1pdF9pbmZvKGMsICZjaSk7CisJCWZ3cml0ZShzaGExX3RvX2hleChjLT5vYmplY3Quc2hhMSksIHNoYTFfbGVuLCAxLCBzdGRvdXQpOworCQlpZihjb21wYWJpbGl0eSkgeworCQkJcHJpbnRmKCJcdCglMTBzXHQlMTBzXHQlZCkiLCBjaS5hdXRob3IsCisJCQkgICAgICAgZm9ybWF0X3RpbWUoY2kuYXV0aG9yX3RpbWUsIGNpLmF1dGhvcl90eiksIGkrMSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZm91bmRfcmVuYW1lKQorCQkJCXByaW50ZigiICUtKi4qcyIsIGxvbmdlc3RfZmlsZSwgbG9uZ2VzdF9maWxlLAorCQkJCSAgICAgICB1LT5wYXRobmFtZSk7CisJCQlwcmludGYoIiAoJS0qLipzICUxMHMgJSpkKSAiLAorCQkJICAgICAgIGxvbmdlc3RfYXV0aG9yLCBsb25nZXN0X2F1dGhvciwgY2kuYXV0aG9yLAorCQkJICAgICAgIGZvcm1hdF90aW1lKGNpLmF1dGhvcl90aW1lLCBjaS5hdXRob3JfdHopLAorCQkJICAgICAgIG1heF9kaWdpdHMsIGkrMSk7CisJCX0KKworCQlpZihpID09IG51bV9ibGFtZV9saW5lcyAtIDEpIHsKKwkJCWZ3cml0ZShidWYsIGJsYW1lX2xlbiAtIChidWYgLSBibGFtZV9jb250ZW50cyksCisJCQkgICAgICAgMSwgc3Rkb3V0KTsKKwkJCWlmKGJsYW1lX2NvbnRlbnRzW2JsYW1lX2xlbi0xXSAhPSAnXG4nKQorCQkJCXB1dGMoJ1xuJywgc3Rkb3V0KTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIqIG5leHRfYnVmID0gc3RyY2hyKGJ1ZiwgJ1xuJykgKyAxOworCQkJZndyaXRlKGJ1ZiwgbmV4dF9idWYgLSBidWYsIDEsIHN0ZG91dCk7CisJCQlidWYgPSBuZXh0X2J1ZjsKKwkJfQorCX0KKworCWlmIChERUJVRykgeworCQlwcmludGYoIm51bSBnZXQgcGF0Y2g6ICVkXG4iLCBudW1fZ2V0X3BhdGNoKTsKKwkJcHJpbnRmKCJudW0gY29tbWl0czogJWRcbiIsIG51bV9jb21taXRzKTsKKwkJcHJpbnRmKCJwYXRjaCB0aW1lOiAlZlxuIiwgcGF0Y2hfdGltZSAvIDEwMDAwMDAuMCk7CisJCXByaW50ZigiaW5pdGlhbDogJXNcbiIsIHNoYTFfdG9faGV4KGluaXRpYWwtPm9iamVjdC5zaGExKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ibG9iLmMgYi9ibG9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmZGQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2Jsb2IuYwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2NvbnN0IGNoYXIgKmJsb2JfdHlwZSA9ICJibG9iIjsKKworc3RydWN0IGJsb2IgKmxvb2t1cF9ibG9iKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikgeworCQlzdHJ1Y3QgYmxvYiAqcmV0ID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGJsb2IpKTsKKwkJY3JlYXRlZF9vYmplY3Qoc2hhMSwgJnJldC0+b2JqZWN0KTsKKwkJcmV0LT5vYmplY3QudHlwZSA9IGJsb2JfdHlwZTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCFvYmotPnR5cGUpCisJCW9iai0+dHlwZSA9IGJsb2JfdHlwZTsKKwlpZiAob2JqLT50eXBlICE9IGJsb2JfdHlwZSkgeworCQllcnJvcigiT2JqZWN0ICVzIGlzIGEgJXMsIG5vdCBhIGJsb2IiLCAKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSksIG9iai0+dHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHN0cnVjdCBibG9iICopIG9iajsKK30KKworaW50IHBhcnNlX2Jsb2JfYnVmZmVyKHN0cnVjdCBibG9iICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpdGVtLT5vYmplY3QucGFyc2VkID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2Jsb2Ioc3RydWN0IGJsb2IgKml0ZW0pCit7CisgICAgICAgIGNoYXIgdHlwZVsyMF07CisgICAgICAgIHZvaWQgKmJ1ZmZlcjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQ7CisKKyAgICAgICAgaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKGl0ZW0tPm9iamVjdC5zaGExLCB0eXBlLCAmc2l6ZSk7CisgICAgICAgIGlmICghYnVmZmVyKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworICAgICAgICBpZiAoc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKCJPYmplY3QgJXMgbm90IGEgYmxvYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJcmV0ID0gcGFyc2VfYmxvYl9idWZmZXIoaXRlbSwgYnVmZmVyLCBzaXplKTsKKwlmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2Jsb2IuaCBiL2Jsb2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTVkOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmxvYi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgQkxPQl9ICisjZGVmaW5lIEJMT0JfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK2V4dGVybiBjb25zdCBjaGFyICpibG9iX3R5cGU7CisKK3N0cnVjdCBibG9iIHsKKwlzdHJ1Y3Qgb2JqZWN0IG9iamVjdDsKK307CisKK3N0cnVjdCBibG9iICpsb29rdXBfYmxvYihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworaW50IHBhcnNlX2Jsb2JfYnVmZmVyKHN0cnVjdCBibG9iICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK2ludCBwYXJzZV9ibG9iKHN0cnVjdCBibG9iICppdGVtKTsKKworI2VuZGlmIC8qIEJMT0JfSCAqLwpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1hZGQuYyBiL2J1aWx0aW4tYWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiYmIxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tYWRkLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiAiZ2l0IGFkZCIgYnVpbHRpbiBjb21tYW5kCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExpbnVzIFRvcnZhbGRzCisgKi8KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGJ1aWx0aW5fYWRkX3VzYWdlW10gPQorImdpdC1hZGQgWy1uXSBbLXZdIDxmaWxlcGF0dGVybj4uLi4iOworCitzdGF0aWMgdm9pZCBwcnVuZV9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqKnBhdGhzcGVjLCBpbnQgcHJlZml4KQoreworCWNoYXIgKnNlZW47CisJaW50IGksIHNwZWNzOworCXN0cnVjdCBkaXJfZW50cnkgKipzcmMsICoqZHN0OworCisJZm9yIChzcGVjcyA9IDA7IHBhdGhzcGVjW3NwZWNzXTsgIHNwZWNzKyspCisJCS8qIG5vdGhpbmcgKi87CisJc2VlbiA9IHhtYWxsb2Moc3BlY3MpOworCW1lbXNldChzZWVuLCAwLCBzcGVjcyk7CisKKwlzcmMgPSBkc3QgPSBkaXItPmVudHJpZXM7CisJaSA9IGRpci0+bnI7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXN0cnVjdCBkaXJfZW50cnkgKmVudHJ5ID0gKnNyYysrOworCQlpZiAoIW1hdGNoX3BhdGhzcGVjKHBhdGhzcGVjLCBlbnRyeS0+bmFtZSwgZW50cnktPmxlbiwgcHJlZml4LCBzZWVuKSkgeworCQkJZnJlZShlbnRyeSk7CisJCQljb250aW51ZTsKKwkJfQorCQkqZHN0KysgPSBlbnRyeTsKKwl9CisJZGlyLT5uciA9IGRzdCAtIGRpci0+ZW50cmllczsKKworCWZvciAoaSA9IDA7IGkgPCBzcGVjczsgaSsrKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQljb25zdCBjaGFyICptYXRjaDsKKwkJaWYgKHNlZW5baV0pCisJCQljb250aW51ZTsKKworCQkvKiBFeGlzdGluZyBmaWxlPyBXZSBtdXN0IGhhdmUgaWdub3JlZCBpdCAqLworCQltYXRjaCA9IHBhdGhzcGVjW2ldOworCQlpZiAoIW1hdGNoWzBdIHx8ICFsc3RhdChtYXRjaCwgJnN0KSkKKwkJCWNvbnRpbnVlOworCQlkaWUoInBhdGhzcGVjICclcycgZGlkIG5vdCBtYXRjaCBhbnkgZmlsZXMiLCBtYXRjaCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqcGF0aCwgKmJhc2U7CisJaW50IGJhc2VsZW47CisKKwkvKiBTZXQgdXAgdGhlIGRlZmF1bHQgZ2l0IHBvcmNlbGFpbiBleGNsdWRlcyAqLworCW1lbXNldChkaXIsIDAsIHNpemVvZigqZGlyKSk7CisJZGlyLT5leGNsdWRlX3Blcl9kaXIgPSAiLmdpdGlnbm9yZSI7CisJcGF0aCA9IGdpdF9wYXRoKCJpbmZvL2V4Y2x1ZGUiKTsKKwlpZiAoIWFjY2VzcyhwYXRoLCBSX09LKSkKKwkJYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZShkaXIsIHBhdGgpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgY29tbW9uIHByZWZpeCBmb3IgdGhlIHBhdGhzcGVjLCBhbmQKKwkgKiB1c2UgdGhhdCB0byBvcHRpbWl6ZSB0aGUgZGlyZWN0b3J5IHdhbGsKKwkgKi8KKwliYXNlbGVuID0gY29tbW9uX3ByZWZpeChwYXRoc3BlYyk7CisJcGF0aCA9ICIuIjsKKwliYXNlID0gIiI7CisJaWYgKGJhc2VsZW4pIHsKKwkJY2hhciAqY29tbW9uID0geG1hbGxvYyhiYXNlbGVuICsgMSk7CisJCWNvbW1vbiA9IHhtYWxsb2MoYmFzZWxlbiArIDEpOworCQltZW1jcHkoY29tbW9uLCAqcGF0aHNwZWMsIGJhc2VsZW4pOworCQljb21tb25bYmFzZWxlbl0gPSAwOworCQlwYXRoID0gYmFzZSA9IGNvbW1vbjsKKwl9CisKKwkvKiBSZWFkIHRoZSBkaXJlY3RvcnkgYW5kIHBydW5lIGl0ICovCisJcmVhZF9kaXJlY3RvcnkoZGlyLCBwYXRoLCBiYXNlLCBiYXNlbGVuKTsKKwlpZiAocGF0aHNwZWMpCisJCXBydW5lX2RpcmVjdG9yeShkaXIsIHBhdGhzcGVjLCBiYXNlbGVuKTsKK30KKworc3RhdGljIGludCBhZGRfZmlsZV90b19pbmRleChjb25zdCBjaGFyICpwYXRoLCBpbnQgdmVyYm9zZSkKK3sKKwlpbnQgc2l6ZSwgbmFtZWxlbjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkpCisJCWRpZSgiJXM6IHVuYWJsZSB0byBzdGF0ICglcykiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpICYmICFTX0lTTE5LKHN0LnN0X21vZGUpKQorCQlkaWUoIiVzOiBjYW4gb25seSBhZGQgcmVndWxhciBmaWxlcyBvciBzeW1ib2xpYyBsaW5rcyIsIHBhdGgpOworCisJbmFtZWxlbiA9IHN0cmxlbihwYXRoKTsKKwlzaXplID0gY2FjaGVfZW50cnlfc2l6ZShuYW1lbGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBuYW1lbGVuKTsKKwljZS0+Y2VfZmxhZ3MgPSBodG9ucyhuYW1lbGVuKTsKKwlmaWxsX3N0YXRfY2FjaGVfaW5mbyhjZSwgJnN0KTsKKworCWNlLT5jZV9tb2RlID0gY3JlYXRlX2NlX21vZGUoc3Quc3RfbW9kZSk7CisJaWYgKCF0cnVzdF9leGVjdXRhYmxlX2JpdCkgeworCQkvKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBlbnRyeSwgcGljayB0aGUgbW9kZSBiaXRzCisJCSAqIGZyb20gaXQuCisJCSAqLworCQlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbmFtZWxlbik7CisJCWlmIChwb3MgPj0gMCkKKwkJCWNlLT5jZV9tb2RlID0gYWN0aXZlX2NhY2hlW3Bvc10tPmNlX21vZGU7CisJfQorCisJaWYgKGluZGV4X3BhdGgoY2UtPnNoYTEsIHBhdGgsICZzdCwgMSkpCisJCWRpZSgidW5hYmxlIHRvIGluZGV4IGZpbGUgJXMiLCBwYXRoKTsKKwlpZiAoYWRkX2NhY2hlX2VudHJ5KGNlLCBBRERfQ0FDSEVfT0tfVE9fQUREKSkKKwkJZGllKCJ1bmFibGUgdG8gYWRkICVzIHRvIGluZGV4IixwYXRoKTsKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKCJhZGQgJyVzJ1xuIiwgcGF0aCk7CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBjbWRfYWRkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJaW50IGksIG5ld2ZkOworCWludCB2ZXJib3NlID0gMCwgc2hvd19vbmx5ID0gMDsKKwljb25zdCBjaGFyICpwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjOworCXN0cnVjdCBkaXJfc3RydWN0IGRpcjsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCW5ld2ZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgmbG9ja19maWxlLCBnZXRfaW5kZXhfZmlsZSgpKTsKKwlpZiAobmV3ZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgbmV3IGluZGV4IGZpbGUiKTsKKworCWlmIChyZWFkX2NhY2hlKCkgPCAwKQorCQlkaWUoImluZGV4IGZpbGUgY29ycnVwdCIpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1uIikpIHsKKwkJCXNob3dfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItdiIpKSB7CisJCQl2ZXJib3NlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZShidWlsdGluX2FkZF91c2FnZSk7CisJfQorCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwlwYXRoc3BlYyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBpKTsKKworCWZpbGxfZGlyZWN0b3J5KCZkaXIsIHBhdGhzcGVjKTsKKworCWlmIChzaG93X29ubHkpIHsKKwkJY29uc3QgY2hhciAqc2VwID0gIiIsICplb2YgPSAiIjsKKwkJZm9yIChpID0gMDsgaSA8IGRpci5ucjsgaSsrKSB7CisJCQlwcmludGYoIiVzJXMiLCBzZXAsIGRpci5lbnRyaWVzW2ldLT5uYW1lKTsKKwkJCXNlcCA9ICIgIjsKKwkJCWVvZiA9ICJcbiI7CisJCX0KKwkJZnB1dHMoZW9mLCBzdGRvdXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLm5yOyBpKyspCisJCWFkZF9maWxlX3RvX2luZGV4KGRpci5lbnRyaWVzW2ldLT5uYW1lLCB2ZXJib3NlKTsKKworCWlmIChhY3RpdmVfY2FjaGVfY2hhbmdlZCkgeworCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkgICAgY29tbWl0X2xvY2tfZmlsZSgmbG9ja19maWxlKSkKKwkJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWFwcGx5LmMgYi9idWlsdGluLWFwcGx5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExM2M3NAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tYXBwbHkuYwpAQCAtMCwwICsxLDIzMjQgQEAKKy8qCisgKiBhcHBseS5jCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICoKKyAqIFRoaXMgYXBwbGllcyBwYXRjaGVzIG9uIHRvcCBvZiBzb21lIChhcmJpdHJhcnkpIHZlcnNpb24gb2YgdGhlIFNDTS4KKyAqCisgKi8KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKy8vICAtLWNoZWNrIHR1cm5zIG9uIGNoZWNraW5nIHRoYXQgdGhlIHdvcmtpbmcgdHJlZSBtYXRjaGVzIHRoZQorLy8gICAgZmlsZXMgdGhhdCBhcmUgYmVpbmcgbW9kaWZpZWQsIGJ1dCBkb2Vzbid0IGFwcGx5IHRoZSBwYXRjaAorLy8gIC0tc3RhdCBkb2VzIGp1c3QgYSBkaWZmc3RhdCwgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgYXBwbHkKKy8vICAtLW51bXN0YXQgZG9lcyBudW1lcmljIGRpZmZzdGF0LCBhbmQgZG9lc24ndCBhY3R1YWxseSBhcHBseQorLy8gIC0taW5kZXgtaW5mbyBzaG93cyB0aGUgb2xkIGFuZCBuZXcgaW5kZXggaW5mbyBmb3IgcGF0aHMgaWYgYXZhaWxhYmxlLgorLy8gIC0taW5kZXggdXBkYXRlcyB0aGUgY2FjaGUgYXMgd2VsbC4KKy8vICAtLWNhY2hlZCB1cGRhdGVzIG9ubHkgdGhlIGNhY2hlIHdpdGhvdXQgZXZlciB0b3VjaGluZyB0aGUgd29ya2luZyB0cmVlLgorLy8KK3N0YXRpYyBjb25zdCBjaGFyICpwcmVmaXg7CitzdGF0aWMgaW50IHByZWZpeF9sZW5ndGggPSAtMTsKK3N0YXRpYyBpbnQgbmV3ZmQgPSAtMTsKKworc3RhdGljIGludCBwX3ZhbHVlID0gMTsKK3N0YXRpYyBpbnQgYWxsb3dfYmluYXJ5X3JlcGxhY2VtZW50ID0gMDsKK3N0YXRpYyBpbnQgY2hlY2tfaW5kZXggPSAwOworc3RhdGljIGludCB3cml0ZV9pbmRleCA9IDA7CitzdGF0aWMgaW50IGNhY2hlZCA9IDA7CitzdGF0aWMgaW50IGRpZmZzdGF0ID0gMDsKK3N0YXRpYyBpbnQgbnVtc3RhdCA9IDA7CitzdGF0aWMgaW50IHN1bW1hcnkgPSAwOworc3RhdGljIGludCBjaGVjayA9IDA7CitzdGF0aWMgaW50IGFwcGx5ID0gMTsKK3N0YXRpYyBpbnQgbm9fYWRkID0gMDsKK3N0YXRpYyBpbnQgc2hvd19pbmRleF9pbmZvID0gMDsKK3N0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwX2NvbnRleHQgPSAtMTsKK3N0YXRpYyBjb25zdCBjaGFyIGFwcGx5X3VzYWdlW10gPQorImdpdC1hcHBseSBbLS1zdGF0XSBbLS1udW1zdGF0XSBbLS1zdW1tYXJ5XSBbLS1jaGVja10gWy0taW5kZXhdIFstLWNhY2hlZF0gWy0tYXBwbHldIFstLW5vLWFkZF0gWy0taW5kZXgtaW5mb10gWy0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50XSBbLXpdIFstcE5VTV0gWy1DTlVNXSBbLS13aGl0ZXNwYWNlPTxub3dhcm58d2FybnxlcnJvcnxlcnJvci1hbGx8c3RyaXA+XSA8cGF0Y2g+Li4uIjsKKworc3RhdGljIGVudW0gd2hpdGVzcGFjZV9lb2wgeworCW5vd2Fybl93aGl0ZXNwYWNlLAorCXdhcm5fb25fd2hpdGVzcGFjZSwKKwllcnJvcl9vbl93aGl0ZXNwYWNlLAorCXN0cmlwX3doaXRlc3BhY2UsCit9IG5ld193aGl0ZXNwYWNlID0gd2Fybl9vbl93aGl0ZXNwYWNlOworc3RhdGljIGludCB3aGl0ZXNwYWNlX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA9IDU7CitzdGF0aWMgaW50IGFwcGxpZWRfYWZ0ZXJfc3RyaXBwaW5nID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpwYXRjaF9pbnB1dF9maWxlID0gTlVMTDsKKworc3RhdGljIHZvaWQgcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uKQoreworCWlmICghb3B0aW9uKSB7CisJCW5ld193aGl0ZXNwYWNlID0gd2Fybl9vbl93aGl0ZXNwYWNlOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgIndhcm4iKSkgeworCQluZXdfd2hpdGVzcGFjZSA9IHdhcm5fb25fd2hpdGVzcGFjZTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXN0cmNtcChvcHRpb24sICJub3dhcm4iKSkgeworCQluZXdfd2hpdGVzcGFjZSA9IG5vd2Fybl93aGl0ZXNwYWNlOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgImVycm9yIikpIHsKKwkJbmV3X3doaXRlc3BhY2UgPSBlcnJvcl9vbl93aGl0ZXNwYWNlOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgImVycm9yLWFsbCIpKSB7CisJCW5ld193aGl0ZXNwYWNlID0gZXJyb3Jfb25fd2hpdGVzcGFjZTsKKwkJc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAic3RyaXAiKSkgeworCQluZXdfd2hpdGVzcGFjZSA9IHN0cmlwX3doaXRlc3BhY2U7CisJCXJldHVybjsKKwl9CisJZGllKCJ1bnJlY29nbml6ZWQgd2hpdGVzcGFjZSBvcHRpb24gJyVzJyIsIG9wdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X3doaXRlc3BhY2VfbW9kZShjb25zdCBjaGFyICp3aGl0ZXNwYWNlX29wdGlvbikKK3sKKwlpZiAoIXdoaXRlc3BhY2Vfb3B0aW9uICYmICFhcHBseV9kZWZhdWx0X3doaXRlc3BhY2UpIHsKKwkJbmV3X3doaXRlc3BhY2UgPSAoYXBwbHkKKwkJCQkgID8gd2Fybl9vbl93aGl0ZXNwYWNlCisJCQkJICA6IG5vd2Fybl93aGl0ZXNwYWNlKTsKKwl9Cit9CisKKy8qCisgKiBGb3IgImRpZmYtc3RhdCIgbGlrZSBiZWhhdmlvdXIsIHdlIGtlZXAgdHJhY2sgb2YgdGhlIGJpZ2dlc3QgY2hhbmdlCisgKiB3ZSd2ZSBzZWVuLCBhbmQgdGhlIGxvbmdlc3QgZmlsZW5hbWUuIFRoYXQgYWxsb3dzIHVzIHRvIGRvIHNpbXBsZQorICogc2NhbGluZy4KKyAqLworc3RhdGljIGludCBtYXhfY2hhbmdlLCBtYXhfbGVuOworCisvKgorICogVmFyaW91cyAiY3VycmVudCBzdGF0ZSIsIG5vdGFibHkgbGluZSBudW1iZXJzIGFuZCB3aGF0CisgKiBmaWxlIChhbmQgaG93KSB3ZSdyZSBwYXRjaGluZyByaWdodCBub3cuLiBUaGUgImlzX3h4eHgiCisgKiB0aGluZ3MgYXJlIGZsYWdzLCB3aGVyZSAtMSBtZWFucyAiZG9uJ3Qga25vdyB5ZXQiLgorICovCitzdGF0aWMgaW50IGxpbmVuciA9IDE7CisKK3N0cnVjdCBmcmFnbWVudCB7CisJdW5zaWduZWQgbG9uZyBsZWFkaW5nLCB0cmFpbGluZzsKKwl1bnNpZ25lZCBsb25nIG9sZHBvcywgb2xkbGluZXM7CisJdW5zaWduZWQgbG9uZyBuZXdwb3MsIG5ld2xpbmVzOworCWNvbnN0IGNoYXIgKnBhdGNoOworCWludCBzaXplOworCXN0cnVjdCBmcmFnbWVudCAqbmV4dDsKK307CisKK3N0cnVjdCBwYXRjaCB7CisJY2hhciAqbmV3X25hbWUsICpvbGRfbmFtZSwgKmRlZl9uYW1lOworCXVuc2lnbmVkIGludCBvbGRfbW9kZSwgbmV3X21vZGU7CisJaW50IGlzX3JlbmFtZSwgaXNfY29weSwgaXNfbmV3LCBpc19kZWxldGUsIGlzX2JpbmFyeTsKKyNkZWZpbmUgQklOQVJZX0RFTFRBX0RFRkxBVEVEIDEKKyNkZWZpbmUgQklOQVJZX0xJVEVSQUxfREVGTEFURUQgMgorCXVuc2lnbmVkIGxvbmcgZGVmbGF0ZV9vcmlnbGVuOworCWludCBsaW5lc19hZGRlZCwgbGluZXNfZGVsZXRlZDsKKwlpbnQgc2NvcmU7CisJc3RydWN0IGZyYWdtZW50ICpmcmFnbWVudHM7CisJY2hhciAqcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgcmVzdWx0c2l6ZTsKKwljaGFyIG9sZF9zaGExX3ByZWZpeFs0MV07CisJY2hhciBuZXdfc2hhMV9wcmVmaXhbNDFdOworCXN0cnVjdCBwYXRjaCAqbmV4dDsKK307CisKKyNkZWZpbmUgQ0hVTktTSVpFICg4MTkyKQorI2RlZmluZSBTTE9QICgxNikKKworc3RhdGljIHZvaWQgKnJlYWRfcGF0Y2hfZmlsZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDAsIGFsbG9jID0gQ0hVTktTSVpFOworCXZvaWQgKmJ1ZmZlciA9IHhtYWxsb2MoYWxsb2MpOworCisJZm9yICg7OykgeworCQlpbnQgbnIgPSBhbGxvYyAtIHNpemU7CisJCWlmIChuciA8IDEwMjQpIHsKKwkJCWFsbG9jICs9IENIVU5LU0laRTsKKwkJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgYWxsb2MpOworCQkJbnIgPSBhbGxvYyAtIHNpemU7CisJCX0KKwkJbnIgPSB4cmVhZChmZCwgYnVmZmVyICsgc2l6ZSwgbnIpOworCQlpZiAoIW5yKQorCQkJYnJlYWs7CisJCWlmIChuciA8IDApCisJCQlkaWUoImdpdC1hcHBseTogcmVhZCByZXR1cm5lZCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXNpemUgKz0gbnI7CisJfQorCSpzaXplcCA9IHNpemU7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgc29tZSBzbG9wIGluIHRoZSBidWZmZXIKKwkgKiBzbyB0aGF0IHdlIGNhbiBkbyBzcGVjdWxhdGl2ZSAibWVtY21wIiBldGMsIGFuZAorCSAqIHNlZSB0byBpdCB0aGF0IGl0IGlzIE5VTC1maWxsZWQuCisJICovCisJaWYgKGFsbG9jIDwgc2l6ZSArIFNMT1ApCisJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgc2l6ZSArIFNMT1ApOworCW1lbXNldChidWZmZXIgKyBzaXplLCAwLCBTTE9QKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsaW5lbGVuKGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbGVuID0gMDsKKwl3aGlsZSAoc2l6ZS0tKSB7CisJCWxlbisrOworCQlpZiAoKmJ1ZmZlcisrID09ICdcbicpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBpc19kZXZfbnVsbChjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuICFtZW1jbXAoIi9kZXYvbnVsbCIsIHN0ciwgOSkgJiYgaXNzcGFjZShzdHJbOV0pOworfQorCisjZGVmaW5lIFRFUk1fU1BBQ0UJMQorI2RlZmluZSBURVJNX1RBQgkyCisKK3N0YXRpYyBpbnQgbmFtZV90ZXJtaW5hdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCBjLCBpbnQgdGVybWluYXRlKQoreworCWlmIChjID09ICcgJyAmJiAhKHRlcm1pbmF0ZSAmIFRFUk1fU1BBQ0UpKQorCQlyZXR1cm4gMDsKKwlpZiAoYyA9PSAnXHQnICYmICEodGVybWluYXRlICYgVEVSTV9UQUIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgY2hhciAqIGZpbmRfbmFtZShjb25zdCBjaGFyICpsaW5lLCBjaGFyICpkZWYsIGludCBwX3ZhbHVlLCBpbnQgdGVybWluYXRlKQoreworCWludCBsZW47CisJY29uc3QgY2hhciAqc3RhcnQgPSBsaW5lOworCWNoYXIgKm5hbWU7CisKKwlpZiAoKmxpbmUgPT0gJyInKSB7CisJCS8qIFByb3Bvc2VkICJuZXctc3R5bGUiIEdOVSBwYXRjaC9kaWZmIGZvcm1hdDsgc2VlCisJCSAqIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9Z2l0Jm09MTEyOTI3MzE2NDA4NjkwJnc9MgorCQkgKi8KKwkJbmFtZSA9IHVucXVvdGVfY19zdHlsZShsaW5lLCBOVUxMKTsKKwkJaWYgKG5hbWUpIHsKKwkJCWNoYXIgKmNwID0gbmFtZTsKKwkJCXdoaWxlIChwX3ZhbHVlKSB7CisJCQkJY3AgPSBzdHJjaHIobmFtZSwgJy8nKTsKKwkJCQlpZiAoIWNwKQorCQkJCQlicmVhazsKKwkJCQljcCsrOworCQkJCXBfdmFsdWUtLTsKKwkJCX0KKwkJCWlmIChjcCkgeworCQkJCS8qIG5hbWUgY2FuIGxhdGVyIGJlIGZyZWVkLCBzbyB3ZSBuZWVkCisJCQkJICogdG8gbWVtbW92ZSwgbm90IGp1c3QgcmV0dXJuIGNwCisJCQkJICovCisJCQkJbWVtbW92ZShuYW1lLCBjcCwgc3RybGVuKGNwKSArIDEpOworCQkJCWZyZWUoZGVmKTsKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWZyZWUobmFtZSk7CisJCQkJbmFtZSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKDs7KSB7CisJCWNoYXIgYyA9ICpsaW5lOworCisJCWlmIChpc3NwYWNlKGMpKSB7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCWJyZWFrOworCQkJaWYgKG5hbWVfdGVybWluYXRlKHN0YXJ0LCBsaW5lLXN0YXJ0LCBjLCB0ZXJtaW5hdGUpKQorCQkJCWJyZWFrOworCQl9CisJCWxpbmUrKzsKKwkJaWYgKGMgPT0gJy8nICYmICEtLXBfdmFsdWUpCisJCQlzdGFydCA9IGxpbmU7CisJfQorCWlmICghc3RhcnQpCisJCXJldHVybiBkZWY7CisJbGVuID0gbGluZSAtIHN0YXJ0OworCWlmICghbGVuKQorCQlyZXR1cm4gZGVmOworCisJLyoKKwkgKiBHZW5lcmFsbHkgd2UgcHJlZmVyIHRoZSBzaG9ydGVyIG5hbWUsIGVzcGVjaWFsbHkKKwkgKiBpZiB0aGUgb3RoZXIgb25lIGlzIGp1c3QgYSB2YXJpYXRpb24gb2YgdGhhdCB3aXRoCisJICogc29tZXRoaW5nIGVsc2UgdGFja2VkIG9uIHRvIHRoZSBlbmQgKGllICJmaWxlLm9yaWciCisJICogb3IgImZpbGV+IikuCisJICovCisJaWYgKGRlZikgeworCQlpbnQgZGVmbGVuID0gc3RybGVuKGRlZik7CisJCWlmIChkZWZsZW4gPCBsZW4gJiYgIXN0cm5jbXAoc3RhcnQsIGRlZiwgZGVmbGVuKSkKKwkJCXJldHVybiBkZWY7CisJfQorCisJbmFtZSA9IHhtYWxsb2MobGVuICsgMSk7CisJbWVtY3B5KG5hbWUsIHN0YXJ0LCBsZW4pOworCW5hbWVbbGVuXSA9IDA7CisJZnJlZShkZWYpOworCXJldHVybiBuYW1lOworfQorCisvKgorICogR2V0IHRoZSBuYW1lIGV0YyBpbmZvIGZyb20gdGhlIC0tLysrKyBsaW5lcyBvZiBhIHRyYWRpdGlvbmFsIHBhdGNoIGhlYWRlcgorICoKKyAqIE5PVEUhIFRoaXMgaGFyZGNvZGVzICItcDEiIGJlaGF2aW91ciBpbiBmaWxlbmFtZSBkZXRlY3Rpb24uCisgKgorICogRklYTUUhIFRoZSBlbmQtb2YtZmlsZW5hbWUgaGV1cmlzdGljcyBhcmUga2luZCBvZiBzY3Jld3kuIEZvciBleGlzdGluZworICogZmlsZXMsIHdlIGNhbiBoYXBwaWx5IGNoZWNrIHRoZSBpbmRleCBmb3IgYSBtYXRjaCwgYnV0IGZvciBjcmVhdGluZyBhCisgKiBuZXcgZmlsZSB3ZSBzaG91bGQgdHJ5IHRvIG1hdGNoIHdoYXRldmVyICJwYXRjaCIgZG9lcy4gSSBoYXZlIG5vIGlkZWEuCisgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3RyYWRpdGlvbmFsX3BhdGNoKGNvbnN0IGNoYXIgKmZpcnN0LCBjb25zdCBjaGFyICpzZWNvbmQsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJY2hhciAqbmFtZTsKKworCWZpcnN0ICs9IDQ7CS8vIHNraXAgIi0tLSAiCisJc2Vjb25kICs9IDQ7CS8vIHNraXAgIisrKyAiCisJaWYgKGlzX2Rldl9udWxsKGZpcnN0KSkgeworCQlwYXRjaC0+aXNfbmV3ID0gMTsKKwkJcGF0Y2gtPmlzX2RlbGV0ZSA9IDA7CisJCW5hbWUgPSBmaW5kX25hbWUoc2Vjb25kLCBOVUxMLCBwX3ZhbHVlLCBURVJNX1NQQUNFIHwgVEVSTV9UQUIpOworCQlwYXRjaC0+bmV3X25hbWUgPSBuYW1lOworCX0gZWxzZSBpZiAoaXNfZGV2X251bGwoc2Vjb25kKSkgeworCQlwYXRjaC0+aXNfbmV3ID0gMDsKKwkJcGF0Y2gtPmlzX2RlbGV0ZSA9IDE7CisJCW5hbWUgPSBmaW5kX25hbWUoZmlyc3QsIE5VTEwsIHBfdmFsdWUsIFRFUk1fU1BBQ0UgfCBURVJNX1RBQik7CisJCXBhdGNoLT5vbGRfbmFtZSA9IG5hbWU7CisJfSBlbHNlIHsKKwkJbmFtZSA9IGZpbmRfbmFtZShmaXJzdCwgTlVMTCwgcF92YWx1ZSwgVEVSTV9TUEFDRSB8IFRFUk1fVEFCKTsKKwkJbmFtZSA9IGZpbmRfbmFtZShzZWNvbmQsIG5hbWUsIHBfdmFsdWUsIFRFUk1fU1BBQ0UgfCBURVJNX1RBQik7CisJCXBhdGNoLT5vbGRfbmFtZSA9IHBhdGNoLT5uZXdfbmFtZSA9IG5hbWU7CisJfQorCWlmICghbmFtZSkKKwkJZGllKCJ1bmFibGUgdG8gZmluZCBmaWxlbmFtZSBpbiBwYXRjaCBhdCBsaW5lICVkIiwgbGluZW5yKTsKK30KKworc3RhdGljIGludCBnaXRkaWZmX2hkcmVuZChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFdlJ3JlIGFuYWwgYWJvdXQgZGlmZiBoZWFkZXIgY29uc2lzdGVuY3ksIHRvIG1ha2UKKyAqIHN1cmUgdGhhdCB3ZSBkb24ndCBlbmQgdXAgaGF2aW5nIHN0cmFuZ2UgYW1iaWd1b3VzCisgKiBwYXRjaGVzIGZsb2F0aW5nIGFyb3VuZC4KKyAqCisgKiBBcyBhIHJlc3VsdCwgZ2l0ZGlmZl97b2xkfG5ld31uYW1lKCkgd2lsbCBjaGVjaworICogdGhlaXIgbmFtZXMgYWdhaW5zdCBhbnkgcHJldmlvdXMgaW5mb3JtYXRpb24sIGp1c3QKKyAqIHRvIG1ha2Ugc3VyZS4uCisgKi8KK3N0YXRpYyBjaGFyICpnaXRkaWZmX3ZlcmlmeV9uYW1lKGNvbnN0IGNoYXIgKmxpbmUsIGludCBpc251bGwsIGNoYXIgKm9yaWdfbmFtZSwgY29uc3QgY2hhciAqb2xkbmV3KQoreworCWlmICghb3JpZ19uYW1lICYmICFpc251bGwpCisJCXJldHVybiBmaW5kX25hbWUobGluZSwgTlVMTCwgMSwgMCk7CisKKwlpZiAob3JpZ19uYW1lKSB7CisJCWludCBsZW47CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWNoYXIgKmFub3RoZXI7CisJCW5hbWUgPSBvcmlnX25hbWU7CisJCWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJaWYgKGlzbnVsbCkKKwkJCWRpZSgiZ2l0LWFwcGx5OiBiYWQgZ2l0LWRpZmYgLSBleHBlY3RlZCAvZGV2L251bGwsIGdvdCAlcyBvbiBsaW5lICVkIiwgbmFtZSwgbGluZW5yKTsKKwkJYW5vdGhlciA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAxLCAwKTsKKwkJaWYgKCFhbm90aGVyIHx8IG1lbWNtcChhbm90aGVyLCBuYW1lLCBsZW4pKQorCQkJZGllKCJnaXQtYXBwbHk6IGJhZCBnaXQtZGlmZiAtIGluY29uc2lzdGVudCAlcyBmaWxlbmFtZSBvbiBsaW5lICVkIiwgb2xkbmV3LCBsaW5lbnIpOworCQlmcmVlKGFub3RoZXIpOworCQlyZXR1cm4gb3JpZ19uYW1lOworCX0KKwllbHNlIHsKKwkJLyogZXhwZWN0ICIvZGV2L251bGwiICovCisJCWlmIChtZW1jbXAoIi9kZXYvbnVsbCIsIGxpbmUsIDkpIHx8IGxpbmVbOV0gIT0gJ1xuJykKKwkJCWRpZSgiZ2l0LWFwcGx5OiBiYWQgZ2l0LWRpZmYgLSBleHBlY3RlZCAvZGV2L251bGwgb24gbGluZSAlZCIsIGxpbmVucik7CisJCXJldHVybiBOVUxMOworCX0KK30KKworc3RhdGljIGludCBnaXRkaWZmX29sZG5hbWUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+b2xkX25hbWUgPSBnaXRkaWZmX3ZlcmlmeV9uYW1lKGxpbmUsIHBhdGNoLT5pc19uZXcsIHBhdGNoLT5vbGRfbmFtZSwgIm9sZCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfbmV3bmFtZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5uZXdfbmFtZSA9IGdpdGRpZmZfdmVyaWZ5X25hbWUobGluZSwgcGF0Y2gtPmlzX2RlbGV0ZSwgcGF0Y2gtPm5ld19uYW1lLCAibmV3Iik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9vbGRtb2RlKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPm9sZF9tb2RlID0gc3RydG91bChsaW5lLCBOVUxMLCA4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX25ld21vZGUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+bmV3X21vZGUgPSBzdHJ0b3VsKGxpbmUsIE5VTEwsIDgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfZGVsZXRlKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX2RlbGV0ZSA9IDE7CisJcGF0Y2gtPm9sZF9uYW1lID0gcGF0Y2gtPmRlZl9uYW1lOworCXJldHVybiBnaXRkaWZmX29sZG1vZGUobGluZSwgcGF0Y2gpOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfbmV3ZmlsZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19uZXcgPSAxOworCXBhdGNoLT5uZXdfbmFtZSA9IHBhdGNoLT5kZWZfbmFtZTsKKwlyZXR1cm4gZ2l0ZGlmZl9uZXdtb2RlKGxpbmUsIHBhdGNoKTsKK30KKworc3RhdGljIGludCBnaXRkaWZmX2NvcHlzcmMoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+aXNfY29weSA9IDE7CisJcGF0Y2gtPm9sZF9uYW1lID0gZmluZF9uYW1lKGxpbmUsIE5VTEwsIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfY29weWRzdChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19jb3B5ID0gMTsKKwlwYXRjaC0+bmV3X25hbWUgPSBmaW5kX25hbWUobGluZSwgTlVMTCwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9yZW5hbWVzcmMoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+aXNfcmVuYW1lID0gMTsKKwlwYXRjaC0+b2xkX25hbWUgPSBmaW5kX25hbWUobGluZSwgTlVMTCwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9yZW5hbWVkc3QoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+aXNfcmVuYW1lID0gMTsKKwlwYXRjaC0+bmV3X25hbWUgPSBmaW5kX25hbWUobGluZSwgTlVMTCwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9zaW1pbGFyaXR5KGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaWYgKChwYXRjaC0+c2NvcmUgPSBzdHJ0b3VsKGxpbmUsIE5VTEwsIDEwKSkgPT0gVUxPTkdfTUFYKQorCQlwYXRjaC0+c2NvcmUgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfZGlzc2ltaWxhcml0eShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWlmICgocGF0Y2gtPnNjb3JlID0gc3RydG91bChsaW5lLCBOVUxMLCAxMCkpID09IFVMT05HX01BWCkKKwkJcGF0Y2gtPnNjb3JlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX2luZGV4KGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJLyogaW5kZXggbGluZSBpcyBOIGhleGFkZWNpbWFsLCAiLi4iLCBOIGhleGFkZWNpbWFsLAorCSAqIGFuZCBvcHRpb25hbCBzcGFjZSB3aXRoIG9jdGFsIG1vZGUuCisJICovCisJY29uc3QgY2hhciAqcHRyLCAqZW9sOworCWludCBsZW47CisKKwlwdHIgPSBzdHJjaHIobGluZSwgJy4nKTsKKwlpZiAoIXB0ciB8fCBwdHJbMV0gIT0gJy4nIHx8IDQwIDwgcHRyIC0gbGluZSkKKwkJcmV0dXJuIDA7CisJbGVuID0gcHRyIC0gbGluZTsKKwltZW1jcHkocGF0Y2gtPm9sZF9zaGExX3ByZWZpeCwgbGluZSwgbGVuKTsKKwlwYXRjaC0+b2xkX3NoYTFfcHJlZml4W2xlbl0gPSAwOworCisJbGluZSA9IHB0ciArIDI7CisJcHRyID0gc3RyY2hyKGxpbmUsICcgJyk7CisJZW9sID0gc3RyY2hyKGxpbmUsICdcbicpOworCisJaWYgKCFwdHIgfHwgZW9sIDwgcHRyKQorCQlwdHIgPSBlb2w7CisJbGVuID0gcHRyIC0gbGluZTsKKworCWlmICg0MCA8IGxlbikKKwkJcmV0dXJuIDA7CisJbWVtY3B5KHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgsIGxpbmUsIGxlbik7CisJcGF0Y2gtPm5ld19zaGExX3ByZWZpeFtsZW5dID0gMDsKKwlpZiAoKnB0ciA9PSAnICcpCisJCXBhdGNoLT5uZXdfbW9kZSA9IHBhdGNoLT5vbGRfbW9kZSA9IHN0cnRvdWwocHRyKzEsIE5VTEwsIDgpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBub3JtYWwgZm9yIGEgZGlmZiB0aGF0IGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nOiB3ZSdsbCBmYWxsIHRocm91Z2gKKyAqIGludG8gdGhlIG5leHQgZGlmZi4gVGVsbCB0aGUgcGFyc2VyIHRvIGJyZWFrIG91dC4KKyAqLworc3RhdGljIGludCBnaXRkaWZmX3VucmVjb2duaXplZChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnN0b3BfYXRfc2xhc2goY29uc3QgY2hhciAqbGluZSwgaW50IGxsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGxlbjsgaSsrKSB7CisJCWludCBjaCA9IGxpbmVbaV07CisJCWlmIChjaCA9PSAnLycpCisJCQlyZXR1cm4gbGluZSArIGk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBUaGlzIGlzIHRvIGV4dHJhY3QgdGhlIHNhbWUgbmFtZSB0aGF0IGFwcGVhcnMgb24gImRpZmYgLS1naXQiCisgKiBsaW5lLiAgV2UgZG8gbm90IGZpbmQgYW5kIHJldHVybiBhbnl0aGluZyBpZiBpdCBpcyBhIHJlbmFtZQorICogcGF0Y2gsIGFuZCBpdCBpcyBPSyBiZWNhdXNlIHdlIHdpbGwgZmluZCB0aGUgbmFtZSBlbHNld2hlcmUuCisgKiBXZSBuZWVkIHRvIHJlbGlhYmx5IGZpbmQgbmFtZSBvbmx5IHdoZW4gaXQgaXMgbW9kZS1jaGFuZ2Ugb25seSwKKyAqIGNyZWF0aW9uIG9yIGRlbGV0aW9uIG9mIGFuIGVtcHR5IGZpbGUuICBJbiBhbnkgb2YgdGhlc2UgY2FzZXMsCisgKiBib3RoIHNpZGVzIGFyZSB0aGUgc2FtZSBuYW1lIHVuZGVyIGEvIGFuZCBiLyByZXNwZWN0aXZlbHkuCisgKi8KK3N0YXRpYyBjaGFyICpnaXRfaGVhZGVyX25hbWUoY2hhciAqbGluZSwgaW50IGxsZW4pCit7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnNlY29uZCA9IE5VTEw7CisKKwlsaW5lICs9IHN0cmxlbigiZGlmZiAtLWdpdCAiKTsKKwlsbGVuIC09IHN0cmxlbigiZGlmZiAtLWdpdCAiKTsKKworCWlmICgqbGluZSA9PSAnIicpIHsKKwkJY29uc3QgY2hhciAqY3A7CisJCWNoYXIgKmZpcnN0ID0gdW5xdW90ZV9jX3N0eWxlKGxpbmUsICZzZWNvbmQpOworCQlpZiAoIWZpcnN0KQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogYWR2YW5jZSB0byB0aGUgZmlyc3Qgc2xhc2ggKi8KKwkJY3AgPSBzdG9wX2F0X3NsYXNoKGZpcnN0LCBzdHJsZW4oZmlyc3QpKTsKKwkJaWYgKCFjcCB8fCBjcCA9PSBmaXJzdCkgeworCQkJLyogd2UgZG8gbm90IGFjY2VwdCBhYnNvbHV0ZSBwYXRocyAqLworCQlmcmVlX2ZpcnN0X2FuZF9mYWlsOgorCQkJZnJlZShmaXJzdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlsZW4gPSBzdHJsZW4oY3ArMSk7CisJCW1lbW1vdmUoZmlyc3QsIGNwKzEsIGxlbisxKTsgLyogaW5jbHVkaW5nIE5VTCAqLworCisJCS8qIHNlY29uZCBwb2ludHMgYXQgb25lIHBhc3QgY2xvc2luZyBkcSBvZiBuYW1lLgorCQkgKiBmaW5kIHRoZSBzZWNvbmQgbmFtZS4KKwkJICovCisJCXdoaWxlICgoc2Vjb25kIDwgbGluZSArIGxsZW4pICYmIGlzc3BhY2UoKnNlY29uZCkpCisJCQlzZWNvbmQrKzsKKworCQlpZiAobGluZSArIGxsZW4gPD0gc2Vjb25kKQorCQkJZ290byBmcmVlX2ZpcnN0X2FuZF9mYWlsOworCQlpZiAoKnNlY29uZCA9PSAnIicpIHsKKwkJCWNoYXIgKnNwID0gdW5xdW90ZV9jX3N0eWxlKHNlY29uZCwgTlVMTCk7CisJCQlpZiAoIXNwKQorCQkJCWdvdG8gZnJlZV9maXJzdF9hbmRfZmFpbDsKKwkJCWNwID0gc3RvcF9hdF9zbGFzaChzcCwgc3RybGVuKHNwKSk7CisJCQlpZiAoIWNwIHx8IGNwID09IHNwKSB7CisJCQlmcmVlX2JvdGhfYW5kX2ZhaWw6CisJCQkJZnJlZShzcCk7CisJCQkJZ290byBmcmVlX2ZpcnN0X2FuZF9mYWlsOworCQkJfQorCQkJLyogVGhleSBtdXN0IG1hdGNoLCBvdGhlcndpc2UgaWdub3JlICovCisJCQlpZiAoc3RyY21wKGNwKzEsIGZpcnN0KSkKKwkJCQlnb3RvIGZyZWVfYm90aF9hbmRfZmFpbDsKKwkJCWZyZWUoc3ApOworCQkJcmV0dXJuIGZpcnN0OworCQl9CisKKwkJLyogdW5xdW90ZWQgc2Vjb25kICovCisJCWNwID0gc3RvcF9hdF9zbGFzaChzZWNvbmQsIGxpbmUgKyBsbGVuIC0gc2Vjb25kKTsKKwkJaWYgKCFjcCB8fCBjcCA9PSBzZWNvbmQpCisJCQlnb3RvIGZyZWVfZmlyc3RfYW5kX2ZhaWw7CisJCWNwKys7CisJCWlmIChsaW5lICsgbGxlbiAtIGNwICE9IGxlbiArIDEgfHwKKwkJICAgIG1lbWNtcChmaXJzdCwgY3AsIGxlbikpCisJCQlnb3RvIGZyZWVfZmlyc3RfYW5kX2ZhaWw7CisJCXJldHVybiBmaXJzdDsKKwl9CisKKwkvKiB1bnF1b3RlZCBmaXJzdCBuYW1lICovCisJbmFtZSA9IHN0b3BfYXRfc2xhc2gobGluZSwgbGxlbik7CisJaWYgKCFuYW1lIHx8IG5hbWUgPT0gbGluZSkKKwkJcmV0dXJuIE5VTEw7CisKKwluYW1lKys7CisKKwkvKiBzaW5jZSB0aGUgZmlyc3QgbmFtZSBpcyB1bnF1b3RlZCwgYSBkcSBpZiBleGlzdHMgbXVzdCBiZQorCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBuYW1lLgorCSAqLworCWZvciAoc2Vjb25kID0gbmFtZTsgc2Vjb25kIDwgbGluZSArIGxsZW47IHNlY29uZCsrKSB7CisJCWlmICgqc2Vjb25kID09ICciJykgeworCQkJY29uc3QgY2hhciAqY3AgPSBzZWNvbmQ7CisJCQljb25zdCBjaGFyICpucDsKKwkJCWNoYXIgKnNwID0gdW5xdW90ZV9jX3N0eWxlKHNlY29uZCwgTlVMTCk7CisKKwkJCWlmICghc3ApCisJCQkJcmV0dXJuIE5VTEw7CisJCQlucCA9IHN0b3BfYXRfc2xhc2goc3AsIHN0cmxlbihzcCkpOworCQkJaWYgKCFucCB8fCBucCA9PSBzcCkgeworCQkJZnJlZV9zZWNvbmRfYW5kX2ZhaWw6CisJCQkJZnJlZShzcCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlucCsrOworCQkJbGVuID0gc3RybGVuKG5wKTsKKwkJCWlmIChsZW4gPCBjcCAtIG5hbWUgJiYKKwkJCSAgICAhc3RybmNtcChucCwgbmFtZSwgbGVuKSAmJgorCQkJICAgIGlzc3BhY2UobmFtZVtsZW5dKSkgeworCQkJCS8qIEdvb2QgKi8KKwkJCQltZW1tb3ZlKHNwLCBucCwgbGVuICsgMSk7CisJCQkJcmV0dXJuIHNwOworCQkJfQorCQkJZ290byBmcmVlX3NlY29uZF9hbmRfZmFpbDsKKwkJfQorCX0KKworCS8qCisJICogQWNjZXB0IGEgbmFtZSBvbmx5IGlmIGl0IHNob3dzIHVwIHR3aWNlLCBleGFjdGx5IHRoZSBzYW1lCisJICogZm9ybS4KKwkgKi8KKwlmb3IgKGxlbiA9IDAgOyA7IGxlbisrKSB7CisJCWNoYXIgYyA9IG5hbWVbbGVuXTsKKworCQlzd2l0Y2ggKGMpIHsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQljYXNlICdcbic6CisJCQlyZXR1cm4gTlVMTDsKKwkJY2FzZSAnXHQnOiBjYXNlICcgJzoKKwkJCXNlY29uZCA9IG5hbWUrbGVuOworCQkJZm9yICg7OykgeworCQkJCWNoYXIgYyA9ICpzZWNvbmQrKzsKKwkJCQlpZiAoYyA9PSAnXG4nKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlpZiAoYyA9PSAnLycpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNlY29uZFtsZW5dID09ICdcbicgJiYgIW1lbWNtcChuYW1lLCBzZWNvbmQsIGxlbikpIHsKKwkJCQljaGFyICpyZXQgPSB4bWFsbG9jKGxlbiArIDEpOworCQkJCW1lbWNweShyZXQsIG5hbWUsIGxlbik7CisJCQkJcmV0W2xlbl0gPSAwOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFZlcmlmeSB0aGF0IHdlIHJlY29nbml6ZSB0aGUgbGluZXMgZm9sbG93aW5nIGEgZ2l0IGhlYWRlciAqLworc3RhdGljIGludCBwYXJzZV9naXRfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sIHVuc2lnbmVkIGludCBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJLyogQSBnaXQgZGlmZiBoYXMgZXhwbGljaXQgbmV3L2RlbGV0ZSBpbmZvcm1hdGlvbiwgc28gd2UgZG9uJ3QgZ3Vlc3MgKi8KKwlwYXRjaC0+aXNfbmV3ID0gMDsKKwlwYXRjaC0+aXNfZGVsZXRlID0gMDsKKworCS8qCisJICogU29tZSB0aGluZ3MgbWF5IG5vdCBoYXZlIHRoZSBvbGQgbmFtZSBpbiB0aGUKKwkgKiByZXN0IG9mIHRoZSBoZWFkZXJzIGFueXdoZXJlIChwdXJlIG1vZGUgY2hhbmdlcywKKwkgKiBvciByZW1vdmluZyBvciBhZGRpbmcgZW1wdHkgZmlsZXMpLCBzbyB3ZSBnZXQKKwkgKiB0aGUgZGVmYXVsdCBuYW1lIGZyb20gdGhlIGhlYWRlci4KKwkgKi8KKwlwYXRjaC0+ZGVmX25hbWUgPSBnaXRfaGVhZGVyX25hbWUobGluZSwgbGVuKTsKKworCWxpbmUgKz0gbGVuOworCXNpemUgLT0gbGVuOworCWxpbmVucisrOworCWZvciAob2Zmc2V0ID0gbGVuIDsgc2l6ZSA+IDAgOyBvZmZzZXQgKz0gbGVuLCBzaXplIC09IGxlbiwgbGluZSArPSBsZW4sIGxpbmVucisrKSB7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BlbnRyeSB7CisJCQljb25zdCBjaGFyICpzdHI7CisJCQlpbnQgKCpmbikoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcGF0Y2ggKik7CisJCX0gb3B0YWJsZVtdID0geworCQkJeyAiQEAgLSIsIGdpdGRpZmZfaGRyZW5kIH0sCisJCQl7ICItLS0gIiwgZ2l0ZGlmZl9vbGRuYW1lIH0sCisJCQl7ICIrKysgIiwgZ2l0ZGlmZl9uZXduYW1lIH0sCisJCQl7ICJvbGQgbW9kZSAiLCBnaXRkaWZmX29sZG1vZGUgfSwKKwkJCXsgIm5ldyBtb2RlICIsIGdpdGRpZmZfbmV3bW9kZSB9LAorCQkJeyAiZGVsZXRlZCBmaWxlIG1vZGUgIiwgZ2l0ZGlmZl9kZWxldGUgfSwKKwkJCXsgIm5ldyBmaWxlIG1vZGUgIiwgZ2l0ZGlmZl9uZXdmaWxlIH0sCisJCQl7ICJjb3B5IGZyb20gIiwgZ2l0ZGlmZl9jb3B5c3JjIH0sCisJCQl7ICJjb3B5IHRvICIsIGdpdGRpZmZfY29weWRzdCB9LAorCQkJeyAicmVuYW1lIG9sZCAiLCBnaXRkaWZmX3JlbmFtZXNyYyB9LAorCQkJeyAicmVuYW1lIG5ldyAiLCBnaXRkaWZmX3JlbmFtZWRzdCB9LAorCQkJeyAicmVuYW1lIGZyb20gIiwgZ2l0ZGlmZl9yZW5hbWVzcmMgfSwKKwkJCXsgInJlbmFtZSB0byAiLCBnaXRkaWZmX3JlbmFtZWRzdCB9LAorCQkJeyAic2ltaWxhcml0eSBpbmRleCAiLCBnaXRkaWZmX3NpbWlsYXJpdHkgfSwKKwkJCXsgImRpc3NpbWlsYXJpdHkgaW5kZXggIiwgZ2l0ZGlmZl9kaXNzaW1pbGFyaXR5IH0sCisJCQl7ICJpbmRleCAiLCBnaXRkaWZmX2luZGV4IH0sCisJCQl7ICIiLCBnaXRkaWZmX3VucmVjb2duaXplZCB9LAorCQl9OworCQlpbnQgaTsKKworCQlsZW4gPSBsaW5lbGVuKGxpbmUsIHNpemUpOworCQlpZiAoIWxlbiB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wdGFibGUpOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCBvcGVudHJ5ICpwID0gb3B0YWJsZSArIGk7CisJCQlpbnQgb3BsZW4gPSBzdHJsZW4ocC0+c3RyKTsKKwkJCWlmIChsZW4gPCBvcGxlbiB8fCBtZW1jbXAocC0+c3RyLCBsaW5lLCBvcGxlbikpCisJCQkJY29udGludWU7CisJCQlpZiAocC0+Zm4obGluZSArIG9wbGVuLCBwYXRjaCkgPCAwKQorCQkJCXJldHVybiBvZmZzZXQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbnVtKGNvbnN0IGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgKnApCit7CisJY2hhciAqcHRyOworCisJaWYgKCFpc2RpZ2l0KCpsaW5lKSkKKwkJcmV0dXJuIDA7CisJKnAgPSBzdHJ0b3VsKGxpbmUsICZwdHIsIDEwKTsKKwlyZXR1cm4gcHRyIC0gbGluZTsKK30KKworc3RhdGljIGludCBwYXJzZV9yYW5nZShjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICpleHBlY3QsCisJCQl1bnNpZ25lZCBsb25nICpwMSwgdW5zaWduZWQgbG9uZyAqcDIpCit7CisJaW50IGRpZ2l0cywgZXg7CisKKwlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbGVuKQorCQlyZXR1cm4gLTE7CisJbGluZSArPSBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKworCWRpZ2l0cyA9IHBhcnNlX251bShsaW5lLCBwMSk7CisJaWYgKCFkaWdpdHMpCisJCXJldHVybiAtMTsKKworCW9mZnNldCArPSBkaWdpdHM7CisJbGluZSArPSBkaWdpdHM7CisJbGVuIC09IGRpZ2l0czsKKworCSpwMiA9IDE7CisJaWYgKCpsaW5lID09ICcsJykgeworCQlkaWdpdHMgPSBwYXJzZV9udW0obGluZSsxLCBwMik7CisJCWlmICghZGlnaXRzKQorCQkJcmV0dXJuIC0xOworCisJCW9mZnNldCArPSBkaWdpdHMrMTsKKwkJbGluZSArPSBkaWdpdHMrMTsKKwkJbGVuIC09IGRpZ2l0cysxOworCX0KKworCWV4ID0gc3RybGVuKGV4cGVjdCk7CisJaWYgKGV4ID4gbGVuKQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChsaW5lLCBleHBlY3QsIGV4KSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG9mZnNldCArIGV4OworfQorCisvKgorICogUGFyc2UgYSB1bmlmaWVkIGRpZmYgZnJhZ21lbnQgaGVhZGVyIG9mIHRoZQorICogZm9ybSAiQEAgLWEsYiArYyxkIEBAIgorICovCitzdGF0aWMgaW50IHBhcnNlX2ZyYWdtZW50X2hlYWRlcihjaGFyICpsaW5lLCBpbnQgbGVuLCBzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50KQoreworCWludCBvZmZzZXQ7CisKKwlpZiAoIWxlbiB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gYSBmcmFnbWVudCAqLworCW9mZnNldCA9IHBhcnNlX3JhbmdlKGxpbmUsIGxlbiwgNCwgIiArIiwgJmZyYWdtZW50LT5vbGRwb3MsICZmcmFnbWVudC0+b2xkbGluZXMpOworCW9mZnNldCA9IHBhcnNlX3JhbmdlKGxpbmUsIGxlbiwgb2Zmc2V0LCAiIEBAIiwgJmZyYWdtZW50LT5uZXdwb3MsICZmcmFnbWVudC0+bmV3bGluZXMpOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBmaW5kX2hlYWRlcihjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCAqaGRyc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGVuOworCisJcGF0Y2gtPmlzX3JlbmFtZSA9IHBhdGNoLT5pc19jb3B5ID0gMDsKKwlwYXRjaC0+aXNfbmV3ID0gcGF0Y2gtPmlzX2RlbGV0ZSA9IC0xOworCXBhdGNoLT5vbGRfbW9kZSA9IHBhdGNoLT5uZXdfbW9kZSA9IDA7CisJcGF0Y2gtPm9sZF9uYW1lID0gcGF0Y2gtPm5ld19uYW1lID0gTlVMTDsKKwlmb3IgKG9mZnNldCA9IDA7IHNpemUgPiAwOyBvZmZzZXQgKz0gbGVuLCBzaXplIC09IGxlbiwgbGluZSArPSBsZW4sIGxpbmVucisrKSB7CisJCXVuc2lnbmVkIGxvbmcgbmV4dGxlbjsKKworCQlsZW4gPSBsaW5lbGVuKGxpbmUsIHNpemUpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCisJCS8qIFRlc3RpbmcgdGhpcyBlYXJseSBhbGxvd3MgdXMgdG8gdGFrZSBhIGZldyBzaG9ydGN1dHMuLiAqLworCQlpZiAobGVuIDwgNikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBmaW5kIGFueSB1bmNvbm5lY3RlZCBwYXRjaCBmcmFnbWFudHMuCisJCSAqIFRoYXQncyBhIHNpZ24gdGhhdCB3ZSBkaWRuJ3QgZmluZCBhIGhlYWRlciwgYW5kIHRoYXQgYQorCQkgKiBwYXRjaCBoYXMgYmVjb21lIGNvcnJ1cHRlZC9icm9rZW4gdXAuCisJCSAqLworCQlpZiAoIW1lbWNtcCgiQEAgLSIsIGxpbmUsIDQpKSB7CisJCQlzdHJ1Y3QgZnJhZ21lbnQgZHVtbXk7CisJCQlpZiAocGFyc2VfZnJhZ21lbnRfaGVhZGVyKGxpbmUsIGxlbiwgJmR1bW15KSA8IDApCisJCQkJY29udGludWU7CisJCQllcnJvcigicGF0Y2ggZnJhZ21lbnQgd2l0aG91dCBoZWFkZXIgYXQgbGluZSAlZDogJS4qcyIsIGxpbmVuciwgKGludClsZW4tMSwgbGluZSk7CisJCX0KKworCQlpZiAoc2l6ZSA8IGxlbiArIDYpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBHaXQgcGF0Y2g/IEl0IG1pZ2h0IG5vdCBoYXZlIGEgcmVhbCBwYXRjaCwganVzdCBhIHJlbmFtZQorCQkgKiBvciBtb2RlIGNoYW5nZSwgc28gd2UgaGFuZGxlIHRoYXQgc3BlY2lhbGx5CisJCSAqLworCQlpZiAoIW1lbWNtcCgiZGlmZiAtLWdpdCAiLCBsaW5lLCAxMSkpIHsKKwkJCWludCBnaXRfaGRyX2xlbiA9IHBhcnNlX2dpdF9oZWFkZXIobGluZSwgbGVuLCBzaXplLCBwYXRjaCk7CisJCQlpZiAoZ2l0X2hkcl9sZW4gPD0gbGVuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFwYXRjaC0+b2xkX25hbWUgJiYgIXBhdGNoLT5uZXdfbmFtZSkgeworCQkJCWlmICghcGF0Y2gtPmRlZl9uYW1lKQorCQkJCQlkaWUoImdpdCBkaWZmIGhlYWRlciBsYWNrcyBmaWxlbmFtZSBpbmZvcm1hdGlvbiAobGluZSAlZCkiLCBsaW5lbnIpOworCQkJCXBhdGNoLT5vbGRfbmFtZSA9IHBhdGNoLT5uZXdfbmFtZSA9IHBhdGNoLT5kZWZfbmFtZTsKKwkJCX0KKwkJCSpoZHJzaXplID0gZ2l0X2hkcl9sZW47CisJCQlyZXR1cm4gb2Zmc2V0OworCQl9CisKKwkJLyoqIC0tLSBmb2xsb3dlZCBieSArKysgPyAqLworCQlpZiAobWVtY21wKCItLS0gIiwgbGluZSwgIDQpIHx8IG1lbWNtcCgiKysrICIsIGxpbmUgKyBsZW4sIDQpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogV2Ugb25seSBhY2NlcHQgdW5pZmllZCBwYXRjaGVzLCBzbyB3ZSB3YW50IGl0IHRvCisJCSAqIGF0IGxlYXN0IGhhdmUgIkBAIC1hLGIgK2MsZCBAQFxuIiwgd2hpY2ggaXMgMTQgY2hhcnMKKwkJICogbWluaW11bQorCQkgKi8KKwkJbmV4dGxlbiA9IGxpbmVsZW4obGluZSArIGxlbiwgc2l6ZSAtIGxlbik7CisJCWlmIChzaXplIDwgbmV4dGxlbiArIDE0IHx8IG1lbWNtcCgiQEAgLSIsIGxpbmUgKyBsZW4gKyBuZXh0bGVuLCA0KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE9rLCB3ZSdsbCBjb25zaWRlciBpdCBhIHBhdGNoICovCisJCXBhcnNlX3RyYWRpdGlvbmFsX3BhdGNoKGxpbmUsIGxpbmUrbGVuLCBwYXRjaCk7CisJCSpoZHJzaXplID0gbGVuICsgbmV4dGxlbjsKKwkJbGluZW5yICs9IDI7CisJCXJldHVybiBvZmZzZXQ7CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIFBhcnNlIGEgdW5pZmllZCBkaWZmLiBOb3RlIHRoYXQgdGhpcyByZWFsbHkgbmVlZHMKKyAqIHRvIHBhcnNlIGVhY2ggZnJhZ21lbnQgc2VwYXJhdGVseSwgc2luY2UgdGhlIG9ubHkKKyAqIHdheSB0byBrbm93IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSAiLS0tIiB0aGF0IGlzCisgKiBwYXJ0IG9mIGEgcGF0Y2gsIGFuZCBhICItLS0iIHRoYXQgc3RhcnRzIHRoZSBuZXh0CisgKiBwYXRjaCBpcyB0byBsb29rIGF0IHRoZSBsaW5lIGNvdW50cy4uCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZnJhZ21lbnQoY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoLCBzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50KQoreworCWludCBhZGRlZCwgZGVsZXRlZDsKKwlpbnQgbGVuID0gbGluZWxlbihsaW5lLCBzaXplKSwgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgb2xkbGluZXMsIG5ld2xpbmVzOworCXVuc2lnbmVkIGxvbmcgbGVhZGluZywgdHJhaWxpbmc7CisKKwlvZmZzZXQgPSBwYXJzZV9mcmFnbWVudF9oZWFkZXIobGluZSwgbGVuLCBmcmFnbWVudCk7CisJaWYgKG9mZnNldCA8IDApCisJCXJldHVybiAtMTsKKwlvbGRsaW5lcyA9IGZyYWdtZW50LT5vbGRsaW5lczsKKwluZXdsaW5lcyA9IGZyYWdtZW50LT5uZXdsaW5lczsKKwlsZWFkaW5nID0gMDsKKwl0cmFpbGluZyA9IDA7CisKKwlpZiAocGF0Y2gtPmlzX25ldyA8IDApIHsKKwkJcGF0Y2gtPmlzX25ldyA9ICAhb2xkbGluZXM7CisJCWlmICghb2xkbGluZXMpCisJCQlwYXRjaC0+b2xkX25hbWUgPSBOVUxMOworCX0KKwlpZiAocGF0Y2gtPmlzX2RlbGV0ZSA8IDApIHsKKwkJcGF0Y2gtPmlzX2RlbGV0ZSA9ICFuZXdsaW5lczsKKwkJaWYgKCFuZXdsaW5lcykKKwkJCXBhdGNoLT5uZXdfbmFtZSA9IE5VTEw7CisJfQorCisJaWYgKHBhdGNoLT5pc19uZXcgJiYgb2xkbGluZXMpCisJCXJldHVybiBlcnJvcigibmV3IGZpbGUgZGVwZW5kcyBvbiBvbGQgY29udGVudHMiKTsKKwlpZiAocGF0Y2gtPmlzX2RlbGV0ZSAhPSAhbmV3bGluZXMpIHsKKwkJaWYgKG5ld2xpbmVzKQorCQkJcmV0dXJuIGVycm9yKCJkZWxldGVkIGZpbGUgc3RpbGwgaGFzIGNvbnRlbnRzIik7CisJCWZwcmludGYoc3RkZXJyLCAiKiogd2FybmluZzogZmlsZSAlcyBiZWNvbWVzIGVtcHR5IGJ1dCBpcyBub3QgZGVsZXRlZFxuIiwgcGF0Y2gtPm5ld19uYW1lKTsKKwl9CisKKwkvKiBQYXJzZSB0aGUgdGhpbmcuLiAqLworCWxpbmUgKz0gbGVuOworCXNpemUgLT0gbGVuOworCWxpbmVucisrOworCWFkZGVkID0gZGVsZXRlZCA9IDA7CisJZm9yIChvZmZzZXQgPSBsZW47IHNpemUgPiAwOyBvZmZzZXQgKz0gbGVuLCBzaXplIC09IGxlbiwgbGluZSArPSBsZW4sIGxpbmVucisrKSB7CisJCWlmICghb2xkbGluZXMgJiYgIW5ld2xpbmVzKQorCQkJYnJlYWs7CisJCWxlbiA9IGxpbmVsZW4obGluZSwgc2l6ZSk7CisJCWlmICghbGVuIHx8IGxpbmVbbGVuLTFdICE9ICdcbicpCisJCQlyZXR1cm4gLTE7CisJCXN3aXRjaCAoKmxpbmUpIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJY2FzZSAnICc6CisJCQlvbGRsaW5lcy0tOworCQkJbmV3bGluZXMtLTsKKwkJCWlmICghZGVsZXRlZCAmJiAhYWRkZWQpCisJCQkJbGVhZGluZysrOworCQkJdHJhaWxpbmcrKzsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCWRlbGV0ZWQrKzsKKwkJCW9sZGxpbmVzLS07CisJCQl0cmFpbGluZyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnKyc6CisJCQkvKgorCQkJICogV2Uga25vdyBsZW4gaXMgYXQgbGVhc3QgdHdvLCBzaW5jZSB3ZSBoYXZlIGEgJysnIGFuZAorCQkJICogd2UgY2hlY2tlZCB0aGF0IHRoZSBsYXN0IGNoYXJhY3RlciB3YXMgYSAnXG4nIGFib3ZlLgorCQkJICogVGhhdCBpcywgYW4gYWRkaXRpb24gb2YgYW4gZW1wdHkgbGluZSB3b3VsZCBjaGVjaworCQkJICogdGhlICcrJyBoZXJlLiAgU25lYWt5Li4uCisJCQkgKi8KKwkJCWlmICgobmV3X3doaXRlc3BhY2UgIT0gbm93YXJuX3doaXRlc3BhY2UpICYmCisJCQkgICAgaXNzcGFjZShsaW5lW2xlbi0yXSkpIHsKKwkJCQl3aGl0ZXNwYWNlX2Vycm9yKys7CisJCQkJaWYgKHNxdWVsY2hfd2hpdGVzcGFjZV9lcnJvcnMgJiYKKwkJCQkgICAgc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA8CisJCQkJICAgIHdoaXRlc3BhY2VfZXJyb3IpCisJCQkJCTsKKwkJCQllbHNlIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJBZGRzIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4lczolZDolLipzXG4iLAorCQkJCQkJcGF0Y2hfaW5wdXRfZmlsZSwKKwkJCQkJCWxpbmVuciwgbGVuLTIsIGxpbmUrMSk7CisJCQkJfQorCQkJfQorCQkJYWRkZWQrKzsKKwkJCW5ld2xpbmVzLS07CisJCQl0cmFpbGluZyA9IDA7CisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIC8qIFdlIGFsbG93ICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiLiBEZXBlbmRpbmcKKyAgICAgICAgICAgICAgICAgKiBvbiBsb2NhbGUgc2V0dGluZ3Mgd2hlbiB0aGUgcGF0Y2ggd2FzIHByb2R1Y2VkIHdlCisgICAgICAgICAgICAgICAgICogZG9uJ3Qga25vdyB3aGF0IHRoaXMgbGluZSBsb29rcyBsaWtlLiBUaGUgb25seQorICAgICAgICAgICAgICAgICAqIHRoaW5nIHdlIGRvIGtub3cgaXMgdGhhdCBpdCBiZWdpbnMgd2l0aCAiXCAiLgorCQkgKiBDaGVja2luZyBmb3IgMTIgaXMganVzdCBmb3Igc2FuaXR5IGNoZWNrIC0tIGFueQorCQkgKiBsMTBuIG9mICJcIE5vIG5ld2xpbmUuLi4iIGlzIGF0IGxlYXN0IHRoYXQgbG9uZy4KKwkJICovCisJCWNhc2UgJ1xcJzoKKwkJCWlmIChsZW4gPCAxMiB8fCBtZW1jbXAobGluZSwgIlxcICIsIDIpKQorCQkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvbGRsaW5lcyB8fCBuZXdsaW5lcykKKwkJcmV0dXJuIC0xOworCWZyYWdtZW50LT5sZWFkaW5nID0gbGVhZGluZzsKKwlmcmFnbWVudC0+dHJhaWxpbmcgPSB0cmFpbGluZzsKKworCS8qIElmIGEgZnJhZ21lbnQgZW5kcyB3aXRoIGFuIGluY29tcGxldGUgbGluZSwgd2UgZmFpbGVkIHRvIGluY2x1ZGUKKwkgKiBpdCBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhpdCBvbGRsaW5lcyA9PSBuZXdsaW5lcyA9PSAwCisJICogYmVmb3JlIHNlZWluZyBpdC4KKwkgKi8KKwlpZiAoMTIgPCBzaXplICYmICFtZW1jbXAobGluZSwgIlxcICIsIDIpKQorCQlvZmZzZXQgKz0gbGluZWxlbihsaW5lLCBzaXplKTsKKworCXBhdGNoLT5saW5lc19hZGRlZCArPSBhZGRlZDsKKwlwYXRjaC0+bGluZXNfZGVsZXRlZCArPSBkZWxldGVkOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2luZ2xlX3BhdGNoKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJc3RydWN0IGZyYWdtZW50ICoqZnJhZ3AgPSAmcGF0Y2gtPmZyYWdtZW50czsKKworCXdoaWxlIChzaXplID4gNCAmJiAhbWVtY21wKGxpbmUsICJAQCAtIiwgNCkpIHsKKwkJc3RydWN0IGZyYWdtZW50ICpmcmFnbWVudDsKKwkJaW50IGxlbjsKKworCQlmcmFnbWVudCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpmcmFnbWVudCkpOworCQlsZW4gPSBwYXJzZV9mcmFnbWVudChsaW5lLCBzaXplLCBwYXRjaCwgZnJhZ21lbnQpOworCQlpZiAobGVuIDw9IDApCisJCQlkaWUoImNvcnJ1cHQgcGF0Y2ggYXQgbGluZSAlZCIsIGxpbmVucik7CisKKwkJZnJhZ21lbnQtPnBhdGNoID0gbGluZTsKKwkJZnJhZ21lbnQtPnNpemUgPSBsZW47CisKKwkJKmZyYWdwID0gZnJhZ21lbnQ7CisJCWZyYWdwID0gJmZyYWdtZW50LT5uZXh0OworCisJCW9mZnNldCArPSBsZW47CisJCWxpbmUgKz0gbGVuOworCQlzaXplIC09IGxlbjsKKwl9CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWV0YWRhdGFfY2hhbmdlcyhzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXJldHVybglwYXRjaC0+aXNfcmVuYW1lID4gMCB8fAorCQlwYXRjaC0+aXNfY29weSA+IDAgfHwKKwkJcGF0Y2gtPmlzX25ldyA+IDAgfHwKKwkJcGF0Y2gtPmlzX2RlbGV0ZSB8fAorCQkocGF0Y2gtPm9sZF9tb2RlICYmIHBhdGNoLT5uZXdfbW9kZSAmJgorCQkgcGF0Y2gtPm9sZF9tb2RlICE9IHBhdGNoLT5uZXdfbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYmluYXJ5KGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCS8qIFdlIGhhdmUgcmVhZCAiR0lUIGJpbmFyeSBwYXRjaFxuIjsgd2hhdCBmb2xsb3dzIGlzIGEgbGluZQorCSAqIHRoYXQgc2F5cyB0aGUgcGF0Y2ggbWV0aG9kIChjdXJyZW50bHksIGVpdGhlciAiZGVmbGF0ZWQKKwkgKiBsaXRlcmFsIiBvciAiZGVmbGF0ZWQgZGVsdGEiKSBhbmQgdGhlIGxlbmd0aCBvZiBkYXRhIGJlZm9yZQorCSAqIGRlZmxhdGluZzsgYSBzZXF1ZW5jZSBvZiAnbGVuZ3RoLWJ5dGUnIGZvbGxvd2VkIGJ5IGJhc2UtODUKKwkgKiBlbmNvZGVkIGRhdGEgZm9sbG93cy4KKwkgKgorCSAqIEVhY2ggNS1ieXRlIHNlcXVlbmNlIG9mIGJhc2UtODUgZW5jb2RlcyB1cCB0byA0IGJ5dGVzLAorCSAqIGFuZCB3ZSB3b3VsZCBsaW1pdCB0aGUgcGF0Y2ggbGluZSB0byA2NiBjaGFyYWN0ZXJzLAorCSAqIHNvIG9uZSBsaW5lIGNhbiBmaXQgdXAgdG8gMTMgZ3JvdXBzIHRoYXQgd291bGQgZGVjb2RlCisJICogdG8gNTIgYnl0ZXMgbWF4LiAgVGhlIGxlbmd0aCBieXRlICdBJy0nWicgY29ycmVzcG9uZHMKKwkgKiB0byAxLTI2IGJ5dGVzLCBhbmQgJ2EnLSd6JyBjb3JyZXNwb25kcyB0byAyNy01MiBieXRlcy4KKwkgKiBUaGUgZW5kIG9mIGJpbmFyeSBpcyBzaWduYWxsZWQgd2l0aCBhbiBlbXB0eSBsaW5lLgorCSAqLworCWludCBsbGVuLCB1c2VkOworCXN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnQ7CisJY2hhciAqZGF0YSA9IE5VTEw7CisKKwlwYXRjaC0+ZnJhZ21lbnRzID0gZnJhZ21lbnQgPSB4Y2FsbG9jKDEsIHNpemVvZigqZnJhZ21lbnQpKTsKKworCS8qIEdyYWIgdGhlIHR5cGUgb2YgcGF0Y2ggKi8KKwlsbGVuID0gbGluZWxlbihidWZmZXIsIHNpemUpOworCXVzZWQgPSBsbGVuOworCWxpbmVucisrOworCisJaWYgKCFzdHJuY21wKGJ1ZmZlciwgImRlbHRhICIsIDYpKSB7CisJCXBhdGNoLT5pc19iaW5hcnkgPSBCSU5BUllfREVMVEFfREVGTEFURUQ7CisJCXBhdGNoLT5kZWZsYXRlX29yaWdsZW4gPSBzdHJ0b3VsKGJ1ZmZlciArIDYsIE5VTEwsIDEwKTsKKwl9CisJZWxzZSBpZiAoIXN0cm5jbXAoYnVmZmVyLCAibGl0ZXJhbCAiLCA4KSkgeworCQlwYXRjaC0+aXNfYmluYXJ5ID0gQklOQVJZX0xJVEVSQUxfREVGTEFURUQ7CisJCXBhdGNoLT5kZWZsYXRlX29yaWdsZW4gPSBzdHJ0b3VsKGJ1ZmZlciArIDgsIE5VTEwsIDEwKTsKKwl9CisJZWxzZQorCQlyZXR1cm4gZXJyb3IoInVucmVjb2duaXplZCBiaW5hcnkgcGF0Y2ggYXQgbGluZSAlZDogJS4qcyIsCisJCQkgICAgIGxpbmVuci0xLCBsbGVuLTEsIGJ1ZmZlcik7CisJYnVmZmVyICs9IGxsZW47CisJd2hpbGUgKDEpIHsKKwkJaW50IGJ5dGVfbGVuZ3RoLCBtYXhfYnl0ZV9sZW5ndGgsIG5ld3NpemU7CisJCWxsZW4gPSBsaW5lbGVuKGJ1ZmZlciwgc2l6ZSk7CisJCXVzZWQgKz0gbGxlbjsKKwkJbGluZW5yKys7CisJCWlmIChsbGVuID09IDEpCisJCQlicmVhazsKKwkJLyogTWluaW11bSBsaW5lIGlzICJBMDAwMDBcbiIgd2hpY2ggaXMgNy1ieXRlIGxvbmcsCisJCSAqIGFuZCB0aGUgbGluZSBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiA1IHBsdXMgMi4KKwkJICovCisJCWlmICgobGxlbiA8IDcpIHx8IChsbGVuLTIpICUgNSkKKwkJCWdvdG8gY29ycnVwdDsKKwkJbWF4X2J5dGVfbGVuZ3RoID0gKGxsZW4gLSAyKSAvIDUgKiA0OworCQlieXRlX2xlbmd0aCA9ICpidWZmZXI7CisJCWlmICgnQScgPD0gYnl0ZV9sZW5ndGggJiYgYnl0ZV9sZW5ndGggPD0gJ1onKQorCQkJYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCAtICdBJyArIDE7CisJCWVsc2UgaWYgKCdhJyA8PSBieXRlX2xlbmd0aCAmJiBieXRlX2xlbmd0aCA8PSAneicpCisJCQlieXRlX2xlbmd0aCA9IGJ5dGVfbGVuZ3RoIC0gJ2EnICsgMjc7CisJCWVsc2UKKwkJCWdvdG8gY29ycnVwdDsKKwkJLyogaWYgdGhlIGlucHV0IGxlbmd0aCB3YXMgbm90IG11bHRpcGxlIG9mIDQsIHdlIHdvdWxkCisJCSAqIGhhdmUgZmlsbGVyIGF0IHRoZSBlbmQgYnV0IHRoZSBmaWxsZXIgc2hvdWxkIG5ldmVyCisJCSAqIGV4Y2VlZCAzIGJ5dGVzCisJCSAqLworCQlpZiAobWF4X2J5dGVfbGVuZ3RoIDwgYnl0ZV9sZW5ndGggfHwKKwkJICAgIGJ5dGVfbGVuZ3RoIDw9IG1heF9ieXRlX2xlbmd0aCAtIDQpCisJCQlnb3RvIGNvcnJ1cHQ7CisJCW5ld3NpemUgPSBmcmFnbWVudC0+c2l6ZSArIGJ5dGVfbGVuZ3RoOworCQlkYXRhID0geHJlYWxsb2MoZGF0YSwgbmV3c2l6ZSk7CisJCWlmIChkZWNvZGVfODUoZGF0YSArIGZyYWdtZW50LT5zaXplLAorCQkJICAgICAgYnVmZmVyICsgMSwKKwkJCSAgICAgIGJ5dGVfbGVuZ3RoKSkKKwkJCWdvdG8gY29ycnVwdDsKKwkJZnJhZ21lbnQtPnNpemUgPSBuZXdzaXplOworCQlidWZmZXIgKz0gbGxlbjsKKwkJc2l6ZSAtPSBsbGVuOworCX0KKwlmcmFnbWVudC0+cGF0Y2ggPSBkYXRhOworCXJldHVybiB1c2VkOworIGNvcnJ1cHQ6CisJcmV0dXJuIGVycm9yKCJjb3JydXB0IGJpbmFyeSBwYXRjaCBhdCBsaW5lICVkOiAlLipzIiwKKwkJICAgICBsaW5lbnItMSwgbGxlbi0xLCBidWZmZXIpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2NodW5rKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWludCBoZHJzaXplLCBwYXRjaHNpemU7CisJaW50IG9mZnNldCA9IGZpbmRfaGVhZGVyKGJ1ZmZlciwgc2l6ZSwgJmhkcnNpemUsIHBhdGNoKTsKKworCWlmIChvZmZzZXQgPCAwKQorCQlyZXR1cm4gb2Zmc2V0OworCisJcGF0Y2hzaXplID0gcGFyc2Vfc2luZ2xlX3BhdGNoKGJ1ZmZlciArIG9mZnNldCArIGhkcnNpemUsIHNpemUgLSBvZmZzZXQgLSBoZHJzaXplLCBwYXRjaCk7CisKKwlpZiAoIXBhdGNoc2l6ZSkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqYmluaGRyW10gPSB7CisJCQkiQmluYXJ5IGZpbGVzICIsCisJCQkiRmlsZXMgIiwKKwkJCU5VTEwsCisJCX07CisJCXN0YXRpYyBjb25zdCBjaGFyIGdpdF9iaW5hcnlbXSA9ICJHSVQgYmluYXJ5IHBhdGNoXG4iOworCQlpbnQgaTsKKwkJaW50IGhkID0gaGRyc2l6ZSArIG9mZnNldDsKKwkJdW5zaWduZWQgbG9uZyBsbGVuID0gbGluZWxlbihidWZmZXIgKyBoZCwgc2l6ZSAtIGhkKTsKKworCQlpZiAobGxlbiA9PSBzaXplb2YoZ2l0X2JpbmFyeSkgLSAxICYmCisJCSAgICAhbWVtY21wKGdpdF9iaW5hcnksIGJ1ZmZlciArIGhkLCBsbGVuKSkgeworCQkJaW50IHVzZWQ7CisJCQlsaW5lbnIrKzsKKwkJCXVzZWQgPSBwYXJzZV9iaW5hcnkoYnVmZmVyICsgaGQgKyBsbGVuLAorCQkJCQkgICAgc2l6ZSAtIGhkIC0gbGxlbiwgcGF0Y2gpOworCQkJaWYgKHVzZWQpCisJCQkJcGF0Y2hzaXplID0gdXNlZCArIGxsZW47CisJCQllbHNlCisJCQkJcGF0Y2hzaXplID0gMDsKKwkJfQorCQllbHNlIGlmICghbWVtY21wKCIgZGlmZmVyXG4iLCBidWZmZXIgKyBoZCArIGxsZW4gLSA4LCA4KSkgeworCQkJZm9yIChpID0gMDsgYmluaGRyW2ldOyBpKyspIHsKKwkJCQlpbnQgbGVuID0gc3RybGVuKGJpbmhkcltpXSk7CisJCQkJaWYgKGxlbiA8IHNpemUgLSBoZCAmJgorCQkJCSAgICAhbWVtY21wKGJpbmhkcltpXSwgYnVmZmVyICsgaGQsIGxlbikpIHsKKwkJCQkJbGluZW5yKys7CisJCQkJCXBhdGNoLT5pc19iaW5hcnkgPSAxOworCQkJCQlwYXRjaHNpemUgPSBsbGVuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBFbXB0eSBwYXRjaCBjYW5ub3QgYmUgYXBwbGllZCBpZjoKKwkJICogLSBpdCBpcyBhIGJpbmFyeSBwYXRjaCBhbmQgd2UgZG8gbm90IGRvIGJpbmFyeV9yZXBsYWNlLCBvcgorCQkgKiAtIHRleHQgcGF0Y2ggd2l0aG91dCBtZXRhZGF0YSBjaGFuZ2UKKwkJICovCisJCWlmICgoYXBwbHkgfHwgY2hlY2spICYmCisJCSAgICAocGF0Y2gtPmlzX2JpbmFyeQorCQkgICAgID8gIWFsbG93X2JpbmFyeV9yZXBsYWNlbWVudAorCQkgICAgIDogIW1ldGFkYXRhX2NoYW5nZXMocGF0Y2gpKSkKKwkJCWRpZSgicGF0Y2ggd2l0aCBvbmx5IGdhcmJhZ2UgYXQgbGluZSAlZCIsIGxpbmVucik7CisJfQorCisJcmV0dXJuIG9mZnNldCArIGhkcnNpemUgKyBwYXRjaHNpemU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHBsdXNlc1tdID0gIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysiOworc3RhdGljIGNvbnN0IGNoYXIgbWludXNlc1tdPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwljb25zdCBjaGFyICpwcmVmaXggPSAiIjsKKwljaGFyICpuYW1lID0gcGF0Y2gtPm5ld19uYW1lOworCWNoYXIgKnFuYW1lID0gTlVMTDsKKwlpbnQgbGVuLCBtYXgsIGFkZCwgZGVsLCB0b3RhbDsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9IHBhdGNoLT5vbGRfbmFtZTsKKworCWlmICgwIDwgKGxlbiA9IHF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgTlVMTCwgMCkpKSB7CisJCXFuYW1lID0geG1hbGxvYyhsZW4gKyAxKTsKKwkJcXVvdGVfY19zdHlsZShuYW1lLCBxbmFtZSwgTlVMTCwgMCk7CisJCW5hbWUgPSBxbmFtZTsKKwl9CisKKwkvKgorCSAqICJzY2FsZSIgdGhlIGZpbGVuYW1lCisJICovCisJbGVuID0gc3RybGVuKG5hbWUpOworCW1heCA9IG1heF9sZW47CisJaWYgKG1heCA+IDUwKQorCQltYXggPSA1MDsKKwlpZiAobGVuID4gbWF4KSB7CisJCWNoYXIgKnNsYXNoOworCQlwcmVmaXggPSAiLi4uIjsKKwkJbWF4IC09IDM7CisJCW5hbWUgKz0gbGVuIC0gbWF4OworCQlzbGFzaCA9IHN0cmNocihuYW1lLCAnLycpOworCQlpZiAoc2xhc2gpCisJCQluYW1lID0gc2xhc2g7CisJfQorCWxlbiA9IG1heDsKKworCS8qCisJICogc2NhbGUgdGhlIGFkZC9kZWxldGUKKwkgKi8KKwltYXggPSBtYXhfY2hhbmdlOworCWlmIChtYXggKyBsZW4gPiA3MCkKKwkJbWF4ID0gNzAgLSBsZW47CisKKwlhZGQgPSBwYXRjaC0+bGluZXNfYWRkZWQ7CisJZGVsID0gcGF0Y2gtPmxpbmVzX2RlbGV0ZWQ7CisJdG90YWwgPSBhZGQgKyBkZWw7CisKKwlpZiAobWF4X2NoYW5nZSA+IDApIHsKKwkJdG90YWwgPSAodG90YWwgKiBtYXggKyBtYXhfY2hhbmdlIC8gMikgLyBtYXhfY2hhbmdlOworCQlhZGQgPSAoYWRkICogbWF4ICsgbWF4X2NoYW5nZSAvIDIpIC8gbWF4X2NoYW5nZTsKKwkJZGVsID0gdG90YWwgLSBhZGQ7CisJfQorCWlmIChwYXRjaC0+aXNfYmluYXJ5KQorCQlwcmludGYoIiAlcyUtKnMgfCAgQmluXG4iLCBwcmVmaXgsIGxlbiwgbmFtZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyUtKnMgfCU1ZCAlLipzJS4qc1xuIiwgcHJlZml4LAorCQkgICAgICAgbGVuLCBuYW1lLCBwYXRjaC0+bGluZXNfYWRkZWQgKyBwYXRjaC0+bGluZXNfZGVsZXRlZCwKKwkJICAgICAgIGFkZCwgcGx1c2VzLCBkZWwsIG1pbnVzZXMpOworCWlmIChxbmFtZSkKKwkJZnJlZShxbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9vbGRfZGF0YShzdHJ1Y3Qgc3RhdCAqc3QsIGNvbnN0IGNoYXIgKnBhdGgsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBmZDsKKwl1bnNpZ25lZCBsb25nIGdvdDsKKworCXN3aXRjaCAoc3QtPnN0X21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZMTks6CisJCXJldHVybiByZWFkbGluayhwYXRoLCBidWYsIHNpemUpOworCWNhc2UgU19JRlJFRzoKKwkJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIG9wZW4gJXMiLCBwYXRoKTsKKwkJZ290ID0gMDsKKwkJZm9yICg7OykgeworCQkJaW50IHJldCA9IHhyZWFkKGZkLCBidWYgKyBnb3QsIHNpemUgLSBnb3QpOworCQkJaWYgKHJldCA8PSAwKQorCQkJCWJyZWFrOworCQkJZ290ICs9IHJldDsKKwkJfQorCQljbG9zZShmZCk7CisJCXJldHVybiBnb3Q7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCitzdGF0aWMgaW50IGZpbmRfb2Zmc2V0KGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICpmcmFnbWVudCwgdW5zaWduZWQgbG9uZyBmcmFnc2l6ZSwgaW50IGxpbmUsIGludCAqbGluZXMpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgYmFja3dhcmRzLCBmb3J3YXJkczsKKworCWlmIChmcmFnc2l6ZSA+IHNpemUpCisJCXJldHVybiAtMTsKKworCXN0YXJ0ID0gMDsKKwlpZiAobGluZSA+IDEpIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCQlpID0gbGluZS0xOworCQl3aGlsZSAob2Zmc2V0ICsgZnJhZ3NpemUgPD0gc2l6ZSkgeworCQkJaWYgKGJ1ZltvZmZzZXQrK10gPT0gJ1xuJykgeworCQkJCXN0YXJ0ID0gb2Zmc2V0OworCQkJCWlmICghLS1pKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIEV4YWN0IGxpbmUgbnVtYmVyPyAqLworCWlmICghbWVtY21wKGJ1ZiArIHN0YXJ0LCBmcmFnbWVudCwgZnJhZ3NpemUpKQorCQlyZXR1cm4gc3RhcnQ7CisKKwkvKgorCSAqIFRoZXJlJ3MgcHJvYmFibHkgc29tZSBzbWFydCB3YXkgdG8gZG8gdGhpcywgYnV0IEknbGwgbGVhdmUKKwkgKiB0aGF0IHRvIHRoZSBzbWFydCBhbmQgYmVhdXRpZnVsIHBlb3BsZS4gSSdtIHNpbXBsZSBhbmQgc3R1cGlkLgorCSAqLworCWJhY2t3YXJkcyA9IHN0YXJ0OworCWZvcndhcmRzID0gc3RhcnQ7CisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB0cnk7CisJCWludCBuOworCisJCS8qICJiYWNrd2FyZCIgKi8KKwkJaWYgKGkgJiAxKSB7CisJCQlpZiAoIWJhY2t3YXJkcykgeworCQkJCWlmIChmb3J3YXJkcyArIGZyYWdzaXplID4gc2l6ZSkKKwkJCQkJYnJlYWs7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkbyB7CisJCQkJLS1iYWNrd2FyZHM7CisJCQl9IHdoaWxlIChiYWNrd2FyZHMgJiYgYnVmW2JhY2t3YXJkcy0xXSAhPSAnXG4nKTsKKwkJCXRyeSA9IGJhY2t3YXJkczsKKwkJfSBlbHNlIHsKKwkJCXdoaWxlIChmb3J3YXJkcyArIGZyYWdzaXplIDw9IHNpemUpIHsKKwkJCQlpZiAoYnVmW2ZvcndhcmRzKytdID09ICdcbicpCisJCQkJCWJyZWFrOworCQkJfQorCQkJdHJ5ID0gZm9yd2FyZHM7CisJCX0KKworCQlpZiAodHJ5ICsgZnJhZ3NpemUgPiBzaXplKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAoYnVmICsgdHJ5LCBmcmFnbWVudCwgZnJhZ3NpemUpKQorCQkJY29udGludWU7CisJCW4gPSAoaSA+PiAxKSsxOworCQlpZiAoaSAmIDEpCisJCQluID0gLW47CisJCSpsaW5lcyA9IG47CisJCXJldHVybiB0cnk7CisJfQorCisJLyoKKwkgKiBXZSBzaG91bGQgc3RhcnQgc2VhcmNoaW5nIGZvcndhcmQgYW5kIGJhY2t3YXJkLgorCSAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZpcnN0X2xpbmUoY29uc3QgY2hhciAqKnJidWYsIGludCAqcnNpemUpCit7CisJY29uc3QgY2hhciAqYnVmID0gKnJidWY7CisJaW50IHNpemUgPSAqcnNpemU7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJb2Zmc2V0ID0gMDsKKwl3aGlsZSAob2Zmc2V0IDw9IHNpemUpIHsKKwkJaWYgKGJ1ZltvZmZzZXQrK10gPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwkqcnNpemUgPSBzaXplIC0gb2Zmc2V0OworCSpyYnVmID0gYnVmICsgb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfbGFzdF9saW5lKGNvbnN0IGNoYXIgKipyYnVmLCBpbnQgKnJzaXplKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9ICpyYnVmOworCWludCBzaXplID0gKnJzaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCW9mZnNldCA9IHNpemUgLSAxOworCXdoaWxlIChvZmZzZXQgPiAwKSB7CisJCWlmIChidWZbLS1vZmZzZXRdID09ICdcbicpCisJCQlicmVhazsKKwl9CisJKnJzaXplID0gb2Zmc2V0ICsgMTsKK30KKworc3RydWN0IGJ1ZmZlcl9kZXNjIHsKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgYWxsb2M7Cit9OworCitzdGF0aWMgaW50IGFwcGx5X2xpbmUoY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpwYXRjaCwgaW50IHBsZW4pCit7CisJLyogcGxlbiBpcyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkIGZyb20gcGF0Y2gsCisJICogc3RhcnRpbmcgYXQgcGF0Y2grMSAocGF0Y2hbMF0gaXMgJysnKS4gIFR5cGljYWxseQorCSAqIHBhdGNoW3BsZW5dIGlzICdcbicuCisJICovCisJaW50IGFkZF9ubF90b190YWlsID0gMDsKKwlpZiAoKG5ld193aGl0ZXNwYWNlID09IHN0cmlwX3doaXRlc3BhY2UpICYmCisJICAgIDEgPCBwbGVuICYmIGlzc3BhY2UocGF0Y2hbcGxlbi0xXSkpIHsKKwkJaWYgKHBhdGNoW3BsZW5dID09ICdcbicpCisJCQlhZGRfbmxfdG9fdGFpbCA9IDE7CisJCXBsZW4tLTsKKwkJd2hpbGUgKDAgPCBwbGVuICYmIGlzc3BhY2UocGF0Y2hbcGxlbl0pKQorCQkJcGxlbi0tOworCQlhcHBsaWVkX2FmdGVyX3N0cmlwcGluZysrOworCX0KKwltZW1jcHkob3V0cHV0LCBwYXRjaCArIDEsIHBsZW4pOworCWlmIChhZGRfbmxfdG9fdGFpbCkKKwkJb3V0cHV0W3BsZW4rK10gPSAnXG4nOworCXJldHVybiBwbGVuOworfQorCitzdGF0aWMgaW50IGFwcGx5X29uZV9mcmFnbWVudChzdHJ1Y3QgYnVmZmVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBmcmFnbWVudCAqZnJhZykKK3sKKwlpbnQgbWF0Y2hfYmVnaW5uaW5nLCBtYXRjaF9lbmQ7CisJY2hhciAqYnVmID0gZGVzYy0+YnVmZmVyOworCWNvbnN0IGNoYXIgKnBhdGNoID0gZnJhZy0+cGF0Y2g7CisJaW50IG9mZnNldCwgc2l6ZSA9IGZyYWctPnNpemU7CisJY2hhciAqb2xkID0geG1hbGxvYyhzaXplKTsKKwljaGFyICpuZXcgPSB4bWFsbG9jKHNpemUpOworCWNvbnN0IGNoYXIgKm9sZGxpbmVzLCAqbmV3bGluZXM7CisJaW50IG9sZHNpemUgPSAwLCBuZXdzaXplID0gMDsKKwl1bnNpZ25lZCBsb25nIGxlYWRpbmcsIHRyYWlsaW5nOworCWludCBwb3MsIGxpbmVzOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWludCBsZW4gPSBsaW5lbGVuKHBhdGNoLCBzaXplKTsKKwkJaW50IHBsZW47CisKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKworCQkvKgorCQkgKiAicGxlbiIgaXMgaG93IG11Y2ggb2YgdGhlIGxpbmUgd2Ugc2hvdWxkIHVzZSBmb3IKKwkJICogdGhlIGFjdHVhbCBwYXRjaCBkYXRhLiBOb3JtYWxseSB3ZSBqdXN0IHJlbW92ZSB0aGUKKwkJICogZmlyc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLCBidXQgaWYgdGhlIGxpbmUgaXMKKwkJICogZm9sbG93ZWQgYnkgIlwgTm8gbmV3bGluZSIsIHRoZW4gd2UgYWxzbyByZW1vdmUgdGhlCisJCSAqIGxhc3Qgb25lICh3aGljaCBpcyB0aGUgbmV3bGluZSwgb2YgY291cnNlKS4KKwkJICovCisJCXBsZW4gPSBsZW4tMTsKKwkJaWYgKGxlbiA8IHNpemUgJiYgcGF0Y2hbbGVuXSA9PSAnXFwnKQorCQkJcGxlbi0tOworCQlzd2l0Y2ggKCpwYXRjaCkgeworCQljYXNlICcgJzoKKwkJY2FzZSAnLSc6CisJCQltZW1jcHkob2xkICsgb2xkc2l6ZSwgcGF0Y2ggKyAxLCBwbGVuKTsKKwkJCW9sZHNpemUgKz0gcGxlbjsKKwkJCWlmICgqcGF0Y2ggPT0gJy0nKQorCQkJCWJyZWFrOworCQkvKiBGYWxsLXRocm91Z2ggZm9yICcgJyAqLworCQljYXNlICcrJzoKKwkJCWlmICgqcGF0Y2ggIT0gJysnIHx8ICFub19hZGQpCisJCQkJbmV3c2l6ZSArPSBhcHBseV9saW5lKG5ldyArIG5ld3NpemUsIHBhdGNoLAorCQkJCQkJICAgICAgcGxlbik7CisJCQlicmVhazsKKwkJY2FzZSAnQCc6IGNhc2UgJ1xcJzoKKwkJCS8qIElnbm9yZSBpdCwgd2UgYWxyZWFkeSBoYW5kbGVkIGl0ICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCQlwYXRjaCArPSBsZW47CisJCXNpemUgLT0gbGVuOworCX0KKworI2lmZGVmIE5PX0FDQ1VSQVRFX0RJRkYKKwlpZiAob2xkc2l6ZSA+IDAgJiYgb2xkW29sZHNpemUgLSAxXSA9PSAnXG4nICYmCisJCQluZXdzaXplID4gMCAmJiBuZXdbbmV3c2l6ZSAtIDFdID09ICdcbicpIHsKKwkJb2xkc2l6ZS0tOworCQluZXdzaXplLS07CisJfQorI2VuZGlmCisKKwlvbGRsaW5lcyA9IG9sZDsKKwluZXdsaW5lcyA9IG5ldzsKKwlsZWFkaW5nID0gZnJhZy0+bGVhZGluZzsKKwl0cmFpbGluZyA9IGZyYWctPnRyYWlsaW5nOworCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGFueSBsZWFkaW5nL3RyYWlsaW5nIGRhdGEgaW4gdGhlIHBhdGNoLAorCSAqIHdlIHdhbnQgaXQgdG8gbWF0Y2ggYXQgdGhlIGJlZ2lubmluZy9lbmQgb2YgdGhlIGZpbGUuCisJICovCisJbWF0Y2hfYmVnaW5uaW5nID0gIWxlYWRpbmcgJiYgKGZyYWctPm9sZHBvcyA9PSAxKTsKKwltYXRjaF9lbmQgPSAhdHJhaWxpbmc7CisKKwlsaW5lcyA9IDA7CisJcG9zID0gZnJhZy0+bmV3cG9zOworCWZvciAoOzspIHsKKwkJb2Zmc2V0ID0gZmluZF9vZmZzZXQoYnVmLCBkZXNjLT5zaXplLCBvbGRsaW5lcywgb2xkc2l6ZSwgcG9zLCAmbGluZXMpOworCQlpZiAobWF0Y2hfZW5kICYmIG9mZnNldCArIG9sZHNpemUgIT0gZGVzYy0+c2l6ZSkKKwkJCW9mZnNldCA9IC0xOworCQlpZiAobWF0Y2hfYmVnaW5uaW5nICYmIG9mZnNldCkKKwkJCW9mZnNldCA9IC0xOworCQlpZiAob2Zmc2V0ID49IDApIHsKKwkJCWludCBkaWZmID0gbmV3c2l6ZSAtIG9sZHNpemU7CisJCQl1bnNpZ25lZCBsb25nIHNpemUgPSBkZXNjLT5zaXplICsgZGlmZjsKKwkJCXVuc2lnbmVkIGxvbmcgYWxsb2MgPSBkZXNjLT5hbGxvYzsKKworCQkJLyogV2FybiBpZiBpdCB3YXMgbmVjZXNzYXJ5IHRvIHJlZHVjZSB0aGUgbnVtYmVyCisJCQkgKiBvZiBjb250ZXh0IGxpbmVzLgorCQkJICovCisJCQlpZiAoKGxlYWRpbmcgIT0gZnJhZy0+bGVhZGluZykgfHwgKHRyYWlsaW5nICE9IGZyYWctPnRyYWlsaW5nKSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbnRleHQgcmVkdWNlZCB0byAoJWxkLyVsZCkgdG8gYXBwbHkgZnJhZ21lbnQgYXQgJWRcbiIsCisJCQkJCWxlYWRpbmcsIHRyYWlsaW5nLCBwb3MgKyBsaW5lcyk7CisKKwkJCWlmIChzaXplID4gYWxsb2MpIHsKKwkJCQlhbGxvYyA9IHNpemUgKyA4MTkyOworCQkJCWRlc2MtPmFsbG9jID0gYWxsb2M7CisJCQkJYnVmID0geHJlYWxsb2MoYnVmLCBhbGxvYyk7CisJCQkJZGVzYy0+YnVmZmVyID0gYnVmOworCQkJfQorCQkJZGVzYy0+c2l6ZSA9IHNpemU7CisJCQltZW1tb3ZlKGJ1ZiArIG9mZnNldCArIG5ld3NpemUsIGJ1ZiArIG9mZnNldCArIG9sZHNpemUsIHNpemUgLSBvZmZzZXQgLSBuZXdzaXplKTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQsIG5ld2xpbmVzLCBuZXdzaXplKTsKKwkJCW9mZnNldCA9IDA7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQW0gSSBhdCBteSBjb250ZXh0IGxpbWl0cz8gKi8KKwkJaWYgKChsZWFkaW5nIDw9IHBfY29udGV4dCkgJiYgKHRyYWlsaW5nIDw9IHBfY29udGV4dCkpCisJCQlicmVhazsKKwkJaWYgKG1hdGNoX2JlZ2lubmluZyB8fCBtYXRjaF9lbmQpIHsKKwkJCW1hdGNoX2JlZ2lubmluZyA9IG1hdGNoX2VuZCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBSZWR1Y2UgdGhlIG51bWJlciBvZiBjb250ZXh0IGxpbmVzCisJCSAqIFJlZHVjZSBib3RoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGlmIHRoZXkgYXJlIGVxdWFsCisJCSAqIG90aGVyd2lzZSBqdXN0IHJlZHVjZSB0aGUgbGFyZ2VyIGNvbnRleHQuCisJCSAqLworCQlpZiAobGVhZGluZyA+PSB0cmFpbGluZykgeworCQkJcmVtb3ZlX2ZpcnN0X2xpbmUoJm9sZGxpbmVzLCAmb2xkc2l6ZSk7CisJCQlyZW1vdmVfZmlyc3RfbGluZSgmbmV3bGluZXMsICZuZXdzaXplKTsKKwkJCXBvcy0tOworCQkJbGVhZGluZy0tOworCQl9CisJCWlmICh0cmFpbGluZyA+IGxlYWRpbmcpIHsKKwkJCXJlbW92ZV9sYXN0X2xpbmUoJm9sZGxpbmVzLCAmb2xkc2l6ZSk7CisJCQlyZW1vdmVfbGFzdF9saW5lKCZuZXdsaW5lcywgJm5ld3NpemUpOworCQkJdHJhaWxpbmctLTsKKwkJfQorCX0KKworCWZyZWUob2xkKTsKKwlmcmVlKG5ldyk7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNoYXIgKmluZmxhdGVfaXQoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJdW5zaWduZWQgbG9uZyBpbmZsYXRlZF9zaXplKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl2b2lkICpvdXQ7CisJaW50IHN0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKworCXN0cmVhbS5uZXh0X2luID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworCXN0cmVhbS5hdmFpbF9pbiA9IHNpemU7CisJc3RyZWFtLm5leHRfb3V0ID0gb3V0ID0geG1hbGxvYyhpbmZsYXRlZF9zaXplKTsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gaW5mbGF0ZWRfc2l6ZTsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCWlmICgoc3QgIT0gWl9TVFJFQU1fRU5EKSB8fCBzdHJlYW0udG90YWxfb3V0ICE9IGluZmxhdGVkX3NpemUpIHsKKwkJZnJlZShvdXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGludCBhcHBseV9iaW5hcnlfZnJhZ21lbnQoc3RydWN0IGJ1ZmZlcl9kZXNjICpkZXNjLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXVuc2lnbmVkIGxvbmcgZHN0X3NpemU7CisJc3RydWN0IGZyYWdtZW50ICpmcmFnbWVudCA9IHBhdGNoLT5mcmFnbWVudHM7CisJdm9pZCAqZGF0YTsKKwl2b2lkICpyZXN1bHQ7CisKKwlkYXRhID0gaW5mbGF0ZV9pdChmcmFnbWVudC0+cGF0Y2gsIGZyYWdtZW50LT5zaXplLAorCQkJICBwYXRjaC0+ZGVmbGF0ZV9vcmlnbGVuKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiBlcnJvcigiY29ycnVwdCBwYXRjaCBkYXRhIik7CisJc3dpdGNoIChwYXRjaC0+aXNfYmluYXJ5KSB7CisJY2FzZSBCSU5BUllfREVMVEFfREVGTEFURUQ6CisJCXJlc3VsdCA9IHBhdGNoX2RlbHRhKGRlc2MtPmJ1ZmZlciwgZGVzYy0+c2l6ZSwKKwkJCQkgICAgIGRhdGEsCisJCQkJICAgICBwYXRjaC0+ZGVmbGF0ZV9vcmlnbGVuLAorCQkJCSAgICAgJmRzdF9zaXplKTsKKwkJZnJlZShkZXNjLT5idWZmZXIpOworCQlkZXNjLT5idWZmZXIgPSByZXN1bHQ7CisJCWZyZWUoZGF0YSk7CisJCWJyZWFrOworCWNhc2UgQklOQVJZX0xJVEVSQUxfREVGTEFURUQ6CisJCWZyZWUoZGVzYy0+YnVmZmVyKTsKKwkJZGVzYy0+YnVmZmVyID0gZGF0YTsKKwkJZHN0X3NpemUgPSBwYXRjaC0+ZGVmbGF0ZV9vcmlnbGVuOworCQlicmVhazsKKwl9CisJaWYgKCFkZXNjLT5idWZmZXIpCisJCXJldHVybiAtMTsKKwlkZXNjLT5zaXplID0gZGVzYy0+YWxsb2MgPSBkc3Rfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBseV9iaW5hcnkoc3RydWN0IGJ1ZmZlcl9kZXNjICpkZXNjLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBwYXRjaC0+b2xkX25hbWUgPyBwYXRjaC0+b2xkX25hbWUgOiBwYXRjaC0+bmV3X25hbWU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBjaGFyIGhkcls1MF07CisJaW50IGhkcmxlbjsKKworCWlmICghYWxsb3dfYmluYXJ5X3JlcGxhY2VtZW50KQorCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBhcHBseSBiaW5hcnkgcGF0Y2ggdG8gJyVzJyAiCisJCQkgICAgICJ3aXRob3V0IC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50IiwKKwkJCSAgICAgbmFtZSk7CisKKwkvKiBGb3Igc2FmZXR5LCB3ZSByZXF1aXJlIHBhdGNoIGluZGV4IGxpbmUgdG8gY29udGFpbgorCSAqIGZ1bGwgNDAtYnl0ZSB0ZXh0dWFsIFNIQTEgZm9yIG9sZCBhbmQgbmV3LCBhdCBsZWFzdCBmb3Igbm93LgorCSAqLworCWlmIChzdHJsZW4ocGF0Y2gtPm9sZF9zaGExX3ByZWZpeCkgIT0gNDAgfHwKKwkgICAgc3RybGVuKHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgpICE9IDQwIHx8CisJICAgIGdldF9zaGExX2hleChwYXRjaC0+b2xkX3NoYTFfcHJlZml4LCBzaGExKSB8fAorCSAgICBnZXRfc2hhMV9oZXgocGF0Y2gtPm5ld19zaGExX3ByZWZpeCwgc2hhMSkpCisJCXJldHVybiBlcnJvcigiY2Fubm90IGFwcGx5IGJpbmFyeSBwYXRjaCB0byAnJXMnICIKKwkJCSAgICAgIndpdGhvdXQgZnVsbCBpbmRleCBsaW5lIiwgbmFtZSk7CisKKwlpZiAocGF0Y2gtPm9sZF9uYW1lKSB7CisJCS8qIFNlZSBpZiB0aGUgb2xkIG9uZSBtYXRjaGVzIHdoYXQgdGhlIHBhdGNoCisJCSAqIGFwcGxpZXMgdG8uCisJCSAqLworCQl3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShkZXNjLT5idWZmZXIsIGRlc2MtPnNpemUsCisJCQkJCWJsb2JfdHlwZSwgc2hhMSwgaGRyLCAmaGRybGVuKTsKKwkJaWYgKHN0cmNtcChzaGExX3RvX2hleChzaGExKSwgcGF0Y2gtPm9sZF9zaGExX3ByZWZpeCkpCisJCQlyZXR1cm4gZXJyb3IoInRoZSBwYXRjaCBhcHBsaWVzIHRvICclcycgKCVzKSwgIgorCQkJCSAgICAgIndoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSAiCisJCQkJICAgICAiY3VycmVudCBjb250ZW50cy4iLAorCQkJCSAgICAgbmFtZSwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwllbHNlIHsKKwkJLyogT3RoZXJ3aXNlLCB0aGUgb2xkIG9uZSBtdXN0IGJlIGVtcHR5LiAqLworCQlpZiAoZGVzYy0+c2l6ZSkKKwkJCXJldHVybiBlcnJvcigidGhlIHBhdGNoIGFwcGxpZXMgdG8gYW4gZW1wdHkgIgorCQkJCSAgICAgIiclcycgYnV0IGl0IGlzIG5vdCBlbXB0eSIsIG5hbWUpOworCX0KKworCWdldF9zaGExX2hleChwYXRjaC0+bmV3X3NoYTFfcHJlZml4LCBzaGExKTsKKwlpZiAoIW1lbWNtcChzaGExLCBudWxsX3NoYTEsIDIwKSkgeworCQlmcmVlKGRlc2MtPmJ1ZmZlcik7CisJCWRlc2MtPmFsbG9jID0gZGVzYy0+c2l6ZSA9IDA7CisJCWRlc2MtPmJ1ZmZlciA9IE5VTEw7CisJCXJldHVybiAwOyAvKiBkZWxldGlvbiBwYXRjaCAqLworCX0KKworCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKSB7CisJCS8qIFdlIGFscmVhZHkgaGF2ZSB0aGUgcG9zdGltYWdlICovCisJCWNoYXIgdHlwZVsxMF07CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCQlmcmVlKGRlc2MtPmJ1ZmZlcik7CisJCWRlc2MtPmJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIHR5cGUsICZzaXplKTsKKwkJaWYgKCFkZXNjLT5idWZmZXIpCisJCQlyZXR1cm4gZXJyb3IoInRoZSBuZWNlc3NhcnkgcG9zdGltYWdlICVzIGZvciAiCisJCQkJICAgICAiJyVzJyBjYW5ub3QgYmUgcmVhZCIsCisJCQkJICAgICBwYXRjaC0+bmV3X3NoYTFfcHJlZml4LCBuYW1lKTsKKwkJZGVzYy0+YWxsb2MgPSBkZXNjLT5zaXplID0gc2l6ZTsKKwl9CisJZWxzZSB7CisJCS8qIFdlIGhhdmUgdmVyaWZpZWQgZGVzYyBtYXRjaGVzIHRoZSBwcmVpbWFnZTsKKwkJICogYXBwbHkgdGhlIHBhdGNoIGRhdGEgdG8gaXQsIHdoaWNoIGlzIHN0b3JlZAorCQkgKiBpbiB0aGUgcGF0Y2gtPmZyYWdtZW50cy0+e3BhdGNoLHNpemV9LgorCQkgKi8KKwkJaWYgKGFwcGx5X2JpbmFyeV9mcmFnbWVudChkZXNjLCBwYXRjaCkpCisJCQlyZXR1cm4gZXJyb3IoImJpbmFyeSBwYXRjaCBkb2VzIG5vdCBhcHBseSB0byAnJXMnIiwKKwkJCQkgICAgIG5hbWUpOworCisJCS8qIHZlcmlmeSB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyAqLworCQl3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShkZXNjLT5idWZmZXIsIGRlc2MtPnNpemUsIGJsb2JfdHlwZSwKKwkJCQkJc2hhMSwgaGRyLCAmaGRybGVuKTsKKwkJaWYgKHN0cmNtcChzaGExX3RvX2hleChzaGExKSwgcGF0Y2gtPm5ld19zaGExX3ByZWZpeCkpCisJCQlyZXR1cm4gZXJyb3IoImJpbmFyeSBwYXRjaCB0byAnJXMnIGNyZWF0ZXMgaW5jb3JyZWN0IHJlc3VsdCIsIG5hbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGx5X2ZyYWdtZW50cyhzdHJ1Y3QgYnVmZmVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJc3RydWN0IGZyYWdtZW50ICpmcmFnID0gcGF0Y2gtPmZyYWdtZW50czsKKwljb25zdCBjaGFyICpuYW1lID0gcGF0Y2gtPm9sZF9uYW1lID8gcGF0Y2gtPm9sZF9uYW1lIDogcGF0Y2gtPm5ld19uYW1lOworCisJaWYgKHBhdGNoLT5pc19iaW5hcnkpCisJCXJldHVybiBhcHBseV9iaW5hcnkoZGVzYywgcGF0Y2gpOworCisJd2hpbGUgKGZyYWcpIHsKKwkJaWYgKGFwcGx5X29uZV9mcmFnbWVudChkZXNjLCBmcmFnKSA8IDApCisJCQlyZXR1cm4gZXJyb3IoInBhdGNoIGZhaWxlZDogJXM6JWxkIiwKKwkJCQkgICAgIG5hbWUsIGZyYWctPm9sZHBvcyk7CisJCWZyYWcgPSBmcmFnLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBseV9kYXRhKHN0cnVjdCBwYXRjaCAqcGF0Y2gsIHN0cnVjdCBzdGF0ICpzdCwgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplLCBhbGxvYzsKKwlzdHJ1Y3QgYnVmZmVyX2Rlc2MgZGVzYzsKKworCXNpemUgPSAwOworCWFsbG9jID0gMDsKKwlidWYgPSBOVUxMOworCWlmIChjYWNoZWQpIHsKKwkJaWYgKGNlKSB7CisJCQljaGFyIHR5cGVbMjBdOworCQkJYnVmID0gcmVhZF9zaGExX2ZpbGUoY2UtPnNoYTEsIHR5cGUsICZzaXplKTsKKwkJCWlmICghYnVmKQorCQkJCXJldHVybiBlcnJvcigicmVhZCBvZiAlcyBmYWlsZWQiLAorCQkJCQkgICAgIHBhdGNoLT5vbGRfbmFtZSk7CisJCQlhbGxvYyA9IHNpemU7CisJCX0KKwl9CisJZWxzZSBpZiAocGF0Y2gtPm9sZF9uYW1lKSB7CisJCXNpemUgPSBzdC0+c3Rfc2l6ZTsKKwkJYWxsb2MgPSBzaXplICsgODE5MjsKKwkJYnVmID0geG1hbGxvYyhhbGxvYyk7CisJCWlmIChyZWFkX29sZF9kYXRhKHN0LCBwYXRjaC0+b2xkX25hbWUsIGJ1ZiwgYWxsb2MpICE9IHNpemUpCisJCQlyZXR1cm4gZXJyb3IoInJlYWQgb2YgJXMgZmFpbGVkIiwgcGF0Y2gtPm9sZF9uYW1lKTsKKwl9CisKKwlkZXNjLnNpemUgPSBzaXplOworCWRlc2MuYWxsb2MgPSBhbGxvYzsKKwlkZXNjLmJ1ZmZlciA9IGJ1ZjsKKwlpZiAoYXBwbHlfZnJhZ21lbnRzKCZkZXNjLCBwYXRjaCkgPCAwKQorCQlyZXR1cm4gLTE7CisJcGF0Y2gtPnJlc3VsdCA9IGRlc2MuYnVmZmVyOworCXBhdGNoLT5yZXN1bHRzaXplID0gZGVzYy5zaXplOworCisJaWYgKHBhdGNoLT5pc19kZWxldGUgJiYgcGF0Y2gtPnJlc3VsdHNpemUpCisJCXJldHVybiBlcnJvcigicmVtb3ZhbCBwYXRjaCBsZWF2ZXMgZmlsZSBjb250ZW50cyIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGF0Y2goc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyICpvbGRfbmFtZSA9IHBhdGNoLT5vbGRfbmFtZTsKKwljb25zdCBjaGFyICpuZXdfbmFtZSA9IHBhdGNoLT5uZXdfbmFtZTsKKwljb25zdCBjaGFyICpuYW1lID0gb2xkX25hbWUgPyBvbGRfbmFtZSA6IG5ld19uYW1lOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBOVUxMOworCisJaWYgKG9sZF9uYW1lKSB7CisJCWludCBjaGFuZ2VkID0gMDsKKwkJaW50IHN0YXRfcmV0ID0gMDsKKwkJdW5zaWduZWQgc3RfbW9kZSA9IDA7CisKKwkJaWYgKCFjYWNoZWQpCisJCQlzdGF0X3JldCA9IGxzdGF0KG9sZF9uYW1lLCAmc3QpOworCQlpZiAoY2hlY2tfaW5kZXgpIHsKKwkJCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhvbGRfbmFtZSwgc3RybGVuKG9sZF9uYW1lKSk7CisJCQlpZiAocG9zIDwgMCkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBkb2VzIG5vdCBleGlzdCBpbiBpbmRleCIsCisJCQkJCSAgICAgb2xkX25hbWUpOworCQkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChzdGF0X3JldCA8IDApIHsKKwkJCQlzdHJ1Y3QgY2hlY2tvdXQgY29zdGF0ZTsKKwkJCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJCQlyZXR1cm4gZXJyb3IoIiVzOiAlcyIsIG9sZF9uYW1lLAorCQkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCS8qIGNoZWNrb3V0ICovCisJCQkJY29zdGF0ZS5iYXNlX2RpciA9ICIiOworCQkJCWNvc3RhdGUuYmFzZV9kaXJfbGVuID0gMDsKKwkJCQljb3N0YXRlLmZvcmNlID0gMDsKKwkJCQljb3N0YXRlLnF1aWV0ID0gMDsKKwkJCQljb3N0YXRlLm5vdF9uZXcgPSAwOworCQkJCWNvc3RhdGUucmVmcmVzaF9jYWNoZSA9IDE7CisJCQkJaWYgKGNoZWNrb3V0X2VudHJ5KGNlLAorCQkJCQkJICAgJmNvc3RhdGUsCisJCQkJCQkgICBOVUxMKSB8fAorCQkJCSAgICBsc3RhdChvbGRfbmFtZSwgJnN0KSkKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKCFjYWNoZWQpCisJCQkJY2hhbmdlZCA9IGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMSk7CisJCQlpZiAoY2hhbmdlZCkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBkb2VzIG5vdCBtYXRjaCBpbmRleCIsCisJCQkJCSAgICAgb2xkX25hbWUpOworCQkJaWYgKGNhY2hlZCkKKwkJCQlzdF9tb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCQl9CisJCWVsc2UgaWYgKHN0YXRfcmV0IDwgMCkKKwkJCXJldHVybiBlcnJvcigiJXM6ICVzIiwgb2xkX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJaWYgKCFjYWNoZWQpCisJCQlzdF9tb2RlID0gbnRvaGwoY3JlYXRlX2NlX21vZGUoc3Quc3RfbW9kZSkpOworCisJCWlmIChwYXRjaC0+aXNfbmV3IDwgMCkKKwkJCXBhdGNoLT5pc19uZXcgPSAwOworCQlpZiAoIXBhdGNoLT5vbGRfbW9kZSkKKwkJCXBhdGNoLT5vbGRfbW9kZSA9IHN0X21vZGU7CisJCWlmICgoc3RfbW9kZSBeIHBhdGNoLT5vbGRfbW9kZSkgJiBTX0lGTVQpCisJCQlyZXR1cm4gZXJyb3IoIiVzOiB3cm9uZyB0eXBlIiwgb2xkX25hbWUpOworCQlpZiAoc3RfbW9kZSAhPSBwYXRjaC0+b2xkX21vZGUpCisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICVzIGhhcyB0eXBlICVvLCBleHBlY3RlZCAlb1xuIiwKKwkJCQlvbGRfbmFtZSwgc3RfbW9kZSwgcGF0Y2gtPm9sZF9tb2RlKTsKKwl9CisKKwlpZiAobmV3X25hbWUgJiYgKHBhdGNoLT5pc19uZXcgfCBwYXRjaC0+aXNfcmVuYW1lIHwgcGF0Y2gtPmlzX2NvcHkpKSB7CisJCWlmIChjaGVja19pbmRleCAmJiBjYWNoZV9uYW1lX3BvcyhuZXdfbmFtZSwgc3RybGVuKG5ld19uYW1lKSkgPj0gMCkKKwkJCXJldHVybiBlcnJvcigiJXM6IGFscmVhZHkgZXhpc3RzIGluIGluZGV4IiwgbmV3X25hbWUpOworCQlpZiAoIWNhY2hlZCkgeworCQkJaWYgKCFsc3RhdChuZXdfbmFtZSwgJnN0KSkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBhbHJlYWR5IGV4aXN0cyBpbiB3b3JraW5nIGRpcmVjdG9yeSIsIG5ld19uYW1lKTsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQkJcmV0dXJuIGVycm9yKCIlczogJXMiLCBuZXdfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlpZiAoIXBhdGNoLT5uZXdfbW9kZSkgeworCQkJaWYgKHBhdGNoLT5pc19uZXcpCisJCQkJcGF0Y2gtPm5ld19tb2RlID0gU19JRlJFRyB8IDA2NDQ7CisJCQllbHNlCisJCQkJcGF0Y2gtPm5ld19tb2RlID0gcGF0Y2gtPm9sZF9tb2RlOworCQl9CisJfQorCisJaWYgKG5ld19uYW1lICYmIG9sZF9uYW1lKSB7CisJCWludCBzYW1lID0gIXN0cmNtcChvbGRfbmFtZSwgbmV3X25hbWUpOworCQlpZiAoIXBhdGNoLT5uZXdfbW9kZSkKKwkJCXBhdGNoLT5uZXdfbW9kZSA9IHBhdGNoLT5vbGRfbW9kZTsKKwkJaWYgKChwYXRjaC0+b2xkX21vZGUgXiBwYXRjaC0+bmV3X21vZGUpICYgU19JRk1UKQorCQkJcmV0dXJuIGVycm9yKCJuZXcgbW9kZSAoJW8pIG9mICVzIGRvZXMgbm90IG1hdGNoIG9sZCBtb2RlICglbyklcyVzIiwKKwkJCQlwYXRjaC0+bmV3X21vZGUsIG5ld19uYW1lLCBwYXRjaC0+b2xkX21vZGUsCisJCQkJc2FtZSA/ICIiIDogIiBvZiAiLCBzYW1lID8gIiIgOiBvbGRfbmFtZSk7CisJfQorCisJaWYgKGFwcGx5X2RhdGEocGF0Y2gsICZzdCwgY2UpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCIlczogcGF0Y2ggZG9lcyBub3QgYXBwbHkiLCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19wYXRjaF9saXN0KHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaW50IGVycm9yID0gMDsKKworCWZvciAoO3BhdGNoIDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkKKwkJZXJyb3IgfD0gY2hlY2tfcGF0Y2gocGF0Y2gpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfbnVsbF9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJcmV0dXJuICFtZW1jbXAoc2hhMSwgbnVsbF9zaGExLCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaW5kZXhfbGlzdChzdHJ1Y3QgcGF0Y2ggKmxpc3QpCit7CisJc3RydWN0IHBhdGNoICpwYXRjaDsKKworCS8qIE9uY2Ugd2Ugc3RhcnQgc3VwcG9ydGluZyB0aGUgcmV2ZXJzZSBwYXRjaCwgaXQgbWF5IGJlCisJICogd29ydGggc2hvd2luZyB0aGUgbmV3IHNoYTEgcHJlZml4LCBidXQgdW50aWwgdGhlbi4uLgorCSAqLworCWZvciAocGF0Y2ggPSBsaXN0OyBwYXRjaDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExX3B0cjsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQluYW1lID0gcGF0Y2gtPm9sZF9uYW1lID8gcGF0Y2gtPm9sZF9uYW1lIDogcGF0Y2gtPm5ld19uYW1lOworCQlpZiAocGF0Y2gtPmlzX25ldykKKwkJCXNoYTFfcHRyID0gbnVsbF9zaGExOworCQllbHNlIGlmIChnZXRfc2hhMShwYXRjaC0+b2xkX3NoYTFfcHJlZml4LCBzaGExKSkKKwkJCWRpZSgic2hhMSBpbmZvcm1hdGlvbiBpcyBsYWNraW5nIG9yIHVzZWxlc3MgKCVzKS4iLAorCQkJICAgIG5hbWUpOworCQllbHNlCisJCQlzaGExX3B0ciA9IHNoYTE7CisKKwkJcHJpbnRmKCIlMDZvICVzCSIscGF0Y2gtPm9sZF9tb2RlLCBzaGExX3RvX2hleChzaGExX3B0cikpOworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIE5VTEwsIDApKQorCQkJcXVvdGVfY19zdHlsZShuYW1lLCBOVUxMLCBzdGRvdXQsIDApOworCQllbHNlCisJCQlmcHV0cyhuYW1lLCBzdGRvdXQpOworCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhdF9wYXRjaF9saXN0KHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaW50IGZpbGVzLCBhZGRzLCBkZWxzOworCisJZm9yIChmaWxlcyA9IGFkZHMgPSBkZWxzID0gMCA7IHBhdGNoIDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkgeworCQlmaWxlcysrOworCQlhZGRzICs9IHBhdGNoLT5saW5lc19hZGRlZDsKKwkJZGVscyArPSBwYXRjaC0+bGluZXNfZGVsZXRlZDsKKwkJc2hvd19zdGF0cyhwYXRjaCk7CisJfQorCisJcHJpbnRmKCIgJWQgZmlsZXMgY2hhbmdlZCwgJWQgaW5zZXJ0aW9ucygrKSwgJWQgZGVsZXRpb25zKC0pXG4iLCBmaWxlcywgYWRkcywgZGVscyk7Cit9CisKK3N0YXRpYyB2b2lkIG51bXN0YXRfcGF0Y2hfbGlzdChzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWZvciAoIDsgcGF0Y2g7IHBhdGNoID0gcGF0Y2gtPm5leHQpIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJbmFtZSA9IHBhdGNoLT5uZXdfbmFtZSA/IHBhdGNoLT5uZXdfbmFtZSA6IHBhdGNoLT5vbGRfbmFtZTsKKwkJcHJpbnRmKCIlZFx0JWRcdCIsIHBhdGNoLT5saW5lc19hZGRlZCwgcGF0Y2gtPmxpbmVzX2RlbGV0ZWQpOworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIE5VTEwsIDApKQorCQkJcXVvdGVfY19zdHlsZShuYW1lLCBOVUxMLCBzdGRvdXQsIDApOworCQllbHNlCisJCQlmcHV0cyhuYW1lLCBzdGRvdXQpOworCQlwdXRjaGFyKCdcbicpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlX21vZGVfbmFtZShjb25zdCBjaGFyICpuZXdkZWxldGUsIHVuc2lnbmVkIGludCBtb2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChtb2RlKQorCQlwcmludGYoIiAlcyBtb2RlICUwNm8gJXNcbiIsIG5ld2RlbGV0ZSwgbW9kZSwgbmFtZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyAlc1xuIiwgbmV3ZGVsZXRlLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19tb2RlX2NoYW5nZShzdHJ1Y3QgcGF0Y2ggKnAsIGludCBzaG93X25hbWUpCit7CisJaWYgKHAtPm9sZF9tb2RlICYmIHAtPm5ld19tb2RlICYmIHAtPm9sZF9tb2RlICE9IHAtPm5ld19tb2RlKSB7CisJCWlmIChzaG93X25hbWUpCisJCQlwcmludGYoIiBtb2RlIGNoYW5nZSAlMDZvID0+ICUwNm8gJXNcbiIsCisJCQkgICAgICAgcC0+b2xkX21vZGUsIHAtPm5ld19tb2RlLCBwLT5uZXdfbmFtZSk7CisJCWVsc2UKKwkJCXByaW50ZigiIG1vZGUgY2hhbmdlICUwNm8gPT4gJTA2b1xuIiwKKwkJCSAgICAgICBwLT5vbGRfbW9kZSwgcC0+bmV3X21vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19yZW5hbWVfY29weShzdHJ1Y3QgcGF0Y2ggKnApCit7CisJY29uc3QgY2hhciAqcmVuYW1lY29weSA9IHAtPmlzX3JlbmFtZSA/ICJyZW5hbWUiIDogImNvcHkiOworCWNvbnN0IGNoYXIgKm9sZCwgKm5ldzsKKworCS8qIEZpbmQgY29tbW9uIHByZWZpeCAqLworCW9sZCA9IHAtPm9sZF9uYW1lOworCW5ldyA9IHAtPm5ld19uYW1lOworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKnNsYXNoX29sZCwgKnNsYXNoX25ldzsKKwkJc2xhc2hfb2xkID0gc3RyY2hyKG9sZCwgJy8nKTsKKwkJc2xhc2hfbmV3ID0gc3RyY2hyKG5ldywgJy8nKTsKKwkJaWYgKCFzbGFzaF9vbGQgfHwKKwkJICAgICFzbGFzaF9uZXcgfHwKKwkJICAgIHNsYXNoX29sZCAtIG9sZCAhPSBzbGFzaF9uZXcgLSBuZXcgfHwKKwkJICAgIG1lbWNtcChvbGQsIG5ldywgc2xhc2hfbmV3IC0gbmV3KSkKKwkJCWJyZWFrOworCQlvbGQgPSBzbGFzaF9vbGQgKyAxOworCQluZXcgPSBzbGFzaF9uZXcgKyAxOworCX0KKwkvKiBwLT5vbGRfbmFtZSB0aHJ1IG9sZCBpcyB0aGUgY29tbW9uIHByZWZpeCwgYW5kIG9sZCBhbmQgbmV3CisJICogdGhyb3VnaCB0aGUgZW5kIG9mIG5hbWVzIGFyZSByZW5hbWVzCisJICovCisJaWYgKG9sZCAhPSBwLT5vbGRfbmFtZSkKKwkJcHJpbnRmKCIgJXMgJS4qc3slcyA9PiAlc30gKCVkJSUpXG4iLCByZW5hbWVjb3B5LAorCQkgICAgICAgKGludCkob2xkIC0gcC0+b2xkX25hbWUpLCBwLT5vbGRfbmFtZSwKKwkJICAgICAgIG9sZCwgbmV3LCBwLT5zY29yZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyAlcyA9PiAlcyAoJWQlJSlcbiIsIHJlbmFtZWNvcHksCisJCSAgICAgICBwLT5vbGRfbmFtZSwgcC0+bmV3X25hbWUsIHAtPnNjb3JlKTsKKwlzaG93X21vZGVfY2hhbmdlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBzdW1tYXJ5X3BhdGNoX2xpc3Qoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlzdHJ1Y3QgcGF0Y2ggKnA7CisKKwlmb3IgKHAgPSBwYXRjaDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPmlzX25ldykKKwkJCXNob3dfZmlsZV9tb2RlX25hbWUoImNyZWF0ZSIsIHAtPm5ld19tb2RlLCBwLT5uZXdfbmFtZSk7CisJCWVsc2UgaWYgKHAtPmlzX2RlbGV0ZSkKKwkJCXNob3dfZmlsZV9tb2RlX25hbWUoImRlbGV0ZSIsIHAtPm9sZF9tb2RlLCBwLT5vbGRfbmFtZSk7CisJCWVsc2UgeworCQkJaWYgKHAtPmlzX3JlbmFtZSB8fCBwLT5pc19jb3B5KQorCQkJCXNob3dfcmVuYW1lX2NvcHkocCk7CisJCQllbHNlIHsKKwkJCQlpZiAocC0+c2NvcmUpIHsKKwkJCQkJcHJpbnRmKCIgcmV3cml0ZSAlcyAoJWQlJSlcbiIsCisJCQkJCSAgICAgICBwLT5uZXdfbmFtZSwgcC0+c2NvcmUpOworCQkJCQlzaG93X21vZGVfY2hhbmdlKHAsIDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXNob3dfbW9kZV9jaGFuZ2UocCwgMSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX3N0YXRzKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaW50IGxpbmVzID0gcGF0Y2gtPmxpbmVzX2FkZGVkICsgcGF0Y2gtPmxpbmVzX2RlbGV0ZWQ7CisKKwlpZiAobGluZXMgPiBtYXhfY2hhbmdlKQorCQltYXhfY2hhbmdlID0gbGluZXM7CisJaWYgKHBhdGNoLT5vbGRfbmFtZSkgeworCQlpbnQgbGVuID0gcXVvdGVfY19zdHlsZShwYXRjaC0+b2xkX25hbWUsIE5VTEwsIE5VTEwsIDApOworCQlpZiAoIWxlbikKKwkJCWxlbiA9IHN0cmxlbihwYXRjaC0+b2xkX25hbWUpOworCQlpZiAobGVuID4gbWF4X2xlbikKKwkJCW1heF9sZW4gPSBsZW47CisJfQorCWlmIChwYXRjaC0+bmV3X25hbWUpIHsKKwkJaW50IGxlbiA9IHF1b3RlX2Nfc3R5bGUocGF0Y2gtPm5ld19uYW1lLCBOVUxMLCBOVUxMLCAwKTsKKwkJaWYgKCFsZW4pCisJCQlsZW4gPSBzdHJsZW4ocGF0Y2gtPm5ld19uYW1lKTsKKwkJaWYgKGxlbiA+IG1heF9sZW4pCisJCQltYXhfbGVuID0gbGVuOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZpbGUoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpZiAod3JpdGVfaW5kZXgpIHsKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0Y2gtPm9sZF9uYW1lKSA8IDApCisJCQlkaWUoInVuYWJsZSB0byByZW1vdmUgJXMgZnJvbSBpbmRleCIsIHBhdGNoLT5vbGRfbmFtZSk7CisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRjaC0+b2xkX25hbWUpOworCX0KKwlpZiAoIWNhY2hlZCkKKwkJdW5saW5rKHBhdGNoLT5vbGRfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9pbmRleF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIG1vZGUsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJdW5zaWduZWQgY2Vfc2l6ZSA9IGNhY2hlX2VudHJ5X3NpemUobmFtZWxlbik7CisKKwlpZiAoIXdyaXRlX2luZGV4KQorCQlyZXR1cm47CisKKwljZSA9IHhjYWxsb2MoMSwgY2Vfc2l6ZSk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBuYW1lbGVuKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWNlLT5jZV9mbGFncyA9IGh0b25zKG5hbWVsZW4pOworCWlmICghY2FjaGVkKSB7CisJCWlmIChsc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJCWRpZSgidW5hYmxlIHRvIHN0YXQgbmV3bHkgY3JlYXRlZCBmaWxlICVzIiwgcGF0aCk7CisJCWZpbGxfc3RhdF9jYWNoZV9pbmZvKGNlLCAmc3QpOworCX0KKwlpZiAod3JpdGVfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgYmxvYl90eXBlLCBjZS0+c2hhMSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgYmFja2luZyBzdG9yZSBmb3IgbmV3bHkgY3JlYXRlZCBmaWxlICVzIiwgcGF0aCk7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERCkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBhZGQgY2FjaGUgZW50cnkgZm9yICVzIiwgcGF0aCk7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGludCBtb2RlLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgZmQ7CisKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJcmV0dXJuIHN5bWxpbmsoYnVmLCBwYXRoKTsKKwlmZCA9IG9wZW4ocGF0aCwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAobW9kZSAmIDAxMDApID8gMDc3NyA6IDA2NjYpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKwl3aGlsZSAoc2l6ZSkgeworCQlpbnQgd3JpdHRlbiA9IHh3cml0ZShmZCwgYnVmLCBzaXplKTsKKwkJaWYgKHdyaXR0ZW4gPCAwKQorCQkJZGllKCJ3cml0aW5nIGZpbGUgJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKCF3cml0dGVuKQorCQkJZGllKCJvdXQgb2Ygc3BhY2Ugd3JpdGluZyBmaWxlICVzIiwgcGF0aCk7CisJCWJ1ZiArPSB3cml0dGVuOworCQlzaXplIC09IHdyaXR0ZW47CisJfQorCWlmIChjbG9zZShmZCkgPCAwKQorCQlkaWUoImNsb3NpbmcgZmlsZSAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAwOworfQorCisvKgorICogV2Ugb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yaWVzIGV4aXN0LAorICogd2hpY2ggaXMgdHJ1ZSA5OSUgb2YgdGhlIHRpbWUgYW55d2F5LiBJZiB0aGV5IGRvbid0LAorICogd2UgY3JlYXRlIHRoZW0gYW5kIHRyeSBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX29uZV9maWxlKGNoYXIgKnBhdGgsIHVuc2lnbmVkIG1vZGUsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChjYWNoZWQpCisJCXJldHVybjsKKwlpZiAoIXRyeV9jcmVhdGVfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpKQorCQlyZXR1cm47CisKKwlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCWlmIChzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKHBhdGgpKQorCQkJcmV0dXJuOworCQlpZiAoIXRyeV9jcmVhdGVfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpKQorCQkJcmV0dXJuOworCX0KKworCWlmIChlcnJubyA9PSBFRVhJU1QpIHsKKwkJdW5zaWduZWQgaW50IG5yID0gZ2V0cGlkKCk7CisKKwkJZm9yICg7OykgeworCQkJY29uc3QgY2hhciAqbmV3cGF0aDsKKwkJCW5ld3BhdGggPSBta3BhdGgoIiVzfiV1IiwgcGF0aCwgbnIpOworCQkJaWYgKCF0cnlfY3JlYXRlX2ZpbGUobmV3cGF0aCwgbW9kZSwgYnVmLCBzaXplKSkgeworCQkJCWlmICghcmVuYW1lKG5ld3BhdGgsIHBhdGgpKQorCQkJCQlyZXR1cm47CisJCQkJdW5saW5rKG5ld3BhdGgpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGVycm5vICE9IEVFWElTVCkKKwkJCQlicmVhazsKKwkJCSsrbnI7CisJCX0KKwl9CisJZGllKCJ1bmFibGUgdG8gd3JpdGUgZmlsZSAlcyBtb2RlICVvIiwgcGF0aCwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9maWxlKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJY2hhciAqcGF0aCA9IHBhdGNoLT5uZXdfbmFtZTsKKwl1bnNpZ25lZCBtb2RlID0gcGF0Y2gtPm5ld19tb2RlOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHBhdGNoLT5yZXN1bHRzaXplOworCWNoYXIgKmJ1ZiA9IHBhdGNoLT5yZXN1bHQ7CisKKwlpZiAoIW1vZGUpCisJCW1vZGUgPSBTX0lGUkVHIHwgMDY0NDsKKwljcmVhdGVfb25lX2ZpbGUocGF0aCwgbW9kZSwgYnVmLCBzaXplKTsKKwlhZGRfaW5kZXhfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpOworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfb3V0X29uZV9yZXN1bHQoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpZiAocGF0Y2gtPmlzX2RlbGV0ZSA+IDApIHsKKwkJcmVtb3ZlX2ZpbGUocGF0Y2gpOworCQlyZXR1cm47CisJfQorCWlmIChwYXRjaC0+aXNfbmV3ID4gMCB8fCBwYXRjaC0+aXNfY29weSkgeworCQljcmVhdGVfZmlsZShwYXRjaCk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBSZW5hbWUgb3IgbW9kaWZpY2F0aW9uIGJvaWxzIGRvd24gdG8gdGhlIHNhbWUKKwkgKiB0aGluZzogcmVtb3ZlIHRoZSBvbGQsIHdyaXRlIHRoZSBuZXcKKwkgKi8KKwlyZW1vdmVfZmlsZShwYXRjaCk7CisJY3JlYXRlX2ZpbGUocGF0Y2gpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9vdXRfcmVzdWx0cyhzdHJ1Y3QgcGF0Y2ggKmxpc3QsIGludCBza2lwcGVkX3BhdGNoKQoreworCWlmICghbGlzdCAmJiAhc2tpcHBlZF9wYXRjaCkKKwkJZGllKCJObyBjaGFuZ2VzIik7CisKKwl3aGlsZSAobGlzdCkgeworCQl3cml0ZV9vdXRfb25lX3Jlc3VsdChsaXN0KTsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK3N0YXRpYyBzdHJ1Y3QgZXhjbHVkZXMgeworCXN0cnVjdCBleGNsdWRlcyAqbmV4dDsKKwljb25zdCBjaGFyICpwYXRoOworfSAqZXhjbHVkZXM7CisKK3N0YXRpYyBpbnQgdXNlX3BhdGNoKHN0cnVjdCBwYXRjaCAqcCkKK3sKKwljb25zdCBjaGFyICpwYXRobmFtZSA9IHAtPm5ld19uYW1lID8gcC0+bmV3X25hbWUgOiBwLT5vbGRfbmFtZTsKKwlzdHJ1Y3QgZXhjbHVkZXMgKnggPSBleGNsdWRlczsKKwl3aGlsZSAoeCkgeworCQlpZiAoZm5tYXRjaCh4LT5wYXRoLCBwYXRobmFtZSwgMCkgPT0gMCkKKwkJCXJldHVybiAwOworCQl4ID0geC0+bmV4dDsKKwl9CisJaWYgKDAgPCBwcmVmaXhfbGVuZ3RoKSB7CisJCWludCBwYXRobGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKwkJaWYgKHBhdGhsZW4gPD0gcHJlZml4X2xlbmd0aCB8fAorCQkgICAgbWVtY21wKHByZWZpeCwgcGF0aG5hbWUsIHByZWZpeF9sZW5ndGgpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFwcGx5X3BhdGNoKGludCBmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemU7CisJY2hhciAqYnVmZmVyID0gcmVhZF9wYXRjaF9maWxlKGZkLCAmc2l6ZSk7CisJc3RydWN0IHBhdGNoICpsaXN0ID0gTlVMTCwgKipsaXN0cCA9ICZsaXN0OworCWludCBza2lwcGVkX3BhdGNoID0gMDsKKworCXBhdGNoX2lucHV0X2ZpbGUgPSBmaWxlbmFtZTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC0xOworCW9mZnNldCA9IDA7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCXN0cnVjdCBwYXRjaCAqcGF0Y2g7CisJCWludCBucjsKKworCQlwYXRjaCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpwYXRjaCkpOworCQluciA9IHBhcnNlX2NodW5rKGJ1ZmZlciArIG9mZnNldCwgc2l6ZSwgcGF0Y2gpOworCQlpZiAobnIgPCAwKQorCQkJYnJlYWs7CisJCWlmICh1c2VfcGF0Y2gocGF0Y2gpKSB7CisJCQlwYXRjaF9zdGF0cyhwYXRjaCk7CisJCQkqbGlzdHAgPSBwYXRjaDsKKwkJCWxpc3RwID0gJnBhdGNoLT5uZXh0OworCQl9IGVsc2UgeworCQkJLyogcGVyaGFwcyBmcmVlIGl0IGEgYml0IGJldHRlcj8gKi8KKwkJCWZyZWUocGF0Y2gpOworCQkJc2tpcHBlZF9wYXRjaCsrOworCQl9CisJCW9mZnNldCArPSBucjsKKwkJc2l6ZSAtPSBucjsKKwl9CisKKwlpZiAod2hpdGVzcGFjZV9lcnJvciAmJiAobmV3X3doaXRlc3BhY2UgPT0gZXJyb3Jfb25fd2hpdGVzcGFjZSkpCisJCWFwcGx5ID0gMDsKKworCXdyaXRlX2luZGV4ID0gY2hlY2tfaW5kZXggJiYgYXBwbHk7CisJaWYgKHdyaXRlX2luZGV4ICYmIG5ld2ZkIDwgMCkgeworCQluZXdmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJmxvY2tfZmlsZSwKKwkJCQkJCSAgZ2V0X2luZGV4X2ZpbGUoKSk7CisJCWlmIChuZXdmZCA8IDApCisJCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgbmV3IGluZGV4IGZpbGUiKTsKKwl9CisJaWYgKGNoZWNrX2luZGV4KSB7CisJCWlmIChyZWFkX2NhY2hlKCkgPCAwKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCBpbmRleCBmaWxlIik7CisJfQorCisJaWYgKChjaGVjayB8fCBhcHBseSkgJiYgY2hlY2tfcGF0Y2hfbGlzdChsaXN0KSA8IDApCisJCWV4aXQoMSk7CisKKwlpZiAoYXBwbHkpCisJCXdyaXRlX291dF9yZXN1bHRzKGxpc3QsIHNraXBwZWRfcGF0Y2gpOworCisJaWYgKHNob3dfaW5kZXhfaW5mbykKKwkJc2hvd19pbmRleF9saXN0KGxpc3QpOworCisJaWYgKGRpZmZzdGF0KQorCQlzdGF0X3BhdGNoX2xpc3QobGlzdCk7CisKKwlpZiAobnVtc3RhdCkKKwkJbnVtc3RhdF9wYXRjaF9saXN0KGxpc3QpOworCisJaWYgKHN1bW1hcnkpCisJCXN1bW1hcnlfcGF0Y2hfbGlzdChsaXN0KTsKKworCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRfYXBwbHlfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiYXBwbHkud2hpdGVzcGFjZSIpKSB7CisJCWFwcGx5X2RlZmF1bHRfd2hpdGVzcGFjZSA9IHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCisKK2ludCBjbWRfYXBwbHkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlpbnQgaTsKKwlpbnQgcmVhZF9zdGRpbiA9IDE7CisJY29uc3QgY2hhciAqd2hpdGVzcGFjZV9vcHRpb24gPSBOVUxMOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQljaGFyICplbmQ7CisJCWludCBmZDsKKworCQlpZiAoIXN0cmNtcChhcmcsICItIikpIHsKKwkJCWFwcGx5X3BhdGNoKDAsICI8c3RkaW4+Iik7CisJCQlyZWFkX3N0ZGluID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLWV4Y2x1ZGU9IiwgMTApKSB7CisJCQlzdHJ1Y3QgZXhjbHVkZXMgKnggPSB4bWFsbG9jKHNpemVvZigqeCkpOworCQkJeC0+cGF0aCA9IGFyZyArIDEwOworCQkJeC0+bmV4dCA9IGV4Y2x1ZGVzOworCQkJZXhjbHVkZXMgPSB4OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi1wIiwgMikpIHsKKwkJCXBfdmFsdWUgPSBhdG9pKGFyZyArIDIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1hZGQiKSkgeworCQkJbm9fYWRkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tc3RhdCIpKSB7CisJCQlhcHBseSA9IDA7CisJCQlkaWZmc3RhdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCIpIHx8CisJCSAgICAhc3RyY21wKGFyZywgIi0tYmluYXJ5IikpIHsKKwkJCWFsbG93X2JpbmFyeV9yZXBsYWNlbWVudCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLW51bXN0YXQiKSkgeworCQkJYXBwbHkgPSAwOworCQkJbnVtc3RhdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN1bW1hcnkiKSkgeworCQkJYXBwbHkgPSAwOworCQkJc3VtbWFyeSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWNoZWNrIikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCWNoZWNrID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0taW5kZXgiKSkgeworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY2FjaGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYXBwbHkiKSkgeworCQkJYXBwbHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1pbmRleC1pbmZvIikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCXNob3dfaW5kZXhfaW5mbyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICIteiIpKSB7CisJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItQyIsIDIpKSB7CisJCQlwX2NvbnRleHQgPSBzdHJ0b3VsKGFyZyArIDIsICZlbmQsIDApOworCQkJaWYgKCplbmQgIT0gJ1wwJykKKwkJCQlkaWUoInVucmVjb2duaXplZCBjb250ZXh0IGNvdW50ICclcyciLCBhcmcgKyAyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLXdoaXRlc3BhY2U9IiwgMTMpKSB7CisJCQl3aGl0ZXNwYWNlX29wdGlvbiA9IGFyZyArIDEzOworCQkJcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oYXJnICsgMTMpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2hlY2tfaW5kZXggJiYgcHJlZml4X2xlbmd0aCA8IDApIHsKKwkJCXByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwkJCXByZWZpeF9sZW5ndGggPSBwcmVmaXggPyBzdHJsZW4ocHJlZml4KSA6IDA7CisJCQlnaXRfY29uZmlnKGdpdF9hcHBseV9jb25maWcpOworCQkJaWYgKCF3aGl0ZXNwYWNlX29wdGlvbiAmJiBhcHBseV9kZWZhdWx0X3doaXRlc3BhY2UpCisJCQkJcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oYXBwbHlfZGVmYXVsdF93aGl0ZXNwYWNlKTsKKwkJfQorCQlpZiAoMCA8IHByZWZpeF9sZW5ndGgpCisJCQlhcmcgPSBwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBhcmcpOworCisJCWZkID0gb3BlbihhcmcsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXVzYWdlKGFwcGx5X3VzYWdlKTsKKwkJcmVhZF9zdGRpbiA9IDA7CisJCXNldF9kZWZhdWx0X3doaXRlc3BhY2VfbW9kZSh3aGl0ZXNwYWNlX29wdGlvbik7CisJCWFwcGx5X3BhdGNoKGZkLCBhcmcpOworCQljbG9zZShmZCk7CisJfQorCXNldF9kZWZhdWx0X3doaXRlc3BhY2VfbW9kZSh3aGl0ZXNwYWNlX29wdGlvbik7CisJaWYgKHJlYWRfc3RkaW4pCisJCWFwcGx5X3BhdGNoKDAsICI8c3RkaW4+Iik7CisJaWYgKHdoaXRlc3BhY2VfZXJyb3IpIHsKKwkJaWYgKHNxdWVsY2hfd2hpdGVzcGFjZV9lcnJvcnMgJiYKKwkJICAgIHNxdWVsY2hfd2hpdGVzcGFjZV9lcnJvcnMgPCB3aGl0ZXNwYWNlX2Vycm9yKSB7CisJCQlpbnQgc3F1ZWxjaGVkID0KKwkJCQl3aGl0ZXNwYWNlX2Vycm9yIC0gc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9yczsKKwkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogc3F1ZWxjaGVkICVkIHdoaXRlc3BhY2UgZXJyb3Ilc1xuIiwKKwkJCQlzcXVlbGNoZWQsCisJCQkJc3F1ZWxjaGVkID09IDEgPyAiIiA6ICJzIik7CisJCX0KKwkJaWYgKG5ld193aGl0ZXNwYWNlID09IGVycm9yX29uX3doaXRlc3BhY2UpCisJCQlkaWUoIiVkIGxpbmUlcyBhZGQlcyB0cmFpbGluZyB3aGl0ZXNwYWNlcy4iLAorCQkJICAgIHdoaXRlc3BhY2VfZXJyb3IsCisJCQkgICAgd2hpdGVzcGFjZV9lcnJvciA9PSAxID8gIiIgOiAicyIsCisJCQkgICAgd2hpdGVzcGFjZV9lcnJvciA9PSAxID8gInMiIDogIiIpOworCQlpZiAoYXBwbGllZF9hZnRlcl9zdHJpcHBpbmcpCisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICVkIGxpbmUlcyBhcHBsaWVkIGFmdGVyIgorCQkJCSIgc3RyaXBwaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2VzLlxuIiwKKwkJCQlhcHBsaWVkX2FmdGVyX3N0cmlwcGluZywKKwkJCQlhcHBsaWVkX2FmdGVyX3N0cmlwcGluZyA9PSAxID8gIiIgOiAicyIpOworCQllbHNlIGlmICh3aGl0ZXNwYWNlX2Vycm9yKQorCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiAlZCBsaW5lJXMgYWRkJXMgdHJhaWxpbmciCisJCQkJIiB3aGl0ZXNwYWNlcy5cbiIsCisJCQkJd2hpdGVzcGFjZV9lcnJvciwKKwkJCQl3aGl0ZXNwYWNlX2Vycm9yID09IDEgPyAiIiA6ICJzIiwKKwkJCQl3aGl0ZXNwYWNlX2Vycm9yID09IDEgPyAicyIgOiAiIik7CisJfQorCisJaWYgKHdyaXRlX2luZGV4KSB7CisJCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCSAgICBjb21taXRfbG9ja19maWxlKCZsb2NrX2ZpbGUpKQorCQkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY2F0LWZpbGUuYyBiL2J1aWx0aW4tY2F0LWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDM2ODE3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jYXQtZmlsZS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcihjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJbG9uZyByZXQgPSB4d3JpdGUoMSwgYnVmLCBzaXplKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qIElnbm9yZSBlcGlwZSAqLworCQkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJCWJyZWFrOworCQkJZGllKCJnaXQtY2F0LWZpbGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICghcmV0KSB7CisJCQlkaWUoImdpdC1jYXQtZmlsZTogZGlzayBmdWxsPyIpOworCQl9CisJCXNpemUgLT0gcmV0OworCQlidWYgKz0gcmV0OworCX0KK30KKworc3RhdGljIGludCBwcHJpbnRfdGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCS8qIHRoZSBwYXJzZXIgaW4gdGFnLmMgaXMgdXNlbGVzcyBoZXJlLiAqLworCWNvbnN0IGNoYXIgKmVuZHAgPSBidWYgKyBzaXplOworCWNvbnN0IGNoYXIgKmNwID0gYnVmOworCisJd2hpbGUgKGNwIDwgZW5kcCkgeworCQljaGFyIGMgPSAqY3ArKzsKKwkJaWYgKGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQlpZiAoNyA8PSBlbmRwIC0gY3AgJiYgIW1lbWNtcCgidGFnZ2VyICIsIGNwLCA3KSkgeworCQkJY29uc3QgY2hhciAqdGFnZ2VyID0gY3A7CisKKwkJCS8qIEZvdW5kIHRoZSB0YWdnZXIgbGluZS4gIENvcHkgb3V0IHRoZSBjb250ZW50cworCQkJICogb2YgdGhlIGJ1ZmZlciBzbyBmYXIuCisJCQkgKi8KKwkJCWZsdXNoX2J1ZmZlcihidWYsIGNwIC0gYnVmKTsKKworCQkJLyoKKwkJCSAqIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCwgbGlrZSBwcmV0dHktcHJpbnRpbmcKKwkJCSAqIHRoZSBkYXRlLgorCQkJICovCisJCQl3aGlsZSAoY3AgPCBlbmRwKSB7CisJCQkJaWYgKCpjcCsrID09ICdcbicpIHsKKwkJCQkJLyogdGFnZ2VyIHRvIGNwIGlzIGEgbGluZQorCQkJCQkgKiB0aGF0IGhhcyBpZGVudCBhbmQgdGltZS4KKwkJCQkJICovCisJCQkJCWNvbnN0IGNoYXIgKnNwID0gdGFnZ2VyOworCQkJCQljaGFyICplcDsKKwkJCQkJdW5zaWduZWQgbG9uZyBkYXRlOworCQkJCQlsb25nIHR6OworCQkJCQl3aGlsZSAoc3AgPCBjcCAmJiAqc3AgIT0gJz4nKQorCQkJCQkJc3ArKzsKKwkJCQkJaWYgKHNwID09IGNwKSB7CisJCQkJCQkvKiBnaXZlIHVwICovCisJCQkJCQlmbHVzaF9idWZmZXIodGFnZ2VyLAorCQkJCQkJCSAgICAgY3AgLSB0YWdnZXIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJd2hpbGUgKHNwIDwgY3AgJiYKKwkJCQkJICAgICAgICEoJzAnIDw9ICpzcCAmJiAqc3AgPD0gJzknKSkKKwkJCQkJCXNwKys7CisJCQkJCWZsdXNoX2J1ZmZlcih0YWdnZXIsIHNwIC0gdGFnZ2VyKTsKKwkJCQkJZGF0ZSA9IHN0cnRvdWwoc3AsICZlcCwgMTApOworCQkJCQl0eiA9IHN0cnRvbChlcCwgTlVMTCwgMTApOworCQkJCQlzcCA9IHNob3dfZGF0ZShkYXRlLCB0eik7CisJCQkJCWZsdXNoX2J1ZmZlcihzcCwgc3RybGVuKHNwKSk7CisJCQkJCXh3cml0ZSgxLCAiXG4iLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNwIDwgZW5kcCAmJiAqY3AgPT0gJ1xuJykKKwkJCS8qIGVuZCBvZiBoZWFkZXIgKi8KKwkJCWJyZWFrOworCX0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGNvcGllZCBvdXQgdGhlIGhlYWRlciB1cCB0byB0aGUgZW5kIG9mCisJICogdGhlIHRhZ2dlciBsaW5lIGFuZCBjcCBwb2ludHMgYXQgb25lIHBhc3QgXG4uICBJdCBjb3VsZCBiZSB0aGUKKwkgKiBuZXh0IGhlYWRlciBsaW5lIGFmdGVyIHRoZSB0YWdnZXIgbGluZSwgb3IgaXQgY291bGQgYmUgYW5vdGhlcgorCSAqIFxuIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGUgaGVhZGVycy4gIFdlIG5lZWQgdG8gY29weSBvdXQgdGhlCisJICogcmVtYWluZGVyIGFzIGlzLgorCSAqLworCWlmIChjcCA8IGVuZHApCisJCWZsdXNoX2J1ZmZlcihjcCwgZW5kcCAtIGNwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNtZF9jYXRfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciB0eXBlWzIwXTsKKwl2b2lkICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBvcHQ7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWlmIChhcmdjICE9IDMpCisJCXVzYWdlKCJnaXQtY2F0LWZpbGUgWy10fC1zfC1lfC1wfDx0eXBlPl0gPHNoYTE+Iik7CisJaWYgKGdldF9zaGExKGFyZ3ZbMl0sIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsyXSk7CisKKwlvcHQgPSAwOworCWlmICggYXJndlsxXVswXSA9PSAnLScgKSB7CisJCW9wdCA9IGFyZ3ZbMV1bMV07CisJCWlmICggIW9wdCB8fCBhcmd2WzFdWzJdICkKKwkJCW9wdCA9IC0xOyAvKiBOb3QgYSBzaW5nbGUgY2hhcmFjdGVyIG9wdGlvbiAqLworCX0KKworCWJ1ZiA9IE5VTEw7CisJc3dpdGNoIChvcHQpIHsKKwljYXNlICd0JzoKKwkJaWYgKCFzaGExX29iamVjdF9pbmZvKHNoYTEsIHR5cGUsIE5VTEwpKSB7CisJCQlwcmludGYoIiVzXG4iLCB0eXBlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSAncyc6CisJCWlmICghc2hhMV9vYmplY3RfaW5mbyhzaGExLCB0eXBlLCAmc2l6ZSkpIHsKKwkJCXByaW50ZigiJWx1XG4iLCBzaXplKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSAnZSc6CisJCXJldHVybiAhaGFzX3NoYTFfZmlsZShzaGExKTsKKworCWNhc2UgJ3AnOgorCQlpZiAoc2hhMV9vYmplY3RfaW5mbyhzaGExLCB0eXBlLCBOVUxMKSkKKwkJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzJdKTsKKworCQkvKiBjdXN0b20gcHJldHR5LXByaW50IGhlcmUgKi8KKwkJaWYgKCFzdHJjbXAodHlwZSwgdHJlZV90eXBlKSkKKwkJCXJldHVybiBjbWRfbHNfdHJlZSgyLCBhcmd2ICsgMSwgTlVMTCk7CisKKwkJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJnNpemUpOworCQlpZiAoIWJ1ZikKKwkJCWRpZSgiQ2Fubm90IHJlYWQgb2JqZWN0ICVzIiwgYXJndlsyXSk7CisJCWlmICghc3RyY21wKHR5cGUsIHRhZ190eXBlKSkKKwkJCXJldHVybiBwcHJpbnRfdGFnKHNoYTEsIGJ1Ziwgc2l6ZSk7CisKKwkJLyogb3RoZXJ3aXNlIGp1c3Qgc3BpdCBvdXQgdGhlIGRhdGEgKi8KKwkJYnJlYWs7CisJY2FzZSAwOgorCQlidWYgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCBhcmd2WzFdLCAmc2l6ZSwgTlVMTCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGllKCJnaXQtY2F0LWZpbGU6IHVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndlsxXSk7CisJfQorCisJaWYgKCFidWYpCisJCWRpZSgiZ2l0LWNhdC1maWxlICVzOiBiYWQgZmlsZSIsIGFyZ3ZbMl0pOworCisJZmx1c2hfYnVmZmVyKGJ1Ziwgc2l6ZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNoZWNrLXJlZi1mb3JtYXQuYyBiL2J1aWx0aW4tY2hlY2stcmVmLWZvcm1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjM5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWNoZWNrLXJlZi1mb3JtYXQuYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworaW50IGNtZF9jaGVja19yZWZfZm9ybWF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoImdpdCBjaGVjay1yZWYtZm9ybWF0IHJlZm5hbWUiKTsKKwlyZXR1cm4gISFjaGVja19yZWZfZm9ybWF0KGFyZ3ZbMV0pOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1jb21taXQtdHJlZS5jIGIvYnVpbHRpbi1jb21taXQtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDgyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWNvbW1pdC10cmVlLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKyNkZWZpbmUgQkxPQ0tJTkcgKDF1bCA8PCAxNCkKKworLyoKKyAqIEZJWE1FISBTaGFyZSB0aGUgY29kZSB3aXRoICJ3cml0ZS10cmVlLmMiCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfYnVmZmVyKGNoYXIgKipidWZwLCB1bnNpZ25lZCBpbnQgKnNpemVwKQoreworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MoQkxPQ0tJTkcpOworCSpzaXplcCA9IDA7CisJKmJ1ZnAgPSBidWY7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9idWZmZXIoY2hhciAqKmJ1ZnAsIHVuc2lnbmVkIGludCAqc2l6ZXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgb25lX2xpbmVbMjA0OF07CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBhbGxvYywgc2l6ZSwgbmV3c2l6ZTsKKwljaGFyICpidWY7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZihvbmVfbGluZSwgc2l6ZW9mKG9uZV9saW5lKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJc2l6ZSA9ICpzaXplcDsKKwluZXdzaXplID0gc2l6ZSArIGxlbjsKKwlhbGxvYyA9IChzaXplICsgMzI3NjcpICYgfjMyNzY3OworCWJ1ZiA9ICpidWZwOworCWlmIChuZXdzaXplID4gYWxsb2MpIHsKKwkJYWxsb2MgPSAobmV3c2l6ZSArIDMyNzY3KSAmIH4zMjc2NzsKKwkJYnVmID0geHJlYWxsb2MoYnVmLCBhbGxvYyk7CisJCSpidWZwID0gYnVmOworCX0KKwkqc2l6ZXAgPSBuZXdzaXplOworCW1lbWNweShidWYgKyBzaXplLCBvbmVfbGluZSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfdmFsaWQodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqZXhwZWN0KQoreworCWNoYXIgdHlwZVsyMF07CisKKwlpZiAoc2hhMV9vYmplY3RfaW5mbyhzaGExLCB0eXBlLCBOVUxMKSkKKwkJZGllKCIlcyBpcyBub3QgYSB2YWxpZCBvYmplY3QiLCBzaGExX3RvX2hleChzaGExKSk7CisJaWYgKGV4cGVjdCAmJiBzdHJjbXAodHlwZSwgZXhwZWN0KSkKKwkJZGllKCIlcyBpcyBub3QgYSB2YWxpZCAnJXMnIG9iamVjdCIsIHNoYTFfdG9faGV4KHNoYTEpLAorCQkgICAgZXhwZWN0KTsKK30KKworLyoKKyAqIEhhdmluZyBtb3JlIHRoYW4gdHdvIHBhcmVudHMgaXMgbm90IHN0cmFuZ2UgYXQgYWxsLCBhbmQgdGhpcyBpcworICogaG93IG11bHRpLXdheSBtZXJnZXMgYXJlIHJlcHJlc2VudGVkLgorICovCisjZGVmaW5lIE1BWFBBUkVOVCAoMTYpCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYXJlbnRfc2hhMVtNQVhQQVJFTlRdWzIwXTsKKworc3RhdGljIGNvbnN0IGNoYXIgY29tbWl0X3RyZWVfdXNhZ2VbXSA9ICJnaXQtY29tbWl0LXRyZWUgPHNoYTE+IFstcCA8c2hhMT5dKiA8IGNoYW5nZWxvZyI7CisKK3N0YXRpYyBpbnQgbmV3X3BhcmVudChpbnQgaWR4KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnNoYTEgPSBwYXJlbnRfc2hhMVtpZHhdOworCWZvciAoaSA9IDA7IGkgPCBpZHg7IGkrKykgeworCQlpZiAoIW1lbWNtcChwYXJlbnRfc2hhMVtpXSwgc2hhMSwgMjApKSB7CisJCQllcnJvcigiZHVwbGljYXRlIHBhcmVudCAlcyBpZ25vcmVkIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludCBjbWRfY29tbWl0X3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlpbnQgaTsKKwlpbnQgcGFyZW50cyA9IDA7CisJdW5zaWduZWQgY2hhciB0cmVlX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgY29tbWl0X3NoYTFbMjBdOworCWNoYXIgY29tbWVudFsxMDAwXTsKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzZXR1cF9pZGVudCgpOworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWlmIChhcmdjIDwgMikKKwkJdXNhZ2UoY29tbWl0X3RyZWVfdXNhZ2UpOworCWlmIChnZXRfc2hhMShhcmd2WzFdLCB0cmVlX3NoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisKKwljaGVja192YWxpZCh0cmVlX3NoYTEsIHRyZWVfdHlwZSk7CisJZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkgKz0gMikgeworCQljb25zdCBjaGFyICphLCAqYjsKKwkJYSA9IGFyZ3ZbaV07IGIgPSBhcmd2W2krMV07CisJCWlmICghYiB8fCBzdHJjbXAoYSwgIi1wIikpCisJCQl1c2FnZShjb21taXRfdHJlZV91c2FnZSk7CisJCWlmIChnZXRfc2hhMShiLCBwYXJlbnRfc2hhMVtwYXJlbnRzXSkpCisJCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYik7CisJCWNoZWNrX3ZhbGlkKHBhcmVudF9zaGExW3BhcmVudHNdLCBjb21taXRfdHlwZSk7CisJCWlmIChuZXdfcGFyZW50KHBhcmVudHMpKQorCQkJcGFyZW50cysrOworCX0KKwlpZiAoIXBhcmVudHMpCisJCWZwcmludGYoc3RkZXJyLCAiQ29tbWl0dGluZyBpbml0aWFsIHRyZWUgJXNcbiIsIGFyZ3ZbMV0pOworCisJaW5pdF9idWZmZXIoJmJ1ZmZlciwgJnNpemUpOworCWFkZF9idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJ0cmVlICVzXG4iLCBzaGExX3RvX2hleCh0cmVlX3NoYTEpKTsKKworCS8qCisJICogTk9URSEgVGhpcyBvcmRlcmluZyBtZWFucyB0aGF0IHRoZSBzYW1lIGV4YWN0IHRyZWUgbWVyZ2VkIHdpdGggYQorCSAqIGRpZmZlcmVudCBvcmRlciBvZiBwYXJlbnRzIHdpbGwgYmUgYSBfZGlmZmVyZW50XyBjaGFuZ2VzZXQgZXZlbgorCSAqIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGF5cyB0aGUgc2FtZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFyZW50czsgaSsrKQorCQlhZGRfYnVmZmVyKCZidWZmZXIsICZzaXplLCAicGFyZW50ICVzXG4iLCBzaGExX3RvX2hleChwYXJlbnRfc2hhMVtpXSkpOworCisJLyogUGVyc29uL2RhdGUgaW5mb3JtYXRpb24gKi8KKwlhZGRfYnVmZmVyKCZidWZmZXIsICZzaXplLCAiYXV0aG9yICVzXG4iLCBnaXRfYXV0aG9yX2luZm8oMSkpOworCWFkZF9idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJjb21taXR0ZXIgJXNcblxuIiwgZ2l0X2NvbW1pdHRlcl9pbmZvKDEpKTsKKworCS8qIEFuZCBhZGQgdGhlIGNvbW1lbnQgKi8KKwl3aGlsZSAoZmdldHMoY29tbWVudCwgc2l6ZW9mKGNvbW1lbnQpLCBzdGRpbikgIT0gTlVMTCkKKwkJYWRkX2J1ZmZlcigmYnVmZmVyLCAmc2l6ZSwgIiVzIiwgY29tbWVudCk7CisKKwlpZiAoIXdyaXRlX3NoYTFfZmlsZShidWZmZXIsIHNpemUsIGNvbW1pdF90eXBlLCBjb21taXRfc2hhMSkpIHsKKwkJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoY29tbWl0X3NoYTEpKTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKwkJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNvdW50LmMgYi9idWlsdGluLWNvdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlNzJkZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY291bnQuYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCBjb3VudC1vYmplY3RzIi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGNvdW50X29iamVjdHNfdXNhZ2VbXSA9ICJnaXQtY291bnQtb2JqZWN0cyBbLXZdIjsKKworc3RhdGljIHZvaWQgY291bnRfb2JqZWN0cyhESVIgKmQsIGNoYXIgKnBhdGgsIGludCBsZW4sIGludCB2ZXJib3NlLAorCQkJICB1bnNpZ25lZCBsb25nICpsb29zZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqbG9vc2Vfc2l6ZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqcGFja2VkX2xvb3NlLAorCQkJICB1bnNpZ25lZCBsb25nICpnYXJiYWdlKQoreworCXN0cnVjdCBkaXJlbnQgKmVudDsKKwl3aGlsZSAoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKwkJY2hhciBoZXhbNDFdOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQljb25zdCBjaGFyICpjcDsKKwkJaW50IGJhZCA9IDA7CisKKwkJaWYgKChlbnQtPmRfbmFtZVswXSA9PSAnLicpICYmCisJCSAgICAoZW50LT5kX25hbWVbMV0gPT0gMCB8fAorCQkgICAgICgoZW50LT5kX25hbWVbMV0gPT0gJy4nKSAmJiAoZW50LT5kX25hbWVbMl0gPT0gMCkpKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGNwID0gZW50LT5kX25hbWU7ICpjcDsgY3ArKykgeworCQkJaW50IGNoID0gKmNwOworCQkJaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fAorCQkJICAgICgnYScgPD0gY2ggJiYgY2ggPD0gJ2YnKSkKKwkJCQljb250aW51ZTsKKwkJCWJhZCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY3AgLSBlbnQtPmRfbmFtZSAhPSAzOCkKKwkJCWJhZCA9IDE7CisJCWVsc2UgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQltZW1jcHkocGF0aCArIGxlbiArIDMsIGVudC0+ZF9uYW1lLCAzOCk7CisJCQlwYXRoW2xlbiArIDJdID0gJy8nOworCQkJcGF0aFtsZW4gKyA0MV0gPSAwOworCQkJaWYgKGxzdGF0KHBhdGgsICZzdCkgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCQkJYmFkID0gMTsKKwkJCWVsc2UKKwkJCQkoKmxvb3NlX3NpemUpICs9IHN0LnN0X2Jsb2NrczsKKwkJfQorCQlpZiAoYmFkKSB7CisJCQlpZiAodmVyYm9zZSkgeworCQkJCWVycm9yKCJnYXJiYWdlIGZvdW5kOiAlLipzLyVzIiwKKwkJCQkgICAgICBsZW4gKyAyLCBwYXRoLCBlbnQtPmRfbmFtZSk7CisJCQkJKCpnYXJiYWdlKSsrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJKCpsb29zZSkrKzsKKwkJaWYgKCF2ZXJib3NlKQorCQkJY29udGludWU7CisJCW1lbWNweShoZXgsIHBhdGgrbGVuLCAyKTsKKwkJbWVtY3B5KGhleCsyLCBlbnQtPmRfbmFtZSwgMzgpOworCQloZXhbNDBdID0gMDsKKwkJaWYgKGdldF9zaGExX2hleChoZXgsIHNoYTEpKQorCQkJZGllKCJpbnRlcm5hbCBlcnJvciIpOworCQlpZiAoaGFzX3NoYTFfcGFjayhzaGExKSkKKwkJCSgqcGFja2VkX2xvb3NlKSsrOworCX0KK30KKworaW50IGNtZF9jb3VudF9vYmplY3RzKGludCBhYywgY29uc3QgY2hhciAqKmF2LCBjaGFyICoqZXApCit7CisJaW50IGk7CisJaW50IHZlcmJvc2UgPSAwOworCWNvbnN0IGNoYXIgKm9iamRpciA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJaW50IGxlbiA9IHN0cmxlbihvYmpkaXIpOworCWNoYXIgKnBhdGggPSB4bWFsbG9jKGxlbiArIDUwKTsKKwl1bnNpZ25lZCBsb25nIGxvb3NlID0gMCwgcGFja2VkID0gMCwgcGFja2VkX2xvb3NlID0gMCwgZ2FyYmFnZSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb29zZV9zaXplID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBhYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGF2W2ldOworCQlpZiAoKmFyZyAhPSAnLScpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItdiIpKQorCQkJdmVyYm9zZSA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKGNvdW50X29iamVjdHNfdXNhZ2UpOworCX0KKworCS8qIHdlIGRvIG5vdCB0YWtlIGFyZ3VtZW50cyBvdGhlciB0aGFuIGZsYWdzIGZvciBub3cgKi8KKwlpZiAoaSA8IGFjKQorCQl1c2FnZShjb3VudF9vYmplY3RzX3VzYWdlKTsKKwltZW1jcHkocGF0aCwgb2JqZGlyLCBsZW4pOworCWlmIChsZW4gJiYgb2JqZGlyW2xlbi0xXSAhPSAnLycpCisJCXBhdGhbbGVuKytdID0gJy8nOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlESVIgKmQ7CisJCXNwcmludGYocGF0aCArIGxlbiwgIiUwMngiLCBpKTsKKwkJZCA9IG9wZW5kaXIocGF0aCk7CisJCWlmICghZCkKKwkJCWNvbnRpbnVlOworCQljb3VudF9vYmplY3RzKGQsIHBhdGgsIGxlbiwgdmVyYm9zZSwKKwkJCSAgICAgICZsb29zZSwgJmxvb3NlX3NpemUsICZwYWNrZWRfbG9vc2UsICZnYXJiYWdlKTsKKwkJY2xvc2VkaXIoZCk7CisJfQorCWlmICh2ZXJib3NlKSB7CisJCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCQlpZiAoIXBhY2tlZF9naXQpCisJCQlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwkJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWlmICghcC0+cGFja19sb2NhbCkKKwkJCQljb250aW51ZTsKKwkJCXBhY2tlZCArPSBudW1fcGFja2VkX29iamVjdHMocCk7CisJCX0KKwkJcHJpbnRmKCJjb3VudDogJWx1XG4iLCBsb29zZSk7CisJCXByaW50Zigic2l6ZTogJWx1XG4iLCBsb29zZV9zaXplIC8gMik7CisJCXByaW50ZigiaW4tcGFjazogJWx1XG4iLCBwYWNrZWQpOworCQlwcmludGYoInBydW5lLXBhY2thYmxlOiAlbHVcbiIsIHBhY2tlZF9sb29zZSk7CisJCXByaW50ZigiZ2FyYmFnZTogJWx1XG4iLCBnYXJiYWdlKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiVsdSBvYmplY3RzLCAlbHUga2lsb2J5dGVzXG4iLAorCQkgICAgICAgbG9vc2UsIGxvb3NlX3NpemUgLyAyKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZGlmZi1maWxlcy5jIGIvYnVpbHRpbi1kaWZmLWZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViZGE4MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZGlmZi1maWxlcy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZGlmZl9maWxlc191c2FnZVtdID0KKyJnaXQtZGlmZi1maWxlcyBbLXFdIFstMC8tMS8yLzMgfC1jfC0tY2NdIFs8Y29tbW9uIGRpZmYgb3B0aW9ucz5dIFs8cGF0aD4uLi5dIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfZmlsZXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCWludCBzaWxlbnQgPSAwOworCisJZ2l0X2NvbmZpZyhnaXRfZGlmZl9jb25maWcpOworCWluaXRfcmV2aXNpb25zKCZyZXYpOworCXJldi5hYmJyZXYgPSAwOworCisJYXJnYyA9IHNldHVwX3JldmlzaW9ucyhhcmdjLCBhcmd2LCAmcmV2LCBOVUxMKTsKKwl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tYmFzZSIpKQorCQkJcmV2Lm1heF9jb3VudCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tb3VycyIpKQorCQkJcmV2Lm1heF9jb3VudCA9IDI7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tdGhlaXJzIikpCisJCQlyZXYubWF4X2NvdW50ID0gMzsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLXEiKSkKKwkJCXNpbGVudCA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKGRpZmZfZmlsZXNfdXNhZ2UpOworCQlhcmd2Kys7IGFyZ2MtLTsKKwl9CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlcmUgYXJlIE5PIHJldmlzaW9uIChpLmUuIHBlbmRpbmcgb2JqZWN0KSBwYXJhbWV0ZXIsCisJICogcmV2Lm1heF9jb3VudCBpcyByZWFzb25hYmxlICgwIDw9IG4gPD0gMyksCisJICogdGhlcmUgaXMgbm8gb3RoZXIgcmV2aXNpb24gZmlsdGVyaW5nIHBhcmFtZXRlcnMuCisJICovCisJaWYgKHJldi5wZW5kaW5nX29iamVjdHMgfHwKKwkgICAgcmV2Lm1pbl9hZ2UgIT0gLTEgfHwgcmV2Lm1heF9hZ2UgIT0gLTEpCisJCXVzYWdlKGRpZmZfZmlsZXNfdXNhZ2UpOworCS8qCisJICogQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3YXJ0IC0gImRpZmYtZmlsZXMgLXMiIHVzZWQgdG8KKwkgKiBkZWZlYXQgdGhlIGNvbW1vbiBkaWZmIG9wdGlvbiAiLXMiIHdoaWNoIGFza2VkIGZvcgorCSAqIERJRkZfRk9STUFUX05PX09VVFBVVC4KKwkgKi8KKwlpZiAocmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9OT19PVVRQVVQpCisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisJcmV0dXJuIHJ1bl9kaWZmX2ZpbGVzKCZyZXYsIHNpbGVudCk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWRpZmYtaW5kZXguYyBiL2J1aWx0aW4tZGlmZi1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTg1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWRpZmYtaW5kZXguYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGRpZmZfY2FjaGVfdXNhZ2VbXSA9CisiZ2l0LWRpZmYtaW5kZXggWy1tXSBbLS1jYWNoZWRdICIKKyJbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8cGF0aD4uLi5dIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCWludCBjYWNoZWQgPSAwOworCWludCBpOworCisJZ2l0X2NvbmZpZyhnaXRfZGlmZl9jb25maWcpOworCWluaXRfcmV2aXNpb25zKCZyZXYpOworCXJldi5hYmJyZXYgPSAwOworCisJYXJnYyA9IHNldHVwX3JldmlzaW9ucyhhcmdjLCBhcmd2LCAmcmV2LCBOVUxMKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCQkKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkKKwkJCWNhY2hlZCA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKGRpZmZfY2FjaGVfdXNhZ2UpOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmUgcmV2aXNpb24gKGkuZS4gcGVuZGluZyBvYmplY3QpLAorCSAqIGFuZCB0aGVyZSBpcyBubyByZXZpc2lvbiBmaWx0ZXJpbmcgcGFyYW1ldGVycy4KKwkgKi8KKwlpZiAoIXJldi5wZW5kaW5nX29iamVjdHMgfHwgcmV2LnBlbmRpbmdfb2JqZWN0cy0+bmV4dCB8fAorCSAgICByZXYubWF4X2NvdW50ICE9IC0xIHx8IHJldi5taW5fYWdlICE9IC0xIHx8IHJldi5tYXhfYWdlICE9IC0xKQorCQl1c2FnZShkaWZmX2NhY2hlX3VzYWdlKTsKKwlyZXR1cm4gcnVuX2RpZmZfaW5kZXgoJnJldiwgY2FjaGVkKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZGlmZi1zdGFnZXMuYyBiL2J1aWx0aW4tZGlmZi1zdGFnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzE1N2NhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLXN0YWdlcy5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIHN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZl9vcHRpb25zOworCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX3N0YWdlc191c2FnZVtdID0KKyJnaXQtZGlmZi1zdGFnZXMgWzxjb21tb24gZGlmZiBvcHRpb25zPl0gPHN0YWdlMT4gPHN0YWdlMj4gWzxwYXRoPi4uLl0iCitDT01NT05fRElGRl9PUFRJT05TX0hFTFA7CisKK3N0YXRpYyB2b2lkIGRpZmZfc3RhZ2VzKGludCBzdGFnZTEsIGludCBzdGFnZTIsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwlpbnQgaSA9IDA7CisJd2hpbGUgKGkgPCBhY3RpdmVfbnIpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgKnN0YWdlc1s0XSA9IHsgTlVMTCwgfTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpvbmUsICp0d287CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWludCBsZW4sIHNraXA7CisKKwkJY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCXNraXAgPSAhY2VfcGF0aF9tYXRjaChjZSwgcGF0aHNwZWMpOworCQlsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJbmFtZSA9IGNlLT5uYW1lOworCQlmb3IgKDs7KSB7CisJCQlpbnQgc3RhZ2UgPSBjZV9zdGFnZShjZSk7CisJCQlzdGFnZXNbc3RhZ2VdID0gY2U7CisJCQlpZiAoYWN0aXZlX25yIDw9ICsraSkKKwkJCQlicmVhazsKKwkJCWNlID0gYWN0aXZlX2NhY2hlW2ldOworCQkJaWYgKGNlX25hbWVsZW4oY2UpICE9IGxlbiB8fAorCQkJICAgIG1lbWNtcChuYW1lLCBjZS0+bmFtZSwgbGVuKSkKKwkJCQlicmVhazsKKwkJfQorCQlvbmUgPSBzdGFnZXNbc3RhZ2UxXTsKKwkJdHdvID0gc3RhZ2VzW3N0YWdlMl07CisKKwkJaWYgKHNraXAgfHwgKCFvbmUgJiYgIXR3bykpCisJCQljb250aW51ZTsKKwkJaWYgKCFvbmUpCisJCQlkaWZmX2FkZHJlbW92ZSgmZGlmZl9vcHRpb25zLCAnKycsIG50b2hsKHR3by0+Y2VfbW9kZSksCisJCQkJICAgICAgIHR3by0+c2hhMSwgbmFtZSwgTlVMTCk7CisJCWVsc2UgaWYgKCF0d28pCisJCQlkaWZmX2FkZHJlbW92ZSgmZGlmZl9vcHRpb25zLCAnLScsIG50b2hsKG9uZS0+Y2VfbW9kZSksCisJCQkJICAgICAgIG9uZS0+c2hhMSwgbmFtZSwgTlVMTCk7CisJCWVsc2UgaWYgKG1lbWNtcChvbmUtPnNoYTEsIHR3by0+c2hhMSwgMjApIHx8CisJCQkgKG9uZS0+Y2VfbW9kZSAhPSB0d28tPmNlX21vZGUpIHx8CisJCQkgZGlmZl9vcHRpb25zLmZpbmRfY29waWVzX2hhcmRlcikKKwkJCWRpZmZfY2hhbmdlKCZkaWZmX29wdGlvbnMsCisJCQkJICAgIG50b2hsKG9uZS0+Y2VfbW9kZSksIG50b2hsKHR3by0+Y2VfbW9kZSksCisJCQkJICAgIG9uZS0+c2hhMSwgdHdvLT5zaGExLCBuYW1lLCBOVUxMKTsKKwl9Cit9CisKK2ludCBjbWRfZGlmZl9zdGFnZXMoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsIGNoYXIgKiplbnZwKQoreworCWludCBzdGFnZTEsIHN0YWdlMjsKKwljb25zdCBjaGFyICpwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gTlVMTDsKKworCWdpdF9jb25maWcoZ2l0X2RpZmZfY29uZmlnKTsKKwlyZWFkX2NhY2hlKCk7CisJZGlmZl9zZXR1cCgmZGlmZl9vcHRpb25zKTsKKwl3aGlsZSAoMSA8IGFjICYmIGF2WzFdWzBdID09ICctJykgeworCQljb25zdCBjaGFyICphcmcgPSBhdlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXIiKSkKKwkJCTsgLyogYXMgdXN1YWwgKi8KKwkJZWxzZSB7CisJCQlpbnQgZGlmZl9vcHRfY250OworCQkJZGlmZl9vcHRfY250ID0gZGlmZl9vcHRfcGFyc2UoJmRpZmZfb3B0aW9ucywKKwkJCQkJCSAgICAgIGF2KzEsIGFjLTEpOworCQkJaWYgKGRpZmZfb3B0X2NudCA8IDApCisJCQkJdXNhZ2UoZGlmZl9zdGFnZXNfdXNhZ2UpOworCQkJZWxzZSBpZiAoZGlmZl9vcHRfY250KSB7CisJCQkJYXYgKz0gZGlmZl9vcHRfY250OworCQkJCWFjIC09IGRpZmZfb3B0X2NudDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQl1c2FnZShkaWZmX3N0YWdlc191c2FnZSk7CisJCX0KKwkJYWMtLTsgYXYrKzsKKwl9CisKKwlpZiAoYWMgPCAzIHx8CisJICAgIHNzY2FuZihhdlsxXSwgIiVkIiwgJnN0YWdlMSkgIT0gMSB8fAorCSAgICAhICgwIDw9IHN0YWdlMSAmJiBzdGFnZTEgPD0gMykgfHwKKwkgICAgc3NjYW5mKGF2WzJdLCAiJWQiLCAmc3RhZ2UyKSAhPSAxIHx8CisJICAgICEgKDAgPD0gc3RhZ2UyICYmIHN0YWdlMiA8PSAzKSkKKwkJdXNhZ2UoZGlmZl9zdGFnZXNfdXNhZ2UpOworCisJYXYgKz0gMzsgLyogVGhlIHJlc3QgZnJvbSBhdlswXSBhcmUgZm9yIHBhdGhzIHJlc3RyaWN0aW9uLiAqLworCXBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXYpOworCisJaWYgKGRpZmZfc2V0dXBfZG9uZSgmZGlmZl9vcHRpb25zKSA8IDApCisJCXVzYWdlKGRpZmZfc3RhZ2VzX3VzYWdlKTsKKworCWRpZmZfc3RhZ2VzKHN0YWdlMSwgc3RhZ2UyLCBwYXRoc3BlYyk7CisJZGlmZmNvcmVfc3RkKCZkaWZmX29wdGlvbnMpOworCWRpZmZfZmx1c2goJmRpZmZfb3B0aW9ucyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWRpZmYtdHJlZS5jIGIvYnVpbHRpbi1kaWZmLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNmNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLXRyZWUuYwpAQCAtMCwwICsxLDE1MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgc3RydWN0IHJldl9pbmZvIGxvZ190cmVlX29wdDsKKworc3RhdGljIGludCBkaWZmX3RyZWVfY29tbWl0X3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwlpZiAoIWNvbW1pdCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBsb2dfdHJlZV9jb21taXQoJmxvZ190cmVlX29wdCwgY29tbWl0KTsKK30KKworc3RhdGljIGludCBkaWZmX3RyZWVfc3RkaW4oY2hhciAqbGluZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJaWYgKCFsZW4gfHwgbGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJcmV0dXJuIC0xOworCWxpbmVbbGVuLTFdID0gMDsKKwlpZiAoZ2V0X3NoYTFfaGV4KGxpbmUsIHNoYTEpKQorCQlyZXR1cm4gLTE7CisJY29tbWl0ID0gbG9va3VwX2NvbW1pdChzaGExKTsKKwlpZiAoIWNvbW1pdCB8fCBwYXJzZV9jb21taXQoY29tbWl0KSkKKwkJcmV0dXJuIC0xOworCWlmIChpc3NwYWNlKGxpbmVbNDBdKSAmJiAhZ2V0X3NoYTFfaGV4KGxpbmUrNDEsIHNoYTEpKSB7CisJCS8qIEdyYWZ0IHRoZSBmYWtlIHBhcmVudHMgbG9jYWxseSB0byB0aGUgY29tbWl0ICovCisJCWludCBwb3MgPSA0MTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICoqcHB0ciwgKnBhcmVudHM7CisKKwkJLyogRnJlZSB0aGUgcmVhbCBwYXJlbnQgbGlzdCAqLworCQlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7IHBhcmVudHM7ICkgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICp0bXAgPSBwYXJlbnRzLT5uZXh0OworCQkJZnJlZShwYXJlbnRzKTsKKwkJCXBhcmVudHMgPSB0bXA7CisJCX0KKwkJY29tbWl0LT5wYXJlbnRzID0gTlVMTDsKKwkJcHB0ciA9ICYoY29tbWl0LT5wYXJlbnRzKTsKKwkJd2hpbGUgKGxpbmVbcG9zXSAmJiAhZ2V0X3NoYTFfaGV4KGxpbmUgKyBwb3MsIHNoYTEpKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCQkJaWYgKHBhcmVudCkgeworCQkJCXBwdHIgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KHBhcmVudCwgcHB0ciktPm5leHQ7CisJCQl9CisJCQlwb3MgKz0gNDE7CisJCX0KKwl9CisJcmV0dXJuIGxvZ190cmVlX2NvbW1pdCgmbG9nX3RyZWVfb3B0LCBjb21taXQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX3RyZWVfdXNhZ2VbXSA9CisiZ2l0LWRpZmYtdHJlZSBbLS1zdGRpbl0gWy1tXSBbLWNdIFstLWNjXSBbLXNdIFstdl0gWy0tcHJldHR5XSBbLXRdIFstcl0gWy0tcm9vdF0gIgorIls8Y29tbW9uIGRpZmYgb3B0aW9ucz5dIDx0cmVlLWlzaD4gWzx0cmVlLWlzaD5dIFs8cGF0aD4uLi5dXG4iCisiICAtciAgICAgICAgICAgIGRpZmYgcmVjdXJzaXZlbHlcbiIKKyIgIC0tcm9vdCAgICAgICAgaW5jbHVkZSB0aGUgaW5pdGlhbCBjb21taXQgYXMgZGlmZiBhZ2FpbnN0IC9kZXYvbnVsbFxuIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWludCBucl9zaGExOworCWNoYXIgbGluZVsxMDAwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICp0cmVlMSwgKnRyZWUyOworCXN0YXRpYyBzdHJ1Y3QgcmV2X2luZm8gKm9wdCA9ICZsb2dfdHJlZV9vcHQ7CisJc3RydWN0IG9iamVjdF9saXN0ICpsaXN0OworCWludCByZWFkX3N0ZGluID0gMDsKKworCWdpdF9jb25maWcoZ2l0X2RpZmZfY29uZmlnKTsKKwlucl9zaGExID0gMDsKKwlpbml0X3JldmlzaW9ucyhvcHQpOworCW9wdC0+YWJicmV2ID0gMDsKKwlvcHQtPmRpZmYgPSAxOworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgb3B0LCBOVUxMKTsKKworCXdoaWxlICgtLWFyZ2MgPiAwKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9ICorK2FyZ3Y7CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdGRpbiIpKSB7CisJCQlyZWFkX3N0ZGluID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKGRpZmZfdHJlZV91c2FnZSk7CisJfQorCisJLyoKKwkgKiBOT1RFISAic2V0dXBfcmV2aXNpb25zKCkiIHdpbGwgaGF2ZSBpbnNlcnRlZCB0aGUgcmV2aXNpb25zCisJICogaXQgcGFyc2VkIGluIHJldmVyc2Ugb3JkZXIuIFNvIGlmIHlvdSBkbworCSAqCisJICoJZ2l0LWRpZmYtdHJlZSBhIGIKKwkgKgorCSAqIHRoZSBjb21taXQgbGlzdCB3aWxsIGJlICJiIiAtPiAiYSIgLT4gTlVMTCwgc28gd2UgcmV2ZXJzZQorCSAqIHRoZSBvcmRlciBvZiB0aGUgb2JqZWN0cyBpZiB0aGUgZmlyc3Qgb25lIGlzIG5vdCBtYXJrZWQKKwkgKiBVTklOVEVSRVNUSU5HLgorCSAqLworCW5yX3NoYTEgPSAwOworCWxpc3QgPSBvcHQtPnBlbmRpbmdfb2JqZWN0czsKKwlpZiAobGlzdCkgeworCQlucl9zaGExKys7CisJCXRyZWUxID0gbGlzdC0+aXRlbTsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWlmIChsaXN0KSB7CisJCQlucl9zaGExKys7CisJCQl0cmVlMiA9IHRyZWUxOworCQkJdHJlZTEgPSBsaXN0LT5pdGVtOworCQkJaWYgKGxpc3QtPm5leHQpCisJCQkJdXNhZ2UoZGlmZl90cmVlX3VzYWdlKTsKKwkJCS8qIFN3aXRjaCB0aGVtIGFyb3VuZCBpZiB0aGUgc2Vjb25kIG9uZSB3YXMgdW5pbnRlcmVzdGluZy4uICovCisJCQlpZiAodHJlZTItPmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJCXN0cnVjdCBvYmplY3QgKnRtcCA9IHRyZWUyOworCQkJCXRyZWUyID0gdHJlZTE7CisJCQkJdHJlZTEgPSB0bXA7CisJCQl9CisJCX0KKwl9CisKKwlzd2l0Y2ggKG5yX3NoYTEpIHsKKwljYXNlIDA6CisJCWlmICghcmVhZF9zdGRpbikKKwkJCXVzYWdlKGRpZmZfdHJlZV91c2FnZSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGlmZl90cmVlX2NvbW1pdF9zaGExKHRyZWUxLT5zaGExKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkaWZmX3RyZWVfc2hhMSh0cmVlMS0+c2hhMSwKKwkJCSAgICAgICB0cmVlMi0+c2hhMSwKKwkJCSAgICAgICAiIiwgJm9wdC0+ZGlmZm9wdCk7CisJCWxvZ190cmVlX2RpZmZfZmx1c2gob3B0KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZWFkX3N0ZGluKQorCQlyZXR1cm4gMDsKKworCWlmIChvcHQtPmRpZmZvcHQuZGV0ZWN0X3JlbmFtZSkKKwkJb3B0LT5kaWZmb3B0LnNldHVwIHw9IChESUZGX1NFVFVQX1VTRV9TSVpFX0NBQ0hFIHwKKwkJCQkgICAgICAgRElGRl9TRVRVUF9VU0VfQ0FDSEUpOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJCWlmIChnZXRfc2hhMV9oZXgobGluZSwgc2hhMSkpIHsKKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJfQorCQllbHNlCisJCQlkaWZmX3RyZWVfc3RkaW4obGluZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1kaWZmLmMgYi9idWlsdGluLWRpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQ1MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLmMKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBCdWlsdGluICJnaXQgZGlmZiIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAibG9nLXRyZWUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKy8qIE5FRURTV09SSzogc3RydWN0IG9iamVjdCBoYXMgcGxhY2UgZm9yIG5hbWUgYnV0IHdlIF9kb18KKyAqIGtub3cgbW9kZSB3aGVuIHdlIGV4dHJhY3RlZCB0aGUgYmxvYiBvdXQgb2YgYSB0cmVlLCB3aGljaAorICogd2UgY3VycmVudGx5IGxvc2UuCisgKi8KK3N0cnVjdCBibG9iaW5mbyB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9kaWZmX3VzYWdlW10gPQorImRpZmYgPG9wdGlvbnM+IDxyZXY+ezAsMn0gLS0gPHBhdGg+KiI7CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2ZpbGVzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2lsZW50ID0gMDsKKwl3aGlsZSAoMSA8IGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1iYXNlIikpCisJCQlyZXZzLT5tYXhfY291bnQgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tb3VycyIpKQorCQkJcmV2cy0+bWF4X2NvdW50ID0gMjsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXRoZWlycyIpKQorCQkJcmV2cy0+bWF4X2NvdW50ID0gMzsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItcSIpKQorCQkJc2lsZW50ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXJhdyIpKQorCQkJcmV2cy0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUkFXOworCQllbHNlCisJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQlhcmd2Kys7IGFyZ2MtLTsKKwl9CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlcmUgYXJlIE5PIHJldmlzaW9uIChpLmUuIHBlbmRpbmcgb2JqZWN0KSBwYXJhbWV0ZXIsCisJICogc3BlY2lmaWVkIHJldi5tYXhfY291bnQgaXMgcmVhc29uYWJsZSAoMCA8PSBuIDw9IDMpLCBhbmQKKwkgKiB0aGVyZSBpcyBubyBvdGhlciByZXZpc2lvbiBmaWx0ZXJpbmcgcGFyYW1ldGVyLgorCSAqLworCWlmIChyZXZzLT5wZW5kaW5nX29iamVjdHMgfHwKKwkgICAgcmV2cy0+bWluX2FnZSAhPSAtMSB8fAorCSAgICByZXZzLT5tYXhfYWdlICE9IC0xIHx8CisJICAgIDMgPCByZXZzLT5tYXhfY291bnQpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJaWYgKHJldnMtPm1heF9jb3VudCA8IDAgJiYKKwkgICAgKHJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9QQVRDSCkpCisJCXJldnMtPmNvbWJpbmVfbWVyZ2VzID0gcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzID0gMTsKKwkvKgorCSAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2FydCAtICJkaWZmLWZpbGVzIC1zIiB1c2VkIHRvCisJICogZGVmZWF0IHRoZSBjb21tb24gZGlmZiBvcHRpb24gIi1zIiB3aGljaCBhc2tlZCBmb3IKKwkgKiBESUZGX0ZPUk1BVF9OT19PVVRQVVQuCisJICovCisJaWYgKHJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9OT19PVVRQVVQpCisJCXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKwlyZXR1cm4gcnVuX2RpZmZfZmlsZXMocmV2cywgc2lsZW50KTsKK30KKworc3RhdGljIHZvaWQgc3R1ZmZfY2hhbmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwKKwkJCSB1bnNpZ25lZCBvbGRfbW9kZSwgdW5zaWduZWQgbmV3X21vZGUsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsCisJCQkgY29uc3QgY2hhciAqb2xkX25hbWUsCisJCQkgY29uc3QgY2hhciAqbmV3X25hbWUpCit7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwgKnR3bzsKKworCWlmIChtZW1jbXAobnVsbF9zaGExLCBvbGRfc2hhMSwgMjApICYmCisJICAgIG1lbWNtcChudWxsX3NoYTEsIG5ld19zaGExLCAyMCkgJiYKKwkgICAgIW1lbWNtcChvbGRfc2hhMSwgbmV3X3NoYTEsIDIwKSkKKwkJcmV0dXJuOworCisJaWYgKG9wdC0+cmV2ZXJzZV9kaWZmKSB7CisJCXVuc2lnbmVkIHRtcDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqdG1wX3U7CisJCWNvbnN0IGNoYXIgKnRtcF9jOworCQl0bXAgPSBvbGRfbW9kZTsgb2xkX21vZGUgPSBuZXdfbW9kZTsgbmV3X21vZGUgPSB0bXA7CisJCXRtcF91ID0gb2xkX3NoYTE7IG9sZF9zaGExID0gbmV3X3NoYTE7IG5ld19zaGExID0gdG1wX3U7CisJCXRtcF9jID0gb2xkX25hbWU7IG9sZF9uYW1lID0gbmV3X25hbWU7IG5ld19uYW1lID0gdG1wX2M7CisJfQorCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKG9sZF9uYW1lKTsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhuZXdfbmFtZSk7CisJZmlsbF9maWxlc3BlYyhvbmUsIG9sZF9zaGExLCBvbGRfbW9kZSk7CisJZmlsbF9maWxlc3BlYyh0d28sIG5ld19zaGExLCBuZXdfbW9kZSk7CisKKwkvKiBORUVEU1dPUks6IHNob3VsZG4ndCB0aGlzIHBhcnQgb2YgZGlmZm9wdD8/PyAqLworCWRpZmZfcXVldWUoJmRpZmZfcXVldWVkX2RpZmYsIG9uZSwgdHdvKTsKK30KKworc3RhdGljIGludCBidWlsdGluX2RpZmZfYl9mKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQkgICAgc3RydWN0IGJsb2JpbmZvICpibG9iLAorCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJLyogQmxvYiB2cyBmaWxlIGluIHRoZSB3b3JraW5nIHRyZWUqLworCXN0cnVjdCBzdGF0IHN0OworCisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWlmICghc3RyY21wKGFyZywgIi0tcmF3IikpCisJCQlyZXZzLT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisJCWVsc2UKKwkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCWFyZ3YrKzsgYXJnYy0tOworCX0KKwlpZiAobHN0YXQocGF0aCwgJnN0KSkKKwkJZGllKCInJXMnOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKCEoU19JU1JFRyhzdC5zdF9tb2RlKSB8fCBTX0lTTE5LKHN0LnN0X21vZGUpKSkKKwkJZGllKCInJXMnOiBub3QgYSByZWd1bGFyIGZpbGUgb3Igc3ltbGluayIsIHBhdGgpOworCXN0dWZmX2NoYW5nZSgmcmV2cy0+ZGlmZm9wdCwKKwkJICAgICBjYW5vbl9tb2RlKHN0LnN0X21vZGUpLCBjYW5vbl9tb2RlKHN0LnN0X21vZGUpLAorCQkgICAgIGJsb2JbMF0uc2hhMSwgbnVsbF9zaGExLAorCQkgICAgIHBhdGgsIHBhdGgpOworCWRpZmZjb3JlX3N0ZCgmcmV2cy0+ZGlmZm9wdCk7CisJZGlmZl9mbHVzaCgmcmV2cy0+ZGlmZm9wdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2Jsb2JzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCSAgICAgIHN0cnVjdCBibG9iaW5mbyAqYmxvYikKK3sKKwkvKiBCbG9iczogdGhlIGFyZ3VtZW50cyBhcmUgcmV2ZXJzZWQgd2hlbiBzZXR1cF9yZXZpc2lvbnMoKQorCSAqIHBpY2tlZCB0aGVtIHVwLgorCSAqLworCXVuc2lnbmVkIG1vZGUgPSBjYW5vbl9tb2RlKFNfSUZSRUcgfCAwNjQ0KTsKKworCXdoaWxlICgxIDwgYXJnYykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXN0cmNtcChhcmcsICItLXJhdyIpKQorCQkJcmV2cy0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUkFXOworCQllbHNlCisJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQlhcmd2Kys7IGFyZ2MtLTsKKwl9CisJc3R1ZmZfY2hhbmdlKCZyZXZzLT5kaWZmb3B0LAorCQkgICAgIG1vZGUsIG1vZGUsCisJCSAgICAgYmxvYlsxXS5zaGExLCBibG9iWzBdLnNoYTEsCisJCSAgICAgYmxvYlswXS5uYW1lLCBibG9iWzBdLm5hbWUpOworCWRpZmZjb3JlX3N0ZCgmcmV2cy0+ZGlmZm9wdCk7CisJZGlmZl9mbHVzaCgmcmV2cy0+ZGlmZm9wdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2luZGV4KHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgY2FjaGVkID0gMDsKKwl3aGlsZSAoMSA8IGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkKKwkJCWNhY2hlZCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1yYXciKSkKKwkJCXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKwkJZWxzZQorCQkJdXNhZ2UoYnVpbHRpbl9kaWZmX3VzYWdlKTsKKwkJYXJndisrOyBhcmdjLS07CisJfQorCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIG9uZSByZXZpc2lvbiAoaS5lLiBwZW5kaW5nIG9iamVjdCksCisJICogYW5kIHRoZXJlIGlzIG5vIHJldmlzaW9uIGZpbHRlcmluZyBwYXJhbWV0ZXJzLgorCSAqLworCWlmICghcmV2cy0+cGVuZGluZ19vYmplY3RzIHx8IHJldnMtPnBlbmRpbmdfb2JqZWN0cy0+bmV4dCB8fAorCSAgICByZXZzLT5tYXhfY291bnQgIT0gLTEgfHwgcmV2cy0+bWluX2FnZSAhPSAtMSB8fAorCSAgICByZXZzLT5tYXhfYWdlICE9IC0xKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCXJldHVybiBydW5fZGlmZl9pbmRleChyZXZzLCBjYWNoZWQpOworfQorCitzdGF0aWMgaW50IGJ1aWx0aW5fZGlmZl90cmVlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICAgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJICAgICBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmVudCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICooc2hhMVsyXSk7CisJaW50IHN3YXAgPSAxOworCXdoaWxlICgxIDwgYXJnYykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXN0cmNtcChhcmcsICItLXJhdyIpKQorCQkJcmV2cy0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUkFXOworCQllbHNlCisJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQlhcmd2Kys7IGFyZ2MtLTsKKwl9CisKKwkvKiBXZSBzYXcgdHdvIHRyZWVzLCBlbnRbMF0gYW5kIGVudFsxXS4KKwkgKiB1bmxlc3MgZW50WzBdIGlzIHVuaW50ZXN0aW5nLCB0aGV5IGFyZSBzd2FwcGVkCisJICovCisJaWYgKGVudFswXS5pdGVtLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCXN3YXAgPSAwOworCXNoYTFbc3dhcF0gPSBlbnRbMF0uaXRlbS0+c2hhMTsKKwlzaGExWzEtc3dhcF0gPSBlbnRbMV0uaXRlbS0+c2hhMTsKKwlkaWZmX3RyZWVfc2hhMShzaGExWzBdLCBzaGExWzFdLCAiIiwgJnJldnMtPmRpZmZvcHQpOworCWxvZ190cmVlX2RpZmZfZmx1c2gocmV2cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2NvbWJpbmVkKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCQkgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJCSBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmVudCwKKwkJCQkgaW50IGVudHMpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAoKnBhcmVudClbMjBdOworCWludCBpOworCisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWlmICghc3RyY21wKGFyZywgIi0tcmF3IikpCisJCQlyZXZzLT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisJCWVsc2UKKwkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCWFyZ3YrKzsgYXJnYy0tOworCX0KKwlpZiAoIXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyAmJiAhcmV2cy0+Y29tYmluZV9tZXJnZXMpCisJCXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IHJldnMtPmNvbWJpbmVfbWVyZ2VzID0gMTsKKwlwYXJlbnQgPSB4bWFsbG9jKGVudHMgKiBzaXplb2YoKnBhcmVudCkpOworCS8qIEFnYWluLCB0aGUgcmV2cyBhcmUgYWxsIHJldmVyc2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50czsgaSsrKQorCQltZW1jcHkocGFyZW50ICsgaSwgZW50W2VudHMgLSAxIC0gaV0uaXRlbS0+c2hhMSwgMjApOworCWRpZmZfdHJlZV9jb21iaW5lZChwYXJlbnRbMF0sIHBhcmVudCArIDEsIGVudHMgLSAxLAorCQkJICAgcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLCByZXZzKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhZGRfaGVhZChzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJaWYgKGdldF9zaGExKCJIRUFEIiwgc2hhMSkpCisJCXJldHVybjsKKwlvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCXJldHVybjsKKwlhZGRfb2JqZWN0KG9iaiwgJnJldnMtPnBlbmRpbmdfb2JqZWN0cywgTlVMTCwgIkhFQUQiKTsKK30KKworaW50IGNtZF9kaWZmKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QsIGVudFsxMDBdOworCWludCBlbnRzID0gMCwgYmxvYnMgPSAwLCBwYXRocyA9IDA7CisJY29uc3QgY2hhciAqcGF0aCA9IE5VTEw7CisJc3RydWN0IGJsb2JpbmZvIGJsb2JbMl07CisKKwkvKgorCSAqIFdlIGNvdWxkIGdldCBOIHRyZWUtaXNoIGluIHRoZSByZXYucGVuZGluZ19vYmplY3RzIGxpc3QuCisJICogQWxzbyB0aGVyZSBjb3VsZCBiZSBNIGJsb2JzIHRoZXJlLCBhbmQgUCBwYXRoc3BlY3MuCisJICoKKwkgKiBOPTAsIE09MDoKKwkgKgljYWNoZSB2cyBmaWxlcyAoZGlmZi1maWxlcykKKwkgKiBOPTAsIE09MjoKKwkgKiAgICAgIGNvbXBhcmUgdHdvIHJhbmRvbSBibG9icy4gIFAgbXVzdCBiZSB6ZXJvLgorCSAqIE49MCwgTT0xLCBQPTE6CisJICoJY29tcGFyZSBhIGJsb2Igd2l0aCBhIHdvcmtpbmcgdHJlZSBmaWxlLgorCSAqCisJICogTj0xLCBNPTA6CisJICogICAgICB0cmVlIHZzIGNhY2hlIChkaWZmLWluZGV4IC0tY2FjaGVkKQorCSAqCisJICogTj0yLCBNPTA6CisJICogICAgICB0cmVlIHZzIHRyZWUgKGRpZmYtdHJlZSkKKwkgKgorCSAqIE90aGVyIGNhc2VzIGFyZSBlcnJvcnMuCisJICovCisKKwlnaXRfY29uZmlnKGdpdF9kaWZmX2NvbmZpZyk7CisJaW5pdF9yZXZpc2lvbnMoJnJldik7CisJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1BBVENIOworCisJYXJnYyA9IHNldHVwX3JldmlzaW9ucyhhcmdjLCBhcmd2LCAmcmV2LCBOVUxMKTsKKwkvKiBEbyB3ZSBoYXZlIC0tY2FjaGVkIGFuZCBub3QgaGF2ZSBhIHBlbmRpbmcgb2JqZWN0LCB0aGVuCisJICogZGVmYXVsdCB0byBIRUFEIGJ5IGhhbmQuICBFZWsuCisJICovCisJaWYgKCFyZXYucGVuZGluZ19vYmplY3RzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJCWFkZF9oZWFkKCZyZXYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZm9yIChsaXN0ID0gcmV2LnBlbmRpbmdfb2JqZWN0czsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gbGlzdC0+aXRlbTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGxpc3QtPm5hbWU7CisJCWludCBmbGFncyA9IChvYmotPmZsYWdzICYgVU5JTlRFUkVTVElORyk7CisJCWlmICghb2JqLT5wYXJzZWQpCisJCQlvYmogPSBwYXJzZV9vYmplY3Qob2JqLT5zaGExKTsKKwkJb2JqID0gZGVyZWZfdGFnKG9iaiwgTlVMTCwgMCk7CisJCWlmICghb2JqKQorCQkJZGllKCJpbnZhbGlkIG9iamVjdCAnJXMnIGdpdmVuLiIsIG5hbWUpOworCQlpZiAoIXN0cmNtcChvYmotPnR5cGUsIGNvbW1pdF90eXBlKSkKKwkJCW9iaiA9ICYoKHN0cnVjdCBjb21taXQgKilvYmopLT50cmVlLT5vYmplY3Q7CisJCWlmICghc3RyY21wKG9iai0+dHlwZSwgdHJlZV90eXBlKSkgeworCQkJaWYgKEFSUkFZX1NJWkUoZW50KSA8PSBlbnRzKQorCQkJCWRpZSgibW9yZSB0aGFuICVkIHRyZWVzIGdpdmVuOiAnJXMnIiwKKwkJCQkgICAgKGludCkgQVJSQVlfU0laRShlbnQpLCBuYW1lKTsKKwkJCW9iai0+ZmxhZ3MgfD0gZmxhZ3M7CisJCQllbnRbZW50c10uaXRlbSA9IG9iajsKKwkJCWVudFtlbnRzXS5uYW1lID0gbmFtZTsKKwkJCWVudHMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKG9iai0+dHlwZSwgYmxvYl90eXBlKSkgeworCQkJaWYgKDIgPD0gYmxvYnMpCisJCQkJZGllKCJtb3JlIHRoYW4gdHdvIGJsb2JzIGdpdmVuOiAnJXMnIiwgbmFtZSk7CisJCQltZW1jcHkoYmxvYltibG9ic10uc2hhMSwgb2JqLT5zaGExLCAyMCk7CisJCQlibG9iW2Jsb2JzXS5uYW1lID0gbmFtZTsKKwkJCWJsb2JzKys7CisJCQljb250aW51ZTsKKworCQl9CisJCWRpZSgidW5oYW5kbGVkIG9iamVjdCAnJXMnIGdpdmVuLiIsIG5hbWUpOworCX0KKwlpZiAocmV2LnBydW5lX2RhdGEpIHsKKwkJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gcmV2LnBydW5lX2RhdGE7CisJCXdoaWxlICgqcGF0aHNwZWMpIHsKKwkJCWlmICghcGF0aCkKKwkJCQlwYXRoID0gKnBhdGhzcGVjOworCQkJcGF0aHMrKzsKKwkJCXBhdGhzcGVjKys7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdywgZG8gdGhlIGFyZ3VtZW50cyBsb29rIHJlYXNvbmFibGU/CisJICovCisJaWYgKCFlbnRzKSB7CisJCXN3aXRjaCAoYmxvYnMpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIGJ1aWx0aW5fZGlmZl9maWxlcygmcmV2LCBhcmdjLCBhcmd2KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAocGF0aHMgIT0gMSkKKwkJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQkJcmV0dXJuIGJ1aWx0aW5fZGlmZl9iX2YoJnJldiwgYXJnYywgYXJndiwgYmxvYiwgcGF0aCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWYgKHBhdGhzKQorCQkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCQlyZXR1cm4gYnVpbHRpbl9kaWZmX2Jsb2JzKCZyZXYsIGFyZ2MsIGFyZ3YsIGJsb2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQl9CisJfQorCWVsc2UgaWYgKGJsb2JzKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCWVsc2UgaWYgKGVudHMgPT0gMSkKKwkJcmV0dXJuIGJ1aWx0aW5fZGlmZl9pbmRleCgmcmV2LCBhcmdjLCBhcmd2KTsKKwllbHNlIGlmIChlbnRzID09IDIpCisJCXJldHVybiBidWlsdGluX2RpZmZfdHJlZSgmcmV2LCBhcmdjLCBhcmd2LCBlbnQpOworCWVsc2UKKwkJcmV0dXJuIGJ1aWx0aW5fZGlmZl9jb21iaW5lZCgmcmV2LCBhcmdjLCBhcmd2LCBlbnQsIGVudHMpOworCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWdyZXAuYyBiL2J1aWx0aW4tZ3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYWM1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWdyZXAuYwpAQCAtMCwwICsxLDg5OCBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCBncmVwIgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlIDxyZWdleC5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisvKgorICogZ2l0IGdyZXAgcGF0aHNwZWNzIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQgZnJvbSBkaWZmLXRyZWUgcGF0aHNwZWNzOworICogcGF0aG5hbWUgd2lsZGNhcmRzIGFyZSBhbGxvd2VkLgorICovCitzdGF0aWMgaW50IHBhdGhzcGVjX21hdGNoZXMoY29uc3QgY2hhciAqKnBhdGhzLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBuYW1lbGVuLCBpOworCWlmICghcGF0aHMgfHwgISpwYXRocykKKwkJcmV0dXJuIDE7CisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlmb3IgKGkgPSAwOyBwYXRoc1tpXTsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm1hdGNoID0gcGF0aHNbaV07CisJCWludCBtYXRjaGxlbiA9IHN0cmxlbihtYXRjaCk7CisJCWNvbnN0IGNoYXIgKmNwLCAqbWV0YTsKKworCQlpZiAoKG1hdGNobGVuIDw9IG5hbWVsZW4pICYmCisJCSAgICAhc3RybmNtcChuYW1lLCBtYXRjaCwgbWF0Y2hsZW4pICYmCisJCSAgICAobWF0Y2hbbWF0Y2hsZW4tMV0gPT0gJy8nIHx8CisJCSAgICAgbmFtZVttYXRjaGxlbl0gPT0gJ1wwJyB8fCBuYW1lW21hdGNobGVuXSA9PSAnLycpKQorCQkJcmV0dXJuIDE7CisJCWlmICghZm5tYXRjaChtYXRjaCwgbmFtZSwgMCkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG5hbWVbbmFtZWxlbi0xXSAhPSAnLycpCisJCQljb250aW51ZTsKKworCQkvKiBXZSBhcmUgYmVpbmcgYXNrZWQgaWYgdGhlIGRpcmVjdG9yeSAoIm5hbWUiKSBpcyB3b3J0aAorCQkgKiBkZXNjZW5kaW5nIGludG8uCisJCSAqCisJCSAqIEZpbmQgdGhlIGxvbmdlc3QgbGVhZGluZyBkaXJlY3RvcnkgbmFtZSB0aGF0IGRvZXMKKwkJICogbm90IGhhdmUgbWV0YWNoYXJhY3RlciBpbiB0aGUgcGF0aHNwZWM7IHRoZSBuYW1lCisJCSAqIHdlIGFyZSBsb29raW5nIGF0IG11c3Qgb3ZlcmxhcCB3aXRoIHRoYXQgZGlyZWN0b3J5LgorCQkgKi8KKwkJZm9yIChjcCA9IG1hdGNoLCBtZXRhID0gTlVMTDsgY3AgLSBtYXRjaCA8IG1hdGNobGVuOyBjcCsrKSB7CisJCQljaGFyIGNoID0gKmNwOworCQkJaWYgKGNoID09ICcqJyB8fCBjaCA9PSAnWycgfHwgY2ggPT0gJz8nKSB7CisJCQkJbWV0YSA9IGNwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghbWV0YSkKKwkJCW1ldGEgPSBjcDsgLyogZnVsbHkgbGl0ZXJhbCAqLworCisJCWlmIChuYW1lbGVuIDw9IG1ldGEgLSBtYXRjaCkgeworCQkJLyogTG9va2luZyBhdCAiRG9jdW1lbnRhdGlvbi8iIGFuZAorCQkJICogdGhlIHBhdHRlcm4gc2F5cyAiRG9jdW1lbnRhdGlvbi9ob3d0by8iLCBvcgorCQkJICogIkRvY3VtZW50YXRpb24vZGlmZioudHh0Ii4gIFRoZSBuYW1lIHdlCisJCQkgKiBoYXZlIHNob3VsZCBtYXRjaCBwcmVmaXguCisJCQkgKi8KKwkJCWlmICghbWVtY21wKG1hdGNoLCBuYW1lLCBuYW1lbGVuKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG1ldGEgLSBtYXRjaCA8IG5hbWVsZW4pIHsKKwkJCS8qIExvb2tpbmcgYXQgIkRvY3VtZW50YXRpb24vaG93dG8vIiBhbmQKKwkJCSAqIHRoZSBwYXR0ZXJuIHNheXMgIkRvY3VtZW50YXRpb24vaCoiOworCQkJICogbWF0Y2ggdXAgdG8gIkRvLi4uL2giOyB0aGlzIGF2b2lkcyBkZXNjZW5kaW5nCisJCQkgKiBpbnRvICJEb2N1bWVudGF0aW9uL3RlY2huaWNhbC8iLgorCQkJICovCisJCQlpZiAoIW1lbWNtcChtYXRjaCwgbmFtZSwgbWV0YSAtIG1hdGNoKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3JlcF9wYXQgeworCXN0cnVjdCBncmVwX3BhdCAqbmV4dDsKKwljb25zdCBjaGFyICpvcmlnaW47CisJaW50IG5vOworCWNvbnN0IGNoYXIgKnBhdHRlcm47CisJcmVnZXhfdCByZWdleHA7Cit9OworCitzdHJ1Y3QgZ3JlcF9vcHQgeworCXN0cnVjdCBncmVwX3BhdCAqcGF0dGVybl9saXN0OworCXN0cnVjdCBncmVwX3BhdCAqKnBhdHRlcm5fdGFpbDsKKwlyZWdleF90IHJlZ2V4cDsKKwl1bnNpZ25lZCBsaW5lbnVtOjE7CisJdW5zaWduZWQgaW52ZXJ0OjE7CisJdW5zaWduZWQgbmFtZV9vbmx5OjE7CisJdW5zaWduZWQgdW5tYXRjaF9uYW1lX29ubHk6MTsKKwl1bnNpZ25lZCBjb3VudDoxOworCXVuc2lnbmVkIHdvcmRfcmVnZXhwOjE7CisJdW5zaWduZWQgZml4ZWQ6MTsKKyNkZWZpbmUgR1JFUF9CSU5BUllfREVGQVVMVAkwCisjZGVmaW5lIEdSRVBfQklOQVJZX05PTUFUQ0gJMQorI2RlZmluZSBHUkVQX0JJTkFSWV9URVhUCTIKKwl1bnNpZ25lZCBiaW5hcnk6MjsKKwlpbnQgcmVnZmxhZ3M7CisJdW5zaWduZWQgcHJlX2NvbnRleHQ7CisJdW5zaWduZWQgcG9zdF9jb250ZXh0OworfTsKKworc3RhdGljIHZvaWQgYWRkX3BhdHRlcm4oc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKnBhdCwKKwkJCWNvbnN0IGNoYXIgKm9yaWdpbiwgaW50IG5vKQoreworCXN0cnVjdCBncmVwX3BhdCAqcCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpwKSk7CisJcC0+cGF0dGVybiA9IHBhdDsKKwlwLT5vcmlnaW4gPSBvcmlnaW47CisJcC0+bm8gPSBubzsKKwkqb3B0LT5wYXR0ZXJuX3RhaWwgPSBwOworCW9wdC0+cGF0dGVybl90YWlsID0gJnAtPm5leHQ7CisJcC0+bmV4dCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBpbGVfcGF0dGVybnMoc3RydWN0IGdyZXBfb3B0ICpvcHQpCit7CisJc3RydWN0IGdyZXBfcGF0ICpwOworCWZvciAocCA9IG9wdC0+cGF0dGVybl9saXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlpbnQgZXJyID0gcmVnY29tcCgmcC0+cmVnZXhwLCBwLT5wYXR0ZXJuLCBvcHQtPnJlZ2ZsYWdzKTsKKwkJaWYgKGVycikgeworCQkJY2hhciBlcnJidWZbMTAyNF07CisJCQljaGFyIHdoZXJlWzEwMjRdOworCQkJaWYgKHAtPm5vKQorCQkJCXNwcmludGYod2hlcmUsICJJbiAnJXMnIGF0ICVkLCAiLAorCQkJCQlwLT5vcmlnaW4sIHAtPm5vKTsKKwkJCWVsc2UgaWYgKHAtPm9yaWdpbikKKwkJCQlzcHJpbnRmKHdoZXJlLCAiJXMsICIsIHAtPm9yaWdpbik7CisJCQllbHNlCisJCQkJd2hlcmVbMF0gPSAwOworCQkJcmVnZXJyb3IoZXJyLCAmcC0+cmVnZXhwLCBlcnJidWYsIDEwMjQpOworCQkJcmVnZnJlZSgmcC0+cmVnZXhwKTsKKwkJCWRpZSgiJXMnJXMnOiAlcyIsIHdoZXJlLCBwLT5wYXR0ZXJuLCBlcnJidWYpOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqZW5kX29mX2xpbmUoY2hhciAqY3AsIHVuc2lnbmVkIGxvbmcgKmxlZnQpCit7CisJdW5zaWduZWQgbG9uZyBsID0gKmxlZnQ7CisJd2hpbGUgKGwgJiYgKmNwICE9ICdcbicpIHsKKwkJbC0tOworCQljcCsrOworCX0KKwkqbGVmdCA9IGw7CisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgaW50IHdvcmRfY2hhcihjaGFyIGNoKQoreworCXJldHVybiBpc2FsbnVtKGNoKSB8fCBjaCA9PSAnXyc7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbGluZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqYm9sLCBjb25zdCBjaGFyICplb2wsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxubywgY2hhciBzaWduKQoreworCXByaW50ZigiJXMlYyIsIG5hbWUsIHNpZ24pOworCWlmIChvcHQtPmxpbmVudW0pCisJCXByaW50ZigiJWQlYyIsIGxubywgc2lnbik7CisJcHJpbnRmKCIlLipzXG4iLCAoaW50KShlb2wtYm9sKSwgYm9sKTsKK30KKworLyoKKyAqIE5FRURTV09SSzogc2hhcmUgY29kZSB3aXRoIGRpZmYuYworICovCisjZGVmaW5lIEZJUlNUX0ZFV19CWVRFUyA4MDAwCitzdGF0aWMgaW50IGJ1ZmZlcl9pc19iaW5hcnkoY29uc3QgY2hhciAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKEZJUlNUX0ZFV19CWVRFUyA8IHNpemUpCisJCXNpemUgPSBGSVJTVF9GRVdfQllURVM7CisJaWYgKG1lbWNocihwdHIsIDAsIHNpemUpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaXhtYXRjaChjb25zdCBjaGFyICpwYXR0ZXJuLCBjaGFyICpsaW5lLCByZWdtYXRjaF90ICptYXRjaCkKK3sKKwljaGFyICpoaXQgPSBzdHJzdHIobGluZSwgcGF0dGVybik7CisJaWYgKCFoaXQpIHsKKwkJbWF0Y2gtPnJtX3NvID0gbWF0Y2gtPnJtX2VvID0gLTE7CisJCXJldHVybiBSRUdfTk9NQVRDSDsKKwl9CisJZWxzZSB7CisJCW1hdGNoLT5ybV9zbyA9IGhpdCAtIGxpbmU7CisJCW1hdGNoLT5ybV9lbyA9IG1hdGNoLT5ybV9zbyArIHN0cmxlbihwYXR0ZXJuKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGdyZXBfYnVmZmVyKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJY2hhciAqYm9sID0gYnVmOworCXVuc2lnbmVkIGxvbmcgbGVmdCA9IHNpemU7CisJdW5zaWduZWQgbG5vID0gMTsKKwlzdHJ1Y3QgcHJlX2NvbnRleHRfbGluZSB7CisJCWNoYXIgKmJvbDsKKwkJY2hhciAqZW9sOworCX0gKnByZXYgPSBOVUxMLCAqcGNsOworCXVuc2lnbmVkIGxhc3RfaGl0ID0gMDsKKwl1bnNpZ25lZCBsYXN0X3Nob3duID0gMDsKKwlpbnQgYmluYXJ5X21hdGNoX29ubHkgPSAwOworCWNvbnN0IGNoYXIgKmh1bmtfbWFyayA9ICIiOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKworCWlmIChidWZmZXJfaXNfYmluYXJ5KGJ1Ziwgc2l6ZSkpIHsKKwkJc3dpdGNoIChvcHQtPmJpbmFyeSkgeworCQljYXNlIEdSRVBfQklOQVJZX0RFRkFVTFQ6CisJCQliaW5hcnlfbWF0Y2hfb25seSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBHUkVQX0JJTkFSWV9OT01BVENIOgorCQkJcmV0dXJuIDA7IC8qIEFzc3VtZSB1bm1hdGNoICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG9wdC0+cHJlX2NvbnRleHQpCisJCXByZXYgPSB4Y2FsbG9jKG9wdC0+cHJlX2NvbnRleHQsIHNpemVvZigqcHJldikpOworCWlmIChvcHQtPnByZV9jb250ZXh0IHx8IG9wdC0+cG9zdF9jb250ZXh0KQorCQlodW5rX21hcmsgPSAiLS1cbiI7CisKKwl3aGlsZSAobGVmdCkgeworCQlyZWdtYXRjaF90IHBtYXRjaFsxMF07CisJCWNoYXIgKmVvbCwgY2g7CisJCWludCBoaXQgPSAwOworCQlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisKKwkJZW9sID0gZW5kX29mX2xpbmUoYm9sLCAmbGVmdCk7CisJCWNoID0gKmVvbDsKKwkJKmVvbCA9IDA7CisKKwkJZm9yIChwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpZiAoIW9wdC0+Zml4ZWQpIHsKKwkJCQlyZWdleF90ICpleHAgPSAmcC0+cmVnZXhwOworCQkJCWhpdCA9ICFyZWdleGVjKGV4cCwgYm9sLCBBUlJBWV9TSVpFKHBtYXRjaCksCisJCQkJCSAgICAgICBwbWF0Y2gsIDApOworCQkJfQorCQkJZWxzZSB7CisJCQkJaGl0ID0gIWZpeG1hdGNoKHAtPnBhdHRlcm4sIGJvbCwgcG1hdGNoKTsKKwkJCX0KKworCQkJaWYgKGhpdCAmJiBvcHQtPndvcmRfcmVnZXhwKSB7CisJCQkJLyogTWF0Y2ggYmVnaW5uaW5nIG11c3QgYmUgZWl0aGVyCisJCQkJICogYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCBvciBhdCB3b3JkCisJCQkJICogYm91bmRhcnkgKGkuZS4gdGhlIGxhc3QgY2hhciBtdXN0CisJCQkJICogbm90IGJlIGFsbnVtIG9yIHVuZGVyc2NvcmUpLgorCQkJCSAqLworCQkJCWlmICgocG1hdGNoWzBdLnJtX3NvIDwgMCkgfHwKKwkJCQkgICAgKGVvbCAtIGJvbCkgPD0gcG1hdGNoWzBdLnJtX3NvIHx8CisJCQkJICAgIChwbWF0Y2hbMF0ucm1fZW8gPCAwKSB8fAorCQkJCSAgICAoZW9sIC0gYm9sKSA8IHBtYXRjaFswXS5ybV9lbykKKwkJCQkJZGllKCJyZWdleHAgcmV0dXJuZWQgbm9uc2Vuc2UiKTsKKwkJCQlpZiAocG1hdGNoWzBdLnJtX3NvICE9IDAgJiYKKwkJCQkgICAgd29yZF9jaGFyKGJvbFtwbWF0Y2hbMF0ucm1fc28tMV0pKQorCQkJCQloaXQgPSAwOworCQkJCWlmIChwbWF0Y2hbMF0ucm1fZW8gIT0gKGVvbC1ib2wpICYmCisJCQkJICAgIHdvcmRfY2hhcihib2xbcG1hdGNoWzBdLnJtX2VvXSkpCisJCQkJCWhpdCA9IDA7CisJCQl9CisJCQlpZiAoaGl0KQorCQkJCWJyZWFrOworCQl9CisJCS8qICJncmVwIC12IC1lIGZvbyAtZSBibGEiIHNob3VsZCBsaXN0IGxpbmVzCisJCSAqIHRoYXQgZG8gbm90IGhhdmUgZWl0aGVyLCBzbyBpbnZlcnNpb24gc2hvdWxkCisJCSAqIGJlIGRvbmUgb3V0c2lkZS4KKwkJICovCisJCWlmIChvcHQtPmludmVydCkKKwkJCWhpdCA9ICFoaXQ7CisJCWlmIChvcHQtPnVubWF0Y2hfbmFtZV9vbmx5KSB7CisJCQlpZiAoaGl0KQorCQkJCXJldHVybiAwOworCQkJZ290byBuZXh0X2xpbmU7CisJCX0KKwkJaWYgKGhpdCkgeworCQkJY291bnQrKzsKKwkJCWlmIChiaW5hcnlfbWF0Y2hfb25seSkgeworCQkJCXByaW50ZigiQmluYXJ5IGZpbGUgJXMgbWF0Y2hlc1xuIiwgbmFtZSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAob3B0LT5uYW1lX29ubHkpIHsKKwkJCQlwcmludGYoIiVzXG4iLCBuYW1lKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCS8qIEhpdCBhdCB0aGlzIGxpbmUuICBJZiB3ZSBoYXZlbid0IHNob3duIHRoZQorCQkJICogcHJlLWNvbnRleHQgbGluZXMsIHdlIHdvdWxkIG5lZWQgdG8gc2hvdyB0aGVtLgorCQkJICogV2hlbiBhc2tlZCB0byBkbyAiY291bnQiLCB0aGlzIHN0aWxsIHNob3cKKwkJCSAqIHRoZSBjb250ZXh0IHdoaWNoIGlzIG5vbnNlbnNlLCBidXQgdGhlIHVzZXIKKwkJCSAqIGRlc2VydmVzIHRvIGdldCB0aGF0IDstKS4KKwkJCSAqLworCQkJaWYgKG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJCQl1bnNpZ25lZCBmcm9tOworCQkJCWlmIChvcHQtPnByZV9jb250ZXh0IDwgbG5vKQorCQkJCQlmcm9tID0gbG5vIC0gb3B0LT5wcmVfY29udGV4dDsKKwkJCQllbHNlCisJCQkJCWZyb20gPSAxOworCQkJCWlmIChmcm9tIDw9IGxhc3Rfc2hvd24pCisJCQkJCWZyb20gPSBsYXN0X3Nob3duICsgMTsKKwkJCQlpZiAobGFzdF9zaG93biAmJiBmcm9tICE9IGxhc3Rfc2hvd24gKyAxKQorCQkJCQlwcmludGYoaHVua19tYXJrKTsKKwkJCQl3aGlsZSAoZnJvbSA8IGxubykgeworCQkJCQlwY2wgPSAmcHJldltsbm8tZnJvbS0xXTsKKwkJCQkJc2hvd19saW5lKG9wdCwgcGNsLT5ib2wsIHBjbC0+ZW9sLAorCQkJCQkJICBuYW1lLCBmcm9tLCAnLScpOworCQkJCQlmcm9tKys7CisJCQkJfQorCQkJCWxhc3Rfc2hvd24gPSBsbm8tMTsKKwkJCX0KKwkJCWlmIChsYXN0X3Nob3duICYmIGxubyAhPSBsYXN0X3Nob3duICsgMSkKKwkJCQlwcmludGYoaHVua19tYXJrKTsKKwkJCWlmICghb3B0LT5jb3VudCkKKwkJCQlzaG93X2xpbmUob3B0LCBib2wsIGVvbCwgbmFtZSwgbG5vLCAnOicpOworCQkJbGFzdF9zaG93biA9IGxhc3RfaGl0ID0gbG5vOworCQl9CisJCWVsc2UgaWYgKGxhc3RfaGl0ICYmCisJCQkgbG5vIDw9IGxhc3RfaGl0ICsgb3B0LT5wb3N0X2NvbnRleHQpIHsKKwkJCS8qIElmIHRoZSBsYXN0IGhpdCBpcyB3aXRoaW4gdGhlIHBvc3QgY29udGV4dCwKKwkJCSAqIHdlIG5lZWQgdG8gc2hvdyB0aGlzIGxpbmUuCisJCQkgKi8KKwkJCWlmIChsYXN0X3Nob3duICYmIGxubyAhPSBsYXN0X3Nob3duICsgMSkKKwkJCQlwcmludGYoaHVua19tYXJrKTsKKwkJCXNob3dfbGluZShvcHQsIGJvbCwgZW9sLCBuYW1lLCBsbm8sICctJyk7CisJCQlsYXN0X3Nob3duID0gbG5vOworCQl9CisJCWlmIChvcHQtPnByZV9jb250ZXh0KSB7CisJCQltZW1tb3ZlKHByZXYrMSwgcHJldiwKKwkJCQkob3B0LT5wcmVfY29udGV4dC0xKSAqIHNpemVvZigqcHJldikpOworCQkJcHJldi0+Ym9sID0gYm9sOworCQkJcHJldi0+ZW9sID0gZW9sOworCQl9CisKKwluZXh0X2xpbmU6CisJCSplb2wgPSBjaDsKKwkJYm9sID0gZW9sICsgMTsKKwkJaWYgKCFsZWZ0KQorCQkJYnJlYWs7CisJCWxlZnQtLTsKKwkJbG5vKys7CisJfQorCisJaWYgKG9wdC0+dW5tYXRjaF9uYW1lX29ubHkpIHsKKwkJLyogV2UgZGlkIG5vdCBzZWUgYW55IGhpdCwgc28gd2Ugd2FudCB0byBzaG93IHRoaXMgKi8KKwkJcHJpbnRmKCIlc1xuIiwgbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIE5FRURTV09SSzoKKwkgKiBUaGUgcmVhbCAiZ3JlcCAtYyBmb28gKi5jIiBnaXZlcyBtYW55ICJiYXIuYzowIiBsaW5lcywKKwkgKiB3aGljaCBmZWVscyBtb3N0bHkgdXNlbGVzcyBidXQgc29tZXRpbWVzIHVzZWZ1bC4gIE1heWJlCisJICogbWFrZSBpdCBhbm90aGVyIG9wdGlvbj8gIEZvciBub3cgc3VwcHJlc3MgdGhlbS4KKwkgKi8KKwlpZiAob3B0LT5jb3VudCAmJiBjb3VudCkKKwkJcHJpbnRmKCIlczoldVxuIiwgbmFtZSwgY291bnQpOworCXJldHVybiAhIWxhc3RfaGl0OworfQorCitzdGF0aWMgaW50IGdyZXBfc2hhMShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY2hhciAqZGF0YTsKKwljaGFyIHR5cGVbMjBdOworCWludCBoaXQ7CisJZGF0YSA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXJyb3IoIiclcyc6IHVuYWJsZSB0byByZWFkICVzIiwgbmFtZSwgc2hhMV90b19oZXgoc2hhMSkpOworCQlyZXR1cm4gMDsKKwl9CisJaGl0ID0gZ3JlcF9idWZmZXIob3B0LCBuYW1lLCBkYXRhLCBzaXplKTsKKwlmcmVlKGRhdGEpOworCXJldHVybiBoaXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF9maWxlKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgaTsKKwljaGFyICpkYXRhOworCWlmIChsc3RhdChmaWxlbmFtZSwgJnN0KSA8IDApIHsKKwllcnJfcmV0OgorCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJZXJyb3IoIiclcyc6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0LnN0X3NpemUpCisJCXJldHVybiAwOyAvKiBlbXB0eSBmaWxlIC0tIG5vIGdyZXAgaGl0ICovCisJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKwlpID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChpIDwgMCkKKwkJZ290byBlcnJfcmV0OworCWRhdGEgPSB4bWFsbG9jKHN0LnN0X3NpemUgKyAxKTsKKwlpZiAoc3Quc3Rfc2l6ZSAhPSB4cmVhZChpLCBkYXRhLCBzdC5zdF9zaXplKSkgeworCQllcnJvcigiJyVzJzogc2hvcnQgcmVhZCAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShpKTsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlKGkpOworCWkgPSBncmVwX2J1ZmZlcihvcHQsIGZpbGVuYW1lLCBkYXRhLCBzdC5zdF9zaXplKTsKKwlmcmVlKGRhdGEpOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGV4ZWNfZ3JlcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJcGlkX3QgcGlkOworCWludCBzdGF0dXM7CisKKwlhcmd2W2FyZ2NdID0gTlVMTDsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiBwaWQ7CisJaWYgKCFwaWQpIHsKKwkJZXhlY3ZwKCJncmVwIiwgKGNoYXIgKiopIGFyZ3YpOworCQlleGl0KDI1NSk7CisJfQorCXdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChXSUZFWElURUQoc3RhdHVzKSkgeworCQlpZiAoIVdFWElUU1RBVFVTKHN0YXR1cykpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworI2RlZmluZSBNQVhBUkdTIDEwMDAKKyNkZWZpbmUgQVJHQlVGIDQwOTYKKyNkZWZpbmUgcHVzaF9hcmcoYSkgZG8geyBcCisJaWYgKG5yIDwgTUFYQVJHUykgYXJndltucisrXSA9IChhKTsgXAorCWVsc2UgZGllKCJtYXhpbXVtIG51bWJlciBvZiBhcmdzIGV4Y2VlZGVkIik7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGV4dGVybmFsX2dyZXAoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKipwYXRocywgaW50IGNhY2hlZCkKK3sKKwlpbnQgaSwgbnIsIGFyZ2MsIGhpdCwgbGVuOworCWNvbnN0IGNoYXIgKmFyZ3ZbTUFYQVJHUysxXTsKKwljaGFyIHJhbmRhcmdbQVJHQlVGXTsKKwljaGFyICphcmdwdHIgPSByYW5kYXJnOworCXN0cnVjdCBncmVwX3BhdCAqcDsKKworCWxlbiA9IG5yID0gMDsKKwlwdXNoX2FyZygiZ3JlcCIpOworCWlmIChvcHQtPmZpeGVkKQorCQlwdXNoX2FyZygiLUYiKTsKKwlpZiAob3B0LT5saW5lbnVtKQorCQlwdXNoX2FyZygiLW4iKTsKKwlpZiAob3B0LT5yZWdmbGFncyAmIFJFR19FWFRFTkRFRCkKKwkJcHVzaF9hcmcoIi1FIik7CisJaWYgKG9wdC0+cmVnZmxhZ3MgJiBSRUdfSUNBU0UpCisJCXB1c2hfYXJnKCItaSIpOworCWlmIChvcHQtPndvcmRfcmVnZXhwKQorCQlwdXNoX2FyZygiLXciKTsKKwlpZiAob3B0LT5uYW1lX29ubHkpCisJCXB1c2hfYXJnKCItbCIpOworCWlmIChvcHQtPnVubWF0Y2hfbmFtZV9vbmx5KQorCQlwdXNoX2FyZygiLUwiKTsKKwlpZiAob3B0LT5jb3VudCkKKwkJcHVzaF9hcmcoIi1jIik7CisJaWYgKG9wdC0+cG9zdF9jb250ZXh0IHx8IG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJaWYgKG9wdC0+cG9zdF9jb250ZXh0ICE9IG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJCWlmIChvcHQtPnByZV9jb250ZXh0KSB7CisJCQkJcHVzaF9hcmcoIi1CIik7CisJCQkJbGVuICs9IHNucHJpbnRmKGFyZ3B0ciwgc2l6ZW9mKHJhbmRhcmcpLWxlbiwKKwkJCQkJCSIldSIsIG9wdC0+cHJlX2NvbnRleHQpOworCQkJCWlmIChzaXplb2YocmFuZGFyZykgPD0gbGVuKQorCQkJCQlkaWUoIm1heGltdW0gbGVuZ3RoIG9mIGFyZ3MgZXhjZWVkZWQiKTsKKwkJCQlwdXNoX2FyZyhhcmdwdHIpOworCQkJCWFyZ3B0ciArPSBsZW47CisJCQl9CisJCQlpZiAob3B0LT5wb3N0X2NvbnRleHQpIHsKKwkJCQlwdXNoX2FyZygiLUEiKTsKKwkJCQlsZW4gKz0gc25wcmludGYoYXJncHRyLCBzaXplb2YocmFuZGFyZyktbGVuLAorCQkJCQkJIiV1Iiwgb3B0LT5wb3N0X2NvbnRleHQpOworCQkJCWlmIChzaXplb2YocmFuZGFyZykgPD0gbGVuKQorCQkJCQlkaWUoIm1heGltdW0gbGVuZ3RoIG9mIGFyZ3MgZXhjZWVkZWQiKTsKKwkJCQlwdXNoX2FyZyhhcmdwdHIpOworCQkJCWFyZ3B0ciArPSBsZW47CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlwdXNoX2FyZygiLUMiKTsKKwkJCWxlbiArPSBzbnByaW50ZihhcmdwdHIsIHNpemVvZihyYW5kYXJnKS1sZW4sCisJCQkJCSIldSIsIG9wdC0+cG9zdF9jb250ZXh0KTsKKwkJCWlmIChzaXplb2YocmFuZGFyZykgPD0gbGVuKQorCQkJCWRpZSgibWF4aW11bSBsZW5ndGggb2YgYXJncyBleGNlZWRlZCIpOworCQkJcHVzaF9hcmcoYXJncHRyKTsKKwkJCWFyZ3B0ciArPSBsZW47CisJCX0KKwl9CisJZm9yIChwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXB1c2hfYXJnKCItZSIpOworCQlwdXNoX2FyZyhwLT5wYXR0ZXJuKTsKKwl9CisKKwkvKgorCSAqIFRvIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIGhlYWRlciBwcmludGVkIG91dCB3aGVuIHdlIHdhbnQgaXQsCisJICogYWRkIC9kZXYvbnVsbCB0byB0aGUgcGF0aHMgdG8gZ3JlcC4gIFRoaXMgaXMgdW5uZWNlc3NhcnkKKwkgKiAoYW5kIHdyb25nKSB3aXRoICItbCIgb3IgIi1MIiwgd2hpY2ggYWx3YXlzIHByaW50IG91dCB0aGUKKwkgKiBuYW1lIGFueXdheS4KKwkgKgorCSAqIEdOVSBncmVwIGhhcyAiLUgiLCBidXQgdGhpcyBpcyBwb3J0YWJsZS4KKwkgKi8KKwlpZiAoIW9wdC0+bmFtZV9vbmx5ICYmICFvcHQtPnVubWF0Y2hfbmFtZV9vbmx5KQorCQlwdXNoX2FyZygiL2Rldi9udWxsIik7CisKKwloaXQgPSAwOworCWFyZ2MgPSBucjsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJY2hhciAqbmFtZTsKKwkJaWYgKGNlX3N0YWdlKGNlKSB8fCAhU19JU1JFRyhudG9obChjZS0+Y2VfbW9kZSkpKQorCQkJY29udGludWU7CisJCWlmICghcGF0aHNwZWNfbWF0Y2hlcyhwYXRocywgY2UtPm5hbWUpKQorCQkJY29udGludWU7CisJCW5hbWUgPSBjZS0+bmFtZTsKKwkJaWYgKG5hbWVbMF0gPT0gJy0nKSB7CisJCQlpbnQgbGVuID0gY2VfbmFtZWxlbihjZSk7CisJCQluYW1lID0geG1hbGxvYyhsZW4gKyAzKTsKKwkJCW1lbWNweShuYW1lLCAiLi8iLCAyKTsKKwkJCW1lbWNweShuYW1lICsgMiwgY2UtPm5hbWUsIGxlbiArIDEpOworCQl9CisJCWFyZ3ZbYXJnYysrXSA9IG5hbWU7CisJCWlmIChhcmdjIDwgTUFYQVJHUykKKwkJCWNvbnRpbnVlOworCQloaXQgKz0gZXhlY19ncmVwKGFyZ2MsIGFyZ3YpOworCQlhcmdjID0gbnI7CisJfQorCWlmIChhcmdjID4gbnIpCisJCWhpdCArPSBleGVjX2dyZXAoYXJnYywgYXJndik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF9jYWNoZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqKnBhdGhzLCBpbnQgY2FjaGVkKQoreworCWludCBoaXQgPSAwOworCWludCBucjsKKwlyZWFkX2NhY2hlKCk7CisKKyNpZmRlZiBfX3VuaXhfXworCS8qCisJICogVXNlIHRoZSBleHRlcm5hbCAiZ3JlcCIgY29tbWFuZCBmb3IgdGhlIGNhc2Ugd2hlcmUKKwkgKiB3ZSBncmVwIHRocm91Z2ggdGhlIGNoZWNrZWQtb3V0IGZpbGVzLiBJdCB0ZW5kcyB0bworCSAqIGJlIGEgbG90IG1vcmUgb3B0aW1pemVkCisJICovCisJaWYgKCFjYWNoZWQpIHsKKwkJaGl0ID0gZXh0ZXJuYWxfZ3JlcChvcHQsIHBhdGhzLCBjYWNoZWQpOworCQlpZiAoaGl0ID49IDApCisJCQlyZXR1cm4gaGl0OworCX0KKyNlbmRpZgorCisJZm9yIChuciA9IDA7IG5yIDwgYWN0aXZlX25yOyBucisrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbbnJdOworCQlpZiAoY2Vfc3RhZ2UoY2UpIHx8ICFTX0lTUkVHKG50b2hsKGNlLT5jZV9tb2RlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFwYXRoc3BlY19tYXRjaGVzKHBhdGhzLCBjZS0+bmFtZSkpCisJCQljb250aW51ZTsKKwkJaWYgKGNhY2hlZCkKKwkJCWhpdCB8PSBncmVwX3NoYTEob3B0LCBjZS0+c2hhMSwgY2UtPm5hbWUpOworCQllbHNlCisJCQloaXQgfD0gZ3JlcF9maWxlKG9wdCwgY2UtPm5hbWUpOworCX0KKwlyZXR1cm4gaGl0OworfQorCitzdGF0aWMgaW50IGdyZXBfdHJlZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqKnBhdGhzLAorCQkgICAgIHN0cnVjdCB0cmVlX2Rlc2MgKnRyZWUsCisJCSAgICAgY29uc3QgY2hhciAqdHJlZV9uYW1lLCBjb25zdCBjaGFyICpiYXNlKQoreworCWludCBsZW47CisJaW50IGhpdCA9IDA7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJY2hhciAqZG93bjsKKwljaGFyICpwYXRoX2J1ZiA9IHhtYWxsb2MoUEFUSF9NQVggKyBzdHJsZW4odHJlZV9uYW1lKSArIDEwMCk7CisKKwlpZiAodHJlZV9uYW1lWzBdKSB7CisJCWludCBvZmZzZXQgPSBzcHJpbnRmKHBhdGhfYnVmLCAiJXM6IiwgdHJlZV9uYW1lKTsKKwkJZG93biA9IHBhdGhfYnVmICsgb2Zmc2V0OworCQlzdHJjYXQoZG93biwgYmFzZSk7CisJfQorCWVsc2UgeworCQlkb3duID0gcGF0aF9idWY7CisJCXN0cmNweShkb3duLCBiYXNlKTsKKwl9CisJbGVuID0gc3RybGVuKHBhdGhfYnVmKTsKKworCXdoaWxlICh0cmVlX2VudHJ5KHRyZWUsICZlbnRyeSkpIHsKKwkJc3RyY3B5KHBhdGhfYnVmICsgbGVuLCBlbnRyeS5wYXRoKTsKKworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCS8qIE1hdGNoICJhYmMvIiBhZ2FpbnN0IHBhdGhzcGVjIHRvCisJCQkgKiBkZWNpZGUgaWYgd2Ugd2FudCB0byBkZXNjZW5kIGludG8gImFiYyIKKwkJCSAqIGRpcmVjdG9yeS4KKwkJCSAqLworCQkJc3RyY3B5KHBhdGhfYnVmICsgbGVuICsgZW50cnkucGF0aGxlbiwgIi8iKTsKKworCQlpZiAoIXBhdGhzcGVjX21hdGNoZXMocGF0aHMsIGRvd24pKQorCQkJOworCQllbHNlIGlmIChTX0lTUkVHKGVudHJ5Lm1vZGUpKQorCQkJaGl0IHw9IGdyZXBfc2hhMShvcHQsIGVudHJ5LnNoYTEsIHBhdGhfYnVmKTsKKwkJZWxzZSBpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJY2hhciB0eXBlWzIwXTsKKwkJCXN0cnVjdCB0cmVlX2Rlc2Mgc3ViOworCQkJdm9pZCAqZGF0YTsKKwkJCWRhdGEgPSByZWFkX3NoYTFfZmlsZShlbnRyeS5zaGExLCB0eXBlLCAmc3ViLnNpemUpOworCQkJaWYgKCFkYXRhKQorCQkJCWRpZSgidW5hYmxlIHRvIHJlYWQgdHJlZSAoJXMpIiwKKwkJCQkgICAgc2hhMV90b19oZXgoZW50cnkuc2hhMSkpOworCQkJc3ViLmJ1ZiA9IGRhdGE7CisJCQloaXQgfD0gZ3JlcF90cmVlKG9wdCwgcGF0aHMsICZzdWIsIHRyZWVfbmFtZSwgZG93bik7CisJCQlmcmVlKGRhdGEpOworCQl9CisJfQorCXJldHVybiBoaXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF9vYmplY3Qoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKipwYXRocywKKwkJICAgICAgIHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIXN0cmNtcChvYmotPnR5cGUsIGJsb2JfdHlwZSkpCisJCXJldHVybiBncmVwX3NoYTEob3B0LCBvYmotPnNoYTEsIG5hbWUpOworCWlmICghc3RyY21wKG9iai0+dHlwZSwgY29tbWl0X3R5cGUpIHx8CisJICAgICFzdHJjbXAob2JqLT50eXBlLCB0cmVlX3R5cGUpKSB7CisJCXN0cnVjdCB0cmVlX2Rlc2MgdHJlZTsKKwkJdm9pZCAqZGF0YTsKKwkJaW50IGhpdDsKKwkJZGF0YSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG9iai0+c2hhMSwgdHJlZV90eXBlLAorCQkJCQkJICAmdHJlZS5zaXplLCBOVUxMKTsKKwkJaWYgKCFkYXRhKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlICglcykiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJdHJlZS5idWYgPSBkYXRhOworCQloaXQgPSBncmVwX3RyZWUob3B0LCBwYXRocywgJnRyZWUsIG5hbWUsICIiKTsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIGhpdDsKKwl9CisJZGllKCJ1bmFibGUgdG8gZ3JlcCBmcm9tIG9iamVjdCBvZiB0eXBlICVzIiwgb2JqLT50eXBlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9ncmVwX3VzYWdlW10gPQorImdpdC1ncmVwIDxvcHRpb24+KiA8cmV2PiogWy1lXSA8cGF0dGVybj4gWzxwYXRoPi4uLl0iOworCitpbnQgY21kX2dyZXAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlpbnQgaGl0ID0gMDsKKwlpbnQgY2FjaGVkID0gMDsKKwlpbnQgc2Vlbl9kYXNoZGFzaCA9IDA7CisJc3RydWN0IGdyZXBfb3B0IG9wdDsKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QsICoqdGFpbCwgKm9iamVjdF9saXN0ID0gTlVMTDsKKwljb25zdCBjaGFyICpwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJY29uc3QgY2hhciAqKnBhdGhzID0gTlVMTDsKKwlpbnQgaTsKKworCW1lbXNldCgmb3B0LCAwLCBzaXplb2Yob3B0KSk7CisJb3B0LnBhdHRlcm5fdGFpbCA9ICZvcHQucGF0dGVybl9saXN0OworCW9wdC5yZWdmbGFncyA9IFJFR19ORVdMSU5FOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBubyAtLSB0aGVuIHRoZSBwYXRocyBtdXN0IGV4aXN0IGluIHRoZSB3b3JraW5nCisJICogdHJlZS4gIElmIHRoZXJlIGlzIG5vIGV4cGxpY2l0IHBhdHRlcm4gc3BlY2lmaWVkIHdpdGggLWUgb3IKKwkgKiAtZiwgd2UgdGFrZSB0aGUgZmlyc3QgdW5yZWNvZ25pemVkIG5vbiBvcHRpb24gdG8gYmUgdGhlCisJICogcGF0dGVybiwgYnV0IHRoZW4gd2hhdCBmb2xsb3dzIGl0IG11c3QgYmUgemVybyBvciBtb3JlCisJICogdmFsaWQgcmVmcyB1cCB0byB0aGUgLS0gKGlmIGV4aXN0cyksIGFuZCB0aGVuIGV4aXN0aW5nCisJICogcGF0aHMuICBJZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBwYXR0ZXJuLCB0aGVuIHRoZSBmaXJzdAorCSAqIHVucmVjb2NuaXplZCBub24gb3B0aW9uIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZnMgbGlzdAorCSAqIHRoYXQgY29udGludWVzIHVwIHRvIHRoZSAtLSAoaWYgZXhpc3RzKSwgYW5kIHRoZW4gcGF0aHMuCisJICovCisKKwl0YWlsID0gJm9iamVjdF9saXN0OworCXdoaWxlICgxIDwgYXJnYykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlhcmdjLS07IGFyZ3YrKzsKKwkJaWYgKCFzdHJjbXAoIi0tY2FjaGVkIiwgYXJnKSkgeworCQkJY2FjaGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItYSIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tdGV4dCIsIGFyZykpIHsKKwkJCW9wdC5iaW5hcnkgPSBHUkVQX0JJTkFSWV9URVhUOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1pIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1pZ25vcmUtY2FzZSIsIGFyZykpIHsKKwkJCW9wdC5yZWdmbGFncyB8PSBSRUdfSUNBU0U7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUkiLCBhcmcpKSB7CisJCQlvcHQuYmluYXJ5ID0gR1JFUF9CSU5BUllfTk9NQVRDSDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItdiIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0taW52ZXJ0LW1hdGNoIiwgYXJnKSkgeworCQkJb3B0LmludmVydCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUUiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWV4dGVuZGVkLXJlZ2V4cCIsIGFyZykpIHsKKwkJCW9wdC5yZWdmbGFncyB8PSBSRUdfRVhURU5ERUQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUYiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWZpeGVkLXN0cmluZ3MiLCBhcmcpKSB7CisJCQlvcHQuZml4ZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1HIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1iYXNpYy1yZWdleHAiLCBhcmcpKSB7CisJCQlvcHQucmVnZmxhZ3MgJj0gflJFR19FWFRFTkRFRDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItbiIsIGFyZykpIHsKKwkJCW9wdC5saW5lbnVtID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItSCIsIGFyZykpIHsKKwkJCS8qIFdlIGFsd2F5cyBzaG93IHRoZSBwYXRobmFtZSwgc28gdGhpcworCQkJICogaXMgYSBub29wLgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLWwiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWZpbGVzLXdpdGgtbWF0Y2hlcyIsIGFyZykpIHsKKwkJCW9wdC5uYW1lX29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1MIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1maWxlcy13aXRob3V0LW1hdGNoIiwgYXJnKSkgeworCQkJb3B0LnVubWF0Y2hfbmFtZV9vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItYyIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tY291bnQiLCBhcmcpKSB7CisJCQlvcHQuY291bnQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi13IiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS13b3JkLXJlZ2V4cCIsIGFyZykpIHsKKwkJCW9wdC53b3JkX3JlZ2V4cCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoIi1BIiwgYXJnLCAyKSB8fAorCQkgICAgIXN0cm5jbXAoIi1CIiwgYXJnLCAyKSB8fAorCQkgICAgIXN0cm5jbXAoIi1DIiwgYXJnLCAyKSB8fAorCQkgICAgKGFyZ1swXSA9PSAnLScgJiYgJzEnIDw9IGFyZ1sxXSAmJiBhcmdbMV0gPD0gJzknKSkgeworCQkJdW5zaWduZWQgbnVtOworCQkJY29uc3QgY2hhciAqc2NhbjsKKwkJCXN3aXRjaCAoYXJnWzFdKSB7CisJCQljYXNlICdBJzogY2FzZSAnQic6IGNhc2UgJ0MnOgorCQkJCWlmICghYXJnWzJdKSB7CisJCQkJCWlmIChhcmdjIDw9IDEpCisJCQkJCQl1c2FnZShidWlsdGluX2dyZXBfdXNhZ2UpOworCQkJCQlzY2FuID0gKisrYXJndjsKKwkJCQkJYXJnYy0tOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXNjYW4gPSBhcmcgKyAyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzY2FuID0gYXJnICsgMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzc2NhbmYoc2NhbiwgIiV1IiwgJm51bSkgIT0gMSkKKwkJCQl1c2FnZShidWlsdGluX2dyZXBfdXNhZ2UpOworCQkJc3dpdGNoIChhcmdbMV0pIHsKKwkJCWNhc2UgJ0EnOgorCQkJCW9wdC5wb3N0X2NvbnRleHQgPSBudW07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJY2FzZSAnQyc6CisJCQkJb3B0LnBvc3RfY29udGV4dCA9IG51bTsKKwkJCWNhc2UgJ0InOgorCQkJCW9wdC5wcmVfY29udGV4dCA9IG51bTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItZiIsIGFyZykpIHsKKwkJCUZJTEUgKnBhdHRlcm5zOworCQkJaW50IGxubyA9IDA7CisJCQljaGFyIGJ1ZlsxMDI0XTsKKwkJCWlmIChhcmdjIDw9IDEpCisJCQkJdXNhZ2UoYnVpbHRpbl9ncmVwX3VzYWdlKTsKKwkJCXBhdHRlcm5zID0gZm9wZW4oYXJndlsxXSwgInIiKTsKKwkJCWlmICghcGF0dGVybnMpCisJCQkJZGllKCInJXMnOiAlcyIsIGFyZ3ZbMV0sIHN0cmVycm9yKGVycm5vKSk7CisJCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgcGF0dGVybnMpKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihidWYpOworCQkJCWlmIChidWZbbGVuLTFdID09ICdcbicpCisJCQkJCWJ1ZltsZW4tMV0gPSAwOworCQkJCS8qIGlnbm9yZSBlbXB0eSBsaW5lIGxpa2UgZ3JlcCBkb2VzICovCisJCQkJaWYgKCFidWZbMF0pCisJCQkJCWNvbnRpbnVlOworCQkJCWFkZF9wYXR0ZXJuKCZvcHQsIHN0cmR1cChidWYpLCBhcmd2WzFdLCArK2xubyk7CisJCQl9CisJCQlmY2xvc2UocGF0dGVybnMpOworCQkJYXJndisrOworCQkJYXJnYy0tOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1lIiwgYXJnKSkgeworCQkJaWYgKDEgPCBhcmdjKSB7CisJCQkJYWRkX3BhdHRlcm4oJm9wdCwgYXJndlsxXSwgIi1lIG9wdGlvbiIsIDApOworCQkJCWFyZ3YrKzsKKwkJCQlhcmdjLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQl1c2FnZShidWlsdGluX2dyZXBfdXNhZ2UpOworCQl9CisJCWlmICghc3RyY21wKCItLSIsIGFyZykpCisJCQlicmVhazsKKwkJaWYgKCphcmcgPT0gJy0nKQorCQkJdXNhZ2UoYnVpbHRpbl9ncmVwX3VzYWdlKTsKKworCQkvKiBGaXJzdCB1bnJlY29nbml6ZWQgbm9uLW9wdGlvbiB0b2tlbiAqLworCQlpZiAoIW9wdC5wYXR0ZXJuX2xpc3QpIHsKKwkJCWFkZF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDApOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBXZSBhcmUgbG9va2luZyBhdCB0aGUgZmlyc3QgcGF0aCBvciByZXY7CisJCQkgKiBpdCBpcyBmb3VuZCBhdCBhcmd2WzFdIGFmdGVyIGxlYXZpbmcgdGhlCisJCQkgKiBsb29wLgorCQkJICovCisJCQlhcmdjKys7IGFyZ3YtLTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvcHQucGF0dGVybl9saXN0KQorCQlkaWUoIm5vIHBhdHRlcm4gZ2l2ZW4uIik7CisJaWYgKChvcHQucmVnZmxhZ3MgIT0gUkVHX05FV0xJTkUpICYmIG9wdC5maXhlZCkKKwkJZGllKCJjYW5ub3QgbWl4IC0tZml4ZWQtc3RyaW5ncyBhbmQgcmVnZXhwIik7CisJaWYgKCFvcHQuZml4ZWQpCisJCWNvbXBpbGVfcGF0dGVybnMoJm9wdCk7CisKKwkvKiBDaGVjayByZXZzIGFuZCB0aGVuIHBhdGhzICovCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkvKiBJcyBpdCBhIHJldj8gKi8KKwkJaWYgKCFnZXRfc2hhMShhcmcsIHNoYTEpKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCQlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmVsZW07CisJCQlpZiAoIW9iamVjdCkKKwkJCQlkaWUoImJhZCBvYmplY3QgJXMiLCBhcmcpOworCQkJZWxlbSA9IG9iamVjdF9saXN0X2luc2VydChvYmplY3QsIHRhaWwpOworCQkJZWxlbS0+bmFtZSA9IGFyZzsKKwkJCXRhaWwgPSAmZWxlbS0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCXNlZW5fZGFzaGRhc2ggPSAxOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIFRoZSByZXN0IGFyZSBwYXRocyAqLworCWlmICghc2Vlbl9kYXNoZGFzaCkgeworCQlpbnQgajsKKwkJZm9yIChqID0gaTsgaiA8IGFyZ2M7IGorKykKKwkJCXZlcmlmeV9maWxlbmFtZShwcmVmaXgsIGFyZ3Zbal0pOworCX0KKworCWlmIChpIDwgYXJnYykKKwkJcGF0aHMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2ICsgaSk7CisJZWxzZSBpZiAocHJlZml4KSB7CisJCXBhdGhzID0geGNhbGxvYygyLCBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJCXBhdGhzWzBdID0gcHJlZml4OworCQlwYXRoc1sxXSA9IE5VTEw7CisJfQorCisJaWYgKCFvYmplY3RfbGlzdCkKKwkJcmV0dXJuICFncmVwX2NhY2hlKCZvcHQsIHBhdGhzLCBjYWNoZWQpOworCisJaWYgKGNhY2hlZCkKKwkJZGllKCJib3RoIC0tY2FjaGVkIGFuZCB0cmVlcyBhcmUgZ2l2ZW4uIik7CisKKwlmb3IgKGxpc3QgPSBvYmplY3RfbGlzdDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJc3RydWN0IG9iamVjdCAqcmVhbF9vYmo7CisJCXJlYWxfb2JqID0gZGVyZWZfdGFnKGxpc3QtPml0ZW0sIE5VTEwsIDApOworCQlpZiAoZ3JlcF9vYmplY3QoJm9wdCwgcGF0aHMsIHJlYWxfb2JqLCBsaXN0LT5uYW1lKSkKKwkJCWhpdCA9IDE7CisJfQorCXJldHVybiAhaGl0OworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1oZWxwLmMgYi9idWlsdGluLWhlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDcwZmFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1oZWxwLmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBidWlsdGluLWhlbHAuYworICoKKyAqIEJ1aWx0aW4gaGVscC1yZWxhdGVkIGNvbW1hbmRzIChoZWxwLCB1c2FnZSwgdmVyc2lvbikKKyAqLworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY29tbW9uLWNtZHMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X3VzYWdlW10gPQorCSJVc2FnZTogZ2l0IFstLXZlcnNpb25dIFstLWV4ZWMtcGF0aFs9R0lUX0VYRUNfUEFUSF1dIFstLWhlbHBdIENPTU1BTkQgWyBBUkdTIF0iOworCisvKiBtb3N0IGd1aSB0ZXJtcyBzZXQgQ09MVU1OUyAoYWx0aG91Z2ggc29tZSBkb24ndCBleHBvcnQgaXQpICovCitzdGF0aWMgaW50IHRlcm1fY29sdW1ucyh2b2lkKQoreworCWNoYXIgKmNvbF9zdHJpbmcgPSBnZXRlbnYoIkNPTFVNTlMiKTsKKwlpbnQgbl9jb2xzID0gMDsKKworCWlmIChjb2xfc3RyaW5nICYmIChuX2NvbHMgPSBhdG9pKGNvbF9zdHJpbmcpKSA+IDApCisJCXJldHVybiBuX2NvbHM7CisKKyNpZmRlZiBUSU9DR1dJTlNaCisJeworCQlzdHJ1Y3Qgd2luc2l6ZSB3czsKKwkJaWYgKCFpb2N0bCgxLCBUSU9DR1dJTlNaLCAmd3MpKSB7CisJCQlpZiAod3Mud3NfY29sKQorCQkJCXJldHVybiB3cy53c19jb2w7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiA4MDsKK30KKworc3RhdGljIHZvaWQgb29tKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJnaXQ6IG91dCBvZiBtZW1vcnlcbiIpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcHV0X2NoYXIoY2hhciBjLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXdoaWxlKG51bS0tKQorCQlwdXRjaGFyKGMpOworfQorCitzdGF0aWMgc3RydWN0IGNtZG5hbWUgeworCXNpemVfdCBsZW47CisJY2hhciBuYW1lWzFdOworfSAqKmNtZG5hbWU7CitzdGF0aWMgaW50IGNtZG5hbWVfYWxsb2MsIGNtZG5hbWVfY250OworCitzdGF0aWMgdm9pZCBhZGRfY21kbmFtZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCXN0cnVjdCBjbWRuYW1lICplbnQ7CisJaWYgKGNtZG5hbWVfYWxsb2MgPD0gY21kbmFtZV9jbnQpIHsKKwkJY21kbmFtZV9hbGxvYyA9IGNtZG5hbWVfYWxsb2MgKyAyMDA7CisJCWNtZG5hbWUgPSByZWFsbG9jKGNtZG5hbWUsIGNtZG5hbWVfYWxsb2MgKiBzaXplb2YoKmNtZG5hbWUpKTsKKwkJaWYgKCFjbWRuYW1lKQorCQkJb29tKCk7CisJfQorCWVudCA9IG1hbGxvYyhzaXplb2YoKmVudCkgKyBsZW4pOworCWlmICghZW50KQorCQlvb20oKTsKKwllbnQtPmxlbiA9IGxlbjsKKwltZW1jcHkoZW50LT5uYW1lLCBuYW1lLCBsZW4pOworCWVudC0+bmFtZVtsZW5dID0gMDsKKwljbWRuYW1lW2NtZG5hbWVfY250KytdID0gZW50OworfQorCitzdGF0aWMgaW50IGNtZG5hbWVfY29tcGFyZShjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IGNtZG5hbWUgKmEgPSAqKHN0cnVjdCBjbWRuYW1lICoqKWFfOworCXN0cnVjdCBjbWRuYW1lICpiID0gKihzdHJ1Y3QgY21kbmFtZSAqKiliXzsKKwlyZXR1cm4gc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmV0dHlfcHJpbnRfc3RyaW5nX2xpc3Qoc3RydWN0IGNtZG5hbWUgKipjbWRuYW1lLCBpbnQgbG9uZ2VzdCkKK3sKKwlpbnQgY29scyA9IDEsIHJvd3M7CisJaW50IHNwYWNlID0gbG9uZ2VzdCArIDE7IC8qIG1pbiAxIFNQIGJldHdlZW4gd29yZHMgKi8KKwlpbnQgbWF4X2NvbHMgPSB0ZXJtX2NvbHVtbnMoKSAtIDE7IC8qIGRvbid0IHByaW50ICpvbiogdGhlIGVkZ2UgKi8KKwlpbnQgaSwgajsKKworCWlmIChzcGFjZSA8IG1heF9jb2xzKQorCQljb2xzID0gbWF4X2NvbHMgLyBzcGFjZTsKKwlyb3dzID0gKGNtZG5hbWVfY250ICsgY29scyAtIDEpIC8gY29sczsKKworCXFzb3J0KGNtZG5hbWUsIGNtZG5hbWVfY250LCBzaXplb2YoKmNtZG5hbWUpLCBjbWRuYW1lX2NvbXBhcmUpOworCisJZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykgeworCQlwcmludGYoIiAgIik7CisKKwkJZm9yIChqID0gMDsgaiA8IGNvbHM7IGorKykgeworCQkJaW50IG4gPSBqICogcm93cyArIGk7CisJCQlpbnQgc2l6ZSA9IHNwYWNlOworCQkJaWYgKG4gPj0gY21kbmFtZV9jbnQpCisJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBjb2xzLTEgfHwgbiArIHJvd3MgPj0gY21kbmFtZV9jbnQpCisJCQkJc2l6ZSA9IDE7CisJCQlwcmludGYoIiUtKnMiLCBzaXplLCBjbWRuYW1lW25dLT5uYW1lKTsKKwkJfQorCQlwdXRjaGFyKCdcbicpOworCX0KK30KKworc3RhdGljIHZvaWQgbGlzdF9jb21tYW5kcyhjb25zdCBjaGFyICpleGVjX3BhdGgsIGNvbnN0IGNoYXIgKnBhdHRlcm4pCit7CisJdW5zaWduZWQgaW50IGxvbmdlc3QgPSAwOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGRpcmxlbjsKKwlESVIgKmRpciA9IG9wZW5kaXIoZXhlY19wYXRoKTsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCWlmICghZGlyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiAnJXMnOiAlc1xuIiwgZXhlY19wYXRoLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCWRpcmxlbiA9IHN0cmxlbihleGVjX3BhdGgpOworCWlmIChQQVRIX01BWCAtIDIwIDwgZGlybGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiBpbnNhbmVseSBsb25nIGV4ZWMtcGF0aCAnJXMnXG4iLAorCQkJZXhlY19wYXRoKTsKKwkJZXhpdCgxKTsKKwl9CisKKwltZW1jcHkocGF0aCwgZXhlY19wYXRoLCBkaXJsZW4pOworCXBhdGhbZGlybGVuKytdID0gJy8nOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGVudGxlbjsKKworCQlpZiAoc3RybmNtcChkZS0+ZF9uYW1lLCAiZ2l0LSIsIDQpKQorCQkJY29udGludWU7CisJCXN0cmNweShwYXRoK2RpcmxlbiwgZGUtPmRfbmFtZSk7CisJCWlmIChzdGF0KHBhdGgsICZzdCkgfHwgLyogc3RhdCwgbm90IGxzdGF0ICovCisJCSAgICAhU19JU1JFRyhzdC5zdF9tb2RlKSB8fAorCQkgICAgIShzdC5zdF9tb2RlICYgU19JWFVTUikpCisJCQljb250aW51ZTsKKworCQllbnRsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisJCWlmICg0IDwgZW50bGVuICYmICFzdHJjbXAoZGUtPmRfbmFtZSArIGVudGxlbiAtIDQsICIuZXhlIikpCisJCQllbnRsZW4gLT0gNDsKKworCQlpZiAobG9uZ2VzdCA8IGVudGxlbikKKwkJCWxvbmdlc3QgPSBlbnRsZW47CisKKwkJYWRkX2NtZG5hbWUoZGUtPmRfbmFtZSArIDQsIGVudGxlbi00KTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKworCXByaW50ZigiZ2l0IGNvbW1hbmRzIGF2YWlsYWJsZSBpbiAnJXMnXG4iLCBleGVjX3BhdGgpOworCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCW1wdXRfY2hhcignLScsIHN0cmxlbihleGVjX3BhdGgpKTsKKwlwdXRjaGFyKCdcbicpOworCXByZXR0eV9wcmludF9zdHJpbmdfbGlzdChjbWRuYW1lLCBsb25nZXN0IC0gNCk7CisJcHV0Y2hhcignXG4nKTsKK30KKworc3RhdGljIHZvaWQgbGlzdF9jb21tb25fY21kc19oZWxwKHZvaWQpCit7CisJaW50IGksIGxvbmdlc3QgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbW9uX2NtZHMpOyBpKyspIHsKKwkJaWYgKGxvbmdlc3QgPCBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSkpCisJCQlsb25nZXN0ID0gc3RybGVuKGNvbW1vbl9jbWRzW2ldLm5hbWUpOworCX0KKworCXB1dHMoIlRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZ2l0IGNvbW1hbmRzIGFyZToiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tb25fY21kcyk7IGkrKykgeworCQlwcmludGYoIiAgICAlcyIsIGNvbW1vbl9jbWRzW2ldLm5hbWUpOworCQltcHV0X2NoYXIoJyAnLCBsb25nZXN0IC0gc3RybGVuKGNvbW1vbl9jbWRzW2ldLm5hbWUpICsgNCk7CisJCXB1dHMoY29tbW9uX2NtZHNbaV0uaGVscCk7CisJfQorCXB1dHMoIih1c2UgJ2dpdCBoZWxwIC1hJyB0byBnZXQgYSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgZ2l0IGNvbW1hbmRzKSIpOworfQorCit2b2lkIGNtZF91c2FnZShpbnQgc2hvd19hbGwsIGNvbnN0IGNoYXIgKmV4ZWNfcGF0aCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaWYgKGZtdCkgeworCQl2YV9saXN0IGFwOworCisJCXZhX3N0YXJ0KGFwLCBmbXQpOworCQlwcmludGYoImdpdDogIik7CisJCXZwcmludGYoZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorCWVsc2UKKwkJcHV0cyhnaXRfdXNhZ2UpOworCisJaWYgKGV4ZWNfcGF0aCkgeworCQlwdXRjaGFyKCdcbicpOworCQlpZiAoc2hvd19hbGwpCisJCQlsaXN0X2NvbW1hbmRzKGV4ZWNfcGF0aCwgImdpdC0qIik7CisJCWVsc2UKKwkJCWxpc3RfY29tbW9uX2NtZHNfaGVscCgpOworICAgICAgICB9CisKKwlleGl0KDEpOworfQorCitzdGF0aWMgdm9pZCBzaG93X21hbl9wYWdlKGNvbnN0IGNoYXIgKmdpdF9jbWQpCit7CisJY29uc3QgY2hhciAqcGFnZTsKKworCWlmICghc3RybmNtcChnaXRfY21kLCAiZ2l0IiwgMykpCisJCXBhZ2UgPSBnaXRfY21kOworCWVsc2UgeworCQlpbnQgcGFnZV9sZW4gPSBzdHJsZW4oZ2l0X2NtZCkgKyA0OworCQljaGFyICpwID0gbWFsbG9jKHBhZ2VfbGVuICsgMSk7CisJCXN0cmNweShwLCAiZ2l0LSIpOworCQlzdHJjcHkocCArIDQsIGdpdF9jbWQpOworCQlwW3BhZ2VfbGVuXSA9IDA7CisJCXBhZ2UgPSBwOworCX0KKworCWV4ZWNscCgibWFuIiwgIm1hbiIsIHBhZ2UsIE5VTEwpOworfQorCitpbnQgY21kX3ZlcnNpb24oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlwcmludGYoImdpdCB2ZXJzaW9uICVzXG4iLCBnaXRfdmVyc2lvbl9zdHJpbmcpOworCXJldHVybiAwOworfQorCitpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwljb25zdCBjaGFyICpoZWxwX2NtZCA9IGFyZ3ZbMV07CisJaWYgKCFoZWxwX2NtZCkKKwkJY21kX3VzYWdlKDAsIGdpdF9leGVjX3BhdGgoKSwgTlVMTCk7CisJZWxzZSBpZiAoIXN0cmNtcChoZWxwX2NtZCwgIi0tYWxsIikgfHwgIXN0cmNtcChoZWxwX2NtZCwgIi1hIikpCisJCWNtZF91c2FnZSgxLCBnaXRfZXhlY19wYXRoKCksIE5VTEwpOworCWVsc2UKKwkJc2hvd19tYW5fcGFnZShoZWxwX2NtZCk7CisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1pbml0LWRiLmMgYi9idWlsdGluLWluaXQtZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI0ZTliCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1pbml0LWRiLmMKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworI2lmbmRlZiBERUZBVUxUX0dJVF9URU1QTEFURV9ESVIKKyNkZWZpbmUgREVGQVVMVF9HSVRfVEVNUExBVEVfRElSICIvdXNyL3NoYXJlL2dpdC1jb3JlL3RlbXBsYXRlcy8iCisjZW5kaWYKKworc3RhdGljIHZvaWQgc2FmZV9jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKmRpciwgaW50IHNoYXJlKQoreworCWlmIChta2RpcihkaXIsIDA3NzcpIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUVYSVNUKSB7CisJCQlwZXJyb3IoZGlyKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJZWxzZSBpZiAoc2hhcmUgJiYgYWRqdXN0X3NoYXJlZF9wZXJtKGRpcikpCisJCWRpZSgiQ291bGQgbm90IG1ha2UgJXMgd3JpdGFibGUgYnkgZ3JvdXBcbiIsIGRpcik7Cit9CisKK3N0YXRpYyBpbnQgY29weV9maWxlKGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgbW9kZSkKK3sKKwlpbnQgZmRpLCBmZG8sIHN0YXR1czsKKworCW1vZGUgPSAobW9kZSAmIDAxMTEpID8gMDc3NyA6IDA2NjY7CisJaWYgKChmZGkgPSBvcGVuKHNyYywgT19SRE9OTFkpKSA8IDApCisJCXJldHVybiBmZGk7CisJaWYgKChmZG8gPSBvcGVuKGRzdCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCBtb2RlKSkgPCAwKSB7CisJCWNsb3NlKGZkaSk7CisJCXJldHVybiBmZG87CisJfQorCXN0YXR1cyA9IGNvcHlfZmQoZmRpLCBmZG8pOworCWNsb3NlKGZkbyk7CisKKwlpZiAoIXN0YXR1cyAmJiBhZGp1c3Rfc2hhcmVkX3Blcm0oZHN0KSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgY29weV90ZW1wbGF0ZXNfMShjaGFyICpwYXRoLCBpbnQgYmFzZWxlbiwKKwkJCSAgICAgY2hhciAqdGVtcGxhdGUsIGludCB0ZW1wbGF0ZV9iYXNlbGVuLAorCQkJICAgICBESVIgKmRpcikKK3sKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCS8qIE5vdGU6IGlmICIuZ2l0L2hvb2tzIiBmaWxlIGV4aXN0cyBpbiB0aGUgcmVwb3NpdG9yeSBiZWluZworCSAqIHJlLWluaXRpYWxpemVkLCAvZXRjL2NvcmUtZ2l0L3RlbXBsYXRlcy9ob29rcy91cGRhdGUgd291bGQKKwkgKiBjYXVzZSBnaXQtaW5pdC1kYiB0byBmYWlsIGhlcmUuICBJIHRoaW5rIHRoaXMgaXMgc2FuZSBidXQKKwkgKiBpdCBtZWFucyB0aGF0IHRoZSBzZXQgb2YgdGVtcGxhdGVzIHdlIHNoaXAgYnkgZGVmYXVsdCwgYWxvbmcKKwkgKiB3aXRoIHRoZSB3YXkgdGhlIG5hbWVzcGFjZSB1bmRlciAuZ2l0LyBpcyBvcmdhbml6ZWQsIHNob3VsZAorCSAqIGJlIHJlYWxseSBjYXJlZnVsbHkgY2hvc2VuLgorCSAqLworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBzdGF0IHN0X2dpdCwgc3RfdGVtcGxhdGU7CisJCWludCBuYW1lbGVuOworCQlpbnQgZXhpc3RzID0gMDsKKworCQlpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisJCQljb250aW51ZTsKKwkJbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJaWYgKChQQVRIX01BWCA8PSBiYXNlbGVuICsgbmFtZWxlbikgfHwKKwkJICAgIChQQVRIX01BWCA8PSB0ZW1wbGF0ZV9iYXNlbGVuICsgbmFtZWxlbikpCisJCQlkaWUoImluc2FuZWx5IGxvbmcgdGVtcGxhdGUgbmFtZSAlcyIsIGRlLT5kX25hbWUpOworCQltZW1jcHkocGF0aCArIGJhc2VsZW4sIGRlLT5kX25hbWUsIG5hbWVsZW4rMSk7CisJCW1lbWNweSh0ZW1wbGF0ZSArIHRlbXBsYXRlX2Jhc2VsZW4sIGRlLT5kX25hbWUsIG5hbWVsZW4rMSk7CisJCWlmIChsc3RhdChwYXRoLCAmc3RfZ2l0KSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCQlkaWUoImNhbm5vdCBzdGF0ICVzIiwgcGF0aCk7CisJCX0KKwkJZWxzZQorCQkJZXhpc3RzID0gMTsKKworCQlpZiAobHN0YXQodGVtcGxhdGUsICZzdF90ZW1wbGF0ZSkpCisJCQlkaWUoImNhbm5vdCBzdGF0IHRlbXBsYXRlICVzIiwgdGVtcGxhdGUpOworCisJCWlmIChTX0lTRElSKHN0X3RlbXBsYXRlLnN0X21vZGUpKSB7CisJCQlESVIgKnN1YmRpciA9IG9wZW5kaXIodGVtcGxhdGUpOworCQkJaW50IGJhc2VsZW5fc3ViID0gYmFzZWxlbiArIG5hbWVsZW47CisJCQlpbnQgdGVtcGxhdGVfYmFzZWxlbl9zdWIgPSB0ZW1wbGF0ZV9iYXNlbGVuICsgbmFtZWxlbjsKKwkJCWlmICghc3ViZGlyKQorCQkJCWRpZSgiY2Fubm90IG9wZW5kaXIgJXMiLCB0ZW1wbGF0ZSk7CisJCQlwYXRoW2Jhc2VsZW5fc3ViKytdID0KKwkJCQl0ZW1wbGF0ZVt0ZW1wbGF0ZV9iYXNlbGVuX3N1YisrXSA9ICcvJzsKKwkJCXBhdGhbYmFzZWxlbl9zdWJdID0KKwkJCQl0ZW1wbGF0ZVt0ZW1wbGF0ZV9iYXNlbGVuX3N1Yl0gPSAwOworCQkJY29weV90ZW1wbGF0ZXNfMShwYXRoLCBiYXNlbGVuX3N1YiwKKwkJCQkJIHRlbXBsYXRlLCB0ZW1wbGF0ZV9iYXNlbGVuX3N1YiwKKwkJCQkJIHN1YmRpcik7CisJCQljbG9zZWRpcihzdWJkaXIpOworCQl9CisJCWVsc2UgaWYgKGV4aXN0cykKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChTX0lTTE5LKHN0X3RlbXBsYXRlLnN0X21vZGUpKSB7CisJCQljaGFyIGxua1syNTZdOworCQkJaW50IGxlbjsKKwkJCWxlbiA9IHJlYWRsaW5rKHRlbXBsYXRlLCBsbmssIHNpemVvZihsbmspKTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWRpZSgiY2Fubm90IHJlYWRsaW5rICVzIiwgdGVtcGxhdGUpOworCQkJaWYgKHNpemVvZihsbmspIDw9IGxlbikKKwkJCQlkaWUoImluc2FuZWx5IGxvbmcgc3ltbGluayAlcyIsIHRlbXBsYXRlKTsKKwkJCWxua1tsZW5dID0gMDsKKwkJCWlmIChzeW1saW5rKGxuaywgcGF0aCkpCisJCQkJZGllKCJjYW5ub3Qgc3ltbGluayAlcyAlcyIsIGxuaywgcGF0aCk7CisJCX0KKwkJZWxzZSBpZiAoU19JU1JFRyhzdF90ZW1wbGF0ZS5zdF9tb2RlKSkgeworCQkJaWYgKGNvcHlfZmlsZShwYXRoLCB0ZW1wbGF0ZSwgc3RfdGVtcGxhdGUuc3RfbW9kZSkpCisJCQkJZGllKCJjYW5ub3QgY29weSAlcyB0byAlcyIsIHRlbXBsYXRlLCBwYXRoKTsKKwkJfQorCQllbHNlCisJCQllcnJvcigiaWdub3JpbmcgdGVtcGxhdGUgJXMiLCB0ZW1wbGF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X3RlbXBsYXRlcyhjb25zdCBjaGFyICpnaXRfZGlyLCBpbnQgbGVuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZV9kaXIpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIHRlbXBsYXRlX3BhdGhbUEFUSF9NQVhdOworCWludCB0ZW1wbGF0ZV9sZW47CisJRElSICpkaXI7CisKKwlpZiAoIXRlbXBsYXRlX2RpcikKKwkJdGVtcGxhdGVfZGlyID0gREVGQVVMVF9HSVRfVEVNUExBVEVfRElSOworCXN0cmNweSh0ZW1wbGF0ZV9wYXRoLCB0ZW1wbGF0ZV9kaXIpOworCXRlbXBsYXRlX2xlbiA9IHN0cmxlbih0ZW1wbGF0ZV9wYXRoKTsKKwlpZiAodGVtcGxhdGVfcGF0aFt0ZW1wbGF0ZV9sZW4tMV0gIT0gJy8nKSB7CisJCXRlbXBsYXRlX3BhdGhbdGVtcGxhdGVfbGVuKytdID0gJy8nOworCQl0ZW1wbGF0ZV9wYXRoW3RlbXBsYXRlX2xlbl0gPSAwOworCX0KKwlkaXIgPSBvcGVuZGlyKHRlbXBsYXRlX3BhdGgpOworCWlmICghZGlyKSB7CisJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogdGVtcGxhdGVzIG5vdCBmb3VuZCAlc1xuIiwKKwkJCXRlbXBsYXRlX2Rpcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0ZW1wbGF0ZSBpcyBmcm9tIHRoZSBjb3JyZWN0IHZpbnRhZ2UgKi8KKwlzdHJjcHkodGVtcGxhdGVfcGF0aCArIHRlbXBsYXRlX2xlbiwgImNvbmZpZyIpOworCXJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24gPSAwOworCWdpdF9jb25maWdfZnJvbV9maWxlKGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24sCisJCQkgICAgIHRlbXBsYXRlX3BhdGgpOworCXRlbXBsYXRlX3BhdGhbdGVtcGxhdGVfbGVuXSA9IDA7CisKKwlpZiAocmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiAmJgorCSAgICByZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uICE9IEdJVF9SRVBPX1ZFUlNJT04pIHsKKwkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBub3QgY29weWluZyB0ZW1wbGF0ZXMgb2YgIgorCQkJImEgd3JvbmcgZm9ybWF0IHZlcnNpb24gJWQgZnJvbSAnJXMnXG4iLAorCQkJcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiwKKwkJCXRlbXBsYXRlX2Rpcik7CisJCWNsb3NlZGlyKGRpcik7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkocGF0aCwgZ2l0X2RpciwgbGVuKTsKKwlwYXRoW2xlbl0gPSAwOworCWNvcHlfdGVtcGxhdGVzXzEocGF0aCwgbGVuLAorCQkJIHRlbXBsYXRlX3BhdGgsIHRlbXBsYXRlX2xlbiwKKwkJCSBkaXIpOworCWNsb3NlZGlyKGRpcik7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZWZhdWx0X2ZpbGVzKGNvbnN0IGNoYXIgKmdpdF9kaXIsIGNvbnN0IGNoYXIgKnRlbXBsYXRlX3BhdGgpCit7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKGdpdF9kaXIpOworCXN0YXRpYyBjaGFyIHBhdGhbUEFUSF9NQVhdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IHN0YXQgc3QxOworCWNoYXIgcmVwb192ZXJzaW9uX3N0cmluZ1sxMF07CisKKwlpZiAobGVuID4gc2l6ZW9mKHBhdGgpLTUwKQorCQlkaWUoImluc2FuZSBnaXQgZGlyZWN0b3J5ICVzIiwgZ2l0X2Rpcik7CisJbWVtY3B5KHBhdGgsIGdpdF9kaXIsIGxlbik7CisKKwlpZiAobGVuICYmIHBhdGhbbGVuLTFdICE9ICcvJykKKwkJcGF0aFtsZW4rK10gPSAnLyc7CisKKwkvKgorCSAqIENyZWF0ZSAuZ2l0L3JlZnMve2hlYWRzLHRhZ3N9CisJICovCisJc3RyY3B5KHBhdGggKyBsZW4sICJyZWZzIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCXN0cmNweShwYXRoICsgbGVuLCAicmVmcy9oZWFkcyIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKwlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvdGFncyIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKworCS8qIEZpcnN0IGNvcHkgdGhlIHRlbXBsYXRlcyAtLSB3ZSBtaWdodCBoYXZlIHRoZSBkZWZhdWx0CisJICogY29uZmlnIGZpbGUgdGhlcmUsIGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgd2FudCB0byByZWFkCisJICogZnJvbSBpdCBhZnRlciBpbnN0YWxsaW5nLgorCSAqLworCXBhdGhbbGVuXSA9IDA7CisJY29weV90ZW1wbGF0ZXMocGF0aCwgbGVuLCB0ZW1wbGF0ZV9wYXRoKTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCS8qCisJICogV2Ugd291bGQgaGF2ZSBjcmVhdGVkIHRoZSBhYm92ZSB1bmRlciB1c2VyJ3MgdW1hc2sgLS0gdW5kZXIKKwkgKiBzaGFyZWQtcmVwb3NpdG9yeSBzZXR0aW5ncywgd2Ugd291bGQgbmVlZCB0byBmaXggdGhlbSB1cC4KKwkgKi8KKwlpZiAoc2hhcmVkX3JlcG9zaXRvcnkpIHsKKwkJcGF0aFtsZW5dID0gMDsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMiKTsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvaGVhZHMiKTsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvdGFncyIpOworCQlhZGp1c3Rfc2hhcmVkX3Blcm0ocGF0aCk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgdGhlIGRlZmF1bHQgc3ltbGluayBmcm9tICIuZ2l0L0hFQUQiIHRvIHRoZSAibWFzdGVyIgorCSAqIGJyYW5jaCwgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LgorCSAqLworCXN0cmNweShwYXRoICsgbGVuLCAiSEVBRCIpOworCWlmIChyZWFkX3JlZihwYXRoLCBzaGExKSA8IDApIHsKKwkJaWYgKGNyZWF0ZV9zeW1yZWYocGF0aCwgInJlZnMvaGVhZHMvbWFzdGVyIikgPCAwKQorCQkJZXhpdCgxKTsKKwl9CisKKwkvKiBUaGlzIGZvcmNlcyBjcmVhdGlvbiBvZiBuZXcgY29uZmlnIGZpbGUgKi8KKwlzcHJpbnRmKHJlcG9fdmVyc2lvbl9zdHJpbmcsICIlZCIsIEdJVF9SRVBPX1ZFUlNJT04pOworCWdpdF9jb25maWdfc2V0KCJjb3JlLnJlcG9zaXRvcnlmb3JtYXR2ZXJzaW9uIiwgcmVwb192ZXJzaW9uX3N0cmluZyk7CisKKwlwYXRoW2xlbl0gPSAwOworCXN0cmNweShwYXRoICsgbGVuLCAiY29uZmlnIik7CisKKwkvKiBDaGVjayBmaWxlbW9kZSB0cnVzdGFiaWxpdHkgKi8KKwlpZiAoIWxzdGF0KHBhdGgsICZzdDEpKSB7CisJCXN0cnVjdCBzdGF0IHN0MjsKKwkJaW50IGZpbGVtb2RlID0gKCFjaG1vZChwYXRoLCBzdDEuc3RfbW9kZSBeIFNfSVhVU1IpICYmCisJCQkJIWxzdGF0KHBhdGgsICZzdDIpICYmCisJCQkJc3QxLnN0X21vZGUgIT0gc3QyLnN0X21vZGUpOworCQlnaXRfY29uZmlnX3NldCgiY29yZS5maWxlbW9kZSIsCisJCQkgICAgICAgZmlsZW1vZGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGluaXRfZGJfdXNhZ2VbXSA9CisiZ2l0LWluaXQtZGIgWy0tdGVtcGxhdGU9PHRlbXBsYXRlLWRpcmVjdG9yeT5dIFstLXNoYXJlZF0iOworCisvKgorICogSWYgeW91IHdhbnQgdG8sIHlvdSBjYW4gc2hhcmUgdGhlIERCIGFyZWEgd2l0aCBhbnkgbnVtYmVyIG9mIGJyYW5jaGVzLgorICogVGhhdCBoYXMgYWR2YW50YWdlczogeW91IGNhbiBzYXZlIHNwYWNlIGJ5IHNoYXJpbmcgYWxsIHRoZSBTSEExIG9iamVjdHMuCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWlnaHQganVzdCBtYWtlIGxvb2t1cCBzbG93ZXIgYW5kIG1lc3NpZXIuIFlvdQorICogYmUgdGhlIGp1ZGdlLiAgVGhlIGRlZmF1bHQgY2FzZSBpcyB0byBoYXZlIG9uZSBEQiBwZXIgbWFuYWdlZCBkaXJlY3RvcnkuCisgKi8KK2ludCBjbWRfaW5pdF9kYihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWNvbnN0IGNoYXIgKmdpdF9kaXI7CisJY29uc3QgY2hhciAqc2hhMV9kaXI7CisJY29uc3QgY2hhciAqdGVtcGxhdGVfZGlyID0gTlVMTDsKKwljaGFyICpwYXRoOworCWludCBsZW4sIGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrLCBhcmd2KyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tdGVtcGxhdGU9IiwgMTEpKQorCQkJdGVtcGxhdGVfZGlyID0gYXJnKzExOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc2hhcmVkIikpCisJCQlzaGFyZWRfcmVwb3NpdG9yeSA9IDE7CisJCWVsc2UKKwkJCWRpZShpbml0X2RiX3VzYWdlKTsKKwl9CisKKwkvKgorCSAqIFNldCB1cCB0aGUgZGVmYXVsdCAuZ2l0IGRpcmVjdG9yeSBjb250ZW50cworCSAqLworCWdpdF9kaXIgPSBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfZGlyKSB7CisJCWdpdF9kaXIgPSBERUZBVUxUX0dJVF9ESVJfRU5WSVJPTk1FTlQ7CisJCWZwcmludGYoc3RkZXJyLCAiZGVmYXVsdGluZyB0byBsb2NhbCBzdG9yYWdlIGFyZWFcbiIpOworCX0KKwlzYWZlX2NyZWF0ZV9kaXIoZ2l0X2RpciwgMCk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIHJlcG9zaXRvcnkgdmVyc2lvbiBpcyByaWdodC4KKwkgKiBOb3RlIHRoYXQgYSBuZXdseSBjcmVhdGVkIHJlcG9zaXRvcnkgZG9lcyBub3QgaGF2ZQorCSAqIGNvbmZpZyBmaWxlLCBzbyB0aGlzIHdpbGwgbm90IGZhaWwuICBXaGF0IHdlIGFyZSBjYXRjaGluZworCSAqIGlzIGFuIGF0dGVtcHQgdG8gcmVpbml0aWFsaXplIG5ldyByZXBvc2l0b3J5IHdpdGggYW4gb2xkIHRvb2wuCisJICovCisJY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQoKTsKKworCWNyZWF0ZV9kZWZhdWx0X2ZpbGVzKGdpdF9kaXIsIHRlbXBsYXRlX2Rpcik7CisKKwkvKgorCSAqIEFuZCBzZXQgdXAgdGhlIG9iamVjdCBzdG9yZS4KKwkgKi8KKwlzaGExX2RpciA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJbGVuID0gc3RybGVuKHNoYTFfZGlyKTsKKwlwYXRoID0geG1hbGxvYyhsZW4gKyA0MCk7CisJbWVtY3B5KHBhdGgsIHNoYTFfZGlyLCBsZW4pOworCisJc2FmZV9jcmVhdGVfZGlyKHNoYTFfZGlyLCAxKTsKKwlzdHJjcHkocGF0aCtsZW4sICIvcGFjayIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKwlzdHJjcHkocGF0aCtsZW4sICIvaW5mbyIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKworCWlmIChzaGFyZWRfcmVwb3NpdG9yeSkKKwkJZ2l0X2NvbmZpZ19zZXQoImNvcmUuc2hhcmVkcmVwb3NpdG9yeSIsICJ0cnVlIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbG9nLmMgYi9idWlsdGluLWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTg4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxvZy5jCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogQnVpbHRpbiAiZ2l0IGxvZyIgYW5kIHJlbGF0ZWQgY29tbWFuZHMgKHNob3csIHdoYXRjaGFuZ2VkKQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBMaW51cyBUb3J2YWxkcworICoJCSAyMDA2IEp1bmlvIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworLyogdGhpcyBpcyBpbiBidWlsdGluLWRpZmYuYyAqLwordm9pZCBhZGRfaGVhZChzdHJ1Y3QgcmV2X2luZm8gKnJldnMpOworCitzdGF0aWMgaW50IGNtZF9sb2dfd2MoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCwKKwkJICAgICAgc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJcmV2LT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwlyZXYtPmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9ERUZBVUxUOworCXJldi0+dmVyYm9zZV9oZWFkZXIgPSAxOworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgcmV2LCAiSEVBRCIpOworCWlmIChyZXYtPmFsd2F5c19zaG93X2hlYWRlcikgeworCQlpZiAocmV2LT5kaWZmb3B0LnBpY2theGUgfHwgcmV2LT5kaWZmb3B0LmZpbHRlcikgeworCQkJcmV2LT5hbHdheXNfc2hvd19oZWFkZXIgPSAwOworCQkJaWYgKHJldi0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID09IERJRkZfRk9STUFUX1JBVykKKwkJCQlyZXYtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwkJfQorCX0KKworCWlmIChhcmdjID4gMSkKKwkJZGllKCJ1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICVzIiwgYXJndlsxXSk7CisKKwlwcmVwYXJlX3JldmlzaW9uX3dhbGsocmV2KTsKKwlzZXR1cF9wYWdlcigpOworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldikpICE9IE5VTEwpIHsKKwkJbG9nX3RyZWVfY29tbWl0KHJldiwgY29tbWl0KTsKKwkJZnJlZShjb21taXQtPmJ1ZmZlcik7CisJCWNvbW1pdC0+YnVmZmVyID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfd2hhdGNoYW5nZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCisJaW5pdF9yZXZpc2lvbnMoJnJldik7CisJcmV2LmRpZmYgPSAxOworCXJldi5kaWZmb3B0LnJlY3Vyc2l2ZSA9IDE7CisJcmV0dXJuIGNtZF9sb2dfd2MoYXJnYywgYXJndiwgZW52cCwgJnJldik7Cit9CisKK2ludCBjbWRfc2hvdyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisKKwlpbml0X3JldmlzaW9ucygmcmV2KTsKKwlyZXYuZGlmZiA9IDE7CisJcmV2LmRpZmZvcHQucmVjdXJzaXZlID0gMTsKKwlyZXYuY29tYmluZV9tZXJnZXMgPSAxOworCXJldi5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAxOworCXJldi5hbHdheXNfc2hvd19oZWFkZXIgPSAxOworCXJldi5pZ25vcmVfbWVyZ2VzID0gMDsKKwlyZXYubm9fd2FsayA9IDE7CisJcmV0dXJuIGNtZF9sb2dfd2MoYXJnYywgYXJndiwgZW52cCwgJnJldik7Cit9CisKK2ludCBjbWRfbG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKworCWluaXRfcmV2aXNpb25zKCZyZXYpOworCXJldi5hbHdheXNfc2hvd19oZWFkZXIgPSAxOworCXJldi5kaWZmb3B0LnJlY3Vyc2l2ZSA9IDE7CisJcmV0dXJuIGNtZF9sb2dfd2MoYXJnYywgYXJndiwgZW52cCwgJnJldik7Cit9CisKK3N0YXRpYyBpbnQgaXN0aXRsZWNoYXIoY2hhciBjKQoreworCXJldHVybiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwKKwkJKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCBjID09ICcuJyB8fCBjID09ICdfJzsKK30KKworc3RhdGljIGNoYXIgKmV4dHJhX2hlYWRlcnMgPSBOVUxMOworc3RhdGljIGludCBleHRyYV9oZWFkZXJzX3NpemUgPSAwOworCitzdGF0aWMgaW50IGdpdF9mb3JtYXRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiZm9ybWF0LmhlYWRlcnMiKSkgeworCQlpbnQgbGVuID0gc3RybGVuKHZhbHVlKTsKKwkJZXh0cmFfaGVhZGVyc19zaXplICs9IGxlbiArIDE7CisJCWV4dHJhX2hlYWRlcnMgPSByZWFsbG9jKGV4dHJhX2hlYWRlcnMsIGV4dHJhX2hlYWRlcnNfc2l6ZSk7CisJCWV4dHJhX2hlYWRlcnNbZXh0cmFfaGVhZGVyc19zaXplIC0gbGVuIC0gMV0gPSAwOworCQlzdHJjYXQoZXh0cmFfaGVhZGVycywgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworCitzdGF0aWMgRklMRSAqcmVhbHN0ZG91dCA9IE5VTEw7CitzdGF0aWMgY29uc3QgY2hhciAqb3V0cHV0X2RpcmVjdG9yeSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHJlb3Blbl9zdGRvdXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgbnIsIGludCBrZWVwX3N1YmplY3QpCit7CisJY2hhciBmaWxlbmFtZVsxMDI0XTsKKwljaGFyICpzb2w7CisJaW50IGxlbiA9IDA7CisKKwlpZiAob3V0cHV0X2RpcmVjdG9yeSkgeworCQlzdHJuY3B5KGZpbGVuYW1lLCBvdXRwdXRfZGlyZWN0b3J5LCAxMDEwKTsKKwkJbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwkJaWYgKGZpbGVuYW1lW2xlbiAtIDFdICE9ICcvJykKKwkJCWZpbGVuYW1lW2xlbisrXSA9ICcvJzsKKwl9CisKKwlzcHJpbnRmKGZpbGVuYW1lICsgbGVuLCAiJTA0ZCIsIG5yKTsKKwlsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCisJc29sID0gc3Ryc3RyKGNvbW1pdC0+YnVmZmVyLCAiXG5cbiIpOworCWlmIChzb2wpIHsKKwkJaW50IGosIHNwYWNlID0gMTsKKworCQlzb2wgKz0gMjsKKwkJLyogc3RyaXAgW1BBVENIXSBvciBbUEFUQ0ggYmxhYmxhXSAqLworCQlpZiAoIWtlZXBfc3ViamVjdCAmJiAhc3RybmNtcChzb2wsICJbUEFUQ0giLCA2KSkgeworCQkJY2hhciAqZW9zID0gc3RyY2hyKHNvbCArIDYsICddJyk7CisJCQlpZiAoZW9zKSB7CisJCQkJd2hpbGUgKGlzc3BhY2UoKmVvcykpCisJCQkJCWVvcysrOworCQkJCXNvbCA9IGVvczsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IDA7IGxlbiA8IDEwMjQgLSA2ICYmIHNvbFtqXSAmJiBzb2xbal0gIT0gJ1xuJzsgaisrKSB7CisJCQlpZiAoaXN0aXRsZWNoYXIoc29sW2pdKSkgeworCQkJCWlmIChzcGFjZSkgeworCQkJCQlmaWxlbmFtZVtsZW4rK10gPSAnLSc7CisJCQkJCXNwYWNlID0gMDsKKwkJCQl9CisJCQkJZmlsZW5hbWVbbGVuKytdID0gc29sW2pdOworCQkJCWlmIChzb2xbal0gPT0gJy4nKQorCQkJCQl3aGlsZSAoc29sW2ogKyAxXSA9PSAnLicpCisJCQkJCQlqKys7CisJCQl9IGVsc2UKKwkJCQlzcGFjZSA9IDE7CisJCX0KKwkJd2hpbGUgKGZpbGVuYW1lW2xlbiAtIDFdID09ICcuJyB8fCBmaWxlbmFtZVtsZW4gLSAxXSA9PSAnLScpCisJCQlsZW4tLTsKKwl9CisJc3RyY3B5KGZpbGVuYW1lICsgbGVuLCAiLnR4dCIpOworCWZwcmludGYocmVhbHN0ZG91dCwgIiVzXG4iLCBmaWxlbmFtZSk7CisJZnJlb3BlbihmaWxlbmFtZSwgInciLCBzdGRvdXQpOworfQorCitpbnQgY21kX2Zvcm1hdF9wYXRjaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgY29tbWl0ICoqbGlzdCA9IE5VTEw7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgbnIgPSAwLCB0b3RhbCwgaSwgajsKKwlpbnQgdXNlX3N0ZG91dCA9IDA7CisJaW50IG51bWJlcmVkID0gMDsKKwlpbnQgc3RhcnRfbnVtYmVyID0gLTE7CisJaW50IGtlZXBfc3ViamVjdCA9IDA7CisJY2hhciAqYWRkX3NpZ25vZmYgPSBOVUxMOworCisJaW5pdF9yZXZpc2lvbnMoJnJldik7CisJcmV2LmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9FTUFJTDsKKwlyZXYudmVyYm9zZV9oZWFkZXIgPSAxOworCXJldi5kaWZmID0gMTsKKwlyZXYuZGlmZm9wdC53aXRoX3JhdyA9IDA7CisJcmV2LmRpZmZvcHQud2l0aF9zdGF0ID0gMTsKKwlyZXYuY29tYmluZV9tZXJnZXMgPSAwOworCXJldi5pZ25vcmVfbWVyZ2VzID0gMTsKKwlyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUEFUQ0g7CisKKwlnaXRfY29uZmlnKGdpdF9mb3JtYXRfY29uZmlnKTsKKwlyZXYuZXh0cmFfaGVhZGVycyA9IGV4dHJhX2hlYWRlcnM7CisKKwkvKgorCSAqIFBhcnNlIHRoZSBhcmd1bWVudHMgYmVmb3JlIHNldHVwX3JldmlzaW9ucygpLCBvciBzb21ldGhpbmcKKwkgKiBsaWtlICJnaXQgZm10LXBhdGNoIC1vIGExMjMgSEVBRF4uLiIgbWF5IGZhaWw7IGExMjMgaXMKKwkgKiBwb3NzaWJseSBhIHZhbGlkIFNIQTEuCisJICovCisJZm9yIChpID0gMSwgaiA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tc3Rkb3V0IikpCisJCQl1c2Vfc3Rkb3V0ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW4iKSB8fAorCQkJCSFzdHJjbXAoYXJndltpXSwgIi0tbnVtYmVyZWQiKSkKKwkJCW51bWJlcmVkID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi0tc3RhcnQtbnVtYmVyPSIsIDE1KSkKKwkJCXN0YXJ0X251bWJlciA9IHN0cnRvbChhcmd2W2ldICsgMTUsIE5VTEwsIDEwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zdGFydC1udW1iZXIiKSkgeworCQkJaSsrOworCQkJaWYgKGkgPT0gYXJnYykKKwkJCQlkaWUoIk5lZWQgYSBudW1iZXIgZm9yIC0tc3RhcnQtbnVtYmVyIik7CisJCQlzdGFydF9udW1iZXIgPSBzdHJ0b2woYXJndltpXSwgTlVMTCwgMTApOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1rIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbaV0sICItLWtlZXAtc3ViamVjdCIpKSB7CisJCQlrZWVwX3N1YmplY3QgPSAxOworCQkJcmV2LnRvdGFsID0gLTE7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1vdXRwdXQtZGlyZWN0b3J5IikgfHwKKwkJCSAhc3RyY21wKGFyZ3ZbaV0sICItbyIpKSB7CisJCQlpKys7CisJCQlpZiAoYXJnYyA8PSBpKQorCQkJCWRpZSgiV2hpY2ggZGlyZWN0b3J5PyIpOworCQkJaWYgKG91dHB1dF9kaXJlY3RvcnkpCisJCQkJZGllKCJUd28gb3V0cHV0IGRpcmVjdG9yaWVzPyIpOworCQkJb3V0cHV0X2RpcmVjdG9yeSA9IGFyZ3ZbaV07CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zaWdub2ZmIikgfHwKKwkJCSAhc3RyY21wKGFyZ3ZbaV0sICItcyIpKSB7CisJCQljb25zdCBjaGFyICpjb21taXR0ZXIgPSBnaXRfY29tbWl0dGVyX2luZm8oMSk7CisJCQljb25zdCBjaGFyICplbmRwb3MgPSBzdHJjaHIoY29tbWl0dGVyLCAnPicpOworCQkJaWYgKCFlbmRwb3MpCisJCQkJZGllKCJib2dvcyBjb21taXR0ZXIgaW5mbyAlc1xuIiwgY29tbWl0dGVyKTsKKwkJCWFkZF9zaWdub2ZmID0geG1hbGxvYyhlbmRwb3MgLSBjb21taXR0ZXIgKyAyKTsKKwkJCW1lbWNweShhZGRfc2lnbm9mZiwgY29tbWl0dGVyLCBlbmRwb3MgLSBjb21taXR0ZXIgKyAxKTsKKwkJCWFkZF9zaWdub2ZmW2VuZHBvcyAtIGNvbW1pdHRlciArIDFdID0gMDsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLWF0dGFjaCIpKQorCQkJcmV2Lm1pbWVfYm91bmRhcnkgPSBnaXRfdmVyc2lvbl9zdHJpbmc7CisJCWVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItLWF0dGFjaD0iLCA5KSkKKwkJCXJldi5taW1lX2JvdW5kYXJ5ID0gYXJndltpXSArIDk7CisJCWVsc2UKKwkJCWFyZ3ZbaisrXSA9IGFyZ3ZbaV07CisJfQorCWFyZ2MgPSBqOworCisJaWYgKHN0YXJ0X251bWJlciA8IDApCisJCXN0YXJ0X251bWJlciA9IDE7CisJaWYgKG51bWJlcmVkICYmIGtlZXBfc3ViamVjdCkKKwkJZGllICgiLW4gYW5kIC1rIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIik7CisKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsICJIRUFEIik7CisJaWYgKGFyZ2MgPiAxKQorCQlkaWUgKCJ1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICVzIiwgYXJndlsxXSk7CisKKwlpZiAob3V0cHV0X2RpcmVjdG9yeSkgeworCQlpZiAodXNlX3N0ZG91dCkKKwkJCWRpZSgic3RhbmRhcmQgb3V0cHV0LCBvciBkaXJlY3RvcnksIHdoaWNoIG9uZT8iKTsKKwkJaWYgKG1rZGlyKG91dHB1dF9kaXJlY3RvcnksIDA3NzcpIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpCisJCQlkaWUoIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICVzIiwKKwkJCSAgICBvdXRwdXRfZGlyZWN0b3J5KTsKKwl9CisKKwlpZiAocmV2LnBlbmRpbmdfb2JqZWN0cyAmJiByZXYucGVuZGluZ19vYmplY3RzLT5uZXh0ID09IE5VTEwpIHsKKwkJcmV2LnBlbmRpbmdfb2JqZWN0cy0+aXRlbS0+ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJYWRkX2hlYWQoJnJldik7CisJfQorCisJaWYgKCF1c2Vfc3Rkb3V0KQorCQlyZWFsc3Rkb3V0ID0gZmRvcGVuKGR1cCgxKSwgInciKTsKKworCXByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2KTsKKwl3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbigmcmV2KSkgIT0gTlVMTCkgeworCQkvKiBpZ25vcmUgbWVyZ2VzICovCisJCWlmIChjb21taXQtPnBhcmVudHMgJiYgY29tbWl0LT5wYXJlbnRzLT5uZXh0KQorCQkJY29udGludWU7CisJCW5yKys7CisJCWxpc3QgPSByZWFsbG9jKGxpc3QsIG5yICogc2l6ZW9mKGxpc3RbMF0pKTsKKwkJbGlzdFtuciAtIDFdID0gY29tbWl0OworCX0KKwl0b3RhbCA9IG5yOworCWlmIChudW1iZXJlZCkKKwkJcmV2LnRvdGFsID0gdG90YWwgKyBzdGFydF9udW1iZXIgLSAxOworCXJldi5hZGRfc2lnbm9mZiA9IGFkZF9zaWdub2ZmOworCXdoaWxlICgwIDw9IC0tbnIpIHsKKwkJaW50IHNob3duOworCQljb21taXQgPSBsaXN0W25yXTsKKwkJcmV2Lm5yID0gdG90YWwgLSBuciArIChzdGFydF9udW1iZXIgLSAxKTsKKwkJaWYgKCF1c2Vfc3Rkb3V0KQorCQkJcmVvcGVuX3N0ZG91dChjb21taXQsIHJldi5uciwga2VlcF9zdWJqZWN0KTsKKwkJc2hvd24gPSBsb2dfdHJlZV9jb21taXQoJnJldiwgY29tbWl0KTsKKwkJZnJlZShjb21taXQtPmJ1ZmZlcik7CisJCWNvbW1pdC0+YnVmZmVyID0gTlVMTDsKKworCQkvKiBXZSBwdXQgb25lIGV4dHJhIGJsYW5rIGxpbmUgYmV0d2VlbiBmb3JtYXR0ZWQKKwkJICogcGF0Y2hlcyBhbmQgdGhpcyBmbGFnIGlzIHVzZWQgYnkgbG9nLXRyZWUgY29kZQorCQkgKiB0byBzZWUgaWYgaXQgbmVlZHMgdG8gZW1pdCBhIExGIGJlZm9yZSBzaG93aW5nCisJCSAqIHRoZSBsb2c7IHdoZW4gdXNpbmcgb25lIGZpbGUgcGVyIHBhdGNoLCB3ZSBkbworCQkgKiBub3Qgd2FudCB0aGUgZXh0cmEgYmxhbmsgbGluZS4KKwkJICovCisJCWlmICghdXNlX3N0ZG91dCkKKwkJCXJldi5zaG93bl9vbmUgPSAwOworCQlpZiAoc2hvd24pIHsKKwkJCWlmIChyZXYubWltZV9ib3VuZGFyeSkKKwkJCQlwcmludGYoIlxuLS0lcyVzLS1cblxuXG4iLAorCQkJCSAgICAgICBtaW1lX2JvdW5kYXJ5X2xlYWRlciwKKwkJCQkgICAgICAgcmV2Lm1pbWVfYm91bmRhcnkpOworCQkJZWxzZQorCQkJCXByaW50ZigiLS0gXG4lc1xuXG4iLCBnaXRfdmVyc2lvbl9zdHJpbmcpOworCQl9CisJCWlmICghdXNlX3N0ZG91dCkKKwkJCWZjbG9zZShzdGRvdXQpOworCX0KKwlmcmVlKGxpc3QpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9idWlsdGluLWxzLWZpbGVzLmMgYi9idWlsdGluLWxzLWZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhZTlmNwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbHMtZmlsZXMuYwpAQCAtMCwwICsxLDQ5OSBAQAorLyoKKyAqIFRoaXMgbWVyZ2VzIHRoZSBmaWxlIGxpc3RpbmcgaW4gdGhlIGRpcmVjdG9yeSBjYWNoZSBpbmRleAorICogd2l0aCB0aGUgYWN0dWFsIHdvcmtpbmcgZGlyZWN0b3J5IGxpc3QsIGFuZCBzaG93cyBkaWZmZXJlbnQKKyAqIGNvbWJpbmF0aW9ucyBvZiB0aGUgdHdvLgorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgPGZubWF0Y2guaD4KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBpbnQgYWJicmV2ID0gMDsKK3N0YXRpYyBpbnQgc2hvd19kZWxldGVkID0gMDsKK3N0YXRpYyBpbnQgc2hvd19jYWNoZWQgPSAwOworc3RhdGljIGludCBzaG93X290aGVycyA9IDA7CitzdGF0aWMgaW50IHNob3dfc3RhZ2UgPSAwOworc3RhdGljIGludCBzaG93X3VubWVyZ2VkID0gMDsKK3N0YXRpYyBpbnQgc2hvd19tb2RpZmllZCA9IDA7CitzdGF0aWMgaW50IHNob3dfa2lsbGVkID0gMDsKK3N0YXRpYyBpbnQgc2hvd192YWxpZF9iaXQgPSAwOworc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0b3IgPSAnXG4nOworCitzdGF0aWMgaW50IHByZWZpeF9sZW4gPSAwLCBwcmVmaXhfb2Zmc2V0ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpwcmVmaXggPSBOVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKipwYXRoc3BlYyA9IE5VTEw7CitzdGF0aWMgaW50IGVycm9yX3VubWF0Y2ggPSAwOworc3RhdGljIGNoYXIgKnBzX21hdGNoZWQgPSBOVUxMOworCitzdGF0aWMgY29uc3QgY2hhciAqdGFnX2NhY2hlZCA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ191bm1lcmdlZCA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ19yZW1vdmVkID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciAqdGFnX290aGVyID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciAqdGFnX2tpbGxlZCA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ19tb2RpZmllZCA9ICIiOworCisKKy8qCisgKiBNYXRjaCBhIHBhdGhzcGVjIGFnYWluc3QgYSBmaWxlbmFtZS4gVGhlIGZpcnN0ICJsZW4iIGNoYXJhY3RlcnMKKyAqIGFyZSB0aGUgY29tbW9uIHByZWZpeAorICovCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IGNoYXIgKipzcGVjLCBjaGFyICpwc19tYXRjaGVkLAorCQkgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqbTsKKworCXdoaWxlICgobSA9ICpzcGVjKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG0gKyBsZW4pOworCisJCWlmICghbWF0Y2hsZW4pCisJCQlnb3RvIG1hdGNoZWQ7CisJCWlmICghc3RybmNtcChtICsgbGVuLCBmaWxlbmFtZSArIGxlbiwgbWF0Y2hsZW4pKSB7CisJCQlpZiAobVtsZW4gKyBtYXRjaGxlbiAtIDFdID09ICcvJykKKwkJCQlnb3RvIG1hdGNoZWQ7CisJCQlzd2l0Y2ggKGZpbGVuYW1lW2xlbiArIG1hdGNobGVuXSkgeworCQkJY2FzZSAnLyc6IGNhc2UgJ1wwJzoKKwkJCQlnb3RvIG1hdGNoZWQ7CisJCQl9CisJCX0KKwkJaWYgKCFmbm1hdGNoKG0gKyBsZW4sIGZpbGVuYW1lICsgbGVuLCAwKSkKKwkJCWdvdG8gbWF0Y2hlZDsKKwkJaWYgKHBzX21hdGNoZWQpCisJCQlwc19tYXRjaGVkKys7CisJCWNvbnRpbnVlOworCW1hdGNoZWQ6CisJCWlmIChwc19tYXRjaGVkKQorCQkJKnBzX21hdGNoZWQgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IGRpcl9lbnRyeSAqZW50KQoreworCWludCBsZW4gPSBwcmVmaXhfbGVuOworCWludCBvZmZzZXQgPSBwcmVmaXhfb2Zmc2V0OworCisJaWYgKGxlbiA+PSBlbnQtPmxlbikKKwkJZGllKCJnaXQtbHMtZmlsZXM6IGludGVybmFsIGVycm9yIC0gZGlyZWN0b3J5IGVudHJ5IG5vdCBzdXBlcnNldCBvZiBwcmVmaXgiKTsKKworCWlmIChwYXRoc3BlYyAmJiAhbWF0Y2gocGF0aHNwZWMsIHBzX21hdGNoZWQsIGVudC0+bmFtZSwgbGVuKSkKKwkJcmV0dXJuOworCisJZnB1dHModGFnLCBzdGRvdXQpOworCXdyaXRlX25hbWVfcXVvdGVkKCIiLCAwLCBlbnQtPm5hbWUgKyBvZmZzZXQsIGxpbmVfdGVybWluYXRvciwgc3Rkb3V0KTsKKwlwdXRjaGFyKGxpbmVfdGVybWluYXRvcik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb3RoZXJfZmlsZXMoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLT5ucjsgaSsrKSB7CisJCS8qIFdlIHNob3VsZCBub3QgaGF2ZSBhIG1hdGNoaW5nIGVudHJ5LCBidXQgd2UKKwkJICogbWF5IGhhdmUgYW4gdW5tZXJnZWQgZW50cnkgZm9yIHRoaXMgcGF0aC4KKwkJICovCisJCXN0cnVjdCBkaXJfZW50cnkgKmVudCA9IGRpci0+ZW50cmllc1tpXTsKKwkJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKGVudC0+bmFtZSwgZW50LT5sZW4pOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCQlpZiAoMCA8PSBwb3MpCisJCQlkaWUoImJ1ZyBpbiBzaG93LW90aGVyLWZpbGVzIik7CisJCXBvcyA9IC1wb3MgLSAxOworCQlpZiAocG9zIDwgYWN0aXZlX25yKSB7IAorCQkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChjZV9uYW1lbGVuKGNlKSA9PSBlbnQtPmxlbiAmJgorCQkJICAgICFtZW1jbXAoY2UtPm5hbWUsIGVudC0+bmFtZSwgZW50LT5sZW4pKQorCQkJCWNvbnRpbnVlOyAvKiBZdXAsIHRoaXMgb25lIGV4aXN0cyB1bm1lcmdlZCAqLworCQl9CisJCXNob3dfZGlyX2VudHJ5KHRhZ19vdGhlciwgZW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfa2lsbGVkX2ZpbGVzKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGRpci0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlyX2VudHJ5ICplbnQgPSBkaXItPmVudHJpZXNbaV07CisJCWNoYXIgKmNwLCAqc3A7CisJCWludCBwb3MsIGxlbiwga2lsbGVkID0gMDsKKworCQlmb3IgKGNwID0gZW50LT5uYW1lOyBjcCAtIGVudC0+bmFtZSA8IGVudC0+bGVuOyBjcCA9IHNwICsgMSkgeworCQkJc3AgPSBzdHJjaHIoY3AsICcvJyk7CisJCQlpZiAoIXNwKSB7CisJCQkJLyogSWYgZW50LT5uYW1lIGlzIHByZWZpeCBvZiBhbiBlbnRyeSBpbiB0aGUKKwkJCQkgKiBjYWNoZSwgaXQgd2lsbCBiZSBraWxsZWQuCisJCQkJICovCisJCQkJcG9zID0gY2FjaGVfbmFtZV9wb3MoZW50LT5uYW1lLCBlbnQtPmxlbik7CisJCQkJaWYgKDAgPD0gcG9zKQorCQkJCQlkaWUoImJ1ZyBpbiBzaG93LWtpbGxlZC1maWxlcyIpOworCQkJCXBvcyA9IC1wb3MgLSAxOworCQkJCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIgJiYKKwkJCQkgICAgICAgY2Vfc3RhZ2UoYWN0aXZlX2NhY2hlW3Bvc10pKQorCQkJCQlwb3MrKzsgLyogc2tpcCB1bm1lcmdlZCAqLworCQkJCWlmIChhY3RpdmVfbnIgPD0gcG9zKQorCQkJCQlicmVhazsKKwkJCQkvKiBwb3MgcG9pbnRzIGF0IGEgbmFtZSBpbW1lZGlhdGVseSBhZnRlcgorCQkJCSAqIGVudC0+bmFtZSBpbiB0aGUgY2FjaGUuICBEb2VzIGl0IGV4cGVjdAorCQkJCSAqIGVudC0+bmFtZSB0byBiZSBhIGRpcmVjdG9yeT8KKwkJCQkgKi8KKwkJCQlsZW4gPSBjZV9uYW1lbGVuKGFjdGl2ZV9jYWNoZVtwb3NdKTsKKwkJCQlpZiAoKGVudC0+bGVuIDwgbGVuKSAmJgorCQkJCSAgICAhc3RybmNtcChhY3RpdmVfY2FjaGVbcG9zXS0+bmFtZSwKKwkJCQkJICAgICBlbnQtPm5hbWUsIGVudC0+bGVuKSAmJgorCQkJCSAgICBhY3RpdmVfY2FjaGVbcG9zXS0+bmFtZVtlbnQtPmxlbl0gPT0gJy8nKQorCQkJCQlraWxsZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKDAgPD0gY2FjaGVfbmFtZV9wb3MoZW50LT5uYW1lLCBzcCAtIGVudC0+bmFtZSkpIHsKKwkJCQkvKiBJZiBhbnkgb2YgdGhlIGxlYWRpbmcgZGlyZWN0b3JpZXMgaW4KKwkJCQkgKiBlbnQtPm5hbWUgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgY2FjaGUsCisJCQkJICogZW50LT5uYW1lIHdpbGwgYmUga2lsbGVkLgorCQkJCSAqLworCQkJCWtpbGxlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGtpbGxlZCkKKwkJCXNob3dfZGlyX2VudHJ5KHRhZ19raWxsZWQsIGRpci0+ZW50cmllc1tpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2NlX2VudHJ5KGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlpbnQgbGVuID0gcHJlZml4X2xlbjsKKwlpbnQgb2Zmc2V0ID0gcHJlZml4X29mZnNldDsKKworCWlmIChsZW4gPj0gY2VfbmFtZWxlbihjZSkpCisJCWRpZSgiZ2l0LWxzLWZpbGVzOiBpbnRlcm5hbCBlcnJvciAtIGNhY2hlIGVudHJ5IG5vdCBzdXBlcnNldCBvZiBwcmVmaXgiKTsKKworCWlmIChwYXRoc3BlYyAmJiAhbWF0Y2gocGF0aHNwZWMsIHBzX21hdGNoZWQsIGNlLT5uYW1lLCBsZW4pKQorCQlyZXR1cm47CisKKwlpZiAodGFnICYmICp0YWcgJiYgc2hvd192YWxpZF9iaXQgJiYKKwkgICAgKGNlLT5jZV9mbGFncyAmIGh0b25zKENFX1ZBTElEKSkpIHsKKwkJc3RhdGljIGNoYXIgYWx0dGFnWzRdOworCQltZW1jcHkoYWx0dGFnLCB0YWcsIDMpOworCQlpZiAoaXNhbHBoYSh0YWdbMF0pKQorCQkJYWx0dGFnWzBdID0gdG9sb3dlcih0YWdbMF0pOworCQllbHNlIGlmICh0YWdbMF0gPT0gJz8nKQorCQkJYWx0dGFnWzBdID0gJyEnOworCQllbHNlIHsKKwkJCWFsdHRhZ1swXSA9ICd2JzsKKwkJCWFsdHRhZ1sxXSA9IHRhZ1swXTsKKwkJCWFsdHRhZ1syXSA9ICcgJzsKKwkJCWFsdHRhZ1szXSA9IDA7CisJCX0KKwkJdGFnID0gYWx0dGFnOworCX0KKworCWlmICghc2hvd19zdGFnZSkgeworCQlmcHV0cyh0YWcsIHN0ZG91dCk7CisJCXdyaXRlX25hbWVfcXVvdGVkKCIiLCAwLCBjZS0+bmFtZSArIG9mZnNldCwKKwkJCQkgIGxpbmVfdGVybWluYXRvciwgc3Rkb3V0KTsKKwkJcHV0Y2hhcihsaW5lX3Rlcm1pbmF0b3IpOworCX0KKwllbHNlIHsKKwkJcHJpbnRmKCIlcyUwNm8gJXMgJWRcdCIsCisJCSAgICAgICB0YWcsCisJCSAgICAgICBudG9obChjZS0+Y2VfbW9kZSksCisJCSAgICAgICBhYmJyZXYgPyBmaW5kX3VuaXF1ZV9hYmJyZXYoY2UtPnNoYTEsYWJicmV2KQorCQkJCTogc2hhMV90b19oZXgoY2UtPnNoYTEpLAorCQkgICAgICAgY2Vfc3RhZ2UoY2UpKTsKKwkJd3JpdGVfbmFtZV9xdW90ZWQoIiIsIDAsIGNlLT5uYW1lICsgb2Zmc2V0LAorCQkJCSAgbGluZV90ZXJtaW5hdG9yLCBzdGRvdXQpOworCQlwdXRjaGFyKGxpbmVfdGVybWluYXRvcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2ZpbGVzKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIpCit7CisJaW50IGk7CisKKwkvKiBGb3IgY2FjaGVkL2RlbGV0ZWQgZmlsZXMgd2UgZG9uJ3QgbmVlZCB0byBldmVuIGRvIHRoZSByZWFkZGlyICovCisJaWYgKHNob3dfb3RoZXJzIHx8IHNob3dfa2lsbGVkKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSAiLiIsICpiYXNlID0gIiI7CisJCWludCBiYXNlbGVuID0gcHJlZml4X2xlbjsKKworCQlpZiAoYmFzZWxlbikKKwkJCXBhdGggPSBiYXNlID0gcHJlZml4OworCQlyZWFkX2RpcmVjdG9yeShkaXIsIHBhdGgsIGJhc2UsIGJhc2VsZW4pOworCQlpZiAoc2hvd19vdGhlcnMpCisJCQlzaG93X290aGVyX2ZpbGVzKGRpcik7CisJCWlmIChzaG93X2tpbGxlZCkKKwkJCXNob3dfa2lsbGVkX2ZpbGVzKGRpcik7CisJfQorCWlmIChzaG93X2NhY2hlZCB8IHNob3dfc3RhZ2UpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQkJaWYgKGV4Y2x1ZGVkKGRpciwgY2UtPm5hbWUpICE9IGRpci0+c2hvd19pZ25vcmVkKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHNob3dfdW5tZXJnZWQgJiYgIWNlX3N0YWdlKGNlKSkKKwkJCQljb250aW51ZTsKKwkJCXNob3dfY2VfZW50cnkoY2Vfc3RhZ2UoY2UpID8gdGFnX3VubWVyZ2VkIDogdGFnX2NhY2hlZCwgY2UpOworCQl9CisJfQorCWlmIChzaG93X2RlbGV0ZWQgfCBzaG93X21vZGlmaWVkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaW50IGVycjsKKwkJCWlmIChleGNsdWRlZChkaXIsIGNlLT5uYW1lKSAhPSBkaXItPnNob3dfaWdub3JlZCkKKwkJCQljb250aW51ZTsKKwkJCWVyciA9IGxzdGF0KGNlLT5uYW1lLCAmc3QpOworCQkJaWYgKHNob3dfZGVsZXRlZCAmJiBlcnIpCisJCQkJc2hvd19jZV9lbnRyeSh0YWdfcmVtb3ZlZCwgY2UpOworCQkJaWYgKHNob3dfbW9kaWZpZWQgJiYgY2VfbW9kaWZpZWQoY2UsICZzdCwgMCkpCisJCQkJc2hvd19jZV9lbnRyeSh0YWdfbW9kaWZpZWQsIGNlKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFBydW5lIHRoZSBpbmRleCB0byBvbmx5IGNvbnRhaW4gc3R1ZmYgc3RhcnRpbmcgd2l0aCAicHJlZml4IgorICovCitzdGF0aWMgdm9pZCBwcnVuZV9jYWNoZSh2b2lkKQoreworCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwcmVmaXgsIHByZWZpeF9sZW4pOworCXVuc2lnbmVkIGludCBmaXJzdCwgbGFzdDsKKworCWlmIChwb3MgPCAwKQorCQlwb3MgPSAtcG9zLTE7CisJYWN0aXZlX2NhY2hlICs9IHBvczsKKwlhY3RpdmVfbnIgLT0gcG9zOworCWZpcnN0ID0gMDsKKwlsYXN0ID0gYWN0aXZlX25yOworCXdoaWxlIChsYXN0ID4gZmlyc3QpIHsKKwkJaW50IG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW25leHRdOworCQlpZiAoIXN0cm5jbXAoY2UtPm5hbWUsIHByZWZpeCwgcHJlZml4X2xlbikpIHsKKwkJCWZpcnN0ID0gbmV4dCsxOworCQkJY29udGludWU7CisJCX0KKwkJbGFzdCA9IG5leHQ7CisJfQorCWFjdGl2ZV9uciA9IGxhc3Q7Cit9CisKK3N0YXRpYyB2b2lkIHZlcmlmeV9wYXRoc3BlYyh2b2lkKQoreworCWNvbnN0IGNoYXIgKipwLCAqbiwgKnByZXY7CisJY2hhciAqcmVhbF9wcmVmaXg7CisJdW5zaWduZWQgbG9uZyBtYXg7CisKKwlwcmV2ID0gTlVMTDsKKwltYXggPSBQQVRIX01BWDsKKwlmb3IgKHAgPSBwYXRoc3BlYzsgKG4gPSAqcCkgIT0gTlVMTDsgcCsrKSB7CisJCWludCBpLCBsZW4gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCWNoYXIgYyA9IG5baV07CisJCQlpZiAocHJldiAmJiBwcmV2W2ldICE9IGMpCisJCQkJYnJlYWs7CisJCQlpZiAoIWMgfHwgYyA9PSAnKicgfHwgYyA9PSAnPycpCisJCQkJYnJlYWs7CisJCQlpZiAoYyA9PSAnLycpCisJCQkJbGVuID0gaSsxOworCQl9CisJCXByZXYgPSBuOworCQlpZiAobGVuIDwgbWF4KSB7CisJCQltYXggPSBsZW47CisJCQlpZiAoIW1heCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwcmVmaXhfb2Zmc2V0ID4gbWF4IHx8IG1lbWNtcChwcmV2LCBwcmVmaXgsIHByZWZpeF9vZmZzZXQpKQorCQlkaWUoImdpdC1scy1maWxlczogY2Fubm90IGdlbmVyYXRlIHJlbGF0aXZlIGZpbGVuYW1lcyBjb250YWluaW5nICcuLiciKTsKKworCXJlYWxfcHJlZml4ID0gTlVMTDsKKwlwcmVmaXhfbGVuID0gbWF4OworCWlmIChtYXgpIHsKKwkJcmVhbF9wcmVmaXggPSB4bWFsbG9jKG1heCArIDEpOworCQltZW1jcHkocmVhbF9wcmVmaXgsIHByZXYsIG1heCk7CisJCXJlYWxfcHJlZml4W21heF0gPSAwOworCX0KKwlwcmVmaXggPSByZWFsX3ByZWZpeDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbHNfZmlsZXNfdXNhZ2VbXSA9CisJImdpdC1scy1maWxlcyBbLXpdIFstdF0gWy12XSAoLS1bY2FjaGVkfGRlbGV0ZWR8b3RoZXJzfHN0YWdlfHVubWVyZ2VkfGtpbGxlZHxtb2RpZmllZF0pKiAiCisJIlsgLS1pZ25vcmVkIF0gWy0tZXhjbHVkZT08cGF0dGVybj5dIFstLWV4Y2x1ZGUtZnJvbT08ZmlsZT5dICIKKwkiWyAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08ZmlsZW5hbWU+IF0gWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXZdICIKKwkiWy0tXSBbPGZpbGU+XSoiOworCitpbnQgY21kX2xzX2ZpbGVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhcioqIGVudnApCit7CisJaW50IGk7CisJaW50IGV4Y19naXZlbiA9IDA7CisJc3RydWN0IGRpcl9zdHJ1Y3QgZGlyOworCisJbWVtc2V0KCZkaXIsIDAsIHNpemVvZihkaXIpKTsKKwlwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJaWYgKHByZWZpeCkKKwkJcHJlZml4X29mZnNldCA9IHN0cmxlbihwcmVmaXgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICIteiIpKSB7CisJCQlsaW5lX3Rlcm1pbmF0b3IgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXQiKSB8fCAhc3RyY21wKGFyZywgIi12IikpIHsKKwkJCXRhZ19jYWNoZWQgPSAiSCAiOworCQkJdGFnX3VubWVyZ2VkID0gIk0gIjsKKwkJCXRhZ19yZW1vdmVkID0gIlIgIjsKKwkJCXRhZ19tb2RpZmllZCA9ICJDICI7CisJCQl0YWdfb3RoZXIgPSAiPyAiOworCQkJdGFnX2tpbGxlZCA9ICJLICI7CisJCQlpZiAoYXJnWzFdID09ICd2JykKKwkJCQlzaG93X3ZhbGlkX2JpdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItYyIpIHx8ICFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJc2hvd19jYWNoZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWQiKSB8fCAhc3RyY21wKGFyZywgIi0tZGVsZXRlZCIpKSB7CisJCQlzaG93X2RlbGV0ZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW0iKSB8fCAhc3RyY21wKGFyZywgIi0tbW9kaWZpZWQiKSkgeworCQkJc2hvd19tb2RpZmllZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbyIpIHx8ICFzdHJjbXAoYXJnLCAiLS1vdGhlcnMiKSkgeworCQkJc2hvd19vdGhlcnMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWkiKSB8fCAhc3RyY21wKGFyZywgIi0taWdub3JlZCIpKSB7CisJCQlkaXIuc2hvd19pZ25vcmVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1zIikgfHwgIXN0cmNtcChhcmcsICItLXN0YWdlIikpIHsKKwkJCXNob3dfc3RhZ2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWsiKSB8fCAhc3RyY21wKGFyZywgIi0ta2lsbGVkIikpIHsKKwkJCXNob3dfa2lsbGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZGlyZWN0b3J5IikpIHsKKwkJCWRpci5zaG93X290aGVyX2RpcmVjdG9yaWVzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tZW1wdHktZGlyZWN0b3J5IikpIHsKKwkJCWRpci5oaWRlX2VtcHR5X2RpcmVjdG9yaWVzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi11IikgfHwgIXN0cmNtcChhcmcsICItLXVubWVyZ2VkIikpIHsKKwkJCS8qIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gc2hvd2luZyB1bm1lcmdlZCB1bmxlc3MKKwkJCSAqIHlvdSBhbHNvIHNob3cgdGhlIHN0YWdlIGluZm9ybWF0aW9uLgorCQkJICovCisJCQlzaG93X3N0YWdlID0gMTsKKwkJCXNob3dfdW5tZXJnZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXgiKSAmJiBpKzEgPCBhcmdjKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJYWRkX2V4Y2x1ZGUoYXJndlsrK2ldLCAiIiwgMCwgJmRpci5leGNsdWRlX2xpc3RbRVhDX0NNRExdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLWV4Y2x1ZGU9IiwgMTApKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJYWRkX2V4Y2x1ZGUoYXJnKzEwLCAiIiwgMCwgJmRpci5leGNsdWRlX2xpc3RbRVhDX0NNRExdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1YIikgJiYgaSsxIDwgYXJnYykgeworCQkJZXhjX2dpdmVuID0gMTsKKwkJCWFkZF9leGNsdWRlc19mcm9tX2ZpbGUoJmRpciwgYXJndlsrK2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLWV4Y2x1ZGUtZnJvbT0iLCAxNSkpIHsKKwkJCWV4Y19naXZlbiA9IDE7CisJCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlKCZkaXIsIGFyZysxNSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9IiwgMjQpKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJZGlyLmV4Y2x1ZGVfcGVyX2RpciA9IGFyZyArIDI0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mdWxsLW5hbWUiKSkgeworCQkJcHJlZml4X29mZnNldCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWVycm9yLXVubWF0Y2giKSkgeworCQkJZXJyb3JfdW5tYXRjaCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1hYmJyZXY9IiwgOSkpIHsKKwkJCWFiYnJldiA9IHN0cnRvdWwoYXJnKzksIE5VTEwsIDEwKTsKKwkJCWlmIChhYmJyZXYgJiYgYWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJYWJicmV2ID0gTUlOSU1VTV9BQkJSRVY7CisJCQllbHNlIGlmIChhYmJyZXYgPiA0MCkKKwkJCQlhYmJyZXYgPSA0MDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYWJicmV2IikpIHsKKwkJCWFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCphcmcgPT0gJy0nKQorCQkJdXNhZ2UobHNfZmlsZXNfdXNhZ2UpOworCQlicmVhazsKKwl9CisKKwlwYXRoc3BlYyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBpKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBwYXRoc3BlYyBtYXRjaGVzIHRoZSBwcmVmaXggKi8KKwlpZiAocGF0aHNwZWMpCisJCXZlcmlmeV9wYXRoc3BlYygpOworCisJLyogVHJlYXQgdW5tYXRjaGluZyBwYXRoc3BlYyBlbGVtZW50cyBhcyBlcnJvcnMgKi8KKwlpZiAocGF0aHNwZWMgJiYgZXJyb3JfdW5tYXRjaCkgeworCQlpbnQgbnVtOworCQlmb3IgKG51bSA9IDA7IHBhdGhzcGVjW251bV07IG51bSsrKQorCQkJOworCQlwc19tYXRjaGVkID0geGNhbGxvYygxLCBudW0pOworCX0KKworCWlmIChkaXIuc2hvd19pZ25vcmVkICYmICFleGNfZ2l2ZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogLS1pZ25vcmVkIG5lZWRzIHNvbWUgZXhjbHVkZSBwYXR0ZXJuXG4iLAorCQkJYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJLyogV2l0aCBubyBmbGFncywgd2UgZGVmYXVsdCB0byBzaG93aW5nIHRoZSBjYWNoZWQgZmlsZXMgKi8KKwlpZiAoIShzaG93X3N0YWdlIHwgc2hvd19kZWxldGVkIHwgc2hvd19vdGhlcnMgfCBzaG93X3VubWVyZ2VkIHwKKwkgICAgICBzaG93X2tpbGxlZCB8IHNob3dfbW9kaWZpZWQpKQorCQlzaG93X2NhY2hlZCA9IDE7CisKKwlyZWFkX2NhY2hlKCk7CisJaWYgKHByZWZpeCkKKwkJcHJ1bmVfY2FjaGUoKTsKKwlzaG93X2ZpbGVzKCZkaXIpOworCisJaWYgKHBzX21hdGNoZWQpIHsKKwkJLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgYWxsIHBhdGhzcGVjIG1hdGNoZWQgb3RoZXJ3aXNlCisJCSAqIGl0IGlzIGFuIGVycm9yLgorCQkgKi8KKwkJaW50IG51bSwgZXJyb3JzID0gMDsKKwkJZm9yIChudW0gPSAwOyBwYXRoc3BlY1tudW1dOyBudW0rKykgeworCQkJaWYgKHBzX21hdGNoZWRbbnVtXSkKKwkJCQljb250aW51ZTsKKwkJCWVycm9yKCJwYXRoc3BlYyAnJXMnIGRpZCBub3QgbWF0Y2ggYW55LiIsCisJCQkgICAgICBwYXRoc3BlY1tudW1dICsgcHJlZml4X29mZnNldCk7CisJCQllcnJvcnMrKzsKKwkJfQorCQlyZXR1cm4gZXJyb3JzID8gMSA6IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWxzLXRyZWUuYyBiL2J1aWx0aW4tbHMtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDBkODgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxzLXRyZWUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKyNkZWZpbmUgTFNfVFJFRV9PTkxZIDIKKyNkZWZpbmUgTFNfU0hPV19UUkVFUyA0CisjZGVmaW5lIExTX05BTUVfT05MWSA4CitzdGF0aWMgaW50IGFiYnJldiA9IDA7CitzdGF0aWMgaW50IGxzX29wdGlvbnMgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKipwYXRoc3BlYzsKK3N0YXRpYyBpbnQgY2hvbXBfcHJlZml4ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpwcmVmaXg7CisKK3N0YXRpYyBjb25zdCBjaGFyIGxzX3RyZWVfdXNhZ2VbXSA9CisJImdpdC1scy10cmVlIFstZF0gWy1yXSBbLXRdIFstel0gWy0tbmFtZS1vbmx5XSBbLS1uYW1lLXN0YXR1c10gWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXZbPTxuPl1dIDx0cmVlLWlzaD4gW3BhdGguLi5dIjsKKworc3RhdGljIGludCBzaG93X3JlY3Vyc2l2ZShjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJY29uc3QgY2hhciAqKnM7CisKKwlpZiAobHNfb3B0aW9ucyAmIExTX1JFQ1VSU0lWRSkKKwkJcmV0dXJuIDE7CisKKwlzID0gcGF0aHNwZWM7CisJaWYgKCFzKQorCQlyZXR1cm4gMDsKKworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqc3BlYyA9ICpzKys7CisJCWludCBsZW4sIHNwZWNsZW47CisKKwkJaWYgKCFzcGVjKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJuY21wKGJhc2UsIHNwZWMsIGJhc2VsZW4pKQorCQkJY29udGludWU7CisJCWxlbiA9IHN0cmxlbihwYXRobmFtZSk7CisJCXNwZWMgKz0gYmFzZWxlbjsKKwkJc3BlY2xlbiA9IHN0cmxlbihzcGVjKTsKKwkJaWYgKHNwZWNsZW4gPD0gbGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAocGF0aG5hbWUsIHNwZWMsIGxlbikpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgaW50IHNob3dfdHJlZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwKKwkJICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgdW5zaWduZWQgbW9kZSwgaW50IHN0YWdlKQoreworCWludCByZXR2YWwgPSAwOworCWNvbnN0IGNoYXIgKnR5cGUgPSBibG9iX3R5cGU7CisKKwlpZiAoU19JU0RJUihtb2RlKSkgeworCQlpZiAoc2hvd19yZWN1cnNpdmUoYmFzZSwgYmFzZWxlbiwgcGF0aG5hbWUpKSB7CisJCQlyZXR2YWwgPSBSRUFEX1RSRUVfUkVDVVJTSVZFOworCQkJaWYgKCEobHNfb3B0aW9ucyAmIExTX1NIT1dfVFJFRVMpKQorCQkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJdHlwZSA9IHRyZWVfdHlwZTsKKwl9CisJZWxzZSBpZiAobHNfb3B0aW9ucyAmIExTX1RSRUVfT05MWSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2hvbXBfcHJlZml4ICYmCisJICAgIChiYXNlbGVuIDwgY2hvbXBfcHJlZml4IHx8IG1lbWNtcChwcmVmaXgsIGJhc2UsIGNob21wX3ByZWZpeCkpKQorCQlyZXR1cm4gMDsKKworCWlmICghKGxzX29wdGlvbnMgJiBMU19OQU1FX09OTFkpKQorCQlwcmludGYoIiUwNm8gJXMgJXNcdCIsIG1vZGUsIHR5cGUsCisJCQkJYWJicmV2ID8gZmluZF91bmlxdWVfYWJicmV2KHNoYTEsYWJicmV2KQorCQkJCQk6IHNoYTFfdG9faGV4KHNoYTEpKTsKKwl3cml0ZV9uYW1lX3F1b3RlZChiYXNlICsgY2hvbXBfcHJlZml4LCBiYXNlbGVuIC0gY2hvbXBfcHJlZml4LAorCQkJICBwYXRobmFtZSwKKwkJCSAgbGluZV90ZXJtaW5hdGlvbiwgc3Rkb3V0KTsKKwlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBjbWRfbHNfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IHRyZWUgKnRyZWU7CisKKwlwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWlmIChwcmVmaXggJiYgKnByZWZpeCkKKwkJY2hvbXBfcHJlZml4ID0gc3RybGVuKHByZWZpeCk7CisJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXJndlsxXVsxXSkgeworCQljYXNlICd6JzoKKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWxzX29wdGlvbnMgfD0gTFNfU0hPV19UUkVFUzsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCWlmICghc3RyY21wKGFyZ3ZbMV0rMiwgIm5hbWUtb25seSIpIHx8CisJCQkgICAgIXN0cmNtcChhcmd2WzFdKzIsICJuYW1lLXN0YXR1cyIpKSB7CisJCQkJbHNfb3B0aW9ucyB8PSBMU19OQU1FX09OTFk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmd2WzFdKzIsICJmdWxsLW5hbWUiKSkgeworCQkJCWNob21wX3ByZWZpeCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cm5jbXAoYXJndlsxXSsyLCAiYWJicmV2PSIsNykpIHsKKwkJCQlhYmJyZXYgPSBzdHJ0b3VsKGFyZ3ZbMV0rOSwgTlVMTCwgMTApOworCQkJCWlmIChhYmJyZXYgJiYgYWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJCWFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJCWVsc2UgaWYgKGFiYnJldiA+IDQwKQorCQkJCQlhYmJyZXYgPSA0MDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZ3ZbMV0rMiwgImFiYnJldiIpKSB7CisJCQkJYWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBvdGhlcndpc2UgZmFsbHRocnUgKi8KKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKwkvKiAtZCAtciBzaG91bGQgaW1wbHkgLXQsIGJ1dCAtZCBieSBpdHNlbGYgc2hvdWxkIG5vdCBoYXZlIHRvLiAqLworCWlmICggKExTX1RSRUVfT05MWXxMU19SRUNVUlNJVkUpID09CisJICAgICgoTFNfVFJFRV9PTkxZfExTX1JFQ1VSU0lWRSkgJiBsc19vcHRpb25zKSkKKwkJbHNfb3B0aW9ucyB8PSBMU19TSE9XX1RSRUVTOworCisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKworCXBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXJndiArIDIpOworCXRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KHNoYTEpOworCWlmICghdHJlZSkKKwkJZGllKCJub3QgYSB0cmVlIG9iamVjdCIpOworCXJlYWRfdHJlZV9yZWN1cnNpdmUodHJlZSwgIiIsIDAsIDAsIHBhdGhzcGVjLCBzaG93X3RyZWUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXB1c2guYyBiL2J1aWx0aW4tcHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Yjk0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXB1c2guYwpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqICJnaXQgcHVzaCIKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjZGVmaW5lIE1BWF9VUkkgKDE2KQorCitzdGF0aWMgY29uc3QgY2hhciBwdXNoX3VzYWdlW10gPSAiZ2l0IHB1c2ggWy0tYWxsXSBbLS10YWdzXSBbLS1mb3JjZV0gPHJlcG9zaXRvcnk+IFs8cmVmc3BlYz4uLi5dIjsKKworc3RhdGljIGludCBhbGwgPSAwLCB0YWdzID0gMCwgZm9yY2UgPSAwLCB0aGluID0gMTsKK3N0YXRpYyBjb25zdCBjaGFyICpleGVjdXRlID0gTlVMTDsKKworI2RlZmluZSBCVUZfU0laRSAoMjA4NCkKK3N0YXRpYyBjaGFyIGJ1ZmZlcltCVUZfU0laRV07CisKK3N0YXRpYyBjb25zdCBjaGFyICoqcmVmc3BlYyA9IE5VTEw7CitzdGF0aWMgaW50IHJlZnNwZWNfbnIgPSAwOworCitzdGF0aWMgdm9pZCBhZGRfcmVmc3BlYyhjb25zdCBjaGFyICpyZWYpCit7CisJaW50IG5yID0gcmVmc3BlY19uciArIDE7CisJcmVmc3BlYyA9IHhyZWFsbG9jKHJlZnNwZWMsIG5yICogc2l6ZW9mKGNoYXIgKikpOworCXJlZnNwZWNbbnItMV0gPSByZWY7CisJcmVmc3BlY19uciA9IG5yOworfQorCitzdGF0aWMgaW50IGV4cGFuZF9vbmVfcmVmKGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwkvKiBJZ25vcmUgdGhlICJyZWZzLyIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVmbmFtZSAqLworCXJlZiArPSA1OworCisJaWYgKHN0cm5jbXAocmVmLCAidGFncy8iLCA1KSkKKwkJcmV0dXJuIDA7CisKKwlhZGRfcmVmc3BlYyhzdHJkdXAocmVmKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4cGFuZF9yZWZzcGVjcyh2b2lkKQoreworCWlmIChhbGwpIHsKKwkJaWYgKHJlZnNwZWNfbnIpCisJCQlkaWUoImNhbm5vdCBtaXggJy0tYWxsJyBhbmQgYSByZWZzcGVjIik7CisKKwkJLyoKKwkJICogTm8gbmVlZCB0byBleHBhbmQgIi0tYWxsIiAtIHdlJ2xsIGp1c3QgdXNlCisJCSAqIHRoZSAiLS1hbGwiIGZsYWcgdG8gc2VuZC1wYWNrCisJCSAqLworCQlyZXR1cm47CisJfQorCWlmICghdGFncykKKwkJcmV0dXJuOworCWZvcl9lYWNoX3JlZihleHBhbmRfb25lX3JlZik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yZWZzcGVjcyhjb25zdCBjaGFyICoqcmVmcywgaW50IG5yKQoreworCWlmIChucikgeworCQlzaXplX3QgYnl0ZXMgPSBuciAqIHNpemVvZihjaGFyICopOworCisJCXJlZnNwZWMgPSB4cmVhbGxvYyhyZWZzcGVjLCBieXRlcyk7CisJCW1lbWNweShyZWZzcGVjLCByZWZzLCBieXRlcyk7CisJCXJlZnNwZWNfbnIgPSBucjsKKwl9CisJZXhwYW5kX3JlZnNwZWNzKCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlbW90ZXNfdXJpKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwlpbnQgbiA9IDA7CisJRklMRSAqZiA9IGZvcGVuKGdpdF9wYXRoKCJyZW1vdGVzLyVzIiwgcmVwbyksICJyIik7CisJaW50IGhhc19leHBsaWNpdF9yZWZzcGVjID0gcmVmc3BlY19uciB8fCBhbGwgfHwgdGFnczsKKworCWlmICghZikKKwkJcmV0dXJuIC0xOworCXdoaWxlIChmZ2V0cyhidWZmZXIsIEJVRl9TSVpFLCBmKSkgeworCQlpbnQgaXNfcmVmc3BlYzsKKwkJY2hhciAqcywgKnA7CisKKwkJaWYgKCFzdHJuY21wKCJVUkw6ICIsIGJ1ZmZlciwgNSkpIHsKKwkJCWlzX3JlZnNwZWMgPSAwOworCQkJcyA9IGJ1ZmZlciArIDU7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoIlB1c2g6ICIsIGJ1ZmZlciwgNikpIHsKKwkJCWlzX3JlZnNwZWMgPSAxOworCQkJcyA9IGJ1ZmZlciArIDY7CisJCX0gZWxzZQorCQkJY29udGludWU7CisKKwkJLyogUmVtb3ZlIHdoaXRlc3BhY2UgYXQgdGhlIGhlYWQuLiAqLworCQl3aGlsZSAoaXNzcGFjZSgqcykpCisJCQlzKys7CisJCWlmICghKnMpCisJCQljb250aW51ZTsKKworCQkvKiAuLmFuZCBhdCB0aGUgZW5kICovCisJCXAgPSBzICsgc3RybGVuKHMpOworCQl3aGlsZSAoaXNzcGFjZShwWy0xXSkpCisJCQkqLS1wID0gMDsKKworCQlpZiAoIWlzX3JlZnNwZWMpIHsKKwkJCWlmIChuIDwgTUFYX1VSSSkKKwkJCQl1cmlbbisrXSA9IHN0cmR1cChzKTsKKwkJCWVsc2UKKwkJCQllcnJvcigibW9yZSB0aGFuICVkIFVSTCdzIHNwZWNpZmllZCwgaWdub3JlaW5nIHRoZSByZXN0IiwgTUFYX1VSSSk7CisJCX0KKwkJZWxzZSBpZiAoaXNfcmVmc3BlYyAmJiAhaGFzX2V4cGxpY2l0X3JlZnNwZWMpCisJCQlhZGRfcmVmc3BlYyhzdHJkdXAocykpOworCX0KKwlmY2xvc2UoZik7CisJaWYgKCFuKQorCQlkaWUoInJlbW90ZSAnJXMnIGhhcyBubyBVUkwiLCByZXBvKTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKipjb25maWdfdXJpOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZpZ19yZXBvOworc3RhdGljIGludCBjb25maWdfcmVwb19sZW47CitzdGF0aWMgaW50IGNvbmZpZ19jdXJyZW50X3VyaTsKK3N0YXRpYyBpbnQgY29uZmlnX2dldF9yZWZzcGVjczsKKworc3RhdGljIGludCBnZXRfcmVtb3RlX2NvbmZpZyhjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworCWlmICghc3RybmNtcChrZXksICJyZW1vdGUuIiwgNykgJiYKKwkgICAgIXN0cm5jbXAoa2V5ICsgNywgY29uZmlnX3JlcG8sIGNvbmZpZ19yZXBvX2xlbikpIHsKKwkJaWYgKCFzdHJjbXAoa2V5ICsgNyArIGNvbmZpZ19yZXBvX2xlbiwgIi51cmwiKSkgeworCQkJaWYgKGNvbmZpZ19jdXJyZW50X3VyaSA8IE1BWF9VUkkpCisJCQkJY29uZmlnX3VyaVtjb25maWdfY3VycmVudF91cmkrK10gPSBzdHJkdXAodmFsdWUpOworCQkJZWxzZQorCQkJCWVycm9yKCJtb3JlIHRoYW4gJWQgVVJMJ3Mgc3BlY2lmaWVkLCBpZ25vcmluZyB0aGUgcmVzdCIsIE1BWF9VUkkpOworCQl9CisJCWVsc2UgaWYgKGNvbmZpZ19nZXRfcmVmc3BlY3MgJiYKKwkJCSAhc3RyY21wKGtleSArIDcgKyBjb25maWdfcmVwb19sZW4sICIucHVzaCIpKQorCQkJYWRkX3JlZnNwZWMoc3RyZHVwKHZhbHVlKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9jb25maWdfcmVtb3Rlc191cmkoY29uc3QgY2hhciAqcmVwbywgY29uc3QgY2hhciAqdXJpW01BWF9VUkldKQoreworCWNvbmZpZ19yZXBvX2xlbiA9IHN0cmxlbihyZXBvKTsKKwljb25maWdfcmVwbyA9IHJlcG87CisJY29uZmlnX2N1cnJlbnRfdXJpID0gMDsKKwljb25maWdfdXJpID0gdXJpOworCWNvbmZpZ19nZXRfcmVmc3BlY3MgPSAhKHJlZnNwZWNfbnIgfHwgYWxsIHx8IHRhZ3MpOworCisJZ2l0X2NvbmZpZyhnZXRfcmVtb3RlX2NvbmZpZyk7CisJcmV0dXJuIGNvbmZpZ19jdXJyZW50X3VyaTsKK30KKworc3RhdGljIGludCBnZXRfYnJhbmNoZXNfdXJpKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwljb25zdCBjaGFyICpzbGFzaCA9IHN0cmNocihyZXBvLCAnLycpOworCWludCBuID0gc2xhc2ggPyBzbGFzaCAtIHJlcG8gOiAxMDAwOworCUZJTEUgKmYgPSBmb3BlbihnaXRfcGF0aCgiYnJhbmNoZXMvJS4qcyIsIG4sIHJlcG8pLCAiciIpOworCWNoYXIgKnMsICpwOworCWludCBsZW47CisKKwlpZiAoIWYpCisJCXJldHVybiAwOworCXMgPSBmZ2V0cyhidWZmZXIsIEJVRl9TSVpFLCBmKTsKKwlmY2xvc2UoZik7CisJaWYgKCFzKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoaXNzcGFjZSgqcykpCisJCXMrKzsKKwlpZiAoISpzKQorCQlyZXR1cm4gMDsKKwlwID0gcyArIHN0cmxlbihzKTsKKwl3aGlsZSAoaXNzcGFjZShwWy0xXSkpCisJCSotLXAgPSAwOworCWxlbiA9IHAgLSBzOworCWlmIChzbGFzaCkKKwkJbGVuICs9IHN0cmxlbihzbGFzaCk7CisJcCA9IHhtYWxsb2MobGVuICsgMSk7CisJc3RyY3B5KHAsIHMpOworCWlmIChzbGFzaCkKKwkJc3RyY2F0KHAsIHNsYXNoKTsKKwl1cmlbMF0gPSBwOworCXJldHVybiAxOworfQorCisvKgorICogUmVhZCByZW1vdGVzIGFuZCBicmFuY2hlcyBmaWxlLCBmaWxsIHRoZSBwdXNoIHRhcmdldCBVUkkKKyAqIGxpc3QuICBJZiB0aGVyZSBpcyBubyBjb21tYW5kIGxpbmUgcmVmc3BlY3MsIHJlYWQgUHVzaDogbGluZXMKKyAqIHRvIHNldCB1cCB0aGUgKnJlZnNwZWMgbGlzdCBhcyB3ZWxsLgorICogcmV0dXJuIHRoZSBudW1iZXIgb2YgcHVzaCB0YXJnZXQgVVJJcworICovCitzdGF0aWMgaW50IHJlYWRfY29uZmlnKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwlpbnQgbjsKKworCWlmICgqcmVwbyAhPSAnLycpIHsKKwkJbiA9IGdldF9yZW1vdGVzX3VyaShyZXBvLCB1cmkpOworCQlpZiAobiA+IDApCisJCQlyZXR1cm4gbjsKKworCQluID0gZ2V0X2NvbmZpZ19yZW1vdGVzX3VyaShyZXBvLCB1cmkpOworCQlpZiAobiA+IDApCisJCQlyZXR1cm4gbjsKKworCQluID0gZ2V0X2JyYW5jaGVzX3VyaShyZXBvLCB1cmkpOworCQlpZiAobiA+IDApCisJCQlyZXR1cm4gbjsKKwl9CisKKwl1cmlbMF0gPSByZXBvOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRvX3B1c2goY29uc3QgY2hhciAqcmVwbykKK3sKKwljb25zdCBjaGFyICp1cmlbTUFYX1VSSV07CisJaW50IGksIG47CisJaW50IGNvbW1vbl9hcmdjOworCWNvbnN0IGNoYXIgKiphcmd2OworCWludCBhcmdjOworCisJbiA9IHJlYWRfY29uZmlnKHJlcG8sIHVyaSk7CisJaWYgKG4gPD0gMCkKKwkJZGllKCJiYWQgcmVwb3NpdG9yeSAnJXMnIiwgcmVwbyk7CisKKwlhcmd2ID0geG1hbGxvYygocmVmc3BlY19uciArIDEwKSAqIHNpemVvZihjaGFyICopKTsKKwlhcmd2WzBdID0gImR1bW15LXNlbmQtcGFjayI7CisJYXJnYyA9IDE7CisJaWYgKGFsbCkKKwkJYXJndlthcmdjKytdID0gIi0tYWxsIjsKKwlpZiAoZm9yY2UpCisJCWFyZ3ZbYXJnYysrXSA9ICItLWZvcmNlIjsKKwlpZiAoZXhlY3V0ZSkKKwkJYXJndlthcmdjKytdID0gZXhlY3V0ZTsKKwljb21tb25fYXJnYyA9IGFyZ2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWludCBlcnJvcjsKKwkJaW50IGRlc3RfYXJnYyA9IGNvbW1vbl9hcmdjOworCQlpbnQgZGVzdF9yZWZzcGVjX25yID0gcmVmc3BlY19ucjsKKwkJY29uc3QgY2hhciAqKmRlc3RfcmVmc3BlYyA9IHJlZnNwZWM7CisJCWNvbnN0IGNoYXIgKmRlc3QgPSB1cmlbaV07CisJCWNvbnN0IGNoYXIgKnNlbmRlciA9ICJnaXQtc2VuZC1wYWNrIjsKKwkJaWYgKCFzdHJuY21wKGRlc3QsICJodHRwOi8vIiwgNykgfHwKKwkJICAgICFzdHJuY21wKGRlc3QsICJodHRwczovLyIsIDgpKQorCQkJc2VuZGVyID0gImdpdC1odHRwLXB1c2giOworCQllbHNlIGlmICh0aGluKQorCQkJYXJndltkZXN0X2FyZ2MrK10gPSAiLS10aGluIjsKKwkJYXJndlswXSA9IHNlbmRlcjsKKwkJYXJndltkZXN0X2FyZ2MrK10gPSBkZXN0OworCQl3aGlsZSAoZGVzdF9yZWZzcGVjX25yLS0pCisJCQlhcmd2W2Rlc3RfYXJnYysrXSA9ICpkZXN0X3JlZnNwZWMrKzsKKwkJYXJndltkZXN0X2FyZ2NdID0gTlVMTDsKKwkJZXJyb3IgPSBydW5fY29tbWFuZF92KGFyZ2MsIGFyZ3YpOworCQlpZiAoIWVycm9yKQorCQkJY29udGludWU7CisJCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0ZPUks6CisJCQlkaWUoInVuYWJsZSB0byBmb3JrIGZvciAlcyIsIHNlbmRlcik7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9FWEVDOgorCQkJZGllKCJ1bmFibGUgdG8gZXhlYyAlcyIsIHNlbmRlcik7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEOgorCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9XUk9OR19QSUQ6CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDoKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQkJZGllKCIlcyBkaWVkIHdpdGggc3RyYW5nZSBlcnJvciIsIHNlbmRlcik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLWVycm9yOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgY21kX3B1c2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpyZXBvID0gIm9yaWdpbiI7CS8vIGRlZmF1bHQgcmVwb3NpdG9yeQorCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmIChhcmdbMF0gIT0gJy0nKSB7CisJCQlyZXBvID0gYXJnOworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkgeworCQkJYWxsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGFncyIpKSB7CisJCQl0YWdzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZm9yY2UiKSkgeworCQkJZm9yY2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS10aGluIikpIHsKKwkJCXRoaW4gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby10aGluIikpIHsKKwkJCXRoaW4gPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tZXhlYz0iLCA3KSkgeworCQkJZXhlY3V0ZSA9IGFyZzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKHB1c2hfdXNhZ2UpOworCX0KKwlzZXRfcmVmc3BlY3MoYXJndiArIGksIGFyZ2MgLSBpKTsKKwlyZXR1cm4gZG9fcHVzaChyZXBvKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcmVhZC10cmVlLmMgYi9idWlsdGluLXJlYWQtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTBmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXJlYWQtdHJlZS5jCkBAIC0wLDAgKzEsOTg3IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjZGVmaW5lIERCUlRfREVCVUcgMQorCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBpbnQgcmVzZXQgPSAwOworc3RhdGljIGludCBtZXJnZSA9IDA7CitzdGF0aWMgaW50IHVwZGF0ZSA9IDA7CitzdGF0aWMgaW50IGluZGV4X29ubHkgPSAwOworc3RhdGljIGludCBub250cml2aWFsX21lcmdlID0gMDsKK3N0YXRpYyBpbnQgdHJpdmlhbF9tZXJnZXNfb25seSA9IDA7CitzdGF0aWMgaW50IGFnZ3Jlc3NpdmUgPSAwOworc3RhdGljIGludCB2ZXJib3NlX3VwZGF0ZSA9IDA7CitzdGF0aWMgdm9sYXRpbGUgaW50IHByb2dyZXNzX3VwZGF0ZSA9IDA7CisKK3N0YXRpYyBpbnQgaGVhZF9pZHggPSAtMTsKK3N0YXRpYyBpbnQgbWVyZ2Vfc2l6ZSA9IDA7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKnRyZWVzID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCBjYWNoZV9lbnRyeSBkZl9jb25mbGljdF9lbnRyeSA9IHsKK307CisKK3N0cnVjdCB0cmVlX2VudHJ5X2xpc3QgeworCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKm5leHQ7CisJdW5zaWduZWQgZGlyZWN0b3J5IDogMTsKKwl1bnNpZ25lZCBleGVjdXRhYmxlIDogMTsKKwl1bnNpZ25lZCBzeW1saW5rIDogMTsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7Cit9OworCitzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCBkZl9jb25mbGljdF9saXN0ID0geworCS5uYW1lID0gTlVMTCwKKwkubmV4dCA9ICZkZl9jb25mbGljdF9saXN0Cit9OworCit0eXBlZGVmIGludCAoKm1lcmdlX2ZuX3QpKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYyk7CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpjcmVhdGVfdHJlZV9lbnRyeV9saXN0KHN0cnVjdCB0cmVlICp0cmVlKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBvbmU7CisJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICoqbGlzdF9wID0gJnJldDsKKworCWRlc2MuYnVmID0gdHJlZS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IHRyZWUtPnNpemU7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJm9uZSkpIHsKKwkJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZW50cnk7CisKKwkJZW50cnkgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0KSk7CisJCWVudHJ5LT5uYW1lID0gb25lLnBhdGg7CisJCWVudHJ5LT5zaGExID0gb25lLnNoYTE7CisJCWVudHJ5LT5tb2RlID0gb25lLm1vZGU7CisJCWVudHJ5LT5kaXJlY3RvcnkgPSBTX0lTRElSKG9uZS5tb2RlKSAhPSAwOworCQllbnRyeS0+ZXhlY3V0YWJsZSA9IChvbmUubW9kZSAmIFNfSVhVU1IpICE9IDA7CisJCWVudHJ5LT5zeW1saW5rID0gU19JU0xOSyhvbmUubW9kZSkgIT0gMDsKKwkJZW50cnktPm5leHQgPSBOVUxMOworCisJCSpsaXN0X3AgPSBlbnRyeTsKKwkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVudGNtcChjb25zdCBjaGFyICpuYW1lMSwgaW50IGRpcjEsIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgZGlyMikKK3sKKwlpbnQgbGVuMSA9IHN0cmxlbihuYW1lMSk7CisJaW50IGxlbjIgPSBzdHJsZW4obmFtZTIpOworCWludCBsZW4gPSBsZW4xIDwgbGVuMiA/IGxlbjEgOiBsZW4yOworCWludCByZXQgPSBtZW1jbXAobmFtZTEsIG5hbWUyLCBsZW4pOworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJYzEgPSBuYW1lMVtsZW5dOworCWMyID0gbmFtZTJbbGVuXTsKKwlpZiAoIWMxICYmIGRpcjEpCisJCWMxID0gJy8nOworCWlmICghYzIgJiYgZGlyMikKKwkJYzIgPSAnLyc7CisJcmV0ID0gKGMxIDwgYzIpID8gLTEgOiAoYzEgPiBjMikgPyAxIDogMDsKKwlpZiAoYzEgJiYgYzIgJiYgIXJldCkKKwkJcmV0ID0gbGVuMSAtIGxlbjI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1bnBhY2tfdHJlZXNfcmVjKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKipwb3NucywgaW50IGxlbiwKKwkJCSAgICBjb25zdCBjaGFyICpiYXNlLCBtZXJnZV9mbl90IGZuLCBpbnQgKmluZHBvcykKK3sKKwlpbnQgYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlpbnQgc3JjX3NpemUgPSBsZW4gKyAxOworCWRvIHsKKwkJaW50IGk7CisJCWNvbnN0IGNoYXIgKmZpcnN0OworCQlpbnQgZmlyc3RkaXIgPSAwOworCQlpbnQgcGF0aGxlbjsKKwkJdW5zaWduZWQgY2Vfc2l6ZTsKKwkJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqKnN1YnBvc25zOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmM7CisJCWludCBhbnlfZmlsZXMgPSAwOworCQlpbnQgYW55X2RpcnMgPSAwOworCQljaGFyICpjYWNoZV9uYW1lOworCQlpbnQgY2Vfc3RhZ2U7CisKKwkJLyogRmluZCB0aGUgZmlyc3QgbmFtZSBpbiB0aGUgaW5wdXQuICovCisKKwkJZmlyc3QgPSBOVUxMOworCQljYWNoZV9uYW1lID0gTlVMTDsKKworCQkvKiBDaGVjayB0aGUgY2FjaGUgKi8KKwkJaWYgKG1lcmdlICYmICppbmRwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCS8qIFRoaXMgaXMgYSBiaXQgdHJpY2t5OiAqLworCQkJLyogSWYgdGhlIGluZGV4IGhhcyBhIHN1YmRpcmVjdG9yeSAod2l0aAorCQkJICogY29udGVudHMpIGFzIHRoZSBmaXJzdCBuYW1lLCBpdCdsbCBnZXQgYQorCQkJICogZmlsZW5hbWUgbGlrZSAiZm9vL2JhciIuIEJ1dCB0aGF0J3MgYWZ0ZXIKKwkJCSAqICJmb28iLCBzbyB0aGUgZW50cnkgaW4gdHJlZXMgd2lsbCBnZXQKKwkJCSAqIGhhbmRsZWQgZmlyc3QsIGF0IHdoaWNoIHBvaW50IHdlJ2xsIGdvIGludG8KKwkJCSAqICJmb28iLCBhbmQgZGVhbCB3aXRoICJiYXIiIGZyb20gdGhlIGluZGV4LAorCQkJICogYmVjYXVzZSB0aGUgYmFzZSB3aWxsIGJlICJmb28vIi4gVGhlIG9ubHkKKwkJCSAqIHdheSB3ZSBjYW4gYWN0dWFsbHkgaGF2ZSAiZm9vL2JhciIgZmlyc3Qgb2YKKwkJCSAqIGFsbCB0aGUgdGhpbmdzIGlzIGlmIHRoZSB0cmVlcyBkb24ndAorCQkJICogY29udGFpbiAiZm9vIiBhdCBhbGwsIGluIHdoaWNoIGNhc2Ugd2UnbGwKKwkJCSAqIGhhbmRsZSAiZm9vL2JhciIgd2l0aG91dCBnb2luZyBpbnRvIHRoZQorCQkJICogZGlyZWN0b3J5LCBidXQgdGhhdCdzIGZpbmUgKGFuZCB3aWxsIHJldHVybgorCQkJICogYW4gZXJyb3IgYW55d2F5LCB3aXRoIHRoZSBhZGRlZCB1bmtub3duCisJCQkgKiBmaWxlIGNhc2UuCisJCQkgKi8KKworCQkJY2FjaGVfbmFtZSA9IGFjdGl2ZV9jYWNoZVsqaW5kcG9zXS0+bmFtZTsKKwkJCWlmIChzdHJsZW4oY2FjaGVfbmFtZSkgPiBiYXNlbGVuICYmCisJCQkgICAgIW1lbWNtcChjYWNoZV9uYW1lLCBiYXNlLCBiYXNlbGVuKSkgeworCQkJCWNhY2hlX25hbWUgKz0gYmFzZWxlbjsKKwkJCQlmaXJzdCA9IGNhY2hlX25hbWU7CisJCQl9IGVsc2UgeworCQkJCWNhY2hlX25hbWUgPSBOVUxMOworCQkJfQorCQl9CisKKyNpZiBEQlJUX0RFQlVHID4gMQorCQlpZiAoZmlyc3QpCisJCQlwcmludGYoImluZGV4ICVzXG4iLCBmaXJzdCk7CisjZW5kaWYKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAoIXBvc25zW2ldIHx8IHBvc25zW2ldID09ICZkZl9jb25mbGljdF9saXN0KQorCQkJCWNvbnRpbnVlOworI2lmIERCUlRfREVCVUcgPiAxCisJCQlwcmludGYoIiVkICVzXG4iLCBpICsgMSwgcG9zbnNbaV0tPm5hbWUpOworI2VuZGlmCisJCQlpZiAoIWZpcnN0IHx8IGVudGNtcChmaXJzdCwgZmlyc3RkaXIsCisJCQkJCSAgICAgcG9zbnNbaV0tPm5hbWUsIAorCQkJCQkgICAgIHBvc25zW2ldLT5kaXJlY3RvcnkpID4gMCkgeworCQkJCWZpcnN0ID0gcG9zbnNbaV0tPm5hbWU7CisJCQkJZmlyc3RkaXIgPSBwb3Nuc1tpXS0+ZGlyZWN0b3J5OworCQkJfQorCQl9CisJCS8qIE5vIG5hbWUgbWVhbnMgd2UncmUgZG9uZSAqLworCQlpZiAoIWZpcnN0KQorCQkJcmV0dXJuIDA7CisKKwkJcGF0aGxlbiA9IHN0cmxlbihmaXJzdCk7CisJCWNlX3NpemUgPSBjYWNoZV9lbnRyeV9zaXplKGJhc2VsZW4gKyBwYXRobGVuKTsKKworCQlzcmMgPSB4Y2FsbG9jKHNyY19zaXplLCBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5ICopKTsKKworCQlzdWJwb3NucyA9IHhjYWxsb2MobGVuLCBzaXplb2Yoc3RydWN0IHRyZWVfbGlzdF9lbnRyeSAqKSk7CisKKwkJaWYgKGNhY2hlX25hbWUgJiYgIXN0cmNtcChjYWNoZV9uYW1lLCBmaXJzdCkpIHsKKwkJCWFueV9maWxlcyA9IDE7CisJCQlzcmNbMF0gPSBhY3RpdmVfY2FjaGVbKmluZHBvc107CisJCQlyZW1vdmVfY2FjaGVfZW50cnlfYXQoKmluZHBvcyk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwkJCWlmICghcG9zbnNbaV0gfHwKKwkJCSAgICAocG9zbnNbaV0gIT0gJmRmX2NvbmZsaWN0X2xpc3QgJiYKKwkJCSAgICAgc3RyY21wKGZpcnN0LCBwb3Nuc1tpXS0+bmFtZSkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwb3Nuc1tpXSA9PSAmZGZfY29uZmxpY3RfbGlzdCkgeworCQkJCXNyY1tpICsgbWVyZ2VdID0gJmRmX2NvbmZsaWN0X2VudHJ5OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAocG9zbnNbaV0tPmRpcmVjdG9yeSkgeworCQkJCXN0cnVjdCB0cmVlICp0cmVlID0gbG9va3VwX3RyZWUocG9zbnNbaV0tPnNoYTEpOworCQkJCWFueV9kaXJzID0gMTsKKwkJCQlwYXJzZV90cmVlKHRyZWUpOworCQkJCXN1YnBvc25zW2ldID0gY3JlYXRlX3RyZWVfZW50cnlfbGlzdCh0cmVlKTsKKwkJCQlwb3Nuc1tpXSA9IHBvc25zW2ldLT5uZXh0OworCQkJCXNyY1tpICsgbWVyZ2VdID0gJmRmX2NvbmZsaWN0X2VudHJ5OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIW1lcmdlKQorCQkJCWNlX3N0YWdlID0gMDsKKwkJCWVsc2UgaWYgKGkgKyAxIDwgaGVhZF9pZHgpCisJCQkJY2Vfc3RhZ2UgPSAxOworCQkJZWxzZSBpZiAoaSArIDEgPiBoZWFkX2lkeCkKKwkJCQljZV9zdGFnZSA9IDM7CisJCQllbHNlCisJCQkJY2Vfc3RhZ2UgPSAyOworCisJCQljZSA9IHhjYWxsb2MoMSwgY2Vfc2l6ZSk7CisJCQljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKHBvc25zW2ldLT5tb2RlKTsKKwkJCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhiYXNlbGVuICsgcGF0aGxlbiwKKwkJCQkJCSAgICAgICBjZV9zdGFnZSk7CisJCQltZW1jcHkoY2UtPm5hbWUsIGJhc2UsIGJhc2VsZW4pOworCQkJbWVtY3B5KGNlLT5uYW1lICsgYmFzZWxlbiwgZmlyc3QsIHBhdGhsZW4gKyAxKTsKKworCQkJYW55X2ZpbGVzID0gMTsKKworCQkJbWVtY3B5KGNlLT5zaGExLCBwb3Nuc1tpXS0+c2hhMSwgMjApOworCQkJc3JjW2kgKyBtZXJnZV0gPSBjZTsKKwkJCXN1YnBvc25zW2ldID0gJmRmX2NvbmZsaWN0X2xpc3Q7CisJCQlwb3Nuc1tpXSA9IHBvc25zW2ldLT5uZXh0OworCQl9CisJCWlmIChhbnlfZmlsZXMpIHsKKwkJCWlmIChtZXJnZSkgeworCQkJCWludCByZXQ7CisKKyNpZiBEQlJUX0RFQlVHID4gMQorCQkJCXByaW50ZigiJXM6XG4iLCBmaXJzdCk7CisJCQkJZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpKyspIHsKKwkJCQkJcHJpbnRmKCIgJWQgIiwgaSk7CisJCQkJCWlmIChzcmNbaV0pCisJCQkJCQlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChzcmNbaV0tPnNoYTEpKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRmKCJcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCXJldCA9IGZuKHNyYyk7CisJCQkJCisjaWYgREJSVF9ERUJVRyA+IDEKKwkJCQlwcmludGYoIkFkZGVkICVkIGVudHJpZXNcbiIsIHJldCk7CisjZW5kaWYKKwkJCQkqaW5kcG9zICs9IHJldDsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpKyspIHsKKwkJCQkJaWYgKHNyY1tpXSkgeworCQkJCQkJYWRkX2NhY2hlX2VudHJ5KHNyY1tpXSwgQUREX0NBQ0hFX09LX1RPX0FERHxBRERfQ0FDSEVfU0tJUF9ERkNIRUNLKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoYW55X2RpcnMpIHsKKwkJCWNoYXIgKm5ld2Jhc2UgPSB4bWFsbG9jKGJhc2VsZW4gKyAyICsgcGF0aGxlbik7CisJCQltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJCQltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4sIGZpcnN0LCBwYXRobGVuKTsKKwkJCW5ld2Jhc2VbYmFzZWxlbiArIHBhdGhsZW5dID0gJy8nOworCQkJbmV3YmFzZVtiYXNlbGVuICsgcGF0aGxlbiArIDFdID0gJ1wwJzsKKwkJCWlmICh1bnBhY2tfdHJlZXNfcmVjKHN1YnBvc25zLCBsZW4sIG5ld2Jhc2UsIGZuLAorCQkJCQkgICAgIGluZHBvcykpCisJCQkJcmV0dXJuIC0xOworCQkJZnJlZShuZXdiYXNlKTsKKwkJfQorCQlmcmVlKHN1YnBvc25zKTsKKwkJZnJlZShzcmMpOworCX0gd2hpbGUgKDEpOworfQorCitzdGF0aWMgdm9pZCByZWplY3RfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlkaWUoIkVudHJ5ICclcycgd291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgbWVyZ2UuIENhbm5vdCBtZXJnZS4iLCAKKwkgICAgY2UtPm5hbWUpOworfQorCisvKiBVbmxpbmsgdGhlIGxhc3QgY29tcG9uZW50IGFuZCBhdHRlbXB0IHRvIHJlbW92ZSBsZWFkaW5nCisgKiBkaXJlY3RvcmllcywgaW4gY2FzZSB0aGlzIHVubGluayBpcyB0aGUgcmVtb3ZhbCBvZiB0aGUKKyAqIGxhc3QgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAtLSBlbXB0eSBkaXJlY3RvcmllcyBhcmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIHZvaWQgdW5saW5rX2VudHJ5KGNoYXIgKm5hbWUpCit7CisJY2hhciAqY3AsICpwcmV2OworCisJaWYgKHVubGluayhuYW1lKSkKKwkJcmV0dXJuOworCXByZXYgPSBOVUxMOworCXdoaWxlICgxKSB7CisJCWludCBzdGF0dXM7CisJCWNwID0gc3RycmNocihuYW1lLCAnLycpOworCQlpZiAocHJldikKKwkJCSpwcmV2ID0gJy8nOworCQlpZiAoIWNwKQorCQkJYnJlYWs7CisKKwkJKmNwID0gMDsKKwkJc3RhdHVzID0gcm1kaXIobmFtZSk7CisJCWlmIChzdGF0dXMpIHsKKwkJCSpjcCA9ICcvJzsKKwkJCWJyZWFrOworCQl9CisJCXByZXYgPSBjcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyZXNzX2ludGVydmFsKGludCBzaWdudW0pCit7CisJcHJvZ3Jlc3NfdXBkYXRlID0gMTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcHJvZ3Jlc3Nfc2lnbmFsKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwlzdHJ1Y3QgaXRpbWVydmFsIHY7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gcHJvZ3Jlc3NfaW50ZXJ2YWw7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzaWdhY3Rpb24oU0lHQUxSTSwgJnNhLCBOVUxMKTsKKworCXYuaXRfaW50ZXJ2YWwudHZfc2VjID0gMTsKKwl2Lml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworCXYuaXRfdmFsdWUgPSB2Lml0X2ludGVydmFsOworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjaGVja191cGRhdGVzKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYywgaW50IG5yKQoreworCXN0YXRpYyBzdHJ1Y3QgY2hlY2tvdXQgc3RhdGUgPSB7CisJCS5iYXNlX2RpciA9ICIiLAorCQkuZm9yY2UgPSAxLAorCQkucXVpZXQgPSAxLAorCQkucmVmcmVzaF9jYWNoZSA9IDEsCisJfTsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gaHRvbnMoQ0VfVVBEQVRFKTsKKwl1bnNpZ25lZCBsYXN0X3BlcmNlbnQgPSAyMDAsIGNudCA9IDAsIHRvdGFsID0gMDsKKworCWlmICh1cGRhdGUgJiYgdmVyYm9zZV91cGRhdGUpIHsKKwkJZm9yICh0b3RhbCA9IGNudCA9IDA7IGNudCA8IG5yOyBjbnQrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IHNyY1tjbnRdOworCQkJaWYgKCFjZS0+Y2VfbW9kZSB8fCBjZS0+Y2VfZmxhZ3MgJiBtYXNrKQorCQkJCXRvdGFsKys7CisJCX0KKworCQkvKiBEb24ndCBib3RoZXIgZG9pbmcgdGhpcyBmb3IgdmVyeSBzbWFsbCB1cGRhdGVzICovCisJCWlmICh0b3RhbCA8IDI1MCkKKwkJCXRvdGFsID0gMDsKKworCQlpZiAodG90YWwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2hlY2tpbmcgZmlsZXMgb3V0Li4uXG4iKTsKKwkJCXNldHVwX3Byb2dyZXNzX3NpZ25hbCgpOworCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMTsKKwkJfQorCQljbnQgPSAwOworCX0KKworCXdoaWxlIChuci0tKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSAqc3JjKys7CisKKwkJaWYgKHRvdGFsKSB7CisJCQlpZiAoIWNlLT5jZV9tb2RlIHx8IGNlLT5jZV9mbGFncyAmIG1hc2spIHsKKwkJCQl1bnNpZ25lZCBwZXJjZW50OworCQkJCWNudCsrOworCQkJCXBlcmNlbnQgPSAoY250ICogMTAwKSAvIHRvdGFsOworCQkJCWlmIChwZXJjZW50ICE9IGxhc3RfcGVyY2VudCB8fAorCQkJCSAgICBwcm9ncmVzc191cGRhdGUpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICIlNHUlJSAoJXUvJXUpIGRvbmVcciIsCisJCQkJCQlwZXJjZW50LCBjbnQsIHRvdGFsKTsKKwkJCQkJbGFzdF9wZXJjZW50ID0gcGVyY2VudDsKKwkJCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFjZS0+Y2VfbW9kZSkgeworCQkJaWYgKHVwZGF0ZSkKKwkJCQl1bmxpbmtfZW50cnkoY2UtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNlLT5jZV9mbGFncyAmIG1hc2spIHsKKwkJCWNlLT5jZV9mbGFncyAmPSB+bWFzazsKKwkJCWlmICh1cGRhdGUpCisJCQkJY2hlY2tvdXRfZW50cnkoY2UsICZzdGF0ZSwgTlVMTCk7CisJCX0KKwl9CisJaWYgKHRvdGFsKSB7CisJCXNpZ25hbChTSUdBTFJNLCBTSUdfSUdOKTsKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX3RyZWVzKG1lcmdlX2ZuX3QgZm4pCit7CisJaW50IGluZHBvcyA9IDA7CisJdW5zaWduZWQgbGVuID0gb2JqZWN0X2xpc3RfbGVuZ3RoKHRyZWVzKTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICoqcG9zbnM7CisJaW50IGk7CisJc3RydWN0IG9iamVjdF9saXN0ICpwb3NuID0gdHJlZXM7CisJbWVyZ2Vfc2l6ZSA9IGxlbjsKKworCWlmIChsZW4pIHsKKwkJcG9zbnMgPSB4bWFsbG9jKGxlbiAqIHNpemVvZihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICopKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlwb3Nuc1tpXSA9IGNyZWF0ZV90cmVlX2VudHJ5X2xpc3QoKHN0cnVjdCB0cmVlICopIHBvc24tPml0ZW0pOworCQkJcG9zbiA9IHBvc24tPm5leHQ7CisJCX0KKwkJaWYgKHVucGFja190cmVlc19yZWMocG9zbnMsIGxlbiwgIiIsIGZuLCAmaW5kcG9zKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodHJpdmlhbF9tZXJnZXNfb25seSAmJiBub250cml2aWFsX21lcmdlKQorCQlkaWUoIk1lcmdlIHJlcXVpcmVzIGZpbGUtbGV2ZWwgbWVyZ2luZyIpOworCisJY2hlY2tfdXBkYXRlcyhhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlzdF90cmVlKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHRyZWUgKnRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KHNoYTEpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIC0xOworCW9iamVjdF9saXN0X2FwcGVuZCgmdHJlZS0+b2JqZWN0LCAmdHJlZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhbWUoc3RydWN0IGNhY2hlX2VudHJ5ICphLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmIpCit7CisJaWYgKCEhYSAhPSAhIWIpCisJCXJldHVybiAwOworCWlmICghYSAmJiAhYikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGEtPmNlX21vZGUgPT0gYi0+Y2VfbW9kZSAmJiAKKwkJIW1lbWNtcChhLT5zaGExLCBiLT5zaGExLCAyMCk7Cit9CisKKworLyoKKyAqIFdoZW4gYSBDRSBnZXRzIHR1cm5lZCBpbnRvIGFuIHVubWVyZ2VkIGVudHJ5LCB3ZQorICogd2FudCBpdCB0byBiZSB1cC10by1kYXRlCisgKi8KK3N0YXRpYyB2b2lkIHZlcmlmeV91cHRvZGF0ZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGluZGV4X29ubHkgfHwgcmVzZXQpCisJCXJldHVybjsKKworCWlmICghbHN0YXQoY2UtPm5hbWUsICZzdCkpIHsKKwkJdW5zaWduZWQgY2hhbmdlZCA9IGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMSk7CisJCWlmICghY2hhbmdlZCkKKwkJCXJldHVybjsKKwkJZXJybm8gPSAwOworCX0KKwlpZiAocmVzZXQpIHsKKwkJY2UtPmNlX2ZsYWdzIHw9IGh0b25zKENFX1VQREFURSk7CisJCXJldHVybjsKKwl9CisJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJcmV0dXJuOworCWRpZSgiRW50cnkgJyVzJyBub3QgdXB0b2RhdGUuIENhbm5vdCBtZXJnZS4iLCBjZS0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVfY2VfcGF0aChzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWlmIChjZSkKKwkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIGNlLT5uYW1lKTsKK30KKworLyoKKyAqIFdlIGRvIG5vdCB3YW50IHRvIHJlbW92ZSBvciBvdmVyd3JpdGUgYSB3b3JraW5nIHRyZWUgZmlsZSB0aGF0CisgKiBpcyBub3QgdHJhY2tlZC4KKyAqLworc3RhdGljIHZvaWQgdmVyaWZ5X2Fic2VudChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphY3Rpb24pCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoaW5kZXhfb25seSB8fCByZXNldCB8fCAhdXBkYXRlKQorCQlyZXR1cm47CisJaWYgKCFsc3RhdChwYXRoLCAmc3QpKQorCQlkaWUoIlVudHJhY2tlZCB3b3JraW5nIHRyZWUgZmlsZSAnJXMnICIKKwkJICAgICJ3b3VsZCBiZSAlcyBieSBtZXJnZS4iLCBwYXRoLCBhY3Rpb24pOworfQorCitzdGF0aWMgaW50IG1lcmdlZF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKm1lcmdlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCkKK3sKKwltZXJnZS0+Y2VfZmxhZ3MgfD0gaHRvbnMoQ0VfVVBEQVRFKTsKKwlpZiAob2xkKSB7CisJCS8qCisJCSAqIFNlZSBpZiB3ZSBjYW4gcmUtdXNlIHRoZSBvbGQgQ0UgZGlyZWN0bHk/CisJCSAqIFRoYXQgd2F5IHdlIGdldCB0aGUgdXB0b2RhdGUgc3RhdCBpbmZvLgorCQkgKgorCQkgKiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgVVBEQVRFIGZsYWcgb24KKwkJICogYSBtYXRjaC4KKwkJICovCisJCWlmIChzYW1lKG9sZCwgbWVyZ2UpKSB7CisJCQkqbWVyZ2UgPSAqb2xkOworCQl9IGVsc2UgeworCQkJdmVyaWZ5X3VwdG9kYXRlKG9sZCk7CisJCQlpbnZhbGlkYXRlX2NlX3BhdGgob2xkKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJdmVyaWZ5X2Fic2VudChtZXJnZS0+bmFtZSwgIm92ZXJ3cml0dGVuIik7CisJCWludmFsaWRhdGVfY2VfcGF0aChtZXJnZSk7CisJfQorCisJbWVyZ2UtPmNlX2ZsYWdzICY9IH5odG9ucyhDRV9TVEFHRU1BU0spOworCWFkZF9jYWNoZV9lbnRyeShtZXJnZSwgQUREX0NBQ0hFX09LX1RPX0FERCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlZF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCkKK3sKKwlpZiAob2xkKQorCQl2ZXJpZnlfdXB0b2RhdGUob2xkKTsKKwllbHNlCisJCXZlcmlmeV9hYnNlbnQoY2UtPm5hbWUsICJyZW1vdmVkIik7CisJY2UtPmNlX21vZGUgPSAwOworCWFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERCk7CisJaW52YWxpZGF0ZV9jZV9wYXRoKGNlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBrZWVwX2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJYWRkX2NhY2hlX2VudHJ5KGNlLCBBRERfQ0FDSEVfT0tfVE9fQUREKTsKKwlyZXR1cm4gMTsKK30KKworI2lmIERCUlRfREVCVUcKK3N0YXRpYyB2b2lkIHNob3dfc3RhZ2VfZW50cnkoRklMRSAqbywKKwkJCSAgICAgY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJaWYgKCFjZSkKKwkJZnByaW50ZihvLCAiJXMgKG1pc3NpbmcpXG4iLCBsYWJlbCk7CisJZWxzZQorCQlmcHJpbnRmKG8sICIlcyUwNm8gJXMgJWRcdCVzXG4iLAorCQkJbGFiZWwsCisJCQludG9obChjZS0+Y2VfbW9kZSksCisJCQlzaGExX3RvX2hleChjZS0+c2hhMSksCisJCQljZV9zdGFnZShjZSksCisJCQljZS0+bmFtZSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB0aHJlZXdheV9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzdGFnZXMpCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICppbmRleDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmhlYWQ7IAorCXN0cnVjdCBjYWNoZV9lbnRyeSAqcmVtb3RlID0gc3RhZ2VzW2hlYWRfaWR4ICsgMV07CisJaW50IGNvdW50OworCWludCBoZWFkX21hdGNoID0gMDsKKwlpbnQgcmVtb3RlX21hdGNoID0gMDsKKwljb25zdCBjaGFyICpwYXRoID0gTlVMTDsKKworCWludCBkZl9jb25mbGljdF9oZWFkID0gMDsKKwlpbnQgZGZfY29uZmxpY3RfcmVtb3RlID0gMDsKKworCWludCBhbnlfYW5jX21pc3NpbmcgPSAwOworCWludCBub19hbmNfZXhpc3RzID0gMTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBoZWFkX2lkeDsgaSsrKSB7CisJCWlmICghc3RhZ2VzW2ldKQorCQkJYW55X2FuY19taXNzaW5nID0gMTsKKwkJZWxzZSB7CisJCQlpZiAoIXBhdGgpCisJCQkJcGF0aCA9IHN0YWdlc1tpXS0+bmFtZTsKKwkJCW5vX2FuY19leGlzdHMgPSAwOworCQl9CisJfQorCisJaW5kZXggPSBzdGFnZXNbMF07CisJaGVhZCA9IHN0YWdlc1toZWFkX2lkeF07CisKKwlpZiAoaGVhZCA9PSAmZGZfY29uZmxpY3RfZW50cnkpIHsKKwkJZGZfY29uZmxpY3RfaGVhZCA9IDE7CisJCWhlYWQgPSBOVUxMOworCX0KKworCWlmIChyZW1vdGUgPT0gJmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCWRmX2NvbmZsaWN0X3JlbW90ZSA9IDE7CisJCXJlbW90ZSA9IE5VTEw7CisJfQorCisJaWYgKCFwYXRoICYmIGluZGV4KQorCQlwYXRoID0gaW5kZXgtPm5hbWU7CisJaWYgKCFwYXRoICYmIGhlYWQpCisJCXBhdGggPSBoZWFkLT5uYW1lOworCWlmICghcGF0aCAmJiByZW1vdGUpCisJCXBhdGggPSByZW1vdGUtPm5hbWU7CisKKwkvKiBGaXJzdCwgaWYgdGhlcmUncyBhICMxNiBzaXR1YXRpb24sIG5vdGUgdGhhdCB0byBwcmV2ZW50ICMxMworCSAqIGFuZCAjMTQuCisJICovCisJaWYgKCFzYW1lKHJlbW90ZSwgaGVhZCkpIHsKKwkJZm9yIChpID0gMTsgaSA8IGhlYWRfaWR4OyBpKyspIHsKKwkJCWlmIChzYW1lKHN0YWdlc1tpXSwgaGVhZCkpIHsKKwkJCQloZWFkX21hdGNoID0gaTsKKwkJCX0KKwkJCWlmIChzYW1lKHN0YWdlc1tpXSwgcmVtb3RlKSkgeworCQkJCXJlbW90ZV9tYXRjaCA9IGk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBXZSBzdGFydCB3aXRoIGNhc2VzIHdoZXJlIHRoZSBpbmRleCBpcyBhbGxvd2VkIHRvIG1hdGNoCisJICogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGhlYWQ6ICMxNChBTFQpIGFuZCAjMkFMVCwgd2hlcmUgaXQKKwkgKiBpcyBwZXJtaXR0ZWQgdG8gbWF0Y2ggdGhlIHJlc3VsdCBpbnN0ZWFkLgorCSAqLworCS8qICMxNCwgIzE0QUxULCAjMkFMVCAqLworCWlmIChyZW1vdGUgJiYgIWRmX2NvbmZsaWN0X2hlYWQgJiYgaGVhZF9tYXRjaCAmJiAhcmVtb3RlX21hdGNoKSB7CisJCWlmIChpbmRleCAmJiAhc2FtZShpbmRleCwgcmVtb3RlKSAmJiAhc2FtZShpbmRleCwgaGVhZCkpCisJCQlyZWplY3RfbWVyZ2UoaW5kZXgpOworCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KHJlbW90ZSwgaW5kZXgpOworCX0KKwkvKgorCSAqIElmIHdlIGhhdmUgYW4gZW50cnkgaW4gdGhlIGluZGV4IGNhY2hlLCB0aGVuIHdlIHdhbnQgdG8KKwkgKiBtYWtlIHN1cmUgdGhhdCBpdCBtYXRjaGVzIGhlYWQuCisJICovCisJaWYgKGluZGV4ICYmICFzYW1lKGluZGV4LCBoZWFkKSkgeworCQlyZWplY3RfbWVyZ2UoaW5kZXgpOworCX0KKworCWlmIChoZWFkKSB7CisJCS8qICM1QUxULCAjMTUgKi8KKwkJaWYgKHNhbWUoaGVhZCwgcmVtb3RlKSkKKwkJCXJldHVybiBtZXJnZWRfZW50cnkoaGVhZCwgaW5kZXgpOworCQkvKiAjMTMsICMzQUxUICovCisJCWlmICghZGZfY29uZmxpY3RfcmVtb3RlICYmIHJlbW90ZV9tYXRjaCAmJiAhaGVhZF9tYXRjaCkKKwkJCXJldHVybiBtZXJnZWRfZW50cnkoaGVhZCwgaW5kZXgpOworCX0KKworCS8qICMxICovCisJaWYgKCFoZWFkICYmICFyZW1vdGUgJiYgYW55X2FuY19taXNzaW5nKQorCQlyZXR1cm4gMDsKKworCS8qIFVuZGVyIHRoZSBuZXcgImFnZ3Jlc3NpdmUiIHJ1bGUsIHdlIHJlc29sdmUgbW9zdGx5IHRyaXZpYWwKKwkgKiBjYXNlcyB0aGF0IHdlIGhpc3RvcmljYWxseSBoYWQgZ2l0LW1lcmdlLW9uZS1maWxlIHJlc29sdmUuCisJICovCisJaWYgKGFnZ3Jlc3NpdmUpIHsKKwkJaW50IGhlYWRfZGVsZXRlZCA9ICFoZWFkICYmICFkZl9jb25mbGljdF9oZWFkOworCQlpbnQgcmVtb3RlX2RlbGV0ZWQgPSAhcmVtb3RlICYmICFkZl9jb25mbGljdF9yZW1vdGU7CisJCS8qCisJCSAqIERlbGV0ZWQgaW4gYm90aC4KKwkJICogRGVsZXRlZCBpbiBvbmUgYW5kIHVuY2hhbmdlZCBpbiB0aGUgb3RoZXIuCisJCSAqLworCQlpZiAoKGhlYWRfZGVsZXRlZCAmJiByZW1vdGVfZGVsZXRlZCkgfHwKKwkJICAgIChoZWFkX2RlbGV0ZWQgJiYgcmVtb3RlICYmIHJlbW90ZV9tYXRjaCkgfHwKKwkJICAgIChyZW1vdGVfZGVsZXRlZCAmJiBoZWFkICYmIGhlYWRfbWF0Y2gpKSB7CisJCQlpZiAoaW5kZXgpCisJCQkJcmV0dXJuIGRlbGV0ZWRfZW50cnkoaW5kZXgsIGluZGV4KTsKKwkJCWVsc2UgaWYgKHBhdGgpCisJCQkJdmVyaWZ5X2Fic2VudChwYXRoLCAicmVtb3ZlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogQWRkZWQgaW4gYm90aCwgaWRlbnRpY2FsbHkuCisJCSAqLworCQlpZiAobm9fYW5jX2V4aXN0cyAmJiBoZWFkICYmIHJlbW90ZSAmJiBzYW1lKGhlYWQsIHJlbW90ZSkpCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGhlYWQsIGluZGV4KTsKKworCX0KKworCS8qIEJlbG93IGFyZSAibm8gbWVyZ2UiIGNhc2VzLCB3aGljaCByZXF1aXJlIHRoYXQgdGhlIGluZGV4IGJlCisJICogdXAtdG8tZGF0ZSB0byBhdm9pZCB0aGUgZmlsZXMgZ2V0dGluZyBvdmVyd3JpdHRlbiB3aXRoCisJICogY29uZmxpY3QgcmVzb2x1dGlvbiBmaWxlcy4gCisJICovCisJaWYgKGluZGV4KSB7CisJCXZlcmlmeV91cHRvZGF0ZShpbmRleCk7CisJfQorCWVsc2UgaWYgKHBhdGgpCisJCXZlcmlmeV9hYnNlbnQocGF0aCwgIm92ZXJ3cml0dGVuIik7CisKKwlub250cml2aWFsX21lcmdlID0gMTsKKworCS8qICMyLCAjMywgIzQsICM2LCAjNywgIzksICMxMS4gKi8KKwljb3VudCA9IDA7CisJaWYgKCFoZWFkX21hdGNoIHx8ICFyZW1vdGVfbWF0Y2gpIHsKKwkJZm9yIChpID0gMTsgaSA8IGhlYWRfaWR4OyBpKyspIHsKKwkJCWlmIChzdGFnZXNbaV0pIHsKKwkJCQlrZWVwX2VudHJ5KHN0YWdlc1tpXSk7CisJCQkJY291bnQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKyNpZiBEQlJUX0RFQlVHCisJZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAicmVhZC10cmVlOiB3YXJuaW5nICMxNiBkZXRlY3RlZFxuIik7CisJCXNob3dfc3RhZ2VfZW50cnkoc3RkZXJyLCAiaGVhZCAgICIsIHN0YWdlc1toZWFkX21hdGNoXSk7CisJCXNob3dfc3RhZ2VfZW50cnkoc3RkZXJyLCAicmVtb3RlICIsIHN0YWdlc1tyZW1vdGVfbWF0Y2hdKTsKKwl9CisjZW5kaWYKKwlpZiAoaGVhZCkgeyBjb3VudCArPSBrZWVwX2VudHJ5KGhlYWQpOyB9CisJaWYgKHJlbW90ZSkgeyBjb3VudCArPSBrZWVwX2VudHJ5KHJlbW90ZSk7IH0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBUd28td2F5IG1lcmdlLgorICoKKyAqIFRoZSBydWxlIGlzIHRvICJjYXJyeSBmb3J3YXJkIiB3aGF0IGlzIGluIHRoZSBpbmRleCB3aXRob3V0IGxvc2luZworICogaW5mb3JtYXRpb24gYWNyb3NzIGEgImZhc3QgZm9yd2FyZCIsIGZhdm9yaW5nIGEgc3VjY2Vzc2Z1bCBtZXJnZQorICogb3ZlciBhIG1lcmdlIGZhaWx1cmUgd2hlbiBpdCBtYWtlcyBzZW5zZS4gIEZvciBkZXRhaWxzIG9mIHRoZQorICogImNhcnJ5IGZvcndhcmQiIHJ1bGUsIHBsZWFzZSBzZWUgPERvY3VtZW50YXRpb24vZ2l0LXJlYWQtdHJlZS50eHQ+LgorICoKKyAqLworc3RhdGljIGludCB0d293YXlfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3JjKQoreworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY3VycmVudCA9IHNyY1swXTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZHRyZWUgPSBzcmNbMV0sICpuZXd0cmVlID0gc3JjWzJdOworCisJaWYgKG1lcmdlX3NpemUgIT0gMikKKwkJcmV0dXJuIGVycm9yKCJDYW5ub3QgZG8gYSB0d293YXkgbWVyZ2Ugb2YgJWQgdHJlZXMiLAorCQkJICAgICBtZXJnZV9zaXplKTsKKworCWlmIChjdXJyZW50KSB7CisJCWlmICgoIW9sZHRyZWUgJiYgIW5ld3RyZWUpIHx8IC8qIDQgYW5kIDUgKi8KKwkJICAgICghb2xkdHJlZSAmJiBuZXd0cmVlICYmCisJCSAgICAgc2FtZShjdXJyZW50LCBuZXd0cmVlKSkgfHwgLyogNiBhbmQgNyAqLworCQkgICAgKG9sZHRyZWUgJiYgbmV3dHJlZSAmJgorCQkgICAgIHNhbWUob2xkdHJlZSwgbmV3dHJlZSkpIHx8IC8qIDE0IGFuZCAxNSAqLworCQkgICAgKG9sZHRyZWUgJiYgbmV3dHJlZSAmJgorCQkgICAgICFzYW1lKG9sZHRyZWUsIG5ld3RyZWUpICYmIC8qIDE4IGFuZCAxOSovCisJCSAgICAgc2FtZShjdXJyZW50LCBuZXd0cmVlKSkpIHsKKwkJCXJldHVybiBrZWVwX2VudHJ5KGN1cnJlbnQpOworCQl9CisJCWVsc2UgaWYgKG9sZHRyZWUgJiYgIW5ld3RyZWUgJiYgc2FtZShjdXJyZW50LCBvbGR0cmVlKSkgeworCQkJLyogMTAgb3IgMTEgKi8KKwkJCXJldHVybiBkZWxldGVkX2VudHJ5KG9sZHRyZWUsIGN1cnJlbnQpOworCQl9CisJCWVsc2UgaWYgKG9sZHRyZWUgJiYgbmV3dHJlZSAmJgorCQkJIHNhbWUoY3VycmVudCwgb2xkdHJlZSkgJiYgIXNhbWUoY3VycmVudCwgbmV3dHJlZSkpIHsKKwkJCS8qIDIwIG9yIDIxICovCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KG5ld3RyZWUsIGN1cnJlbnQpOworCQl9CisJCWVsc2UgeworCQkJLyogYWxsIG90aGVyIGZhaWx1cmVzICovCisJCQlpZiAob2xkdHJlZSkKKwkJCQlyZWplY3RfbWVyZ2Uob2xkdHJlZSk7CisJCQlpZiAoY3VycmVudCkKKwkJCQlyZWplY3RfbWVyZ2UoY3VycmVudCk7CisJCQlpZiAobmV3dHJlZSkKKwkJCQlyZWplY3RfbWVyZ2UobmV3dHJlZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJZWxzZSBpZiAobmV3dHJlZSkKKwkJcmV0dXJuIG1lcmdlZF9lbnRyeShuZXd0cmVlLCBjdXJyZW50KTsKKwllbHNlCisJCXJldHVybiBkZWxldGVkX2VudHJ5KG9sZHRyZWUsIGN1cnJlbnQpOworfQorCisvKgorICogT25lLXdheSBtZXJnZS4KKyAqCisgKiBUaGUgcnVsZSBpczoKKyAqIC0gdGFrZSB0aGUgc3RhdCBpbmZvcm1hdGlvbiBmcm9tIHN0YWdlMCwgdGFrZSB0aGUgZGF0YSBmcm9tIHN0YWdlMQorICovCitzdGF0aWMgaW50IG9uZXdheV9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMpCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQgPSBzcmNbMF07CisJc3RydWN0IGNhY2hlX2VudHJ5ICphID0gc3JjWzFdOworCisJaWYgKG1lcmdlX3NpemUgIT0gMSkKKwkJcmV0dXJuIGVycm9yKCJDYW5ub3QgZG8gYSBvbmV3YXkgbWVyZ2Ugb2YgJWQgdHJlZXMiLAorCQkJICAgICBtZXJnZV9zaXplKTsKKworCWlmICghYSkKKwkJcmV0dXJuIGRlbGV0ZWRfZW50cnkob2xkLCBvbGQpOworCWlmIChvbGQgJiYgc2FtZShvbGQsIGEpKSB7CisJCWlmIChyZXNldCkgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlpZiAobHN0YXQob2xkLT5uYW1lLCAmc3QpIHx8CisJCQkgICAgY2VfbWF0Y2hfc3RhdChvbGQsICZzdCwgMSkpCisJCQkJb2xkLT5jZV9mbGFncyB8PSBodG9ucyhDRV9VUERBVEUpOworCQl9CisJCXJldHVybiBrZWVwX2VudHJ5KG9sZCk7CisJfQorCXJldHVybiBtZXJnZWRfZW50cnkoYSwgb2xkKTsKK30KKworc3RhdGljIGludCByZWFkX2NhY2hlX3VubWVyZ2VkKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGNhY2hlX2VudHJ5ICoqZHN0OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqbGFzdCA9IE5VTEw7CisKKwlyZWFkX2NhY2hlKCk7CisJZHN0ID0gYWN0aXZlX2NhY2hlOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQlpZiAobGFzdCAmJiAhc3RyY21wKGNlLT5uYW1lLCBsYXN0LT5uYW1lKSkKKwkJCQljb250aW51ZTsKKwkJCWludmFsaWRhdGVfY2VfcGF0aChjZSk7CisJCQlsYXN0ID0gY2U7CisJCQljZS0+Y2VfbW9kZSA9IDA7CisJCQljZS0+Y2VfZmxhZ3MgJj0gfmh0b25zKENFX1NUQUdFTUFTSyk7CisJCX0KKwkJKmRzdCsrID0gY2U7CisJfQorCWFjdGl2ZV9uciA9IGRzdCAtIGFjdGl2ZV9jYWNoZTsKKwlyZXR1cm4gISFsYXN0OworfQorCitzdGF0aWMgdm9pZCBwcmltZV9jYWNoZV90cmVlX3JlYyhzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsIHN0cnVjdCB0cmVlICp0cmVlKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlpbnQgY250OworCisJbWVtY3B5KGl0LT5zaGExLCB0cmVlLT5vYmplY3Quc2hhMSwgMjApOworCWRlc2MuYnVmID0gdHJlZS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IHRyZWUtPnNpemU7CisJY250ID0gMDsKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoIVNfSVNESVIoZW50cnkubW9kZSkpCisJCQljbnQrKzsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnN1YjsKKwkJCXN0cnVjdCB0cmVlICpzdWJ0cmVlID0gbG9va3VwX3RyZWUoZW50cnkuc2hhMSk7CisJCQlpZiAoIXN1YnRyZWUtPm9iamVjdC5wYXJzZWQpCisJCQkJcGFyc2VfdHJlZShzdWJ0cmVlKTsKKwkJCXN1YiA9IGNhY2hlX3RyZWVfc3ViKGl0LCBlbnRyeS5wYXRoKTsKKwkJCXN1Yi0+Y2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKwkJCXByaW1lX2NhY2hlX3RyZWVfcmVjKHN1Yi0+Y2FjaGVfdHJlZSwgc3VidHJlZSk7CisJCQljbnQgKz0gc3ViLT5jYWNoZV90cmVlLT5lbnRyeV9jb3VudDsKKwkJfQorCX0KKwlpdC0+ZW50cnlfY291bnQgPSBjbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW1lX2NhY2hlX3RyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgdHJlZSAqdHJlZSA9IChzdHJ1Y3QgdHJlZSAqKXRyZWVzLT5pdGVtOworCWlmICghdHJlZSkKKwkJcmV0dXJuOworCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCXByaW1lX2NhY2hlX3RyZWVfcmVjKGFjdGl2ZV9jYWNoZV90cmVlLCB0cmVlKTsKKworfQorCitzdGF0aWMgY29uc3QgY2hhciByZWFkX3RyZWVfdXNhZ2VbXSA9ICJnaXQtcmVhZC10cmVlICg8c2hhPiB8IC1tIFstLWFnZ3Jlc3NpdmVdIFstdSB8IC1pXSA8c2hhMT4gWzxzaGEyPiBbPHNoYTM+XV0pIjsKKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitpbnQgY21kX3JlYWRfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWludCBpLCBuZXdmZCwgc3RhZ2UgPSAwOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJbWVyZ2VfZm5fdCBmbiA9IE5VTEw7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJbmV3ZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZsb2NrX2ZpbGUsIGdldF9pbmRleF9maWxlKCkpOworCWlmIChuZXdmZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSBuZXcgaW5kZXggZmlsZSIpOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJbWVyZ2UgPSAwOworCXJlc2V0ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJLyogIi11IiBtZWFucyAidXBkYXRlIiwgbWVhbmluZyB0aGF0IGEgbWVyZ2Ugd2lsbCB1cGRhdGUKKwkJICogdGhlIHdvcmtpbmcgdHJlZS4KKwkJICovCisJCWlmICghc3RyY21wKGFyZywgIi11IikpIHsKKwkJCXVwZGF0ZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKGFyZywgIi12IikpIHsKKwkJCXZlcmJvc2VfdXBkYXRlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogIi1pIiBtZWFucyAiaW5kZXggb25seSIsIG1lYW5pbmcgdGhhdCBhIG1lcmdlIHdpbGwKKwkJICogbm90IGV2ZW4gbG9vayBhdCB0aGUgd29ya2luZyB0cmVlLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWkiKSkgeworCQkJaW5kZXhfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoaXMgZGlmZmVycyBmcm9tICItbSIgaW4gdGhhdCB3ZSdsbCBzaWxlbnRseSBpZ25vcmUKKwkJICogdW5tZXJnZWQgZW50cmllcyBhbmQgb3ZlcndyaXRlIHdvcmtpbmcgdHJlZSBmaWxlcyB0aGF0CisJCSAqIGNvcnJlc3BvbmQgdG8gdGhlbS4KKwkJICovCisJCWlmICghc3RyY21wKGFyZywgIi0tcmVzZXQiKSkgeworCQkJaWYgKHN0YWdlIHx8IG1lcmdlKQorCQkJCXVzYWdlKHJlYWRfdHJlZV91c2FnZSk7CisJCQlyZXNldCA9IDE7CisJCQltZXJnZSA9IDE7CisJCQlzdGFnZSA9IDE7CisJCQlyZWFkX2NhY2hlX3VubWVyZ2VkKCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKGFyZywgIi0tdHJpdmlhbCIpKSB7CisJCQl0cml2aWFsX21lcmdlc19vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hZ2dyZXNzaXZlIikpIHsKKwkJCWFnZ3Jlc3NpdmUgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKiAiLW0iIHN0YW5kcyBmb3IgIm1lcmdlIiwgbWVhbmluZyB3ZSBzdGFydCBpbiBzdGFnZSAxICovCisJCWlmICghc3RyY21wKGFyZywgIi1tIikpIHsKKwkJCWlmIChzdGFnZSB8fCBtZXJnZSkKKwkJCQl1c2FnZShyZWFkX3RyZWVfdXNhZ2UpOworCQkJaWYgKHJlYWRfY2FjaGVfdW5tZXJnZWQoKSkKKwkJCQlkaWUoInlvdSBuZWVkIHRvIHJlc29sdmUgeW91ciBjdXJyZW50IGluZGV4IGZpcnN0Iik7CisJCQlzdGFnZSA9IDE7CisJCQltZXJnZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHVzaW5nIC11IGFuZCAtaSBhdCB0aGUgc2FtZSB0aW1lIG1ha2VzIG5vIHNlbnNlICovCisJCWlmICgxIDwgaW5kZXhfb25seSArIHVwZGF0ZSkKKwkJCXVzYWdlKHJlYWRfdHJlZV91c2FnZSk7CisKKwkJaWYgKGdldF9zaGExKGFyZywgc2hhMSkpCisJCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJnKTsKKwkJaWYgKGxpc3RfdHJlZShzaGExKSA8IDApCisJCQlkaWUoImZhaWxlZCB0byB1bnBhY2sgdHJlZSBvYmplY3QgJXMiLCBhcmcpOworCQlzdGFnZSsrOworCX0KKwlpZiAoKHVwZGF0ZXx8aW5kZXhfb25seSkgJiYgIW1lcmdlKQorCQl1c2FnZShyZWFkX3RyZWVfdXNhZ2UpOworCisJaWYgKG1lcmdlKSB7CisJCWlmIChzdGFnZSA8IDIpCisJCQlkaWUoImp1c3QgaG93IGRvIHlvdSBleHBlY3QgbWUgdG8gbWVyZ2UgJWQgdHJlZXM/Iiwgc3RhZ2UtMSk7CisJCXN3aXRjaCAoc3RhZ2UgLSAxKSB7CisJCWNhc2UgMToKKwkJCWZuID0gb25ld2F5X21lcmdlOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWZuID0gdHdvd2F5X21lcmdlOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJZGVmYXVsdDoKKwkJCWZuID0gdGhyZWV3YXlfbWVyZ2U7CisJCQljYWNoZV90cmVlX2ZyZWUoJmFjdGl2ZV9jYWNoZV90cmVlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YWdlIC0gMSA+PSAzKQorCQkJaGVhZF9pZHggPSBzdGFnZSAtIDI7CisJCWVsc2UKKwkJCWhlYWRfaWR4ID0gMTsKKwl9CisKKwl1bnBhY2tfdHJlZXMoZm4pOworCisJLyoKKwkgKiBXaGVuIHJlYWRpbmcgb25seSBvbmUgdHJlZSAoZWl0aGVyIHRoZSBtb3N0IGJhc2ljIGZvcm0sCisJICogIi1tIGVudCIgb3IgIi0tcmVzZXQgZW50IiBmb3JtKSwgd2UgY2FuIG9idGFpbiBhIGZ1bGx5CisJICogdmFsaWQgY2FjaGUtdHJlZSBiZWNhdXNlIHRoZSBpbmRleCBtdXN0IG1hdGNoIGV4YWN0bHkKKwkgKiB3aGF0IGNhbWUgZnJvbSB0aGUgdHJlZS4KKwkgKi8KKwlpZiAodHJlZXMgJiYgdHJlZXMtPml0ZW0gJiYgKCFtZXJnZSB8fCAoc3RhZ2UgPT0gMikpKSB7CisJCWNhY2hlX3RyZWVfZnJlZSgmYWN0aXZlX2NhY2hlX3RyZWUpOworCQlwcmltZV9jYWNoZV90cmVlKCk7CisJfQorCisJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgY29tbWl0X2xvY2tfZmlsZSgmbG9ja19maWxlKSkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcmV2LWxpc3QuYyBiL2J1aWx0aW4tcmV2LWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg1NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZXYtbGlzdC5jCkBAIC0wLDAgKzEsMzYyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKy8qIGJpdHMgIzAtMTUgaW4gcmV2aXNpb24uaCAqLworCisjZGVmaW5lIENPVU5URUQJCSgxdTw8MTYpCisKK3N0YXRpYyBjb25zdCBjaGFyIHJldl9saXN0X3VzYWdlW10gPQorImdpdC1yZXYtbGlzdCBbT1BUSU9OXSA8Y29tbWl0LWlkPi4uLiBbIC0tIHBhdGhzLi4uIF1cbiIKKyIgIGxpbWl0aW5nIG91dHB1dDpcbiIKKyIgICAgLS1tYXgtY291bnQ9bnJcbiIKKyIgICAgLS1tYXgtYWdlPWVwb2NoXG4iCisiICAgIC0tbWluLWFnZT1lcG9jaFxuIgorIiAgICAtLXNwYXJzZVxuIgorIiAgICAtLW5vLW1lcmdlc1xuIgorIiAgICAtLXJlbW92ZS1lbXB0eVxuIgorIiAgICAtLWFsbFxuIgorIiAgb3JkZXJpbmcgb3V0cHV0OlxuIgorIiAgICAtLXRvcG8tb3JkZXJcbiIKKyIgICAgLS1kYXRlLW9yZGVyXG4iCisiICBmb3JtYXR0aW5nIG91dHB1dDpcbiIKKyIgICAgLS1wYXJlbnRzXG4iCisiICAgIC0tb2JqZWN0cyB8IC0tb2JqZWN0cy1lZGdlXG4iCisiICAgIC0tdW5wYWNrZWRcbiIKKyIgICAgLS1oZWFkZXIgfCAtLXByZXR0eVxuIgorIiAgICAtLWFiYnJldj1uciB8IC0tbm8tYWJicmV2XG4iCisiICAgIC0tYWJicmV2LWNvbW1pdFxuIgorIiAgc3BlY2lhbCBwdXJwb3NlOlxuIgorIiAgICAtLWJpc2VjdCIKKzsKKworc3RhdGljIHN0cnVjdCByZXZfaW5mbyByZXZzOworCitzdGF0aWMgaW50IGJpc2VjdF9saXN0ID0gMDsKK3N0YXRpYyBpbnQgc2hvd190aW1lc3RhbXAgPSAwOworc3RhdGljIGludCBoZHJfdGVybWluYXRpb24gPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKmhlYWRlcl9wcmVmaXg7CisKK3N0YXRpYyB2b2lkIHNob3dfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlpZiAoc2hvd190aW1lc3RhbXApCisJCXByaW50ZigiJWx1ICIsIGNvbW1pdC0+ZGF0ZSk7CisJaWYgKGhlYWRlcl9wcmVmaXgpCisJCWZwdXRzKGhlYWRlcl9wcmVmaXgsIHN0ZG91dCk7CisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQk9VTkRBUlkpCisJCXB1dGNoYXIoJy0nKTsKKwlpZiAocmV2cy5hYmJyZXZfY29tbWl0ICYmIHJldnMuYWJicmV2KQorCQlmcHV0cyhmaW5kX3VuaXF1ZV9hYmJyZXYoY29tbWl0LT5vYmplY3Quc2hhMSwgcmV2cy5hYmJyZXYpLAorCQkgICAgICBzdGRvdXQpOworCWVsc2UKKwkJZnB1dHMoc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSksIHN0ZG91dCk7CisJaWYgKHJldnMucGFyZW50cykgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvID0gJihwYXJlbnRzLT5pdGVtLT5vYmplY3QpOworCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCQlpZiAoby0+ZmxhZ3MgJiBUTVBfTUFSSykKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiICVzIiwgc2hhMV90b19oZXgoby0+c2hhMSkpOworCQkJby0+ZmxhZ3MgfD0gVE1QX01BUks7CisJCX0KKwkJLyogVE1QX01BUksgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZmxhZyB0aGF0IGNhbgorCQkgKiBiZSB1c2VkIGxvY2FsbHksIGJ1dCB0aGUgdXNlciBzaG91bGQgY2xlYW4KKwkJICogdGhpbmdzIHVwIGFmdGVyIGl0IGlzIGRvbmUgd2l0aCB0aGVtLgorCQkgKi8KKwkJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQkgICAgIHBhcmVudHM7CisJCSAgICAgcGFyZW50cyA9IHBhcmVudHMtPm5leHQpCisJCQlwYXJlbnRzLT5pdGVtLT5vYmplY3QuZmxhZ3MgJj0gflRNUF9NQVJLOworCX0KKwlpZiAocmV2cy5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCXB1dGNoYXIoJyAnKTsKKwllbHNlCisJCXB1dGNoYXIoJ1xuJyk7CisKKwlpZiAocmV2cy52ZXJib3NlX2hlYWRlcikgeworCQlzdGF0aWMgY2hhciBwcmV0dHlfaGVhZGVyWzE2Mzg0XTsKKwkJcHJldHR5X3ByaW50X2NvbW1pdChyZXZzLmNvbW1pdF9mb3JtYXQsIGNvbW1pdCwgfjAsCisJCQkJICAgIHByZXR0eV9oZWFkZXIsIHNpemVvZihwcmV0dHlfaGVhZGVyKSwKKwkJCQkgICAgcmV2cy5hYmJyZXYsIE5VTEwsIE5VTEwpOworCQlwcmludGYoIiVzJWMiLCBwcmV0dHlfaGVhZGVyLCBoZHJfdGVybWluYXRpb24pOworCX0KKwlmZmx1c2goc3Rkb3V0KTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKnByb2Nlc3NfYmxvYihzdHJ1Y3QgYmxvYiAqYmxvYiwKKwkJCQkJIHN0cnVjdCBvYmplY3RfbGlzdCAqKnAsCisJCQkJCSBzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmYmxvYi0+b2JqZWN0OworCisJaWYgKCFyZXZzLmJsb2Jfb2JqZWN0cykKKwkJcmV0dXJuIHA7CisJaWYgKG9iai0+ZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IFNFRU4pKQorCQlyZXR1cm4gcDsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJbmFtZSA9IHN0cmR1cChuYW1lKTsKKwlyZXR1cm4gYWRkX29iamVjdChvYmosIHAsIHBhdGgsIG5hbWUpOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICoqcHJvY2Vzc190cmVlKHN0cnVjdCB0cmVlICp0cmVlLAorCQkJCQkgc3RydWN0IG9iamVjdF9saXN0ICoqcCwKKwkJCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0cmVlLT5vYmplY3Q7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXN0cnVjdCBuYW1lX3BhdGggbWU7CisKKwlpZiAoIXJldnMudHJlZV9vYmplY3RzKQorCQlyZXR1cm4gcDsKKwlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCXJldHVybiBwOworCWlmIChwYXJzZV90cmVlKHRyZWUpIDwgMCkKKwkJZGllKCJiYWQgdHJlZSBvYmplY3QgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJbmFtZSA9IHN0cmR1cChuYW1lKTsKKwlwID0gYWRkX29iamVjdChvYmosIHAsIHBhdGgsIG5hbWUpOworCW1lLnVwID0gcGF0aDsKKwltZS5lbGVtID0gbmFtZTsKKwltZS5lbGVtX2xlbiA9IHN0cmxlbihuYW1lKTsKKworCWRlc2MuYnVmID0gdHJlZS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IHRyZWUtPnNpemU7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCXAgPSBwcm9jZXNzX3RyZWUobG9va3VwX3RyZWUoZW50cnkuc2hhMSksIHAsICZtZSwgZW50cnkucGF0aCk7CisJCWVsc2UKKwkJCXAgPSBwcm9jZXNzX2Jsb2IobG9va3VwX2Jsb2IoZW50cnkuc2hhMSksIHAsICZtZSwgZW50cnkucGF0aCk7CisJfQorCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2NvbW1pdF9saXN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IG9iamVjdF9saXN0ICpvYmplY3RzID0gTlVMTCwgKipwID0gJm9iamVjdHMsICpwZW5kaW5nOworCisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2cykpICE9IE5VTEwpIHsKKwkJcCA9IHByb2Nlc3NfdHJlZShjb21taXQtPnRyZWUsIHAsIE5VTEwsICIiKTsKKwkJc2hvd19jb21taXQoY29tbWl0KTsKKwl9CisJZm9yIChwZW5kaW5nID0gcmV2cy0+cGVuZGluZ19vYmplY3RzOyBwZW5kaW5nOyBwZW5kaW5nID0gcGVuZGluZy0+bmV4dCkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwZW5kaW5nLT5pdGVtOworCQljb25zdCBjaGFyICpuYW1lID0gcGVuZGluZy0+bmFtZTsKKwkJaWYgKG9iai0+ZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IFNFRU4pKQorCQkJY29udGludWU7CisJCWlmIChvYmotPnR5cGUgPT0gdGFnX3R5cGUpIHsKKwkJCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKwkJCXAgPSBhZGRfb2JqZWN0KG9iaiwgcCwgTlVMTCwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2JqLT50eXBlID09IHRyZWVfdHlwZSkgeworCQkJcCA9IHByb2Nlc3NfdHJlZSgoc3RydWN0IHRyZWUgKilvYmosIHAsIE5VTEwsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBibG9iX3R5cGUpIHsKKwkJCXAgPSBwcm9jZXNzX2Jsb2IoKHN0cnVjdCBibG9iICopb2JqLCBwLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgidW5rbm93biBwZW5kaW5nIG9iamVjdCAlcyAoJXMpIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSwgbmFtZSk7CisJfQorCXdoaWxlIChvYmplY3RzKSB7CisJCS8qIEFuIG9iamVjdCB3aXRoIG5hbWUgImZvb1xuMDAwMDAwMC4uLiIgY2FuIGJlIHVzZWQgdG8KKwkJICogY29uZnVzZSBkb3duc3RyZWFtIGdpdC1wYWNrLW9iamVjdHMgdmVyeSBiYWRseS4KKwkJICovCisJCWNvbnN0IGNoYXIgKmVwID0gc3RyY2hyKG9iamVjdHMtPm5hbWUsICdcbicpOworCQlpZiAoZXApIHsKKwkJCXByaW50ZigiJXMgJS4qc1xuIiwgc2hhMV90b19oZXgob2JqZWN0cy0+aXRlbS0+c2hhMSksCisJCQkgICAgICAgKGludCkgKGVwIC0gb2JqZWN0cy0+bmFtZSksCisJCQkgICAgICAgb2JqZWN0cy0+bmFtZSk7CisJCX0KKwkJZWxzZQorCQkJcHJpbnRmKCIlcyAlc1xuIiwgc2hhMV90b19oZXgob2JqZWN0cy0+aXRlbS0+c2hhMSksIG9iamVjdHMtPm5hbWUpOworCQlvYmplY3RzID0gb2JqZWN0cy0+bmV4dDsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgdHJ1bHkgc3R1cGlkIGFsZ29yaXRobSwgYnV0IGl0J3Mgb25seQorICogdXNlZCBmb3IgYmlzZWN0aW9uLCBhbmQgd2UganVzdCBkb24ndCBjYXJlIGVub3VnaC4KKyAqCisgKiBXZSBjYXJlIGp1c3QgYmFyZWx5IGVub3VnaCB0byBhdm9pZCByZWN1cnNpbmcgZm9yCisgKiBub24tbWVyZ2UgZW50cmllcy4KKyAqLworc3RhdGljIGludCBjb3VudF9kaXN0YW5jZShzdHJ1Y3QgY29tbWl0X2xpc3QgKmVudHJ5KQoreworCWludCBuciA9IDA7CisKKwl3aGlsZSAoZW50cnkpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gZW50cnktPml0ZW07CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IENPVU5URUQpKQorCQkJYnJlYWs7CisJCWlmICghcmV2cy5wcnVuZV9mbiB8fCAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBUUkVFQ0hBTkdFKSkKKwkJCW5yKys7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IENPVU5URUQ7CisJCXAgPSBjb21taXQtPnBhcmVudHM7CisJCWVudHJ5ID0gcDsKKwkJaWYgKHApIHsKKwkJCXAgPSBwLT5uZXh0OworCQkJd2hpbGUgKHApIHsKKwkJCQluciArPSBjb3VudF9kaXN0YW5jZShwKTsKKwkJCQlwID0gcC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBucjsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZGlzdGFuY2Uoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzICY9IH5DT1VOVEVEOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKmZpbmRfYmlzZWN0aW9uKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwlpbnQgbnIsIGNsb3Nlc3Q7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwLCAqYmVzdDsKKworCW5yID0gMDsKKwlwID0gbGlzdDsKKwl3aGlsZSAocCkgeworCQlpZiAoIXJldnMucHJ1bmVfZm4gfHwgKHAtPml0ZW0tPm9iamVjdC5mbGFncyAmIFRSRUVDSEFOR0UpKQorCQkJbnIrKzsKKwkJcCA9IHAtPm5leHQ7CisJfQorCWNsb3Nlc3QgPSAwOworCWJlc3QgPSBsaXN0OworCisJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaW50IGRpc3RhbmNlOworCisJCWlmIChyZXZzLnBydW5lX2ZuICYmICEocC0+aXRlbS0+b2JqZWN0LmZsYWdzICYgVFJFRUNIQU5HRSkpCisJCQljb250aW51ZTsKKworCQlkaXN0YW5jZSA9IGNvdW50X2Rpc3RhbmNlKHApOworCQljbGVhcl9kaXN0YW5jZShsaXN0KTsKKwkJaWYgKG5yIC0gZGlzdGFuY2UgPCBkaXN0YW5jZSkKKwkJCWRpc3RhbmNlID0gbnIgLSBkaXN0YW5jZTsKKwkJaWYgKGRpc3RhbmNlID4gY2xvc2VzdCkgeworCQkJYmVzdCA9IHA7CisJCQljbG9zZXN0ID0gZGlzdGFuY2U7CisJCX0KKwl9CisJaWYgKGJlc3QpCisJCWJlc3QtPm5leHQgPSBOVUxMOworCXJldHVybiBiZXN0OworfQorCitzdGF0aWMgdm9pZCBtYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7IHBhcmVudHM7IHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisJCWlmICghKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQljb250aW51ZTsKKwkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcocGFyZW50LT50cmVlKTsKKwkJaWYgKHJldnMuZWRnZV9oaW50ICYmICEocGFyZW50LT5vYmplY3QuZmxhZ3MgJiBTSE9XTikpIHsKKwkJCXBhcmVudC0+b2JqZWN0LmZsYWdzIHw9IFNIT1dOOworCQkJcHJpbnRmKCItJXNcbiIsIHNoYTFfdG9faGV4KHBhcmVudC0+b2JqZWN0LnNoYTEpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbWFya19lZGdlc191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwlmb3IgKCA7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcoY29tbWl0LT50cmVlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1hcmtfZWRnZV9wYXJlbnRzX3VuaW50ZXJlc3RpbmcoY29tbWl0KTsKKwl9Cit9CisKK2ludCBjbWRfcmV2X2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3Q7CisJaW50IGk7CisKKwlpbml0X3JldmlzaW9ucygmcmV2cyk7CisJcmV2cy5hYmJyZXYgPSAwOworCXJldnMuY29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX1VOU1BFQ0lGSUVEOworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgJnJldnMsIE5VTEwpOworCisJZm9yIChpID0gMSA7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLWhlYWRlciIpKSB7CisJCQlyZXZzLnZlcmJvc2VfaGVhZGVyID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGltZXN0YW1wIikpIHsKKwkJCXNob3dfdGltZXN0YW1wID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYmlzZWN0IikpIHsKKwkJCWJpc2VjdF9saXN0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKHJldl9saXN0X3VzYWdlKTsKKworCX0KKwlpZiAocmV2cy5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX1VOU1BFQ0lGSUVEKSB7CisJCS8qIFRoZSBjb21tYW5kIGxpbmUgaGFzIGEgLS1wcmV0dHkgICovCisJCWhkcl90ZXJtaW5hdGlvbiA9ICdcbic7CisJCWlmIChyZXZzLmNvbW1pdF9mb3JtYXQgPT0gQ01JVF9GTVRfT05FTElORSkKKwkJCWhlYWRlcl9wcmVmaXggPSAiIjsKKwkJZWxzZQorCQkJaGVhZGVyX3ByZWZpeCA9ICJjb21taXQgIjsKKwl9CisJZWxzZSBpZiAocmV2cy52ZXJib3NlX2hlYWRlcikKKwkJLyogT25seSAtLWhlYWRlciB3YXMgc3BlY2lmaWVkICovCisJCXJldnMuY29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX1JBVzsKKworCWxpc3QgPSByZXZzLmNvbW1pdHM7CisKKwlpZiAoKCFsaXN0ICYmCisJICAgICAoIShyZXZzLnRhZ19vYmplY3RzfHxyZXZzLnRyZWVfb2JqZWN0c3x8cmV2cy5ibG9iX29iamVjdHMpICYmCisJICAgICAgIXJldnMucGVuZGluZ19vYmplY3RzKSkgfHwKKwkgICAgcmV2cy5kaWZmKQorCQl1c2FnZShyZXZfbGlzdF91c2FnZSk7CisKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSByZXZzLnZlcmJvc2VfaGVhZGVyOworCXRyYWNrX29iamVjdF9yZWZzID0gMDsKKwlpZiAoYmlzZWN0X2xpc3QpCisJCXJldnMubGltaXRlZCA9IDE7CisKKwlwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldnMpOworCWlmIChyZXZzLnRyZWVfb2JqZWN0cykKKwkJbWFya19lZGdlc191bmludGVyZXN0aW5nKHJldnMuY29tbWl0cyk7CisKKwlpZiAoYmlzZWN0X2xpc3QpCisJCXJldnMuY29tbWl0cyA9IGZpbmRfYmlzZWN0aW9uKHJldnMuY29tbWl0cyk7CisKKwlzaG93X2NvbW1pdF9saXN0KCZyZXZzKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1yZXYtcGFyc2UuYyBiL2J1aWx0aW4tcmV2LXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3YTZkMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcmV2LXBhcnNlLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiByZXYtcGFyc2UuYworICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjZGVmaW5lIERPX1JFVlMJCTEKKyNkZWZpbmUgRE9fTk9SRVYJMgorI2RlZmluZSBET19GTEFHUwk0CisjZGVmaW5lIERPX05PTkZMQUdTCTgKK3N0YXRpYyBpbnQgZmlsdGVyID0gfjA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZWYgPSBOVUxMOworCisjZGVmaW5lIE5PUk1BTCAwCisjZGVmaW5lIFJFVkVSU0VEIDEKK3N0YXRpYyBpbnQgc2hvd190eXBlID0gTk9STUFMOworc3RhdGljIGludCBzeW1ib2xpYyA9IDA7CitzdGF0aWMgaW50IGFiYnJldiA9IDA7CitzdGF0aWMgaW50IG91dHB1dF9zcSA9IDA7CisKK3N0YXRpYyBpbnQgcmV2c19jb3VudCA9IDA7CisKKy8qCisgKiBTb21lIGFyZ3VtZW50cyBhcmUgcmVsZXZhbnQgInJldmlzaW9uIiBhcmd1bWVudHMsCisgKiBvdGhlcnMgYXJlIGFib3V0IG91dHB1dCBmb3JtYXQgb3Igb3RoZXIgZGV0YWlscy4KKyAqIFRoaXMgc29ydHMgaXQgYWxsIG91dC4KKyAqLworc3RhdGljIGludCBpc19yZXZfYXJndW1lbnQoY29uc3QgY2hhciAqYXJnKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpyZXZfYXJnc1tdID0geworCQkiLS1hbGwiLAorCQkiLS1iaXNlY3QiLAorCQkiLS1kZW5zZSIsCisJCSItLWJyYW5jaGVzIiwKKwkJIi0taGVhZGVyIiwKKwkJIi0tbWF4LWFnZT0iLAorCQkiLS1tYXgtY291bnQ9IiwKKwkJIi0tbWluLWFnZT0iLAorCQkiLS1uby1tZXJnZXMiLAorCQkiLS1vYmplY3RzIiwKKwkJIi0tb2JqZWN0cy1lZGdlIiwKKwkJIi0tcGFyZW50cyIsCisJCSItLXByZXR0eSIsCisJCSItLXJlbW90ZXMiLAorCQkiLS1zcGFyc2UiLAorCQkiLS10YWdzIiwKKwkJIi0tdG9wby1vcmRlciIsCisJCSItLWRhdGUtb3JkZXIiLAorCQkiLS11bnBhY2tlZCIsCisJCU5VTEwKKwl9OworCWNvbnN0IGNoYXIgKipwID0gcmV2X2FyZ3M7CisKKwkvKiBhY2NlcHQgLTxkaWdpdD4sIGxpa2UgdHJhZGl0aW9uYWwgImhlYWQiICovCisJaWYgKCgqYXJnID09ICctJykgJiYgaXNkaWdpdChhcmdbMV0pKQorCQlyZXR1cm4gMTsKKworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqc3RyID0gKnArKzsKKwkJaW50IGxlbjsKKwkJaWYgKCFzdHIpCisJCQlyZXR1cm4gMDsKKwkJbGVuID0gc3RybGVuKHN0cik7CisJCWlmICghc3RyY21wKGFyZywgc3RyKSB8fAorCQkgICAgKHN0cltsZW4tMV0gPT0gJz0nICYmICFzdHJuY21wKGFyZywgc3RyLCBsZW4pKSkKKwkJCXJldHVybiAxOworCX0KK30KKworLyogT3V0cHV0IGFyZ3VtZW50IGFzIGEgc3RyaW5nLCBlaXRoZXIgU1Egb3Igbm9ybWFsICovCitzdGF0aWMgdm9pZCBzaG93KGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpZiAob3V0cHV0X3NxKSB7CisJCWludCBzcSA9ICdcJycsIGNoOworCisJCXB1dGNoYXIoc3EpOworCQl3aGlsZSAoKGNoID0gKmFyZysrKSkgeworCQkJaWYgKGNoID09IHNxKQorCQkJCWZwdXRzKCInXFwnIiwgc3Rkb3V0KTsKKwkJCXB1dGNoYXIoY2gpOworCQl9CisJCXB1dGNoYXIoc3EpOworCQlwdXRjaGFyKCcgJyk7CisJfQorCWVsc2UKKwkJcHV0cyhhcmcpOworfQorCisvKiBPdXRwdXQgYSByZXZpc2lvbiwgb25seSBpZiBmaWx0ZXIgYWxsb3dzIGl0ICovCitzdGF0aWMgdm9pZCBzaG93X3JldihpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIShmaWx0ZXIgJiBET19SRVZTKSkKKwkJcmV0dXJuOworCWRlZiA9IE5VTEw7CisJcmV2c19jb3VudCsrOworCisJaWYgKHR5cGUgIT0gc2hvd190eXBlKQorCQlwdXRjaGFyKCdeJyk7CisJaWYgKHN5bWJvbGljICYmIG5hbWUpCisJCXNob3cobmFtZSk7CisJZWxzZSBpZiAoYWJicmV2KQorCQlzaG93KGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBhYmJyZXYpKTsKKwllbHNlCisJCXNob3coc2hhMV90b19oZXgoc2hhMSkpOworfQorCisvKiBPdXRwdXQgYSBmbGFnLCBvbmx5IGlmIGZpbHRlciBhbGxvd3MgaXQuICovCitzdGF0aWMgaW50IHNob3dfZmxhZyhjb25zdCBjaGFyICphcmcpCit7CisJaWYgKCEoZmlsdGVyICYgRE9fRkxBR1MpKQorCQlyZXR1cm4gMDsKKwlpZiAoZmlsdGVyICYgKGlzX3Jldl9hcmd1bWVudChhcmcpID8gRE9fUkVWUyA6IERPX05PUkVWKSkgeworCQlzaG93KGFyZyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19kZWZhdWx0KHZvaWQpCit7CisJY29uc3QgY2hhciAqcyA9IGRlZjsKKworCWlmIChzKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwkJZGVmID0gTlVMTDsKKwkJaWYgKCFnZXRfc2hhMShzLCBzaGExKSkgeworCQkJc2hvd19yZXYoTk9STUFMLCBzaGExLCBzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzaG93X3JlZmVyZW5jZShjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXNob3dfcmV2KE5PUk1BTCwgc2hhMSwgcmVmbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZGF0ZXN0cmluZyhjb25zdCBjaGFyICpmbGFnLCBjb25zdCBjaGFyICpkYXRlc3RyKQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDBdOworCisJLyogZGF0ZSBoYW5kbGluZyByZXF1aXJlcyBib3RoIGZsYWdzIGFuZCByZXZzICovCisJaWYgKChmaWx0ZXIgJiAoRE9fRkxBR1MgfCBET19SRVZTKSkgIT0gKERPX0ZMQUdTIHwgRE9fUkVWUykpCisJCXJldHVybjsKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMlbHUiLCBmbGFnLCBhcHByb3hpZGF0ZShkYXRlc3RyKSk7CisJc2hvdyhidWZmZXIpOworfQorCitzdGF0aWMgaW50IHNob3dfZmlsZShjb25zdCBjaGFyICphcmcpCit7CisJc2hvd19kZWZhdWx0KCk7CisJaWYgKChmaWx0ZXIgJiAoRE9fTk9ORkxBR1N8RE9fTk9SRVYpKSA9PSAoRE9fTk9ORkxBR1N8RE9fTk9SRVYpKSB7CisJCXNob3coYXJnKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY21kX3Jldl9wYXJzZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWludCBpLCBhc19pcyA9IDAsIHZlcmlmeSA9IDA7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljb25zdCBjaGFyICpwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWNoYXIgKmRvdGRvdDsKKworCQlpZiAoYXNfaXMpIHsKKwkJCWlmIChzaG93X2ZpbGUoYXJnKSAmJiBhc19pcyA8IDIpCisJCQkJdmVyaWZ5X2ZpbGVuYW1lKHByZWZpeCwgYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywiLW4iKSkgeworCQkJaWYgKCsraSA+PSBhcmdjKQorCQkJCWRpZSgiLW4gcmVxdWlyZXMgYW4gYXJndW1lbnQiKTsKKwkJCWlmICgoZmlsdGVyICYgRE9fRkxBR1MpICYmIChmaWx0ZXIgJiBET19SRVZTKSkgeworCQkJCXNob3coYXJnKTsKKwkJCQlzaG93KGFyZ3ZbaV0pOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywiLW4iLDIpKSB7CisJCQlpZiAoKGZpbHRlciAmIERPX0ZMQUdTKSAmJiAoZmlsdGVyICYgRE9fUkVWUykpCisJCQkJc2hvdyhhcmcpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCQlhc19pcyA9IDI7CisJCQkJLyogUGFzcyBvbiB0aGUgIi0tIiBpZiB3ZSBzaG93IGFueXRoaW5nIGJ1dCBmaWxlcy4uICovCisJCQkJaWYgKGZpbHRlciAmIChET19GTEFHUyB8IERPX1JFVlMpKQorCQkJCQlzaG93X2ZpbGUoYXJnKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGVmYXVsdCIpKSB7CisJCQkJZGVmID0gYXJndltpKzFdOworCQkJCWkrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmV2cy1vbmx5IikpIHsKKwkJCQlmaWx0ZXIgJj0gfkRPX05PUkVWOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1yZXZzIikpIHsKKwkJCQlmaWx0ZXIgJj0gfkRPX1JFVlM7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWZsYWdzIikpIHsKKwkJCQlmaWx0ZXIgJj0gfkRPX05PTkZMQUdTOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1mbGFncyIpKSB7CisJCQkJZmlsdGVyICY9IH5ET19GTEFHUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyaWZ5IikpIHsKKwkJCQlmaWx0ZXIgJj0gfihET19GTEFHU3xET19OT1JFVik7CisJCQkJdmVyaWZ5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tc2hvcnQiKSB8fAorCQkJICAgICFzdHJuY21wKGFyZywgIi0tc2hvcnQ9IiwgOCkpIHsKKwkJCQlmaWx0ZXIgJj0gfihET19GTEFHU3xET19OT1JFVik7CisJCQkJdmVyaWZ5ID0gMTsKKwkJCQlhYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJCQlpZiAoYXJnWzddID09ICc9JykKKwkJCQkJYWJicmV2ID0gc3RydG91bChhcmcgKyA4LCBOVUxMLCAxMCk7CisJCQkJaWYgKGFiYnJldiA8IE1JTklNVU1fQUJCUkVWKQorCQkJCQlhYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJCQllbHNlIGlmICg0MCA8PSBhYmJyZXYpCisJCQkJCWFiYnJldiA9IDQwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zcSIpKSB7CisJCQkJb3V0cHV0X3NxID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm90IikpIHsKKwkJCQlzaG93X3R5cGUgXj0gUkVWRVJTRUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXN5bWJvbGljIikpIHsKKwkJCQlzeW1ib2xpYyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJZm9yX2VhY2hfcmVmKHNob3dfcmVmZXJlbmNlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYnJhbmNoZXMiKSkgeworCQkJCWZvcl9lYWNoX2JyYW5jaF9yZWYoc2hvd19yZWZlcmVuY2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS10YWdzIikpIHsKKwkJCQlmb3JfZWFjaF90YWdfcmVmKHNob3dfcmVmZXJlbmNlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVtb3RlcyIpKSB7CisJCQkJZm9yX2VhY2hfcmVtb3RlX3JlZihzaG93X3JlZmVyZW5jZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctcHJlZml4IikpIHsKKwkJCQlpZiAocHJlZml4KQorCQkJCQlwdXRzKHByZWZpeCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctY2R1cCIpKSB7CisJCQkJY29uc3QgY2hhciAqcGZ4ID0gcHJlZml4OworCQkJCXdoaWxlIChwZngpIHsKKwkJCQkJcGZ4ID0gc3RyY2hyKHBmeCwgJy8nKTsKKwkJCQkJaWYgKHBmeCkgeworCQkJCQkJcGZ4Kys7CisJCQkJCQlwcmludGYoIi4uLyIpOworCQkJCQl9CisJCQkJfQorCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWdpdC1kaXIiKSkgeworCQkJCWNvbnN0IGNoYXIgKmdpdGRpciA9IGdldGVudihHSVRfRElSX0VOVklST05NRU5UKTsKKwkJCQlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVhdOworCQkJCWlmIChnaXRkaXIpIHsKKwkJCQkJcHV0cyhnaXRkaXIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFwcmVmaXgpIHsKKwkJCQkJcHV0cygiLmdpdCIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFnZXRjd2QoY3dkLCBQQVRIX01BWCkpCisJCQkJCWRpZSgidW5hYmxlIHRvIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCQkJcHJpbnRmKCIlcy8uZ2l0XG4iLCBjd2QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tc2luY2U9IiwgOCkpIHsKKwkJCQlzaG93X2RhdGVzdHJpbmcoIi0tbWF4LWFnZT0iLCBhcmcrOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1hZnRlcj0iLCA4KSkgeworCQkJCXNob3dfZGF0ZXN0cmluZygiLS1tYXgtYWdlPSIsIGFyZys4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLWJlZm9yZT0iLCA5KSkgeworCQkJCXNob3dfZGF0ZXN0cmluZygiLS1taW4tYWdlPSIsIGFyZys5KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLXVudGlsPSIsIDgpKSB7CisJCQkJc2hvd19kYXRlc3RyaW5nKCItLW1pbi1hZ2U9IiwgYXJnKzgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHNob3dfZmxhZyhhcmcpICYmIHZlcmlmeSkKKwkJCQlkaWUoIk5lZWRlZCBhIHNpbmdsZSByZXZpc2lvbiIpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3QgYSBmbGFnIGFyZ3VtZW50ICovCisJCWRvdGRvdCA9IHN0cnN0cihhcmcsICIuLiIpOworCQlpZiAoZG90ZG90KSB7CisJCQl1bnNpZ25lZCBjaGFyIGVuZFsyMF07CisJCQljaGFyICpuZXh0ID0gZG90ZG90ICsgMjsKKwkJCWNvbnN0IGNoYXIgKnRoaXMgPSBhcmc7CisJCQkqZG90ZG90ID0gMDsKKwkJCWlmICghKm5leHQpCisJCQkJbmV4dCA9ICJIRUFEIjsKKwkJCWlmIChkb3Rkb3QgPT0gYXJnKQorCQkJCXRoaXMgPSAiSEVBRCI7CisJCQlpZiAoIWdldF9zaGExKHRoaXMsIHNoYTEpICYmICFnZXRfc2hhMShuZXh0LCBlbmQpKSB7CisJCQkJc2hvd19yZXYoTk9STUFMLCBlbmQsIG5leHQpOworCQkJCXNob3dfcmV2KFJFVkVSU0VELCBzaGExLCB0aGlzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpkb3Rkb3QgPSAnLic7CisJCX0KKwkJaWYgKCFnZXRfc2hhMShhcmcsIHNoYTEpKSB7CisJCQlzaG93X3JldihOT1JNQUwsIHNoYTEsIGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKmFyZyA9PSAnXicgJiYgIWdldF9zaGExKGFyZysxLCBzaGExKSkgeworCQkJc2hvd19yZXYoUkVWRVJTRUQsIHNoYTEsIGFyZysxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFzX2lzID0gMTsKKwkJaWYgKCFzaG93X2ZpbGUoYXJnKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodmVyaWZ5KQorCQkJZGllKCJOZWVkZWQgYSBzaW5nbGUgcmV2aXNpb24iKTsKKwkJdmVyaWZ5X2ZpbGVuYW1lKHByZWZpeCwgYXJnKTsKKwl9CisJc2hvd19kZWZhdWx0KCk7CisJaWYgKHZlcmlmeSAmJiByZXZzX2NvdW50ICE9IDEpCisJCWRpZSgiTmVlZGVkIGEgc2luZ2xlIHJldmlzaW9uIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJtLmMgYi9idWlsdGluLXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1NmExZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcm0uYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqICJnaXQgcm0iIGJ1aWx0aW4gY29tbWFuZAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMgMjAwNgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBidWlsdGluX3JtX3VzYWdlW10gPQorImdpdC1ybSBbLW5dIFstdl0gWy1mXSA8ZmlsZXBhdHRlcm4+Li4uIjsKKworc3RhdGljIHN0cnVjdCB7CisJaW50IG5yLCBhbGxvYzsKKwljb25zdCBjaGFyICoqbmFtZTsKK30gbGlzdDsKKworc3RhdGljIHZvaWQgYWRkX2xpc3QoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAobGlzdC5uciA+PSBsaXN0LmFsbG9jKSB7CisJCWxpc3QuYWxsb2MgPSBhbGxvY19ucihsaXN0LmFsbG9jKTsKKwkJbGlzdC5uYW1lID0geHJlYWxsb2MobGlzdC5uYW1lLCBsaXN0LmFsbG9jICogc2l6ZW9mKGNvbnN0IGNoYXIgKikpOworCX0KKwlsaXN0Lm5hbWVbbGlzdC5ucisrXSA9IG5hbWU7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0OworCWNoYXIgKnNsYXNoOworCisJcmV0ID0gdW5saW5rKG5hbWUpOworCWlmICghcmV0ICYmIChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpIHsKKwkJY2hhciAqbiA9IHN0cmR1cChuYW1lKTsKKwkJZG8geworCQkJbltzbGFzaCAtIG5hbWVdID0gMDsKKwkJCW5hbWUgPSBuOworCQl9IHdoaWxlICghcm1kaXIobmFtZSkgJiYgKHNsYXNoID0gc3RycmNocihuYW1lLCAnLycpKSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGxvY2tfZmlsZTsKKworaW50IGNtZF9ybShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWludCBpLCBuZXdmZDsKKwlpbnQgdmVyYm9zZSA9IDAsIHNob3dfb25seSA9IDAsIGZvcmNlID0gMDsKKwljb25zdCBjaGFyICpwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjOworCWNoYXIgKnNlZW47CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwluZXdmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJmxvY2tfZmlsZSwgZ2V0X2luZGV4X2ZpbGUoKSk7CisJaWYgKG5ld2ZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIG5ldyBpbmRleCBmaWxlIik7CisKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJpbmRleCBmaWxlIGNvcnJ1cHQiKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYyA7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbiIpKSB7CisJCQlzaG93X29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJdmVyYm9zZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItZiIpKSB7CisJCQlmb3JjZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoYnVpbHRpbl9ybV91c2FnZSk7CisJfQorCWlmIChhcmdjIDw9IGkpCisJCXVzYWdlKGJ1aWx0aW5fcm1fdXNhZ2UpOworCisJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2ICsgaSk7CisJc2VlbiA9IE5VTEw7CisJZm9yIChpID0gMDsgcGF0aHNwZWNbaV0gOyBpKyspCisJCS8qIG5vdGhpbmcgKi87CisJc2VlbiA9IHhtYWxsb2MoaSk7CisJbWVtc2V0KHNlZW4sIDAsIGkpOworCisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghbWF0Y2hfcGF0aHNwZWMocGF0aHNwZWMsIGNlLT5uYW1lLCBjZV9uYW1lbGVuKGNlKSwgMCwgc2VlbikpCisJCQljb250aW51ZTsKKwkJYWRkX2xpc3QoY2UtPm5hbWUpOworCX0KKworCWlmIChwYXRoc3BlYykgeworCQljb25zdCBjaGFyICptYXRjaDsKKwkJZm9yIChpID0gMDsgKG1hdGNoID0gcGF0aHNwZWNbaV0pICE9IE5VTEwgOyBpKyspIHsKKwkJCWlmICgqbWF0Y2ggJiYgIXNlZW5baV0pCisJCQkJZGllKCJwYXRoc3BlYyAnJXMnIGRpZCBub3QgbWF0Y2ggYW55IGZpbGVzIiwgbWF0Y2gpOworCQl9CisJfQorCisJLyoKKwkgKiBGaXJzdCByZW1vdmUgdGhlIG5hbWVzIGZyb20gdGhlIGluZGV4OiB3ZSB3b24ndCBjb21taXQKKwkgKiB0aGUgaW5kZXggdW5sZXNzIGFsbCBvZiB0aGVtIHN1Y2NlZWQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGlzdC5ucjsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSBsaXN0Lm5hbWVbaV07CisJCXByaW50Zigicm0gJyVzJ1xuIiwgcGF0aCk7CisKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCkpCisJCQlkaWUoImdpdCBybTogdW5hYmxlIHRvIHJlbW92ZSAlcyIsIHBhdGgpOworCQljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7CisJfQorCisJaWYgKHNob3dfb25seSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZW4sIGlmIHdlIHVzZWQgIi1mIiwgcmVtb3ZlIHRoZSBmaWxlbmFtZXMgZnJvbSB0aGUKKwkgKiB3b3Jrc3BhY2UuIElmIHdlIGZhaWwgdG8gcmVtb3ZlIHRoZSBmaXJzdCBvbmUsIHdlCisJICogYWJvcnQgdGhlICJnaXQgcm0iIChidXQgb25jZSB3ZSd2ZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZAorCSAqIGFueSBmaWxlIGF0IGFsbCwgd2UnbGwgZ28gYWhlYWQgYW5kIGNvbW1pdCB0byBpdCBhbGw6CisJICogYnkgdGhlbiB3ZSd2ZSBhbHJlYWR5IGNvbW1pdHRlZCBvdXJzZWxmIGFuZCBjYW4ndCBmYWlsCisJICogaW4gdGhlIG1pZGRsZSkKKwkgKi8KKwlpZiAoZm9yY2UpIHsKKwkJaW50IHJlbW92ZWQgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC5ucjsgaSsrKSB7CisJCQljb25zdCBjaGFyICpwYXRoID0gbGlzdC5uYW1lW2ldOworCQkJaWYgKCFyZW1vdmVfZmlsZShwYXRoKSkgeworCQkJCXJlbW92ZWQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFyZW1vdmVkKQorCQkJCWRpZSgiZ2l0IHJtOiAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJfQorCisJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkKSB7CisJCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCSAgICBjb21taXRfbG9ja19maWxlKCZsb2NrX2ZpbGUpKQorCQkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tc2hvdy1icmFuY2guYyBiL2J1aWx0aW4tc2hvdy1icmFuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk1MTQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zaG93LWJyYW5jaC5jCkBAIC0wLDAgKzEsNzg5IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgc2hvd19icmFuY2hfdXNhZ2VbXSA9CisiZ2l0LXNob3ctYnJhbmNoIFstLWRlbnNlXSBbLS1jdXJyZW50XSBbLS1hbGxdIFstLWhlYWRzXSBbLS10YWdzXSBbLS10b3BvLW9yZGVyXSBbLS1tb3JlPWNvdW50IHwgLS1saXN0IHwgLS1pbmRlcGVuZGVudCB8IC0tbWVyZ2UtYmFzZSBdIFstLXRvcGljc10gWzxyZWZzPi4uLl0iOworCitzdGF0aWMgaW50IGRlZmF1bHRfbnVtID0gMDsKK3N0YXRpYyBpbnQgZGVmYXVsdF9hbGxvYyA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqKmRlZmF1bHRfYXJnID0gTlVMTDsKKworI2RlZmluZSBVTklOVEVSRVNUSU5HCTAxCisKKyNkZWZpbmUgUkVWX1NISUZUCSAyCisjZGVmaW5lIE1BWF9SRVZTCTI5IC8qIHNob3VsZCBub3QgZXhjZWVkIGJpdHNfcGVyX2ludCAtIFJFVl9TSElGVCAqLworCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCXJldHVybiBjb21taXQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqcG9wX29uZV9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdF9wKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3Q7CisJbGlzdCA9ICpsaXN0X3A7CisJY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkqbGlzdF9wID0gbGlzdC0+bmV4dDsKKwlmcmVlKGxpc3QpOworCXJldHVybiBjb21taXQ7Cit9CisKK3N0cnVjdCBjb21taXRfbmFtZSB7CisJY29uc3QgY2hhciAqaGVhZF9uYW1lOyAvKiB3aGljaCBoZWFkJ3MgYW5jZXN0b3I/ICovCisJaW50IGdlbmVyYXRpb247IC8qIGhvdyBtYW55IHBhcmVudHMgYXdheSBmcm9tIGhlYWRfbmFtZSAqLworfTsKKworLyogTmFtZSB0aGUgY29tbWl0IGFzIG50aCBnZW5lcmF0aW9uIGFuY2VzdG9yIG9mIGhlYWRfbmFtZTsKKyAqIHdlIGNvdW50IG9ubHkgdGhlIGZpcnN0LXBhcmVudCByZWxhdGlvbnNoaXAgZm9yIG5hbWluZyBwdXJwb3Nlcy4KKyAqLworc3RhdGljIHZvaWQgbmFtZV9jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBjb25zdCBjaGFyICpoZWFkX25hbWUsIGludCBudGgpCit7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lOworCWlmICghY29tbWl0LT5vYmplY3QudXRpbCkKKwkJY29tbWl0LT5vYmplY3QudXRpbCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfbmFtZSkpOworCW5hbWUgPSBjb21taXQtPm9iamVjdC51dGlsOworCW5hbWUtPmhlYWRfbmFtZSA9IGhlYWRfbmFtZTsKKwluYW1lLT5nZW5lcmF0aW9uID0gbnRoOworfQorCisvKiBQYXJlbnQgaXMgdGhlIGZpcnN0IHBhcmVudCBvZiB0aGUgY29tbWl0LiAgV2UgbWF5IG5hbWUgaXQKKyAqIGFzIChuKzEpdGggZ2VuZXJhdGlvbiBhbmNlc3RvciBvZiB0aGUgc2FtZSBoZWFkX25hbWUgYXMKKyAqIGNvbW1pdCBpcyBudGggZ2VuZXJhdGlvbiBhbmNlc3RvciBvZiwgaWYgdGhhdCBnZW5lcmF0aW9uCisgKiBudW1iZXIgaXMgYmV0dGVyIHRoYW4gdGhlIG5hbWUgaXQgYWxyZWFkeSBoYXMuCisgKi8KK3N0YXRpYyB2b2lkIG5hbWVfcGFyZW50KHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqcGFyZW50KQoreworCXN0cnVjdCBjb21taXRfbmFtZSAqY29tbWl0X25hbWUgPSBjb21taXQtPm9iamVjdC51dGlsOworCXN0cnVjdCBjb21taXRfbmFtZSAqcGFyZW50X25hbWUgPSBwYXJlbnQtPm9iamVjdC51dGlsOworCWlmICghY29tbWl0X25hbWUpCisJCXJldHVybjsKKwlpZiAoIXBhcmVudF9uYW1lIHx8CisJICAgIGNvbW1pdF9uYW1lLT5nZW5lcmF0aW9uICsgMSA8IHBhcmVudF9uYW1lLT5nZW5lcmF0aW9uKQorCQluYW1lX2NvbW1pdChwYXJlbnQsIGNvbW1pdF9uYW1lLT5oZWFkX25hbWUsCisJCQkgICAgY29tbWl0X25hbWUtPmdlbmVyYXRpb24gKyAxKTsKK30KKworc3RhdGljIGludCBuYW1lX2ZpcnN0X3BhcmVudF9jaGFpbihzdHJ1Y3QgY29tbWl0ICpjKQoreworCWludCBpID0gMDsKKwl3aGlsZSAoYykgeworCQlzdHJ1Y3QgY29tbWl0ICpwOworCQlpZiAoIWMtPm9iamVjdC51dGlsKQorCQkJYnJlYWs7CisJCWlmICghYy0+cGFyZW50cykKKwkJCWJyZWFrOworCQlwID0gYy0+cGFyZW50cy0+aXRlbTsKKwkJaWYgKCFwLT5vYmplY3QudXRpbCkgeworCQkJbmFtZV9wYXJlbnQoYywgcCk7CisJCQlpKys7CisJCX0KKwkJYyA9IHA7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBuYW1lX2NvbW1pdHMoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LAorCQkJIHN0cnVjdCBjb21taXQgKipyZXYsCisJCQkgY2hhciAqKnJlZl9uYW1lLAorCQkJIGludCBudW1fcmV2KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqY2w7CisJc3RydWN0IGNvbW1pdCAqYzsKKwlpbnQgaTsKKworCS8qIEZpcnN0IGdpdmUgbmFtZXMgdG8gdGhlIGdpdmVuIGhlYWRzICovCisJZm9yIChjbCA9IGxpc3Q7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisJCWMgPSBjbC0+aXRlbTsKKwkJaWYgKGMtPm9iamVjdC51dGlsKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcmV2OyBpKyspIHsKKwkJCWlmIChyZXZbaV0gPT0gYykgeworCQkJCW5hbWVfY29tbWl0KGMsIHJlZl9uYW1lW2ldLCAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFRoZW4gY29tbWl0cyBvbiB0aGUgZmlyc3QgcGFyZW50IGFuY2VzdHJ5IGNoYWluICovCisJZG8geworCQlpID0gMDsKKwkJZm9yIChjbCA9IGxpc3Q7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisJCQlpICs9IG5hbWVfZmlyc3RfcGFyZW50X2NoYWluKGNsLT5pdGVtKTsKKwkJfQorCX0gd2hpbGUgKGkpOworCisJLyogRmluYWxseSwgYW55IHVubmFtZWQgY29tbWl0cyAqLworCWRvIHsKKwkJaSA9IDA7CisJCWZvciAoY2wgPSBsaXN0OyBjbDsgY2wgPSBjbC0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCQkJc3RydWN0IGNvbW1pdF9uYW1lICpuOworCQkJaW50IG50aDsKKwkJCWMgPSBjbC0+aXRlbTsKKwkJCWlmICghYy0+b2JqZWN0LnV0aWwpCisJCQkJY29udGludWU7CisJCQluID0gYy0+b2JqZWN0LnV0aWw7CisJCQlwYXJlbnRzID0gYy0+cGFyZW50czsKKwkJCW50aCA9IDA7CisJCQl3aGlsZSAocGFyZW50cykgeworCQkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJCWNoYXIgbmV3bmFtZVsxMDAwXSwgKmVuOworCQkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJCW50aCsrOworCQkJCWlmIChwLT5vYmplY3QudXRpbCkKKwkJCQkJY29udGludWU7CisJCQkJZW4gPSBuZXduYW1lOworCQkJCXN3aXRjaCAobi0+Z2VuZXJhdGlvbikgeworCQkJCWNhc2UgMDoKKwkJCQkJZW4gKz0gc3ByaW50ZihlbiwgIiVzIiwgbi0+aGVhZF9uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQllbiArPSBzcHJpbnRmKGVuLCAiJXNeIiwgbi0+aGVhZF9uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZW4gKz0gc3ByaW50ZihlbiwgIiVzfiVkIiwKKwkJCQkJCW4tPmhlYWRfbmFtZSwgbi0+Z2VuZXJhdGlvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAobnRoID09IDEpCisJCQkJCWVuICs9IHNwcmludGYoZW4sICJeIik7CisJCQkJZWxzZQorCQkJCQllbiArPSBzcHJpbnRmKGVuLCAiXiVkIiwgbnRoKTsKKwkJCQluYW1lX2NvbW1pdChwLCBzdHJkdXAobmV3bmFtZSksIDApOworCQkJCWkrKzsKKwkJCQluYW1lX2ZpcnN0X3BhcmVudF9jaGFpbihwKTsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKGkpOworfQorCitzdGF0aWMgaW50IG1hcmtfc2VlbihzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCBjb21taXRfbGlzdCAqKnNlZW5fcCkKK3sKKwlpZiAoIWNvbW1pdC0+b2JqZWN0LmZsYWdzKSB7CisJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgc2Vlbl9wKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqb2luX3JldnMoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdF9wLAorCQkgICAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKipzZWVuX3AsCisJCSAgICAgIGludCBudW1fcmV2LCBpbnQgZXh0cmEpCit7CisJaW50IGFsbF9tYXNrID0gKCgxdSA8PCAoUkVWX1NISUZUICsgbnVtX3JldikpIC0gMSk7CisJaW50IGFsbF9yZXZzID0gYWxsX21hc2sgJiB+KCgxdSA8PCBSRVZfU0hJRlQpIC0gMSk7CisKKwl3aGlsZSAoKmxpc3RfcCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCWludCBzdGlsbF9pbnRlcmVzdGluZyA9ICEhaW50ZXJlc3RpbmcoKmxpc3RfcCk7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBvcF9vbmVfY29tbWl0KGxpc3RfcCk7CisJCWludCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgYWxsX21hc2s7CisKKwkJaWYgKCFzdGlsbF9pbnRlcmVzdGluZyAmJiBleHRyYSA8PSAwKQorCQkJYnJlYWs7CisKKwkJbWFya19zZWVuKGNvbW1pdCwgc2Vlbl9wKTsKKwkJaWYgKChmbGFncyAmIGFsbF9yZXZzKSA9PSBhbGxfcmV2cykKKwkJCWZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCXBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJaW50IHRoaXNfZmxhZyA9IHAtPm9iamVjdC5mbGFnczsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJaWYgKCh0aGlzX2ZsYWcgJiBmbGFncykgPT0gZmxhZ3MpCisJCQkJY29udGludWU7CisJCQlpZiAoIXAtPm9iamVjdC5wYXJzZWQpCisJCQkJcGFyc2VfY29tbWl0KHApOworCQkJaWYgKG1hcmtfc2VlbihwLCBzZWVuX3ApICYmICFzdGlsbF9pbnRlcmVzdGluZykKKwkJCQlleHRyYS0tOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IGZsYWdzOworCQkJaW5zZXJ0X2J5X2RhdGUocCwgbGlzdF9wKTsKKwkJfQorCX0KKworCS8qCisJICogUG9zdHByb2Nlc3MgdG8gY29tcGxldGUgd2VsbC1wb2lzb25pbmcuCisJICoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWxsIHRoZSBjb21taXRzIHdlIGhhdmUgc2VlbiBpbgorCSAqIHNlZW5fcCBsaXN0ICh3aGljaCBoYXBwZW5zIHRvIGJlIHNvcnRlZCBjaHJvbm9sb2dpY2FsbHkgYnV0CisJICogaXQgZG9lcyBub3QgcmVhbGx5IG1hdHRlcikuICBNYXJrIGFueXRoaW5nIHRoYXQgY2FuIGJlCisJICogcmVhY2hlZCBmcm9tIHVuaW50ZXJlc3RpbmcgY29tbWl0cyBub3QgaW50ZXJlc3RpbmcuCisJICovCisJZm9yICg7OykgeworCQlpbnQgY2hhbmdlZCA9IDA7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqczsKKwkJZm9yIChzID0gKnNlZW5fcDsgczsgcyA9IHMtPm5leHQpIHsKKwkJCXN0cnVjdCBjb21taXQgKmMgPSBzLT5pdGVtOworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJCQlpZiAoKChjLT5vYmplY3QuZmxhZ3MgJiBhbGxfcmV2cykgIT0gYWxsX3JldnMpICYmCisJCQkgICAgIShjLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogVGhlIGN1cnJlbnQgY29tbWl0IGlzIGVpdGhlciBhIG1lcmdlIGJhc2Ugb3IKKwkJCSAqIGFscmVhZHkgdW5pbnRlcmVzdGluZyBvbmUuICBNYXJrIGl0cyBwYXJlbnRzCisJCQkgKiBhcyB1bmludGVyZXN0aW5nIGNvbW1pdHMgX29ubHlfIGlmIHRoZXkgYXJlCisJCQkgKiBhbHJlYWR5IHBhcnNlZC4gIE5vIHJlYXNvbiB0byBmaW5kIG5ldyBvbmVzCisJCQkgKiBoZXJlLgorCQkJICovCisJCQlwYXJlbnRzID0gYy0+cGFyZW50czsKKwkJCXdoaWxlIChwYXJlbnRzKSB7CisJCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCQkJaWYgKCEocC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpIHsKKwkJCQkJcC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCQkJCWNoYW5nZWQgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWNoYW5nZWQpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb25lX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBub19uYW1lKQoreworCWNoYXIgcHJldHR5WzI1Nl0sICpjcDsKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKm5hbWUgPSBjb21taXQtPm9iamVjdC51dGlsOworCWlmIChjb21taXQtPm9iamVjdC5wYXJzZWQpCisJCXByZXR0eV9wcmludF9jb21taXQoQ01JVF9GTVRfT05FTElORSwgY29tbWl0LCB+MCwKKwkJCQkgICAgcHJldHR5LCBzaXplb2YocHJldHR5KSwgMCwgTlVMTCwgTlVMTCk7CisJZWxzZQorCQlzdHJjcHkocHJldHR5LCAiKHVuYXZhaWxhYmxlKSIpOworCWlmICghc3RybmNtcChwcmV0dHksICJbUEFUQ0hdICIsIDgpKQorCQljcCA9IHByZXR0eSArIDg7CisJZWxzZQorCQljcCA9IHByZXR0eTsKKworCWlmICghbm9fbmFtZSkgeworCQlpZiAobmFtZSAmJiBuYW1lLT5oZWFkX25hbWUpIHsKKwkJCXByaW50ZigiWyVzIiwgbmFtZS0+aGVhZF9uYW1lKTsKKwkJCWlmIChuYW1lLT5nZW5lcmF0aW9uKSB7CisJCQkJaWYgKG5hbWUtPmdlbmVyYXRpb24gPT0gMSkKKwkJCQkJcHJpbnRmKCJeIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIn4lZCIsIG5hbWUtPmdlbmVyYXRpb24pOworCQkJfQorCQkJcHJpbnRmKCJdICIpOworCQl9CisJCWVsc2UKKwkJCXByaW50ZigiWyVzXSAiLAorCQkJICAgICAgIGZpbmRfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLCA3KSk7CisJfQorCXB1dHMoY3ApOworfQorCitzdGF0aWMgY2hhciAqcmVmX25hbWVbTUFYX1JFVlMgKyAxXTsKK3N0YXRpYyBpbnQgcmVmX25hbWVfY250OworCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF9kaWdpdF9wcmVmaXgoY29uc3QgY2hhciAqcywgaW50ICp2KQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IHZlcjsKKwljaGFyIGNoOworCisJZm9yIChwID0gcywgdmVyID0gMDsKKwkgICAgICcwJyA8PSAoY2ggPSAqcCkgJiYgY2ggPD0gJzknOworCSAgICAgcCsrKQorCQl2ZXIgPSB2ZXIgKiAxMCArIGNoIC0gJzAnOworCSp2ID0gdmVyOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBpbnQgdmVyc2lvbl9jbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgdmEsIHZiOworCisJCWEgPSBmaW5kX2RpZ2l0X3ByZWZpeChhLCAmdmEpOworCQliID0gZmluZF9kaWdpdF9wcmVmaXgoYiwgJnZiKTsKKwkJaWYgKHZhICE9IHZiKQorCQkJcmV0dXJuIHZhIC0gdmI7CisKKwkJd2hpbGUgKDEpIHsKKwkJCWludCBjYSA9ICphOworCQkJaW50IGNiID0gKmI7CisJCQlpZiAoJzAnIDw9IGNhICYmIGNhIDw9ICc5JykKKwkJCQljYSA9IDA7CisJCQlpZiAoJzAnIDw9IGNiICYmIGNiIDw9ICc5JykKKwkJCQljYiA9IDA7CisJCQlpZiAoY2EgIT0gY2IpCisJCQkJcmV0dXJuIGNhIC0gY2I7CisJCQlpZiAoIWNhKQorCQkJCWJyZWFrOworCQkJYSsrOworCQkJYisrOworCQl9CisJCWlmICghKmEgJiYgISpiKQorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGNvbXBhcmVfcmVmX25hbWUoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCWNvbnN0IGNoYXIgKiBjb25zdCphID0gYV8sICogY29uc3QqYiA9IGJfOworCXJldHVybiB2ZXJzaW9uX2NtcCgqYSwgKmIpOworfQorCitzdGF0aWMgdm9pZCBzb3J0X3JlZl9yYW5nZShpbnQgYm90dG9tLCBpbnQgdG9wKQoreworCXFzb3J0KHJlZl9uYW1lICsgYm90dG9tLCB0b3AgLSBib3R0b20sIHNpemVvZihyZWZfbmFtZVswXSksCisJICAgICAgY29tcGFyZV9yZWZfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpbnQgaTsKKworCWlmICghY29tbWl0KQorCQlyZXR1cm4gMDsKKwkvKiBBdm9pZCBhZGRpbmcgdGhlIHNhbWUgdGhpbmcgdHdpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVmX25hbWVfY250OyBpKyspCisJCWlmICghc3RyY21wKHJlZm5hbWUsIHJlZl9uYW1lW2ldKSkKKwkJCXJldHVybiAwOworCisJaWYgKE1BWF9SRVZTIDw9IHJlZl9uYW1lX2NudCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGlnbm9yaW5nICVzOyAiCisJCQkiY2Fubm90IGhhbmRsZSBtb3JlIHRoYW4gJWQgcmVmc1xuIiwKKwkJCXJlZm5hbWUsIE1BWF9SRVZTKTsKKwkJcmV0dXJuIDA7CisJfQorCXJlZl9uYW1lW3JlZl9uYW1lX2NudCsrXSA9IHN0cmR1cChyZWZuYW1lKTsKKwlyZWZfbmFtZVtyZWZfbmFtZV9jbnRdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBlbmRfaGVhZF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcFsyMF07CisJaW50IG9mcyA9IDExOworCWlmIChzdHJuY21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIsIG9mcykpCisJCXJldHVybiAwOworCS8qIElmIGJvdGggaGVhZHMvZm9vIGFuZCB0YWdzL2ZvbyBleGlzdHMsIGdldF9zaGExIHdvdWxkCisJICogZ2V0IGNvbmZ1c2VkLgorCSAqLworCWlmIChnZXRfc2hhMShyZWZuYW1lICsgb2ZzLCB0bXApIHx8IG1lbWNtcCh0bXAsIHNoYTEsIDIwKSkKKwkJb2ZzID0gNTsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lICsgb2ZzLCBzaGExKTsKK30KKworc3RhdGljIGludCBhcHBlbmRfdGFnX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmIChzdHJuY21wKHJlZm5hbWUsICJyZWZzL3RhZ3MvIiwgMTApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lICsgNSwgc2hhMSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptYXRjaF9yZWZfcGF0dGVybiA9IE5VTEw7CitzdGF0aWMgaW50IG1hdGNoX3JlZl9zbGFzaCA9IDA7CitzdGF0aWMgaW50IGNvdW50X3NsYXNoKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGNudCA9IDA7CisJd2hpbGUgKCpzKQorCQlpZiAoKnMrKyA9PSAnLycpCisJCQljbnQrKzsKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW50IGFwcGVuZF9tYXRjaGluZ19yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwkvKiB3ZSB3YW50IHRvIGFsbG93IHBhdHRlcm4gaG9sZC88YXN0ZXJpc2s+IHRvIHNob3cgYWxsCisJICogYnJhbmNoZXMgdW5kZXIgcmVmcy9oZWFkcy9ob2xkLywgYW5kIHYwLjk5Ljk/IHRvIHNob3cKKwkgKiByZWZzL3RhZ3MvdjAuOTkuOWEgYW5kIGZyaWVuZHMuCisJICovCisJY29uc3QgY2hhciAqdGFpbDsKKwlpbnQgc2xhc2ggPSBjb3VudF9zbGFzaChyZWZuYW1lKTsKKwlmb3IgKHRhaWwgPSByZWZuYW1lOyAqdGFpbCAmJiBtYXRjaF9yZWZfc2xhc2ggPCBzbGFzaDsgKQorCQlpZiAoKnRhaWwrKyA9PSAnLycpCisJCQlzbGFzaC0tOworCWlmICghKnRhaWwpCisJCXJldHVybiAwOworCWlmIChmbm1hdGNoKG1hdGNoX3JlZl9wYXR0ZXJuLCB0YWlsLCAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFzdHJuY21wKCJyZWZzL2hlYWRzLyIsIHJlZm5hbWUsIDExKSkKKwkJcmV0dXJuIGFwcGVuZF9oZWFkX3JlZihyZWZuYW1lLCBzaGExKTsKKwlpZiAoIXN0cm5jbXAoInJlZnMvdGFncy8iLCByZWZuYW1lLCAxMCkpCisJCXJldHVybiBhcHBlbmRfdGFnX3JlZihyZWZuYW1lLCBzaGExKTsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lLCBzaGExKTsKK30KKworc3RhdGljIHZvaWQgc25hcmZfcmVmcyhpbnQgaGVhZCwgaW50IHRhZykKK3sKKwlpZiAoaGVhZCkgeworCQlpbnQgb3JpZ19jbnQgPSByZWZfbmFtZV9jbnQ7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfaGVhZF9yZWYpOworCQlzb3J0X3JlZl9yYW5nZShvcmlnX2NudCwgcmVmX25hbWVfY250KTsKKwl9CisJaWYgKHRhZykgeworCQlpbnQgb3JpZ19jbnQgPSByZWZfbmFtZV9jbnQ7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfdGFnX3JlZik7CisJCXNvcnRfcmVmX3JhbmdlKG9yaWdfY250LCByZWZfbmFtZV9jbnQpOworCX0KK30KKworc3RhdGljIGludCByZXZfaXNfaGVhZChjaGFyICpoZWFkX3BhdGgsIGludCBoZWFkbGVuLCBjaGFyICpuYW1lLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqaGVhZF9zaGExLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBuYW1lbGVuOworCWlmICgoIWhlYWRfcGF0aFswXSkgfHwKKwkgICAgKGhlYWRfc2hhMSAmJiBzaGExICYmIG1lbWNtcChoZWFkX3NoYTEsIHNoYTEsIDIwKSkpCisJCXJldHVybiAwOworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKChoZWFkbGVuIDwgbmFtZWxlbikgfHwKKwkgICAgbWVtY21wKGhlYWRfcGF0aCArIGhlYWRsZW4gLSBuYW1lbGVuLCBuYW1lLCBuYW1lbGVuKSkKKwkJcmV0dXJuIDA7CisJaWYgKGhlYWRsZW4gPT0gbmFtZWxlbiB8fAorCSAgICBoZWFkX3BhdGhbaGVhZGxlbiAtIG5hbWVsZW4gLSAxXSA9PSAnLycpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfbWVyZ2VfYmFzZShzdHJ1Y3QgY29tbWl0X2xpc3QgKnNlZW4sIGludCBudW1fcmV2KQoreworCWludCBhbGxfbWFzayA9ICgoMXUgPDwgKFJFVl9TSElGVCArIG51bV9yZXYpKSAtIDEpOworCWludCBhbGxfcmV2cyA9IGFsbF9tYXNrICYgfigoMXUgPDwgUkVWX1NISUZUKSAtIDEpOworCWludCBleGl0X3N0YXR1cyA9IDE7CisKKwl3aGlsZSAoc2VlbikgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwb3Bfb25lX2NvbW1pdCgmc2Vlbik7CisJCWludCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgYWxsX21hc2s7CisJCWlmICghKGZsYWdzICYgVU5JTlRFUkVTVElORykgJiYKKwkJICAgICgoZmxhZ3MgJiBhbGxfcmV2cykgPT0gYWxsX3JldnMpKSB7CisJCQlwdXRzKHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJCWV4aXRfc3RhdHVzID0gMDsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCX0KKwl9CisJcmV0dXJuIGV4aXRfc3RhdHVzOworfQorCitzdGF0aWMgaW50IHNob3dfaW5kZXBlbmRlbnQoc3RydWN0IGNvbW1pdCAqKnJldiwKKwkJCSAgICBpbnQgbnVtX3JldiwKKwkJCSAgICBjaGFyICoqcmVmX25hbWUsCisJCQkgICAgdW5zaWduZWQgaW50ICpyZXZfbWFzaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmV2OyBpKyspIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcmV2W2ldOworCQl1bnNpZ25lZCBpbnQgZmxhZyA9IHJldl9tYXNrW2ldOworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyA9PSBmbGFnKQorCQkJcHV0cyhzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfb25lX3Jldihjb25zdCBjaGFyICphdikKK3sKKwl1bnNpZ25lZCBjaGFyIHJldmtleVsyMF07CisJaWYgKCFnZXRfc2hhMShhdiwgcmV2a2V5KSkgeworCQlhcHBlbmRfcmVmKGF2LCByZXZrZXkpOworCQlyZXR1cm47CisJfQorCWlmIChzdHJjaHIoYXYsICcqJykgfHwgc3RyY2hyKGF2LCAnPycpIHx8IHN0cmNocihhdiwgJ1snKSkgeworCQkvKiBnbG9iIHN0eWxlIG1hdGNoICovCisJCWludCBzYXZlZF9tYXRjaGVzID0gcmVmX25hbWVfY250OworCQltYXRjaF9yZWZfcGF0dGVybiA9IGF2OworCQltYXRjaF9yZWZfc2xhc2ggPSBjb3VudF9zbGFzaChhdik7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfbWF0Y2hpbmdfcmVmKTsKKwkJaWYgKHNhdmVkX21hdGNoZXMgPT0gcmVmX25hbWVfY250ICYmCisJCSAgICByZWZfbmFtZV9jbnQgPCBNQVhfUkVWUykKKwkJCWVycm9yKCJubyBtYXRjaGluZyByZWZzIHdpdGggJXMiLCBhdik7CisJCWlmIChzYXZlZF9tYXRjaGVzICsgMSA8IHJlZl9uYW1lX2NudCkKKwkJCXNvcnRfcmVmX3JhbmdlKHNhdmVkX21hdGNoZXMsIHJlZl9uYW1lX2NudCk7CisJCXJldHVybjsKKwl9CisJZGllKCJiYWQgc2hhMSByZWZlcmVuY2UgJXMiLCBhdik7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3Nob3dfYnJhbmNoX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgInNob3dicmFuY2guZGVmYXVsdCIpKSB7CisJCWlmIChkZWZhdWx0X2FsbG9jIDw9IGRlZmF1bHRfbnVtICsgMSkgeworCQkJZGVmYXVsdF9hbGxvYyA9IGRlZmF1bHRfYWxsb2MgKiAzIC8gMiArIDIwOworCQkJZGVmYXVsdF9hcmcgPSB4cmVhbGxvYyhkZWZhdWx0X2FyZywgc2l6ZW9mICpkZWZhdWx0X2FyZyAqIGRlZmF1bHRfYWxsb2MpOworCQl9CisJCWRlZmF1bHRfYXJnW2RlZmF1bHRfbnVtKytdID0gc3RyZHVwKHZhbHVlKTsKKwkJZGVmYXVsdF9hcmdbZGVmYXVsdF9udW1dID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBvbWl0X2luX2RlbnNlKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqKnJldiwgaW50IG4pCit7CisJLyogSWYgdGhlIGNvbW1pdCBpcyB0aXAgb2YgdGhlIG5hbWVkIGJyYW5jaGVzLCBkbyBub3QKKwkgKiBvbWl0IGl0LgorCSAqIE90aGVyd2lzZSwgaWYgaXQgaXMgYSBtZXJnZSB0aGF0IGlzIHJlYWNoYWJsZSBmcm9tIG9ubHkgb25lCisJICogdGlwLCBpdCBpcyBub3QgdGhhdCBpbnRlcmVzdGluZy4KKwkgKi8KKwlpbnQgaSwgZmxhZywgY291bnQ7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKHJldltpXSA9PSBjb21taXQpCisJCQlyZXR1cm4gMDsKKwlmbGFnID0gY29tbWl0LT5vYmplY3QuZmxhZ3M7CisJZm9yIChpID0gY291bnQgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWlmIChmbGFnICYgKDF1IDw8IChpICsgUkVWX1NISUZUKSkpCisJCQljb3VudCsrOworCX0KKwlpZiAoY291bnQgPT0gMSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfc2hvd19icmFuY2goaW50IGFjLCBjb25zdCBjaGFyICoqYXYsIGNoYXIgKiplbnZwKQoreworCXN0cnVjdCBjb21taXQgKnJldltNQVhfUkVWU10sICpjb21taXQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gTlVMTCwgKnNlZW4gPSBOVUxMOworCXVuc2lnbmVkIGludCByZXZfbWFza1tNQVhfUkVWU107CisJaW50IG51bV9yZXYsIGksIGV4dHJhID0gMDsKKwlpbnQgYWxsX2hlYWRzID0gMCwgYWxsX3RhZ3MgPSAwOworCWludCBhbGxfbWFzaywgYWxsX3JldnM7CisJaW50IGxpZm8gPSAxOworCWNoYXIgaGVhZF9wYXRoWzEyOF07CisJY29uc3QgY2hhciAqaGVhZF9wYXRoX3A7CisJaW50IGhlYWRfcGF0aF9sZW47CisJdW5zaWduZWQgY2hhciBoZWFkX3NoYTFbMjBdOworCWludCBtZXJnZV9iYXNlID0gMDsKKwlpbnQgaW5kZXBlbmRlbnQgPSAwOworCWludCBub19uYW1lID0gMDsKKwlpbnQgc2hhMV9uYW1lID0gMDsKKwlpbnQgc2hvd25fbWVyZ2VfcG9pbnQgPSAwOworCWludCB3aXRoX2N1cnJlbnRfYnJhbmNoID0gMDsKKwlpbnQgaGVhZF9hdCA9IC0xOworCWludCB0b3BpY3MgPSAwOworCWludCBkZW5zZSA9IDE7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfc2hvd19icmFuY2hfY29uZmlnKTsKKworCS8qIElmIG5vdGhpbmcgaXMgc3BlY2lmaWVkLCB0cnkgdGhlIGRlZmF1bHQgZmlyc3QgKi8KKwlpZiAoYWMgPT0gMSAmJiBkZWZhdWx0X251bSkgeworCQlhYyA9IGRlZmF1bHRfbnVtICsgMTsKKwkJYXYgPSBkZWZhdWx0X2FyZyAtIDE7IC8qIGljazsgd2Ugd291bGQgbm90IGFkZHJlc3MgYXZbMF0gKi8KKwl9CisKKwl3aGlsZSAoMSA8IGFjICYmIGF2WzFdWzBdID09ICctJykgeworCQljb25zdCBjaGFyICphcmcgPSBhdlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJYWMtLTsgYXYrKzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkKKwkJCWFsbF9oZWFkcyA9IGFsbF90YWdzID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWhlYWRzIikpCisJCQlhbGxfaGVhZHMgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tdGFncyIpKQorCQkJYWxsX3RhZ3MgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbW9yZSIpKQorCQkJZXh0cmEgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbGlzdCIpKQorCQkJZXh0cmEgPSAtMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW5vLW5hbWUiKSkKKwkJCW5vX25hbWUgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tY3VycmVudCIpKQorCQkJd2l0aF9jdXJyZW50X2JyYW5jaCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zaGExLW5hbWUiKSkKKwkJCXNoYTFfbmFtZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJuY21wKGFyZywgIi0tbW9yZT0iLCA3KSkKKwkJCWV4dHJhID0gYXRvaShhcmcgKyA3KTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW1lcmdlLWJhc2UiKSkKKwkJCW1lcmdlX2Jhc2UgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0taW5kZXBlbmRlbnQiKSkKKwkJCWluZGVwZW5kZW50ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXRvcG8tb3JkZXIiKSkKKwkJCWxpZm8gPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tdG9waWNzIikpCisJCQl0b3BpY3MgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc3BhcnNlIikpCisJCQlkZW5zZSA9IDA7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1kYXRlLW9yZGVyIikpCisJCQlsaWZvID0gMDsKKwkJZWxzZQorCQkJdXNhZ2Uoc2hvd19icmFuY2hfdXNhZ2UpOworCQlhYy0tOyBhdisrOworCX0KKwlhYy0tOyBhdisrOworCisJLyogT25seSBvbmUgb2YgdGhlc2UgaXMgYWxsb3dlZCAqLworCWlmICgxIDwgaW5kZXBlbmRlbnQgKyBtZXJnZV9iYXNlICsgKGV4dHJhICE9IDApKQorCQl1c2FnZShzaG93X2JyYW5jaF91c2FnZSk7CisKKwkvKiBJZiBub3RoaW5nIGlzIHNwZWNpZmllZCwgc2hvdyBhbGwgYnJhbmNoZXMgYnkgZGVmYXVsdCAqLworCWlmIChhYyArIGFsbF9oZWFkcyArIGFsbF90YWdzID09IDApCisJCWFsbF9oZWFkcyA9IDE7CisKKwlpZiAoYWxsX2hlYWRzICsgYWxsX3RhZ3MpCisJCXNuYXJmX3JlZnMoYWxsX2hlYWRzLCBhbGxfdGFncyk7CisJd2hpbGUgKDAgPCBhYykgeworCQlhcHBlbmRfb25lX3JldigqYXYpOworCQlhYy0tOyBhdisrOworCX0KKworCWhlYWRfcGF0aF9wID0gcmVzb2x2ZV9yZWYoZ2l0X3BhdGgoIkhFQUQiKSwgaGVhZF9zaGExLCAxKTsKKwlpZiAoaGVhZF9wYXRoX3ApIHsKKwkJaGVhZF9wYXRoX2xlbiA9IHN0cmxlbihoZWFkX3BhdGhfcCk7CisJCW1lbWNweShoZWFkX3BhdGgsIGhlYWRfcGF0aF9wLCBoZWFkX3BhdGhfbGVuICsgMSk7CisJfQorCWVsc2UgeworCQloZWFkX3BhdGhfbGVuID0gMDsKKwkJaGVhZF9wYXRoWzBdID0gMDsKKwl9CisKKwlpZiAod2l0aF9jdXJyZW50X2JyYW5jaCAmJiBoZWFkX3BhdGhfcCkgeworCQlpbnQgaGFzX2hlYWQgPSAwOworCQlmb3IgKGkgPSAwOyAhaGFzX2hlYWQgJiYgaSA8IHJlZl9uYW1lX2NudDsgaSsrKSB7CisJCQkvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGFkZGluZyB0aGUgYnJhbmNoCisJCQkgKiBIRUFEIHBvaW50cyBhdC4KKwkJCSAqLworCQkJaWYgKHJldl9pc19oZWFkKGhlYWRfcGF0aCwKKwkJCQkJaGVhZF9wYXRoX2xlbiwKKwkJCQkJcmVmX25hbWVbaV0sCisJCQkJCWhlYWRfc2hhMSwgTlVMTCkpCisJCQkJaGFzX2hlYWQrKzsKKwkJfQorCQlpZiAoIWhhc19oZWFkKSB7CisJCQlpbnQgcGZ4bGVuID0gc3RybGVuKGdpdF9wYXRoKCJyZWZzL2hlYWRzLyIpKTsKKwkJCWFwcGVuZF9vbmVfcmV2KGhlYWRfcGF0aCArIHBmeGxlbik7CisJCX0KKwl9CisKKwlpZiAoIXJlZl9uYW1lX2NudCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHJldnMgdG8gYmUgc2hvd24uXG4iKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlmb3IgKG51bV9yZXYgPSAwOyByZWZfbmFtZVtudW1fcmV2XTsgbnVtX3JldisrKSB7CisJCXVuc2lnbmVkIGNoYXIgcmV2a2V5WzIwXTsKKwkJdW5zaWduZWQgaW50IGZsYWcgPSAxdSA8PCAobnVtX3JldiArIFJFVl9TSElGVCk7CisKKwkJaWYgKE1BWF9SRVZTIDw9IG51bV9yZXYpCisJCQlkaWUoImNhbm5vdCBoYW5kbGUgbW9yZSB0aGFuICVkIHJldnMuIiwgTUFYX1JFVlMpOworCQlpZiAoZ2V0X3NoYTEocmVmX25hbWVbbnVtX3Jldl0sIHJldmtleSkpCisJCQlkaWUoIiclcycgaXMgbm90IGEgdmFsaWQgcmVmLiIsIHJlZl9uYW1lW251bV9yZXZdKTsKKwkJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UocmV2a2V5KTsKKwkJaWYgKCFjb21taXQpCisJCQlkaWUoImNhbm5vdCBmaW5kIGNvbW1pdCAlcyAoJXMpIiwKKwkJCSAgICByZWZfbmFtZVtudW1fcmV2XSwgcmV2a2V5KTsKKwkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJCW1hcmtfc2Vlbihjb21taXQsICZzZWVuKTsKKworCQkvKiByZXYjMCB1c2VzIGJpdCBSRVZfU0hJRlQsIHJldiMxIHVzZXMgYml0IFJFVl9TSElGVCsxLAorCQkgKiBhbmQgc28gb24uICBSRVZfU0hJRlQgYml0cyBmcm9tIGJpdCAwIGFyZSB1c2VkIGZvcgorCQkgKiBpbnRlcm5hbCBib29ra2VlcGluZy4KKwkJICovCisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IGZsYWc7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyA9PSBmbGFnKQorCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmbGlzdCk7CisJCXJldltudW1fcmV2XSA9IGNvbW1pdDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykKKwkJcmV2X21hc2tbaV0gPSByZXZbaV0tPm9iamVjdC5mbGFnczsKKworCWlmICgwIDw9IGV4dHJhKQorCQlqb2luX3JldnMoJmxpc3QsICZzZWVuLCBudW1fcmV2LCBleHRyYSk7CisKKwlpZiAobWVyZ2VfYmFzZSkKKwkJcmV0dXJuIHNob3dfbWVyZ2VfYmFzZShzZWVuLCBudW1fcmV2KTsKKworCWlmIChpbmRlcGVuZGVudCkKKwkJcmV0dXJuIHNob3dfaW5kZXBlbmRlbnQocmV2LCBudW1fcmV2LCByZWZfbmFtZSwgcmV2X21hc2spOworCisJLyogU2hvdyBsaXN0OyAtLW1vcmU9LTEgbWVhbnMgbGlzdC1vbmx5ICovCisJaWYgKDEgPCBudW1fcmV2IHx8IGV4dHJhIDwgMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKSB7CisJCQlpbnQgajsKKwkJCWludCBpc19oZWFkID0gcmV2X2lzX2hlYWQoaGVhZF9wYXRoLAorCQkJCQkJICBoZWFkX3BhdGhfbGVuLAorCQkJCQkJICByZWZfbmFtZVtpXSwKKwkJCQkJCSAgaGVhZF9zaGExLAorCQkJCQkJICByZXZbaV0tPm9iamVjdC5zaGExKTsKKwkJCWlmIChleHRyYSA8IDApCisJCQkJcHJpbnRmKCIlYyBbJXNdICIsCisJCQkJICAgICAgIGlzX2hlYWQgPyAnKicgOiAnICcsIHJlZl9uYW1lW2ldKTsKKwkJCWVsc2UgeworCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJCXB1dGNoYXIoJyAnKTsKKwkJCQlwcmludGYoIiVjIFslc10gIiwKKwkJCQkgICAgICAgaXNfaGVhZCA/ICcqJyA6ICchJywgcmVmX25hbWVbaV0pOworCQkJfQorCQkJLyogaGVhZGVyIGxpbmVzIG5ldmVyIG5lZWQgbmFtZSAqLworCQkJc2hvd19vbmVfY29tbWl0KHJldltpXSwgMSk7CisJCQlpZiAoaXNfaGVhZCkKKwkJCQloZWFkX2F0ID0gaTsKKwkJfQorCQlpZiAoMCA8PSBleHRyYSkgeworCQkJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykKKwkJCQlwdXRjaGFyKCctJyk7CisJCQlwdXRjaGFyKCdcbicpOworCQl9CisJfQorCWlmIChleHRyYSA8IDApCisJCWV4aXQoMCk7CisKKwkvKiBTb3J0IHRvcG9sb2dpY2FsbHkgKi8KKwlzb3J0X2luX3RvcG9sb2dpY2FsX29yZGVyKCZzZWVuLCBsaWZvKTsKKworCS8qIEdpdmUgbmFtZXMgdG8gY29tbWl0cyAqLworCWlmICghc2hhMV9uYW1lICYmICFub19uYW1lKQorCQluYW1lX2NvbW1pdHMoc2VlbiwgcmV2LCByZWZfbmFtZSwgbnVtX3Jldik7CisKKwlhbGxfbWFzayA9ICgoMXUgPDwgKFJFVl9TSElGVCArIG51bV9yZXYpKSAtIDEpOworCWFsbF9yZXZzID0gYWxsX21hc2sgJiB+KCgxdSA8PCBSRVZfU0hJRlQpIC0gMSk7CisKKwl3aGlsZSAoc2VlbikgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwb3Bfb25lX2NvbW1pdCgmc2Vlbik7CisJCWludCB0aGlzX2ZsYWcgPSBjb21taXQtPm9iamVjdC5mbGFnczsKKwkJaW50IGlzX21lcmdlX3BvaW50ID0gKCh0aGlzX2ZsYWcgJiBhbGxfcmV2cykgPT0gYWxsX3JldnMpOworCisJCXNob3duX21lcmdlX3BvaW50IHw9IGlzX21lcmdlX3BvaW50OworCisJCWlmICgxIDwgbnVtX3JldikgeworCQkJaW50IGlzX21lcmdlID0gISEoY29tbWl0LT5wYXJlbnRzICYmCisJCQkJCSAgY29tbWl0LT5wYXJlbnRzLT5uZXh0KTsKKwkJCWlmICh0b3BpY3MgJiYKKwkJCSAgICAhaXNfbWVyZ2VfcG9pbnQgJiYKKwkJCSAgICAodGhpc19mbGFnICYgKDF1IDw8IFJFVl9TSElGVCkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGRlbnNlICYmIGlzX21lcmdlICYmCisJCQkgICAgb21pdF9pbl9kZW5zZShjb21taXQsIHJldiwgbnVtX3JldikpCisJCQkJY29udGludWU7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKSB7CisJCQkJaW50IG1hcms7CisJCQkJaWYgKCEodGhpc19mbGFnICYgKDF1IDw8IChpICsgUkVWX1NISUZUKSkpKQorCQkJCQltYXJrID0gJyAnOworCQkJCWVsc2UgaWYgKGlzX21lcmdlKQorCQkJCQltYXJrID0gJy0nOworCQkJCWVsc2UgaWYgKGkgPT0gaGVhZF9hdCkKKwkJCQkJbWFyayA9ICcqJzsKKwkJCQllbHNlCisJCQkJCW1hcmsgPSAnKyc7CisJCQkJcHV0Y2hhcihtYXJrKTsKKwkJCX0KKwkJCXB1dGNoYXIoJyAnKTsKKwkJfQorCQlzaG93X29uZV9jb21taXQoY29tbWl0LCBub19uYW1lKTsKKworCQlpZiAoc2hvd25fbWVyZ2VfcG9pbnQgJiYgLS1leHRyYSA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXRhci10cmVlLmMgYi9idWlsdGluLXRhci10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhOGNjZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdGFyLXRyZWUuYwpAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBSZW5lIFNjaGFyZmUKKyAqLworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInRhci5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorCisjZGVmaW5lIFJFQ09SRFNJWkUJKDUxMikKKyNkZWZpbmUgQkxPQ0tTSVpFCShSRUNPUkRTSVpFICogMjApCisKK3N0YXRpYyBjb25zdCBjaGFyIHRhcl90cmVlX3VzYWdlW10gPQorImdpdC10YXItdHJlZSBbLS1yZW1vdGU9PHJlcG8+XSA8ZW50PiBbYmFzZWRpcl0iOworCitzdGF0aWMgY2hhciBibG9ja1tCTE9DS1NJWkVdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCitzdGF0aWMgdGltZV90IGFyY2hpdmVfdGltZTsKKworLyogdHJpZXMgaGFyZCB0byB3cml0ZSwgZWl0aGVyIHN1Y2NlZWRzIG9yIGRpZXMgaW4gdGhlIGF0dGVtcHQgKi8KK3N0YXRpYyB2b2lkIHJlbGlhYmxlX3dyaXRlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXdoaWxlIChzaXplID4gMCkgeworCQlsb25nIHJldCA9IHh3cml0ZSgxLCBidWYsIHNpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJCWV4aXQoMCk7CisJCQlkaWUoImdpdC10YXItdHJlZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQl9IGVsc2UgaWYgKCFyZXQpIHsKKwkJCWRpZSgiZ2l0LXRhci10cmVlOiBkaXNrIGZ1bGw/Iik7CisJCX0KKwkJc2l6ZSAtPSByZXQ7CisJCWJ1ZiArPSByZXQ7CisJfQorfQorCisvKiB3cml0ZXMgb3V0IHRoZSB3aG9sZSBibG9jaywgYnV0IG9ubHkgaWYgaXQgaXMgZnVsbCAqLworc3RhdGljIHZvaWQgd3JpdGVfaWZfbmVlZGVkKHZvaWQpCit7CisJaWYgKG9mZnNldCA9PSBCTE9DS1NJWkUpIHsKKwkJcmVsaWFibGVfd3JpdGUoYmxvY2ssIEJMT0NLU0laRSk7CisJCW9mZnNldCA9IDA7CisJfQorfQorCisvKiBhY3F1aXJlIHRoZSBuZXh0IHJlY29yZCBmcm9tIHRoZSBidWZmZXI7IHVzZXIgbXVzdCBjYWxsIHdyaXRlX2lmX25lZWRlZCgpICovCitzdGF0aWMgY2hhciAqZ2V0X3JlY29yZCh2b2lkKQoreworCWNoYXIgKnAgPSBibG9jayArIG9mZnNldDsKKwltZW1zZXQocCwgMCwgUkVDT1JEU0laRSk7CisJb2Zmc2V0ICs9IFJFQ09SRFNJWkU7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBUaGUgZW5kIG9mIHRhciBhcmNoaXZlcyBpcyBtYXJrZWQgYnkgMTAyNCBudWwgYnl0ZXMgYW5kIGFmdGVyIHRoYXQKKyAqIGZvbGxvd3MgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrIChpZiBhbnkpLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV90cmFpbGVyKHZvaWQpCit7CisJZ2V0X3JlY29yZCgpOworCXdyaXRlX2lmX25lZWRlZCgpOworCWdldF9yZWNvcmQoKTsKKwl3cml0ZV9pZl9uZWVkZWQoKTsKKwl3aGlsZSAob2Zmc2V0KSB7CisJCWdldF9yZWNvcmQoKTsKKwkJd3JpdGVfaWZfbmVlZGVkKCk7CisJfQorfQorCisvKgorICogcXVldWVzIHVwIHdyaXRlcywgc28gdGhhdCBhbGwgb3VyIHdyaXRlKDIpIGNhbGxzIHdyaXRlIGV4YWN0bHkgb25lCisgKiBmdWxsIGJsb2NrOyBwYWRzIHdyaXRlcyB0byBSRUNPUkRTSVpFCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrZWQodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyB0YWlsOworCisJaWYgKG9mZnNldCkgeworCQl1bnNpZ25lZCBsb25nIGNodW5rID0gQkxPQ0tTSVpFIC0gb2Zmc2V0OworCQlpZiAoc2l6ZSA8IGNodW5rKQorCQkJY2h1bmsgPSBzaXplOworCQltZW1jcHkoYmxvY2sgKyBvZmZzZXQsIGJ1ZiwgY2h1bmspOworCQlzaXplIC09IGNodW5rOworCQlvZmZzZXQgKz0gY2h1bms7CisJCWJ1ZiArPSBjaHVuazsKKwkJd3JpdGVfaWZfbmVlZGVkKCk7CisJfQorCXdoaWxlIChzaXplID49IEJMT0NLU0laRSkgeworCQlyZWxpYWJsZV93cml0ZShidWYsIEJMT0NLU0laRSk7CisJCXNpemUgLT0gQkxPQ0tTSVpFOworCQlidWYgKz0gQkxPQ0tTSVpFOworCX0KKwlpZiAoc2l6ZSkgeworCQltZW1jcHkoYmxvY2sgKyBvZmZzZXQsIGJ1Ziwgc2l6ZSk7CisJCW9mZnNldCArPSBzaXplOworCX0KKwl0YWlsID0gb2Zmc2V0ICUgUkVDT1JEU0laRTsKKwlpZiAodGFpbCkgIHsKKwkJbWVtc2V0KGJsb2NrICsgb2Zmc2V0LCAwLCBSRUNPUkRTSVpFIC0gdGFpbCk7CisJCW9mZnNldCArPSBSRUNPUkRTSVpFIC0gdGFpbDsKKwl9CisJd3JpdGVfaWZfbmVlZGVkKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmJ1Zl9hcHBlbmRfc3RyaW5nKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpzKQoreworCWludCBzbGVuID0gc3RybGVuKHMpOworCWludCB0b3RhbCA9IHNiLT5sZW4gKyBzbGVuOworCWlmICh0b3RhbCA+IHNiLT5hbGxvYykgeworCQlzYi0+YnVmID0geHJlYWxsb2Moc2ItPmJ1ZiwgdG90YWwpOworCQlzYi0+YWxsb2MgPSB0b3RhbDsKKwl9CisJbWVtY3B5KHNiLT5idWYgKyBzYi0+bGVuLCBzLCBzbGVuKTsKKwlzYi0+bGVuID0gdG90YWw7Cit9CisKKy8qCisgKiBwYXggZXh0ZW5kZWQgaGVhZGVyIHJlY29yZHMgaGF2ZSB0aGUgZm9ybWF0ICIldSAlcz0lc1xuIi4gICV1IGNvbnRhaW5zCisgKiB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUgc3RyaW5nIChpbmNsdWRpbmcgdGhlICV1KSwgdGhlIGZpcnN0ICVzIGlzIHRoZQorICoga2V5d29yZCwgdGhlIHNlY29uZCBvbmUgaXMgdGhlIHZhbHVlLiAgVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHN1Y2ggYQorICogc3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIGEgc3RydWN0IHN0cmJ1Zi4KKyAqLworc3RhdGljIHZvaWQgc3RyYnVmX2FwcGVuZF9leHRfaGVhZGVyKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICprZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgdmFsdWVsZW4pCit7CisJY2hhciAqcDsKKwlpbnQgbGVuLCB0b3RhbCwgdG1wOworCisJLyogIiV1ICVzPSVzXG4iICovCisJbGVuID0gMSArIDEgKyBzdHJsZW4oa2V5d29yZCkgKyAxICsgdmFsdWVsZW4gKyAxOworCWZvciAodG1wID0gbGVuOyB0bXAgPiA5OyB0bXAgLz0gMTApCisJCWxlbisrOworCisJdG90YWwgPSBzYi0+bGVuICsgbGVuOworCWlmICh0b3RhbCA+IHNiLT5hbGxvYykgeworCQlzYi0+YnVmID0geHJlYWxsb2Moc2ItPmJ1ZiwgdG90YWwpOworCQlzYi0+YWxsb2MgPSB0b3RhbDsKKwl9CisKKwlwID0gc2ItPmJ1ZjsKKwlwICs9IHNwcmludGYocCwgIiV1ICVzPSIsIGxlbiwga2V5d29yZCk7CisJbWVtY3B5KHAsIHZhbHVlLCB2YWx1ZWxlbik7CisJcCArPSB2YWx1ZWxlbjsKKwkqcCA9ICdcbic7CisJc2ItPmxlbiA9IHRvdGFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHVzdGFyX2hlYWRlcl9jaGtzdW0oY29uc3Qgc3RydWN0IHVzdGFyX2hlYWRlciAqaGVhZGVyKQoreworCWNoYXIgKnAgPSAoY2hhciAqKWhlYWRlcjsKKwl1bnNpZ25lZCBpbnQgY2hrc3VtID0gMDsKKwl3aGlsZSAocCA8IGhlYWRlci0+Y2hrc3VtKQorCQljaGtzdW0gKz0gKnArKzsKKwljaGtzdW0gKz0gc2l6ZW9mKGhlYWRlci0+Y2hrc3VtKSAqICcgJzsKKwlwICs9IHNpemVvZihoZWFkZXItPmNoa3N1bSk7CisJd2hpbGUgKHAgPCAoY2hhciAqKWhlYWRlciArIHNpemVvZihzdHJ1Y3QgdXN0YXJfaGVhZGVyKSkKKwkJY2hrc3VtICs9ICpwKys7CisJcmV0dXJuIGNoa3N1bTsKK30KKworc3RhdGljIGludCBnZXRfcGF0aF9wcmVmaXgoY29uc3Qgc3RydWN0IHN0cmJ1ZiAqcGF0aCwgaW50IG1heGxlbikKK3sKKwlpbnQgaSA9IHBhdGgtPmxlbjsKKwlpZiAoaSA+IG1heGxlbikKKwkJaSA9IG1heGxlbjsKKwlkbyB7CisJCWktLTsKKwl9IHdoaWxlIChpID4gMCAmJiBwYXRoLT5idWZbaV0gIT0gJy8nKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IHN0cmJ1ZiAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgdXN0YXJfaGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3Qgc3RyYnVmIGV4dF9oZWFkZXI7CisKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCWV4dF9oZWFkZXIuYnVmID0gTlVMTDsKKwlleHRfaGVhZGVyLmxlbiA9IGV4dF9oZWFkZXIuYWxsb2MgPSAwOworCisJaWYgKCFzaGExKSB7CisJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19HTE9CQUxfSEVBREVSOworCQltb2RlID0gMDEwMDY2NjsKKwkJc3RyY3B5KGhlYWRlci5uYW1lLCAicGF4X2dsb2JhbF9oZWFkZXIiKTsKKwl9IGVsc2UgaWYgKCFwYXRoKSB7CisJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19FWFRfSEVBREVSOworCQltb2RlID0gMDEwMDY2NjsKKwkJc3ByaW50ZihoZWFkZXIubmFtZSwgIiVzLnBheGhlYWRlciIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9IGVsc2UgeworCQlpZiAoU19JU0RJUihtb2RlKSkgeworCQkJKmhlYWRlci50eXBlZmxhZyA9IFRZUEVGTEFHX0RJUjsKKwkJCW1vZGUgfD0gMDc3NzsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKG1vZGUpKSB7CisJCQkqaGVhZGVyLnR5cGVmbGFnID0gVFlQRUZMQUdfTE5LOworCQkJbW9kZSB8PSAwNzc3OworCQl9IGVsc2UgaWYgKFNfSVNSRUcobW9kZSkpIHsKKwkJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19SRUc7CisJCQltb2RlIHw9IChtb2RlICYgMDEwMCkgPyAwNzc3IDogMDY2NjsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bnN1cHBvcnRlZCBmaWxlIG1vZGU6IDAlbyAoU0hBMTogJXMpIiwKKwkJCSAgICAgIG1vZGUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocGF0aC0+bGVuID4gc2l6ZW9mKGhlYWRlci5uYW1lKSkgeworCQkJaW50IHBsZW4gPSBnZXRfcGF0aF9wcmVmaXgocGF0aCwgc2l6ZW9mKGhlYWRlci5wcmVmaXgpKTsKKwkJCWludCByZXN0ID0gcGF0aC0+bGVuIC0gcGxlbiAtIDE7CisJCQlpZiAocGxlbiA+IDAgJiYgcmVzdCA8PSBzaXplb2YoaGVhZGVyLm5hbWUpKSB7CisJCQkJbWVtY3B5KGhlYWRlci5wcmVmaXgsIHBhdGgtPmJ1ZiwgcGxlbik7CisJCQkJbWVtY3B5KGhlYWRlci5uYW1lLCBwYXRoLT5idWYgKyBwbGVuICsgMSwgcmVzdCk7CisJCQl9IGVsc2UgeworCQkJCXNwcmludGYoaGVhZGVyLm5hbWUsICIlcy5kYXRhIiwKKwkJCQkgICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCQlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJwYXRoIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC0+YnVmLCBwYXRoLT5sZW4pOworCQkJfQorCQl9IGVsc2UKKwkJCW1lbWNweShoZWFkZXIubmFtZSwgcGF0aC0+YnVmLCBwYXRoLT5sZW4pOworCX0KKworCWlmIChTX0lTTE5LKG1vZGUpICYmIGJ1ZmZlcikgeworCQlpZiAoc2l6ZSA+IHNpemVvZihoZWFkZXIubGlua25hbWUpKSB7CisJCQlzcHJpbnRmKGhlYWRlci5saW5rbmFtZSwgInNlZSAlcy5wYXhoZWFkZXIiLAorCQkJICAgICAgICBzaGExX3RvX2hleChzaGExKSk7CisJCQlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJsaW5rcGF0aCIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplKTsKKwkJfSBlbHNlCisJCQltZW1jcHkoaGVhZGVyLmxpbmtuYW1lLCBidWZmZXIsIHNpemUpOworCX0KKworCXNwcmludGYoaGVhZGVyLm1vZGUsICIlMDdvIiwgbW9kZSAmIDA3Nzc3KTsKKwlzcHJpbnRmKGhlYWRlci5zaXplLCAiJTAxMWxvIiwgU19JU1JFRyhtb2RlKSA/IHNpemUgOiAwKTsKKwlzcHJpbnRmKGhlYWRlci5tdGltZSwgIiUwMTFsbyIsIGFyY2hpdmVfdGltZSk7CisKKwkvKiBYWFg6IHNob3VsZCB3ZSBwcm92aWRlIG1vcmUgbWVhbmluZ2Z1bCBpbmZvIGhlcmU/ICovCisJc3ByaW50ZihoZWFkZXIudWlkLCAiJTA3byIsIDApOworCXNwcmludGYoaGVhZGVyLmdpZCwgIiUwN28iLCAwKTsKKwlzdHJuY3B5KGhlYWRlci51bmFtZSwgImdpdCIsIDMxKTsKKwlzdHJuY3B5KGhlYWRlci5nbmFtZSwgImdpdCIsIDMxKTsKKwlzcHJpbnRmKGhlYWRlci5kZXZtYWpvciwgIiUwN28iLCAwKTsKKwlzcHJpbnRmKGhlYWRlci5kZXZtaW5vciwgIiUwN28iLCAwKTsKKworCW1lbWNweShoZWFkZXIubWFnaWMsICJ1c3RhciIsIDYpOworCW1lbWNweShoZWFkZXIudmVyc2lvbiwgIjAwIiwgMik7CisKKwlzcHJpbnRmKGhlYWRlci5jaGtzdW0sICIlMDdvIiwgdXN0YXJfaGVhZGVyX2Noa3N1bSgmaGVhZGVyKSk7CisKKwlpZiAoZXh0X2hlYWRlci5sZW4gPiAwKSB7CisJCXdyaXRlX2VudHJ5KHNoYTEsIE5VTEwsIDAsIGV4dF9oZWFkZXIuYnVmLCBleHRfaGVhZGVyLmxlbik7CisJCWZyZWUoZXh0X2hlYWRlci5idWYpOworCX0KKwl3cml0ZV9ibG9ja2VkKCZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKwlpZiAoU19JU1JFRyhtb2RlKSAmJiBidWZmZXIgJiYgc2l6ZSA+IDApCisJCXdyaXRlX2Jsb2NrZWQoYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZ2xvYmFsX2V4dGVuZGVkX2hlYWRlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdHJidWYgZXh0X2hlYWRlcjsKKwlleHRfaGVhZGVyLmJ1ZiA9IE5VTEw7CisJZXh0X2hlYWRlci5sZW4gPSBleHRfaGVhZGVyLmFsbG9jID0gMDsKKwlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJjb21tZW50Iiwgc2hhMV90b19oZXgoc2hhMSksIDQwKTsKKwl3cml0ZV9lbnRyeShOVUxMLCBOVUxMLCAwLCBleHRfaGVhZGVyLmJ1ZiwgZXh0X2hlYWRlci5sZW4pOworCWZyZWUoZXh0X2hlYWRlci5idWYpOworfQorCitzdGF0aWMgdm9pZCB0cmF2ZXJzZV90cmVlKHN0cnVjdCB0cmVlX2Rlc2MgKnRyZWUsIHN0cnVjdCBzdHJidWYgKnBhdGgpCit7CisJaW50IHBhdGhsZW4gPSBwYXRoLT5sZW47CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSh0cmVlLCAmZW50cnkpKSB7CisJCXZvaWQgKmVsdGJ1ZjsKKwkJY2hhciBlbHR0eXBlWzIwXTsKKwkJdW5zaWduZWQgbG9uZyBlbHRzaXplOworCisJCWVsdGJ1ZiA9IHJlYWRfc2hhMV9maWxlKGVudHJ5LnNoYTEsIGVsdHR5cGUsICZlbHRzaXplKTsKKwkJaWYgKCFlbHRidWYpCisJCQlkaWUoImNhbm5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoZW50cnkuc2hhMSkpOworCisJCXBhdGgtPmxlbiA9IHBhdGhsZW47CisJCXN0cmJ1Zl9hcHBlbmRfc3RyaW5nKHBhdGgsIGVudHJ5LnBhdGgpOworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCXN0cmJ1Zl9hcHBlbmRfc3RyaW5nKHBhdGgsICIvIik7CisKKwkJd3JpdGVfZW50cnkoZW50cnkuc2hhMSwgcGF0aCwgZW50cnkubW9kZSwgZWx0YnVmLCBlbHRzaXplKTsKKworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJc3RydWN0IHRyZWVfZGVzYyBzdWJ0cmVlOworCQkJc3VidHJlZS5idWYgPSBlbHRidWY7CisJCQlzdWJ0cmVlLnNpemUgPSBlbHRzaXplOworCQkJdHJhdmVyc2VfdHJlZSgmc3VidHJlZSwgcGF0aCk7CisJCX0KKwkJZnJlZShlbHRidWYpOworCX0KK30KKworc3RhdGljIGludCBnZW5lcmF0ZV90YXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyKiogZW52cCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCB0cmVlX3NoYTFbMjBdOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHRyZWU7CisJc3RydWN0IHN0cmJ1ZiBjdXJyZW50X3BhdGg7CisKKwljdXJyZW50X3BhdGguYnVmID0geG1hbGxvYyhQQVRIX01BWCk7CisJY3VycmVudF9wYXRoLmFsbG9jID0gUEFUSF9NQVg7CisJY3VycmVudF9wYXRoLmxlbiA9IGN1cnJlbnRfcGF0aC5lb2YgPSAwOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMzoKKwkJc3RyYnVmX2FwcGVuZF9zdHJpbmcoJmN1cnJlbnRfcGF0aCwgYXJndlsyXSk7CisJCXN0cmJ1Zl9hcHBlbmRfc3RyaW5nKCZjdXJyZW50X3BhdGgsICIvIik7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAyOgorCQlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkpCisJCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVzYWdlKHRhcl90cmVlX3VzYWdlKTsKKwl9CisKKwljb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJaWYgKGNvbW1pdCkgeworCQl3cml0ZV9nbG9iYWxfZXh0ZW5kZWRfaGVhZGVyKGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCQlhcmNoaXZlX3RpbWUgPSBjb21taXQtPmRhdGU7CisJfSBlbHNlCisJCWFyY2hpdmVfdGltZSA9IHRpbWUoTlVMTCk7CisKKwl0cmVlLmJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsIHRyZWVfdHlwZSwgJnRyZWUuc2l6ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVfc2hhMSk7CisJaWYgKCF0cmVlLmJ1ZikKKwkJZGllKCJub3QgYSByZWZlcmVuY2UgdG8gYSB0YWcsIGNvbW1pdCBvciB0cmVlIG9iamVjdDogJXMiLAorCQkgICAgc2hhMV90b19oZXgoc2hhMSkpOworCisJaWYgKGN1cnJlbnRfcGF0aC5sZW4gPiAwKQorCQl3cml0ZV9lbnRyeSh0cmVlX3NoYTEsICZjdXJyZW50X3BhdGgsIDA0MDc3NywgTlVMTCwgMCk7CisJdHJhdmVyc2VfdHJlZSgmdHJlZSwgJmN1cnJlbnRfcGF0aCk7CisJd3JpdGVfdHJhaWxlcigpOworCWZyZWUoY3VycmVudF9wYXRoLmJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpleGVjID0gImdpdC11cGxvYWQtdGFyIjsKKworc3RhdGljIGludCByZW1vdGVfdGFyKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmRbMl0sIHJldCwgbGVuOworCXBpZF90IHBpZDsKKwljaGFyIGJ1ZlsxMDI0XTsKKwljaGFyICp1cmw7CisKKwlpZiAoYXJnYyA8IDMgfHwgNCA8IGFyZ2MpCisJCXVzYWdlKHRhcl90cmVlX3VzYWdlKTsKKworCS8qIC0tcmVtb3RlPTxyZXBvPiAqLworCXVybCA9IHN0cmR1cChhcmd2WzFdKzkpOworCXBpZCA9IGdpdF9jb25uZWN0KGZkLCB1cmwsIGV4ZWMpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gMTsKKworCXBhY2tldF93cml0ZShmZFsxXSwgIndhbnQgJXNcbiIsIGFyZ3ZbMl0pOworCWlmIChhcmd2WzNdKQorCQlwYWNrZXRfd3JpdGUoZmRbMV0sICJiYXNlICVzXG4iLCBhcmd2WzNdKTsKKwlwYWNrZXRfZmx1c2goZmRbMV0pOworCisJbGVuID0gcGFja2V0X3JlYWRfbGluZShmZFswXSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKCFsZW4pCisJCWRpZSgiZ2l0LXRhci10cmVlOiBleHBlY3RlZCBBQ0svTkFLLCBnb3QgRU9GIik7CisJaWYgKGJ1ZltsZW4tMV0gPT0gJ1xuJykKKwkJYnVmWy0tbGVuXSA9IDA7CisJaWYgKHN0cmNtcChidWYsICJBQ0siKSkgeworCQlpZiAoNSA8IGxlbiAmJiAhc3RybmNtcChidWYsICJOQUNLICIsIDUpKQorCQkJZGllKCJnaXQtdGFyLXRyZWU6IE5BQ0sgJXMiLCBidWYgKyA1KTsKKwkJZGllKCJnaXQtdGFyLXRyZWU6IHByb3RvY29sIGVycm9yIik7CisJfQorCS8qIGV4cGVjdCBhIGZsdXNoICovCisJbGVuID0gcGFja2V0X3JlYWRfbGluZShmZFswXSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKGxlbikKKwkJZGllKCJnaXQtdGFyLXRyZWU6IGV4cGVjdGVkIGEgZmx1c2giKTsKKworCS8qIE5vdywgc3RhcnQgcmVhZGluZyBmcm9tIGZkWzBdIGFuZCBzcGl0IGl0IG91dCB0byBzdGRvdXQgKi8KKwlyZXQgPSBjb3B5X2ZkKGZkWzBdLCAxKTsKKwljbG9zZShmZFswXSk7CisKKwlyZXQgfD0gZmluaXNoX2Nvbm5lY3QocGlkKTsKKwlyZXR1cm4gISFyZXQ7Cit9CisKK2ludCBjbWRfdGFyX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwlpZiAoYXJnYyA8IDIpCisJCXVzYWdlKHRhcl90cmVlX3VzYWdlKTsKKwlpZiAoIXN0cm5jbXAoIi0tcmVtb3RlPSIsIGFyZ3ZbMV0sIDkpKQorCQlyZXR1cm4gcmVtb3RlX3RhcihhcmdjLCBhcmd2KTsKKwlyZXR1cm4gZ2VuZXJhdGVfdGFyKGFyZ2MsIGFyZ3YsIGVudnApOworfQorCisvKiB1c3RhciBoZWFkZXIgKyBleHRlbmRlZCBnbG9iYWwgaGVhZGVyIGNvbnRlbnQgKi8KKyNkZWZpbmUgSEVBREVSU0laRSAoMiAqIFJFQ09SRFNJWkUpCisKK2ludCBjbWRfZ2V0X3Rhcl9jb21taXRfaWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKwljaGFyIGJ1ZmZlcltIRUFERVJTSVpFXTsKKwlzdHJ1Y3QgdXN0YXJfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IHVzdGFyX2hlYWRlciAqKWJ1ZmZlcjsKKwljaGFyICpjb250ZW50ID0gYnVmZmVyICsgUkVDT1JEU0laRTsKKwlzc2l6ZV90IG47CisKKwluID0geHJlYWQoMCwgYnVmZmVyLCBIRUFERVJTSVpFKTsKKwlpZiAobiA8IEhFQURFUlNJWkUpCisJCWRpZSgiZ2l0LWdldC10YXItY29tbWl0LWlkOiByZWFkIGVycm9yIik7CisJaWYgKGhlYWRlci0+dHlwZWZsYWdbMF0gIT0gJ2cnKQorCQlyZXR1cm4gMTsKKwlpZiAobWVtY21wKGNvbnRlbnQsICI1MiBjb21tZW50PSIsIDExKSkKKwkJcmV0dXJuIDE7CisKKwluID0geHdyaXRlKDEsIGNvbnRlbnQgKyAxMSwgNDEpOworCWlmIChuIDwgNDEpCisJCWRpZSgiZ2l0LWdldC10YXItY29tbWl0LWlkOiB3cml0ZSBlcnJvciIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXVwbG9hZC10YXIuYyBiL2J1aWx0aW4tdXBsb2FkLXRhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmE3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXVwbG9hZC10YXIuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHVwbG9hZF90YXJfdXNhZ2VbXSA9ICJnaXQtdXBsb2FkLXRhciA8cmVwbz4iOworCitzdGF0aWMgaW50IG5hayhjb25zdCBjaGFyICpyZWFzb24pCit7CisJcGFja2V0X3dyaXRlKDEsICJOQUNLICVzXG4iLCByZWFzb24pOworCXBhY2tldF9mbHVzaCgxKTsKKwlyZXR1cm4gMTsKK30KKworaW50IGNtZF91cGxvYWRfdGFyKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpkaXIgPSBhcmd2WzFdOworCWNoYXIgYnVmWzgxOTJdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqYmFzZSA9IE5VTEw7CisJY2hhciBoZXhbNDFdOworCWludCBhYzsKKwljb25zdCBjaGFyICphdls0XTsKKworCWlmIChhcmdjICE9IDIpCisJCXVzYWdlKHVwbG9hZF90YXJfdXNhZ2UpOworCWlmIChzdHJsZW4oZGlyKSA8IHNpemVvZihidWYpLTEpCisJCXN0cmNweShidWYsIGRpcik7IC8qIGVudGVyLXJlcG8gc211ZGdlcyBpdHMgYXJndW1lbnQgKi8KKwllbHNlCisJCXBhY2tldF93cml0ZSgxLCAiTkFDSyBpbnNhbmVseSBsb25nIHJlcG9zaXRvcnkgbmFtZSAlc1xuIiwgZGlyKTsKKwlpZiAoIWVudGVyX3JlcG8oYnVmLCAwKSkgeworCQlwYWNrZXRfd3JpdGUoMSwgIk5BQ0sgbm90IGEgZ2l0IGFyY2hpdmUgJXNcbiIsIGRpcik7CisJCXBhY2tldF9mbHVzaCgxKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAobGVuIDwgNSB8fCBzdHJuY21wKCJ3YW50ICIsIGJ1ZiwgNSkpCisJCXJldHVybiBuYWsoImV4cGVjdGVkIHdhbnQiKTsKKwlpZiAoYnVmW2xlbi0xXSA9PSAnXG4nKQorCQlidWZbLS1sZW5dID0gMDsKKwlpZiAoZ2V0X3NoYTEoYnVmICsgNSwgc2hhMSkpCisJCXJldHVybiBuYWsoImV4cGVjdGVkIHNoYTEiKTsKKyAgICAgICAgc3RyY3B5KGhleCwgc2hhMV90b19oZXgoc2hhMSkpOworCisJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAobGVuKSB7CisJCWlmIChsZW4gPCA1IHx8IHN0cm5jbXAoImJhc2UgIiwgYnVmLCA1KSkKKwkJCXJldHVybiBuYWsoImV4cGVjdGVkIChvcHRpb25hbCkgYmFzZSIpOworCQlpZiAoYnVmW2xlbi0xXSA9PSAnXG4nKQorCQkJYnVmWy0tbGVuXSA9IDA7CisJCWJhc2UgPSBzdHJkdXAoYnVmICsgNSk7CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgYnVmLCBzaXplb2YoYnVmKSk7CisJfQorCWlmIChsZW4pCisJCXJldHVybiBuYWsoImV4cGVjdGVkIGZsdXNoIik7CisKKwlwYWNrZXRfd3JpdGUoMSwgIkFDS1xuIik7CisJcGFja2V0X2ZsdXNoKDEpOworCisJYWMgPSAwOworCWF2W2FjKytdID0gInRhci10cmVlIjsKKwlhdlthYysrXSA9IGhleDsKKwlpZiAoYmFzZSkKKwkJYXZbYWMrK10gPSBiYXNlOworCWF2W2FjKytdID0gTlVMTDsKKwlleGVjdl9naXRfY21kKGF2KTsKKwkvKiBzaG91bGQgaXQgcmV0dXJuIHRoYXQgaXMgYW4gZXJyb3IgKi8KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4uaCBiL2J1aWx0aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWYzNmJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgQlVJTFRJTl9ICisjZGVmaW5lIEJVSUxUSU5fSAorCisjaWZuZGVmIFBBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCA0MDk2CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IGNoYXIgZ2l0X3ZlcnNpb25fc3RyaW5nW107CisKK3ZvaWQgY21kX3VzYWdlKGludCBzaG93X2FsbCwgY29uc3QgY2hhciAqZXhlY19wYXRoLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKyNpZmRlZiBfX0dOVUNfXworCV9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXywgMywgNCksIF9fbm9yZXR1cm5fXykpCisjZW5kaWYKKwk7CisKK2V4dGVybiBpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF92ZXJzaW9uKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworCitleHRlcm4gaW50IGNtZF93aGF0Y2hhbmdlZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX3Nob3coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9sb2coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9kaWZmKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworZXh0ZXJuIGludCBjbWRfZm9ybWF0X3BhdGNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworZXh0ZXJuIGludCBjbWRfY291bnRfb2JqZWN0cyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKKworZXh0ZXJuIGludCBjbWRfcHVzaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX2dyZXAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9ybShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX2FkZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX3Jldl9saXN0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworZXh0ZXJuIGludCBjbWRfY2hlY2tfcmVmX2Zvcm1hdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX2luaXRfZGIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF90YXJfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX3VwbG9hZF90YXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9nZXRfdGFyX2NvbW1pdF9pZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX2xzX2ZpbGVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworZXh0ZXJuIGludCBjbWRfbHNfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX3JlYWRfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX2NvbW1pdF90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworZXh0ZXJuIGludCBjbWRfYXBwbHkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9zaG93X2JyYW5jaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX2RpZmZfZmlsZXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9kaWZmX2luZGV4KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworZXh0ZXJuIGludCBjbWRfZGlmZl9zdGFnZXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9kaWZmX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCk7CitleHRlcm4gaW50IGNtZF9jYXRfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKK2V4dGVybiBpbnQgY21kX3Jldl9wYXJzZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jYWNoZS10cmVlLmMgYi9jYWNoZS10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4MGM5NwotLS0gL2Rldi9udWxsCisrKyBiL2NhY2hlLXRyZWUuYwpAQCAtMCwwICsxLDUzMSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworI2RlZmluZSBERUJVRyAwCisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlKHZvaWQpCit7CisJc3RydWN0IGNhY2hlX3RyZWUgKml0ID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGNhY2hlX3RyZWUpKTsKKwlpdC0+ZW50cnlfY291bnQgPSAtMTsKKwlyZXR1cm4gaXQ7Cit9CisKK3ZvaWQgY2FjaGVfdHJlZV9mcmVlKHN0cnVjdCBjYWNoZV90cmVlICoqaXRfcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQgPSAqaXRfcDsKKworCWlmICghaXQpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykKKwkJaWYgKGl0LT5kb3duW2ldKQorCQkJY2FjaGVfdHJlZV9mcmVlKCZpdC0+ZG93bltpXS0+Y2FjaGVfdHJlZSk7CisJZnJlZShpdC0+ZG93bik7CisJZnJlZShpdCk7CisJKml0X3AgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHN1YnRyZWVfbmFtZV9jbXAoY29uc3QgY2hhciAqb25lLCBpbnQgb25lbGVuLAorCQkJICAgIGNvbnN0IGNoYXIgKnR3bywgaW50IHR3b2xlbikKK3sKKwlpZiAob25lbGVuIDwgdHdvbGVuKQorCQlyZXR1cm4gLTE7CisJaWYgKHR3b2xlbiA8IG9uZWxlbikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIG1lbWNtcChvbmUsIHR3bywgb25lbGVuKTsKK30KKworc3RhdGljIGludCBzdWJ0cmVlX3BvcyhzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBwYXRobGVuKQoreworCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqKmRvd24gPSBpdC0+ZG93bjsKKwlpbnQgbG8sIGhpOworCWxvID0gMDsKKwloaSA9IGl0LT5zdWJ0cmVlX25yOworCXdoaWxlIChsbyA8IGhpKSB7CisJCWludCBtaSA9IChsbyArIGhpKSAvIDI7CisJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqbWRsID0gZG93blttaV07CisJCWludCBjbXAgPSBzdWJ0cmVlX25hbWVfY21wKHBhdGgsIHBhdGhsZW4sCisJCQkJCSAgIG1kbC0+bmFtZSwgbWRsLT5uYW1lbGVuKTsKKwkJaWYgKCFjbXApCisJCQlyZXR1cm4gbWk7CisJCWlmIChjbXAgPCAwKQorCQkJaGkgPSBtaTsKKwkJZWxzZQorCQkJbG8gPSBtaSArIDE7CisJfQorCXJldHVybiAtbG8tMTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV90cmVlX3N1YiAqZmluZF9zdWJ0cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJCQkJICAgY29uc3QgY2hhciAqcGF0aCwKKwkJCQkJICAgaW50IHBhdGhsZW4sCisJCQkJCSAgIGludCBjcmVhdGUpCit7CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpkb3duOworCWludCBwb3MgPSBzdWJ0cmVlX3BvcyhpdCwgcGF0aCwgcGF0aGxlbik7CisJaWYgKDAgPD0gcG9zKQorCQlyZXR1cm4gaXQtPmRvd25bcG9zXTsKKwlpZiAoIWNyZWF0ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwb3MgPSAtcG9zLTE7CisJaWYgKGl0LT5zdWJ0cmVlX2FsbG9jIDw9IGl0LT5zdWJ0cmVlX25yKSB7CisJCWl0LT5zdWJ0cmVlX2FsbG9jID0gYWxsb2NfbnIoaXQtPnN1YnRyZWVfYWxsb2MpOworCQlpdC0+ZG93biA9IHhyZWFsbG9jKGl0LT5kb3duLCBpdC0+c3VidHJlZV9hbGxvYyAqCisJCQkJICAgIHNpemVvZigqaXQtPmRvd24pKTsKKwl9CisJaXQtPnN1YnRyZWVfbnIrKzsKKworCWRvd24gPSB4bWFsbG9jKHNpemVvZigqZG93bikgKyBwYXRobGVuICsgMSk7CisJZG93bi0+Y2FjaGVfdHJlZSA9IE5VTEw7CisJZG93bi0+bmFtZWxlbiA9IHBhdGhsZW47CisJbWVtY3B5KGRvd24tPm5hbWUsIHBhdGgsIHBhdGhsZW4pOworCWRvd24tPm5hbWVbcGF0aGxlbl0gPSAwOworCisJaWYgKHBvcyA8IGl0LT5zdWJ0cmVlX25yKQorCQltZW1tb3ZlKGl0LT5kb3duICsgcG9zICsgMSwKKwkJCWl0LT5kb3duICsgcG9zLAorCQkJc2l6ZW9mKGRvd24pICogKGl0LT5zdWJ0cmVlX25yIC0gcG9zIC0gMSkpOworCWl0LT5kb3duW3Bvc10gPSBkb3duOworCXJldHVybiBkb3duOworfQorCitzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmNhY2hlX3RyZWVfc3ViKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKwlyZXR1cm4gZmluZF9zdWJ0cmVlKGl0LCBwYXRoLCBwYXRobGVuLCAxKTsKK30KKwordm9pZCBjYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJLyogYS9iL2MKKwkgKiA9PT4gaW52YWxpZGF0ZSBzZWxmCisJICogPT0+IGZpbmQgImEiLCBoYXZlIGl0IGludmFsaWRhdGUgImIvYyIKKwkgKiBhCisJICogPT0+IGludmFsaWRhdGUgc2VsZgorCSAqID09PiBpZiAiYSIgZXhpc3RzIGFzIGEgc3VidHJlZSwgcmVtb3ZlIGl0LgorCSAqLworCWNvbnN0IGNoYXIgKnNsYXNoOworCWludCBuYW1lbGVuOworCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqZG93bjsKKworI2lmIERFQlVHCisJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIGludmFsaWRhdGUgPCVzPlxuIiwgcGF0aCk7CisjZW5kaWYKKworCWlmICghaXQpCisJCXJldHVybjsKKwlzbGFzaCA9IHN0cmNocihwYXRoLCAnLycpOworCWl0LT5lbnRyeV9jb3VudCA9IC0xOworCWlmICghc2xhc2gpIHsKKwkJaW50IHBvczsKKwkJbmFtZWxlbiA9IHN0cmxlbihwYXRoKTsKKwkJcG9zID0gc3VidHJlZV9wb3MoaXQsIHBhdGgsIG5hbWVsZW4pOworCQlpZiAoMCA8PSBwb3MpIHsKKwkJCWNhY2hlX3RyZWVfZnJlZSgmaXQtPmRvd25bcG9zXS0+Y2FjaGVfdHJlZSk7CisJCQlmcmVlKGl0LT5kb3duW3Bvc10pOworCQkJLyogMCAxIDIgMyA0IDUKKwkJCSAqICAgICAgIF4gICAgIF5zdWJ0cmVlX25yID0gNgorCQkJICogICAgICAgcG9zCisJCQkgKiBtb3ZlIDQgYW5kIDUgdXAgb25lIHBsYWNlICgyIGVudHJpZXMpCisJCQkgKiAyID0gNiAtIDMgLSAxID0gc3VidHJlZV9uciAtIHBvcyAtIDEKKwkJCSAqLworCQkJbWVtbW92ZShpdC0+ZG93bitwb3MsIGl0LT5kb3duK3BvcysxLAorCQkJCXNpemVvZihzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKikgKgorCQkJCShpdC0+c3VidHJlZV9uciAtIHBvcyAtIDEpKTsKKwkJCWl0LT5zdWJ0cmVlX25yLS07CisJCX0KKwkJcmV0dXJuOworCX0KKwluYW1lbGVuID0gc2xhc2ggLSBwYXRoOworCWRvd24gPSBmaW5kX3N1YnRyZWUoaXQsIHBhdGgsIG5hbWVsZW4sIDApOworCWlmIChkb3duKQorCQljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChkb3duLT5jYWNoZV90cmVlLCBzbGFzaCArIDEpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jYWNoZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipjYWNoZSwKKwkJCWludCBlbnRyaWVzKQoreworCWludCBpLCBmdW5ueTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSB0cmVlIGlzIG1lcmdlZCAqLworCWZ1bm55ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBjYWNoZVtpXTsKKwkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJaWYgKDEwIDwgKytmdW5ueSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiLi4uXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHVubWVyZ2VkICglcylcbiIsCisJCQkJY2UtPm5hbWUsIHNoYTFfdG9faGV4KGNlLT5zaGExKSk7CisJCX0KKwl9CisJaWYgKGZ1bm55KQorCQlyZXR1cm4gLTE7CisKKwkvKiBBbHNvIHZlcmlmeSB0aGF0IHRoZSBjYWNoZSBkb2VzIG5vdCBoYXZlIHBhdGggYW5kIHBhdGgvZmlsZQorCSAqIGF0IHRoZSBzYW1lIHRpbWUuICBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIGNhY2hlIGhhcyBvbmx5CisJICogc3RhZ2UgMCBlbnRyaWVzLgorCSAqLworCWZ1bm55ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAtIDE7IGkrKykgeworCQkvKiBwYXRoL2ZpbGUgYWx3YXlzIGNvbWVzIGFmdGVyIHBhdGggYmVjYXVzZSBvZiB0aGUgd2F5CisJCSAqIHRoZSBjYWNoZSBpcyBzb3J0ZWQuICBBbHNvIHBhdGggY2FuIGFwcGVhciBvbmx5IG9uY2UsCisJCSAqIHdoaWNoIG1lYW5zIGNvbmZsaWN0aW5nIG9uZSB3b3VsZCBpbW1lZGlhdGVseSBmb2xsb3cuCisJCSAqLworCQljb25zdCBjaGFyICp0aGlzX25hbWUgPSBjYWNoZVtpXS0+bmFtZTsKKwkJY29uc3QgY2hhciAqbmV4dF9uYW1lID0gY2FjaGVbaSsxXS0+bmFtZTsKKwkJaW50IHRoaXNfbGVuID0gc3RybGVuKHRoaXNfbmFtZSk7CisJCWlmICh0aGlzX2xlbiA8IHN0cmxlbihuZXh0X25hbWUpICYmCisJCSAgICBzdHJuY21wKHRoaXNfbmFtZSwgbmV4dF9uYW1lLCB0aGlzX2xlbikgPT0gMCAmJgorCQkgICAgbmV4dF9uYW1lW3RoaXNfbGVuXSA9PSAnLycpIHsKKwkJCWlmICgxMCA8ICsrZnVubnkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIi4uLlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmcHJpbnRmKHN0ZGVyciwgIllvdSBoYXZlIGJvdGggJXMgYW5kICVzXG4iLAorCQkJCXRoaXNfbmFtZSwgbmV4dF9uYW1lKTsKKwkJfQorCX0KKwlpZiAoZnVubnkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlzY2FyZF91bnVzZWRfc3VidHJlZXMoc3RydWN0IGNhY2hlX3RyZWUgKml0KQoreworCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqKmRvd24gPSBpdC0+ZG93bjsKKwlpbnQgbnIgPSBpdC0+c3VidHJlZV9ucjsKKwlpbnQgZHN0LCBzcmM7CisJZm9yIChkc3QgPSBzcmMgPSAwOyBzcmMgPCBucjsgc3JjKyspIHsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzID0gZG93bltzcmNdOworCQlpZiAocy0+dXNlZCkKKwkJCWRvd25bZHN0KytdID0gczsKKwkJZWxzZSB7CisJCQljYWNoZV90cmVlX2ZyZWUoJnMtPmNhY2hlX3RyZWUpOworCQkJZnJlZShzKTsKKwkJCWl0LT5zdWJ0cmVlX25yLS07CisJCX0KKwl9Cit9CisKK2ludCBjYWNoZV90cmVlX2Z1bGx5X3ZhbGlkKHN0cnVjdCBjYWNoZV90cmVlICppdCkKK3sKKwlpbnQgaTsKKwlpZiAoIWl0KQorCQlyZXR1cm4gMDsKKwlpZiAoaXQtPmVudHJ5X2NvdW50IDwgMCB8fCAhaGFzX3NoYTFfZmlsZShpdC0+c2hhMSkpCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKSB7CisJCWlmICghY2FjaGVfdHJlZV9mdWxseV92YWxpZChpdC0+ZG93bltpXS0+Y2FjaGVfdHJlZSkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX29uZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsCisJCSAgICAgIHN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlLAorCQkgICAgICBpbnQgZW50cmllcywKKwkJICAgICAgY29uc3QgY2hhciAqYmFzZSwKKwkJICAgICAgaW50IGJhc2VsZW4sCisJCSAgICAgIGludCBtaXNzaW5nX29rLAorCQkgICAgICBpbnQgZHJ5cnVuKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb2Zmc2V0OworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgaTsKKworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCAmJiBoYXNfc2hhMV9maWxlKGl0LT5zaGExKSkKKwkJcmV0dXJuIGl0LT5lbnRyeV9jb3VudDsKKworCS8qCisJICogV2UgZmlyc3Qgc2NhbiBmb3Igc3VidHJlZXMgYW5kIHVwZGF0ZSB0aGVtOyB3ZSBzdGFydCBieQorCSAqIG1hcmtpbmcgZXhpc3Rpbmcgc3VidHJlZXMgLS0gdGhlIG9uZXMgdGhhdCBhcmUgdW5tYXJrZWQKKwkgKiBzaG91bGQgbm90IGJlIGluIHRoZSByZXN1bHQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspCisJCWl0LT5kb3duW2ldLT51c2VkID0gMDsKKworCS8qCisJICogRmluZCB0aGUgc3VidHJlZXMgYW5kIHVwZGF0ZSB0aGVtLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGNhY2hlW2ldOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnN1YjsKKwkJY29uc3QgY2hhciAqcGF0aCwgKnNsYXNoOworCQlpbnQgcGF0aGxlbiwgc3VibGVuLCBzdWJjbnQ7CisKKwkJcGF0aCA9IGNlLT5uYW1lOworCQlwYXRobGVuID0gY2VfbmFtZWxlbihjZSk7CisJCWlmIChwYXRobGVuIDw9IGJhc2VsZW4gfHwgbWVtY21wKGJhc2UsIHBhdGgsIGJhc2VsZW4pKQorCQkJYnJlYWs7IC8qIGF0IHRoZSBlbmQgb2YgdGhpcyBsZXZlbCAqLworCisJCXNsYXNoID0gc3RyY2hyKHBhdGggKyBiYXNlbGVuLCAnLycpOworCQlpZiAoIXNsYXNoKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIGEvYmJiL2MgKGJhc2UgPSBhLywgc2xhc2ggPSAvYykKKwkJICogPT0+CisJCSAqIHBhdGgrYmFzZWxlbiA9IGJiYi9jLCBzdWJsZW4gPSAzCisJCSAqLworCQlzdWJsZW4gPSBzbGFzaCAtIChwYXRoICsgYmFzZWxlbik7CisJCXN1YiA9IGZpbmRfc3VidHJlZShpdCwgcGF0aCArIGJhc2VsZW4sIHN1YmxlbiwgMSk7CisJCWlmICghc3ViLT5jYWNoZV90cmVlKQorCQkJc3ViLT5jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCQlzdWJjbnQgPSB1cGRhdGVfb25lKHN1Yi0+Y2FjaGVfdHJlZSwKKwkJCQkgICAgY2FjaGUgKyBpLCBlbnRyaWVzIC0gaSwKKwkJCQkgICAgcGF0aCwKKwkJCQkgICAgYmFzZWxlbiArIHN1YmxlbiArIDEsCisJCQkJICAgIG1pc3Npbmdfb2ssCisJCQkJICAgIGRyeXJ1bik7CisJCWkgKz0gc3ViY250IC0gMTsKKwkJc3ViLT51c2VkID0gMTsKKwl9CisKKwlkaXNjYXJkX3VudXNlZF9zdWJ0cmVlcyhpdCk7CisKKwkvKgorCSAqIFRoZW4gd3JpdGUgb3V0IHRoZSB0cmVlIG9iamVjdCBmb3IgdGhpcyBsZXZlbC4KKwkgKi8KKwlzaXplID0gODE5MjsKKwlidWZmZXIgPSB4bWFsbG9jKHNpemUpOworCW9mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBjYWNoZVtpXTsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWI7CisJCWNvbnN0IGNoYXIgKnBhdGgsICpzbGFzaDsKKwkJaW50IHBhdGhsZW4sIGVudGxlbjsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJdW5zaWduZWQgbW9kZTsKKworCQlwYXRoID0gY2UtPm5hbWU7CisJCXBhdGhsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJaWYgKHBhdGhsZW4gPD0gYmFzZWxlbiB8fCBtZW1jbXAoYmFzZSwgcGF0aCwgYmFzZWxlbikpCisJCQlicmVhazsgLyogYXQgdGhlIGVuZCBvZiB0aGlzIGxldmVsICovCisKKwkJc2xhc2ggPSBzdHJjaHIocGF0aCArIGJhc2VsZW4sICcvJyk7CisJCWlmIChzbGFzaCkgeworCQkJZW50bGVuID0gc2xhc2ggLSAocGF0aCArIGJhc2VsZW4pOworCQkJc3ViID0gZmluZF9zdWJ0cmVlKGl0LCBwYXRoICsgYmFzZWxlbiwgZW50bGVuLCAwKTsKKwkJCWlmICghc3ViKQorCQkJCWRpZSgiY2FjaGUtdHJlZS5jOiAnJS4qcycgaW4gJyVzJyBub3QgZm91bmQiLAorCQkJCSAgICBlbnRsZW4sIHBhdGggKyBiYXNlbGVuLCBwYXRoKTsKKwkJCWkgKz0gc3ViLT5jYWNoZV90cmVlLT5lbnRyeV9jb3VudCAtIDE7CisJCQlzaGExID0gc3ViLT5jYWNoZV90cmVlLT5zaGExOworCQkJbW9kZSA9IFNfSUZESVI7CisJCX0KKwkJZWxzZSB7CisJCQlzaGExID0gY2UtPnNoYTE7CisJCQltb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCQkJZW50bGVuID0gcGF0aGxlbiAtIGJhc2VsZW47CisJCX0KKwkJaWYgKCFtaXNzaW5nX29rICYmICFoYXNfc2hhMV9maWxlKHNoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJpbnZhbGlkIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCQlpZiAoIWNlLT5jZV9tb2RlKQorCQkJY29udGludWU7IC8qIGVudHJ5IGJlaW5nIHJlbW92ZWQgKi8KKworCQlpZiAoc2l6ZSA8IG9mZnNldCArIGVudGxlbiArIDEwMCkgeworCQkJc2l6ZSA9IGFsbG9jX25yKG9mZnNldCArIGVudGxlbiArIDEwMCk7CisJCQlidWZmZXIgPSB4cmVhbGxvYyhidWZmZXIsIHNpemUpOworCQl9CisJCW9mZnNldCArPSBzcHJpbnRmKGJ1ZmZlciArIG9mZnNldCwKKwkJCQkgICIlbyAlLipzIiwgbW9kZSwgZW50bGVuLCBwYXRoICsgYmFzZWxlbik7CisJCWJ1ZmZlcltvZmZzZXQrK10gPSAwOworCQltZW1jcHkoYnVmZmVyICsgb2Zmc2V0LCBzaGExLCAyMCk7CisJCW9mZnNldCArPSAyMDsKKworI2lmIERFQlVHCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSB1cGRhdGUtb25lICVvICUuKnNcbiIsCisJCQltb2RlLCBlbnRsZW4sIHBhdGggKyBiYXNlbGVuKTsKKyNlbmRpZgorCX0KKworCWlmIChkcnlydW4pIHsKKwkJdW5zaWduZWQgY2hhciBoZHJbMjAwXTsKKwkJaW50IGhkcmxlbjsKKwkJd3JpdGVfc2hhMV9maWxlX3ByZXBhcmUoYnVmZmVyLCBvZmZzZXQsIHRyZWVfdHlwZSwgaXQtPnNoYTEsCisJCQkJCWhkciwgJmhkcmxlbik7CisJfQorCWVsc2UKKwkJd3JpdGVfc2hhMV9maWxlKGJ1ZmZlciwgb2Zmc2V0LCB0cmVlX3R5cGUsIGl0LT5zaGExKTsKKwlmcmVlKGJ1ZmZlcik7CisJaXQtPmVudHJ5X2NvdW50ID0gaTsKKyNpZiBERUJVRworCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSB1cGRhdGUtb25lICglZCBlbnQsICVkIHN1YnRyZWUpICVzXG4iLAorCQlpdC0+ZW50cnlfY291bnQsIGl0LT5zdWJ0cmVlX25yLAorCQlzaGExX3RvX2hleChpdC0+c2hhMSkpOworI2VuZGlmCisJcmV0dXJuIGk7Cit9CisKK2ludCBjYWNoZV90cmVlX3VwZGF0ZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsCisJCSAgICAgIHN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlLAorCQkgICAgICBpbnQgZW50cmllcywKKwkJICAgICAgaW50IG1pc3Npbmdfb2ssCisJCSAgICAgIGludCBkcnlydW4pCit7CisJaW50IGk7CisJaSA9IHZlcmlmeV9jYWNoZShjYWNoZSwgZW50cmllcyk7CisJaWYgKGkpCisJCXJldHVybiBpOworCWkgPSB1cGRhdGVfb25lKGl0LCBjYWNoZSwgZW50cmllcywgIiIsIDAsIG1pc3Npbmdfb2ssIGRyeXJ1bik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKndyaXRlX29uZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsCisJCSAgICAgICBjaGFyICpwYXRoLAorCQkgICAgICAgaW50IHBhdGhsZW4sCisJCSAgICAgICBjaGFyICpidWZmZXIsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaXplLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb2Zmc2V0KQoreworCWludCBpOworCisJLyogT25lICJjYWNoZS10cmVlIiBlbnRyeSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nOgorCSAqIHBhdGggKE5VTCB0ZXJtaW5hdGVkKQorCSAqIGVudHJ5X2NvdW50LCBzdWJ0cmVlX25yICgiJWQgJWRcbiIpCisJICogdHJlZS1zaGExIChtaXNzaW5nIGlmIGludmFsaWQpCisJICogc3VidHJlZV9uciAiY2FjaGUtdHJlZSIgZW50cmllcyBmb3Igc3VidHJlZXMuCisJICovCisJaWYgKCpzaXplIDwgKm9mZnNldCArIHBhdGhsZW4gKyAxMDApIHsKKwkJKnNpemUgPSBhbGxvY19ucigqb2Zmc2V0ICsgcGF0aGxlbiArIDEwMCk7CisJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgKnNpemUpOworCX0KKwkqb2Zmc2V0ICs9IHNwcmludGYoYnVmZmVyICsgKm9mZnNldCwgIiUuKnMlYyVkICVkXG4iLAorCQkJICAgcGF0aGxlbiwgcGF0aCwgMCwKKwkJCSAgIGl0LT5lbnRyeV9jb3VudCwgaXQtPnN1YnRyZWVfbnIpOworCisjaWYgREVCVUcKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQpCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JS4qcz4gKCVkIGVudCwgJWQgc3VidHJlZSkgJXNcbiIsCisJCQlwYXRobGVuLCBwYXRoLCBpdC0+ZW50cnlfY291bnQsIGl0LT5zdWJ0cmVlX25yLAorCQkJc2hhMV90b19oZXgoaXQtPnNoYTEpKTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JS4qcz4gKCVkIHN1YnRyZWUpIGludmFsaWRcbiIsCisJCQlwYXRobGVuLCBwYXRoLCBpdC0+c3VidHJlZV9ucik7CisjZW5kaWYKKworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkgeworCQltZW1jcHkoYnVmZmVyICsgKm9mZnNldCwgaXQtPnNoYTEsIDIwKTsKKwkJKm9mZnNldCArPSAyMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpkb3duID0gaXQtPmRvd25baV07CisJCWlmIChpKSB7CisJCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnByZXYgPSBpdC0+ZG93bltpLTFdOworCQkJaWYgKHN1YnRyZWVfbmFtZV9jbXAoZG93bi0+bmFtZSwgZG93bi0+bmFtZWxlbiwKKwkJCQkJICAgICBwcmV2LT5uYW1lLCBwcmV2LT5uYW1lbGVuKSA8PSAwKQorCQkJCWRpZSgiZmF0YWwgLSB1bnNvcnRlZCBjYWNoZSBzdWJ0cmVlIik7CisJCX0KKwkJYnVmZmVyID0gd3JpdGVfb25lKGRvd24tPmNhY2hlX3RyZWUsIGRvd24tPm5hbWUsIGRvd24tPm5hbWVsZW4sCisJCQkJICAgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCX0KKwlyZXR1cm4gYnVmZmVyOworfQorCit2b2lkICpjYWNoZV90cmVlX3dyaXRlKHN0cnVjdCBjYWNoZV90cmVlICpyb290LCB1bnNpZ25lZCBsb25nICpzaXplX3ApCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSA4MTkyOworCWNoYXIgKmJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisKKwkqc2l6ZV9wID0gMDsKKwlwYXRoWzBdID0gMDsKKwlyZXR1cm4gd3JpdGVfb25lKHJvb3QsIHBhdGgsIDAsIGJ1ZmZlciwgJnNpemUsIHNpemVfcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfdHJlZSAqcmVhZF9vbmUoY29uc3QgY2hhciAqKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqc2l6ZV9wKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9ICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplID0gKnNpemVfcDsKKwljb25zdCBjaGFyICpjcDsKKwljaGFyICplcDsKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQ7CisJaW50IGksIHN1YnRyZWVfbnI7CisKKwlpdCA9IE5VTEw7CisJLyogc2tpcCBuYW1lLCBidXQgbWFrZSBzdXJlIG5hbWUgZXhpc3RzICovCisJd2hpbGUgKHNpemUgJiYgKmJ1ZikgeworCQlzaXplLS07CisJCWJ1ZisrOworCX0KKwlpZiAoIXNpemUpCisJCWdvdG8gZnJlZV9yZXR1cm47CisJYnVmKys7IHNpemUtLTsKKwlpdCA9IGNhY2hlX3RyZWUoKTsKKworCWNwID0gYnVmOworCWl0LT5lbnRyeV9jb3VudCA9IHN0cnRvbChjcCwgJmVwLCAxMCk7CisJaWYgKGNwID09IGVwKQorCQlnb3RvIGZyZWVfcmV0dXJuOworCWNwID0gZXA7CisJc3VidHJlZV9uciA9IHN0cnRvbChjcCwgJmVwLCAxMCk7CisJaWYgKGNwID09IGVwKQorCQlnb3RvIGZyZWVfcmV0dXJuOworCXdoaWxlIChzaXplICYmICpidWYgJiYgKmJ1ZiAhPSAnXG4nKSB7CisJCXNpemUtLTsKKwkJYnVmKys7CisJfQorCWlmICghc2l6ZSkKKwkJZ290byBmcmVlX3JldHVybjsKKwlidWYrKzsgc2l6ZS0tOworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkgeworCQlpZiAoc2l6ZSA8IDIwKQorCQkJZ290byBmcmVlX3JldHVybjsKKwkJbWVtY3B5KGl0LT5zaGExLCBidWYsIDIwKTsKKwkJYnVmICs9IDIwOworCQlzaXplIC09IDIwOworCX0KKworI2lmIERFQlVHCisJaWYgKDAgPD0gaXQtPmVudHJ5X2NvdW50KQorCQlmcHJpbnRmKHN0ZGVyciwgImNhY2hlLXRyZWUgPCVzPiAoJWQgZW50LCAlZCBzdWJ0cmVlKSAlc1xuIiwKKwkJCSpidWZmZXIsIGl0LT5lbnRyeV9jb3VudCwgc3VidHJlZV9uciwKKwkJCXNoYTFfdG9faGV4KGl0LT5zaGExKSk7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgImNhY2hlLXRyZWUgPCVzPiAoJWQgc3VidHJlZXMpIGludmFsaWRcbiIsCisJCQkqYnVmZmVyLCBzdWJ0cmVlX25yKTsKKyNlbmRpZgorCisJLyoKKwkgKiBKdXN0IGEgaGV1cmlzdGljIC0tIHdlIGRvIG5vdCBhZGQgZGlyZWN0b3JpZXMgdGhhdCBvZnRlbiBidXQKKwkgKiB3ZSBkbyBub3Qgd2FudCB0byBoYXZlIHRvIGV4dGVuZCBpdCBpbW1lZGlhdGVseSB3aGVuIHdlIGRvLAorCSAqIGhlbmNlICsyLgorCSAqLworCWl0LT5zdWJ0cmVlX2FsbG9jID0gc3VidHJlZV9uciArIDI7CisJaXQtPmRvd24gPSB4Y2FsbG9jKGl0LT5zdWJ0cmVlX2FsbG9jLCBzaXplb2Yoc3RydWN0IGNhY2hlX3RyZWVfc3ViICopKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3VidHJlZV9ucjsgaSsrKSB7CisJCS8qIHJlYWQgZWFjaCBzdWJ0cmVlICovCisJCXN0cnVjdCBjYWNoZV90cmVlICpzdWI7CisJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqc3VidHJlZTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGJ1ZjsKKworCQlzdWIgPSByZWFkX29uZSgmYnVmLCAmc2l6ZSk7CisJCWlmICghc3ViKQorCQkJZ290byBmcmVlX3JldHVybjsKKwkJc3VidHJlZSA9IGNhY2hlX3RyZWVfc3ViKGl0LCBuYW1lKTsKKwkJc3VidHJlZS0+Y2FjaGVfdHJlZSA9IHN1YjsKKwl9CisJaWYgKHN1YnRyZWVfbnIgIT0gaXQtPnN1YnRyZWVfbnIpCisJCWRpZSgiY2FjaGUtdHJlZTogaW50ZXJuYWwgZXJyb3IiKTsKKwkqYnVmZmVyID0gYnVmOworCSpzaXplX3AgPSBzaXplOworCXJldHVybiBpdDsKKworIGZyZWVfcmV0dXJuOgorCWNhY2hlX3RyZWVfZnJlZSgmaXQpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgY2FjaGVfdHJlZSAqY2FjaGVfdHJlZV9yZWFkKGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChidWZmZXJbMF0pCisJCXJldHVybiBOVUxMOyAvKiBub3QgdGhlIHdob2xlIHRyZWUgKi8KKwlyZXR1cm4gcmVhZF9vbmUoJmJ1ZmZlciwgJnNpemUpOworfQpkaWZmIC0tZ2l0IGEvY2FjaGUtdHJlZS5oIGIvY2FjaGUtdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzY0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jYWNoZS10cmVlLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBDQUNIRV9UUkVFX0gKKyNkZWZpbmUgQ0FDSEVfVFJFRV9ICisKK3N0cnVjdCBjYWNoZV90cmVlOworc3RydWN0IGNhY2hlX3RyZWVfc3ViIHsKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqY2FjaGVfdHJlZTsKKwlpbnQgbmFtZWxlbjsKKwlpbnQgdXNlZDsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07Cit9OworCitzdHJ1Y3QgY2FjaGVfdHJlZSB7CisJaW50IGVudHJ5X2NvdW50OyAvKiBuZWdhdGl2ZSBtZWFucyAiaW52YWxpZCIgKi8KKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBzdWJ0cmVlX25yOworCWludCBzdWJ0cmVlX2FsbG9jOworCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqKmRvd247Cit9OworCitzdHJ1Y3QgY2FjaGVfdHJlZSAqY2FjaGVfdHJlZSh2b2lkKTsKK3ZvaWQgY2FjaGVfdHJlZV9mcmVlKHN0cnVjdCBjYWNoZV90cmVlICoqKTsKK3ZvaWQgY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoc3RydWN0IGNhY2hlX3RyZWUgKiwgY29uc3QgY2hhciAqKTsKK3N0cnVjdCBjYWNoZV90cmVlX3N1YiAqY2FjaGVfdHJlZV9zdWIoc3RydWN0IGNhY2hlX3RyZWUgKiwgY29uc3QgY2hhciAqKTsKKwordm9pZCAqY2FjaGVfdHJlZV93cml0ZShzdHJ1Y3QgY2FjaGVfdHJlZSAqcm9vdCwgdW5zaWduZWQgbG9uZyAqc2l6ZV9wKTsKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX3JlYWQoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitpbnQgY2FjaGVfdHJlZV9mdWxseV92YWxpZChzdHJ1Y3QgY2FjaGVfdHJlZSAqKTsKK2ludCBjYWNoZV90cmVlX3VwZGF0ZShzdHJ1Y3QgY2FjaGVfdHJlZSAqLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKiosIGludCwgaW50LCBpbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NhY2hlLmggYi9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDdmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYWNoZS5oCkBAIC0wLDAgKzEsMzgxIEBACisjaWZuZGVmIENBQ0hFX0gKKyNkZWZpbmUgQ0FDSEVfSAorCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisKKyNpbmNsdWRlIFNIQTFfSEVBREVSCisjaW5jbHVkZSA8emxpYi5oPgorCisjaWYgWkxJQl9WRVJOVU0gPCAweDEyMDAKKyNkZWZpbmUgZGVmbGF0ZUJvdW5kKGMscykgICgocykgKyAoKChzKSArIDcpID4+IDMpICsgKCgocykgKyA2MykgPj4gNikgKyAxMSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChEVF9VTktOT1dOKSAmJiAhZGVmaW5lZChOT19EX1RZUEVfSU5fRElSRU5UKQorI2RlZmluZSBEVFlQRShkZSkJKChkZSktPmRfdHlwZSkKKyNlbHNlCisjdW5kZWYgRFRfVU5LTk9XTgorI3VuZGVmIERUX0RJUgorI3VuZGVmIERUX1JFRworI3VuZGVmIERUX0xOSworI2RlZmluZSBEVF9VTktOT1dOCTAKKyNkZWZpbmUgRFRfRElSCQkxCisjZGVmaW5lIERUX1JFRwkJMgorI2RlZmluZSBEVF9MTksJCTMKKyNkZWZpbmUgRFRZUEUoZGUpCURUX1VOS05PV04KKyNlbmRpZgorCisvKgorICogSW50ZW5zaXZlIHJlc2VhcmNoIG92ZXIgdGhlIGNvdXJzZSBvZiBtYW55IHllYXJzIGhhcyBzaG93biB0aGF0CisgKiBwb3J0IDk0MTggaXMgdG90YWxseSB1bnVzZWQgYnkgYW55dGhpbmcgZWxzZS4gT3IKKyAqCisgKglZb3VyIHNlYXJjaCAtICJwb3J0IDk0MTgiIC0gZGlkIG5vdCBtYXRjaCBhbnkgZG9jdW1lbnRzLgorICoKKyAqIGFzIHd3dy5nb29nbGUuY29tIHB1dHMgaXQuCisgKgorICogVGhpcyBwb3J0IGhhcyBiZWVuIHByb3Blcmx5IGFzc2lnbmVkIGZvciBnaXQgdXNlIGJ5IElBTkE6CisgKiBnaXQgKEFzc2lnbmVkLTk0MTgpIFtJMDYtMDUwNzI4LTAwMDFdLgorICoKKyAqCWdpdCAgOTQxOC90Y3AgICBnaXQgcGFjayB0cmFuc2ZlciBzZXJ2aWNlCisgKglnaXQgIDk0MTgvdWRwICAgZ2l0IHBhY2sgdHJhbnNmZXIgc2VydmljZQorICoKKyAqIHdpdGggTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhcyB0aGUgcG9pbnQgb2YKKyAqIGNvbnRhY3QuIFNlcHRlbWJlciAyMDA1LgorICoKKyAqIFNlZSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3BvcnQtbnVtYmVycworICovCisjZGVmaW5lIERFRkFVTFRfR0lUX1BPUlQgOTQxOAorCisvKgorICogQmFzaWMgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZGlyZWN0b3J5IGNhY2hlCisgKi8KKworI2RlZmluZSBDQUNIRV9TSUdOQVRVUkUgMHg0NDQ5NTI0MwkvKiAiRElSQyIgKi8KK3N0cnVjdCBjYWNoZV9oZWFkZXIgeworCXVuc2lnbmVkIGludCBoZHJfc2lnbmF0dXJlOworCXVuc2lnbmVkIGludCBoZHJfdmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgaGRyX2VudHJpZXM7Cit9OworCisvKgorICogVGhlICJjYWNoZV90aW1lIiBpcyBqdXN0IHRoZSBsb3cgMzIgYml0cyBvZiB0aGUKKyAqIHRpbWUuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIGl0IG92ZXJmbG93cyAtIHdlIG9ubHkKKyAqIGNoZWNrIGl0IGZvciBlcXVhbGl0eSBpbiB0aGUgMzIgYml0cyB3ZSBzYXZlLgorICovCitzdHJ1Y3QgY2FjaGVfdGltZSB7CisJdW5zaWduZWQgaW50IHNlYzsKKwl1bnNpZ25lZCBpbnQgbnNlYzsKK307CisKKy8qCisgKiBkZXYvaW5vL3VpZC9naWQvc2l6ZSBhcmUgYWxzbyBqdXN0IHRyYWNrZWQgdG8gdGhlIGxvdyAzMiBiaXRzCisgKiBBZ2FpbiAtIHRoaXMgaXMganVzdCBhICh2ZXJ5IHN0cm9uZyBpbiBwcmFjdGljZSkgaGV1cmlzdGljIHRoYXQKKyAqIHRoZSBpbm9kZSBoYXNuJ3QgY2hhbmdlZC4KKyAqCisgKiBXZSBzYXZlIHRoZSBmaWVsZHMgaW4gYmlnLWVuZGlhbiBvcmRlciB0byBhbGxvdyB1c2luZyB0aGUKKyAqIGluZGV4IGZpbGUgb3ZlciBORlMgdHJhbnNwYXJlbnRseS4KKyAqLworc3RydWN0IGNhY2hlX2VudHJ5IHsKKwlzdHJ1Y3QgY2FjaGVfdGltZSBjZV9jdGltZTsKKwlzdHJ1Y3QgY2FjaGVfdGltZSBjZV9tdGltZTsKKwl1bnNpZ25lZCBpbnQgY2VfZGV2OworCXVuc2lnbmVkIGludCBjZV9pbm87CisJdW5zaWduZWQgaW50IGNlX21vZGU7CisJdW5zaWduZWQgaW50IGNlX3VpZDsKKwl1bnNpZ25lZCBpbnQgY2VfZ2lkOworCXVuc2lnbmVkIGludCBjZV9zaXplOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgc2hvcnQgY2VfZmxhZ3M7CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCisjZGVmaW5lIENFX05BTUVNQVNLICAoMHgwZmZmKQorI2RlZmluZSBDRV9TVEFHRU1BU0sgKDB4MzAwMCkKKyNkZWZpbmUgQ0VfVVBEQVRFICAgICgweDQwMDApCisjZGVmaW5lIENFX1ZBTElEICAgICAoMHg4MDAwKQorI2RlZmluZSBDRV9TVEFHRVNISUZUIDEyCisKKyNkZWZpbmUgY3JlYXRlX2NlX2ZsYWdzKGxlbiwgc3RhZ2UpIGh0b25zKChsZW4pIHwgKChzdGFnZSkgPDwgQ0VfU1RBR0VTSElGVCkpCisjZGVmaW5lIGNlX25hbWVsZW4oY2UpIChDRV9OQU1FTUFTSyAmIG50b2hzKChjZSktPmNlX2ZsYWdzKSkKKyNkZWZpbmUgY2Vfc2l6ZShjZSkgY2FjaGVfZW50cnlfc2l6ZShjZV9uYW1lbGVuKGNlKSkKKyNkZWZpbmUgY2Vfc3RhZ2UoY2UpICgoQ0VfU1RBR0VNQVNLICYgbnRvaHMoKGNlKS0+Y2VfZmxhZ3MpKSA+PiBDRV9TVEFHRVNISUZUKQorCisjZGVmaW5lIGNlX3Blcm1pc3Npb25zKG1vZGUpICgoKG1vZGUpICYgMDEwMCkgPyAwNzU1IDogMDY0NCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyZWF0ZV9jZV9tb2RlKHVuc2lnbmVkIGludCBtb2RlKQoreworCWlmIChTX0lTTE5LKG1vZGUpKQorCQlyZXR1cm4gaHRvbmwoU19JRkxOSyk7CisJcmV0dXJuIGh0b25sKFNfSUZSRUcgfCBjZV9wZXJtaXNzaW9ucyhtb2RlKSk7Cit9CisjZGVmaW5lIGNhbm9uX21vZGUobW9kZSkgXAorCShTX0lTUkVHKG1vZGUpID8gKFNfSUZSRUcgfCBjZV9wZXJtaXNzaW9ucyhtb2RlKSkgOiBcCisJU19JU0xOSyhtb2RlKSA/IFNfSUZMTksgOiBTX0lGRElSKQorCisjZGVmaW5lIGNhY2hlX2VudHJ5X3NpemUobGVuKSAoKG9mZnNldG9mKHN0cnVjdCBjYWNoZV9lbnRyeSxuYW1lKSArIChsZW4pICsgOCkgJiB+NykKKworZXh0ZXJuIHN0cnVjdCBjYWNoZV9lbnRyeSAqKmFjdGl2ZV9jYWNoZTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYWN0aXZlX25yLCBhY3RpdmVfYWxsb2MsIGFjdGl2ZV9jYWNoZV9jaGFuZ2VkOworZXh0ZXJuIHN0cnVjdCBjYWNoZV90cmVlICphY3RpdmVfY2FjaGVfdHJlZTsKKworI2RlZmluZSBHSVRfRElSX0VOVklST05NRU5UICJHSVRfRElSIgorI2RlZmluZSBERUZBVUxUX0dJVF9ESVJfRU5WSVJPTk1FTlQgIi5naXQiCisjZGVmaW5lIERCX0VOVklST05NRU5UICJHSVRfT0JKRUNUX0RJUkVDVE9SWSIKKyNkZWZpbmUgSU5ERVhfRU5WSVJPTk1FTlQgIkdJVF9JTkRFWF9GSUxFIgorI2RlZmluZSBHUkFGVF9FTlZJUk9OTUVOVCAiR0lUX0dSQUZUX0ZJTEUiCisKK2V4dGVybiBjaGFyICpnZXRfZ2l0X2Rpcih2b2lkKTsKK2V4dGVybiBjaGFyICpnZXRfb2JqZWN0X2RpcmVjdG9yeSh2b2lkKTsKK2V4dGVybiBjaGFyICpnZXRfcmVmc19kaXJlY3Rvcnkodm9pZCk7CitleHRlcm4gY2hhciAqZ2V0X2luZGV4X2ZpbGUodm9pZCk7CitleHRlcm4gY2hhciAqZ2V0X2dyYWZ0X2ZpbGUodm9pZCk7CisKKyNkZWZpbmUgQUxURVJOQVRFX0RCX0VOVklST05NRU5UICJHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUyIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKipnZXRfcGF0aHNwZWMoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICoqcGF0aHNwZWMpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KGludCAqKTsKK2V4dGVybiBjb25zdCBjaGFyICpzZXR1cF9naXRfZGlyZWN0b3J5KHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnByZWZpeF9wYXRoKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGxlbiwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciAqcHJlZml4X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGxlbiwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gdm9pZCB2ZXJpZnlfZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHZlcmlmeV9ub25fZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lKTsKKworI2RlZmluZSBhbGxvY19ucih4KSAoKCh4KSsxNikqMy8yKQorCisvKiBJbml0aWFsaXplIGFuZCB1c2UgdGhlIGNhY2hlIGluZm9ybWF0aW9uICovCitleHRlcm4gaW50IHJlYWRfY2FjaGUodm9pZCk7CitleHRlcm4gaW50IHdyaXRlX2NhY2hlKGludCBuZXdmZCwgc3RydWN0IGNhY2hlX2VudHJ5ICoqY2FjaGUsIGludCBlbnRyaWVzKTsKK2V4dGVybiBpbnQgdmVyaWZ5X3BhdGgoY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gaW50IGNhY2hlX25hbWVfcG9zKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNkZWZpbmUgQUREX0NBQ0hFX09LX1RPX0FERCAxCQkvKiBPayB0byBhZGQgKi8KKyNkZWZpbmUgQUREX0NBQ0hFX09LX1RPX1JFUExBQ0UgMgkvKiBPayB0byByZXBsYWNlIGZpbGUvZGlyZWN0b3J5ICovCisjZGVmaW5lIEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0sgNAkvKiBPayB0byBza2lwIERGIGNvbmZsaWN0IGNoZWNrcyAqLworZXh0ZXJuIGludCBhZGRfY2FjaGVfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IG9wdGlvbik7CitleHRlcm4gaW50IHJlbW92ZV9jYWNoZV9lbnRyeV9hdChpbnQgcG9zKTsKK2V4dGVybiBpbnQgcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiBpbnQgY2Vfc2FtZV9uYW1lKHN0cnVjdCBjYWNoZV9lbnRyeSAqYSwgc3RydWN0IGNhY2hlX2VudHJ5ICpiKTsKK2V4dGVybiBpbnQgY2VfbWF0Y2hfc3RhdChzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCk7CitleHRlcm4gaW50IGNlX21vZGlmaWVkKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCwgaW50KTsKK2V4dGVybiBpbnQgY2VfcGF0aF9tYXRjaChjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpOworZXh0ZXJuIGludCBpbmRleF9mZCh1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmQsIHN0cnVjdCBzdGF0ICpzdCwgaW50IHdyaXRlX29iamVjdCwgY29uc3QgY2hhciAqdHlwZSk7CitleHRlcm4gaW50IHJlYWRfcGlwZShpbnQgZmQsIGNoYXIqKiByZXR1cm5fYnVmLCB1bnNpZ25lZCBsb25nKiByZXR1cm5fc2l6ZSk7CitleHRlcm4gaW50IGluZGV4X3BpcGUodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KTsKK2V4dGVybiBpbnQgaW5kZXhfcGF0aCh1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCB3cml0ZV9vYmplY3QpOworZXh0ZXJuIHZvaWQgZmlsbF9zdGF0X2NhY2hlX2luZm8oc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KTsKKworI2RlZmluZSBSRUZSRVNIX1JFQUxMWQkJMHgwMDAxCS8qIGlnbm9yZV92YWxpZCAqLworI2RlZmluZSBSRUZSRVNIX1VOTUVSR0VECTB4MDAwMgkvKiBhbGxvdyB1bm1lcmdlZCAqLworI2RlZmluZSBSRUZSRVNIX1FVSUVUCQkweDAwMDQJLyogYmUgcXVpZXQgYWJvdXQgaXQgKi8KKyNkZWZpbmUgUkVGUkVTSF9JR05PUkVfTUlTU0lORwkweDAwMDgJLyogaWdub3JlIG5vbi1leGlzdGVudCAqLworZXh0ZXJuIGludCByZWZyZXNoX2NhY2hlKHVuc2lnbmVkIGludCBmbGFncyk7CisKK3N0cnVjdCBsb2NrX2ZpbGUgeworCXN0cnVjdCBsb2NrX2ZpbGUgKm5leHQ7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07Cit9OworZXh0ZXJuIGludCBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKHN0cnVjdCBsb2NrX2ZpbGUgKiwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gaW50IGNvbW1pdF9sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqKTsKK2V4dGVybiB2b2lkIHJvbGxiYWNrX2xvY2tfZmlsZShzdHJ1Y3QgbG9ja19maWxlICopOworCisvKiBFbnZpcm9ubWVudCBiaXRzIGZyb20gY29uZmlndXJhdGlvbiBtZWNoYW5pc20gKi8KK2V4dGVybiBpbnQgdHJ1c3RfZXhlY3V0YWJsZV9iaXQ7CitleHRlcm4gaW50IGFzc3VtZV91bmNoYW5nZWQ7CitleHRlcm4gaW50IHByZWZlcl9zeW1saW5rX3JlZnM7CitleHRlcm4gaW50IGxvZ19hbGxfcmVmX3VwZGF0ZXM7CitleHRlcm4gaW50IHdhcm5fYW1iaWd1b3VzX3JlZnM7CitleHRlcm4gaW50IGRpZmZfcmVuYW1lX2xpbWl0X2RlZmF1bHQ7CitleHRlcm4gaW50IHNoYXJlZF9yZXBvc2l0b3J5OworZXh0ZXJuIGNvbnN0IGNoYXIgKmFwcGx5X2RlZmF1bHRfd2hpdGVzcGFjZTsKKworI2RlZmluZSBHSVRfUkVQT19WRVJTSU9OIDAKK2V4dGVybiBpbnQgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbjsKK2V4dGVybiBpbnQgY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQodm9pZCk7CisKKyNkZWZpbmUgTVRJTUVfQ0hBTkdFRAkweDAwMDEKKyNkZWZpbmUgQ1RJTUVfQ0hBTkdFRAkweDAwMDIKKyNkZWZpbmUgT1dORVJfQ0hBTkdFRAkweDAwMDQKKyNkZWZpbmUgTU9ERV9DSEFOR0VEICAgIDB4MDAwOAorI2RlZmluZSBJTk9ERV9DSEFOR0VEICAgMHgwMDEwCisjZGVmaW5lIERBVEFfQ0hBTkdFRCAgICAweDAwMjAKKyNkZWZpbmUgVFlQRV9DSEFOR0VEICAgIDB4MDA0MAorCisvKiBSZXR1cm4gYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaWxlbmFtZSBtYXRjaGluZyB0aGUgc2hhMSBzaWduYXR1cmUgKi8KK2V4dGVybiBjaGFyICpta3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGNoYXIgKmdpdF9wYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBjaGFyICpzaGExX2ZpbGVfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3BhY2tfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3BhY2tfaW5kZXhfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjb25zdCBjaGFyICpmaW5kX3VuaXF1ZV9hYmJyZXYoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50KTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIG51bGxfc2hhMVsyMF07CisKK2ludCBnaXRfbWtzdGVtcChjaGFyICpwYXRoLCBzaXplX3QgbiwgY29uc3QgY2hhciAqdGVtcGxhdGUpOworCitpbnQgYWRqdXN0X3NoYXJlZF9wZXJtKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoY2hhciAqcGF0aCk7CitjaGFyICpzYWZlX3N0cm5jcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitjaGFyICplbnRlcl9yZXBvKGNoYXIgKnBhdGgsIGludCBzdHJpY3QpOworCisvKiBSZWFkIGFuZCB1bnBhY2sgYSBzaGExIGZpbGUgaW50byBtZW1vcnksIHdyaXRlIG1lbW9yeSB0byBhIHNoYTEgZmlsZSAqLworZXh0ZXJuIGludCB1bnBhY2tfc2hhMV9oZWFkZXIoel9zdHJlYW0gKnN0cmVhbSwgdm9pZCAqbWFwLCB1bnNpZ25lZCBsb25nIG1hcHNpemUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgcGFyc2Vfc2hhMV9oZWFkZXIoY2hhciAqaGRyLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplcCk7CitleHRlcm4gaW50IHNoYTFfb2JqZWN0X2luZm8oY29uc3QgdW5zaWduZWQgY2hhciAqLCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gdm9pZCAqIHVucGFja19zaGExX2ZpbGUodm9pZCAqbWFwLCB1bnNpZ25lZCBsb25nIG1hcHNpemUsIGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworZXh0ZXJuIHZvaWQgKiByZWFkX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplKTsKK2V4dGVybiBpbnQgd3JpdGVfc2hhMV9maWxlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKnJldHVybl9zaGExKTsKK2V4dGVybiBjaGFyICp3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZSh2b2lkICpidWYsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCSAgICAgdW5zaWduZWQgY2hhciAqaGRyLAorCQkJCSAgICAgaW50ICpoZHJsZW4pOworCitleHRlcm4gaW50IGNoZWNrX3NoYTFfc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICp0eXBlKTsKKworZXh0ZXJuIGludCB3cml0ZV9zaGExX2Zyb21fZmQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjaGFyICpidWZmZXIsCisJCQkgICAgICBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90ICpidWZwb3NuKTsKK2V4dGVybiBpbnQgd3JpdGVfc2hhMV90b19mZChpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCBtb3ZlX3RlbXBfdG9fZmlsZShjb25zdCBjaGFyICp0bXBmaWxlLCBjaGFyICpmaWxlbmFtZSk7CisKK2V4dGVybiBpbnQgaGFzX3NoYTFfcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBpbnQgaGFzX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworZXh0ZXJuIGludCBoYXNfcGFja19maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCBoYXNfcGFja19pbmRleChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworLyogQ29udmVydCB0by9mcm9tIGhleC9zaGExIHJlcHJlc2VudGF0aW9uICovCisjZGVmaW5lIE1JTklNVU1fQUJCUkVWIDQKKyNkZWZpbmUgREVGQVVMVF9BQkJSRVYgNworCitleHRlcm4gaW50IGdldF9zaGExKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IGdldF9zaGExX2hleChjb25zdCBjaGFyICpoZXgsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGNoYXIgKnNoYTFfdG9faGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOwkvKiBzdGF0aWMgYnVmZmVyIHJlc3VsdCEgKi8KK2V4dGVybiBpbnQgcmVhZF9yZWYoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnJlc29sdmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCk7CitleHRlcm4gaW50IGNyZWF0ZV9zeW1yZWYoY29uc3QgY2hhciAqZ2l0X0hFQUQsIGNvbnN0IGNoYXIgKnJlZnNfaGVhZHNfbWFzdGVyKTsKK2V4dGVybiBpbnQgdmFsaWRhdGVfc3ltcmVmKGNvbnN0IGNoYXIgKmdpdF9IRUFEKTsKKworZXh0ZXJuIGludCBiYXNlX25hbWVfY29tcGFyZShjb25zdCBjaGFyICpuYW1lMSwgaW50IGxlbjEsIGludCBtb2RlMSwgY29uc3QgY2hhciAqbmFtZTIsIGludCBsZW4yLCBpbnQgbW9kZTIpOworZXh0ZXJuIGludCBjYWNoZV9uYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqbmFtZTEsIGludCBsZW4xLCBjb25zdCBjaGFyICpuYW1lMiwgaW50IGxlbjIpOworCitleHRlcm4gdm9pZCAqcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkJY29uc3QgY2hhciAqcmVxdWlyZWRfdHlwZSwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc2l6ZSwKKwkJCQkJdW5zaWduZWQgY2hhciAqc2hhMV9yZXQpOworCitjb25zdCBjaGFyICpzaG93X2RhdGUodW5zaWduZWQgbG9uZyB0aW1lLCBpbnQgdGltZXpvbmUpOworY29uc3QgY2hhciAqc2hvd19yZmMyODIyX2RhdGUodW5zaWduZWQgbG9uZyB0aW1lLCBpbnQgdGltZXpvbmUpOworaW50IHBhcnNlX2RhdGUoY29uc3QgY2hhciAqZGF0ZSwgY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSk7Cit2b2lkIGRhdGVzdGFtcChjaGFyICpidWYsIGludCBidWZzaXplKTsKK3Vuc2lnbmVkIGxvbmcgYXBwcm94aWRhdGUoY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIGludCBzZXR1cF9pZGVudCh2b2lkKTsKK2V4dGVybiBjb25zdCBjaGFyICpnaXRfYXV0aG9yX2luZm8oaW50KTsKK2V4dGVybiBjb25zdCBjaGFyICpnaXRfY29tbWl0dGVyX2luZm8oaW50KTsKKworc3RydWN0IGNoZWNrb3V0IHsKKwljb25zdCBjaGFyICpiYXNlX2RpcjsKKwlpbnQgYmFzZV9kaXJfbGVuOworCXVuc2lnbmVkIGZvcmNlOjEsCisJCSBxdWlldDoxLAorCQkgbm90X25ldzoxLAorCQkgcmVmcmVzaF9jYWNoZToxOworfTsKKworZXh0ZXJuIGludCBjaGVja291dF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBjaGFyICp0b3BhdGgpOworCitleHRlcm4gc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgeworCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICpuZXh0OworCWNoYXIgKm5hbWU7CisJY2hhciBiYXNlW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9ICphbHRfb2RiX2xpc3Q7CitleHRlcm4gdm9pZCBwcmVwYXJlX2FsdF9vZGIodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCB7CisJc3RydWN0IHBhY2tlZF9naXQgKm5leHQ7CisJdW5zaWduZWQgbG9uZyBpbmRleF9zaXplOworCXVuc2lnbmVkIGxvbmcgcGFja19zaXplOworCXVuc2lnbmVkIGludCAqaW5kZXhfYmFzZTsKKwl2b2lkICpwYWNrX2Jhc2U7CisJdW5zaWduZWQgaW50IHBhY2tfbGFzdF91c2VkOworCXVuc2lnbmVkIGludCBwYWNrX3VzZV9jbnQ7CisJaW50IHBhY2tfbG9jYWw7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkvKiBzb21ldGhpbmcgbGlrZSAiLmdpdC9vYmplY3RzL3BhY2sveHh4eHgucGFjayIgKi8KKwljaGFyIHBhY2tfbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfSAqcGFja2VkX2dpdDsKKworc3RydWN0IHBhY2tfZW50cnkgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKK307CisKK3N0cnVjdCByZWYgeworCXN0cnVjdCByZWYgKm5leHQ7CisJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBuZXdfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBmb3JjZTsKKwlzdHJ1Y3QgcmVmICpwZWVyX3JlZjsgLyogd2hlbiByZW5hbWluZyAqLworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworZXh0ZXJuIGludCBnaXRfY29ubmVjdChpbnQgZmRbMl0sIGNoYXIgKnVybCwgY29uc3QgY2hhciAqcHJvZyk7CitleHRlcm4gaW50IGZpbmlzaF9jb25uZWN0KHBpZF90IHBpZCk7CitleHRlcm4gaW50IHBhdGhfbWF0Y2goY29uc3QgY2hhciAqcGF0aCwgaW50IG5yLCBjaGFyICoqbWF0Y2gpOworZXh0ZXJuIGludCBtYXRjaF9yZWZzKHN0cnVjdCByZWYgKnNyYywgc3RydWN0IHJlZiAqZHN0LCBzdHJ1Y3QgcmVmICoqKmRzdF90YWlsLAorCQkgICAgICBpbnQgbnJfcmVmc3BlYywgY2hhciAqKnJlZnNwZWMsIGludCBhbGwpOworZXh0ZXJuIGludCBnZXRfYWNrKGludCBmZCwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpOworZXh0ZXJuIHN0cnVjdCByZWYgKipnZXRfcmVtb3RlX2hlYWRzKGludCBpbiwgc3RydWN0IHJlZiAqKmxpc3QsIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoLCBpbnQgaWdub3JlX2Z1bm55KTsKK2V4dGVybiBpbnQgc2VydmVyX3N1cHBvcnRzKGNvbnN0IGNoYXIgKmZlYXR1cmUpOworCitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgKnBhcnNlX3BhY2tfaW5kZXgodW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgKnBhcnNlX3BhY2tfaW5kZXhfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCQkJY2hhciAqaWR4X3BhdGgpOworCitleHRlcm4gdm9pZCBwcmVwYXJlX3BhY2tlZF9naXQodm9pZCk7CitleHRlcm4gdm9pZCBpbnN0YWxsX3BhY2tlZF9naXQoc3RydWN0IHBhY2tlZF9naXQgKnBhY2spOworCitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgKmZpbmRfc2hhMV9wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIAorCQkJCQkgc3RydWN0IHBhY2tlZF9naXQgKnBhY2tzKTsKKworZXh0ZXJuIGludCB1c2VfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqKTsKK2V4dGVybiB2b2lkIHVudXNlX3BhY2tlZF9naXQoc3RydWN0IHBhY2tlZF9naXQgKik7CitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgKmFkZF9wYWNrZWRfZ2l0KGNoYXIgKiwgaW50LCBpbnQpOworZXh0ZXJuIGludCBudW1fcGFja2VkX29iamVjdHMoY29uc3Qgc3RydWN0IHBhY2tlZF9naXQgKnApOworZXh0ZXJuIGludCBudGhfcGFja2VkX29iamVjdF9zaGExKGNvbnN0IHN0cnVjdCBwYWNrZWRfZ2l0ICosIGludCwgdW5zaWduZWQgY2hhciopOworZXh0ZXJuIGludCBmaW5kX3BhY2tfZW50cnlfb25lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgc3RydWN0IHBhY2tfZW50cnkgKiwgc3RydWN0IHBhY2tlZF9naXQgKik7CitleHRlcm4gdm9pZCAqdW5wYWNrX2VudHJ5X2dlbnRseShzdHJ1Y3QgcGFja19lbnRyeSAqLCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gdm9pZCBwYWNrZWRfb2JqZWN0X2luZm9fZGV0YWlsKHN0cnVjdCBwYWNrX2VudHJ5ICosIGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBjaGFyICopOworCisvKiBEdW1iIHNlcnZlcnMgc3VwcG9ydCAqLworZXh0ZXJuIGludCB1cGRhdGVfc2VydmVyX2luZm8oaW50KTsKKwordHlwZWRlZiBpbnQgKCpjb25maWdfZm5fdCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfZGVmYXVsdF9jb25maWcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX2Zyb21fZmlsZShjb25maWdfZm5fdCBmbiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZyhjb25maWdfZm5fdCBmbik7CitleHRlcm4gaW50IGdpdF9jb25maWdfaW50KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19ib29sKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIGludCBjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpOworCisjZGVmaW5lIE1BWF9HSVROQU1FICgxMDAwKQorZXh0ZXJuIGNoYXIgZ2l0X2RlZmF1bHRfZW1haWxbTUFYX0dJVE5BTUVdOworZXh0ZXJuIGNoYXIgZ2l0X2RlZmF1bHRfbmFtZVtNQVhfR0lUTkFNRV07CisKKyNkZWZpbmUgTUFYX0VOQ09ESU5HX0xFTkdUSCA2NAorZXh0ZXJuIGNoYXIgZ2l0X2NvbW1pdF9lbmNvZGluZ1tNQVhfRU5DT0RJTkdfTEVOR1RIXTsKKworZXh0ZXJuIGludCBjb3B5X2ZkKGludCBpZmQsIGludCBvZmQpOworCisvKiBGaW5pc2ggb2ZmIHBhY2sgdHJhbnNmZXIgcmVjZWl2aW5nIGVuZCAqLworZXh0ZXJuIGludCByZWNlaXZlX3VucGFja19wYWNrKGludCBmZFsyXSwgY29uc3QgY2hhciAqbWUsIGludCBxdWlldCk7CitleHRlcm4gaW50IHJlY2VpdmVfa2VlcF9wYWNrKGludCBmZFsyXSwgY29uc3QgY2hhciAqbWUsIGludCBxdWlldCk7CisKKy8qIHBhZ2VyLmMgKi8KK2V4dGVybiB2b2lkIHNldHVwX3BhZ2VyKHZvaWQpOworCisvKiBiYXNlODUgKi8KK2ludCBkZWNvZGVfODUoY2hhciAqZHN0LCBjaGFyICpsaW5lLCBpbnQgbGluZWxlbik7Cit2b2lkIGVuY29kZV84NShjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBieXRlcyk7CisKKyNlbmRpZiAvKiBDQUNIRV9IICovCmRpZmYgLS1naXQgYS9jaGVja291dC1pbmRleC5jIGIvY2hlY2tvdXQtaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQwYmMyCi0tLSAvZGV2L251bGwKKysrIGIvY2hlY2tvdXQtaW5kZXguYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENoZWNrLW91dCBmaWxlcyBmcm9tIHRoZSAiY3VycmVudCBjYWNoZSBkaXJlY3RvcnkiCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IExpbnVzIFRvcnZhbGRzCisgKgorICogQ2FyZWZ1bDogb3JkZXIgb2YgYXJndW1lbnQgZmxhZ3MgZG9lcyBtYXR0ZXIuIEZvciBleGFtcGxlLAorICoKKyAqCWdpdC1jaGVja291dC1pbmRleCAtYSAtZiBmaWxlLmMKKyAqCisgKiBXaWxsIGZpcnN0IGNoZWNrIG91dCBhbGwgZmlsZXMgbGlzdGVkIGluIHRoZSBjYWNoZSAoYnV0IG5vdAorICogb3ZlcndyaXRlIGFueSBvbGQgb25lcyksIGFuZCB0aGVuIGZvcmNlLWNoZWNrb3V0ICJmaWxlLmMiIGEKKyAqIHNlY29uZCB0aW1lIChpZSB0aGF0IG9uZSBfd2lsbF8gb3ZlcndyaXRlIGFueSBvbGQgY29udGVudHMKKyAqIHdpdGggdGhlIHNhbWUgZmlsZW5hbWUpLgorICoKKyAqIEFsc28sIGp1c3QgZG9pbmcgImdpdC1jaGVja291dC1pbmRleCIgZG9lcyBub3RoaW5nLiBZb3UgcHJvYmFibHkKKyAqIG1lYW50ICJnaXQtY2hlY2tvdXQtaW5kZXggLWEiLiBBbmQgaWYgeW91IHdhbnQgdG8gZm9yY2UgaXQsIHlvdQorICogd2FudCAiZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hIi4KKyAqCisgKiBJbnR1aXRpdmVuZXNzIGlzIG5vdCB0aGUgZ29hbCBoZXJlLiBSZXBlYXRhYmlsaXR5IGlzLiBUaGUKKyAqIHJlYXNvbiBmb3IgdGhlICJubyBhcmd1bWVudHMgbWVhbnMgbm8gd29yayIgdGhpbmcgaXMgdGhhdAorICogZnJvbSBzY3JpcHRzIHlvdSBhcmUgc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBkbyB0aGluZ3MgbGlrZQorICoKKyAqCWZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgeGFyZ3MgLTAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tCisgKgorICogb3I6CisgKgorICoJZmluZCAuIC1uYW1lICcqLmgnIC1wcmludDAgfCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXogLS1zdGRpbgorICoKKyAqIHdoaWNoIHdpbGwgZm9yY2UgYWxsIGV4aXN0aW5nICouaCBmaWxlcyB0byBiZSByZXBsYWNlZCB3aXRoCisgKiB0aGVpciBjYWNoZWQgY29waWVzLiBJZiBhbiBlbXB0eSBjb21tYW5kIGxpbmUgaW1wbGllZCAiYWxsIiwKKyAqIHRoZW4gdGhpcyB3b3VsZCBmb3JjZS1yZWZyZXNoIGV2ZXJ5dGhpbmcgaW4gdGhlIGNhY2hlLCB3aGljaAorICogd2FzIG5vdCB0aGUgcG9pbnQuCisgKgorICogT2gsIGFuZCB0aGUgIi0tIiBpcyBqdXN0IGEgZ29vZCBpZGVhIHdoZW4geW91IGtub3cgdGhlIHJlc3QKKyAqIHdpbGwgYmUgZmlsZW5hbWVzLiBKdXN0IHNvIHRoYXQgeW91IHdvdWxkbid0IGhhdmUgYSBmaWxlbmFtZQorICogb2YgIi1hIiBjYXVzaW5nIHByb2JsZW1zIChub3QgcG9zc2libGUgaW4gdGhlIGFib3ZlIGV4YW1wbGUsCisgKiBidXQgZ2V0IHVzZWQgdG8gaXQgaW4gc2NyaXB0aW5nISkuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCisjZGVmaW5lIENIRUNLT1VUX0FMTCA0CitzdGF0aWMgY29uc3QgY2hhciAqcHJlZml4Oworc3RhdGljIGludCBwcmVmaXhfbGVuZ3RoOworc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKK3N0YXRpYyBpbnQgY2hlY2tvdXRfc3RhZ2U7IC8qIGRlZmF1bHQgdG8gY2hlY2tvdXQgc3RhZ2UwICovCitzdGF0aWMgaW50IHRvX3RlbXBmaWxlOworc3RhdGljIGNoYXIgdG9wYXRoWzRdW01BWFBBVEhMRU4rMV07CisKK3N0YXRpYyBzdHJ1Y3QgY2hlY2tvdXQgc3RhdGUgPSB7CisJLmJhc2VfZGlyID0gIiIsCisJLmJhc2VfZGlyX2xlbiA9IDAsCisJLmZvcmNlID0gMCwKKwkucXVpZXQgPSAwLAorCS5ub3RfbmV3ID0gMCwKKwkucmVmcmVzaF9jYWNoZSA9IDAsCit9OworCitzdGF0aWMgdm9pZCB3cml0ZV90ZW1wZmlsZV9yZWNvcmQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlpZiAoQ0hFQ0tPVVRfQUxMID09IGNoZWNrb3V0X3N0YWdlKSB7CisJCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJCWlmIChpID4gMSkKKwkJCQlwdXRjaGFyKCcgJyk7CisJCQlpZiAodG9wYXRoW2ldWzBdKQorCQkJCWZwdXRzKHRvcGF0aFtpXSwgc3Rkb3V0KTsKKwkJCWVsc2UKKwkJCQlwdXRjaGFyKCcuJyk7CisJCX0KKwl9IGVsc2UKKwkJZnB1dHModG9wYXRoW2NoZWNrb3V0X3N0YWdlXSwgc3Rkb3V0KTsKKworCXB1dGNoYXIoJ1x0Jyk7CisJd3JpdGVfbmFtZV9xdW90ZWQoIiIsIDAsIG5hbWUgKyBwcmVmaXhfbGVuZ3RoLAorCQlsaW5lX3Rlcm1pbmF0aW9uLCBzdGRvdXQpOworCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXRvcGF0aFtpXVswXSA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IGNoZWNrb3V0X2ZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MobmFtZSwgbmFtZWxlbik7CisJaW50IGhhc19zYW1lX25hbWUgPSAwOworCWludCBkaWRfY2hlY2tvdXQgPSAwOworCWludCBlcnJzID0gMDsKKworCWlmIChwb3MgPCAwKQorCQlwb3MgPSAtcG9zIC0gMTsKKworCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlpZiAoY2VfbmFtZWxlbihjZSkgIT0gbmFtZWxlbiB8fAorCQkgICAgbWVtY21wKGNlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSkKKwkJCWJyZWFrOworCQloYXNfc2FtZV9uYW1lID0gMTsKKwkJcG9zKys7CisJCWlmIChjZV9zdGFnZShjZSkgIT0gY2hlY2tvdXRfc3RhZ2UKKwkJICAgICYmIChDSEVDS09VVF9BTEwgIT0gY2hlY2tvdXRfc3RhZ2UgfHwgIWNlX3N0YWdlKGNlKSkpCisJCQljb250aW51ZTsKKwkJZGlkX2NoZWNrb3V0ID0gMTsKKwkJaWYgKGNoZWNrb3V0X2VudHJ5KGNlLCAmc3RhdGUsCisJCSAgICB0b190ZW1wZmlsZSA/IHRvcGF0aFtjZV9zdGFnZShjZSldIDogTlVMTCkgPCAwKQorCQkJZXJycysrOworCX0KKworCWlmIChkaWRfY2hlY2tvdXQpIHsKKwkJaWYgKHRvX3RlbXBmaWxlKQorCQkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKG5hbWUpOworCQlyZXR1cm4gZXJycyA+IDAgPyAtMSA6IDA7CisJfQorCisJaWYgKCFzdGF0ZS5xdWlldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1jaGVja291dC1pbmRleDogJXMgIiwgbmFtZSk7CisJCWlmICghaGFzX3NhbWVfbmFtZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiaXMgbm90IGluIHRoZSBjYWNoZSIpOworCQllbHNlIGlmIChjaGVja291dF9zdGFnZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9lcyBub3QgZXhpc3QgYXQgc3RhZ2UgJWQiLAorCQkJCWNoZWNrb3V0X3N0YWdlKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJpcyB1bm1lcmdlZCIpOworCQlmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tvdXRfYWxsKHZvaWQpCit7CisJaW50IGksIGVycnMgPSAwOworCXN0cnVjdCBjYWNoZV9lbnRyeSogbGFzdF9jZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yIDsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkgIT0gY2hlY2tvdXRfc3RhZ2UKKwkJICAgICYmIChDSEVDS09VVF9BTEwgIT0gY2hlY2tvdXRfc3RhZ2UgfHwgIWNlX3N0YWdlKGNlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHByZWZpeCAmJiAqcHJlZml4ICYmCisJCSAgICAoY2VfbmFtZWxlbihjZSkgPD0gcHJlZml4X2xlbmd0aCB8fAorCQkgICAgIG1lbWNtcChwcmVmaXgsIGNlLT5uYW1lLCBwcmVmaXhfbGVuZ3RoKSkpCisJCQljb250aW51ZTsKKwkJaWYgKGxhc3RfY2UgJiYgdG9fdGVtcGZpbGUpIHsKKwkJCWlmIChjZV9uYW1lbGVuKGxhc3RfY2UpICE9IGNlX25hbWVsZW4oY2UpCisJCQkgICAgfHwgbWVtY21wKGxhc3RfY2UtPm5hbWUsIGNlLT5uYW1lLCBjZV9uYW1lbGVuKGNlKSkpCisJCQkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKGxhc3RfY2UtPm5hbWUpOworCQl9CisJCWlmIChjaGVja291dF9lbnRyeShjZSwgJnN0YXRlLAorCQkgICAgdG9fdGVtcGZpbGUgPyB0b3BhdGhbY2Vfc3RhZ2UoY2UpXSA6IE5VTEwpIDwgMCkKKwkJCWVycnMrKzsKKwkJbGFzdF9jZSA9IGNlOworCX0KKwlpZiAobGFzdF9jZSAmJiB0b190ZW1wZmlsZSkKKwkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKGxhc3RfY2UtPm5hbWUpOworCWlmIChlcnJzKQorCQkvKiB3ZSBoYXZlIGFscmVhZHkgZG9uZSBvdXIgZXJyb3IgcmVwb3J0aW5nLgorCQkgKiBleGl0IHdpdGggdGhlIHNhbWUgY29kZSBhcyBkaWUoKS4KKwkJICovCisJCWV4aXQoMTI4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgY2hlY2tvdXRfY2FjaGVfdXNhZ2VbXSA9CisiZ2l0LWNoZWNrb3V0LWluZGV4IFstdV0gWy1xXSBbLWFdIFstZl0gWy1uXSBbLS1zdGFnZT1bMTIzXXxhbGxdIFstLXByZWZpeD08c3RyaW5nPl0gWy0tdGVtcF0gWy0tXSA8ZmlsZT4uLi4iOworCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwlpbnQgbmV3ZmQgPSAtMTsKKwlpbnQgYWxsID0gMDsKKwlpbnQgcmVhZF9mcm9tX3N0ZGluID0gMDsKKworCXByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJcHJlZml4X2xlbmd0aCA9IHByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKworCWlmIChyZWFkX2NhY2hlKCkgPCAwKSB7CisJCWRpZSgiaW52YWxpZCBjYWNoZSIpOworCX0KKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItYSIpIHx8ICFzdHJjbXAoYXJnLCAiLS1hbGwiKSkgeworCQkJYWxsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1mIikgfHwgIXN0cmNtcChhcmcsICItLWZvcmNlIikpIHsKKwkJCXN0YXRlLmZvcmNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1xIikgfHwgIXN0cmNtcChhcmcsICItLXF1aWV0IikpIHsKKwkJCXN0YXRlLnF1aWV0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1uIikgfHwgIXN0cmNtcChhcmcsICItLW5vLWNyZWF0ZSIpKSB7CisJCQlzdGF0ZS5ub3RfbmV3ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi11IikgfHwgIXN0cmNtcChhcmcsICItLWluZGV4IikpIHsKKwkJCXN0YXRlLnJlZnJlc2hfY2FjaGUgPSAxOworCQkJaWYgKG5ld2ZkIDwgMCkKKwkJCQluZXdmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUKKwkJCQkJKCZsb2NrX2ZpbGUsIGdldF9pbmRleF9maWxlKCkpOworCQkJaWYgKG5ld2ZkIDwgMCkKKwkJCQlkaWUoImNhbm5vdCBvcGVuIGluZGV4LmxvY2sgZmlsZS4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi16IikpIHsKKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdGRpbiIpKSB7CisJCQlpZiAoaSAhPSBhcmdjIC0gMSkKKwkJCQlkaWUoIi0tc3RkaW4gbXVzdCBiZSBhdCB0aGUgZW5kIik7CisJCQlyZWFkX2Zyb21fc3RkaW4gPSAxOworCQkJaSsrOyAvKiBkbyBub3QgY29uc2lkZXIgYXJnIGFzIGEgZmlsZSBuYW1lICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXRlbXAiKSkgeworCQkJdG9fdGVtcGZpbGUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tcHJlZml4PSIsIDkpKSB7CisJCQlzdGF0ZS5iYXNlX2RpciA9IGFyZys5OworCQkJc3RhdGUuYmFzZV9kaXJfbGVuID0gc3RybGVuKHN0YXRlLmJhc2VfZGlyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLXN0YWdlPSIsIDgpKSB7CisJCQlpZiAoIXN0cmNtcChhcmcgKyA4LCAiYWxsIikpIHsKKwkJCQl0b190ZW1wZmlsZSA9IDE7CisJCQkJY2hlY2tvdXRfc3RhZ2UgPSBDSEVDS09VVF9BTEw7CisJCQl9IGVsc2UgeworCQkJCWludCBjaCA9IGFyZ1s4XTsKKwkJCQlpZiAoJzEnIDw9IGNoICYmIGNoIDw9ICczJykKKwkJCQkJY2hlY2tvdXRfc3RhZ2UgPSBhcmdbOF0gLSAnMCc7CisJCQkJZWxzZQorCQkJCQlkaWUoInN0YWdlIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDMgb3IgYWxsIik7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXJnWzBdID09ICctJykKKwkJCXVzYWdlKGNoZWNrb3V0X2NhY2hlX3VzYWdlKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHN0YXRlLmJhc2VfZGlyX2xlbiB8fCB0b190ZW1wZmlsZSkgeworCQkvKiB3aGVuIC0tcHJlZml4IGlzIHNwZWNpZmllZCB3ZSBkbyBub3QKKwkJICogd2FudCB0byB1cGRhdGUgY2FjaGUuCisJCSAqLworCQlpZiAoc3RhdGUucmVmcmVzaF9jYWNoZSkgeworCQkJY2xvc2UobmV3ZmQpOyBuZXdmZCA9IC0xOworCQkJcm9sbGJhY2tfbG9ja19maWxlKCZsb2NrX2ZpbGUpOworCQl9CisJCXN0YXRlLnJlZnJlc2hfY2FjaGUgPSAwOworCX0KKworCS8qIENoZWNrIG91dCBuYW1lZCBmaWxlcyBmaXJzdCAqLworCWZvciAoIDsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQljb25zdCBjaGFyICpwOworCisJCWlmIChhbGwpCisJCQlkaWUoImdpdC1jaGVja291dC1pbmRleDogZG9uJ3QgbWl4ICctLWFsbCcgYW5kIGV4cGxpY2l0IGZpbGVuYW1lcyIpOworCQlpZiAocmVhZF9mcm9tX3N0ZGluKQorCQkJZGllKCJnaXQtY2hlY2tvdXQtaW5kZXg6IGRvbid0IG1peCAnLS1zdGRpbicgYW5kIGV4cGxpY2l0IGZpbGVuYW1lcyIpOworCQlwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBhcmcpOworCQljaGVja291dF9maWxlKHApOworCQlpZiAocCA8IGFyZyB8fCBwID4gYXJnICsgc3RybGVuKGFyZykpCisJCQlmcmVlKChjaGFyKilwKTsKKwl9CisKKwlpZiAocmVhZF9mcm9tX3N0ZGluKSB7CisJCXN0cnVjdCBzdHJidWYgYnVmOworCQlpZiAoYWxsKQorCQkJZGllKCJnaXQtY2hlY2tvdXQtaW5kZXg6IGRvbid0IG1peCAnLS1hbGwnIGFuZCAnLS1zdGRpbiciKTsKKwkJc3RyYnVmX2luaXQoJmJ1Zik7CisJCXdoaWxlICgxKSB7CisJCQljaGFyICpwYXRoX25hbWU7CisJCQljb25zdCBjaGFyICpwOworCisJCQlyZWFkX2xpbmUoJmJ1Ziwgc3RkaW4sIGxpbmVfdGVybWluYXRpb24pOworCQkJaWYgKGJ1Zi5lb2YpCisJCQkJYnJlYWs7CisJCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBidWYuYnVmWzBdID09ICciJykKKwkJCQlwYXRoX25hbWUgPSB1bnF1b3RlX2Nfc3R5bGUoYnVmLmJ1ZiwgTlVMTCk7CisJCQllbHNlCisJCQkJcGF0aF9uYW1lID0gYnVmLmJ1ZjsKKwkJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIHBhdGhfbmFtZSk7CisJCQljaGVja291dF9maWxlKHApOworCQkJaWYgKHAgPCBwYXRoX25hbWUgfHwgcCA+IHBhdGhfbmFtZSArIHN0cmxlbihwYXRoX25hbWUpKQorCQkJCWZyZWUoKGNoYXIgKilwKTsKKwkJCWlmIChwYXRoX25hbWUgIT0gYnVmLmJ1ZikKKwkJCQlmcmVlKHBhdGhfbmFtZSk7CisJCX0KKwl9CisKKwlpZiAoYWxsKQorCQljaGVja291dF9hbGwoKTsKKworCWlmICgwIDw9IG5ld2ZkICYmCisJICAgICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJICAgICBjb21taXRfbG9ja19maWxlKCZsb2NrX2ZpbGUpKSkKKwkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2Nsb25lLXBhY2suYyBiL2Nsb25lLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDM3MGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY2xvbmUtcGFjay5jCkBAIC0wLDAgKzEsMTg2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgY2xvbmVfcGFja191c2FnZVtdID0KKyJnaXQtY2xvbmUtcGFjayBbLS1leGVjPTxnaXQtdXBsb2FkLXBhY2s+XSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiBbPGhlYWRzPl0qIjsKK3N0YXRpYyBjb25zdCBjaGFyICpleGVjID0gImdpdC11cGxvYWQtcGFjayI7CisKK3N0YXRpYyBpbnQgcXVpZXQgPSAwOworCitzdGF0aWMgdm9pZCBjbG9uZV9oYW5kc2hha2UoaW50IGZkWzJdLCBzdHJ1Y3QgcmVmICpyZWYpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCXdoaWxlIChyZWYpIHsKKwkJcGFja2V0X3dyaXRlKGZkWzFdLCAid2FudCAlc1xuIiwgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCQlyZWYgPSByZWYtPm5leHQ7CisJfQorCXBhY2tldF9mbHVzaChmZFsxXSk7CisKKwkvKiBXZSBkb24ndCBoYXZlIG51dHRpbicgKi8KKwlwYWNrZXRfd3JpdGUoZmRbMV0sICJkb25lXG4iKTsKKwlpZiAoZ2V0X2FjayhmZFswXSwgc2hhMSkpCisJCWVycm9yKCJIdWghIGdpdC1jbG9uZS1wYWNrIGdvdCBwb3NpdGl2ZSBhY2sgZm9yICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworfQorCitzdGF0aWMgaW50IGlzX21hc3RlcihzdHJ1Y3QgcmVmICpyZWYpCit7CisJcmV0dXJuICFzdHJjbXAocmVmLT5uYW1lLCAicmVmcy9oZWFkcy9tYXN0ZXIiKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfb25lX3JlZihzdHJ1Y3QgcmVmICpyZWYpCit7CisJY2hhciAqcGF0aCA9IGdpdF9wYXRoKCIlcyIsIHJlZi0+bmFtZSk7CisJaW50IGZkOworCWNoYXIgKmhleDsKKworCWlmICghc3RybmNtcChyZWYtPm5hbWUsICJyZWZzLyIsIDUpICYmCisJICAgIGNoZWNrX3JlZl9mb3JtYXQocmVmLT5uYW1lICsgNSkpIHsKKwkJZXJyb3IoInJlZnVzaW5nIHRvIGNyZWF0ZSBmdW5ueSByZWYgJyVzJyBsb2NhbGx5IiwgcmVmLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKHBhdGgpKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgbGVhZGluZyBkaXJlY3RvcnkgZm9yICVzIiwgcmVmLT5uYW1lKTsKKwlmZCA9IG9wZW4ocGF0aCwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KTsKKwlpZiAoZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgcmVmICVzIiwgcmVmLT5uYW1lKTsKKwloZXggPSBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKTsKKwloZXhbNDBdID0gJ1xuJzsKKwlpZiAod3JpdGUoZmQsIGhleCwgNDEpICE9IDQxKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSByZWYgJXMiLCByZWYtPm5hbWUpOworCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcmVmcyhzdHJ1Y3QgcmVmICpyZWYpCit7CisJc3RydWN0IHJlZiAqaGVhZCA9IE5VTEwsICpoZWFkX3B0ciwgKm1hc3Rlcl9yZWY7CisJY2hhciAqaGVhZF9wYXRoOworCisJLyogVXBsb2FkLXBhY2sgbXVzdCByZXBvcnQgSEVBRCBmaXJzdCAqLworCWlmICghc3RyY21wKHJlZi0+bmFtZSwgIkhFQUQiKSkgeworCQloZWFkID0gcmVmOworCQlyZWYgPSByZWYtPm5leHQ7CisJfQorCWhlYWRfcHRyID0gTlVMTDsKKwltYXN0ZXJfcmVmID0gTlVMTDsKKwl3aGlsZSAocmVmKSB7CisJCWlmIChpc19tYXN0ZXIocmVmKSkKKwkJCW1hc3Rlcl9yZWYgPSByZWY7CisJCWlmIChoZWFkICYmCisJCSAgICAhbWVtY21wKHJlZi0+b2xkX3NoYTEsIGhlYWQtPm9sZF9zaGExLCAyMCkgJiYKKwkJICAgICFzdHJuY21wKHJlZi0+bmFtZSwgInJlZnMvaGVhZHMvIiwxMSkgJiYKKwkJICAgICghaGVhZF9wdHIgfHwgcmVmID09IG1hc3Rlcl9yZWYpKQorCQkJaGVhZF9wdHIgPSByZWY7CisKKwkJd3JpdGVfb25lX3JlZihyZWYpOworCQlyZWYgPSByZWYtPm5leHQ7CisJfQorCWlmICghaGVhZCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIEhFQUQgaW4gcmVtb3RlLlxuIik7CisJCXJldHVybjsKKwl9CisKKwloZWFkX3BhdGggPSBzdHJkdXAoZ2l0X3BhdGgoIkhFQUQiKSk7CisJaWYgKCFoZWFkX3B0cikgeworCQkvKgorCQkgKiBJZiB3ZSBoYWQgYSBtYXN0ZXIgcmVmLCBhbmQgaXQgd2Fzbid0IEhFQUQsIHdlIG5lZWQgdG8gdW5kbyB0aGUKKwkJICogc3ltbGluaywgYW5kIHdyaXRlIGEgc3RhbmRhbG9uZSBIRUFELiBHaXZlIGEgd2FybmluZywgYmVjYXVzZSB0aGF0J3MKKwkJICogcmVhbGx5IHJlYWxseSB3cm9uZy4KKwkJICovCisJCWlmIChtYXN0ZXJfcmVmKSB7CisJCQllcnJvcigiSEVBRCBkb2Vzbid0IHBvaW50IHRvIGFueSByZWZzISBNYWtpbmcgc3RhbmRhbG9uZSBIRUFEIik7CisJCQl1bmxpbmsoaGVhZF9wYXRoKTsKKwkJfQorCQl3cml0ZV9vbmVfcmVmKGhlYWQpOworCQlmcmVlKGhlYWRfcGF0aCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSByZXNldCB0byB0aGUgbWFzdGVyIGJyYW5jaCBpZiBpdCdzIGF2YWlsYWJsZSAqLworCWlmIChtYXN0ZXJfcmVmKQorCQlyZXR1cm47CisKKwlmcHJpbnRmKHN0ZGVyciwgIlNldHRpbmcgSEVBRCB0byAlc1xuIiwgaGVhZF9wdHItPm5hbWUpOworCisJLyoKKwkgKiBVaGh1aC4gT3RoZXIgZW5kIGRpZG4ndCBoYXZlIG1hc3Rlci4gV2Ugc3RhcnQgSEVBRCBvZmYgd2l0aAorCSAqIHRoZSBmaXJzdCBicmFuY2ggd2l0aCB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwlpZiAoY3JlYXRlX3N5bXJlZihoZWFkX3BhdGgsIGhlYWRfcHRyLT5uYW1lKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIGxpbmsgSEVBRCB0byAlcyIsIGhlYWRfcHRyLT5uYW1lKTsKKwlmcmVlKGhlYWRfcGF0aCk7Cit9CisKK3N0YXRpYyBpbnQgY2xvbmVfcGFjayhpbnQgZmRbMl0sIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoKQoreworCXN0cnVjdCByZWYgKnJlZnM7CisJaW50IHN0YXR1czsKKworCWdldF9yZW1vdGVfaGVhZHMoZmRbMF0sICZyZWZzLCBucl9tYXRjaCwgbWF0Y2gsIDEpOworCWlmICghcmVmcykgeworCQlwYWNrZXRfZmx1c2goZmRbMV0pOworCQlkaWUoIm5vIG1hdGNoaW5nIHJlbW90ZSBoZWFkIik7CisJfQorCWNsb25lX2hhbmRzaGFrZShmZCwgcmVmcyk7CisKKwlzdGF0dXMgPSByZWNlaXZlX2tlZXBfcGFjayhmZCwgImdpdC1jbG9uZS1wYWNrIiwgcXVpZXQpOworCWlmICghcXVpZXQpCisJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCWlmICghc3RhdHVzKSB7CisJCWlmIChucl9tYXRjaCA9PSAwKQorCQkJd3JpdGVfcmVmcyhyZWZzKTsKKwkJZWxzZQorCQkJd2hpbGUgKHJlZnMpIHsKKwkJCQlwcmludGYoIiVzICVzXG4iLAorCQkJCSAgICAgICBzaGExX3RvX2hleChyZWZzLT5vbGRfc2hhMSksCisJCQkJICAgICAgIHJlZnMtPm5hbWUpOworCQkJCXJlZnMgPSByZWZzLT5uZXh0OworCQkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIHJldCwgbnJfaGVhZHM7CisJY2hhciAqZGVzdCA9IE5VTEwsICoqaGVhZHM7CisJaW50IGZkWzJdOworCXBpZF90IHBpZDsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCW5yX2hlYWRzID0gMDsKKwloZWFkcyA9IE5VTEw7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoIi1xIiwgYXJnKSkgeworCQkJCXF1aWV0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcCgiLS1leGVjPSIsIGFyZywgNykpIHsKKwkJCQlleGVjID0gYXJnICsgNzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKGNsb25lX3BhY2tfdXNhZ2UpOworCQl9CisJCWRlc3QgPSBhcmc7CisJCWhlYWRzID0gYXJndiArIGkgKyAxOworCQlucl9oZWFkcyA9IGFyZ2MgLSBpIC0gMTsKKwkJYnJlYWs7CisJfQorCWlmICghZGVzdCkKKwkJdXNhZ2UoY2xvbmVfcGFja191c2FnZSk7CisJcGlkID0gZ2l0X2Nvbm5lY3QoZmQsIGRlc3QsIGV4ZWMpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gMTsKKwlyZXQgPSBjbG9uZV9wYWNrKGZkLCBucl9oZWFkcywgaGVhZHMpOworCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJZmluaXNoX2Nvbm5lY3QocGlkKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29tYmluZS1kaWZmLmMgYi9jb21iaW5lLWRpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIyMGNjCi0tLSAvZGV2L251bGwKKysrIGIvY29tYmluZS1kaWZmLmMKQEAgLTAsMCArMSw5MjMgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgInhkaWZmLWludGVyZmFjZS5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisKK3N0YXRpYyBpbnQgdW5pbnRlcmVzdGluZyhzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCkKK3sKKwlpZiAoZGlmZl91bm1vZGlmaWVkX3BhaXIocCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICppbnRlcnNlY3RfcGF0aHMoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpjdXJyLCBpbnQgbiwgaW50IG51bV9wYXJlbnQpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpwOworCWludCBpOworCisJaWYgKCFuKSB7CisJCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqbGlzdCA9IE5VTEwsICoqdGFpbCA9ICZsaXN0OworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJaW50IGxlbjsKKwkJCWNvbnN0IGNoYXIgKnBhdGg7CisJCQlpZiAodW5pbnRlcmVzdGluZyhxLT5xdWV1ZVtpXSkpCisJCQkJY29udGludWU7CisJCQlwYXRoID0gcS0+cXVldWVbaV0tPnR3by0+cGF0aDsKKwkJCWxlbiA9IHN0cmxlbihwYXRoKTsKKwkJCXAgPSB4bWFsbG9jKGNvbWJpbmVfZGlmZl9wYXRoX3NpemUobnVtX3BhcmVudCwgbGVuKSk7CisJCQlwLT5wYXRoID0gKGNoYXIqKSAmKHAtPnBhcmVudFtudW1fcGFyZW50XSk7CisJCQltZW1jcHkocC0+cGF0aCwgcGF0aCwgbGVuKTsKKwkJCXAtPnBhdGhbbGVuXSA9IDA7CisJCQlwLT5sZW4gPSBsZW47CisJCQlwLT5uZXh0ID0gTlVMTDsKKwkJCW1lbXNldChwLT5wYXJlbnQsIDAsCisJCQkgICAgICAgc2l6ZW9mKHAtPnBhcmVudFswXSkgKiBudW1fcGFyZW50KTsKKworCQkJbWVtY3B5KHAtPnNoYTEsIHEtPnF1ZXVlW2ldLT50d28tPnNoYTEsIDIwKTsKKwkJCXAtPm1vZGUgPSBxLT5xdWV1ZVtpXS0+dHdvLT5tb2RlOworCQkJbWVtY3B5KHAtPnBhcmVudFtuXS5zaGExLCBxLT5xdWV1ZVtpXS0+b25lLT5zaGExLCAyMCk7CisJCQlwLT5wYXJlbnRbbl0ubW9kZSA9IHEtPnF1ZXVlW2ldLT5vbmUtPm1vZGU7CisJCQlwLT5wYXJlbnRbbl0uc3RhdHVzID0gcS0+cXVldWVbaV0tPnN0YXR1czsKKwkJCSp0YWlsID0gcDsKKwkJCXRhaWwgPSAmcC0+bmV4dDsKKwkJfQorCQlyZXR1cm4gbGlzdDsKKwl9CisKKwlmb3IgKHAgPSBjdXJyOyBwOyBwID0gcC0+bmV4dCkgeworCQlpbnQgZm91bmQgPSAwOworCQlpZiAoIXAtPmxlbikKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aDsKKwkJCWludCBsZW47CisKKwkJCWlmICh1bmludGVyZXN0aW5nKHEtPnF1ZXVlW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCXBhdGggPSBxLT5xdWV1ZVtpXS0+dHdvLT5wYXRoOworCQkJbGVuID0gc3RybGVuKHBhdGgpOworCQkJaWYgKGxlbiA9PSBwLT5sZW4gJiYgIW1lbWNtcChwYXRoLCBwLT5wYXRoLCBsZW4pKSB7CisJCQkJZm91bmQgPSAxOworCQkJCW1lbWNweShwLT5wYXJlbnRbbl0uc2hhMSwKKwkJCQkgICAgICAgcS0+cXVldWVbaV0tPm9uZS0+c2hhMSwgMjApOworCQkJCXAtPnBhcmVudFtuXS5tb2RlID0gcS0+cXVldWVbaV0tPm9uZS0+bW9kZTsKKwkJCQlwLT5wYXJlbnRbbl0uc3RhdHVzID0gcS0+cXVldWVbaV0tPnN0YXR1czsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKQorCQkJcC0+bGVuID0gMDsKKwl9CisJcmV0dXJuIGN1cnI7Cit9CisKKy8qIExpbmVzIGxvc3QgZnJvbSBwYXJlbnQgKi8KK3N0cnVjdCBsbGluZSB7CisJc3RydWN0IGxsaW5lICpuZXh0OworCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfbWFwOworCWNoYXIgbGluZVtGTEVYX0FSUkFZXTsKK307CisKKy8qIExpbmVzIHN1cnZpdmluZyBpbiB0aGUgbWVyZ2UgcmVzdWx0ICovCitzdHJ1Y3Qgc2xpbmUgeworCXN0cnVjdCBsbGluZSAqbG9zdF9oZWFkLCAqKmxvc3RfdGFpbDsKKwljaGFyICpib2w7CisJaW50IGxlbjsKKwkvKiBiaXQgMCB1cCB0byAoTi0xKSBhcmUgb24gaWYgdGhlIHBhcmVudCBoYXMgdGhpcyBsaW5lIChpLmUuCisJICogd2UgZGlkIG5vdCBjaGFuZ2UgaXQpLgorCSAqIGJpdCBOIGlzIHVzZWQgZm9yICJpbnRlcmVzdGluZyIgbGluZXMsIGluY2x1ZGluZyBjb250ZXh0LgorCSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwl1bnNpZ25lZCBsb25nICpwX2xubzsKK307CisKK3N0YXRpYyBjaGFyICpncmFiX2Jsb2IoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwljaGFyICpibG9iOworCWNoYXIgdHlwZVsyMF07CisJaWYgKCFtZW1jbXAoc2hhMSwgbnVsbF9zaGExLCAyMCkpIHsKKwkJLyogZGVsZXRlZCBibG9iICovCisJCSpzaXplID0gMDsKKwkJcmV0dXJuIHhjYWxsb2MoMSwgMSk7CisJfQorCWJsb2IgPSByZWFkX3NoYTFfZmlsZShzaGExLCB0eXBlLCBzaXplKTsKKwlpZiAoc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpCisJCWRpZSgib2JqZWN0ICclcycgaXMgbm90IGEgYmxvYiEiLCBzaGExX3RvX2hleChzaGExKSk7CisJcmV0dXJuIGJsb2I7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9sb3N0KHN0cnVjdCBzbGluZSAqc2xpbmUsIGludCBuLCBjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCXN0cnVjdCBsbGluZSAqbGxpbmU7CisJdW5zaWduZWQgbG9uZyB0aGlzX21hc2sgPSAoMVVMPDxuKTsKKwlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJbGVuLS07CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHNxdWFzaCB0aGluZ3MgKi8KKwlpZiAoc2xpbmUtPmxvc3RfaGVhZCkgeworCQlzdHJ1Y3QgbGxpbmUgKmxhc3Rfb25lID0gTlVMTDsKKwkJLyogV2UgY2Fubm90IHNxdWFzaCBpdCB3aXRoIGVhcmxpZXIgb25lICovCisJCWZvciAobGxpbmUgPSBzbGluZS0+bG9zdF9oZWFkOworCQkgICAgIGxsaW5lOworCQkgICAgIGxsaW5lID0gbGxpbmUtPm5leHQpCisJCQlpZiAobGxpbmUtPnBhcmVudF9tYXAgJiB0aGlzX21hc2spCisJCQkJbGFzdF9vbmUgPSBsbGluZTsKKwkJbGxpbmUgPSBsYXN0X29uZSA/IGxhc3Rfb25lLT5uZXh0IDogc2xpbmUtPmxvc3RfaGVhZDsKKwkJd2hpbGUgKGxsaW5lKSB7CisJCQlpZiAobGxpbmUtPmxlbiA9PSBsZW4gJiYKKwkJCSAgICAhbWVtY21wKGxsaW5lLT5saW5lLCBsaW5lLCBsZW4pKSB7CisJCQkJbGxpbmUtPnBhcmVudF9tYXAgfD0gdGhpc19tYXNrOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWxsaW5lID0gbGxpbmUtPm5leHQ7CisJCX0KKwl9CisKKwlsbGluZSA9IHhtYWxsb2Moc2l6ZW9mKCpsbGluZSkgKyBsZW4gKyAxKTsKKwlsbGluZS0+bGVuID0gbGVuOworCWxsaW5lLT5uZXh0ID0gTlVMTDsKKwlsbGluZS0+cGFyZW50X21hcCA9IHRoaXNfbWFzazsKKwltZW1jcHkobGxpbmUtPmxpbmUsIGxpbmUsIGxlbik7CisJbGxpbmUtPmxpbmVbbGVuXSA9IDA7CisJKnNsaW5lLT5sb3N0X3RhaWwgPSBsbGluZTsKKwlzbGluZS0+bG9zdF90YWlsID0gJmxsaW5lLT5uZXh0OworfQorCitzdHJ1Y3QgY29tYmluZV9kaWZmX3N0YXRlIHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKworCXVuc2lnbmVkIGludCBsbm87CisJaW50IG9iLCBvbiwgbmIsIG5uOworCXVuc2lnbmVkIGxvbmcgbm1hc2s7CisJaW50IG51bV9wYXJlbnQ7CisJaW50IG47CisJc3RydWN0IHNsaW5lICpzbGluZTsKKwlzdHJ1Y3Qgc2xpbmUgKmxvc3RfYnVja2V0OworfTsKKworc3RhdGljIHZvaWQgY29uc3VtZV9saW5lKHZvaWQgKnN0YXRlXywgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGNvbWJpbmVfZGlmZl9zdGF0ZSAqc3RhdGUgPSBzdGF0ZV87CisJaWYgKDUgPCBsZW4gJiYgIW1lbWNtcCgiQEAgLSIsIGxpbmUsIDQpKSB7CisJCWlmIChwYXJzZV9odW5rX2hlYWRlcihsaW5lLCBsZW4sCisJCQkJICAgICAgJnN0YXRlLT5vYiwgJnN0YXRlLT5vbiwKKwkJCQkgICAgICAmc3RhdGUtPm5iLCAmc3RhdGUtPm5uKSkKKwkJCXJldHVybjsKKwkJc3RhdGUtPmxubyA9IHN0YXRlLT5uYjsKKwkJaWYgKCFzdGF0ZS0+bmIpCisJCQkvKiBAQCAtMSwyICswLDAgQEAgdG8gcmVtb3ZlIHRoZQorCQkJICogZmlyc3QgdHdvIGxpbmVzLi4uCisJCQkgKi8KKwkJCXN0YXRlLT5uYiA9IDE7CisJCWlmIChzdGF0ZS0+bm4gPT0gMCkKKwkJCS8qIEBAIC1YLFkgK04sMCBAQCByZW1vdmVkIFkgbGluZXMKKwkJCSAqIHRoYXQgd291bGQgaGF2ZSBjb21lICphZnRlciogbGluZSBOCisJCQkgKiBpbiB0aGUgcmVzdWx0LiAgT3VyIGxvc3QgYnVja2V0cyBoYW5nCisJCQkgKiB0byB0aGUgbGluZSBhZnRlciB0aGUgcmVtb3ZlZCBsaW5lcywKKwkJCSAqLworCQkJc3RhdGUtPmxvc3RfYnVja2V0ID0gJnN0YXRlLT5zbGluZVtzdGF0ZS0+bmJdOworCQllbHNlCisJCQlzdGF0ZS0+bG9zdF9idWNrZXQgPSAmc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXTsKKwkJaWYgKCFzdGF0ZS0+c2xpbmVbc3RhdGUtPm5iLTFdLnBfbG5vKQorCQkJc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXS5wX2xubyA9CisJCQkJeGNhbGxvYyhzdGF0ZS0+bnVtX3BhcmVudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXS5wX2xub1tzdGF0ZS0+bl0gPSBzdGF0ZS0+b2I7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdGF0ZS0+bG9zdF9idWNrZXQpCisJCXJldHVybjsgLyogbm90IGluIGFueSBodW5rIHlldCAqLworCXN3aXRjaCAobGluZVswXSkgeworCWNhc2UgJy0nOgorCQlhcHBlbmRfbG9zdChzdGF0ZS0+bG9zdF9idWNrZXQsIHN0YXRlLT5uLCBsaW5lKzEsIGxlbi0xKTsKKwkJYnJlYWs7CisJY2FzZSAnKyc6CisJCXN0YXRlLT5zbGluZVtzdGF0ZS0+bG5vLTFdLmZsYWcgfD0gc3RhdGUtPm5tYXNrOworCQlzdGF0ZS0+bG5vKys7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgY29tYmluZV9kaWZmKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhcmVudCwgbW1maWxlX3QgKnJlc3VsdF9maWxlLAorCQkJIHN0cnVjdCBzbGluZSAqc2xpbmUsIGludCBjbnQsIGludCBuLCBpbnQgbnVtX3BhcmVudCkKK3sKKwl1bnNpZ25lZCBpbnQgcF9sbm8sIGxubzsKKwl1bnNpZ25lZCBsb25nIG5tYXNrID0gKDFVTCA8PCBuKTsKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwltbWZpbGVfdCBwYXJlbnRfZmlsZTsKKwl4ZGVtaXRjYl90IGVjYjsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgc3o7CisKKwlpZiAoIWNudCkKKwkJcmV0dXJuOyAvKiByZXN1bHQgZGVsZXRlZCAqLworCisJcGFyZW50X2ZpbGUucHRyID0gZ3JhYl9ibG9iKHBhcmVudCwgJnN6KTsKKwlwYXJlbnRfZmlsZS5zaXplID0gc3o7CisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwl4ZWNmZy5jdHhsZW4gPSAwOworCXhlY2ZnLmZsYWdzID0gMDsKKwllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJZWNiLnByaXYgPSAmc3RhdGU7CisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdGUueG0uY29uc3VtZSA9IGNvbnN1bWVfbGluZTsKKwlzdGF0ZS5ubWFzayA9IG5tYXNrOworCXN0YXRlLnNsaW5lID0gc2xpbmU7CisJc3RhdGUubG5vID0gMTsKKwlzdGF0ZS5udW1fcGFyZW50ID0gbnVtX3BhcmVudDsKKwlzdGF0ZS5uID0gbjsKKworCXhkbF9kaWZmKCZwYXJlbnRfZmlsZSwgcmVzdWx0X2ZpbGUsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJZnJlZShwYXJlbnRfZmlsZS5wdHIpOworCisJLyogQXNzaWduIGxpbmUgbnVtYmVycyBmb3IgdGhpcyBwYXJlbnQuCisJICoKKwkgKiBzbGluZVtsbm9dLnBfbG5vW25dIHJlY29yZHMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyCisJICogKGNvdW50aW5nIGZyb20gMSkgZm9yIHBhcmVudCBOIGlmIHRoZSBmaW5hbCBodW5rIGRpc3BsYXkKKwkgKiBzdGFydGVkIGJ5IHNob3dpbmcgc2xpbmVbbG5vXSAocG9zc2libHkgc2hvd2luZyB0aGUgbG9zdAorCSAqIGxpbmVzIGF0dGFjaGVkIHRvIGl0IGZpcnN0KS4KKwkgKi8KKwlmb3IgKGxubyA9IDAsICBwX2xubyA9IDE7IGxubyA8PSBjbnQ7IGxubysrKSB7CisJCXN0cnVjdCBsbGluZSAqbGw7CisJCXNsaW5lW2xub10ucF9sbm9bbl0gPSBwX2xubzsKKworCQkvKiBIb3cgbWFueSBsaW5lcyB3b3VsZCB0aGlzIHNsaW5lIGFkdmFuY2UgdGhlIHBfbG5vPyAqLworCQlsbCA9IHNsaW5lW2xub10ubG9zdF9oZWFkOworCQl3aGlsZSAobGwpIHsKKwkJCWlmIChsbC0+cGFyZW50X21hcCAmIG5tYXNrKQorCQkJCXBfbG5vKys7IC8qICctJyBtZWFucyBwYXJlbnQgaGFkIGl0ICovCisJCQlsbCA9IGxsLT5uZXh0OworCQl9CisJCWlmIChsbm8gPCBjbnQgJiYgIShzbGluZVtsbm9dLmZsYWcgJiBubWFzaykpCisJCQlwX2xubysrOyAvKiBubyAnKycgbWVhbnMgcGFyZW50IGhhZCBpdCAqLworCX0KKwlzbGluZVtsbm9dLnBfbG5vW25dID0gcF9sbm87IC8qIHRyYWlsZXIgKi8KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29udGV4dCA9IDM7CitzdGF0aWMgY2hhciBjb21iaW5lX21hcmtlciA9ICdAJzsKKworc3RhdGljIGludCBpbnRlcmVzdGluZyhzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGFsbF9tYXNrKQoreworCS8qIElmIHNvbWUgcGFyZW50cyBsb3N0IGxpbmVzIGhlcmUsIG9yIGlmIHdlIGhhdmUgYWRkZWQgdG8KKwkgKiBzb21lIHBhcmVudCwgaXQgaXMgaW50ZXJlc3RpbmcuCisJICovCisJcmV0dXJuICgoc2xpbmUtPmZsYWcgJiBhbGxfbWFzaykgfHwgc2xpbmUtPmxvc3RfaGVhZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFkanVzdF9odW5rX3RhaWwoc3RydWN0IHNsaW5lICpzbGluZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsbF9tYXNrLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaHVua19iZWdpbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGkpCit7CisJLyogaSBwb2ludHMgYXQgdGhlIGZpcnN0IHVuaW50ZXJlc3RpbmcgbGluZS4gIElmIHRoZSBsYXN0IGxpbmUKKwkgKiBvZiB0aGUgaHVuayB3YXMgaW50ZXJlc3Rpbmcgb25seSBiZWNhdXNlIGl0IGhhcyBzb21lCisJICogZGVsZXRpb24sIHRoZW4gaXQgaXMgbm90IGFsbCB0aGF0IGludGVyZXN0aW5nIGZvciB0aGUKKwkgKiBwdXJwb3NlIG9mIGdpdmluZyB0cmFpbGluZyBjb250ZXh0IGxpbmVzLiAgVGhpcyBpcyBiZWNhdXNlCisJICogd2Ugb3V0cHV0ICctJyBsaW5lIGFuZCB0aGVuIHVubW9kaWZpZWQgc2xpbmVbaS0xXSBpdHNlbGYgaW4KKwkgKiB0aGF0IGNhc2Ugd2hpY2ggZ2l2ZXMgdXMgb25lIGV4dHJhIGNvbnRleHQgbGluZS4KKwkgKi8KKwlpZiAoKGh1bmtfYmVnaW4gKyAxIDw9IGkpICYmICEoc2xpbmVbaS0xXS5mbGFnICYgYWxsX21hc2spKQorCQlpLS07CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfbmV4dChzdHJ1Y3Qgc2xpbmUgKnNsaW5lLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWFyaywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGksCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjbnQsCisJCQkgICAgICAgaW50IHVuaW50ZXJlc3RpbmcpCit7CisJLyogV2UgaGF2ZSBleGFtaW5lZCB1cCB0byBpLTEgYW5kIGFyZSBhYm91dCB0byBsb29rIGF0IGkuCisJICogRmluZCBuZXh0IGludGVyZXN0aW5nIG9yIHVuaW50ZXJlc3RpbmcgbGluZS4gIEhlcmUsCisJICogImludGVyZXN0aW5nIiBkb2VzIG5vdCBtZWFuIGludGVyZXN0aW5nKCksIGJ1dCBtYXJrZWQgYnkKKwkgKiB0aGUgZ2l2ZV9jb250ZXh0KCkgZnVuY3Rpb24gYmVsb3cgKGkuZS4gaXQgaW5jbHVkZXMgY29udGV4dAorCSAqIGxpbmVzIHRoYXQgYXJlIG5vdCBpbnRlcmVzdGluZyB0byBpbnRlcmVzdGluZygpIGZ1bmN0aW9uCisJICogdGhhdCBhcmUgc3Vycm91bmRlZCBieSBpbnRlcmVzdGluZygpIG9uZXMuCisJICovCisJd2hpbGUgKGkgPD0gY250KQorCQlpZiAodW5pbnRlcmVzdGluZworCQkgICAgPyAhKHNsaW5lW2ldLmZsYWcgJiBtYXJrKQorCQkgICAgOiAoc2xpbmVbaV0uZmxhZyAmIG1hcmspKQorCQkJcmV0dXJuIGk7CisJCWVsc2UKKwkJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBnaXZlX2NvbnRleHQoc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsIGludCBudW1fcGFyZW50KQoreworCXVuc2lnbmVkIGxvbmcgYWxsX21hc2sgPSAoMVVMPDxudW1fcGFyZW50KSAtIDE7CisJdW5zaWduZWQgbG9uZyBtYXJrID0gKDFVTDw8bnVtX3BhcmVudCk7CisJdW5zaWduZWQgbG9uZyBpOworCisJLyogVHdvIGdyb3VwcyBvZiBpbnRlcmVzdGluZyBsaW5lcyBtYXkgaGF2ZSBhIHNob3J0IGdhcCBvZgorCSAqIHVuaW50ZXJzdGluZyBsaW5lcy4gIENvbm5lY3Qgc3VjaCBncm91cHMgdG8gZ2l2ZSB0aGVtIGEKKwkgKiBiaXQgb2YgY29udGV4dC4KKwkgKgorCSAqIFdlIGZpcnN0IHN0YXJ0IGZyb20gd2hhdCB0aGUgaW50ZXJlc3RpbmcoKSBmdW5jdGlvbiBzYXlzLAorCSAqIGFuZCBtYXJrIHRoZW0gd2l0aCAibWFyayIsIGFuZCBwYWludCBjb250ZXh0IGxpbmVzIHdpdGggdGhlCisJICogbWFyay4gIFNvIGludGVyZXN0aW5nKCkgd291bGQgc3RpbGwgc2F5IGZhbHNlIGZvciBzdWNoIGNvbnRleHQKKwkgKiBsaW5lcyBidXQgdGhleSBhcmUgdHJlYXRlZCBhcyAiaW50ZXJlc3RpbmciIGluIHRoZSBlbmQuCisJICovCisJaSA9IGZpbmRfbmV4dChzbGluZSwgbWFyaywgMCwgY250LCAwKTsKKwlpZiAoY250IDwgaSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoaSA8PSBjbnQpIHsKKwkJdW5zaWduZWQgbG9uZyBqID0gKGNvbnRleHQgPCBpKSA/IChpIC0gY29udGV4dCkgOiAwOworCQl1bnNpZ25lZCBsb25nIGs7CisKKwkJLyogUGFpbnQgYSBmZXcgbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBpbnRlcmVzdGluZyBsaW5lLiAqLworCQl3aGlsZSAoaiA8IGkpCisJCQlzbGluZVtqKytdLmZsYWcgfD0gbWFyazsKKworCWFnYWluOgorCQkvKiB3ZSBrbm93IHVwIHRvIGkgaXMgdG8gYmUgaW5jbHVkZWQuICB3aGVyZSBkb2VzIHRoZQorCQkgKiBuZXh0IHVuaW50ZXJlc3Rpbmcgb25lIHN0YXJ0PworCQkgKi8KKwkJaiA9IGZpbmRfbmV4dChzbGluZSwgbWFyaywgaSwgY250LCAxKTsKKwkJaWYgKGNudCA8IGopCisJCQlicmVhazsgLyogdGhlIHJlc3QgYXJlIGFsbCBpbnRlcmVzdGluZyAqLworCisJCS8qIGxvb2thaGVhZCBjb250ZXh0IGxpbmVzICovCisJCWsgPSBmaW5kX25leHQoc2xpbmUsIG1hcmssIGosIGNudCwgMCk7CisJCWogPSBhZGp1c3RfaHVua190YWlsKHNsaW5lLCBhbGxfbWFzaywgaSwgaik7CisKKwkJaWYgKGsgPCBqICsgY29udGV4dCkgeworCQkJLyogayBpcyBpbnRlcmVzdGluZyBhbmQgW2osaykgYXJlIG5vdCwgYnV0CisJCQkgKiBwYWludCB0aGVtIGludGVyZXN0aW5nIGJlY2F1c2UgdGhlIGdhcCBpcyBzbWFsbC4KKwkJCSAqLworCQkJd2hpbGUgKGogPCBrKQorCQkJCXNsaW5lW2orK10uZmxhZyB8PSBtYXJrOworCQkJaSA9IGs7CisJCQlnb3RvIGFnYWluOworCQl9CisKKwkJLyogaiBpcyB0aGUgZmlyc3QgdW5pbnRlcmVzdGluZyBsaW5lIGFuZCB0aGVyZSBpcworCQkgKiBubyBvdmVybGFwIGJleW9uZCBpdCB3aXRoaW4gY29udGV4dCBsaW5lcy4gIFBhaW50CisJCSAqIHRoZSB0cmFpbGluZyBlZGdlIGEgYml0LgorCQkgKi8KKwkJaSA9IGs7CisJCWsgPSAoaiArIGNvbnRleHQgPCBjbnQrMSkgPyBqICsgY29udGV4dCA6IGNudCsxOworCQl3aGlsZSAoaiA8IGspCisJCQlzbGluZVtqKytdLmZsYWcgfD0gbWFyazsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9odW5rcyhzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGNudCwKKwkJICAgICAgIGludCBudW1fcGFyZW50LCBpbnQgZGVuc2UpCit7CisJdW5zaWduZWQgbG9uZyBhbGxfbWFzayA9ICgxVUw8PG51bV9wYXJlbnQpIC0gMTsKKwl1bnNpZ25lZCBsb25nIG1hcmsgPSAoMVVMPDxudW1fcGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGk7CisJaW50IGhhc19pbnRlcmVzdGluZyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDw9IGNudDsgaSsrKSB7CisJCWlmIChpbnRlcmVzdGluZygmc2xpbmVbaV0sIGFsbF9tYXNrKSkKKwkJCXNsaW5lW2ldLmZsYWcgfD0gbWFyazsKKwkJZWxzZQorCQkJc2xpbmVbaV0uZmxhZyAmPSB+bWFyazsKKwl9CisJaWYgKCFkZW5zZSkKKwkJcmV0dXJuIGdpdmVfY29udGV4dChzbGluZSwgY250LCBudW1fcGFyZW50KTsKKworCS8qIExvb2sgYXQgZWFjaCBodW5rLCBhbmQgaWYgd2UgaGF2ZSBjaGFuZ2VzIGZyb20gb25seSBvbmUKKwkgKiBwYXJlbnQsIG9yIHRoZSBjaGFuZ2VzIGFyZSB0aGUgc2FtZSBmcm9tIGFsbCBidXQgb25lCisJICogcGFyZW50LCBtYXJrIHRoYXQgdW5pbnRlcmVzdGluZy4KKwkgKi8KKwlpID0gMDsKKwl3aGlsZSAoaSA8PSBjbnQpIHsKKwkJdW5zaWduZWQgbG9uZyBqLCBodW5rX2JlZ2luLCBodW5rX2VuZDsKKwkJdW5zaWduZWQgbG9uZyBzYW1lX2RpZmY7CisJCXdoaWxlIChpIDw9IGNudCAmJiAhKHNsaW5lW2ldLmZsYWcgJiBtYXJrKSkKKwkJCWkrKzsKKwkJaWYgKGNudCA8IGkpCisJCQlicmVhazsgLyogTm8gbW9yZSBpbnRlcmVzdGluZyBodW5rcyAqLworCQlodW5rX2JlZ2luID0gaTsKKwkJZm9yIChqID0gaSArIDE7IGogPD0gY250OyBqKyspIHsKKwkJCWlmICghKHNsaW5lW2pdLmZsYWcgJiBtYXJrKSkgeworCQkJCS8qIExvb2sgYmV5b25kIHRoZSBlbmQgdG8gc2VlIGlmIHRoZXJlCisJCQkJICogaXMgYW4gaW50ZXJlc3RpbmcgbGluZSBhZnRlciB0aGlzCisJCQkJICogaHVuayB3aXRoaW4gY29udGV4dCBzcGFuLgorCQkJCSAqLworCQkJCXVuc2lnbmVkIGxvbmcgbGE7IC8qIGxvb2thaGVhZCAqLworCQkJCWludCBjb250aW4gPSAwOworCQkJCWxhID0gYWRqdXN0X2h1bmtfdGFpbChzbGluZSwgYWxsX21hc2ssCisJCQkJCQkgICAgIGh1bmtfYmVnaW4sIGopOworCQkJCWxhID0gKGxhICsgY29udGV4dCA8IGNudCArIDEpID8KKwkJCQkJKGxhICsgY29udGV4dCkgOiBjbnQgKyAxOworCQkJCXdoaWxlIChqIDw9IC0tbGEpIHsKKwkJCQkJaWYgKHNsaW5lW2xhXS5mbGFnICYgbWFyaykgeworCQkJCQkJY29udGluID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghY29udGluKQorCQkJCQlicmVhazsKKwkJCQlqID0gbGE7CisJCQl9CisJCX0KKwkJaHVua19lbmQgPSBqOworCisJCS8qIFtpLi5odW5rX2VuZCkgYXJlIGludGVyZXN0aW5nLiAgTm93IGlzIGl0IHJlYWxseQorCQkgKiBpbnRlcmVzdGluZz8gIFdlIGNoZWNrIGlmIHRoZXJlIGFyZSBvbmx5IHR3byB2ZXJzaW9ucworCQkgKiBhbmQgdGhlIHJlc3VsdCBtYXRjaGVzIG9uZSBvZiB0aGVtLiAgVGhhdCBpcywgd2UgbG9vaworCQkgKiBhdDoKKwkJICogICAoKykgbGluZSwgd2hpY2ggcmVjb3JkcyBsaW5lcyBhZGRlZCB0byB3aGljaCBwYXJlbnRzOworCQkgKiAgICAgICB0aGlzIGxpbmUgYXBwZWFycyBpbiB0aGUgcmVzdWx0LgorCQkgKiAgICgtKSBsaW5lLCB3aGljaCByZWNvcmRzIGZyb20gd2hhdCBwYXJlbnRzIHRoZSBsaW5lCisJCSAqICAgICAgIHdhcyByZW1vdmVkOyB0aGlzIGxpbmUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSByZXN1bHQuCisJCSAqIHRoZW4gY2hlY2sgdGhlIHNldCBvZiBwYXJlbnRzIHRoZSByZXN1bHQgaGFzIGRpZmZlcmVuY2UKKwkJICogZnJvbSwgZnJvbSBhbGwgbGluZXMuICBJZiB0aGVyZSBhcmUgbGluZXMgdGhhdCBoYXMKKwkJICogZGlmZmVyZW50IHNldCBvZiBwYXJlbnRzIHRoYXQgdGhlIHJlc3VsdCBoYXMgZGlmZmVyZW5jZXMKKwkJICogZnJvbSwgdGhhdCBtZWFucyB3ZSBoYXZlIG1vcmUgdGhhbiB0d28gdmVyc2lvbnMuCisJCSAqCisJCSAqIEV2ZW4gd2hlbiB3ZSBoYXZlIG9ubHkgdHdvIHZlcnNpb25zLCBpZiB0aGUgcmVzdWx0IGRvZXMKKwkJICogbm90IG1hdGNoIGFueSBvZiB0aGUgcGFyZW50cywgdGhlIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkCisJCSAqIGludGVyZXN0aW5nLiAgSW4gc3VjaCBhIGNhc2UsIHdlIHdvdWxkIGhhdmUgYWxsICcrJyBsaW5lLgorCQkgKiBBZnRlciBwYXNzaW5nIHRoZSBhYm92ZSAidHdvIHZlcnNpb25zIiB0ZXN0LCB0aGF0IHdvdWxkCisJCSAqIGFwcGVhciBhcyAidGhlIHNhbWUgc2V0IG9mIHBhcmVudHMiIHRvIGJlICJhbGwgcGFyZW50cyIuCisJCSAqLworCQlzYW1lX2RpZmYgPSAwOworCQloYXNfaW50ZXJlc3RpbmcgPSAwOworCQlmb3IgKGogPSBpOyBqIDwgaHVua19lbmQgJiYgIWhhc19pbnRlcmVzdGluZzsgaisrKSB7CisJCQl1bnNpZ25lZCBsb25nIHRoaXNfZGlmZiA9IHNsaW5lW2pdLmZsYWcgJiBhbGxfbWFzazsKKwkJCXN0cnVjdCBsbGluZSAqbGwgPSBzbGluZVtqXS5sb3N0X2hlYWQ7CisJCQlpZiAodGhpc19kaWZmKSB7CisJCQkJLyogVGhpcyBoYXMgc29tZSBjaGFuZ2VzLiAgSXMgaXQgdGhlCisJCQkJICogc2FtZSBhcyBvdGhlcnM/CisJCQkJICovCisJCQkJaWYgKCFzYW1lX2RpZmYpCisJCQkJCXNhbWVfZGlmZiA9IHRoaXNfZGlmZjsKKwkJCQllbHNlIGlmIChzYW1lX2RpZmYgIT0gdGhpc19kaWZmKSB7CisJCQkJCWhhc19pbnRlcmVzdGluZyA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXdoaWxlIChsbCAmJiAhaGFzX2ludGVyZXN0aW5nKSB7CisJCQkJLyogTG9zdCB0aGlzIGxpbmUgZnJvbSB0aGVzZSBwYXJlbnRzOworCQkJCSAqIHdobyBhcmUgdGhleT8gIEFyZSB0aGV5IHRoZSBzYW1lPworCQkJCSAqLworCQkJCXRoaXNfZGlmZiA9IGxsLT5wYXJlbnRfbWFwOworCQkJCWlmICghc2FtZV9kaWZmKQorCQkJCQlzYW1lX2RpZmYgPSB0aGlzX2RpZmY7CisJCQkJZWxzZSBpZiAoc2FtZV9kaWZmICE9IHRoaXNfZGlmZikgeworCQkJCQloYXNfaW50ZXJlc3RpbmcgPSAxOworCQkJCX0KKwkJCQlsbCA9IGxsLT5uZXh0OworCQkJfQorCQl9CisKKwkJaWYgKCFoYXNfaW50ZXJlc3RpbmcgJiYgc2FtZV9kaWZmICE9IGFsbF9tYXNrKSB7CisJCQkvKiBUaGlzIGh1bmsgaXMgbm90IHRoYXQgaW50ZXJlc3RpbmcgYWZ0ZXIgYWxsICovCisJCQlmb3IgKGogPSBodW5rX2JlZ2luOyBqIDwgaHVua19lbmQ7IGorKykKKwkJCQlzbGluZVtqXS5mbGFnICY9IH5tYXJrOworCQl9CisJCWkgPSBodW5rX2VuZDsKKwl9CisKKwloYXNfaW50ZXJlc3RpbmcgPSBnaXZlX2NvbnRleHQoc2xpbmUsIGNudCwgbnVtX3BhcmVudCk7CisJcmV0dXJuIGhhc19pbnRlcmVzdGluZzsKK30KKworc3RhdGljIHZvaWQgc2hvd19wYXJlbnRfbG5vKHN0cnVjdCBzbGluZSAqc2xpbmUsIHVuc2lnbmVkIGxvbmcgbDAsIHVuc2lnbmVkIGxvbmcgbDEsIHVuc2lnbmVkIGxvbmcgY250LCBpbnQgbikKK3sKKwlsMCA9IHNsaW5lW2wwXS5wX2xub1tuXTsKKwlsMSA9IHNsaW5lW2wxXS5wX2xub1tuXTsKKwlwcmludGYoIiAtJWx1LCVsdSIsIGwwLCBsMS1sMCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc2xpbmUoc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsIGludCBudW1fcGFyZW50KQoreworCXVuc2lnbmVkIGxvbmcgbWFyayA9ICgxVUw8PG51bV9wYXJlbnQpOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbG5vID0gMDsKKworCWlmICghY250KQorCQlyZXR1cm47IC8qIHJlc3VsdCBkZWxldGVkICovCisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgc2xpbmUgKnNsID0gJnNsaW5lW2xub107CisJCXVuc2lnbmVkIGxvbmcgaHVua19lbmQ7CisJCXVuc2lnbmVkIGxvbmcgcmxpbmVzOworCQl3aGlsZSAobG5vIDw9IGNudCAmJiAhKHNsaW5lW2xub10uZmxhZyAmIG1hcmspKQorCQkJbG5vKys7CisJCWlmIChjbnQgPCBsbm8pCisJCQlicmVhazsKKwkJZWxzZSB7CisJCQlmb3IgKGh1bmtfZW5kID0gbG5vICsgMTsgaHVua19lbmQgPD0gY250OyBodW5rX2VuZCsrKQorCQkJCWlmICghKHNsaW5lW2h1bmtfZW5kXS5mbGFnICYgbWFyaykpCisJCQkJCWJyZWFrOworCQl9CisJCXJsaW5lcyA9IGh1bmtfZW5kIC0gbG5vOworCQlpZiAoY250IDwgaHVua19lbmQpCisJCQlybGluZXMtLTsgLyogcG9pbnRpbmcgYXQgdGhlIGxhc3QgZGVsZXRlIGh1bmsgKi8KKwkJZm9yIChpID0gMDsgaSA8PSBudW1fcGFyZW50OyBpKyspIHB1dGNoYXIoY29tYmluZV9tYXJrZXIpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKQorCQkJc2hvd19wYXJlbnRfbG5vKHNsaW5lLCBsbm8sIGh1bmtfZW5kLCBjbnQsIGkpOworCQlwcmludGYoIiArJWx1LCVsdSAiLCBsbm8rMSwgcmxpbmVzKTsKKwkJZm9yIChpID0gMDsgaSA8PSBudW1fcGFyZW50OyBpKyspIHB1dGNoYXIoY29tYmluZV9tYXJrZXIpOworCQlwdXRjaGFyKCdcbicpOworCQl3aGlsZSAobG5vIDwgaHVua19lbmQpIHsKKwkJCXN0cnVjdCBsbGluZSAqbGw7CisJCQlpbnQgajsKKwkJCXVuc2lnbmVkIGxvbmcgcF9tYXNrOworCQkJc2wgPSAmc2xpbmVbbG5vKytdOworCQkJbGwgPSBzbC0+bG9zdF9oZWFkOworCQkJd2hpbGUgKGxsKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IG51bV9wYXJlbnQ7IGorKykgeworCQkJCQlpZiAobGwtPnBhcmVudF9tYXAgJiAoMVVMPDxqKSkKKwkJCQkJCXB1dGNoYXIoJy0nKTsKKwkJCQkJZWxzZQorCQkJCQkJcHV0Y2hhcignICcpOworCQkJCX0KKwkJCQlwdXRzKGxsLT5saW5lKTsKKwkJCQlsbCA9IGxsLT5uZXh0OworCQkJfQorCQkJaWYgKGNudCA8IGxubykKKwkJCQlicmVhazsKKwkJCXBfbWFzayA9IDE7CisJCQlmb3IgKGogPSAwOyBqIDwgbnVtX3BhcmVudDsgaisrKSB7CisJCQkJaWYgKHBfbWFzayAmIHNsLT5mbGFnKQorCQkJCQlwdXRjaGFyKCcrJyk7CisJCQkJZWxzZQorCQkJCQlwdXRjaGFyKCcgJyk7CisJCQkJcF9tYXNrIDw8PSAxOworCQkJfQorCQkJcHJpbnRmKCIlLipzXG4iLCBzbC0+bGVuLCBzbC0+Ym9sKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmV1c2VfY29tYmluZV9kaWZmKHN0cnVjdCBzbGluZSAqc2xpbmUsIHVuc2lnbmVkIGxvbmcgY250LAorCQkJICAgICAgIGludCBpLCBpbnQgaikKK3sKKwkvKiBXZSBoYXZlIGFscmVhZHkgZXhhbWluZWQgcGFyZW50IGogYW5kIHdlIGtub3cgcGFyZW50IGkKKwkgKiBhbmQgcGFyZW50IGogYXJlIHRoZSBzYW1lLCBzbyByZXVzZSB0aGUgY29tYmluZWQgcmVzdWx0CisJICogb2YgcGFyZW50IGogZm9yIHBhcmVudCBpLgorCSAqLworCXVuc2lnbmVkIGxvbmcgbG5vLCBpbWFzaywgam1hc2s7CisJaW1hc2sgPSAoMVVMPDxpKTsKKwlqbWFzayA9ICgxVUw8PGopOworCisJZm9yIChsbm8gPSAwOyBsbm8gPD0gY250OyBsbm8rKykgeworCQlzdHJ1Y3QgbGxpbmUgKmxsID0gc2xpbmUtPmxvc3RfaGVhZDsKKwkJc2xpbmUtPnBfbG5vW2ldID0gc2xpbmUtPnBfbG5vW2pdOworCQl3aGlsZSAobGwpIHsKKwkJCWlmIChsbC0+cGFyZW50X21hcCAmIGptYXNrKQorCQkJCWxsLT5wYXJlbnRfbWFwIHw9IGltYXNrOworCQkJbGwgPSBsbC0+bmV4dDsKKwkJfQorCQlpZiAoc2xpbmUtPmZsYWcgJiBqbWFzaykKKwkJCXNsaW5lLT5mbGFnIHw9IGltYXNrOworCQlzbGluZSsrOworCX0KKwkvKiB0aGUgb3ZlcmFsbCBzaXplIG9mIHRoZSBmaWxlIChzbGluZVtjbnRdKSAqLworCXNsaW5lLT5wX2xub1tpXSA9IHNsaW5lLT5wX2xub1tqXTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9xdW90ZWRfcGF0aChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJZnB1dHMocHJlZml4LCBzdGRvdXQpOworCWlmIChxdW90ZV9jX3N0eWxlKHBhdGgsIE5VTEwsIE5VTEwsIDApKQorCQlxdW90ZV9jX3N0eWxlKHBhdGgsIE5VTEwsIHN0ZG91dCwgMCk7CisJZWxzZQorCQlwcmludGYoIiVzIiwgcGF0aCk7CisJcHV0Y2hhcignXG4nKTsKK30KKworc3RhdGljIGludCBzaG93X3BhdGNoX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICplbGVtLCBpbnQgbnVtX3BhcmVudCwKKwkJCSAgIGludCBkZW5zZSwgc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0ID0gJnJldi0+ZGlmZm9wdDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdF9zaXplLCBjbnQsIGxubzsKKwljaGFyICpyZXN1bHQsICpjcDsKKwlzdHJ1Y3Qgc2xpbmUgKnNsaW5lOyAvKiBzdXJ2aXZlZCBsaW5lcyAqLworCWludCBtb2RlX2RpZmZlcnMgPSAwOworCWludCBpLCBzaG93X2h1bmtzLCBzaG93bl9oZWFkZXIgPSAwOworCWludCB3b3JraW5nX3RyZWVfZmlsZSA9ICFtZW1jbXAoZWxlbS0+c2hhMSwgbnVsbF9zaGExLCAyMCk7CisJaW50IGFiYnJldiA9IG9wdC0+ZnVsbF9pbmRleCA/IDQwIDogREVGQVVMVF9BQkJSRVY7CisJbW1maWxlX3QgcmVzdWx0X2ZpbGU7CisKKwljb250ZXh0ID0gb3B0LT5jb250ZXh0OworCS8qIFJlYWQgdGhlIHJlc3VsdCBvZiBtZXJnZSBmaXJzdCAqLworCWlmICghd29ya2luZ190cmVlX2ZpbGUpCisJCXJlc3VsdCA9IGdyYWJfYmxvYihlbGVtLT5zaGExLCAmcmVzdWx0X3NpemUpOworCWVsc2UgeworCQkvKiBVc2VkIGJ5IGRpZmYtdHJlZSB0byByZWFkIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGZkOworCQlpZiAoMCA8PSAoZmQgPSBvcGVuKGVsZW0tPnBhdGgsIE9fUkRPTkxZKSkgJiYKKwkJICAgICFmc3RhdChmZCwgJnN0KSkgeworCQkJaW50IGxlbiA9IHN0LnN0X3NpemU7CisJCQlpbnQgY250ID0gMDsKKworCQkJZWxlbS0+bW9kZSA9IGNhbm9uX21vZGUoc3Quc3RfbW9kZSk7CisJCQlyZXN1bHRfc2l6ZSA9IGxlbjsKKwkJCXJlc3VsdCA9IHhtYWxsb2MobGVuICsgMSk7CisJCQl3aGlsZSAoY250IDwgbGVuKSB7CisJCQkJaW50IGRvbmUgPSB4cmVhZChmZCwgcmVzdWx0K2NudCwgbGVuLWNudCk7CisJCQkJaWYgKGRvbmUgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGRvbmUgPCAwKQorCQkJCQlkaWUoInJlYWQgZXJyb3IgJyVzJyIsIGVsZW0tPnBhdGgpOworCQkJCWNudCArPSBkb25lOworCQkJfQorCQkJcmVzdWx0W2xlbl0gPSAwOworCQl9CisJCWVsc2UgeworCQkJLyogZGVsZXRlZCBmaWxlICovCisJCQlyZXN1bHRfc2l6ZSA9IDA7CisJCQllbGVtLT5tb2RlID0gMDsKKwkJCXJlc3VsdCA9IHhtYWxsb2MoMSk7CisJCQlyZXN1bHRbMF0gPSAwOworCQl9CisJCWlmICgwIDw9IGZkKQorCQkJY2xvc2UoZmQpOworCX0KKworCWZvciAoY250ID0gMCwgY3AgPSByZXN1bHQ7IGNwIC0gcmVzdWx0IDwgcmVzdWx0X3NpemU7IGNwKyspIHsKKwkJaWYgKCpjcCA9PSAnXG4nKQorCQkJY250Kys7CisJfQorCWlmIChyZXN1bHRfc2l6ZSAmJiByZXN1bHRbcmVzdWx0X3NpemUtMV0gIT0gJ1xuJykKKwkJY250Kys7IC8qIGluY29tcGxldGUgbGluZSAqLworCisJc2xpbmUgPSB4Y2FsbG9jKGNudCsyLCBzaXplb2YoKnNsaW5lKSk7CisJc2xpbmVbMF0uYm9sID0gcmVzdWx0OworCWZvciAobG5vID0gMDsgbG5vIDw9IGNudCArIDE7IGxubysrKSB7CisJCXNsaW5lW2xub10ubG9zdF90YWlsID0gJnNsaW5lW2xub10ubG9zdF9oZWFkOworCQlzbGluZVtsbm9dLmZsYWcgPSAwOworCX0KKwlmb3IgKGxubyA9IDAsIGNwID0gcmVzdWx0OyBjcCAtIHJlc3VsdCA8IHJlc3VsdF9zaXplOyBjcCsrKSB7CisJCWlmICgqY3AgPT0gJ1xuJykgeworCQkJc2xpbmVbbG5vXS5sZW4gPSBjcCAtIHNsaW5lW2xub10uYm9sOworCQkJbG5vKys7CisJCQlpZiAobG5vIDwgY250KQorCQkJCXNsaW5lW2xub10uYm9sID0gY3AgKyAxOworCQl9CisJfQorCWlmIChyZXN1bHRfc2l6ZSAmJiByZXN1bHRbcmVzdWx0X3NpemUtMV0gIT0gJ1xuJykKKwkJc2xpbmVbY250LTFdLmxlbiA9IHJlc3VsdF9zaXplIC0gKHNsaW5lW2NudC0xXS5ib2wgLSByZXN1bHQpOworCisJcmVzdWx0X2ZpbGUucHRyID0gcmVzdWx0OworCXJlc3VsdF9maWxlLnNpemUgPSByZXN1bHRfc2l6ZTsKKworCS8qIEV2ZW4gcF9sbm9bY250KzFdIGlzIHZhbGlkIC0tIHRoYXQgaXMgZm9yIHRoZSBlbmQgbGluZSBudW1iZXIKKwkgKiBmb3IgZGVsZXRpb24gaHVuayBhdCB0aGUgZW5kLgorCSAqLworCXNsaW5lWzBdLnBfbG5vID0geGNhbGxvYygoY250KzIpICogbnVtX3BhcmVudCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlmb3IgKGxubyA9IDA7IGxubyA8PSBjbnQ7IGxubysrKQorCQlzbGluZVtsbm8rMV0ucF9sbm8gPSBzbGluZVtsbm9dLnBfbG5vICsgbnVtX3BhcmVudDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspIHsKKwkJaW50IGo7CisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCWlmICghbWVtY21wKGVsZW0tPnBhcmVudFtpXS5zaGExLAorCQkJCSAgICBlbGVtLT5wYXJlbnRbal0uc2hhMSwgMjApKSB7CisJCQkJcmV1c2VfY29tYmluZV9kaWZmKHNsaW5lLCBjbnQsIGksIGopOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpIDw9IGopCisJCQljb21iaW5lX2RpZmYoZWxlbS0+cGFyZW50W2ldLnNoYTEsICZyZXN1bHRfZmlsZSwgc2xpbmUsCisJCQkJICAgICBjbnQsIGksIG51bV9wYXJlbnQpOworCQlpZiAoZWxlbS0+cGFyZW50W2ldLm1vZGUgIT0gZWxlbS0+bW9kZSkKKwkJCW1vZGVfZGlmZmVycyA9IDE7CisJfQorCisJc2hvd19odW5rcyA9IG1ha2VfaHVua3Moc2xpbmUsIGNudCwgbnVtX3BhcmVudCwgZGVuc2UpOworCisJaWYgKHNob3dfaHVua3MgfHwgbW9kZV9kaWZmZXJzIHx8IHdvcmtpbmdfdHJlZV9maWxlKSB7CisJCWNvbnN0IGNoYXIgKmFiYjsKKworCQlpZiAocmV2LT5sb2dpbmZvKQorCQkJc2hvd19sb2cocmV2LCByZXYtPmxvZ2luZm8sICJcbiIpOworCQlkdW1wX3F1b3RlZF9wYXRoKGRlbnNlID8gImRpZmYgLS1jYyAiIDogImRpZmYgLS1jb21iaW5lZCAiLCBlbGVtLT5wYXRoKTsKKwkJcHJpbnRmKCJpbmRleCAiKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkJYWJiID0gZmluZF91bmlxdWVfYWJicmV2KGVsZW0tPnBhcmVudFtpXS5zaGExLAorCQkJCQkJIGFiYnJldik7CisJCQlwcmludGYoIiVzJXMiLCBpID8gIiwiIDogIiIsIGFiYik7CisJCX0KKwkJYWJiID0gZmluZF91bmlxdWVfYWJicmV2KGVsZW0tPnNoYTEsIGFiYnJldik7CisJCXByaW50ZigiLi4lc1xuIiwgYWJiKTsKKworCQlpZiAobW9kZV9kaWZmZXJzKSB7CisJCQlpbnQgYWRkZWQgPSAhIWVsZW0tPm1vZGU7CisJCQlmb3IgKGkgPSAwOyBhZGRlZCAmJiBpIDwgbnVtX3BhcmVudDsgaSsrKQorCQkJCWlmIChlbGVtLT5wYXJlbnRbaV0uc3RhdHVzICE9CisJCQkJICAgIERJRkZfU1RBVFVTX0FEREVEKQorCQkJCQlhZGRlZCA9IDA7CisJCQlpZiAoYWRkZWQpCisJCQkJcHJpbnRmKCJuZXcgZmlsZSBtb2RlICUwNm8iLCBlbGVtLT5tb2RlKTsKKwkJCWVsc2UgeworCQkJCWlmICghZWxlbS0+bW9kZSkKKwkJCQkJcHJpbnRmKCJkZWxldGVkIGZpbGUgIik7CisJCQkJcHJpbnRmKCJtb2RlICIpOworCQkJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspIHsKKwkJCQkJcHJpbnRmKCIlcyUwNm8iLCBpID8gIiwiIDogIiIsCisJCQkJCSAgICAgICBlbGVtLT5wYXJlbnRbaV0ubW9kZSk7CisJCQkJfQorCQkJCWlmIChlbGVtLT5tb2RlKQorCQkJCQlwcmludGYoIi4uJTA2byIsIGVsZW0tPm1vZGUpOworCQkJfQorCQkJcHV0Y2hhcignXG4nKTsKKwkJfQorCQlkdW1wX3F1b3RlZF9wYXRoKCItLS0gYS8iLCBlbGVtLT5wYXRoKTsKKwkJZHVtcF9xdW90ZWRfcGF0aCgiKysrIGIvIiwgZWxlbS0+cGF0aCk7CisJCWR1bXBfc2xpbmUoc2xpbmUsIGNudCwgbnVtX3BhcmVudCk7CisJfQorCWZyZWUocmVzdWx0KTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlpZiAoc2xpbmVbaV0ubG9zdF9oZWFkKSB7CisJCQlzdHJ1Y3QgbGxpbmUgKmxsID0gc2xpbmVbaV0ubG9zdF9oZWFkOworCQkJd2hpbGUgKGxsKSB7CisJCQkJc3RydWN0IGxsaW5lICp0bXAgPSBsbDsKKwkJCQlsbCA9IGxsLT5uZXh0OworCQkJCWZyZWUodG1wKTsKKwkJCX0KKwkJfQorCX0KKwlmcmVlKHNsaW5lWzBdLnBfbG5vKTsKKwlmcmVlKHNsaW5lKTsKKwlyZXR1cm4gc2hvd25faGVhZGVyOworfQorCisjZGVmaW5lIENPTE9OUyAiOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoiCisKK3N0YXRpYyB2b2lkIHNob3dfcmF3X2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpwLCBpbnQgbnVtX3BhcmVudCwgc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0ID0gJnJldi0+ZGlmZm9wdDsKKwlpbnQgaSwgb2Zmc2V0OworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwlpbnQgbGluZV90ZXJtaW5hdGlvbiwgaW50ZXJfbmFtZV90ZXJtaW5hdGlvbjsKKworCWxpbmVfdGVybWluYXRpb24gPSBvcHQtPmxpbmVfdGVybWluYXRpb247CisJaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9ICdcdCc7CisJaWYgKCFsaW5lX3Rlcm1pbmF0aW9uKQorCQlpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uID0gMDsKKworCWlmIChyZXYtPmxvZ2luZm8pCisJCXNob3dfbG9nKHJldiwgcmV2LT5sb2dpbmZvLCAiXG4iKTsKKworCWlmIChvcHQtPm91dHB1dF9mb3JtYXQgPT0gRElGRl9GT1JNQVRfUkFXKSB7CisJCW9mZnNldCA9IHN0cmxlbihDT0xPTlMpIC0gbnVtX3BhcmVudDsKKwkJaWYgKG9mZnNldCA8IDApCisJCQlvZmZzZXQgPSAwOworCQlwcmVmaXggPSBDT0xPTlMgKyBvZmZzZXQ7CisKKwkJLyogU2hvdyB0aGUgbW9kZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkJcHJpbnRmKCIlcyUwNm8iLCBwcmVmaXgsIHAtPnBhcmVudFtpXS5tb2RlKTsKKwkJCXByZWZpeCA9ICIgIjsKKwkJfQorCQlwcmludGYoIiVzJTA2byIsIHByZWZpeCwgcC0+bW9kZSk7CisKKwkJLyogU2hvdyBzaGExJ3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCXByaW50ZigiICVzIiwgZGlmZl91bmlxdWVfYWJicmV2KHAtPnBhcmVudFtpXS5zaGExLAorCQkJCQkJCSBvcHQtPmFiYnJldikpOworCQlwcmludGYoIiAlcyAiLCBkaWZmX3VuaXF1ZV9hYmJyZXYocC0+c2hhMSwgb3B0LT5hYmJyZXYpKTsKKwl9CisKKwlpZiAob3B0LT5vdXRwdXRfZm9ybWF0ID09IERJRkZfRk9STUFUX1JBVyB8fAorCSAgICBvcHQtPm91dHB1dF9mb3JtYXQgPT0gRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCXB1dGNoYXIocC0+cGFyZW50W2ldLnN0YXR1cyk7CisJCXB1dGNoYXIoaW50ZXJfbmFtZV90ZXJtaW5hdGlvbik7CisJfQorCisJaWYgKGxpbmVfdGVybWluYXRpb24pIHsKKwkJaWYgKHF1b3RlX2Nfc3R5bGUocC0+cGF0aCwgTlVMTCwgTlVMTCwgMCkpCisJCQlxdW90ZV9jX3N0eWxlKHAtPnBhdGgsIE5VTEwsIHN0ZG91dCwgMCk7CisJCWVsc2UKKwkJCXByaW50ZigiJXMiLCBwLT5wYXRoKTsKKwkJcHV0Y2hhcihsaW5lX3Rlcm1pbmF0aW9uKTsKKwl9CisJZWxzZSB7CisJCXByaW50ZigiJXMlYyIsIHAtPnBhdGgsIGxpbmVfdGVybWluYXRpb24pOworCX0KK30KKwordm9pZCBzaG93X2NvbWJpbmVkX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpwLAorCQkgICAgICAgaW50IG51bV9wYXJlbnQsCisJCSAgICAgICBpbnQgZGVuc2UsCisJCSAgICAgICBzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQgPSAmcmV2LT5kaWZmb3B0OworCWlmICghcC0+bGVuKQorCQlyZXR1cm47CisJc3dpdGNoIChvcHQtPm91dHB1dF9mb3JtYXQpIHsKKwljYXNlIERJRkZfRk9STUFUX1JBVzoKKwljYXNlIERJRkZfRk9STUFUX05BTUVfU1RBVFVTOgorCWNhc2UgRElGRl9GT1JNQVRfTkFNRToKKwkJc2hvd19yYXdfZGlmZihwLCBudW1fcGFyZW50LCByZXYpOworCQlyZXR1cm47CisJY2FzZSBESUZGX0ZPUk1BVF9QQVRDSDoKKwkJc2hvd19wYXRjaF9kaWZmKHAsIG51bV9wYXJlbnQsIGRlbnNlLCByZXYpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KK30KKwordm9pZCBkaWZmX3RyZWVfY29tYmluZWQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgcGFyZW50W11bMjBdLAorCQkJaW50IG51bV9wYXJlbnQsCisJCQlpbnQgZGVuc2UsCisJCQlzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQgPSAmcmV2LT5kaWZmb3B0OworCXN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZm9wdHM7CisJc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpwLCAqcGF0aHMgPSBOVUxMOworCWludCBpLCBudW1fcGF0aHM7CisJaW50IGRvX2RpZmZzdGF0OworCisJZG9fZGlmZnN0YXQgPSAob3B0LT5vdXRwdXRfZm9ybWF0ID09IERJRkZfRk9STUFUX0RJRkZTVEFUIHx8CisJCSAgICAgICBvcHQtPndpdGhfc3RhdCk7CisJZGlmZm9wdHMgPSAqb3B0OworCWRpZmZvcHRzLndpdGhfcmF3ID0gMDsKKwlkaWZmb3B0cy53aXRoX3N0YXQgPSAwOworCWRpZmZvcHRzLnJlY3Vyc2l2ZSA9IDE7CisKKwkvKiBmaW5kIHNldCBvZiBwYXRocyB0aGF0IGV2ZXJ5Ym9keSB0b3VjaGVzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkvKiBzaG93IHN0YXQgYWdhaW5zdCB0aGUgZmlyc3QgcGFyZW50IGV2ZW4KKwkJICogd2hlbiBkb2luZyBjb21iaW5lZCBkaWZmLgorCQkgKi8KKwkJaWYgKGkgPT0gMCAmJiBkb19kaWZmc3RhdCkKKwkJCWRpZmZvcHRzLm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9ESUZGU1RBVDsKKwkJZWxzZQorCQkJZGlmZm9wdHMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwkJZGlmZl90cmVlX3NoYTEocGFyZW50W2ldLCBzaGExLCAiIiwgJmRpZmZvcHRzKTsKKwkJZGlmZmNvcmVfc3RkKCZkaWZmb3B0cyk7CisJCXBhdGhzID0gaW50ZXJzZWN0X3BhdGhzKHBhdGhzLCBpLCBudW1fcGFyZW50KTsKKworCQlpZiAoZG9fZGlmZnN0YXQgJiYgcmV2LT5sb2dpbmZvKQorCQkJc2hvd19sb2cocmV2LCByZXYtPmxvZ2luZm8sCisJCQkJIG9wdC0+d2l0aF9zdGF0ID8gIi0tLVxuIiA6ICJcbiIpOworCQlkaWZmX2ZsdXNoKCZkaWZmb3B0cyk7CisJCWlmIChvcHQtPndpdGhfc3RhdCkKKwkJCXB1dGNoYXIoJ1xuJyk7CisJfQorCisJLyogZmluZCBvdXQgc3Vydml2aW5nIHBhdGhzICovCisJZm9yIChudW1fcGF0aHMgPSAwLCBwID0gcGF0aHM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChwLT5sZW4pCisJCQludW1fcGF0aHMrKzsKKwl9CisJaWYgKG51bV9wYXRocykgeworCQlpZiAob3B0LT53aXRoX3JhdykgeworCQkJaW50IHNhdmVkX2Zvcm1hdCA9IG9wdC0+b3V0cHV0X2Zvcm1hdDsKKwkJCW9wdC0+b3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKwkJCWZvciAocCA9IHBhdGhzOyBwOyBwID0gcC0+bmV4dCkgeworCQkJCXNob3dfY29tYmluZWRfZGlmZihwLCBudW1fcGFyZW50LCBkZW5zZSwgcmV2KTsKKwkJCX0KKwkJCW9wdC0+b3V0cHV0X2Zvcm1hdCA9IHNhdmVkX2Zvcm1hdDsKKwkJCXB1dGNoYXIob3B0LT5saW5lX3Rlcm1pbmF0aW9uKTsKKwkJfQorCQlmb3IgKHAgPSBwYXRoczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCXNob3dfY29tYmluZWRfZGlmZihwLCBudW1fcGFyZW50LCBkZW5zZSwgcmV2KTsKKwkJfQorCX0KKworCS8qIENsZWFuIHRoaW5ncyB1cCAqLworCXdoaWxlIChwYXRocykgeworCQlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKnRtcCA9IHBhdGhzOworCQlwYXRocyA9IHBhdGhzLT5uZXh0OworCQlmcmVlKHRtcCk7CisJfQorfQorCit2b2lkIGRpZmZfdHJlZV9jb21iaW5lZF9tZXJnZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJICAgICBpbnQgZGVuc2UsIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCWludCBudW1fcGFyZW50OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKCpwYXJlbnQpWzIwXTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCS8qIGNvdW50IHBhcmVudHMgKi8KKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHMsIG51bV9wYXJlbnQgPSAwOworCSAgICAgcGFyZW50czsKKwkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBudW1fcGFyZW50KyspCisJCTsgLyogbm90aGluZyAqLworCisJcGFyZW50ID0geG1hbGxvYyhudW1fcGFyZW50ICogc2l6ZW9mKCpwYXJlbnQpKTsKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHMsIG51bV9wYXJlbnQgPSAwOworCSAgICAgcGFyZW50czsKKwkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBudW1fcGFyZW50KyspCisJCW1lbWNweShwYXJlbnQgKyBudW1fcGFyZW50LCBwYXJlbnRzLT5pdGVtLT5vYmplY3Quc2hhMSwgMjApOworCWRpZmZfdHJlZV9jb21iaW5lZChzaGExLCBwYXJlbnQsIG51bV9wYXJlbnQsIGRlbnNlLCByZXYpOworfQpkaWZmIC0tZ2l0IGEvY29tbWl0LmMgYi9jb21taXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY0NzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbWl0LmMKQEAgLTAsMCArMSw4MzEgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorCitpbnQgc2F2ZV9jb21taXRfYnVmZmVyID0gMTsKKworc3RydWN0IHNvcnRfbm9kZQoreworCS8qCisgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhlIGFzc29jaWF0ZWQgY29tbWl0CisgICAgICAgICAqIHRoYXQgYWxzbyBvY2N1ciBpbiB0aGUgbGlzdCBiZWluZyBzb3J0ZWQuCisgICAgICAgICAqLworCXVuc2lnbmVkIGludCBpbmRlZ3JlZTsKKworCS8qCisgICAgICAgICAqIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBsaXN0IGl0ZW0gdGhhdCB3ZSB3aWxsIHJlLXVzZQorICAgICAgICAgKiBvbiBvdXRwdXQuCisgICAgICAgICAqLworCXN0cnVjdCBjb21taXRfbGlzdCAqIGxpc3RfaXRlbTsKKworfTsKKworY29uc3QgY2hhciAqY29tbWl0X3R5cGUgPSAiY29tbWl0IjsKKworc3RydWN0IGNtdF9mbXRfbWFwIHsKKwljb25zdCBjaGFyICpuOworCXNpemVfdCBjbXBfbGVuOworCWVudW0gY21pdF9mbXQgdjsKK30gY210X2ZtdHNbXSA9IHsKKwl7ICJyYXciLAkxLAlDTUlUX0ZNVF9SQVcgfSwKKwl7ICJtZWRpdW0iLAkxLAlDTUlUX0ZNVF9NRURJVU0gfSwKKwl7ICJzaG9ydCIsCTEsCUNNSVRfRk1UX1NIT1JUIH0sCisJeyAiZW1haWwiLAkxLAlDTUlUX0ZNVF9FTUFJTCB9LAorCXsgImZ1bGwiLAk1LAlDTUlUX0ZNVF9GVUxMIH0sCisJeyAiZnVsbGVyIiwJNSwJQ01JVF9GTVRfRlVMTEVSIH0sCisJeyAib25lbGluZSIsCTEsCUNNSVRfRk1UX09ORUxJTkUgfSwKK307CisKK2VudW0gY21pdF9mbXQgZ2V0X2NvbW1pdF9mb3JtYXQoY29uc3QgY2hhciAqYXJnKQoreworCWludCBpOworCisJaWYgKCFhcmcgfHwgISphcmcpCisJCXJldHVybiBDTUlUX0ZNVF9ERUZBVUxUOworCWlmICgqYXJnID09ICc9JykKKwkJYXJnKys7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY210X2ZtdHMpOyBpKyspIHsKKwkJaWYgKCFzdHJuY21wKGFyZywgY210X2ZtdHNbaV0ubiwgY210X2ZtdHNbaV0uY21wX2xlbikpCisJCQlyZXR1cm4gY210X2ZtdHNbaV0udjsKKwl9CisKKwlkaWUoImludmFsaWQgLS1wcmV0dHkgZm9ybWF0OiAlcyIsIGFyZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICpjaGVja19jb21taXQoc3RydWN0IG9iamVjdCAqb2JqLAorCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJICAgaW50IHF1aWV0KQoreworCWlmIChvYmotPnR5cGUgIT0gY29tbWl0X3R5cGUpIHsKKwkJaWYgKCFxdWlldCkKKwkJCWVycm9yKCJPYmplY3QgJXMgaXMgYSAlcywgbm90IGEgY29tbWl0IiwKKwkJCSAgICAgIHNoYTFfdG9faGV4KHNoYTEpLCBvYmotPnR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIChzdHJ1Y3QgY29tbWl0ICopIG9iajsKK30KKworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCSAgICAgIGludCBxdWlldCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KHNoYTEpLCBOVUxMLCAwKTsKKworCWlmICghb2JqKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY2hlY2tfY29tbWl0KG9iaiwgc2hhMSwgcXVpZXQpOworfQorCitzdHJ1Y3QgY29tbWl0ICpsb29rdXBfY29tbWl0X3JlZmVyZW5jZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXJldHVybiBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMCk7Cit9CisKK3N0cnVjdCBjb21taXQgKmxvb2t1cF9jb21taXQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBsb29rdXBfb2JqZWN0KHNoYTEpOworCWlmICghb2JqKSB7CisJCXN0cnVjdCBjb21taXQgKnJldCA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjb21taXQpKTsKKwkJY3JlYXRlZF9vYmplY3Qoc2hhMSwgJnJldC0+b2JqZWN0KTsKKwkJcmV0LT5vYmplY3QudHlwZSA9IGNvbW1pdF90eXBlOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoIW9iai0+dHlwZSkKKwkJb2JqLT50eXBlID0gY29tbWl0X3R5cGU7CisJcmV0dXJuIGNoZWNrX2NvbW1pdChvYmosIHNoYTEsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJzZV9jb21taXRfZGF0ZShjb25zdCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRlOworCisJaWYgKG1lbWNtcChidWYsICJhdXRob3IiLCA2KSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKCpidWYrKyAhPSAnXG4nKQorCQkvKiBuYWRhICovOworCWlmIChtZW1jbXAoYnVmLCAiY29tbWl0dGVyIiwgOSkpCisJCXJldHVybiAwOworCXdoaWxlICgqYnVmKysgIT0gJz4nKQorCQkvKiBuYWRhICovOworCWRhdGUgPSBzdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWlmIChkYXRlID09IFVMT05HX01BWCkKKwkJZGF0ZSA9IDA7CisJcmV0dXJuIGRhdGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2dyYWZ0ICoqY29tbWl0X2dyYWZ0Oworc3RhdGljIGludCBjb21taXRfZ3JhZnRfYWxsb2MsIGNvbW1pdF9ncmFmdF9ucjsKKworc3RhdGljIGludCBjb21taXRfZ3JhZnRfcG9zKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGxvLCBoaTsKKwlsbyA9IDA7CisJaGkgPSBjb21taXRfZ3JhZnRfbnI7CisJd2hpbGUgKGxvIDwgaGkpIHsKKwkJaW50IG1pID0gKGxvICsgaGkpIC8gMjsKKwkJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPSBjb21taXRfZ3JhZnRbbWldOworCQlpbnQgY21wID0gbWVtY21wKHNoYTEsIGdyYWZ0LT5zaGExLCAyMCk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIG1pOworCQlpZiAoY21wIDwgMCkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkgKyAxOworCX0KKwlyZXR1cm4gLWxvIC0gMTsKK30KKworaW50IHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdCwgaW50IGlnbm9yZV9kdXBzKQoreworCWludCBwb3MgPSBjb21taXRfZ3JhZnRfcG9zKGdyYWZ0LT5zaGExKTsKKwkKKwlpZiAoMCA8PSBwb3MpIHsKKwkJaWYgKGlnbm9yZV9kdXBzKQorCQkJZnJlZShncmFmdCk7CisJCWVsc2UgeworCQkJZnJlZShjb21taXRfZ3JhZnRbcG9zXSk7CisJCQljb21taXRfZ3JhZnRbcG9zXSA9IGdyYWZ0OworCQl9CisJCXJldHVybiAxOworCX0KKwlwb3MgPSAtcG9zIC0gMTsKKwlpZiAoY29tbWl0X2dyYWZ0X2FsbG9jIDw9ICsrY29tbWl0X2dyYWZ0X25yKSB7CisJCWNvbW1pdF9ncmFmdF9hbGxvYyA9IGFsbG9jX25yKGNvbW1pdF9ncmFmdF9hbGxvYyk7CisJCWNvbW1pdF9ncmFmdCA9IHhyZWFsbG9jKGNvbW1pdF9ncmFmdCwKKwkJCQkJc2l6ZW9mKCpjb21taXRfZ3JhZnQpICoKKwkJCQkJY29tbWl0X2dyYWZ0X2FsbG9jKTsKKwl9CisJaWYgKHBvcyA8IGNvbW1pdF9ncmFmdF9ucikKKwkJbWVtbW92ZShjb21taXRfZ3JhZnQgKyBwb3MgKyAxLAorCQkJY29tbWl0X2dyYWZ0ICsgcG9zLAorCQkJKGNvbW1pdF9ncmFmdF9uciAtIHBvcyAtIDEpICoKKwkJCXNpemVvZigqY29tbWl0X2dyYWZ0KSk7CisJY29tbWl0X2dyYWZ0W3Bvc10gPSBncmFmdDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNvbW1pdF9ncmFmdCAqcmVhZF9ncmFmdF9saW5lKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwkvKiBUaGUgZm9ybWF0IGlzIGp1c3QgIkNvbW1pdCBQYXJlbnQxIFBhcmVudDIgLi4uXG4iICovCisJaW50IGk7CisJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPSBOVUxMOworCisJaWYgKGJ1ZltsZW4tMV0gPT0gJ1xuJykKKwkJYnVmWy0tbGVuXSA9IDA7CisJaWYgKGJ1ZlswXSA9PSAnIycgfHwgYnVmWzBdID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCWlmICgobGVuICsgMSkgJSA0MSkgeworCWJhZF9ncmFmdF9kYXRhOgorCQllcnJvcigiYmFkIGdyYWZ0IGRhdGE6ICVzIiwgYnVmKTsKKwkJZnJlZShncmFmdCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpID0gKGxlbiArIDEpIC8gNDEgLSAxOworCWdyYWZ0ID0geG1hbGxvYyhzaXplb2YoKmdyYWZ0KSArIDIwICogaSk7CisJZ3JhZnQtPm5yX3BhcmVudCA9IGk7CisJaWYgKGdldF9zaGExX2hleChidWYsIGdyYWZ0LT5zaGExKSkKKwkJZ290byBiYWRfZ3JhZnRfZGF0YTsKKwlmb3IgKGkgPSA0MDsgaSA8IGxlbjsgaSArPSA0MSkgeworCQlpZiAoYnVmW2ldICE9ICcgJykKKwkJCWdvdG8gYmFkX2dyYWZ0X2RhdGE7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmICsgaSArIDEsIGdyYWZ0LT5wYXJlbnRbaS80MV0pKQorCQkJZ290byBiYWRfZ3JhZnRfZGF0YTsKKwl9CisJcmV0dXJuIGdyYWZ0OworfQorCitpbnQgcmVhZF9ncmFmdF9maWxlKGNvbnN0IGNoYXIgKmdyYWZ0X2ZpbGUpCit7CisJRklMRSAqZnAgPSBmb3BlbihncmFmdF9maWxlLCAiciIpOworCWNoYXIgYnVmWzEwMjRdOworCWlmICghZnApCisJCXJldHVybiAtMTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCS8qIFRoZSBmb3JtYXQgaXMganVzdCAiQ29tbWl0IFBhcmVudDEgUGFyZW50MiAuLi5cbiIgKi8KKwkJaW50IGxlbiA9IHN0cmxlbihidWYpOworCQlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdCA9IHJlYWRfZ3JhZnRfbGluZShidWYsIGxlbik7CisJCWlmICghZ3JhZnQpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChncmFmdCwgMSkpCisJCQllcnJvcigiZHVwbGljYXRlIGdyYWZ0IGRhdGE6ICVzIiwgYnVmKTsKKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9jb21taXRfZ3JhZnQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGNvbW1pdF9ncmFmdF9wcmVwYXJlZDsKKwljaGFyICpncmFmdF9maWxlOworCisJaWYgKGNvbW1pdF9ncmFmdF9wcmVwYXJlZCkKKwkJcmV0dXJuOworCWdyYWZ0X2ZpbGUgPSBnZXRfZ3JhZnRfZmlsZSgpOworCXJlYWRfZ3JhZnRfZmlsZShncmFmdF9maWxlKTsKKwljb21taXRfZ3JhZnRfcHJlcGFyZWQgPSAxOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9ncmFmdCAqbG9va3VwX2NvbW1pdF9ncmFmdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBwb3M7CisJcHJlcGFyZV9jb21taXRfZ3JhZnQoKTsKKwlwb3MgPSBjb21taXRfZ3JhZnRfcG9zKHNoYTEpOworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY29tbWl0X2dyYWZ0W3Bvc107Cit9CisKK2ludCBwYXJzZV9jb21taXRfYnVmZmVyKHN0cnVjdCBjb21taXQgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWNoYXIgKmJ1ZnB0ciA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIHBhcmVudFsyMF07CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHB0cjsKKwlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdDsKKwl1bnNpZ25lZCBuX3JlZnMgPSAwOworCisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWl0ZW0tPm9iamVjdC5wYXJzZWQgPSAxOworCWlmIChtZW1jbXAoYnVmcHRyLCAidHJlZSAiLCA1KSkKKwkJcmV0dXJuIGVycm9yKCJib2d1cyBjb21taXQgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZnB0ciArIDUsIHBhcmVudCkgPCAwKQorCQlyZXR1cm4gZXJyb3IoImJhZCB0cmVlIHBvaW50ZXIgaW4gY29tbWl0ICVzIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpdGVtLT50cmVlID0gbG9va3VwX3RyZWUocGFyZW50KTsKKwlpZiAoaXRlbS0+dHJlZSkKKwkJbl9yZWZzKys7CisJYnVmcHRyICs9IDQ2OyAvKiAidHJlZSAiICsgImhleCBzaGExIiArICJcbiIgKi8KKwlwcHRyID0gJml0ZW0tPnBhcmVudHM7CisKKwlncmFmdCA9IGxvb2t1cF9jb21taXRfZ3JhZnQoaXRlbS0+b2JqZWN0LnNoYTEpOworCXdoaWxlICghbWVtY21wKGJ1ZnB0ciwgInBhcmVudCAiLCA3KSkgeworCQlzdHJ1Y3QgY29tbWl0ICpuZXdfcGFyZW50OworCisJCWlmIChnZXRfc2hhMV9oZXgoYnVmcHRyICsgNywgcGFyZW50KSB8fCBidWZwdHJbNDddICE9ICdcbicpCisJCQlyZXR1cm4gZXJyb3IoImJhZCBwYXJlbnRzIGluIGNvbW1pdCAlcyIsIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJCWJ1ZnB0ciArPSA0ODsKKwkJaWYgKGdyYWZ0KQorCQkJY29udGludWU7CisJCW5ld19wYXJlbnQgPSBsb29rdXBfY29tbWl0KHBhcmVudCk7CisJCWlmIChuZXdfcGFyZW50KSB7CisJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChuZXdfcGFyZW50LCBwcHRyKS0+bmV4dDsKKwkJCW5fcmVmcysrOworCQl9CisJfQorCWlmIChncmFmdCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGNvbW1pdCAqbmV3X3BhcmVudDsKKwkJZm9yIChpID0gMDsgaSA8IGdyYWZ0LT5ucl9wYXJlbnQ7IGkrKykgeworCQkJbmV3X3BhcmVudCA9IGxvb2t1cF9jb21taXQoZ3JhZnQtPnBhcmVudFtpXSk7CisJCQlpZiAoIW5ld19wYXJlbnQpCisJCQkJY29udGludWU7CisJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChuZXdfcGFyZW50LCBwcHRyKS0+bmV4dDsKKwkJCW5fcmVmcysrOworCQl9CisJfQorCWl0ZW0tPmRhdGUgPSBwYXJzZV9jb21taXRfZGF0ZShidWZwdHIpOworCisJaWYgKHRyYWNrX29iamVjdF9yZWZzKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisJCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcyA9IGFsbG9jX29iamVjdF9yZWZzKG5fcmVmcyk7CisJCWlmIChpdGVtLT50cmVlKQorCQkJcmVmcy0+cmVmW2krK10gPSAmaXRlbS0+dHJlZS0+b2JqZWN0OworCQlmb3IgKHAgPSBpdGVtLT5wYXJlbnRzOyBwOyBwID0gcC0+bmV4dCkKKwkJCXJlZnMtPnJlZltpKytdID0gJnAtPml0ZW0tPm9iamVjdDsKKwkJc2V0X29iamVjdF9yZWZzKCZpdGVtLT5vYmplY3QsIHJlZnMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfY29tbWl0KHN0cnVjdCBjb21taXQgKml0ZW0pCit7CisJY2hhciB0eXBlWzIwXTsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQ7CisKKwlpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKwkJcmV0dXJuIDA7CisJYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCAlcyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJaWYgKHN0cmNtcCh0eXBlLCBjb21taXRfdHlwZSkpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSBjb21taXQiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCX0KKwlyZXQgPSBwYXJzZV9jb21taXRfYnVmZmVyKGl0ZW0sIGJ1ZmZlciwgc2l6ZSk7CisJaWYgKHNhdmVfY29tbWl0X2J1ZmZlciAmJiAhcmV0KSB7CisJCWl0ZW0tPmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJcmV0dXJuIDA7CisJfQorCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbW1pdF9saXN0X2luc2VydChzdHJ1Y3QgY29tbWl0ICppdGVtLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0X3ApCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpuZXdfbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfbGlzdCkpOworCW5ld19saXN0LT5pdGVtID0gaXRlbTsKKwluZXdfbGlzdC0+bmV4dCA9ICpsaXN0X3A7CisJKmxpc3RfcCA9IG5ld19saXN0OworCXJldHVybiBuZXdfbGlzdDsKK30KKwordm9pZCBmcmVlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnRlbXAgPSBsaXN0OworCQlsaXN0ID0gdGVtcC0+bmV4dDsKKwkJZnJlZSh0ZW1wKTsKKwl9Cit9CisKK3N0cnVjdCBjb21taXRfbGlzdCAqIGluc2VydF9ieV9kYXRlKHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAgPSBsaXN0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwl3aGlsZSAoKHAgPSAqcHApICE9IE5VTEwpIHsKKwkJaWYgKHAtPml0ZW0tPmRhdGUgPCBpdGVtLT5kYXRlKSB7CisJCQlicmVhazsKKwkJfQorCQlwcCA9ICZwLT5uZXh0OworCX0KKwlyZXR1cm4gY29tbWl0X2xpc3RfaW5zZXJ0KGl0ZW0sIHBwKTsKK30KKworCQordm9pZCBzb3J0X2J5X2RhdGUoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnJldCA9IE5VTEw7CisJd2hpbGUgKCpsaXN0KSB7CisJCWluc2VydF9ieV9kYXRlKCgqbGlzdCktPml0ZW0sICZyZXQpOworCQkqbGlzdCA9ICgqbGlzdCktPm5leHQ7CisJfQorCSpsaXN0ID0gcmV0OworfQorCitzdHJ1Y3QgY29tbWl0ICpwb3BfbW9zdF9yZWNlbnRfY29tbWl0KHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG1hcmspCit7CisJc3RydWN0IGNvbW1pdCAqcmV0ID0gKCpsaXN0KS0+aXRlbTsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSByZXQtPnBhcmVudHM7CisJc3RydWN0IGNvbW1pdF9saXN0ICpvbGQgPSAqbGlzdDsKKworCSpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKKwlmcmVlKG9sZCk7CisKKwl3aGlsZSAocGFyZW50cykgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwYXJlbnRzLT5pdGVtOworCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBtYXJrKSkgeworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gbWFyazsKKwkJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgbGlzdCk7CisJCX0KKwkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY2xlYXJfY29tbWl0X21hcmtzKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgdW5zaWduZWQgaW50IG1hcmspCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwljb21taXQtPm9iamVjdC5mbGFncyAmPSB+bWFyazsKKwl3aGlsZSAocGFyZW50cykgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQlpZiAocGFyZW50ICYmIHBhcmVudC0+b2JqZWN0LnBhcnNlZCAmJgorCQkgICAgKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgbWFyaykpCisJCQljbGVhcl9jb21taXRfbWFya3MocGFyZW50LCBtYXJrKTsKKwkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJfQorfQorCisvKgorICogR2VuZXJpYyBzdXBwb3J0IGZvciBwcmV0dHktcHJpbnRpbmcgdGhlIGhlYWRlcgorICovCitzdGF0aWMgaW50IGdldF9vbmVfbGluZShjb25zdCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCByZXQgPSAwOworCisJd2hpbGUgKGxlbi0tKSB7CisJCWNoYXIgYyA9ICptc2crKzsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisJCXJldCsrOworCQlpZiAoYyA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNfcmZjMjA0N19zcGVjaWFsKGNoYXIgY2gpCit7CisJcmV0dXJuICgoY2ggJiAweDgwKSB8fCAoY2ggPT0gJz0nKSB8fCAoY2ggPT0gJz8nKSB8fCAoY2ggPT0gJ18nKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JmYzIwNDcoY2hhciAqYnVmLCBjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWNoYXIgKmJwID0gYnVmOworCWludCBpLCBuZWVkcXVvdGU7CisJc3RhdGljIGNvbnN0IGNoYXIgcV91dGY4W10gPSAiPT91dGYtOD9xPyI7CisKKwlmb3IgKGkgPSBuZWVkcXVvdGUgPSAwOyAhbmVlZHF1b3RlICYmIGkgPCBsZW47IGkrKykgeworCQl1bnNpZ25lZCBjaCA9IGxpbmVbaV07CisJCWlmIChjaCAmIDB4ODApCisJCQluZWVkcXVvdGUrKzsKKwkJaWYgKChpICsgMSA8IGxlbikgJiYKKwkJICAgIChjaCA9PSAnPScgJiYgbGluZVtpKzFdID09ICc/JykpCisJCQluZWVkcXVvdGUrKzsKKwl9CisJaWYgKCFuZWVkcXVvdGUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUuKnMiLCBsZW4sIGxpbmUpOworCisJbWVtY3B5KGJwLCBxX3V0ZjgsIHNpemVvZihxX3V0ZjgpLTEpOworCWJwICs9IHNpemVvZihxX3V0ZjgpLTE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoID0gbGluZVtpXTsKKwkJaWYgKGlzX3JmYzIwNDdfc3BlY2lhbChjaCkpIHsKKwkJCXNwcmludGYoYnAsICI9JTAyWCIsIGNoKTsKKwkJCWJwICs9IDM7CisJCX0KKwkJZWxzZSBpZiAoY2ggPT0gJyAnKQorCQkJKmJwKysgPSAnXyc7CisJCWVsc2UKKwkJCSpicCsrID0gY2g7CisJfQorCW1lbWNweShicCwgIj89IiwgMik7CisJYnAgKz0gMjsKKwlyZXR1cm4gYnAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3VzZXJfaW5mbyhjb25zdCBjaGFyICp3aGF0LCBlbnVtIGNtaXRfZm10IGZtdCwgY2hhciAqYnVmLCBjb25zdCBjaGFyICpsaW5lKQoreworCWNoYXIgKmRhdGU7CisJaW50IG5hbWVsZW47CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCB0eiwgcmV0OworCWNvbnN0IGNoYXIgKmZpbGxlciA9ICIgICAgIjsKKworCWlmIChmbXQgPT0gQ01JVF9GTVRfT05FTElORSkKKwkJcmV0dXJuIDA7CisJZGF0ZSA9IHN0cmNocihsaW5lLCAnPicpOworCWlmICghZGF0ZSkKKwkJcmV0dXJuIDA7CisJbmFtZWxlbiA9ICsrZGF0ZSAtIGxpbmU7CisJdGltZSA9IHN0cnRvdWwoZGF0ZSwgJmRhdGUsIDEwKTsKKwl0eiA9IHN0cnRvbChkYXRlLCBOVUxMLCAxMCk7CisKKwlpZiAoZm10ID09IENNSVRfRk1UX0VNQUlMKSB7CisJCWNoYXIgKm5hbWVfdGFpbCA9IHN0cmNocihsaW5lLCAnPCcpOworCQlpbnQgZGlzcGxheV9uYW1lX2xlbmd0aDsKKwkJaWYgKCFuYW1lX3RhaWwpCisJCQlyZXR1cm4gMDsKKwkJd2hpbGUgKGxpbmUgPCBuYW1lX3RhaWwgJiYgaXNzcGFjZShuYW1lX3RhaWxbLTFdKSkKKwkJCW5hbWVfdGFpbC0tOworCQlkaXNwbGF5X25hbWVfbGVuZ3RoID0gbmFtZV90YWlsIC0gbGluZTsKKwkJZmlsbGVyID0gIiI7CisJCXN0cmNweShidWYsICJGcm9tOiAiKTsKKwkJcmV0ID0gc3RybGVuKGJ1Zik7CisJCXJldCArPSBhZGRfcmZjMjA0NyhidWYgKyByZXQsIGxpbmUsIGRpc3BsYXlfbmFtZV9sZW5ndGgpOworCQltZW1jcHkoYnVmICsgcmV0LCBuYW1lX3RhaWwsIG5hbWVsZW4gLSBkaXNwbGF5X25hbWVfbGVuZ3RoKTsKKwkJcmV0ICs9IG5hbWVsZW4gLSBkaXNwbGF5X25hbWVfbGVuZ3RoOworCQlidWZbcmV0KytdID0gJ1xuJzsKKwl9CisJZWxzZSB7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJXM6ICUuKnMlLipzXG4iLCB3aGF0LAorCQkJICAgICAgKGZtdCA9PSBDTUlUX0ZNVF9GVUxMRVIpID8gNCA6IDAsCisJCQkgICAgICBmaWxsZXIsIG5hbWVsZW4sIGxpbmUpOworCX0KKwlzd2l0Y2ggKGZtdCkgeworCWNhc2UgQ01JVF9GTVRfTUVESVVNOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJEYXRlOiAgICVzXG4iLCBzaG93X2RhdGUodGltZSwgdHopKTsKKwkJYnJlYWs7CisJY2FzZSBDTUlUX0ZNVF9FTUFJTDoKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiRGF0ZTogJXNcbiIsCisJCQkgICAgICAgc2hvd19yZmMyODIyX2RhdGUodGltZSwgdHopKTsKKwkJYnJlYWs7CisJY2FzZSBDTUlUX0ZNVF9GVUxMRVI6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIiVzRGF0ZTogJXNcbiIsIHdoYXQsIHNob3dfZGF0ZSh0aW1lLCB0eikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBub3RpbicgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNfZW1wdHlfbGluZShjb25zdCBjaGFyICpsaW5lLCBpbnQgKmxlbl9wKQoreworCWludCBsZW4gPSAqbGVuX3A7CisJd2hpbGUgKGxlbiAmJiBpc3NwYWNlKGxpbmVbbGVuLTFdKSkKKwkJbGVuLS07CisJKmxlbl9wID0gbGVuOworCXJldHVybiAhbGVuOworfQorCitzdGF0aWMgaW50IGFkZF9tZXJnZV9pbmZvKGVudW0gY21pdF9mbXQgZm10LCBjaGFyICpidWYsIGNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdCwgaW50IGFiYnJldikKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKwlpbnQgb2Zmc2V0OworCisJaWYgKChmbXQgPT0gQ01JVF9GTVRfT05FTElORSkgfHwgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCkgfHwKKwkgICAgIXBhcmVudCB8fCAhcGFyZW50LT5uZXh0KQorCQlyZXR1cm4gMDsKKworCW9mZnNldCA9IHNwcmludGYoYnVmLCAiTWVyZ2U6Iik7CisKKwl3aGlsZSAocGFyZW50KSB7CisJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnQtPml0ZW07CisJCWNvbnN0IGNoYXIgKmhleCA9IGFiYnJldgorCQkJPyBmaW5kX3VuaXF1ZV9hYmJyZXYocC0+b2JqZWN0LnNoYTEsIGFiYnJldikKKwkJCTogc2hhMV90b19oZXgocC0+b2JqZWN0LnNoYTEpOworCQljaGFyICpkb3RzID0gKGFiYnJldiAmJiBzdHJsZW4oaGV4KSAhPSA0MCkgPyAiLi4uIiA6ICIiOworCQlwYXJlbnQgPSBwYXJlbnQtPm5leHQ7CisKKwkJb2Zmc2V0ICs9IHNwcmludGYoYnVmICsgb2Zmc2V0LCAiICVzJXMiLCBoZXgsIGRvdHMpOworCX0KKwlidWZbb2Zmc2V0KytdID0gJ1xuJzsKKwlyZXR1cm4gb2Zmc2V0OworfQorCit1bnNpZ25lZCBsb25nIHByZXR0eV9wcmludF9jb21taXQoZW51bSBjbWl0X2ZtdCBmbXQsIGNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdCwgdW5zaWduZWQgbG9uZyBsZW4sIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzcGFjZSwgaW50IGFiYnJldiwgY29uc3QgY2hhciAqc3ViamVjdCwgY29uc3QgY2hhciAqYWZ0ZXJfc3ViamVjdCkKK3sKKwlpbnQgaGRyID0gMSwgYm9keSA9IDA7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCWludCBpbmRlbnQgPSA0OworCWludCBwYXJlbnRzX3Nob3duID0gMDsKKwljb25zdCBjaGFyICptc2cgPSBjb21taXQtPmJ1ZmZlcjsKKwlpbnQgcGxhaW5fbm9uX2FzY2lpID0gMDsKKworCWlmIChmbXQgPT0gQ01JVF9GTVRfT05FTElORSB8fCBmbXQgPT0gQ01JVF9GTVRfRU1BSUwpCisJCWluZGVudCA9IDA7CisKKwkvKiBBZnRlci1zdWJqZWN0IGlzIHVzZWQgdG8gcGFzcyBpbiBDb250ZW50LVR5cGU6IG11bHRpcGFydAorCSAqIE1JTUUgaGVhZGVyOyBpbiB0aGF0IGNhc2Ugd2UgZG8gbm90IGhhdmUgdG8gZG8gdGhlCisJICogcGxhaW50ZXh0IGNvbnRlbnQgdHlwZSBldmVuIGlmIHRoZSBjb21taXQgbWVzc2FnZSBoYXMKKwkgKiBub24gNy1iaXQgQVNDSUkgY2hhcmFjdGVyLiAgT3RoZXJ3aXNlLCBjaGVjayBpZiB3ZSBuZWVkCisJICogdG8gc2F5IHRoaXMgaXMgbm90IGEgNy1iaXQgQVNDSUkuCisJICovCisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCAmJiAhYWZ0ZXJfc3ViamVjdCkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgIXBsYWluX25vbl9hc2NpaSAmJiBtc2dbaV0gJiYgaSA8IGxlbjsgaSsrKQorCQkJaWYgKG1zZ1tpXSAmIDB4ODApCisJCQkJcGxhaW5fbm9uX2FzY2lpID0gMTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKmxpbmUgPSBtc2c7CisJCWludCBsaW5lbGVuID0gZ2V0X29uZV9saW5lKG1zZywgbGVuKTsKKworCQlpZiAoIWxpbmVsZW4pCisJCQlicmVhazsKKworCQkvKgorCQkgKiBXZSB3YW50IHNvbWUgc2xvcCBmb3IgaW5kZW50YXRpb24gYW5kIGEgcG9zc2libGUKKwkJICogZmluYWwgIi4uLiIuIFRodXMgdGhlICIrIDIwIi4KKwkJICovCisJCWlmIChvZmZzZXQgKyBsaW5lbGVuICsgMjAgPiBzcGFjZSkgeworCQkJbWVtY3B5KGJ1ZiArIG9mZnNldCwgIiAgICAuLi5cbiIsIDgpOworCQkJb2Zmc2V0ICs9IDg7CisJCQlicmVhazsKKwkJfQorCisJCW1zZyArPSBsaW5lbGVuOworCQlsZW4gLT0gbGluZWxlbjsKKwkJaWYgKGhkcikgeworCQkJaWYgKGxpbmVsZW4gPT0gMSkgeworCQkJCWhkciA9IDA7CisJCQkJaWYgKChmbXQgIT0gQ01JVF9GTVRfT05FTElORSkgJiYgIXN1YmplY3QpCisJCQkJCWJ1ZltvZmZzZXQrK10gPSAnXG4nOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGZtdCA9PSBDTUlUX0ZNVF9SQVcpIHsKKwkJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCBsaW5lLCBsaW5lbGVuKTsKKwkJCQlvZmZzZXQgKz0gbGluZWxlbjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghbWVtY21wKGxpbmUsICJwYXJlbnQgIiwgNykpIHsKKwkJCQlpZiAobGluZWxlbiAhPSA0OCkKKwkJCQkJZGllKCJiYWQgcGFyZW50IGxpbmUgaW4gY29tbWl0Iik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghcGFyZW50c19zaG93bikgeworCQkJCW9mZnNldCArPSBhZGRfbWVyZ2VfaW5mbyhmbXQsIGJ1ZiArIG9mZnNldCwKKwkJCQkJCQkgY29tbWl0LCBhYmJyZXYpOworCQkJCXBhcmVudHNfc2hvd24gPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIE1FRElVTSA9PSBERUZBVUxUIHNob3dzIG9ubHkgYXV0aG9yIHdpdGggZGF0ZXMuCisJCQkgKiBGVUxMIHNob3dzIGJvdGggYXV0aG9ycyBidXQgbm90IGRhdGVzLgorCQkJICogRlVMTEVSIHNob3dzIGJvdGggYXV0aG9ycyBhbmQgZGF0ZXMuCisJCQkgKi8KKwkJCWlmICghbWVtY21wKGxpbmUsICJhdXRob3IgIiwgNykpCisJCQkJb2Zmc2V0ICs9IGFkZF91c2VyX2luZm8oIkF1dGhvciIsIGZtdCwKKwkJCQkJCQlidWYgKyBvZmZzZXQsCisJCQkJCQkJbGluZSArIDcpOworCQkJaWYgKCFtZW1jbXAobGluZSwgImNvbW1pdHRlciAiLCAxMCkgJiYKKwkJCSAgICAoZm10ID09IENNSVRfRk1UX0ZVTEwgfHwgZm10ID09IENNSVRfRk1UX0ZVTExFUikpCisJCQkJb2Zmc2V0ICs9IGFkZF91c2VyX2luZm8oIkNvbW1pdCIsIGZtdCwKKwkJCQkJCQlidWYgKyBvZmZzZXQsCisJCQkJCQkJbGluZSArIDEwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGlzX2VtcHR5X2xpbmUobGluZSwgJmxpbmVsZW4pKSB7CisJCQlpZiAoIWJvZHkpCisJCQkJY29udGludWU7CisJCQlpZiAoc3ViamVjdCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChmbXQgPT0gQ01JVF9GTVRfU0hPUlQpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlib2R5ID0gMTsKKwkJfQorCisJCWlmIChzdWJqZWN0KSB7CisJCQlpbnQgc2xlbiA9IHN0cmxlbihzdWJqZWN0KTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQsIHN1YmplY3QsIHNsZW4pOworCQkJb2Zmc2V0ICs9IHNsZW47CisJCQlvZmZzZXQgKz0gYWRkX3JmYzIwNDcoYnVmICsgb2Zmc2V0LCBsaW5lLCBsaW5lbGVuKTsKKwkJfQorCQllbHNlIHsKKwkJCW1lbXNldChidWYgKyBvZmZzZXQsICcgJywgaW5kZW50KTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQgKyBpbmRlbnQsIGxpbmUsIGxpbmVsZW4pOworCQkJb2Zmc2V0ICs9IGxpbmVsZW4gKyBpbmRlbnQ7CisJCX0KKwkJYnVmW29mZnNldCsrXSA9ICdcbic7CisJCWlmIChmbXQgPT0gQ01JVF9GTVRfT05FTElORSkKKwkJCWJyZWFrOworCQlpZiAoc3ViamVjdCAmJiBwbGFpbl9ub25fYXNjaWkpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGhlYWRlcltdID0KKwkJCQkiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisJCQkJIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiI7CisJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpLTEpOworCQkJb2Zmc2V0ICs9IHNpemVvZihoZWFkZXIpLTE7CisJCX0KKwkJaWYgKGFmdGVyX3N1YmplY3QpIHsKKwkJCWludCBzbGVuID0gc3RybGVuKGFmdGVyX3N1YmplY3QpOworCQkJaWYgKHNsZW4gPiBzcGFjZSAtIG9mZnNldCAtIDEpCisJCQkJc2xlbiA9IHNwYWNlIC0gb2Zmc2V0IC0gMTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQsIGFmdGVyX3N1YmplY3QsIHNsZW4pOworCQkJb2Zmc2V0ICs9IHNsZW47CisJCQlhZnRlcl9zdWJqZWN0ID0gTlVMTDsKKwkJfQorCQlzdWJqZWN0ID0gTlVMTDsKKwl9CisJd2hpbGUgKG9mZnNldCAmJiBpc3NwYWNlKGJ1ZltvZmZzZXQtMV0pKQorCQlvZmZzZXQtLTsKKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYW4gRU9MTiBmb3IgdGhlIG5vbi1vbmVsaW5lIGNhc2UgKi8KKwlpZiAoZm10ICE9IENNSVRfRk1UX09ORUxJTkUpCisJCWJ1ZltvZmZzZXQrK10gPSAnXG4nOworCWJ1ZltvZmZzZXRdID0gJ1wwJzsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdHJ1Y3QgY29tbWl0ICpwb3BfY29tbWl0KHN0cnVjdCBjb21taXRfbGlzdCAqKnN0YWNrKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqdG9wID0gKnN0YWNrOworCXN0cnVjdCBjb21taXQgKml0ZW0gPSB0b3AgPyB0b3AtPml0ZW0gOiBOVUxMOworCisJaWYgKHRvcCkgeworCQkqc3RhY2sgPSB0b3AtPm5leHQ7CisJCWZyZWUodG9wKTsKKwl9CisJcmV0dXJuIGl0ZW07Cit9CisKK2ludCBjb3VudF9wYXJlbnRzKHN0cnVjdCBjb21taXQgKiBjb21taXQpCit7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHN0cnVjdCBjb21taXRfbGlzdCAqIHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisgICAgICAgIGZvciAoY291bnQ9MDtwYXJlbnRzOyBwYXJlbnRzPXBhcmVudHMtPm5leHQsY291bnQrKykKKyAgICAgICAgICA7CisgICAgICAgIHJldHVybiBjb3VudDsKK30KKwordm9pZCB0b3BvX3NvcnRfZGVmYXVsdF9zZXR0ZXIoc3RydWN0IGNvbW1pdCAqYywgdm9pZCAqZGF0YSkKK3sKKwljLT5vYmplY3QudXRpbCA9IGRhdGE7Cit9CisKK3ZvaWQgKnRvcG9fc29ydF9kZWZhdWx0X2dldHRlcihzdHJ1Y3QgY29tbWl0ICpjKQoreworCXJldHVybiBjLT5vYmplY3QudXRpbDsKK30KKworLyoKKyAqIFBlcmZvcm1zIGFuIGluLXBsYWNlIHRvcG9sb2dpY2FsIHNvcnQgb24gdGhlIGxpc3Qgc3VwcGxpZWQuCisgKi8KK3ZvaWQgc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcihzdHJ1Y3QgY29tbWl0X2xpc3QgKiogbGlzdCwgaW50IGxpZm8pCit7CisJc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbihsaXN0LCBsaWZvLCB0b3BvX3NvcnRfZGVmYXVsdF9zZXR0ZXIsCisJCQkJICAgICB0b3BvX3NvcnRfZGVmYXVsdF9nZXR0ZXIpOworfQorCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXJfZm4oc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvLAorCQkJCSAgdG9wb19zb3J0X3NldF9mbl90IHNldHRlciwKKwkJCQkgIHRvcG9fc29ydF9nZXRfZm5fdCBnZXR0ZXIpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICogbmV4dCA9ICpsaXN0OworCXN0cnVjdCBjb21taXRfbGlzdCAqIHdvcmsgPSBOVUxMLCAqKmluc2VydDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKiogcHB0ciA9IGxpc3Q7CisJc3RydWN0IHNvcnRfbm9kZSAqIG5vZGVzOworCXN0cnVjdCBzb3J0X25vZGUgKiBuZXh0X25vZGVzOworCWludCBjb3VudCA9IDA7CisKKwkvKiBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGxpc3QgKi8KKwl3aGlsZSAobmV4dCkgeworCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJY291bnQrKzsKKwl9CisJCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuOworCS8qIGFsbG9jYXRlIGFuIGFycmF5IHRvIGhlbHAgc29ydCB0aGUgbGlzdCAqLworCW5vZGVzID0geGNhbGxvYyhjb3VudCwgc2l6ZW9mKCpub2RlcykpOworCS8qIGxpbmsgdGhlIGxpc3QgdG8gdGhlIGFycmF5ICovCisJbmV4dF9ub2RlcyA9IG5vZGVzOworCW5leHQ9Kmxpc3Q7CisJd2hpbGUgKG5leHQpIHsKKwkJbmV4dF9ub2Rlcy0+bGlzdF9pdGVtID0gbmV4dDsKKwkJc2V0dGVyKG5leHQtPml0ZW0sIG5leHRfbm9kZXMpOworCQluZXh0X25vZGVzKys7CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKwkvKiB1cGRhdGUgdGhlIGluZGVncmVlICovCisJbmV4dD0qbGlzdDsKKwl3aGlsZSAobmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKiBwYXJlbnRzID0gbmV4dC0+aXRlbS0+cGFyZW50czsKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXN0cnVjdCBjb21taXQgKiBwYXJlbnQ9cGFyZW50cy0+aXRlbTsKKwkJCXN0cnVjdCBzb3J0X25vZGUgKiBwbiA9IChzdHJ1Y3Qgc29ydF9ub2RlICopIGdldHRlcihwYXJlbnQpOworCisJCQlpZiAocG4pCisJCQkJcG4tPmluZGVncmVlKys7CisJCQlwYXJlbnRzPXBhcmVudHMtPm5leHQ7CisJCX0KKwkJbmV4dD1uZXh0LT5uZXh0OworCX0KKwkvKiAKKyAgICAgICAgICogZmluZCB0aGUgdGlwcworICAgICAgICAgKgorICAgICAgICAgKiB0aXBzIGFyZSBub2RlcyBub3QgcmVhY2hhYmxlIGZyb20gYW55IG90aGVyIG5vZGUgaW4gdGhlIGxpc3QgCisgICAgICAgICAqIAorICAgICAgICAgKiB0aGUgdGlwcyBzZXJ2ZSBhcyBhIHN0YXJ0aW5nIHNldCBmb3IgdGhlIHdvcmsgcXVldWUuCisgICAgICAgICAqLworCW5leHQ9Kmxpc3Q7CisJaW5zZXJ0ID0gJndvcms7CisJd2hpbGUgKG5leHQpIHsKKwkJc3RydWN0IHNvcnRfbm9kZSAqIG5vZGUgPSAoc3RydWN0IHNvcnRfbm9kZSAqKSBnZXR0ZXIobmV4dC0+aXRlbSk7CisKKwkJaWYgKG5vZGUtPmluZGVncmVlID09IDApIHsKKwkJCWluc2VydCA9ICZjb21taXRfbGlzdF9pbnNlcnQobmV4dC0+aXRlbSwgaW5zZXJ0KS0+bmV4dDsKKwkJfQorCQluZXh0PW5leHQtPm5leHQ7CisJfQorCisJLyogcHJvY2VzcyB0aGUgbGlzdCBpbiB0b3BvbG9naWNhbCBvcmRlciAqLworCWlmICghbGlmbykKKwkJc29ydF9ieV9kYXRlKCZ3b3JrKTsKKwl3aGlsZSAod29yaykgeworCQlzdHJ1Y3QgY29tbWl0ICogd29ya19pdGVtID0gcG9wX2NvbW1pdCgmd29yayk7CisJCXN0cnVjdCBzb3J0X25vZGUgKiB3b3JrX25vZGUgPSAoc3RydWN0IHNvcnRfbm9kZSAqKSBnZXR0ZXIod29ya19pdGVtKTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICogcGFyZW50cyA9IHdvcmtfaXRlbS0+cGFyZW50czsKKworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqIHBhcmVudD1wYXJlbnRzLT5pdGVtOworCQkJc3RydWN0IHNvcnRfbm9kZSAqIHBuID0gKHN0cnVjdCBzb3J0X25vZGUgKikgZ2V0dGVyKHBhcmVudCk7CisKKwkJCWlmIChwbikgeworCQkJCS8qCisJCQkJICogcGFyZW50cyBhcmUgb25seSBlbnF1ZXVlZCBmb3IgZW1pc3Npb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gYWxsIHRoZWlyIGNoaWxkcmVuIGhhdmUgYmVlbiBlbWl0dGVkIHRoZXJlYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZ3VhcmFudGVlaW5nIHRvcG9sb2dpY2FsIG9yZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQlwbi0+aW5kZWdyZWUtLTsKKwkJCQlpZiAoIXBuLT5pbmRlZ3JlZSkgeworCQkJCQlpZiAoIWxpZm8pCisJCQkJCQlpbnNlcnRfYnlfZGF0ZShwYXJlbnQsICZ3b3JrKTsKKwkJCQkJZWxzZQorCQkJCQkJY29tbWl0X2xpc3RfaW5zZXJ0KHBhcmVudCwgJndvcmspOworCQkJCX0KKwkJCX0KKwkJCXBhcmVudHM9cGFyZW50cy0+bmV4dDsKKwkJfQorCQkvKgorICAgICAgICAgICAgICAgICAqIHdvcmtfaXRlbSBpcyBhIGNvbW1pdCBhbGwgb2Ygd2hvc2UgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgKiBoYXZlIGFscmVhZHkgYmVlbiBlbWl0dGVkLiB3ZSBjYW4gZW1pdCBpdCBub3cuCisgICAgICAgICAgICAgICAgICovCisJCSpwcHRyID0gd29ya19ub2RlLT5saXN0X2l0ZW07CisJCXBwdHIgPSAmKCpwcHRyKS0+bmV4dDsKKwkJKnBwdHIgPSBOVUxMOworCQlzZXR0ZXIod29ya19pdGVtLCBOVUxMKTsKKwl9CisJZnJlZShub2Rlcyk7Cit9CmRpZmYgLS1naXQgYS9jb21taXQuaCBiL2NvbW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZGUxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21taXQuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBDT01NSVRfSAorI2RlZmluZSBDT01NSVRfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdHJ1Y3QgY29tbWl0X2xpc3QgeworCXN0cnVjdCBjb21taXQgKml0ZW07CisJc3RydWN0IGNvbW1pdF9saXN0ICpuZXh0OworfTsKKworc3RydWN0IGNvbW1pdCB7CisJc3RydWN0IG9iamVjdCBvYmplY3Q7CisJdW5zaWduZWQgbG9uZyBkYXRlOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKwljaGFyICpidWZmZXI7Cit9OworCitleHRlcm4gaW50IHNhdmVfY29tbWl0X2J1ZmZlcjsKK2V4dGVybiBjb25zdCBjaGFyICpjb21taXRfdHlwZTsKKworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK3N0cnVjdCBjb21taXQgKmxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCSAgICAgIGludCBxdWlldCk7CisKK2ludCBwYXJzZV9jb21taXRfYnVmZmVyKHN0cnVjdCBjb21taXQgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICppdGVtKTsKKworc3RydWN0IGNvbW1pdF9saXN0ICogY29tbWl0X2xpc3RfaW5zZXJ0KHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3RfcCk7CitzdHJ1Y3QgY29tbWl0X2xpc3QgKiBpbnNlcnRfYnlfZGF0ZShzdHJ1Y3QgY29tbWl0ICppdGVtLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0KTsKKwordm9pZCBmcmVlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCk7CisKK3ZvaWQgc29ydF9ieV9kYXRlKHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpOworCisvKiBDb21taXQgZm9ybWF0cyAqLworZW51bSBjbWl0X2ZtdCB7CisJQ01JVF9GTVRfUkFXLAorCUNNSVRfRk1UX01FRElVTSwKKwlDTUlUX0ZNVF9ERUZBVUxUID0gQ01JVF9GTVRfTUVESVVNLAorCUNNSVRfRk1UX1NIT1JULAorCUNNSVRfRk1UX0ZVTEwsCisJQ01JVF9GTVRfRlVMTEVSLAorCUNNSVRfRk1UX09ORUxJTkUsCisJQ01JVF9GTVRfRU1BSUwsCisKKwlDTUlUX0ZNVF9VTlNQRUNJRklFRCwKK307CisKK2V4dGVybiBlbnVtIGNtaXRfZm10IGdldF9jb21taXRfZm9ybWF0KGNvbnN0IGNoYXIgKmFyZyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwcmV0dHlfcHJpbnRfY29tbWl0KGVudW0gY21pdF9mbXQgZm10LCBjb25zdCBzdHJ1Y3QgY29tbWl0ICosIHVuc2lnbmVkIGxvbmcgbGVuLCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc3BhY2UsIGludCBhYmJyZXYsIGNvbnN0IGNoYXIgKnN1YmplY3QsIGNvbnN0IGNoYXIgKmFmdGVyX3N1YmplY3QpOworCisvKiogUmVtb3ZlcyB0aGUgZmlyc3QgY29tbWl0IGZyb20gYSBsaXN0IHNvcnRlZCBieSBkYXRlLCBhbmQgYWRkcyBhbGwKKyAqIG9mIGl0cyBwYXJlbnRzLgorICoqLworc3RydWN0IGNvbW1pdCAqcG9wX21vc3RfcmVjZW50X2NvbW1pdChzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0LCAKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFyayk7CisKK3N0cnVjdCBjb21taXQgKnBvcF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqc3RhY2spOworCit2b2lkIGNsZWFyX2NvbW1pdF9tYXJrcyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHVuc2lnbmVkIGludCBtYXJrKTsKKworaW50IGNvdW50X3BhcmVudHMoc3RydWN0IGNvbW1pdCAqIGNvbW1pdCk7CisKKy8qCisgKiBQZXJmb3JtcyBhbiBpbi1wbGFjZSB0b3BvbG9naWNhbCBzb3J0IG9mIGxpc3Qgc3VwcGxpZWQuCisgKgorICogUHJlLWNvbmRpdGlvbnMgZm9yIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXI6CisgKiAgIGFsbCBjb21taXRzIGluIGlucHV0IGxpc3QgYW5kIGFsbCBwYXJlbnRzIG9mIHRob3NlCisgKiAgIGNvbW1pdHMgbXVzdCBoYXZlIG9iamVjdC51dGlsID09IE5VTEwKKyAqCisgKiBQcmUtY29uZGl0aW9ucyBmb3Igc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbjoKKyAqICAgYWxsIGNvbW1pdHMgaW4gaW5wdXQgbGlzdCBhbmQgYWxsIHBhcmVudHMgb2YgdGhvc2UKKyAqICAgY29tbWl0cyBtdXN0IGhhdmUgZ2V0dGVyKGNvbW1pdCkgPT0gTlVMTAorICoKKyAqIFBvc3QtY29uZGl0aW9uczoKKyAqICAgaW52YXJpYW50IG9mIHJlc3VsdGluZyBsaXN0IGlzOgorICogICAgICBhIHJlYWNoYWJsZSBmcm9tIGIgPT4gb3JkKGIpIDwgb3JkKGEpCisgKiAgIGluIGFkZGl0aW9uLCB3aGVuIGxpZm8gPT0gMCwgY29tbWl0cyBvbiBwYXJhbGxlbCB0cmFja3MgYXJlCisgKiAgIHNvcnRlZCBpbiB0aGUgZGF0ZXMgb3JkZXIuCisgKi8KKwordHlwZWRlZiB2b2lkICgqdG9wb19zb3J0X3NldF9mbl90KShzdHJ1Y3QgY29tbWl0Kiwgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQqICgqdG9wb19zb3J0X2dldF9mbl90KShzdHJ1Y3QgY29tbWl0Kik7CisKK3ZvaWQgdG9wb19zb3J0X2RlZmF1bHRfc2V0dGVyKHN0cnVjdCBjb21taXQgKmMsIHZvaWQgKmRhdGEpOwordm9pZCAqdG9wb19zb3J0X2RlZmF1bHRfZ2V0dGVyKHN0cnVjdCBjb21taXQgKmMpOworCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvKTsKK3ZvaWQgc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbihzdHJ1Y3QgY29tbWl0X2xpc3QgKiogbGlzdCwgaW50IGxpZm8sCisJCQkJICB0b3BvX3NvcnRfc2V0X2ZuX3Qgc2V0dGVyLAorCQkJCSAgdG9wb19zb3J0X2dldF9mbl90IGdldHRlcik7CisKK3N0cnVjdCBjb21taXRfZ3JhZnQgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IG5yX3BhcmVudDsKKwl1bnNpZ25lZCBjaGFyIHBhcmVudFtGTEVYX0FSUkFZXVsyMF07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCBjb21taXRfZ3JhZnQgKnJlYWRfZ3JhZnRfbGluZShjaGFyICpidWYsIGludCBsZW4pOworaW50IHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChzdHJ1Y3QgY29tbWl0X2dyYWZ0ICosIGludCk7CitpbnQgcmVhZF9ncmFmdF9maWxlKGNvbnN0IGNoYXIgKmdyYWZ0X2ZpbGUpOworCisjZW5kaWYgLyogQ09NTUlUX0ggKi8KZGlmZiAtLWdpdCBhL2NvbXBhdC9pbmV0X250b3AuYyBiL2NvbXBhdC9pbmV0X250b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhjMWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L2luZXRfbnRvcC5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCisgKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCisgKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBOU19JTkFERFJTWgorI2RlZmluZSBOU19JTkFERFJTWgk0CisjZW5kaWYKKyNpZm5kZWYgTlNfSU42QUREUlNaCisjZGVmaW5lIE5TX0lONkFERFJTWgkxNgorI2VuZGlmCisjaWZuZGVmIE5TX0lOVDE2U1oKKyNkZWZpbmUgTlNfSU5UMTZTWgkyCisjZW5kaWYKKworLyoKKyAqIFdBUk5JTkc6IERvbid0IGV2ZW4gY29uc2lkZXIgdHJ5aW5nIHRvIGNvbXBpbGUgdGhpcyBvbiBhIHN5c3RlbSB3aGVyZQorICogc2l6ZW9mKGludCkgPCA0LiAgc2l6ZW9mKGludCkgPiA0IGlzIGZpbmU7IGFsbCB0aGUgd29ybGQncyBub3QgYSBWQVguCisgKi8KKworLyogY29uc3QgY2hhciAqCisgKiBpbmV0X250b3A0KHNyYywgZHN0LCBzaXplKQorICoJZm9ybWF0IGFuIElQdjQgYWRkcmVzcworICogcmV0dXJuOgorICoJYGRzdCcgKGFzIGEgY29uc3QpCisgKiBub3RlczoKKyAqCSgxKSB1c2VzIG5vIHN0YXRpY3MKKyAqCSgyKSB0YWtlcyBhIHVfY2hhciogbm90IGFuIGluX2FkZHIgYXMgaW5wdXQKKyAqIGF1dGhvcjoKKyAqCVBhdWwgVml4aWUsIDE5OTYuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2luZXRfbnRvcDQoc3JjLCBkc3QsIHNpemUpCisJY29uc3QgdV9jaGFyICpzcmM7CisJY2hhciAqZHN0OworCXNpemVfdCBzaXplOworeworCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIiV1LiV1LiV1LiV1IjsKKwljaGFyIHRtcFtzaXplb2YgIjI1NS4yNTUuMjU1LjI1NSJdOworCWludCBucHJpbnRlZDsKKworCW5wcmludGVkID0gc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgZm10LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10pOworCWlmIChucHJpbnRlZCA8IDApCisJCXJldHVybiAoTlVMTCk7CS8qIHdlIGFzc3VtZSAiZXJybm8iIHdhcyBzZXQgYnkgInNucHJpbnRmKCkiICovCisJaWYgKChzaXplX3QpbnByaW50ZWQgPiBzaXplKSB7CisJCWVycm5vID0gRU5PU1BDOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzdHJjcHkoZHN0LCB0bXApOworCXJldHVybiAoZHN0KTsKK30KKworI2lmbmRlZiBOT19JUFY2CisvKiBjb25zdCBjaGFyICoKKyAqIGluZXRfbnRvcDYoc3JjLCBkc3QsIHNpemUpCisgKgljb252ZXJ0IElQdjYgYmluYXJ5IGFkZHJlc3MgaW50byBwcmVzZW50YXRpb24gKHByaW50YWJsZSkgZm9ybWF0CisgKiBhdXRob3I6CisgKglQYXVsIFZpeGllLCAxOTk2LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitpbmV0X250b3A2KHNyYywgZHN0LCBzaXplKQorCWNvbnN0IHVfY2hhciAqc3JjOworCWNoYXIgKmRzdDsKKwlzaXplX3Qgc2l6ZTsKK3sKKwkvKgorCSAqIE5vdGUgdGhhdCBpbnQzMl90IGFuZCBpbnQxNl90IG5lZWQgb25seSBiZSAiYXQgbGVhc3QiIGxhcmdlIGVub3VnaAorCSAqIHRvIGNvbnRhaW4gYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuICBPbiBzb21lIHN5c3RlbXMsIGxpa2UKKwkgKiBDcmF5cywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggMTYgYml0cy4KKwkgKiBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkCisJICogdG8gdXNlIHBvaW50ZXIgb3ZlcmxheXMuICBBbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorCSAqLworCWNoYXIgdG1wW3NpemVvZiAiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6MjU1LjI1NS4yNTUuMjU1Il0sICp0cDsKKwlzdHJ1Y3QgeyBpbnQgYmFzZSwgbGVuOyB9IGJlc3QsIGN1cjsKKwl1X2ludCB3b3Jkc1tOU19JTjZBRERSU1ogLyBOU19JTlQxNlNaXTsKKwlpbnQgaTsKKworCS8qCisJICogUHJlcHJvY2VzczoKKwkgKglDb3B5IHRoZSBpbnB1dCAoYnl0ZXdpc2UpIGFycmF5IGludG8gYSB3b3Jkd2lzZSBhcnJheS4KKwkgKglGaW5kIHRoZSBsb25nZXN0IHJ1biBvZiAweDAwJ3MgaW4gc3JjW10gZm9yIDo6IHNob3J0aGFuZGluZy4KKwkgKi8KKwltZW1zZXQod29yZHMsICdcMCcsIHNpemVvZiB3b3Jkcyk7CisJZm9yIChpID0gMDsgaSA8IE5TX0lONkFERFJTWjsgaSsrKQorCQl3b3Jkc1tpIC8gMl0gfD0gKHNyY1tpXSA8PCAoKDEgLSAoaSAlIDIpKSA8PCAzKSk7CisJYmVzdC5iYXNlID0gLTE7CisJY3VyLmJhc2UgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgKE5TX0lONkFERFJTWiAvIE5TX0lOVDE2U1opOyBpKyspIHsKKwkJaWYgKHdvcmRzW2ldID09IDApIHsKKwkJCWlmIChjdXIuYmFzZSA9PSAtMSkKKwkJCQljdXIuYmFzZSA9IGksIGN1ci5sZW4gPSAxOworCQkJZWxzZQorCQkJCWN1ci5sZW4rKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChjdXIuYmFzZSAhPSAtMSkgeworCQkJCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQorCQkJCQliZXN0ID0gY3VyOworCQkJCWN1ci5iYXNlID0gLTE7CisJCQl9CisJCX0KKwl9CisJaWYgKGN1ci5iYXNlICE9IC0xKSB7CisJCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQorCQkJYmVzdCA9IGN1cjsKKwl9CisJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBiZXN0LmxlbiA8IDIpCisJCWJlc3QuYmFzZSA9IC0xOworCisJLyoKKwkgKiBGb3JtYXQgdGhlIHJlc3VsdC4KKwkgKi8KKwl0cCA9IHRtcDsKKwlmb3IgKGkgPSAwOyBpIDwgKE5TX0lONkFERFJTWiAvIE5TX0lOVDE2U1opOyBpKyspIHsKKwkJLyogQXJlIHdlIGluc2lkZSB0aGUgYmVzdCBydW4gb2YgMHgwMCdzPyAqLworCQlpZiAoYmVzdC5iYXNlICE9IC0xICYmIGkgPj0gYmVzdC5iYXNlICYmCisJCSAgICBpIDwgKGJlc3QuYmFzZSArIGJlc3QubGVuKSkgeworCQkJaWYgKGkgPT0gYmVzdC5iYXNlKQorCQkJCSp0cCsrID0gJzonOworCQkJY29udGludWU7CisJCX0KKwkJLyogQXJlIHdlIGZvbGxvd2luZyBhbiBpbml0aWFsIHJ1biBvZiAweDAwcyBvciBhbnkgcmVhbCBoZXg/ICovCisJCWlmIChpICE9IDApCisJCQkqdHArKyA9ICc6JzsKKwkJLyogSXMgdGhpcyBhZGRyZXNzIGFuIGVuY2Fwc3VsYXRlZCBJUHY0PyAqLworCQlpZiAoaSA9PSA2ICYmIGJlc3QuYmFzZSA9PSAwICYmCisJCSAgICAoYmVzdC5sZW4gPT0gNiB8fCAoYmVzdC5sZW4gPT0gNSAmJiB3b3Jkc1s1XSA9PSAweGZmZmYpKSkgeworCQkJaWYgKCFpbmV0X250b3A0KHNyYysxMiwgdHAsIHNpemVvZiB0bXAgLSAodHAgLSB0bXApKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJdHAgKz0gc3RybGVuKHRwKTsKKwkJCWJyZWFrOworCQl9CisJCXRwICs9IHNucHJpbnRmKHRwLCBzaXplb2YgdG1wIC0gKHRwIC0gdG1wKSwgIiV4Iiwgd29yZHNbaV0pOworCX0KKwkvKiBXYXMgaXQgYSB0cmFpbGluZyBydW4gb2YgMHgwMCdzPyAqLworCWlmIChiZXN0LmJhc2UgIT0gLTEgJiYgKGJlc3QuYmFzZSArIGJlc3QubGVuKSA9PQorCSAgICAoTlNfSU42QUREUlNaIC8gTlNfSU5UMTZTWikpCisJCSp0cCsrID0gJzonOworCSp0cCsrID0gJ1wwJzsKKworCS8qCisJICogQ2hlY2sgZm9yIG92ZXJmbG93LCBjb3B5LCBhbmQgd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoKHNpemVfdCkodHAgLSB0bXApID4gc2l6ZSkgeworCQllcnJubyA9IEVOT1NQQzsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJc3RyY3B5KGRzdCwgdG1wKTsKKwlyZXR1cm4gKGRzdCk7Cit9CisjZW5kaWYKKworLyogY2hhciAqCisgKiBpbmV0X250b3AoYWYsIHNyYywgZHN0LCBzaXplKQorICoJY29udmVydCBhIG5ldHdvcmsgZm9ybWF0IGFkZHJlc3MgdG8gcHJlc2VudGF0aW9uIGZvcm1hdC4KKyAqIHJldHVybjoKKyAqCXBvaW50ZXIgdG8gcHJlc2VudGF0aW9uIGZvcm1hdCBhZGRyZXNzIChgZHN0JyksIG9yIE5VTEwgKHNlZSBlcnJubykuCisgKiBhdXRob3I6CisgKglQYXVsIFZpeGllLCAxOTk2LgorICovCitjb25zdCBjaGFyICoKK2luZXRfbnRvcChhZiwgc3JjLCBkc3QsIHNpemUpCisJaW50IGFmOworCWNvbnN0IHZvaWQgKnNyYzsKKwljaGFyICpkc3Q7CisJc2l6ZV90IHNpemU7Cit7CisJc3dpdGNoIChhZikgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIChpbmV0X250b3A0KHNyYywgZHN0LCBzaXplKSk7CisjaWZuZGVmIE5PX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gKGluZXRfbnRvcDYoc3JjLCBkc3QsIHNpemUpKTsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWVycm5vID0gRUFGTk9TVVBQT1JUOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9jb21wYXQvbW1hcC5jIGIvY29tcGF0L21tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWNiMTIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L21tYXAuYwpAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCit2b2lkICpnaXRmYWtlbW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QgLCBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KQoreworCWludCBuID0gMDsKKworCWlmIChzdGFydCAhPSBOVUxMIHx8ICEoZmxhZ3MgJiBNQVBfUFJJVkFURSkpCisJCWRpZSgiSW52YWxpZCB1c2FnZSBvZiBnaXRmYWtlbW1hcC4iKTsKKworCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gTUFQX0ZBSUxFRDsKKwl9CisKKwlzdGFydCA9IHhtYWxsb2MobGVuZ3RoKTsKKwlpZiAoc3RhcnQgPT0gTlVMTCkgeworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIE1BUF9GQUlMRUQ7CisJfQorCisJd2hpbGUgKG4gPCBsZW5ndGgpIHsKKwkJaW50IGNvdW50ID0gcmVhZChmZCwgc3RhcnQrbiwgbGVuZ3RoLW4pOworCisJCWlmIChjb3VudCA9PSAwKSB7CisJCQltZW1zZXQoc3RhcnQrbiwgMCwgbGVuZ3RoLW4pOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY291bnQgPCAwKSB7CisJCQlmcmVlKHN0YXJ0KTsKKwkJCWVycm5vID0gRUFDQ0VTOworCQkJcmV0dXJuIE1BUF9GQUlMRUQ7CisJCX0KKworCQluICs9IGNvdW50OworCX0KKworCXJldHVybiBzdGFydDsKK30KKworaW50IGdpdGZha2VtdW5tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgpCit7CisJZnJlZShzdGFydCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2NvbXBhdC9zZXRlbnYuYyBiL2NvbXBhdC9zZXRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q3Njc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L3NldGVudi5jCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IGdpdHNldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IHJlcGxhY2UpCit7CisJaW50IG91dDsKKwlzaXplX3QgbmFtZWxlbiwgdmFsdWVsZW47CisJY2hhciAqZW52c3RyOworCisJaWYgKCFuYW1lIHx8ICF2YWx1ZSkgcmV0dXJuIC0xOworCWlmICghcmVwbGFjZSkgeworCQljaGFyICpvbGR2YWwgPSBOVUxMOworCQlvbGR2YWwgPSBnZXRlbnYobmFtZSk7CisJCWlmIChvbGR2YWwpIHJldHVybiAwOworCX0KKworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJdmFsdWVsZW4gPSBzdHJsZW4odmFsdWUpOworCWVudnN0ciA9IG1hbGxvYygobmFtZWxlbiArIHZhbHVlbGVuICsgMikpOworCWlmICghZW52c3RyKSByZXR1cm4gLTE7CisKKwltZW1jcHkoZW52c3RyLCBuYW1lLCBuYW1lbGVuKTsKKwllbnZzdHJbbmFtZWxlbl0gPSAnPSc7CisJbWVtY3B5KGVudnN0ciArIG5hbWVsZW4gKyAxLCB2YWx1ZSwgdmFsdWVsZW4pOworCWVudnN0cltuYW1lbGVuICsgdmFsdWVsZW4gKyAxXSA9IDA7CisKKwlvdXQgPSBwdXRlbnYoZW52c3RyKTsKKwkvKiBwdXRlbnYoMykgbWFrZXMgdGhlIGFyZ3VtZW50IHN0cmluZyBwYXJ0IG9mIHRoZSBlbnZpcm9ubWVudCwKKwkgKiBhbmQgY2hhbmdpbmcgdGhhdCBzdHJpbmcgbW9kaWZpZXMgdGhlIGVudmlyb25tZW50IC0tLSB3aGljaAorCSAqIG1lYW5zIHdlIGRvIG5vdCBvd24gdGhhdCBzdG9yYWdlIGFueW1vcmUuICBEbyBub3QgZnJlZQorCSAqIGVudnN0ci4KKwkgKi8KKworCXJldHVybiBvdXQ7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvc3RyY2FzZXN0ci5jIGIvY29tcGF0L3N0cmNhc2VzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg5NmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L3N0cmNhc2VzdHIuYwpAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSAiLi4vZ2l0LWNvbXBhdC11dGlsLmgiCisKK2NoYXIgKmdpdHN0cmNhc2VzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkKK3sKKwlpbnQgbmxlbiA9IHN0cmxlbihuZWVkbGUpOworCWludCBobGVuID0gc3RybGVuKGhheXN0YWNrKSAtIG5sZW4gKyAxOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGhsZW47IGkrKykgeworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IG5sZW47IGorKykgeworCQkJdW5zaWduZWQgY2hhciBjMSA9IGhheXN0YWNrW2kral07CisJCQl1bnNpZ25lZCBjaGFyIGMyID0gbmVlZGxlW2pdOworCQkJaWYgKHRvdXBwZXIoYzEpICE9IHRvdXBwZXIoYzIpKQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCQlyZXR1cm4gKGNoYXIgKikgaGF5c3RhY2sgKyBpOworCW5leHQ6CisJCTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvc3VicHJvY2Vzcy5weSBiL2NvbXBhdC9zdWJwcm9jZXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDI2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc3VicHJvY2Vzcy5weQpAQCAtMCwwICsxLDExNDkgQEAKKyMgc3VicHJvY2VzcyAtIFN1YnByb2Nlc3NlcyB3aXRoIGFjY2Vzc2libGUgSS9PIHN0cmVhbXMKKyMKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtb2R1bGUsIHNlZSBQRVAgMzI0LgorIworIyBUaGlzIG1vZHVsZSBzaG91bGQgcmVtYWluIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4yLCBzZWUgUEVQIDI5MS4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgYnkgUGV0ZXIgQXN0cmFuZCA8YXN0cmFuZEBseXNhdG9yLmxpdS5zZT4KKyMKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIyBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnLzIuNC9saWNlbnNlIGZvciBsaWNlbnNpbmcgZGV0YWlscy4KKworciIiInN1YnByb2Nlc3MgLSBTdWJwcm9jZXNzZXMgd2l0aCBhY2Nlc3NpYmxlIEkvTyBzdHJlYW1zCisKK1RoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gc3Bhd24gcHJvY2Vzc2VzLCBjb25uZWN0IHRvIHRoZWlyCitpbnB1dC9vdXRwdXQvZXJyb3IgcGlwZXMsIGFuZCBvYnRhaW4gdGhlaXIgcmV0dXJuIGNvZGVzLiAgVGhpcyBtb2R1bGUKK2ludGVuZHMgdG8gcmVwbGFjZSBzZXZlcmFsIG90aGVyLCBvbGRlciBtb2R1bGVzIGFuZCBmdW5jdGlvbnMsIGxpa2U6CisKK29zLnN5c3RlbQorb3Muc3Bhd24qCitvcy5wb3BlbioKK3BvcGVuMi4qCitjb21tYW5kcy4qCisKK0luZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgc3VicHJvY2VzcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGVzZQorbW9kdWxlcyBhbmQgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCBiZWxvdy4KKworCisKK1VzaW5nIHRoZSBzdWJwcm9jZXNzIG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIG1vZHVsZSBkZWZpbmVzIG9uZSBjbGFzcyBjYWxsZWQgUG9wZW46CisKK2NsYXNzIFBvcGVuKGFyZ3MsIGJ1ZnNpemU9MCwgZXhlY3V0YWJsZT1Ob25lLAorICAgICAgICAgICAgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lLAorICAgICAgICAgICAgcHJlZXhlY19mbj1Ob25lLCBjbG9zZV9mZHM9RmFsc2UsIHNoZWxsPUZhbHNlLAorICAgICAgICAgICAgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UsCisgICAgICAgICAgICBzdGFydHVwaW5mbz1Ob25lLCBjcmVhdGlvbmZsYWdzPTApOgorCisKK0FyZ3VtZW50cyBhcmU6CisKK2FyZ3Mgc2hvdWxkIGJlIGEgc3RyaW5nLCBvciBhIHNlcXVlbmNlIG9mIHByb2dyYW0gYXJndW1lbnRzLiAgVGhlCitwcm9ncmFtIHRvIGV4ZWN1dGUgaXMgbm9ybWFsbHkgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFyZ3Mgc2VxdWVuY2Ugb3IKK3N0cmluZywgYnV0IGNhbiBiZSBleHBsaWNpdGx5IHNldCBieSB1c2luZyB0aGUgZXhlY3V0YWJsZSBhcmd1bWVudC4KKworT24gVU5JWCwgd2l0aCBzaGVsbD1GYWxzZSAoZGVmYXVsdCk6IEluIHRoaXMgY2FzZSwgdGhlIFBvcGVuIGNsYXNzCit1c2VzIG9zLmV4ZWN2cCgpIHRvIGV4ZWN1dGUgdGhlIGNoaWxkIHByb2dyYW0uICBhcmdzIHNob3VsZCBub3JtYWxseQorYmUgYSBzZXF1ZW5jZS4gIEEgc3RyaW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcXVlbmNlIHdpdGggdGhlIHN0cmluZworYXMgdGhlIG9ubHkgaXRlbSAodGhlIHByb2dyYW0gdG8gZXhlY3V0ZSkuCisKK09uIFVOSVgsIHdpdGggc2hlbGw9VHJ1ZTogSWYgYXJncyBpcyBhIHN0cmluZywgaXQgc3BlY2lmaWVzIHRoZQorY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZSB0aHJvdWdoIHRoZSBzaGVsbC4gIElmIGFyZ3MgaXMgYSBzZXF1ZW5jZSwKK3RoZSBmaXJzdCBpdGVtIHNwZWNpZmllcyB0aGUgY29tbWFuZCBzdHJpbmcsIGFuZCBhbnkgYWRkaXRpb25hbCBpdGVtcword2lsbCBiZSB0cmVhdGVkIGFzIGFkZGl0aW9uYWwgc2hlbGwgYXJndW1lbnRzLgorCitPbiBXaW5kb3dzOiB0aGUgUG9wZW4gY2xhc3MgdXNlcyBDcmVhdGVQcm9jZXNzKCkgdG8gZXhlY3V0ZSB0aGUgY2hpbGQKK3Byb2dyYW0sIHdoaWNoIG9wZXJhdGVzIG9uIHN0cmluZ3MuICBJZiBhcmdzIGlzIGEgc2VxdWVuY2UsIGl0IHdpbGwgYmUKK2NvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyB0aGUgbGlzdDJjbWRsaW5lIG1ldGhvZC4gIFBsZWFzZSBub3RlIHRoYXQKK25vdCBhbGwgTVMgV2luZG93cyBhcHBsaWNhdGlvbnMgaW50ZXJwcmV0IHRoZSBjb21tYW5kIGxpbmUgdGhlIHNhbWUKK3dheTogVGhlIGxpc3QyY21kbGluZSBpcyBkZXNpZ25lZCBmb3IgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBzYW1lCitydWxlcyBhcyB0aGUgTVMgQyBydW50aW1lLgorCitidWZzaXplLCBpZiBnaXZlbiwgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQKK3RvIHRoZSBidWlsdC1pbiBvcGVuKCkgZnVuY3Rpb246IDAgbWVhbnMgdW5idWZmZXJlZCwgMSBtZWFucyBsaW5lCitidWZmZXJlZCwgYW55IG90aGVyIHBvc2l0aXZlIHZhbHVlIG1lYW5zIHVzZSBhIGJ1ZmZlciBvZgorKGFwcHJveGltYXRlbHkpIHRoYXQgc2l6ZS4gIEEgbmVnYXRpdmUgYnVmc2l6ZSBtZWFucyB0byB1c2UgdGhlIHN5c3RlbQorZGVmYXVsdCwgd2hpY2ggdXN1YWxseSBtZWFucyBmdWxseSBidWZmZXJlZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorYnVmc2l6ZSBpcyAwICh1bmJ1ZmZlcmVkKS4KKworc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIHNwZWNpZnkgdGhlIGV4ZWN1dGVkIHByb2dyYW1zJyBzdGFuZGFyZAoraW5wdXQsIHN0YW5kYXJkIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3IgZmlsZSBoYW5kbGVzLCByZXNwZWN0aXZlbHkuCitWYWxpZCB2YWx1ZXMgYXJlIFBJUEUsIGFuIGV4aXN0aW5nIGZpbGUgZGVzY3JpcHRvciAoYSBwb3NpdGl2ZQoraW50ZWdlciksIGFuIGV4aXN0aW5nIGZpbGUgb2JqZWN0LCBhbmQgTm9uZS4gIFBJUEUgaW5kaWNhdGVzIHRoYXQgYQorbmV3IHBpcGUgdG8gdGhlIGNoaWxkIHNob3VsZCBiZSBjcmVhdGVkLiAgV2l0aCBOb25lLCBubyByZWRpcmVjdGlvbgord2lsbCBvY2N1cjsgdGhlIGNoaWxkJ3MgZmlsZSBoYW5kbGVzIHdpbGwgYmUgaW5oZXJpdGVkIGZyb20gdGhlCitwYXJlbnQuICBBZGRpdGlvbmFsbHksIHN0ZGVyciBjYW4gYmUgU1RET1VULCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUKK3N0ZGVyciBkYXRhIGZyb20gdGhlIGFwcGxpY2F0aW9ucyBzaG91bGQgYmUgY2FwdHVyZWQgaW50byB0aGUgc2FtZQorZmlsZSBoYW5kbGUgYXMgZm9yIHN0ZG91dC4KKworSWYgcHJlZXhlY19mbiBpcyBzZXQgdG8gYSBjYWxsYWJsZSBvYmplY3QsIHRoaXMgb2JqZWN0IHdpbGwgYmUgY2FsbGVkCitpbiB0aGUgY2hpbGQgcHJvY2VzcyBqdXN0IGJlZm9yZSB0aGUgY2hpbGQgaXMgZXhlY3V0ZWQuCisKK0lmIGNsb3NlX2ZkcyBpcyB0cnVlLCBhbGwgZmlsZSBkZXNjcmlwdG9ycyBleGNlcHQgMCwgMSBhbmQgMiB3aWxsIGJlCitjbG9zZWQgYmVmb3JlIHRoZSBjaGlsZCBwcm9jZXNzIGlzIGV4ZWN1dGVkLgorCitpZiBzaGVsbCBpcyB0cnVlLCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCB0aHJvdWdoIHRoZQorc2hlbGwuCisKK0lmIGN3ZCBpcyBub3QgTm9uZSwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgY2hhbmdlZCB0byBjd2QKK2JlZm9yZSB0aGUgY2hpbGQgaXMgZXhlY3V0ZWQuCisKK0lmIGVudiBpcyBub3QgTm9uZSwgaXQgZGVmaW5lcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgbmV3Citwcm9jZXNzLgorCitJZiB1bml2ZXJzYWxfbmV3bGluZXMgaXMgdHJ1ZSwgdGhlIGZpbGUgb2JqZWN0cyBzdGRvdXQgYW5kIHN0ZGVyciBhcmUKK29wZW5lZCBhcyBhIHRleHQgZmlsZXMsIGJ1dCBsaW5lcyBtYXkgYmUgdGVybWluYXRlZCBieSBhbnkgb2YgJ1xuJywKK3RoZSBVbml4IGVuZC1vZi1saW5lIGNvbnZlbnRpb24sICdccicsIHRoZSBNYWNpbnRvc2ggY29udmVudGlvbiBvcgorJ1xyXG4nLCB0aGUgV2luZG93cyBjb252ZW50aW9uLiAgQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucworYXJlIHNlZW4gYXMgJ1xuJyBieSB0aGUgUHl0aG9uIHByb2dyYW0uICBOb3RlOiBUaGlzIGZlYXR1cmUgaXMgb25seQorYXZhaWxhYmxlIGlmIFB5dGhvbiBpcyBidWlsdCB3aXRoIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgKHRoZQorZGVmYXVsdCkuICBBbHNvLCB0aGUgbmV3bGluZXMgYXR0cmlidXRlIG9mIHRoZSBmaWxlIG9iamVjdHMgc3Rkb3V0LAorc3RkaW4gYW5kIHN0ZGVyciBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGNvbW11bmljYXRlKCkgbWV0aG9kLgorCitUaGUgc3RhcnR1cGluZm8gYW5kIGNyZWF0aW9uZmxhZ3MsIGlmIGdpdmVuLCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKK3VuZGVybHlpbmcgQ3JlYXRlUHJvY2VzcygpIGZ1bmN0aW9uLiAgVGhleSBjYW4gc3BlY2lmeSB0aGluZ3Mgc3VjaCBhcworYXBwZWFyYW5jZSBvZiB0aGUgbWFpbiB3aW5kb3cgYW5kIHByaW9yaXR5IGZvciB0aGUgbmV3IHByb2Nlc3MuCisoV2luZG93cyBvbmx5KQorCisKK1RoaXMgbW9kdWxlIGFsc28gZGVmaW5lcyB0d28gc2hvcnRjdXQgZnVuY3Rpb25zOgorCitjYWxsKCphcmdzLCAqKmt3YXJncyk6CisgICAgUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLCB0aGVuCisgICAgcmV0dXJuIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KKworICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgorCisgICAgcmV0Y29kZSA9IGNhbGwoWyJscyIsICItbCJdKQorCisKK0V4Y2VwdGlvbnMKKy0tLS0tLS0tLS0KK0V4Y2VwdGlvbnMgcmFpc2VkIGluIHRoZSBjaGlsZCBwcm9jZXNzLCBiZWZvcmUgdGhlIG5ldyBwcm9ncmFtIGhhcworc3RhcnRlZCB0byBleGVjdXRlLCB3aWxsIGJlIHJlLXJhaXNlZCBpbiB0aGUgcGFyZW50LiAgQWRkaXRpb25hbGx5LAordGhlIGV4Y2VwdGlvbiBvYmplY3Qgd2lsbCBoYXZlIG9uZSBleHRyYSBhdHRyaWJ1dGUgY2FsbGVkCisnY2hpbGRfdHJhY2ViYWNrJywgd2hpY2ggaXMgYSBzdHJpbmcgY29udGFpbmluZyB0cmFjZWJhY2sgaW5mb3JtYXRpb24KK2Zyb20gdGhlIGNoaWxkcyBwb2ludCBvZiB2aWV3LgorCitUaGUgbW9zdCBjb21tb24gZXhjZXB0aW9uIHJhaXNlZCBpcyBPU0Vycm9yLiAgVGhpcyBvY2N1cnMsIGZvcgorZXhhbXBsZSwgd2hlbiB0cnlpbmcgdG8gZXhlY3V0ZSBhIG5vbi1leGlzdGVudCBmaWxlLiAgQXBwbGljYXRpb25zCitzaG91bGQgcHJlcGFyZSBmb3IgT1NFcnJvcnMuCisKK0EgVmFsdWVFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiBQb3BlbiBpcyBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cy4KKworCitTZWN1cml0eQorLS0tLS0tLS0KK1VubGlrZSBzb21lIG90aGVyIHBvcGVuIGZ1bmN0aW9ucywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIG5ldmVyIGNhbGwKKy9iaW4vc2ggaW1wbGljaXRseS4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgY2hhcmFjdGVycywgaW5jbHVkaW5nIHNoZWxsCittZXRhY2hhcmFjdGVycywgY2FuIHNhZmVseSBiZSBwYXNzZWQgdG8gY2hpbGQgcHJvY2Vzc2VzLgorCisKK1BvcGVuIG9iamVjdHMKKz09PT09PT09PT09PT0KK0luc3RhbmNlcyBvZiB0aGUgUG9wZW4gY2xhc3MgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK3BvbGwoKQorICAgIENoZWNrIGlmIGNoaWxkIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQuICBSZXR1cm5zIHJldHVybmNvZGUKKyAgICBhdHRyaWJ1dGUuCisKK3dhaXQoKQorICAgIFdhaXQgZm9yIGNoaWxkIHByb2Nlc3MgdG8gdGVybWluYXRlLiAgUmV0dXJucyByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KKworY29tbXVuaWNhdGUoaW5wdXQ9Tm9uZSkKKyAgICBJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tIHN0ZG91dAorICAgIGFuZCBzdGRlcnIsIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuICBXYWl0IGZvciBwcm9jZXNzIHRvCisgICAgdGVybWluYXRlLiAgVGhlIG9wdGlvbmFsIHN0ZGluIGFyZ3VtZW50IHNob3VsZCBiZSBhIHN0cmluZyB0byBiZQorICAgIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MsIG9yIE5vbmUsIGlmIG5vIGRhdGEgc2hvdWxkIGJlIHNlbnQgdG8KKyAgICB0aGUgY2hpbGQuCisKKyAgICBjb21tdW5pY2F0ZSgpIHJldHVybnMgYSB0dXBsZSAoc3Rkb3V0LCBzdGRlcnIpLgorCisgICAgTm90ZTogVGhlIGRhdGEgcmVhZCBpcyBidWZmZXJlZCBpbiBtZW1vcnksIHNvIGRvIG5vdCB1c2UgdGhpcworICAgIG1ldGhvZCBpZiB0aGUgZGF0YSBzaXplIGlzIGxhcmdlIG9yIHVubGltaXRlZC4KKworVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhbHNvIGF2YWlsYWJsZToKKworc3RkaW4KKyAgICBJZiB0aGUgc3RkaW4gYXJndW1lbnQgaXMgUElQRSwgdGhpcyBhdHRyaWJ1dGUgaXMgYSBmaWxlIG9iamVjdAorICAgIHRoYXQgcHJvdmlkZXMgaW5wdXQgdG8gdGhlIGNoaWxkIHByb2Nlc3MuICBPdGhlcndpc2UsIGl0IGlzIE5vbmUuCisKK3N0ZG91dAorICAgIElmIHRoZSBzdGRvdXQgYXJndW1lbnQgaXMgUElQRSwgdGhpcyBhdHRyaWJ1dGUgaXMgYSBmaWxlIG9iamVjdAorICAgIHRoYXQgcHJvdmlkZXMgb3V0cHV0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuICBPdGhlcndpc2UsIGl0IGlzCisgICAgTm9uZS4KKworc3RkZXJyCisgICAgSWYgdGhlIHN0ZGVyciBhcmd1bWVudCBpcyBQSVBFLCB0aGlzIGF0dHJpYnV0ZSBpcyBmaWxlIG9iamVjdCB0aGF0CisgICAgcHJvdmlkZXMgZXJyb3Igb3V0cHV0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuICBPdGhlcndpc2UsIGl0IGlzCisgICAgTm9uZS4KKworcGlkCisgICAgVGhlIHByb2Nlc3MgSUQgb2YgdGhlIGNoaWxkIHByb2Nlc3MuCisKK3JldHVybmNvZGUKKyAgICBUaGUgY2hpbGQgcmV0dXJuIGNvZGUuICBBIE5vbmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIHByb2Nlc3MKKyAgICBoYXNuJ3QgdGVybWluYXRlZCB5ZXQuICBBIG5lZ2F0aXZlIHZhbHVlIC1OIGluZGljYXRlcyB0aGF0IHRoZQorICAgIGNoaWxkIHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCBOIChVTklYIG9ubHkpLgorCisKK1JlcGxhY2luZyBvbGRlciBmdW5jdGlvbnMgd2l0aCB0aGUgc3VicHJvY2VzcyBtb2R1bGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0luIHRoaXMgc2VjdGlvbiwgImEgPT0+IGIiIG1lYW5zIHRoYXQgYiBjYW4gYmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50Citmb3IgYS4KKworTm90ZTogQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZmFpbCAobW9yZSBvciBsZXNzKSBzaWxlbnRseSBpZgordGhlIGV4ZWN1dGVkIHByb2dyYW0gY2Fubm90IGJlIGZvdW5kOyB0aGlzIG1vZHVsZSByYWlzZXMgYW4gT1NFcnJvcgorZXhjZXB0aW9uLgorCitJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB3ZSBhc3N1bWUgdGhhdCB0aGUgc3VicHJvY2VzcyBtb2R1bGUgaXMKK2ltcG9ydGVkIHdpdGggImZyb20gc3VicHJvY2VzcyBpbXBvcnQgKiIuCisKKworUmVwbGFjaW5nIC9iaW4vc2ggc2hlbGwgYmFja3F1b3RlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK291dHB1dD1gbXljbWQgbXlhcmdgCis9PT4KK291dHB1dCA9IFBvcGVuKFsibXljbWQiLCAibXlhcmciXSwgc3Rkb3V0PVBJUEUpLmNvbW11bmljYXRlKClbMF0KKworCitSZXBsYWNpbmcgc2hlbGwgcGlwZSBsaW5lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitvdXRwdXQ9YGRtZXNnIHwgZ3JlcCBoZGFgCis9PT4KK3AxID0gUG9wZW4oWyJkbWVzZyJdLCBzdGRvdXQ9UElQRSkKK3AyID0gUG9wZW4oWyJncmVwIiwgImhkYSJdLCBzdGRpbj1wMS5zdGRvdXQsIHN0ZG91dD1QSVBFKQorb3V0cHV0ID0gcDIuY29tbXVuaWNhdGUoKVswXQorCisKK1JlcGxhY2luZyBvcy5zeXN0ZW0oKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHMgPSBvcy5zeXN0ZW0oIm15Y21kIiArICIgbXlhcmciKQorPT0+CitwID0gUG9wZW4oIm15Y21kIiArICIgbXlhcmciLCBzaGVsbD1UcnVlKQorc3RzID0gb3Mud2FpdHBpZChwLnBpZCwgMCkKKworTm90ZToKKworKiBDYWxsaW5nIHRoZSBwcm9ncmFtIHRocm91Z2ggdGhlIHNoZWxsIGlzIHVzdWFsbHkgbm90IHJlcXVpcmVkLgorCisqIEl0J3MgZWFzaWVyIHRvIGxvb2sgYXQgdGhlIHJldHVybmNvZGUgYXR0cmlidXRlIHRoYW4gdGhlCisgIGV4aXRzdGF0dXMuCisKK0EgbW9yZSByZWFsLXdvcmxkIGV4YW1wbGUgd291bGQgbG9vayBsaWtlIHRoaXM6CisKK3RyeToKKyAgICByZXRjb2RlID0gY2FsbCgibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCisgICAgaWYgcmV0Y29kZSA8IDA6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkNoaWxkIHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCIsIC1yZXRjb2RlCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiQ2hpbGQgcmV0dXJuZWQiLCByZXRjb2RlCitleGNlcHQgT1NFcnJvciwgZToKKyAgICBwcmludCA+PnN5cy5zdGRlcnIsICJFeGVjdXRpb24gZmFpbGVkOiIsIGUKKworCitSZXBsYWNpbmcgb3Muc3Bhd24qCistLS0tLS0tLS0tLS0tLS0tLS0tCitQX05PV0FJVCBleGFtcGxlOgorCitwaWQgPSBvcy5zcGF3bmxwKG9zLlBfTk9XQUlULCAiL2Jpbi9teWNtZCIsICJteWNtZCIsICJteWFyZyIpCis9PT4KK3BpZCA9IFBvcGVuKFsiL2Jpbi9teWNtZCIsICJteWFyZyJdKS5waWQKKworCitQX1dBSVQgZXhhbXBsZToKKworcmV0Y29kZSA9IG9zLnNwYXdubHAob3MuUF9XQUlULCAiL2Jpbi9teWNtZCIsICJteWNtZCIsICJteWFyZyIpCis9PT4KK3JldGNvZGUgPSBjYWxsKFsiL2Jpbi9teWNtZCIsICJteWFyZyJdKQorCisKK1ZlY3RvciBleGFtcGxlOgorCitvcy5zcGF3bnZwKG9zLlBfTk9XQUlULCBwYXRoLCBhcmdzKQorPT0+CitQb3BlbihbcGF0aF0gKyBhcmdzWzE6XSkKKworCitFbnZpcm9ubWVudCBleGFtcGxlOgorCitvcy5zcGF3bmxwZShvcy5QX05PV0FJVCwgIi9iaW4vbXljbWQiLCAibXljbWQiLCAibXlhcmciLCBlbnYpCis9PT4KK1BvcGVuKFsiL2Jpbi9teWNtZCIsICJteWFyZyJdLCBlbnY9eyJQQVRIIjogIi91c3IvYmluIn0pCisKKworUmVwbGFjaW5nIG9zLnBvcGVuKgorLS0tLS0tLS0tLS0tLS0tLS0tLQorcGlwZSA9IG9zLnBvcGVuKGNtZCwgbW9kZT0ncicsIGJ1ZnNpemUpCis9PT4KK3BpcGUgPSBQb3BlbihjbWQsIHNoZWxsPVRydWUsIGJ1ZnNpemU9YnVmc2l6ZSwgc3Rkb3V0PVBJUEUpLnN0ZG91dAorCitwaXBlID0gb3MucG9wZW4oY21kLCBtb2RlPSd3JywgYnVmc2l6ZSkKKz09PgorcGlwZSA9IFBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLCBzdGRpbj1QSVBFKS5zdGRpbgorCisKKyhjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0KSA9IG9zLnBvcGVuMihjbWQsIG1vZGUsIGJ1ZnNpemUpCis9PT4KK3AgPSBQb3BlbihjbWQsIHNoZWxsPVRydWUsIGJ1ZnNpemU9YnVmc2l6ZSwKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dCkgPSAocC5zdGRpbiwgcC5zdGRvdXQpCisKKworKGNoaWxkX3N0ZGluLAorIGNoaWxkX3N0ZG91dCwKKyBjaGlsZF9zdGRlcnIpID0gb3MucG9wZW4zKGNtZCwgbW9kZSwgYnVmc2l6ZSkKKz09PgorcCA9IFBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLAorICAgICAgICAgIHN0ZGluPVBJUEUsIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3RkaW4sCisgY2hpbGRfc3Rkb3V0LAorIGNoaWxkX3N0ZGVycikgPSAocC5zdGRpbiwgcC5zdGRvdXQsIHAuc3RkZXJyKQorCisKKyhjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0X2FuZF9zdGRlcnIpID0gb3MucG9wZW40KGNtZCwgbW9kZSwgYnVmc2l6ZSkKKz09PgorcCA9IFBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLAorICAgICAgICAgIHN0ZGluPVBJUEUsIHN0ZG91dD1QSVBFLCBzdGRlcnI9U1RET1VULCBjbG9zZV9mZHM9VHJ1ZSkKKyhjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0X2FuZF9zdGRlcnIpID0gKHAuc3RkaW4sIHAuc3Rkb3V0KQorCisKK1JlcGxhY2luZyBwb3BlbjIuKgorLS0tLS0tLS0tLS0tLS0tLS0tCitOb3RlOiBJZiB0aGUgY21kIGFyZ3VtZW50IHRvIHBvcGVuMiBmdW5jdGlvbnMgaXMgYSBzdHJpbmcsIHRoZSBjb21tYW5kCitpcyBleGVjdXRlZCB0aHJvdWdoIC9iaW4vc2guICBJZiBpdCBpcyBhIGxpc3QsIHRoZSBjb21tYW5kIGlzIGRpcmVjdGx5CitleGVjdXRlZC4KKworKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gcG9wZW4yLnBvcGVuMigic29tZXN0cmluZyIsIGJ1ZnNpemUsIG1vZGUpCis9PT4KK3AgPSBQb3BlbihbInNvbWVzdHJpbmciXSwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gKHAuc3Rkb3V0LCBwLnN0ZGluKQorCisKKyhjaGlsZF9zdGRvdXQsIGNoaWxkX3N0ZGluKSA9IHBvcGVuMi5wb3BlbjIoWyJteWNtZCIsICJteWFyZyJdLCBidWZzaXplLCBtb2RlKQorPT0+CitwID0gUG9wZW4oWyJteWNtZCIsICJteWFyZyJdLCBidWZzaXplPWJ1ZnNpemUsCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gKHAuc3Rkb3V0LCBwLnN0ZGluKQorCitUaGUgcG9wZW4yLlBvcGVuMyBhbmQgcG9wZW4zLlBvcGVuNCBiYXNpY2FsbHkgd29ya3MgYXMgc3VicHJvY2Vzcy5Qb3BlbiwKK2V4Y2VwdCB0aGF0OgorCisqIHN1YnByb2Nlc3MuUG9wZW4gcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzCisqIHRoZSBjYXB0dXJlc3RkZXJyIGFyZ3VtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0ZGVyciBhcmd1bWVudC4KKyogc3RkaW49UElQRSBhbmQgc3Rkb3V0PVBJUEUgbXVzdCBiZSBzcGVjaWZpZWQuCisqIHBvcGVuMiBjbG9zZXMgYWxsIGZpbGVkZXNjcmlwdG9ycyBieSBkZWZhdWx0LCBidXQgeW91IGhhdmUgdG8gc3BlY2lmeQorICBjbG9zZV9mZHM9VHJ1ZSB3aXRoIHN1YnByb2Nlc3MuUG9wZW4uCisKKworIiIiCisKK2ltcG9ydCBzeXMKK21zd2luZG93cyA9IChzeXMucGxhdGZvcm0gPT0gIndpbjMyIikKKworaW1wb3J0IG9zCitpbXBvcnQgdHlwZXMKK2ltcG9ydCB0cmFjZWJhY2sKKworaWYgbXN3aW5kb3dzOgorICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICBpbXBvcnQgbXN2Y3J0CisgICAgaWYgMDogIyA8LS0gY2hhbmdlIHRoaXMgdG8gdXNlIHB5d2luMzIgaW5zdGVhZCBvZiB0aGUgX3N1YnByb2Nlc3MgZHJpdmVyCisgICAgICAgIGltcG9ydCBweXdpbnR5cGVzCisgICAgICAgIGZyb20gd2luMzJhcGkgaW1wb3J0IEdldFN0ZEhhbmRsZSwgU1REX0lOUFVUX0hBTkRMRSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERfT1VUUFVUX0hBTkRMRSwgU1REX0VSUk9SX0hBTkRMRQorICAgICAgICBmcm9tIHdpbjMyYXBpIGltcG9ydCBHZXRDdXJyZW50UHJvY2VzcywgRHVwbGljYXRlSGFuZGxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lLCBHZXRWZXJzaW9uCisgICAgICAgIGZyb20gd2luMzJjb24gaW1wb3J0IERVUExJQ0FURV9TQU1FX0FDQ0VTUywgU1dfSElERQorICAgICAgICBmcm9tIHdpbjMycGlwZSBpbXBvcnQgQ3JlYXRlUGlwZQorICAgICAgICBmcm9tIHdpbjMycHJvY2VzcyBpbXBvcnQgQ3JlYXRlUHJvY2VzcywgU1RBUlRVUElORk8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEV4aXRDb2RlUHJvY2VzcywgU1RBUlRGX1VTRVNUREhBTkRMRVMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVJURl9VU0VTSE9XV0lORE9XLCBDUkVBVEVfTkVXX0NPTlNPTEUKKyAgICAgICAgZnJvbSB3aW4zMmV2ZW50IGltcG9ydCBXYWl0Rm9yU2luZ2xlT2JqZWN0LCBJTkZJTklURSwgV0FJVF9PQkpFQ1RfMAorICAgIGVsc2U6CisgICAgICAgIGZyb20gX3N1YnByb2Nlc3MgaW1wb3J0ICoKKyAgICAgICAgY2xhc3MgU1RBUlRVUElORk86CisgICAgICAgICAgICBkd0ZsYWdzID0gMAorICAgICAgICAgICAgaFN0ZElucHV0ID0gTm9uZQorICAgICAgICAgICAgaFN0ZE91dHB1dCA9IE5vbmUKKyAgICAgICAgICAgIGhTdGRFcnJvciA9IE5vbmUKKyAgICAgICAgY2xhc3MgcHl3aW50eXBlczoKKyAgICAgICAgICAgIGVycm9yID0gSU9FcnJvcgorZWxzZToKKyAgICBpbXBvcnQgc2VsZWN0CisgICAgaW1wb3J0IGVycm5vCisgICAgaW1wb3J0IGZjbnRsCisgICAgaW1wb3J0IHBpY2tsZQorCitfX2FsbF9fID0gWyJQb3BlbiIsICJQSVBFIiwgIlNURE9VVCIsICJjYWxsIl0KKwordHJ5OgorICAgIE1BWEZEID0gb3Muc3lzY29uZigiU0NfT1BFTl9NQVgiKQorZXhjZXB0OgorICAgIE1BWEZEID0gMjU2CisKKyMgVHJ1ZS9GYWxzZSBkb2VzIG5vdCBleGlzdCBvbiAyLjIuMAordHJ5OgorICAgIEZhbHNlCitleGNlcHQgTmFtZUVycm9yOgorICAgIEZhbHNlID0gMAorICAgIFRydWUgPSAxCisKK19hY3RpdmUgPSBbXQorCitkZWYgX2NsZWFudXAoKToKKyAgICBmb3IgaW5zdCBpbiBfYWN0aXZlWzpdOgorICAgICAgICBpbnN0LnBvbGwoKQorCitQSVBFID0gLTEKK1NURE9VVCA9IC0yCisKKworZGVmIGNhbGwoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUsIHRoZW4KKyAgICByZXR1cm4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlLgorCisgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CisKKyAgICByZXRjb2RlID0gY2FsbChbImxzIiwgIi1sIl0pCisgICAgIiIiCisgICAgcmV0dXJuIFBvcGVuKCphcmdzLCAqKmt3YXJncykud2FpdCgpCisKKworZGVmIGxpc3QyY21kbGluZShzZXEpOgorICAgICIiIgorICAgIFRyYW5zbGF0ZSBhIHNlcXVlbmNlIG9mIGFyZ3VtZW50cyBpbnRvIGEgY29tbWFuZCBsaW5lCisgICAgc3RyaW5nLCB1c2luZyB0aGUgc2FtZSBydWxlcyBhcyB0aGUgTVMgQyBydW50aW1lOgorCisgICAgMSkgQXJndW1lbnRzIGFyZSBkZWxpbWl0ZWQgYnkgd2hpdGUgc3BhY2UsIHdoaWNoIGlzIGVpdGhlciBhCisgICAgICAgc3BhY2Ugb3IgYSB0YWIuCisKKyAgICAyKSBBIHN0cmluZyBzdXJyb3VuZGVkIGJ5IGRvdWJsZSBxdW90YXRpb24gbWFya3MgaXMKKyAgICAgICBpbnRlcnByZXRlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCwgcmVnYXJkbGVzcyBvZiB3aGl0ZSBzcGFjZQorICAgICAgIGNvbnRhaW5lZCB3aXRoaW4uICBBIHF1b3RlZCBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkIGluIGFuCisgICAgICAgYXJndW1lbnQuCisKKyAgICAzKSBBIGRvdWJsZSBxdW90YXRpb24gbWFyayBwcmVjZWRlZCBieSBhIGJhY2tzbGFzaCBpcworICAgICAgIGludGVycHJldGVkIGFzIGEgbGl0ZXJhbCBkb3VibGUgcXVvdGF0aW9uIG1hcmsuCisKKyAgICA0KSBCYWNrc2xhc2hlcyBhcmUgaW50ZXJwcmV0ZWQgbGl0ZXJhbGx5LCB1bmxlc3MgdGhleQorICAgICAgIGltbWVkaWF0ZWx5IHByZWNlZGUgYSBkb3VibGUgcXVvdGF0aW9uIG1hcmsuCisKKyAgICA1KSBJZiBiYWNrc2xhc2hlcyBpbW1lZGlhdGVseSBwcmVjZWRlIGEgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAorICAgICAgIGV2ZXJ5IHBhaXIgb2YgYmFja3NsYXNoZXMgaXMgaW50ZXJwcmV0ZWQgYXMgYSBsaXRlcmFsCisgICAgICAgYmFja3NsYXNoLiAgSWYgdGhlIG51bWJlciBvZiBiYWNrc2xhc2hlcyBpcyBvZGQsIHRoZSBsYXN0CisgICAgICAgYmFja3NsYXNoIGVzY2FwZXMgdGhlIG5leHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIGFzCisgICAgICAgZGVzY3JpYmVkIGluIHJ1bGUgMy4KKyAgICAiIiIKKworICAgICMgU2VlCisgICAgIyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvdmNjZWxuZy9odG0vcHJvZ3NfMTIuYXNwCisgICAgcmVzdWx0ID0gW10KKyAgICBuZWVkcXVvdGUgPSBGYWxzZQorICAgIGZvciBhcmcgaW4gc2VxOgorICAgICAgICBic19idWYgPSBbXQorCisgICAgICAgICMgQWRkIGEgc3BhY2UgdG8gc2VwYXJhdGUgdGhpcyBhcmd1bWVudCBmcm9tIHRoZSBvdGhlcnMKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpCisKKyAgICAgICAgbmVlZHF1b3RlID0gKCIgIiBpbiBhcmcpIG9yICgiXHQiIGluIGFyZykKKyAgICAgICAgaWYgbmVlZHF1b3RlOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIicpCisKKyAgICAgICAgZm9yIGMgaW4gYXJnOgorICAgICAgICAgICAgaWYgYyA9PSAnXFwnOgorICAgICAgICAgICAgICAgICMgRG9uJ3Qga25vdyBpZiB3ZSBuZWVkIHRvIGRvdWJsZSB5ZXQuCisgICAgICAgICAgICAgICAgYnNfYnVmLmFwcGVuZChjKQorICAgICAgICAgICAgZWxpZiBjID09ICciJzoKKyAgICAgICAgICAgICAgICAjIERvdWJsZSBiYWNrc3BhY2VzLgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xcJyAqIGxlbihic19idWYpKjIpCisgICAgICAgICAgICAgICAgYnNfYnVmID0gW10KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcXCInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE5vcm1hbCBjaGFyCisgICAgICAgICAgICAgICAgaWYgYnNfYnVmOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKyAgICAgICAgICAgICAgICAgICAgYnNfYnVmID0gW10KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpCisKKyAgICAgICAgIyBBZGQgcmVtYWluaW5nIGJhY2tzcGFjZXMsIGlmIGFueS4KKyAgICAgICAgaWYgYnNfYnVmOgorICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChic19idWYpCisKKyAgICAgICAgaWYgbmVlZHF1b3RlOgorICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChic19idWYpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCciJykKKworICAgIHJldHVybiAnJy5qb2luKHJlc3VsdCkKKworCitjbGFzcyBQb3BlbihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdzLCBidWZzaXplPTAsIGV4ZWN1dGFibGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lLAorICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPU5vbmUsIGNsb3NlX2Zkcz1GYWxzZSwgc2hlbGw9RmFsc2UsCisgICAgICAgICAgICAgICAgIGN3ZD1Ob25lLCBlbnY9Tm9uZSwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlLAorICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbz1Ob25lLCBjcmVhdGlvbmZsYWdzPTApOgorICAgICAgICAiIiJDcmVhdGUgbmV3IFBvcGVuIGluc3RhbmNlLiIiIgorICAgICAgICBfY2xlYW51cCgpCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmc2l6ZSwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJidWZzaXplIG11c3QgYmUgYW4gaW50ZWdlciIpCisKKyAgICAgICAgaWYgbXN3aW5kb3dzOgorICAgICAgICAgICAgaWYgcHJlZXhlY19mbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwcmVleGVjX2ZuIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1zIikKKyAgICAgICAgICAgIGlmIGNsb3NlX2ZkczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjbG9zZV9mZHMgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybXMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQT1NJWAorICAgICAgICAgICAgaWYgc3RhcnR1cGluZm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RhcnR1cGluZm8gaXMgb25seSBzdXBwb3J0ZWQgb24gV2luZG93cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1zIikKKyAgICAgICAgICAgIGlmIGNyZWF0aW9uZmxhZ3MgIT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjcmVhdGlvbmZsYWdzIGlzIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtcyIpCisKKyAgICAgICAgc2VsZi5zdGRpbiA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGRvdXQgPSBOb25lCisgICAgICAgIHNlbGYuc3RkZXJyID0gTm9uZQorICAgICAgICBzZWxmLnBpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gTm9uZQorICAgICAgICBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyA9IHVuaXZlcnNhbF9uZXdsaW5lcworCisgICAgICAgICMgSW5wdXQgYW5kIG91dHB1dCBvYmplY3RzLiBUaGUgZ2VuZXJhbCBwcmluY2lwbGUgaXMgbGlrZQorICAgICAgICAjIHRoaXM6CisgICAgICAgICMKKyAgICAgICAgIyBQYXJlbnQgICAgICAgICAgICAgICAgICAgQ2hpbGQKKyAgICAgICAgIyAtLS0tLS0gICAgICAgICAgICAgICAgICAgLS0tLS0KKyAgICAgICAgIyBwMmN3cml0ZSAgIC0tLXN0ZGluLS0tPiAgcDJjcmVhZAorICAgICAgICAjIGMycHJlYWQgICAgPC0tc3Rkb3V0LS0tICBjMnB3cml0ZQorICAgICAgICAjIGVycnJlYWQgICAgPC0tc3RkZXJyLS0tICBlcnJ3cml0ZQorICAgICAgICAjCisgICAgICAgICMgT24gUE9TSVgsIHRoZSBjaGlsZCBvYmplY3RzIGFyZSBmaWxlIGRlc2NyaXB0b3JzLiAgT24KKyAgICAgICAgIyBXaW5kb3dzLCB0aGVzZSBhcmUgV2luZG93cyBmaWxlIGhhbmRsZXMuICBUaGUgcGFyZW50IG9iamVjdHMKKyAgICAgICAgIyBhcmUgZmlsZSBkZXNjcmlwdG9ycyBvbiBib3RoIHBsYXRmb3Jtcy4gIFRoZSBwYXJlbnQgb2JqZWN0cworICAgICAgICAjIGFyZSBOb25lIHdoZW4gbm90IHVzaW5nIFBJUEVzLiBUaGUgY2hpbGQgb2JqZWN0cyBhcmUgTm9uZQorICAgICAgICAjIHdoZW4gbm90IHJlZGlyZWN0aW5nLgorCisgICAgICAgIChwMmNyZWFkLCBwMmN3cml0ZSwKKyAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpID0gc2VsZi5fZ2V0X2hhbmRsZXMoc3RkaW4sIHN0ZG91dCwgc3RkZXJyKQorCisgICAgICAgIHNlbGYuX2V4ZWN1dGVfY2hpbGQoYXJncywgZXhlY3V0YWJsZSwgcHJlZXhlY19mbiwgY2xvc2VfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCwgZW52LCB1bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKQorCisgICAgICAgIGlmIHAyY3dyaXRlOgorICAgICAgICAgICAgc2VsZi5zdGRpbiA9IG9zLmZkb3BlbihwMmN3cml0ZSwgJ3diJywgYnVmc2l6ZSkKKyAgICAgICAgaWYgYzJwcmVhZDoKKyAgICAgICAgICAgIGlmIHVuaXZlcnNhbF9uZXdsaW5lczoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dCA9IG9zLmZkb3BlbihjMnByZWFkLCAnclUnLCBidWZzaXplKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dCA9IG9zLmZkb3BlbihjMnByZWFkLCAncmInLCBidWZzaXplKQorICAgICAgICBpZiBlcnJyZWFkOgorICAgICAgICAgICAgaWYgdW5pdmVyc2FsX25ld2xpbmVzOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyID0gb3MuZmRvcGVuKGVycnJlYWQsICdyVScsIGJ1ZnNpemUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyID0gb3MuZmRvcGVuKGVycnJlYWQsICdyYicsIGJ1ZnNpemUpCisKKyAgICAgICAgX2FjdGl2ZS5hcHBlbmQoc2VsZikKKworCisgICAgZGVmIF90cmFuc2xhdGVfbmV3bGluZXMoc2VsZiwgZGF0YSk6CisgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcciIsICJcbiIpCisgICAgICAgIHJldHVybiBkYXRhCisKKworICAgIGlmIG1zd2luZG93czoKKyAgICAgICAgIworICAgICAgICAjIFdpbmRvd3MgbWV0aG9kcworICAgICAgICAjCisgICAgICAgIGRlZiBfZ2V0X2hhbmRsZXMoc2VsZiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyKToKKyAgICAgICAgICAgICIiIkNvbnN0cnVjdCBhbmQgcmV0dXJuIHR1cGVsIHdpdGggSU8gb2JqZWN0czoKKyAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLCBjMnByZWFkLCBjMnB3cml0ZSwgZXJycmVhZCwgZXJyd3JpdGUKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgc3RkaW4gPT0gTm9uZSBhbmQgc3Rkb3V0ID09IE5vbmUgYW5kIHN0ZGVyciA9PSBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkKKworICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBOb25lLCBOb25lCisgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IE5vbmUsIE5vbmUKKyAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlID0gTm9uZSwgTm9uZQorCisgICAgICAgICAgICBpZiBzdGRpbiA9PSBOb25lOgorICAgICAgICAgICAgICAgIHAyY3JlYWQgPSBHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSkKKyAgICAgICAgICAgIGVsaWYgc3RkaW4gPT0gUElQRToKKyAgICAgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IENyZWF0ZVBpcGUoTm9uZSwgMCkKKyAgICAgICAgICAgICAgICAjIERldGFjaCBhbmQgdHVybiBpbnRvIGZkCisgICAgICAgICAgICAgICAgcDJjd3JpdGUgPSBwMmN3cml0ZS5EZXRhY2goKQorICAgICAgICAgICAgICAgIHAyY3dyaXRlID0gbXN2Y3J0Lm9wZW5fb3NmaGFuZGxlKHAyY3dyaXRlLCAwKQorICAgICAgICAgICAgZWxpZiB0eXBlKHN0ZGluKSA9PSB0eXBlcy5JbnRUeXBlOgorICAgICAgICAgICAgICAgIHAyY3JlYWQgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRpbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZGluLmZpbGVubygpKQorICAgICAgICAgICAgcDJjcmVhZCA9IHNlbGYuX21ha2VfaW5oZXJpdGFibGUocDJjcmVhZCkKKworICAgICAgICAgICAgaWYgc3Rkb3V0ID09IE5vbmU6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpCisgICAgICAgICAgICBlbGlmIHN0ZG91dCA9PSBQSVBFOgorICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gQ3JlYXRlUGlwZShOb25lLCAwKQorICAgICAgICAgICAgICAgICMgRGV0YWNoIGFuZCB0dXJuIGludG8gZmQKKyAgICAgICAgICAgICAgICBjMnByZWFkID0gYzJwcmVhZC5EZXRhY2goKQorICAgICAgICAgICAgICAgIGMycHJlYWQgPSBtc3ZjcnQub3Blbl9vc2ZoYW5kbGUoYzJwcmVhZCwgMCkKKyAgICAgICAgICAgIGVsaWYgdHlwZShzdGRvdXQpID09IHR5cGVzLkludFR5cGU6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRvdXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQXNzdW1pbmcgZmlsZS1saWtlIG9iamVjdAorICAgICAgICAgICAgICAgIGMycHdyaXRlID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc3Rkb3V0LmZpbGVubygpKQorICAgICAgICAgICAgYzJwd3JpdGUgPSBzZWxmLl9tYWtlX2luaGVyaXRhYmxlKGMycHdyaXRlKQorCisgICAgICAgICAgICBpZiBzdGRlcnIgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZSA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKQorICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gUElQRToKKyAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IENyZWF0ZVBpcGUoTm9uZSwgMCkKKyAgICAgICAgICAgICAgICAjIERldGFjaCBhbmQgdHVybiBpbnRvIGZkCisgICAgICAgICAgICAgICAgZXJycmVhZCA9IGVycnJlYWQuRGV0YWNoKCkKKyAgICAgICAgICAgICAgICBlcnJyZWFkID0gbXN2Y3J0Lm9wZW5fb3NmaGFuZGxlKGVycnJlYWQsIDApCisgICAgICAgICAgICBlbGlmIHN0ZGVyciA9PSBTVERPVVQ6CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBjMnB3cml0ZQorICAgICAgICAgICAgZWxpZiB0eXBlKHN0ZGVycikgPT0gdHlwZXMuSW50VHlwZToKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZSA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZGVycikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRlcnIuZmlsZW5vKCkpCisgICAgICAgICAgICBlcnJ3cml0ZSA9IHNlbGYuX21ha2VfaW5oZXJpdGFibGUoZXJyd3JpdGUpCisKKyAgICAgICAgICAgIHJldHVybiAocDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkKKworCisgICAgICAgIGRlZiBfbWFrZV9pbmhlcml0YWJsZShzZWxmLCBoYW5kbGUpOgorICAgICAgICAgICAgIiIiUmV0dXJuIGEgZHVwbGljYXRlIG9mIGhhbmRsZSwgd2hpY2ggaXMgaW5oZXJpdGFibGUiIiIKKyAgICAgICAgICAgIHJldHVybiBEdXBsaWNhdGVIYW5kbGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcygpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpCisKKworICAgICAgICBkZWYgX2ZpbmRfdzl4cG9wZW4oc2VsZik6CisgICAgICAgICAgICAiIiJGaW5kIGFuZCByZXR1cm4gYWJzb2x1dCBwYXRoIHRvIHc5eHBvcGVuLmV4ZSIiIgorICAgICAgICAgICAgdzl4cG9wZW4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKEdldE1vZHVsZUZpbGVOYW1lKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3OXhwb3Blbi5leGUiKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHc5eHBvcGVuKToKKyAgICAgICAgICAgICAgICAjIEVlZWsgLSBmaWxlLW5vdC1mb3VuZCAtIHBvc3NpYmx5IGFuIGVtYmVkZGluZworICAgICAgICAgICAgICAgICMgc2l0dWF0aW9uIC0gc2VlIGlmIHdlIGNhbiBsb2NhdGUgaXQgaW4gc3lzLmV4ZWNfcHJlZml4CisgICAgICAgICAgICAgICAgdzl4cG9wZW4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5leGVjX3ByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInc5eHBvcGVuLmV4ZSIpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHc5eHBvcGVuKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgbG9jYXRlIHc5eHBvcGVuLmV4ZSwgd2hpY2ggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRlZCBmb3IgUG9wZW4gdG8gd29yayB3aXRoIHlvdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoZWxsIG9yIHBsYXRmb3JtLiIpCisgICAgICAgICAgICByZXR1cm4gdzl4cG9wZW4KKworCisgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgcHJvZ3JhbSAoTVMgV2luZG93cyB2ZXJzaW9uKSIiIgorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhcmdzLCB0eXBlcy5TdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgYXJncyA9IGxpc3QyY21kbGluZShhcmdzKQorCisgICAgICAgICAgICAjIFByb2Nlc3Mgc3RhcnR1cCBkZXRhaWxzCisgICAgICAgICAgICBkZWZhdWx0X3N0YXJ0dXBpbmZvID0gU1RBUlRVUElORk8oKQorICAgICAgICAgICAgaWYgc3RhcnR1cGluZm8gPT0gTm9uZToKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mbyA9IGRlZmF1bHRfc3RhcnR1cGluZm8KKyAgICAgICAgICAgIGlmIG5vdCBOb25lIGluIChwMmNyZWFkLCBjMnB3cml0ZSwgZXJyd3JpdGUpOgorICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLmR3RmxhZ3MgfD0gU1RBUlRGX1VTRVNUREhBTkRMRVMKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mby5oU3RkSW5wdXQgPSBwMmNyZWFkCisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uaFN0ZE91dHB1dCA9IGMycHdyaXRlCisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uaFN0ZEVycm9yID0gZXJyd3JpdGUKKworICAgICAgICAgICAgaWYgc2hlbGw6CisgICAgICAgICAgICAgICAgZGVmYXVsdF9zdGFydHVwaW5mby5kd0ZsYWdzIHw9IFNUQVJURl9VU0VTSE9XV0lORE9XCisgICAgICAgICAgICAgICAgZGVmYXVsdF9zdGFydHVwaW5mby53U2hvd1dpbmRvdyA9IFNXX0hJREUKKyAgICAgICAgICAgICAgICBjb21zcGVjID0gb3MuZW52aXJvbi5nZXQoIkNPTVNQRUMiLCAiY21kLmV4ZSIpCisgICAgICAgICAgICAgICAgYXJncyA9IGNvbXNwZWMgKyAiIC9jICIgKyBhcmdzCisgICAgICAgICAgICAgICAgaWYgKEdldFZlcnNpb24oKSA+PSAweDgwMDAwMDAwTCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShjb21zcGVjKS5sb3dlcigpID09ICJjb21tYW5kLmNvbSIpOgorICAgICAgICAgICAgICAgICAgICAjIFdpbjl4LCBvciB1c2luZyBjb21tYW5kLmNvbSBvbiBOVC4gV2UgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAjIHVzZSB0aGUgdzl4cG9wZW4gaW50ZXJtZWRpYXRlIHByb2dyYW0uIEZvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICMgaW5mb3JtYXRpb24sIHNlZSBLQiBRMTUwOTU2CisgICAgICAgICAgICAgICAgICAgICMgKGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDExMTA1MDg0MDAyL2h0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vc3VwcG9ydC9rYi9hcnRpY2xlcy9RMTUwLzkvNTYuYXNwKQorICAgICAgICAgICAgICAgICAgICB3OXhwb3BlbiA9IHNlbGYuX2ZpbmRfdzl4cG9wZW4oKQorICAgICAgICAgICAgICAgICAgICBhcmdzID0gJyIlcyIgJXMnICUgKHc5eHBvcGVuLCBhcmdzKQorICAgICAgICAgICAgICAgICAgICAjIE5vdCBwYXNzaW5nIENSRUFURV9ORVdfQ09OU09MRSBoYXMgYmVlbiBrbm93biB0bworICAgICAgICAgICAgICAgICAgICAjIGNhdXNlIHJhbmRvbSBmYWlsdXJlcyBvbiB3aW45eC4gIFNwZWNpZmljYWxseSBhCisgICAgICAgICAgICAgICAgICAgICMgZGlhbG9nOiAiWW91ciBwcm9ncmFtIGFjY2Vzc2VkIG1lbSBjdXJyZW50bHkgaW4KKyAgICAgICAgICAgICAgICAgICAgIyB1c2UgYXQgeHh4IiBhbmQgYSBob3BlZnVsIHdhcm5pbmcgYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICMgc3RhYmlsaXR5IG9mIHlvdXIgc3lzdGVtLiAgQ29zdCBpcyBDdHJsK0Mgd29udAorICAgICAgICAgICAgICAgICAgICAjIGtpbGwgY2hpbGRyZW4uCisgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uZmxhZ3MgfD0gQ1JFQVRFX05FV19DT05TT0xFCisKKyAgICAgICAgICAgICMgU3RhcnQgdGhlIHByb2Nlc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBocCwgaHQsIHBpZCwgdGlkID0gQ3JlYXRlUHJvY2VzcyhleGVjdXRhYmxlLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHNwZWNpYWwgc2VjdXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGluaGVyaXQgaGFuZGxlcyB0byBwYXNzIHN0ZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhhbmRsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvKQorICAgICAgICAgICAgZXhjZXB0IHB5d2ludHlwZXMuZXJyb3IsIGU6CisgICAgICAgICAgICAgICAgIyBUcmFuc2xhdGUgcHl3aW50eXBlcy5lcnJvciB0byBXaW5kb3dzRXJyb3IsIHdoaWNoIGlzCisgICAgICAgICAgICAgICAgIyBhIHN1YmNsYXNzIG9mIE9TRXJyb3IuICBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseQorICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIGVycm5vIHVzaW5nIF9zeXNfZXJybGlzdCAob3Igc2ltbGlhciksIGJ1dAorICAgICAgICAgICAgICAgICMgaG93IGNhbiB0aGlzIGJlIGRvbmUgZnJvbSBQeXRob24/CisgICAgICAgICAgICAgICAgcmFpc2UgV2luZG93c0Vycm9yKCplLmFyZ3MpCisKKyAgICAgICAgICAgICMgUmV0YWluIHRoZSBwcm9jZXNzIGhhbmRsZSwgYnV0IGNsb3NlIHRoZSB0aHJlYWQgaGFuZGxlCisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBocAorICAgICAgICAgICAgc2VsZi5waWQgPSBwaWQKKyAgICAgICAgICAgIGh0LkNsb3NlKCkKKworICAgICAgICAgICAgIyBDaGlsZCBpcyBsYXVuY2hlZC4gQ2xvc2UgdGhlIHBhcmVudCdzIGNvcHkgb2YgdGhvc2UgcGlwZQorICAgICAgICAgICAgIyBoYW5kbGVzIHRoYXQgb25seSB0aGUgY2hpbGQgc2hvdWxkIGhhdmUgb3Blbi4gIFlvdSBuZWVkCisgICAgICAgICAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIGhhbmRsZXMgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICMgb3V0cHV0IHBpcGUgYXJlIG1haW50YWluZWQgaW4gdGhpcyBwcm9jZXNzIG9yIGVsc2UgdGhlCisgICAgICAgICAgICAjIHBpcGUgd2lsbCBub3QgY2xvc2Ugd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBleGl0cyBhbmQgdGhlCisgICAgICAgICAgICAjIFJlYWRGaWxlIHdpbGwgaGFuZy4KKyAgICAgICAgICAgIGlmIHAyY3JlYWQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBwMmNyZWFkLkNsb3NlKCkKKyAgICAgICAgICAgIGlmIGMycHdyaXRlICE9IE5vbmU6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUuQ2xvc2UoKQorICAgICAgICAgICAgaWYgZXJyd3JpdGUgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZS5DbG9zZSgpCisKKworICAgICAgICBkZWYgcG9sbChzZWxmKToKKyAgICAgICAgICAgICIiIkNoZWNrIGlmIGNoaWxkIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQuICBSZXR1cm5zIHJldHVybmNvZGUKKyAgICAgICAgICAgIGF0dHJpYnV0ZS4iIiIKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSA9PSBOb25lOgorICAgICAgICAgICAgICAgIGlmIFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VsZi5faGFuZGxlLCAwKSA9PSBXQUlUX09CSkVDVF8wOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBHZXRFeGl0Q29kZVByb2Nlc3Moc2VsZi5faGFuZGxlKQorICAgICAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShzZWxmKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQorCisKKyAgICAgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgICAgICAiIiJXYWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLiIiIgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlID09IE5vbmU6CisgICAgICAgICAgICAgICAgb2JqID0gV2FpdEZvclNpbmdsZU9iamVjdChzZWxmLl9oYW5kbGUsIElORklOSVRFKQorICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IEdldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCisgICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKKworCisgICAgICAgIGRlZiBfcmVhZGVydGhyZWFkKHNlbGYsIGZoLCBidWZmZXIpOgorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChmaC5yZWFkKCkpCisKKworICAgICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6CisgICAgICAgICAgICAiIiJJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tCisgICAgICAgICAgICBzdGRvdXQgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yCisgICAgICAgICAgICBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFRoZSBvcHRpb25hbCBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYQorICAgICAgICAgICAgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MsIG9yIE5vbmUsIGlmIG5vIGRhdGEKKyAgICAgICAgICAgIHNob3VsZCBiZSBzZW50IHRvIHRoZSBjaGlsZC4KKworICAgICAgICAgICAgY29tbXVuaWNhdGUoKSByZXR1cm5zIGEgdHVwbGUgKHN0ZG91dCwgc3RkZXJyKS4iIiIKKyAgICAgICAgICAgIHN0ZG91dCA9IE5vbmUgIyBSZXR1cm4KKyAgICAgICAgICAgIHN0ZGVyciA9IE5vbmUgIyBSZXR1cm4KKworICAgICAgICAgICAgaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gW10KKyAgICAgICAgICAgICAgICBzdGRvdXRfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fcmVhZGVydGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHNlbGYuc3Rkb3V0LCBzdGRvdXQpKQorICAgICAgICAgICAgICAgIHN0ZG91dF90aHJlYWQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICAgICAgc3Rkb3V0X3RocmVhZC5zdGFydCgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAgICBzdGRlcnIgPSBbXQorICAgICAgICAgICAgICAgIHN0ZGVycl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLl9yZWFkZXJ0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oc2VsZi5zdGRlcnIsIHN0ZGVycikpCisgICAgICAgICAgICAgICAgc3RkZXJyX3RocmVhZC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgICAgICBzdGRlcnJfdGhyZWFkLnN0YXJ0KCkKKworICAgICAgICAgICAgaWYgc2VsZi5zdGRpbjoKKyAgICAgICAgICAgICAgICBpZiBpbnB1dCAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLndyaXRlKGlucHV0KQorICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzdGRvdXRfdGhyZWFkLmpvaW4oKQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgc3RkZXJyX3RocmVhZC5qb2luKCkKKworICAgICAgICAgICAgIyBBbGwgZGF0YSBleGNoYW5nZWQuICBUcmFuc2xhdGUgbGlzdHMgaW50byBzdHJpbmdzLgorICAgICAgICAgICAgaWYgc3Rkb3V0ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0WzBdCisgICAgICAgICAgICBpZiBzdGRlcnIgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBzdGRlcnIgPSBzdGRlcnJbMF0KKworICAgICAgICAgICAgIyBUcmFuc2xhdGUgbmV3bGluZXMsIGlmIHJlcXVlc3RlZC4gIFdlIGNhbm5vdCBsZXQgdGhlIGZpbGUKKyAgICAgICAgICAgICMgb2JqZWN0IGRvIHRoZSB0cmFuc2xhdGlvbjogSXQgaXMgYmFzZWQgb24gc3RkaW8sIHdoaWNoIGlzCisgICAgICAgICAgICAjIGltcG9zc2libGUgdG8gY29tYmluZSB3aXRoIHNlbGVjdCAodW5sZXNzIGZvcmNpbmcgbm8KKyAgICAgICAgICAgICMgYnVmZmVyaW5nKS4KKyAgICAgICAgICAgIGlmIHNlbGYudW5pdmVyc2FsX25ld2xpbmVzIGFuZCBoYXNhdHRyKG9wZW4sICduZXdsaW5lcycpOgorICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZG91dCkKKyAgICAgICAgICAgICAgICBpZiBzdGRlcnI6CisgICAgICAgICAgICAgICAgICAgIHN0ZGVyciA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRlcnIpCisKKyAgICAgICAgICAgIHNlbGYud2FpdCgpCisgICAgICAgICAgICByZXR1cm4gKHN0ZG91dCwgc3RkZXJyKQorCisgICAgZWxzZToKKyAgICAgICAgIworICAgICAgICAjIFBPU0lYIG1ldGhvZHMKKyAgICAgICAgIworICAgICAgICBkZWYgX2dldF9oYW5kbGVzKHNlbGYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVycik6CisgICAgICAgICAgICAiIiJDb25zdHJ1Y3QgYW5kIHJldHVybiB0dXBlbCB3aXRoIElPIG9iamVjdHM6CisgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSwgYzJwcmVhZCwgYzJwd3JpdGUsIGVycnJlYWQsIGVycndyaXRlCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gTm9uZSwgTm9uZQorICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBOb25lLCBOb25lCisgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IE5vbmUsIE5vbmUKKworICAgICAgICAgICAgaWYgc3RkaW4gPT0gTm9uZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHN0ZGluID09IFBJUEU6CisgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBvcy5waXBlKCkKKyAgICAgICAgICAgIGVsaWYgdHlwZShzdGRpbikgPT0gdHlwZXMuSW50VHlwZToKKyAgICAgICAgICAgICAgICBwMmNyZWFkID0gc3RkaW4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IHN0ZGluLmZpbGVubygpCisKKyAgICAgICAgICAgIGlmIHN0ZG91dCA9PSBOb25lOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgc3Rkb3V0ID09IFBJUEU6CisgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBvcy5waXBlKCkKKyAgICAgICAgICAgIGVsaWYgdHlwZShzdGRvdXQpID09IHR5cGVzLkludFR5cGU6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBzdGRvdXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBzdGRvdXQuZmlsZW5vKCkKKworICAgICAgICAgICAgaWYgc3RkZXJyID09IE5vbmU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gUElQRToKKyAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IG9zLnBpcGUoKQorICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gU1RET1VUOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gYzJwd3JpdGUKKyAgICAgICAgICAgIGVsaWYgdHlwZShzdGRlcnIpID09IHR5cGVzLkludFR5cGU6CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBzdGRlcnIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBzdGRlcnIuZmlsZW5vKCkKKworICAgICAgICAgICAgcmV0dXJuIChwMmNyZWFkLCBwMmN3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKQorCisKKyAgICAgICAgZGVmIF9zZXRfY2xvZXhlY19mbGFnKHNlbGYsIGZkKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbG9leGVjX2ZsYWcgPSBmY250bC5GRF9DTE9FWEVDCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgY2xvZXhlY19mbGFnID0gMQorCisgICAgICAgICAgICBvbGQgPSBmY250bC5mY250bChmZCwgZmNudGwuRl9HRVRGRCkKKyAgICAgICAgICAgIGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX1NFVEZELCBvbGQgfCBjbG9leGVjX2ZsYWcpCisKKworICAgICAgICBkZWYgX2Nsb3NlX2ZkcyhzZWxmLCBidXQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMywgTUFYRkQpOgorICAgICAgICAgICAgICAgIGlmIGkgPT0gYnV0OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoaSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgcHJvZ3JhbSAoUE9TSVggdmVyc2lvbikiIiIKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdzLCB0eXBlcy5TdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgYXJncyA9IFthcmdzXQorCisgICAgICAgICAgICBpZiBzaGVsbDoKKyAgICAgICAgICAgICAgICBhcmdzID0gWyIvYmluL3NoIiwgIi1jIl0gKyBhcmdzCisKKyAgICAgICAgICAgIGlmIGV4ZWN1dGFibGUgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYXJnc1swXQorCisgICAgICAgICAgICAjIEZvciB0cmFuc2ZlcnJpbmcgcG9zc2libGUgZXhlYyBmYWlsdXJlIGZyb20gY2hpbGQgdG8gcGFyZW50CisgICAgICAgICAgICAjIFRoZSBmaXJzdCBjaGFyIHNwZWNpZmllcyB0aGUgZXhjZXB0aW9uIHR5cGU6IDAgbWVhbnMKKyAgICAgICAgICAgICMgT1NFcnJvciwgMSBtZWFucyBzb21lIG90aGVyIGVycm9yLgorICAgICAgICAgICAgZXJycGlwZV9yZWFkLCBlcnJwaXBlX3dyaXRlID0gb3MucGlwZSgpCisgICAgICAgICAgICBzZWxmLl9zZXRfY2xvZXhlY19mbGFnKGVycnBpcGVfd3JpdGUpCisKKyAgICAgICAgICAgIHNlbGYucGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBpZiBzZWxmLnBpZCA9PSAwOgorICAgICAgICAgICAgICAgICMgQ2hpbGQKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgcGFyZW50J3MgcGlwZSBlbmRzCisgICAgICAgICAgICAgICAgICAgIGlmIHAyY3dyaXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UocDJjd3JpdGUpCisgICAgICAgICAgICAgICAgICAgIGlmIGMycHJlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShjMnByZWFkKQorICAgICAgICAgICAgICAgICAgICBpZiBlcnJyZWFkOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJycmVhZCkKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJycGlwZV9yZWFkKQorCisgICAgICAgICAgICAgICAgICAgICMgRHVwIGZkcyBmb3IgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgaWYgcDJjcmVhZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmR1cDIocDJjcmVhZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgYzJwd3JpdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5kdXAyKGMycHdyaXRlLCAxKQorICAgICAgICAgICAgICAgICAgICBpZiBlcnJ3cml0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmR1cDIoZXJyd3JpdGUsIDIpCisKKyAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBwaXBlIGZkcy4gIE1ha2Ugc3VyZSB3ZSBkb2Vzbid0IGNsb3NlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICMgZmQgbW9yZSB0aGFuIG9uY2UuCisgICAgICAgICAgICAgICAgICAgIGlmIHAyY3JlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShwMmNyZWFkKQorICAgICAgICAgICAgICAgICAgICBpZiBjMnB3cml0ZSBhbmQgYzJwd3JpdGUgbm90IGluIChwMmNyZWFkLCk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShjMnB3cml0ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGUgYW5kIGVycndyaXRlIG5vdCBpbiAocDJjcmVhZCwgYzJwd3JpdGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJyd3JpdGUpCisKKyAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBhbGwgb3RoZXIgZmRzLCBpZiBhc2tlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xvc2VfZmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2VfZmRzKGJ1dD1lcnJwaXBlX3dyaXRlKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN3ZCAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHByZWV4ZWNfZm46CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseShwcmVleGVjX2ZuKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGVudiA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuZXhlY3ZwKGV4ZWN1dGFibGUsIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5leGVjdnBlKGV4ZWN1dGFibGUsIGFyZ3MsIGVudikKKworICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgICAgICAgICAjIFNhdmUgdGhlIHRyYWNlYmFjayBhbmQgYXR0YWNoIGl0IHRvIHRoZSBleGNlcHRpb24gb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIGV4Y19saW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKGV4Y190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiKQorICAgICAgICAgICAgICAgICAgICBleGNfdmFsdWUuY2hpbGRfdHJhY2ViYWNrID0gJycuam9pbihleGNfbGluZXMpCisgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGVycnBpcGVfd3JpdGUsIHBpY2tsZS5kdW1wcyhleGNfdmFsdWUpKQorCisgICAgICAgICAgICAgICAgIyBUaGlzIGV4aXRjb2RlIHdvbid0IGJlIHJlcG9ydGVkIHRvIGFwcGxpY2F0aW9ucywgc28gaXQKKyAgICAgICAgICAgICAgICAjIHJlYWxseSBkb2Vzbid0IG1hdHRlciB3aGF0IHdlIHJldHVybi4KKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgyNTUpCisKKyAgICAgICAgICAgICMgUGFyZW50CisgICAgICAgICAgICBvcy5jbG9zZShlcnJwaXBlX3dyaXRlKQorICAgICAgICAgICAgaWYgcDJjcmVhZCBhbmQgcDJjd3JpdGU6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UocDJjcmVhZCkKKyAgICAgICAgICAgIGlmIGMycHdyaXRlIGFuZCBjMnByZWFkOgorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQorICAgICAgICAgICAgaWYgZXJyd3JpdGUgYW5kIGVycnJlYWQ6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJyd3JpdGUpCisKKyAgICAgICAgICAgICMgV2FpdCBmb3IgZXhlYyB0byBmYWlsIG9yIHN1Y2NlZWQ7IHBvc3NpYmx5IHJhaXNpbmcgZXhjZXB0aW9uCisgICAgICAgICAgICBkYXRhID0gb3MucmVhZChlcnJwaXBlX3JlYWQsIDEwNDg1NzYpICMgRXhjZXB0aW9ucyBsaW1pdGVkIHRvIDEgTUIKKyAgICAgICAgICAgIG9zLmNsb3NlKGVycnBpcGVfcmVhZCkKKyAgICAgICAgICAgIGlmIGRhdGEgIT0gIiI6CisgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChzZWxmLnBpZCwgMCkKKyAgICAgICAgICAgICAgICBjaGlsZF9leGNlcHRpb24gPSBwaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgICAgICAgICByYWlzZSBjaGlsZF9leGNlcHRpb24KKworCisgICAgICAgIGRlZiBfaGFuZGxlX2V4aXRzdGF0dXMoc2VsZiwgc3RzKToKKyAgICAgICAgICAgIGlmIG9zLldJRlNJR05BTEVEKHN0cyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gLW9zLldURVJNU0lHKHN0cykKKyAgICAgICAgICAgIGVsaWYgb3MuV0lGRVhJVEVEKHN0cyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gb3MuV0VYSVRTVEFUVVMoc3RzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlVua25vd24gY2hpbGQgZXhpdCBzdGF0dXMhIikKKworICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKKworCisgICAgICAgIGRlZiBwb2xsKHNlbGYpOgorICAgICAgICAgICAgIiIiQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLiIiIgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlID09IE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9leGl0c3RhdHVzKHN0cykKKyAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKKworCisgICAgICAgIGRlZiB3YWl0KHNlbGYpOgorICAgICAgICAgICAgIiIiV2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byB0ZXJtaW5hdGUuICBSZXR1cm5zIHJldHVybmNvZGUKKyAgICAgICAgICAgIGF0dHJpYnV0ZS4iIiIKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSA9PSBOb25lOgorICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfZXhpdHN0YXR1cyhzdHMpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKworICAgICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6CisgICAgICAgICAgICAiIiJJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tCisgICAgICAgICAgICBzdGRvdXQgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yCisgICAgICAgICAgICBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFRoZSBvcHRpb25hbCBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYQorICAgICAgICAgICAgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MsIG9yIE5vbmUsIGlmIG5vIGRhdGEKKyAgICAgICAgICAgIHNob3VsZCBiZSBzZW50IHRvIHRoZSBjaGlsZC4KKworICAgICAgICAgICAgY29tbXVuaWNhdGUoKSByZXR1cm5zIGEgdHVwbGUgKHN0ZG91dCwgc3RkZXJyKS4iIiIKKyAgICAgICAgICAgIHJlYWRfc2V0ID0gW10KKyAgICAgICAgICAgIHdyaXRlX3NldCA9IFtdCisgICAgICAgICAgICBzdGRvdXQgPSBOb25lICMgUmV0dXJuCisgICAgICAgICAgICBzdGRlcnIgPSBOb25lICMgUmV0dXJuCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAgICAgICAgICAgIyBGbHVzaCBzdGRpbyBidWZmZXIuICBUaGlzIG1pZ2h0IGJsb2NrLCBpZiB0aGUgdXNlciBoYXMKKyAgICAgICAgICAgICAgICAjIGJlZW4gd3JpdGluZyB0byAuc3RkaW4gaW4gYW4gdW5jb250cm9sbGVkIGZhc2hpb24uCisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICAgICAgaWYgaW5wdXQ6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX3NldC5hcHBlbmQoc2VsZi5zdGRpbikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHJlYWRfc2V0LmFwcGVuZChzZWxmLnN0ZG91dCkKKyAgICAgICAgICAgICAgICBzdGRvdXQgPSBbXQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgcmVhZF9zZXQuYXBwZW5kKHNlbGYuc3RkZXJyKQorICAgICAgICAgICAgICAgIHN0ZGVyciA9IFtdCisKKyAgICAgICAgICAgIHdoaWxlIHJlYWRfc2V0IG9yIHdyaXRlX3NldDoKKyAgICAgICAgICAgICAgICBybGlzdCwgd2xpc3QsIHhsaXN0ID0gc2VsZWN0LnNlbGVjdChyZWFkX3NldCwgd3JpdGVfc2V0LCBbXSkKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RkaW4gaW4gd2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICMgV2hlbiBzZWxlY3QgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBmaWxlIGlzIHdyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAjIHdlIGNhbiB3cml0ZSB1cCB0byBQSVBFX0JVRiBieXRlcyB3aXRob3V0IHJpc2sKKyAgICAgICAgICAgICAgICAgICAgIyBibG9ja2luZy4gIFBPU0lYIGRlZmluZXMgUElQRV9CVUYgPj0gNTEyCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPSBvcy53cml0ZShzZWxmLnN0ZGluLmZpbGVubygpLCBpbnB1dFs6NTEyXSkKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dFtieXRlc193cml0dGVuOl0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9zZXQucmVtb3ZlKHNlbGYuc3RkaW4pCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dCBpbiBybGlzdDoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG9zLnJlYWQoc2VsZi5zdGRvdXQuZmlsZW5vKCksIDEwMjQpCisgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3NldC5yZW1vdmUoc2VsZi5zdGRvdXQpCisgICAgICAgICAgICAgICAgICAgIHN0ZG91dC5hcHBlbmQoZGF0YSkKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyIGluIHJsaXN0OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gb3MucmVhZChzZWxmLnN0ZGVyci5maWxlbm8oKSwgMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc2V0LnJlbW92ZShzZWxmLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyLmFwcGVuZChkYXRhKQorCisgICAgICAgICAgICAjIEFsbCBkYXRhIGV4Y2hhbmdlZC4gIFRyYW5zbGF0ZSBsaXN0cyBpbnRvIHN0cmluZ3MuCisgICAgICAgICAgICBpZiBzdGRvdXQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBzdGRvdXQgPSAnJy5qb2luKHN0ZG91dCkKKyAgICAgICAgICAgIGlmIHN0ZGVyciAhPSBOb25lOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9ICcnLmpvaW4oc3RkZXJyKQorCisgICAgICAgICAgICAjIFRyYW5zbGF0ZSBuZXdsaW5lcywgaWYgcmVxdWVzdGVkLiAgV2UgY2Fubm90IGxldCB0aGUgZmlsZQorICAgICAgICAgICAgIyBvYmplY3QgZG8gdGhlIHRyYW5zbGF0aW9uOiBJdCBpcyBiYXNlZCBvbiBzdGRpbywgd2hpY2ggaXMKKyAgICAgICAgICAgICMgaW1wb3NzaWJsZSB0byBjb21iaW5lIHdpdGggc2VsZWN0ICh1bmxlc3MgZm9yY2luZyBubworICAgICAgICAgICAgIyBidWZmZXJpbmcpLgorICAgICAgICAgICAgaWYgc2VsZi51bml2ZXJzYWxfbmV3bGluZXMgYW5kIGhhc2F0dHIob3BlbiwgJ25ld2xpbmVzJyk6CisgICAgICAgICAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgICAgICAgICBzdGRvdXQgPSBzZWxmLl90cmFuc2xhdGVfbmV3bGluZXMoc3Rkb3V0KQorICAgICAgICAgICAgICAgIGlmIHN0ZGVycjoKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZGVycikKKworICAgICAgICAgICAgc2VsZi53YWl0KCkKKyAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCisKKworZGVmIF9kZW1vX3Bvc2l4KCk6CisgICAgIworICAgICMgRXhhbXBsZSAxOiBTaW1wbGUgcmVkaXJlY3Rpb246IEdldCBwcm9jZXNzIGxpc3QKKyAgICAjCisgICAgcGxpc3QgPSBQb3BlbihbInBzIl0sIHN0ZG91dD1QSVBFKS5jb21tdW5pY2F0ZSgpWzBdCisgICAgcHJpbnQgIlByb2Nlc3MgbGlzdDoiCisgICAgcHJpbnQgcGxpc3QKKworICAgICMKKyAgICAjIEV4YW1wbGUgMjogQ2hhbmdlIHVpZCBiZWZvcmUgZXhlY3V0aW5nIGNoaWxkCisgICAgIworICAgIGlmIG9zLmdldHVpZCgpID09IDA6CisgICAgICAgIHAgPSBQb3BlbihbImlkIl0sIHByZWV4ZWNfZm49bGFtYmRhOiBvcy5zZXR1aWQoMTAwKSkKKyAgICAgICAgcC53YWl0KCkKKworICAgICMKKyAgICAjIEV4YW1wbGUgMzogQ29ubmVjdGluZyBzZXZlcmFsIHN1YnByb2Nlc3NlcworICAgICMKKyAgICBwcmludCAiTG9va2luZyBmb3IgJ2hkYScuLi4iCisgICAgcDEgPSBQb3BlbihbImRtZXNnIl0sIHN0ZG91dD1QSVBFKQorICAgIHAyID0gUG9wZW4oWyJncmVwIiwgImhkYSJdLCBzdGRpbj1wMS5zdGRvdXQsIHN0ZG91dD1QSVBFKQorICAgIHByaW50IHJlcHIocDIuY29tbXVuaWNhdGUoKVswXSkKKworICAgICMKKyAgICAjIEV4YW1wbGUgNDogQ2F0Y2ggZXhlY3V0aW9uIGVycm9yCisgICAgIworICAgIHByaW50CisgICAgcHJpbnQgIlRyeWluZyBhIHdlaXJkIGZpbGUuLi4iCisgICAgdHJ5OgorICAgICAgICBwcmludCBQb3BlbihbIi90aGlzL3BhdGgvZG9lcy9ub3QvZXhpc3QiXSkuY29tbXVuaWNhdGUoKQorICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgIHByaW50ICJUaGUgZmlsZSBkaWRuJ3QgZXhpc3QuICBJIHRob3VnaHQgc28uLi4iCisgICAgICAgICAgICBwcmludCAiQ2hpbGQgdHJhY2ViYWNrOiIKKyAgICAgICAgICAgIHByaW50IGUuY2hpbGRfdHJhY2ViYWNrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiRXJyb3IiLCBlLmVycm5vCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiR29zaC4gIE5vIGVycm9yLiIKKworCitkZWYgX2RlbW9fd2luZG93cygpOgorICAgICMKKyAgICAjIEV4YW1wbGUgMTogQ29ubmVjdGluZyBzZXZlcmFsIHN1YnByb2Nlc3NlcworICAgICMKKyAgICBwcmludCAiTG9va2luZyBmb3IgJ1BST01QVCcgaW4gc2V0IG91dHB1dC4uLiIKKyAgICBwMSA9IFBvcGVuKCJzZXQiLCBzdGRvdXQ9UElQRSwgc2hlbGw9VHJ1ZSkKKyAgICBwMiA9IFBvcGVuKCdmaW5kICJQUk9NUFQiJywgc3RkaW49cDEuc3Rkb3V0LCBzdGRvdXQ9UElQRSkKKyAgICBwcmludCByZXByKHAyLmNvbW11bmljYXRlKClbMF0pCisKKyAgICAjCisgICAgIyBFeGFtcGxlIDI6IFNpbXBsZSBleGVjdXRpb24gb2YgcHJvZ3JhbQorICAgICMKKyAgICBwcmludCAiRXhlY3V0aW5nIGNhbGMuLi4iCisgICAgcCA9IFBvcGVuKCJjYWxjIikKKyAgICBwLndhaXQoKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgbXN3aW5kb3dzOgorICAgICAgICBfZGVtb193aW5kb3dzKCkKKyAgICBlbHNlOgorICAgICAgICBfZGVtb19wb3NpeCgpCmRpZmYgLS1naXQgYS9jb21wYXQvdW5zZXRlbnYuYyBiL2NvbXBhdC91bnNldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWU0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvdW5zZXRlbnYuYwpAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgZ2l0dW5zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKKyAgICAgaW50IHNyYywgZHN0OworICAgICBzaXplX3Qgbm1sbjsKKworICAgICBubWxuID0gc3RybGVuKG5hbWUpOworCisgICAgIGZvciAoc3JjID0gZHN0ID0gMDsgZW52aXJvbltzcmNdOyArK3NyYykgeworCSAgc2l6ZV90IGVubG47CisJICBlbmxuID0gc3RybGVuKGVudmlyb25bc3JjXSk7CisJICBpZiAoZW5sbiA+IG5tbG4pIHsKKyAgICAgICAgICAgICAgIC8qIG1pZ2h0IG1hdGNoLCBhbmQgY2FuIHRlc3QgZm9yICc9JyBzYWZlbHkgKi8KKwkgICAgICAgaWYgKDAgPT0gc3RybmNtcCAoZW52aXJvbltzcmNdLCBuYW1lLCBubWxuKQorCQkgICAmJiAnPScgPT0gZW52aXJvbltzcmNdW25tbG5dKQorCQkgICAgLyogbWF0Y2hlcywgc28gc2tpcCAqLworCQkgICAgY29udGludWU7CisJICB9CisJICBlbnZpcm9uW2RzdF0gPSBlbnZpcm9uW3NyY107CisJICArK2RzdDsKKyAgICAgfQorICAgICBlbnZpcm9uW2RzdF0gPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY29uZmlnLmMgYi9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDc0OTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmMKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEpvaGFubmVzIFNjaGluZGVsaW4sIDIwMDUKKyAqCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisKKyNkZWZpbmUgTUFYTkFNRSAoMjU2KQorCitzdGF0aWMgRklMRSAqY29uZmlnX2ZpbGU7CitzdGF0aWMgY29uc3QgY2hhciAqY29uZmlnX2ZpbGVfbmFtZTsKK3N0YXRpYyBpbnQgY29uZmlnX2xpbmVucjsKK3N0YXRpYyBpbnQgZ2V0X25leHRfY2hhcih2b2lkKQoreworCWludCBjOworCUZJTEUgKmY7CisKKwljID0gJ1xuJzsKKwlpZiAoKGYgPSBjb25maWdfZmlsZSkgIT0gTlVMTCkgeworCQljID0gZmdldGMoZik7CisJCWlmIChjID09ICdccicpIHsKKwkJCS8qIERPUyBsaWtlIHN5c3RlbXMgKi8KKwkJCWMgPSBmZ2V0YyhmKTsKKwkJCWlmIChjICE9ICdcbicpIHsKKwkJCQl1bmdldGMoYywgZik7CisJCQkJYyA9ICdccic7CisJCQl9CisJCX0KKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWNvbmZpZ19saW5lbnIrKzsKKwkJaWYgKGMgPT0gRU9GKSB7CisJCQljb25maWdfZmlsZSA9IE5VTEw7CisJCQljID0gJ1xuJzsKKwkJfQorCX0KKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGNoYXIgKnBhcnNlX3ZhbHVlKHZvaWQpCit7CisJc3RhdGljIGNoYXIgdmFsdWVbMTAyNF07CisJaW50IHF1b3RlID0gMCwgY29tbWVudCA9IDAsIGxlbiA9IDAsIHNwYWNlID0gMDsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChsZW4gPj0gc2l6ZW9mKHZhbHVlKSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAocXVvdGUpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl2YWx1ZVtsZW5dID0gMDsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCQlpZiAoY29tbWVudCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaXNzcGFjZShjKSAmJiAhcXVvdGUpIHsKKwkJCXNwYWNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcXVvdGUpIHsKKwkJCWlmIChjID09ICc7JyB8fCBjID09ICcjJykgeworCQkJCWNvbW1lbnQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChzcGFjZSkgeworCQkJaWYgKGxlbikKKwkJCQl2YWx1ZVtsZW4rK10gPSAnICc7CisJCQlzcGFjZSA9IDA7CisJCX0KKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXG4nOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSAndCc6CisJCQkJYyA9ICdcdCc7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQljID0gJ1xiJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWMgPSAnXG4nOworCQkJCWJyZWFrOworCQkJLyogU29tZSBjaGFyYWN0ZXJzIGVzY2FwZSBhcyB0aGVtc2VsdmVzICovCisJCQljYXNlICdcXCc6IGNhc2UgJyInOgorCQkJCWJyZWFrOworCQkJLyogUmVqZWN0IHVua25vd24gZXNjYXBlIHNlcXVlbmNlcyAqLworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXZhbHVlW2xlbisrXSA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnIicpIHsKKwkJCXF1b3RlID0gMS1xdW90ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhbHVlW2xlbisrXSA9IGM7CisJfQorfQorCitzdGF0aWMgaW50IGdldF92YWx1ZShjb25maWdfZm5fdCBmbiwgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgYzsKKwljaGFyICp2YWx1ZTsKKworCS8qIEdldCB0aGUgZnVsbCBuYW1lICovCisJZm9yICg7OykgeworCQljID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKwkJaWYgKCFpc2FsbnVtKGMpKQorCQkJYnJlYWs7CisJCW5hbWVbbGVuKytdID0gdG9sb3dlcihjKTsKKwkJaWYgKGxlbiA+PSBNQVhOQU1FKQorCQkJcmV0dXJuIC0xOworCX0KKwluYW1lW2xlbl0gPSAwOworCXdoaWxlIChjID09ICcgJyB8fCBjID09ICdcdCcpCisJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisKKwl2YWx1ZSA9IE5VTEw7CisJaWYgKGMgIT0gJ1xuJykgeworCQlpZiAoYyAhPSAnPScpCisJCQlyZXR1cm4gLTE7CisJCXZhbHVlID0gcGFyc2VfdmFsdWUoKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGZuKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBnZXRfZXh0ZW5kZWRfYmFzZV92YXIoY2hhciAqbmFtZSwgaW50IGJhc2VsZW4sIGludCBjKQoreworCWRvIHsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCXJldHVybiAtMTsKKwkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwl9IHdoaWxlIChpc3NwYWNlKGMpKTsKKworCS8qIFdlIHJlcXVpcmUgdGhlIGZvcm1hdCB0byBiZSAnW2Jhc2UgImV4dGVuc2lvbiJdJyAqLworCWlmIChjICE9ICciJykKKwkJcmV0dXJuIC0xOworCW5hbWVbYmFzZWxlbisrXSA9ICcuJzsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjID09ICdcbicpCisJCQlyZXR1cm4gLTE7CisJCWlmIChjID09ICciJykKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQljID0gZ2V0X25leHRfY2hhcigpOworCQkJaWYgKGMgPT0gJ1xuJykKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJbmFtZVtiYXNlbGVuKytdID0gYzsKKwkJaWYgKGJhc2VsZW4gPiBNQVhOQU1FIC8gMikKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGaW5hbCAnXScgKi8KKwlpZiAoZ2V0X25leHRfY2hhcigpICE9ICddJykKKwkJcmV0dXJuIC0xOworCXJldHVybiBiYXNlbGVuOworfQorCitzdGF0aWMgaW50IGdldF9iYXNlX3ZhcihjaGFyICpuYW1lKQoreworCWludCBiYXNlbGVuID0gMDsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjID09IEVPRikKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMgPT0gJ10nKQorCQkJcmV0dXJuIGJhc2VsZW47CisJCWlmIChpc3NwYWNlKGMpKQorCQkJcmV0dXJuIGdldF9leHRlbmRlZF9iYXNlX3ZhcihuYW1lLCBiYXNlbGVuLCBjKTsKKwkJaWYgKCFpc2FsbnVtKGMpICYmIGMgIT0gJy4nKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYmFzZWxlbiA+IE1BWE5BTUUgLyAyKQorCQkJcmV0dXJuIC0xOworCQluYW1lW2Jhc2VsZW4rK10gPSB0b2xvd2VyKGMpOworCX0KK30KKworc3RhdGljIGludCBnaXRfcGFyc2VfZmlsZShjb25maWdfZm5fdCBmbikKK3sKKwlpbnQgY29tbWVudCA9IDA7CisJaW50IGJhc2VsZW4gPSAwOworCXN0YXRpYyBjaGFyIHZhcltNQVhOQU1FXTsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjID09ICdcbicpIHsKKwkJCS8qIEVPRj8gKi8KKwkJCWlmICghY29uZmlnX2ZpbGUpCisJCQkJcmV0dXJuIDA7CisJCQljb21tZW50ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb21tZW50IHx8IGlzc3BhY2UoYykpCisJCQljb250aW51ZTsKKwkJaWYgKGMgPT0gJyMnIHx8IGMgPT0gJzsnKSB7CisJCQljb21tZW50ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdbJykgeworCQkJYmFzZWxlbiA9IGdldF9iYXNlX3Zhcih2YXIpOworCQkJaWYgKGJhc2VsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCXZhcltiYXNlbGVuKytdID0gJy4nOworCQkJdmFyW2Jhc2VsZW5dID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaXNhbHBoYShjKSkKKwkJCWJyZWFrOworCQl2YXJbYmFzZWxlbl0gPSB0b2xvd2VyKGMpOworCQlpZiAoZ2V0X3ZhbHVlKGZuLCB2YXIsIGJhc2VsZW4rMSkgPCAwKQorCQkJYnJlYWs7CisJfQorCWRpZSgiYmFkIGNvbmZpZyBmaWxlIGxpbmUgJWQgaW4gJXMiLCBjb25maWdfbGluZW5yLCBjb25maWdfZmlsZV9uYW1lKTsKK30KKworaW50IGdpdF9jb25maWdfaW50KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJY2hhciAqZW5kOworCQlpbnQgdmFsID0gc3RydG9sKHZhbHVlLCAmZW5kLCAwKTsKKwkJaWYgKCEqZW5kKQorCQkJcmV0dXJuIHZhbDsKKwl9CisJZGllKCJiYWQgY29uZmlnIHZhbHVlIGZvciAnJXMnIGluICVzIiwgbmFtZSwgY29uZmlnX2ZpbGVfbmFtZSk7Cit9CisKK2ludCBnaXRfY29uZmlnX2Jvb2woY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIDE7CisJaWYgKCEqdmFsdWUpCisJCXJldHVybiAwOworCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiZmFsc2UiKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGdpdF9jb25maWdfaW50KG5hbWUsIHZhbHVlKSAhPSAwOworfQorCitpbnQgZ2l0X2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJLyogVGhpcyBuZWVkcyBhIGJldHRlciBuYW1lICovCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5maWxlbW9kZSIpKSB7CisJCXRydXN0X2V4ZWN1dGFibGVfYml0ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmlnbm9yZXN0YXQiKSkgeworCQlhc3N1bWVfdW5jaGFuZ2VkID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLnByZWZlcnN5bWxpbmtyZWZzIikpIHsKKwkJcHJlZmVyX3N5bWxpbmtfcmVmcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5sb2dhbGxyZWZ1cGRhdGVzIikpIHsKKwkJbG9nX2FsbF9yZWZfdXBkYXRlcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS53YXJuYW1iaWd1b3VzcmVmcyIpKSB7CisJCXdhcm5fYW1iaWd1b3VzX3JlZnMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgInVzZXIubmFtZSIpKSB7CisJCXN0cm5jcHkoZ2l0X2RlZmF1bHRfbmFtZSwgdmFsdWUsIHNpemVvZihnaXRfZGVmYXVsdF9uYW1lKSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgInVzZXIuZW1haWwiKSkgeworCQlzdHJuY3B5KGdpdF9kZWZhdWx0X2VtYWlsLCB2YWx1ZSwgc2l6ZW9mKGdpdF9kZWZhdWx0X2VtYWlsKSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImkxOG4uY29tbWl0ZW5jb2RpbmciKSkgeworCQlzdHJuY3B5KGdpdF9jb21taXRfZW5jb2RpbmcsIHZhbHVlLCBzaXplb2YoZ2l0X2NvbW1pdF9lbmNvZGluZykpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBZGQgb3RoZXIgY29uZmlnIHZhcmlhYmxlcyBoZXJlIGFuZCB0byBEb2N1bWVudGF0aW9uL2NvbmZpZy50eHQuICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBnaXRfY29uZmlnX2Zyb21fZmlsZShjb25maWdfZm5fdCBmbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHJldDsKKwlGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisKKwlyZXQgPSAtMTsKKwlpZiAoZikgeworCQljb25maWdfZmlsZSA9IGY7CisJCWNvbmZpZ19maWxlX25hbWUgPSBmaWxlbmFtZTsKKwkJY29uZmlnX2xpbmVuciA9IDE7CisJCXJldCA9IGdpdF9wYXJzZV9maWxlKGZuKTsKKwkJZmNsb3NlKGYpOworCQljb25maWdfZmlsZV9uYW1lID0gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGdpdF9jb25maWcoY29uZmlnX2ZuX3QgZm4pCit7CisJcmV0dXJuIGdpdF9jb25maWdfZnJvbV9maWxlKGZuLCBnaXRfcGF0aCgiY29uZmlnIikpOworfQorCisvKgorICogRmluZCBhbGwgdGhlIHN0dWZmIGZvciBnaXRfY29uZmlnX3NldCgpIGJlbG93LgorICovCisKKyNkZWZpbmUgTUFYX01BVENIRVMgNTEyCisKK3N0YXRpYyBzdHJ1Y3QgeworCWludCBiYXNlbGVuOworCWNoYXIqIGtleTsKKwlpbnQgZG9fbm90X21hdGNoOworCXJlZ2V4X3QqIHZhbHVlX3JlZ2V4OworCWludCBtdWx0aV9yZXBsYWNlOworCW9mZl90IG9mZnNldFtNQVhfTUFUQ0hFU107CisJZW51bSB7IFNUQVJULCBTRUNUSU9OX1NFRU4sIFNFQ1RJT05fRU5EX1NFRU4sIEtFWV9TRUVOIH0gc3RhdGU7CisJaW50IHNlZW47Cit9IHN0b3JlOworCitzdGF0aWMgaW50IG1hdGNoZXMoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlyZXR1cm4gIXN0cmNtcChrZXksIHN0b3JlLmtleSkgJiYKKwkJKHN0b3JlLnZhbHVlX3JlZ2V4ID09IE5VTEwgfHwKKwkJIChzdG9yZS5kb19ub3RfbWF0Y2ggXgorCQkgICFyZWdleGVjKHN0b3JlLnZhbHVlX3JlZ2V4LCB2YWx1ZSwgMCwgTlVMTCwgMCkpKTsKK30KKworc3RhdGljIGludCBzdG9yZV9hdXgoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKHN0b3JlLnN0YXRlKSB7CisJY2FzZSBLRVlfU0VFTjoKKwkJaWYgKG1hdGNoZXMoa2V5LCB2YWx1ZSkpIHsKKwkJCWlmIChzdG9yZS5zZWVuID09IDEgJiYgc3RvcmUubXVsdGlfcmVwbGFjZSA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJXYXJuaW5nOiAlcyBoYXMgbXVsdGlwbGUgdmFsdWVzXG4iLAorCQkJCQlrZXkpOworCQkJfSBlbHNlIGlmIChzdG9yZS5zZWVuID49IE1BWF9NQVRDSEVTKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBtYXRjaGVzXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkJc3RvcmUuc2VlbisrOworCQl9CisJCWJyZWFrOworCWNhc2UgU0VDVElPTl9TRUVOOgorCQlpZiAoc3RybmNtcChrZXksIHN0b3JlLmtleSwgc3RvcmUuYmFzZWxlbisxKSkgeworCQkJc3RvcmUuc3RhdGUgPSBTRUNUSU9OX0VORF9TRUVOOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJLyogZG8gbm90IGluY3JlbWVudCBtYXRjaGVzOiB0aGlzIGlzIG5vIG1hdGNoICovCisJCQlzdG9yZS5vZmZzZXRbc3RvcmUuc2Vlbl0gPSBmdGVsbChjb25maWdfZmlsZSk7CisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBTRUNUSU9OX0VORF9TRUVOOgorCWNhc2UgU1RBUlQ6CisJCWlmIChtYXRjaGVzKGtleSwgdmFsdWUpKSB7CisJCQlzdG9yZS5vZmZzZXRbc3RvcmUuc2Vlbl0gPSBmdGVsbChjb25maWdfZmlsZSk7CisJCQlzdG9yZS5zdGF0ZSA9IEtFWV9TRUVOOworCQkJc3RvcmUuc2VlbisrOworCQl9IGVsc2UgeworCQkJaWYgKHN0cnJjaHIoa2V5LCAnLicpIC0ga2V5ID09IHN0b3JlLmJhc2VsZW4gJiYKKwkJCSAgICAgICFzdHJuY21wKGtleSwgc3RvcmUua2V5LCBzdG9yZS5iYXNlbGVuKSkgeworCQkJCQlzdG9yZS5zdGF0ZSA9IFNFQ1RJT05fU0VFTjsKKwkJCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG9yZV93cml0ZV9zZWN0aW9uKGludCBmZCwgY29uc3QgY2hhcioga2V5KQoreworCWNvbnN0IGNoYXIgKmRvdCA9IHN0cmNocihrZXksICcuJyk7CisJaW50IGxlbjEgPSBzdG9yZS5iYXNlbGVuLCBsZW4yID0gLTE7CisKKwlkb3QgPSBzdHJjaHIoa2V5LCAnLicpOworCWlmIChkb3QpIHsKKwkJaW50IGRvdGxlbiA9IGRvdCAtIGtleTsKKwkJaWYgKGRvdGxlbiA8IGxlbjEpIHsKKwkJCWxlbjIgPSBsZW4xIC0gZG90bGVuIC0gMTsKKwkJCWxlbjEgPSBkb3RsZW47CisJCX0KKwl9CisKKwl3cml0ZShmZCwgIlsiLCAxKTsKKwl3cml0ZShmZCwga2V5LCBsZW4xKTsKKwlpZiAobGVuMiA+PSAwKSB7CisJCXdyaXRlKGZkLCAiIFwiIiwgMik7CisJCXdoaWxlICgtLWxlbjIgPj0gMCkgeworCQkJdW5zaWduZWQgY2hhciBjID0gKisrZG90OworCQkJaWYgKGMgPT0gJyInKQorCQkJCXdyaXRlKGZkLCAiXFwiLCAxKTsKKwkJCXdyaXRlKGZkLCAmYywgMSk7CisJCX0KKwkJd3JpdGUoZmQsICJcIiIsIDEpOworCX0KKwl3cml0ZShmZCwgIl1cbiIsIDIpOworfQorCitzdGF0aWMgdm9pZCBzdG9yZV93cml0ZV9wYWlyKGludCBmZCwgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCXdyaXRlKGZkLCAiXHQiLCAxKTsKKwl3cml0ZShmZCwga2V5K3N0b3JlLmJhc2VsZW4rMSwKKwkJc3RybGVuKGtleStzdG9yZS5iYXNlbGVuKzEpKTsKKwl3cml0ZShmZCwgIiA9ICIsIDMpOworCWZvciAoaSA9IDA7IHZhbHVlW2ldOyBpKyspCisJCXN3aXRjaCAodmFsdWVbaV0pIHsKKwkJY2FzZSAnXG4nOiB3cml0ZShmZCwgIlxcbiIsIDIpOyBicmVhazsKKwkJY2FzZSAnXHQnOiB3cml0ZShmZCwgIlxcdCIsIDIpOyBicmVhazsKKwkJY2FzZSAnIic6IGNhc2UgJ1xcJzogd3JpdGUoZmQsICJcXCIsIDEpOworCQlkZWZhdWx0OiB3cml0ZShmZCwgdmFsdWUraSwgMSk7CisJfQorCXdyaXRlKGZkLCAiXG4iLCAxKTsKK30KKworc3RhdGljIGludCBmaW5kX2JlZ2lubmluZ19vZl9saW5lKGNvbnN0IGNoYXIqIGNvbnRlbnRzLCBpbnQgc2l6ZSwKKwlpbnQgb2Zmc2V0XywgaW50KiBmb3VuZF9icmFja2V0KQoreworCWludCBlcXVhbF9vZmZzZXQgPSBzaXplLCBicmFja2V0X29mZnNldCA9IHNpemU7CisJaW50IG9mZnNldDsKKworCWZvciAob2Zmc2V0ID0gb2Zmc2V0Xy0yOyBvZmZzZXQgPiAwIAorCQkJJiYgY29udGVudHNbb2Zmc2V0XSAhPSAnXG4nOyBvZmZzZXQtLSkKKwkJc3dpdGNoIChjb250ZW50c1tvZmZzZXRdKSB7CisJCQljYXNlICc9JzogZXF1YWxfb2Zmc2V0ID0gb2Zmc2V0OyBicmVhazsKKwkJCWNhc2UgJ10nOiBicmFja2V0X29mZnNldCA9IG9mZnNldDsgYnJlYWs7CisJCX0KKwlpZiAoYnJhY2tldF9vZmZzZXQgPCBlcXVhbF9vZmZzZXQpIHsKKwkJKmZvdW5kX2JyYWNrZXQgPSAxOworCQlvZmZzZXQgPSBicmFja2V0X29mZnNldCsxOworCX0gZWxzZQorCQlvZmZzZXQrKzsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBnaXRfY29uZmlnX3NldChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworCXJldHVybiBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihrZXksIHZhbHVlLCBOVUxMLCAwKTsKK30KKworLyoKKyAqIElmIHZhbHVlPT1OVUxMLCB1bnNldCBpbiAocmVtb3ZlIGZyb20pIGNvbmZpZywKKyAqIGlmIHZhbHVlX3JlZ2V4IT1OVUxMLCBkaXNyZWdhcmQga2V5L3ZhbHVlIHBhaXJzIHdoZXJlIHZhbHVlIGRvZXMgbm90IG1hdGNoLgorICogaWYgbXVsdGlfcmVwbGFjZT09MCwgbm90aGluZywgb3Igb25seSBvbmUgbWF0Y2hpbmcga2V5L3ZhbHVlIGlzIHJlcGxhY2VkLAorICogICAgIGVsc2UgYWxsIG1hdGNoaW5nIGtleS92YWx1ZXMgKHJlZ2FyZGxlc3MgaG93IG1hbnkpIGFyZSByZW1vdmVkLAorICogICAgIGJlZm9yZSB0aGUgbmV3IHBhaXIgaXMgd3JpdHRlbi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhpczoKKyAqCisgKiAtIGl0IGxvY2tzIHRoZSBjb25maWcgZmlsZSBieSBjcmVhdGluZyAiLmdpdC9jb25maWcubG9jayIKKyAqCisgKiAtIGl0IHRoZW4gcGFyc2VzIHRoZSBjb25maWcgdXNpbmcgc3RvcmVfYXV4KCkgYXMgdmFsaWRhdG9yIHRvIGZpbmQKKyAqICAgdGhlIHBvc2l0aW9uIG9uIHRoZSBrZXkvdmFsdWUgcGFpciB0byByZXBsYWNlLiBJZiBpdCBpcyB0byBiZSB1bnNldCwKKyAqICAgaXQgbXVzdCBiZSBmb3VuZCBleGFjdGx5IG9uY2UuCisgKgorICogLSB0aGUgY29uZmlnIGZpbGUgaXMgbW1hcCgpZWQgYW5kIHRoZSBwYXJ0IGJlZm9yZSB0aGUgbWF0Y2ggKGlmIGFueSkgaXMKKyAqICAgd3JpdHRlbiB0byB0aGUgbG9jayBmaWxlLCB0aGVuIHRoZSBjaGFuZ2VkIHBhcnQgYW5kIHRoZSByZXN0LgorICoKKyAqIC0gdGhlIGNvbmZpZyBmaWxlIGlzIHJlbW92ZWQgYW5kIHRoZSBsb2NrIGZpbGUgcmVuYW1lKClkIHRvIGl0LgorICoKKyAqLworaW50IGdpdF9jb25maWdfc2V0X211bHRpdmFyKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUsCisJY29uc3QgY2hhciogdmFsdWVfcmVnZXgsIGludCBtdWx0aV9yZXBsYWNlKQoreworCWludCBpLCBkb3Q7CisJaW50IGZkID0gLTEsIGluX2ZkOworCWludCByZXQ7CisJY2hhciogY29uZmlnX2ZpbGVuYW1lID0gc3RyZHVwKGdpdF9wYXRoKCJjb25maWciKSk7CisJY2hhciogbG9ja19maWxlID0gc3RyZHVwKGdpdF9wYXRoKCJjb25maWcubG9jayIpKTsKKwljb25zdCBjaGFyKiBsYXN0X2RvdCA9IHN0cnJjaHIoa2V5LCAnLicpOworCisJLyoKKwkgKiBTaW5jZSAia2V5IiBhY3R1YWxseSBjb250YWlucyB0aGUgc2VjdGlvbiBuYW1lIGFuZCB0aGUgcmVhbAorCSAqIGtleSBuYW1lIHNlcGFyYXRlZCBieSBhIGRvdCwgd2UgaGF2ZSB0byBrbm93IHdoZXJlIHRoZSBkb3QgaXMuCisJICovCisKKwlpZiAobGFzdF9kb3QgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImtleSBkb2VzIG5vdCBjb250YWluIGEgc2VjdGlvbjogJXNcbiIsIGtleSk7CisJCXJldCA9IDI7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXN0b3JlLmJhc2VsZW4gPSBsYXN0X2RvdCAtIGtleTsKKworCXN0b3JlLm11bHRpX3JlcGxhY2UgPSBtdWx0aV9yZXBsYWNlOworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUga2V5IGFuZCB3aGlsZSBhdCBpdCwgbG93ZXIgY2FzZSBpdCBmb3IgbWF0Y2hpbmcuCisJICovCisJc3RvcmUua2V5ID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oa2V5KSsxKTsKKwlkb3QgPSAwOworCWZvciAoaSA9IDA7IGtleVtpXTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGtleVtpXTsKKwkJaWYgKGMgPT0gJy4nKQorCQkJZG90ID0gMTsKKwkJLyogTGVhdmUgdGhlIGV4dGVuZGVkIGJhc2VuYW1lIHVudG91Y2hlZC4uICovCisJCWlmICghZG90IHx8IGkgPiBzdG9yZS5iYXNlbGVuKSB7CisJCQlpZiAoIWlzYWxudW0oYykgfHwgKGkgPT0gc3RvcmUuYmFzZWxlbisxICYmICFpc2FscGhhKGMpKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBrZXk6ICVzXG4iLCBrZXkpOworCQkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQljID0gdG9sb3dlcihjKTsKKwkJfQorCQlzdG9yZS5rZXlbaV0gPSBjOworCX0KKwlzdG9yZS5rZXlbaV0gPSAwOworCisJLyoKKwkgKiBUaGUgbG9ja19maWxlIHNlcnZlcyBhIHB1cnBvc2UgaW4gYWRkaXRpb24gdG8gbG9ja2luZzogdGhlIG5ldworCSAqIGNvbnRlbnRzIG9mIC5naXQvY29uZmlnIHdpbGwgYmUgd3JpdHRlbiBpbnRvIGl0LgorCSAqLworCWZkID0gb3Blbihsb2NrX2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJaWYgKGZkIDwgMCB8fCBhZGp1c3Rfc2hhcmVkX3Blcm0obG9ja19maWxlKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBsb2NrIGNvbmZpZyBmaWxlXG4iKTsKKwkJZnJlZShzdG9yZS5rZXkpOworCQlyZXQgPSAtMTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKgorCSAqIElmIC5naXQvY29uZmlnIGRvZXMgbm90IGV4aXN0IHlldCwgd3JpdGUgYSBtaW5pbWFsIHZlcnNpb24uCisJICovCisJaW5fZmQgPSBvcGVuKGNvbmZpZ19maWxlbmFtZSwgT19SRE9OTFkpOworCWlmICggaW5fZmQgPCAwICkgeworCQlmcmVlKHN0b3JlLmtleSk7CisKKwkJaWYgKCBFTk9FTlQgIT0gZXJybm8gKSB7CisJCQllcnJvcigib3BlbmluZyAlczogJXMiLCBjb25maWdfZmlsZW5hbWUsCisJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0gMzsgLyogc2FtZSBhcyAiaW52YWxpZCBjb25maWcgZmlsZSIgKi8KKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJLyogaWYgbm90aGluZyB0byB1bnNldCwgZXJyb3Igb3V0ICovCisJCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCQlyZXQgPSA1OworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCXN0b3JlLmtleSA9IChjaGFyKilrZXk7CisJCXN0b3JlX3dyaXRlX3NlY3Rpb24oZmQsIGtleSk7CisJCXN0b3JlX3dyaXRlX3BhaXIoZmQsIGtleSwgdmFsdWUpOworCX0gZWxzZXsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIqIGNvbnRlbnRzOworCQlpbnQgaSwgY29weV9iZWdpbiwgY29weV9lbmQsIG5ld19saW5lID0gMDsKKworCQlpZiAodmFsdWVfcmVnZXggPT0gTlVMTCkKKwkJCXN0b3JlLnZhbHVlX3JlZ2V4ID0gTlVMTDsKKwkJZWxzZSB7CisJCQlpZiAodmFsdWVfcmVnZXhbMF0gPT0gJyEnKSB7CisJCQkJc3RvcmUuZG9fbm90X21hdGNoID0gMTsKKwkJCQl2YWx1ZV9yZWdleCsrOworCQkJfSBlbHNlCisJCQkJc3RvcmUuZG9fbm90X21hdGNoID0gMDsKKworCQkJc3RvcmUudmFsdWVfcmVnZXggPSAocmVnZXhfdCopbWFsbG9jKHNpemVvZihyZWdleF90KSk7CisJCQlpZiAocmVnY29tcChzdG9yZS52YWx1ZV9yZWdleCwgdmFsdWVfcmVnZXgsCisJCQkJCVJFR19FWFRFTkRFRCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGF0dGVybjogJXNcbiIsCisJCQkJCXZhbHVlX3JlZ2V4KTsKKwkJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCQlyZXQgPSA2OworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCX0KKworCQlzdG9yZS5vZmZzZXRbMF0gPSAwOworCQlzdG9yZS5zdGF0ZSA9IFNUQVJUOworCQlzdG9yZS5zZWVuID0gMDsKKworCQkvKgorCQkgKiBBZnRlciB0aGlzLCBzdG9yZS5vZmZzZXQgd2lsbCBjb250YWluIHRoZSAqZW5kKiBvZmZzZXQKKwkJICogb2YgdGhlIGxhc3QgbWF0Y2gsIG9yIHJlbWFpbiBhdCAwIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KKwkJICogQXMgYSBzaWRlIGVmZmVjdCwgd2UgbWFrZSBzdXJlIHRvIHRyYW5zZm9ybSBvbmx5IGEgdmFsaWQKKwkJICogZXhpc3RpbmcgY29uZmlnIGZpbGUuCisJCSAqLworCQlpZiAoZ2l0X2NvbmZpZyhzdG9yZV9hdXgpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgY29uZmlnIGZpbGVcbiIpOworCQkJZnJlZShzdG9yZS5rZXkpOworCQkJaWYgKHN0b3JlLnZhbHVlX3JlZ2V4ICE9IE5VTEwpIHsKKwkJCQlyZWdmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCX0KKwkJCXJldCA9IDM7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJZnJlZShzdG9yZS5rZXkpOworCQlpZiAoc3RvcmUudmFsdWVfcmVnZXggIT0gTlVMTCkgeworCQkJcmVnZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJfQorCisJCS8qIGlmIG5vdGhpbmcgdG8gdW5zZXQsIG9yIHRvbyBtYW55IG1hdGNoZXMsIGVycm9yIG91dCAqLworCQlpZiAoKHN0b3JlLnNlZW4gPT0gMCAmJiB2YWx1ZSA9PSBOVUxMKSB8fAorCQkJCShzdG9yZS5zZWVuID4gMSAmJiBtdWx0aV9yZXBsYWNlID09IDApKSB7CisJCQlyZXQgPSA1OworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCWZzdGF0KGluX2ZkLCAmc3QpOworCQljb250ZW50cyA9IG1tYXAoTlVMTCwgc3Quc3Rfc2l6ZSwgUFJPVF9SRUFELAorCQkJTUFQX1BSSVZBVEUsIGluX2ZkLCAwKTsKKwkJY2xvc2UoaW5fZmQpOworCisJCWlmIChzdG9yZS5zZWVuID09IDApCisJCQlzdG9yZS5zZWVuID0gMTsKKworCQlmb3IgKGkgPSAwLCBjb3B5X2JlZ2luID0gMDsgaSA8IHN0b3JlLnNlZW47IGkrKykgeworCQkJaWYgKHN0b3JlLm9mZnNldFtpXSA9PSAwKSB7CisJCQkJc3RvcmUub2Zmc2V0W2ldID0gY29weV9lbmQgPSBzdC5zdF9zaXplOworCQkJfSBlbHNlIGlmIChzdG9yZS5zdGF0ZSAhPSBLRVlfU0VFTikgeworCQkJCWNvcHlfZW5kID0gc3RvcmUub2Zmc2V0W2ldOworCQkJfSBlbHNlCisJCQkJY29weV9lbmQgPSBmaW5kX2JlZ2lubmluZ19vZl9saW5lKAorCQkJCQljb250ZW50cywgc3Quc3Rfc2l6ZSwKKwkJCQkJc3RvcmUub2Zmc2V0W2ldLTIsICZuZXdfbGluZSk7CisKKwkJCS8qIHdyaXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb25maWcgKi8KKwkJCWlmIChjb3B5X2VuZCA+IGNvcHlfYmVnaW4pIHsKKwkJCQl3cml0ZShmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCWNvcHlfZW5kIC0gY29weV9iZWdpbik7CisJCQkJaWYgKG5ld19saW5lKQorCQkJCQl3cml0ZShmZCwgIlxuIiwgMSk7CisJCQl9CisJCQljb3B5X2JlZ2luID0gc3RvcmUub2Zmc2V0W2ldOworCQl9CisKKwkJLyogd3JpdGUgdGhlIHBhaXIgKHZhbHVlID09IE5VTEwgbWVhbnMgdW5zZXQpICovCisJCWlmICh2YWx1ZSAhPSBOVUxMKSB7CisJCQlpZiAoc3RvcmUuc3RhdGUgPT0gU1RBUlQpCisJCQkJc3RvcmVfd3JpdGVfc2VjdGlvbihmZCwga2V5KTsKKwkJCXN0b3JlX3dyaXRlX3BhaXIoZmQsIGtleSwgdmFsdWUpOworCQl9CisKKwkJLyogd3JpdGUgdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZyAqLworCQlpZiAoY29weV9iZWdpbiA8IHN0LnN0X3NpemUpCisJCQl3cml0ZShmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCXN0LnN0X3NpemUgLSBjb3B5X2JlZ2luKTsKKworCQltdW5tYXAoY29udGVudHMsIHN0LnN0X3NpemUpOworCQl1bmxpbmsoY29uZmlnX2ZpbGVuYW1lKTsKKwl9CisKKwlpZiAocmVuYW1lKGxvY2tfZmlsZSwgY29uZmlnX2ZpbGVuYW1lKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVuYW1lIHRoZSBsb2NrIGZpbGU/XG4iKTsKKwkJcmV0ID0gNDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlyZXQgPSAwOworCitvdXRfZnJlZToKKwlpZiAoMCA8PSBmZCkKKwkJY2xvc2UoZmQpOworCWlmIChjb25maWdfZmlsZW5hbWUpCisJCWZyZWUoY29uZmlnX2ZpbGVuYW1lKTsKKwlpZiAobG9ja19maWxlKSB7CisJCXVubGluayhsb2NrX2ZpbGUpOworCQlmcmVlKGxvY2tfZmlsZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKwpkaWZmIC0tZ2l0IGEvY29ubmVjdC5jIGIvY29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDcwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0LmMKQEAgLTAsMCArMSw3MTMgQEAKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKK3N0YXRpYyBjaGFyICpzZXJ2ZXJfY2FwYWJpbGl0aWVzID0gTlVMTDsKKworLyoKKyAqIFJlYWQgYWxsIHRoZSByZWZzIGZyb20gdGhlIG90aGVyIGVuZAorICovCitzdHJ1Y3QgcmVmICoqZ2V0X3JlbW90ZV9oZWFkcyhpbnQgaW4sIHN0cnVjdCByZWYgKipsaXN0LAorCQkJICAgICAgaW50IG5yX21hdGNoLCBjaGFyICoqbWF0Y2gsIGludCBpZ25vcmVfZnVubnkpCit7CisJKmxpc3QgPSBOVUxMOworCWZvciAoOzspIHsKKwkJc3RydWN0IHJlZiAqcmVmOworCQl1bnNpZ25lZCBjaGFyIG9sZF9zaGExWzIwXTsKKwkJc3RhdGljIGNoYXIgYnVmZmVyWzEwMDBdOworCQljaGFyICpuYW1lOworCQlpbnQgbGVuLCBuYW1lX2xlbjsKKworCQlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGluLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwkJaWYgKGJ1ZmZlcltsZW4tMV0gPT0gJ1xuJykKKwkJCWJ1ZmZlclstLWxlbl0gPSAwOworCisJCWlmIChsZW4gPCA0MiB8fCBnZXRfc2hhMV9oZXgoYnVmZmVyLCBvbGRfc2hhMSkgfHwgYnVmZmVyWzQwXSAhPSAnICcpCisJCQlkaWUoInByb3RvY29sIGVycm9yOiBleHBlY3RlZCBzaGEvcmVmLCBnb3QgJyVzJyIsIGJ1ZmZlcik7CisJCW5hbWUgPSBidWZmZXIgKyA0MTsKKworCQluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwkJaWYgKGxlbiAhPSBuYW1lX2xlbiArIDQxKSB7CisJCQlpZiAoc2VydmVyX2NhcGFiaWxpdGllcykKKwkJCQlmcmVlKHNlcnZlcl9jYXBhYmlsaXRpZXMpOworCQkJc2VydmVyX2NhcGFiaWxpdGllcyA9IHN0cmR1cChuYW1lICsgbmFtZV9sZW4gKyAxKTsKKwkJfQorCisJCWlmIChpZ25vcmVfZnVubnkgJiYgNDUgPCBsZW4gJiYgIW1lbWNtcChuYW1lLCAicmVmcy8iLCA1KSAmJgorCQkgICAgY2hlY2tfcmVmX2Zvcm1hdChuYW1lICsgNSkpCisJCQljb250aW51ZTsKKworCQlpZiAobnJfbWF0Y2ggJiYgIXBhdGhfbWF0Y2gobmFtZSwgbnJfbWF0Y2gsIG1hdGNoKSkKKwkJCWNvbnRpbnVlOworCQlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbiAtIDQwKTsKKwkJbWVtY3B5KHJlZi0+b2xkX3NoYTEsIG9sZF9zaGExLCAyMCk7CisJCW1lbWNweShyZWYtPm5hbWUsIGJ1ZmZlciArIDQxLCBsZW4gLSA0MCk7CisJCSpsaXN0ID0gcmVmOworCQlsaXN0ID0gJnJlZi0+bmV4dDsKKwl9CisJcmV0dXJuIGxpc3Q7Cit9CisKK2ludCBzZXJ2ZXJfc3VwcG9ydHMoY29uc3QgY2hhciAqZmVhdHVyZSkKK3sKKwlyZXR1cm4gc2VydmVyX2NhcGFiaWxpdGllcyAmJgorCQlzdHJzdHIoc2VydmVyX2NhcGFiaWxpdGllcywgZmVhdHVyZSkgIT0gTlVMTDsKK30KKworaW50IGdldF9hY2soaW50IGZkLCB1bnNpZ25lZCBjaGFyICpyZXN1bHRfc2hhMSkKK3sKKwlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCWludCBsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGZkLCBsaW5lLCBzaXplb2YobGluZSkpOworCisJaWYgKCFsZW4pCisJCWRpZSgiZ2l0LWZldGNoLXBhY2s6IGV4cGVjdGVkIEFDSy9OQUssIGdvdCBFT0YiKTsKKwlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJbGluZVstLWxlbl0gPSAwOworCWlmICghc3RyY21wKGxpbmUsICJOQUsiKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFzdHJuY21wKGxpbmUsICJBQ0sgIiwgNCkpIHsKKwkJaWYgKCFnZXRfc2hhMV9oZXgobGluZSs0LCByZXN1bHRfc2hhMSkpIHsKKwkJCWlmIChzdHJzdHIobGluZSs0NSwgImNvbnRpbnVlIikpCisJCQkJcmV0dXJuIDI7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlkaWUoImdpdC1mZXRjaF9wYWNrOiBleHBlY3RlZCBBQ0svTkFLLCBnb3QgJyVzJyIsIGxpbmUpOworfQorCitpbnQgcGF0aF9tYXRjaChjb25zdCBjaGFyICpwYXRoLCBpbnQgbnIsIGNoYXIgKiptYXRjaCkKK3sKKwlpbnQgaTsKKwlpbnQgcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWNoYXIgKnMgPSBtYXRjaFtpXTsKKwkJaW50IGxlbiA9IHN0cmxlbihzKTsKKworCQlpZiAoIWxlbiB8fCBsZW4gPiBwYXRobGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAocGF0aCArIHBhdGhsZW4gLSBsZW4sIHMsIGxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKHBhdGhsZW4gPiBsZW4gJiYgcGF0aFtwYXRobGVuIC0gbGVuIC0gMV0gIT0gJy8nKQorCQkJY29udGludWU7CisJCSpzID0gMDsKKwkJcmV0dXJuIChpICsgMSk7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgcmVmc3BlYyB7CisJY2hhciAqc3JjOworCWNoYXIgKmRzdDsKKwljaGFyIGZvcmNlOworfTsKKworLyoKKyAqIEE6QiBtZWFucyBmYXN0IGZvcndhcmQgcmVtb3RlIEIgd2l0aCBsb2NhbCBBLgorICogK0E6QiBtZWFucyBvdmVyd3JpdGUgcmVtb3RlIEIgd2l0aCBsb2NhbCBBLgorICogK0EgaXMgYSBzaG9ydGhhbmQgZm9yICtBOkEuCisgKiBBIGlzIGEgc2hvcnRoYW5kIGZvciBBOkEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVmc3BlYyAqcGFyc2VfcmVmX3NwZWMoaW50IG5yX3JlZnNwZWMsIGNoYXIgKipyZWZzcGVjKQoreworCWludCBpOworCXN0cnVjdCByZWZzcGVjICpycyA9IHhjYWxsb2Moc2l6ZW9mKCpycyksIChucl9yZWZzcGVjICsgMSkpOworCWZvciAoaSA9IDA7IGkgPCBucl9yZWZzcGVjOyBpKyspIHsKKwkJY2hhciAqc3AsICpkcCwgKmVwOworCQlzcCA9IHJlZnNwZWNbaV07CisJCWlmICgqc3AgPT0gJysnKSB7CisJCQlyc1tpXS5mb3JjZSA9IDE7CisJCQlzcCsrOworCQl9CisJCWVwID0gc3RyY2hyKHNwLCAnOicpOworCQlpZiAoZXApIHsKKwkJCWRwID0gZXAgKyAxOworCQkJKmVwID0gMDsKKwkJfQorCQllbHNlCisJCQlkcCA9IHNwOworCQlyc1tpXS5zcmMgPSBzcDsKKwkJcnNbaV0uZHN0ID0gZHA7CisJfQorCXJzW25yX3JlZnNwZWNdLnNyYyA9IHJzW25yX3JlZnNwZWNdLmRzdCA9IE5VTEw7CisJcmV0dXJuIHJzOworfQorCitzdGF0aWMgaW50IGNvdW50X3JlZnNwZWNfbWF0Y2goY29uc3QgY2hhciAqcGF0dGVybiwKKwkJCSAgICAgICBzdHJ1Y3QgcmVmICpyZWZzLAorCQkJICAgICAgIHN0cnVjdCByZWYgKiptYXRjaGVkX3JlZikKK3sKKwlpbnQgbWF0Y2g7CisJaW50IHBhdGxlbiA9IHN0cmxlbihwYXR0ZXJuKTsKKworCWZvciAobWF0Y2ggPSAwOyByZWZzOyByZWZzID0gcmVmcy0+bmV4dCkgeworCQljaGFyICpuYW1lID0gcmVmcy0+bmFtZTsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChuYW1lbGVuIDwgcGF0bGVuIHx8CisJCSAgICBtZW1jbXAobmFtZSArIG5hbWVsZW4gLSBwYXRsZW4sIHBhdHRlcm4sIHBhdGxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKG5hbWVsZW4gIT0gcGF0bGVuICYmIG5hbWVbbmFtZWxlbiAtIHBhdGxlbiAtIDFdICE9ICcvJykKKwkJCWNvbnRpbnVlOworCQltYXRjaCsrOworCQkqbWF0Y2hlZF9yZWYgPSByZWZzOworCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfZHN0X3RhaWwoc3RydWN0IHJlZiAqcmVmLCBzdHJ1Y3QgcmVmICoqKnRhaWwpCit7CisJKip0YWlsID0gcmVmOworCSp0YWlsID0gJnJlZi0+bmV4dDsKKwkqKnRhaWwgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHJlZiAqdHJ5X2V4cGxpY2l0X29iamVjdF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IGxlbjsKKwlpZiAoZ2V0X3NoYTEobmFtZSwgc2hhMSkpCisJCXJldHVybiBOVUxMOworCWxlbiA9IHN0cmxlbihuYW1lKSArIDE7CisJcmVmID0geGNhbGxvYygxLCBzaXplb2YoKnJlZikgKyBsZW4pOworCW1lbWNweShyZWYtPm5hbWUsIG5hbWUsIGxlbik7CisJbWVtY3B5KHJlZi0+bmV3X3NoYTEsIHNoYTEsIDIwKTsKKwlyZXR1cm4gcmVmOworfQorCitzdGF0aWMgaW50IG1hdGNoX2V4cGxpY2l0X3JlZnMoc3RydWN0IHJlZiAqc3JjLCBzdHJ1Y3QgcmVmICpkc3QsCisJCQkgICAgICAgc3RydWN0IHJlZiAqKipkc3RfdGFpbCwgc3RydWN0IHJlZnNwZWMgKnJzKQoreworCWludCBpLCBlcnJzOworCWZvciAoaSA9IGVycnMgPSAwOyByc1tpXS5zcmM7IGkrKykgeworCQlzdHJ1Y3QgcmVmICptYXRjaGVkX3NyYywgKm1hdGNoZWRfZHN0OworCisJCW1hdGNoZWRfc3JjID0gbWF0Y2hlZF9kc3QgPSBOVUxMOworCQlzd2l0Y2ggKGNvdW50X3JlZnNwZWNfbWF0Y2gocnNbaV0uc3JjLCBzcmMsICZtYXRjaGVkX3NyYykpIHsKKwkJY2FzZSAxOgorCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCS8qIFRoZSBzb3VyY2UgY291bGQgYmUgaW4gdGhlIGdldF9zaGExKCkgZm9ybWF0CisJCQkgKiBub3QgYSByZWZlcmVuY2UgbmFtZS4KKwkJCSAqLworCQkJbWF0Y2hlZF9zcmMgPSB0cnlfZXhwbGljaXRfb2JqZWN0X25hbWUocnNbaV0uc3JjKTsKKwkJCWlmIChtYXRjaGVkX3NyYykKKwkJCQlicmVhazsKKwkJCWVycnMgPSAxOworCQkJZXJyb3IoInNyYyByZWZzcGVjICVzIGRvZXMgbm90IG1hdGNoIGFueS4iLAorCQkJICAgICAgcnNbaV0uc3JjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJycyA9IDE7CisJCQllcnJvcigic3JjIHJlZnNwZWMgJXMgbWF0Y2hlcyBtb3JlIHRoYW4gb25lLiIsCisJCQkgICAgICByc1tpXS5zcmMpOworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChjb3VudF9yZWZzcGVjX21hdGNoKHJzW2ldLmRzdCwgZHN0LCAmbWF0Y2hlZF9kc3QpKSB7CisJCWNhc2UgMToKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlpZiAoIW1lbWNtcChyc1tpXS5kc3QsICJyZWZzLyIsIDUpKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihyc1tpXS5kc3QpICsgMTsKKwkJCQltYXRjaGVkX2RzdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpkc3QpICsgbGVuKTsKKwkJCQltZW1jcHkobWF0Y2hlZF9kc3QtPm5hbWUsIHJzW2ldLmRzdCwgbGVuKTsKKwkJCQlsaW5rX2RzdF90YWlsKG1hdGNoZWRfZHN0LCBkc3RfdGFpbCk7CisJCQl9CisJCQllbHNlIGlmICghc3RyY21wKHJzW2ldLnNyYywgcnNbaV0uZHN0KSAmJgorCQkJCSBtYXRjaGVkX3NyYykgeworCQkJCS8qIHB1c2hpbmcgIm1hc3RlcjptYXN0ZXIiIHdoZW4KKwkJCQkgKiByZW1vdGUgZG9lcyBub3QgaGF2ZSBtYXN0ZXIgeWV0LgorCQkJCSAqLworCQkJCWludCBsZW4gPSBzdHJsZW4obWF0Y2hlZF9zcmMtPm5hbWUpICsgMTsKKwkJCQltYXRjaGVkX2RzdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpkc3QpICsgbGVuKTsKKwkJCQltZW1jcHkobWF0Y2hlZF9kc3QtPm5hbWUsIG1hdGNoZWRfc3JjLT5uYW1lLAorCQkJCSAgICAgICBsZW4pOworCQkJCWxpbmtfZHN0X3RhaWwobWF0Y2hlZF9kc3QsIGRzdF90YWlsKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWVycnMgPSAxOworCQkJCWVycm9yKCJkc3QgcmVmc3BlYyAlcyBkb2VzIG5vdCBtYXRjaCBhbnkgIgorCQkJCSAgICAgICJleGlzdGluZyByZWYgb24gdGhlIHJlbW90ZSBhbmQgZG9lcyAiCisJCQkJICAgICAgIm5vdCBzdGFydCB3aXRoIHJlZnMvLiIsIHJzW2ldLmRzdCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycnMgPSAxOworCQkJZXJyb3IoImRzdCByZWZzcGVjICVzIG1hdGNoZXMgbW9yZSB0aGFuIG9uZS4iLAorCQkJICAgICAgcnNbaV0uZHN0KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlcnJzKQorCQkJY29udGludWU7CisJCWlmIChtYXRjaGVkX2RzdC0+cGVlcl9yZWYpIHsKKwkJCWVycnMgPSAxOworCQkJZXJyb3IoImRzdCByZWYgJXMgcmVjZWl2ZXMgZnJvbSBtb3JlIHRoYW4gb25lIHNyYy4iLAorCQkJICAgICAgbWF0Y2hlZF9kc3QtPm5hbWUpOworCQl9CisJCWVsc2UgeworCQkJbWF0Y2hlZF9kc3QtPnBlZXJfcmVmID0gbWF0Y2hlZF9zcmM7CisJCQltYXRjaGVkX2RzdC0+Zm9yY2UgPSByc1tpXS5mb3JjZTsKKwkJfQorCX0KKwlyZXR1cm4gLWVycnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpmaW5kX3JlZl9ieV9uYW1lKHN0cnVjdCByZWYgKmxpc3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZm9yICggOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkKKwkJaWYgKCFzdHJjbXAobGlzdC0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gbGlzdDsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IG1hdGNoX3JlZnMoc3RydWN0IHJlZiAqc3JjLCBzdHJ1Y3QgcmVmICpkc3QsIHN0cnVjdCByZWYgKioqZHN0X3RhaWwsCisJICAgICAgIGludCBucl9yZWZzcGVjLCBjaGFyICoqcmVmc3BlYywgaW50IGFsbCkKK3sKKwlzdHJ1Y3QgcmVmc3BlYyAqcnMgPSBwYXJzZV9yZWZfc3BlYyhucl9yZWZzcGVjLCByZWZzcGVjKTsKKworCWlmIChucl9yZWZzcGVjKQorCQlyZXR1cm4gbWF0Y2hfZXhwbGljaXRfcmVmcyhzcmMsIGRzdCwgZHN0X3RhaWwsIHJzKTsKKworCS8qIHBpY2sgdGhlIHJlbWFpbmRlciAqLworCWZvciAoIDsgc3JjOyBzcmMgPSBzcmMtPm5leHQpIHsKKwkJc3RydWN0IHJlZiAqZHN0X3BlZXI7CisJCWlmIChzcmMtPnBlZXJfcmVmKQorCQkJY29udGludWU7CisJCWRzdF9wZWVyID0gZmluZF9yZWZfYnlfbmFtZShkc3QsIHNyYy0+bmFtZSk7CisJCWlmICgoZHN0X3BlZXIgJiYgZHN0X3BlZXItPnBlZXJfcmVmKSB8fCAoIWRzdF9wZWVyICYmICFhbGwpKQorCQkJY29udGludWU7CisJCWlmICghZHN0X3BlZXIpIHsKKwkJCS8qIENyZWF0ZSBhIG5ldyBvbmUgYW5kIGxpbmsgaXQgKi8KKwkJCWludCBsZW4gPSBzdHJsZW4oc3JjLT5uYW1lKSArIDE7CisJCQlkc3RfcGVlciA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpkc3RfcGVlcikgKyBsZW4pOworCQkJbWVtY3B5KGRzdF9wZWVyLT5uYW1lLCBzcmMtPm5hbWUsIGxlbik7CisJCQltZW1jcHkoZHN0X3BlZXItPm5ld19zaGExLCBzcmMtPm5ld19zaGExLCAyMCk7CisJCQlsaW5rX2RzdF90YWlsKGRzdF9wZWVyLCBkc3RfdGFpbCk7CisJCX0KKwkJZHN0X3BlZXItPnBlZXJfcmVmID0gc3JjOworCX0KKwlyZXR1cm4gMDsKK30KKworZW51bSBwcm90b2NvbCB7CisJUFJPVE9fTE9DQUwgPSAxLAorCVBST1RPX1NTSCwKKwlQUk9UT19HSVQsCit9OworCitzdGF0aWMgZW51bSBwcm90b2NvbCBnZXRfcHJvdG9jb2woY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIXN0cmNtcChuYW1lLCAic3NoIikpCisJCXJldHVybiBQUk9UT19TU0g7CisJaWYgKCFzdHJjbXAobmFtZSwgImdpdCIpKQorCQlyZXR1cm4gUFJPVE9fR0lUOworCWlmICghc3RyY21wKG5hbWUsICJnaXQrc3NoIikpCisJCXJldHVybiBQUk9UT19TU0g7CisJaWYgKCFzdHJjbXAobmFtZSwgInNzaCtnaXQiKSkKKwkJcmV0dXJuIFBST1RPX1NTSDsKKwlkaWUoIkkgZG9uJ3QgaGFuZGxlIHByb3RvY29sICclcyciLCBuYW1lKTsKK30KKworI2RlZmluZSBTVFJfKHMpCSMgcworI2RlZmluZSBTVFIocykJU1RSXyhzKQorCisjaWZuZGVmIE5PX0lQVjYKKworLyoKKyAqIFJldHVybnMgYSBjb25uZWN0ZWQgc29ja2V0KCkgZmQsIG9yIGVsc2UgZGllKClzLgorICovCitzdGF0aWMgaW50IGdpdF90Y3BfY29ubmVjdF9zb2NrKGNoYXIgKmhvc3QpCit7CisJaW50IHNvY2tmZCA9IC0xOworCWNoYXIgKmNvbG9uLCAqZW5kOworCWNoYXIgKnBvcnQgPSBTVFIoREVGQVVMVF9HSVRfUE9SVCk7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWkwLCAqYWk7CisJaW50IGdhaTsKKworCWlmIChob3N0WzBdID09ICdbJykgeworCQllbmQgPSBzdHJjaHIoaG9zdCArIDEsICddJyk7CisJCWlmIChlbmQpIHsKKwkJCSplbmQgPSAwOworCQkJZW5kKys7CisJCQlob3N0Kys7CisJCX0gZWxzZQorCQkJZW5kID0gaG9zdDsKKwl9IGVsc2UKKwkJZW5kID0gaG9zdDsKKwljb2xvbiA9IHN0cmNocihlbmQsICc6Jyk7CisKKwlpZiAoY29sb24pIHsKKwkJKmNvbG9uID0gMDsKKwkJcG9ydCA9IGNvbG9uICsgMTsKKwl9CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCWhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisKKwlnYWkgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZhaSk7CisJaWYgKGdhaSkKKwkJZGllKCJVbmFibGUgdG8gbG9vayB1cCAlcyAoJXMpIiwgaG9zdCwgZ2FpX3N0cmVycm9yKGdhaSkpOworCisJZm9yIChhaTAgPSBhaTsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJc29ja2ZkID0gc29ja2V0KGFpLT5haV9mYW1pbHksCisJCQkJYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCQlpZiAoc29ja2ZkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY29ubmVjdChzb2NrZmQsIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbikgPCAwKSB7CisJCQljbG9zZShzb2NrZmQpOworCQkJc29ja2ZkID0gLTE7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlmcmVlYWRkcmluZm8oYWkwKTsKKworCWlmIChzb2NrZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjb25uZWN0IGEgc29ja2V0ICglcykiLCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIHNvY2tmZDsKK30KKworI2Vsc2UgLyogTk9fSVBWNiAqLworCisvKgorICogUmV0dXJucyBhIGNvbm5lY3RlZCBzb2NrZXQoKSBmZCwgb3IgZWxzZSBkaWUoKXMuCisgKi8KK3N0YXRpYyBpbnQgZ2l0X3RjcF9jb25uZWN0X3NvY2soY2hhciAqaG9zdCkKK3sKKwlpbnQgc29ja2ZkID0gLTE7CisJY2hhciAqY29sb24sICplbmQ7CisJY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKSwgKmVwOworCXN0cnVjdCBob3N0ZW50ICpoZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJY2hhciAqKmFwOworCXVuc2lnbmVkIGludCBucG9ydDsKKworCWlmIChob3N0WzBdID09ICdbJykgeworCQllbmQgPSBzdHJjaHIoaG9zdCArIDEsICddJyk7CisJCWlmIChlbmQpIHsKKwkJCSplbmQgPSAwOworCQkJZW5kKys7CisJCQlob3N0Kys7CisJCX0gZWxzZQorCQkJZW5kID0gaG9zdDsKKwl9IGVsc2UKKwkJZW5kID0gaG9zdDsKKwljb2xvbiA9IHN0cmNocihlbmQsICc6Jyk7CisKKwlpZiAoY29sb24pIHsKKwkJKmNvbG9uID0gMDsKKwkJcG9ydCA9IGNvbG9uICsgMTsKKwl9CisKKwloZSA9IGdldGhvc3RieW5hbWUoaG9zdCk7CisJaWYgKCFoZSkKKwkJZGllKCJVbmFibGUgdG8gbG9vayB1cCAlcyAoJXMpIiwgaG9zdCwgaHN0cmVycm9yKGhfZXJybm8pKTsKKwlucG9ydCA9IHN0cnRvdWwocG9ydCwgJmVwLCAxMCk7CisJaWYgKCBlcCA9PSBwb3J0IHx8ICplcCApIHsKKwkJLyogTm90IG51bWVyaWMgKi8KKwkJc3RydWN0IHNlcnZlbnQgKnNlID0gZ2V0c2VydmJ5bmFtZShwb3J0LCJ0Y3AiKTsKKwkJaWYgKCAhc2UgKQorCQkJZGllKCJVbmtub3duIHBvcnQgJXNcbiIsIHBvcnQpOworCQlucG9ydCA9IHNlLT5zX3BvcnQ7CisJfQorCisJZm9yIChhcCA9IGhlLT5oX2FkZHJfbGlzdDsgKmFwOyBhcCsrKSB7CisJCXNvY2tmZCA9IHNvY2tldChoZS0+aF9hZGRydHlwZSwgU09DS19TVFJFQU0sIDApOworCQlpZiAoc29ja2ZkIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCW1lbXNldCgmc2EsIDAsIHNpemVvZiBzYSk7CisJCXNhLnNpbl9mYW1pbHkgPSBoZS0+aF9hZGRydHlwZTsKKwkJc2Euc2luX3BvcnQgPSBodG9ucyhucG9ydCk7CisJCW1lbWNweSgmc2Euc2luX2FkZHIsICphcCwgaGUtPmhfbGVuZ3RoKTsKKworCQlpZiAoY29ubmVjdChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZiBzYSkgPCAwKSB7CisJCQljbG9zZShzb2NrZmQpOworCQkJc29ja2ZkID0gLTE7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoc29ja2ZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCBhIHNvY2tldCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJldHVybiBzb2NrZmQ7Cit9CisKKyNlbmRpZiAvKiBOT19JUFY2ICovCisKKworc3RhdGljIHZvaWQgZ2l0X3RjcF9jb25uZWN0KGludCBmZFsyXSwKKwkJCSAgICBjb25zdCBjaGFyICpwcm9nLCBjaGFyICpob3N0LCBjaGFyICpwYXRoKQoreworCWludCBzb2NrZmQgPSBnaXRfdGNwX2Nvbm5lY3Rfc29jayhob3N0KTsKKworCWZkWzBdID0gc29ja2ZkOworCWZkWzFdID0gc29ja2ZkOworfQorCisKK3N0YXRpYyBjaGFyICpnaXRfcHJveHlfY29tbWFuZCA9IE5VTEw7CitzdGF0aWMgY29uc3QgY2hhciAqcmhvc3RfbmFtZSA9IE5VTEw7CitzdGF0aWMgaW50IHJob3N0X2xlbjsKKworc3RhdGljIGludCBnaXRfcHJveHlfY29tbWFuZF9vcHRpb25zKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5naXRwcm94eSIpKSB7CisJCWNvbnN0IGNoYXIgKmZvcl9wb3M7CisJCWludCBtYXRjaGxlbiA9IC0xOworCQlpbnQgaG9zdGxlbjsKKworCQlpZiAoZ2l0X3Byb3h5X2NvbW1hbmQpCisJCQlyZXR1cm4gMDsKKwkJLyogW2NvcmVdCisJCSAqIDsjIG1hdGNoZXMgd3d3Lmtlcm5lbC5vcmcgYXMgd2VsbAorCQkgKiBnaXRwcm94eSA9IG5ldGNhdHRlci0xIGZvciBrZXJuZWwub3JnCisJCSAqIGdpdHByb3h5ID0gbmV0Y2F0dGVyLTIgZm9yIHNhbXBsZS54egorCQkgKiBnaXRwcm94eSA9IG5ldGNhdHRlci1kZWZhdWx0CisJCSAqLworCQlmb3JfcG9zID0gc3Ryc3RyKHZhbHVlLCAiIGZvciAiKTsKKwkJaWYgKCFmb3JfcG9zKQorCQkJLyogbWF0Y2hlcyBldmVyeWJvZHkgKi8KKwkJCW1hdGNobGVuID0gc3RybGVuKHZhbHVlKTsKKwkJZWxzZSB7CisJCQlob3N0bGVuID0gc3RybGVuKGZvcl9wb3MgKyA1KTsKKwkJCWlmIChyaG9zdF9sZW4gPCBob3N0bGVuKQorCQkJCW1hdGNobGVuID0gLTE7CisJCQllbHNlIGlmICghc3RybmNtcChmb3JfcG9zICsgNSwKKwkJCQkJICByaG9zdF9uYW1lICsgcmhvc3RfbGVuIC0gaG9zdGxlbiwKKwkJCQkJICBob3N0bGVuKSAmJgorCQkJCSAoKHJob3N0X2xlbiA9PSBob3N0bGVuKSB8fAorCQkJCSAgcmhvc3RfbmFtZVtyaG9zdF9sZW4gLSBob3N0bGVuIC0xXSA9PSAnLicpKQorCQkJCW1hdGNobGVuID0gZm9yX3BvcyAtIHZhbHVlOworCQkJZWxzZQorCQkJCW1hdGNobGVuID0gLTE7CisJCX0KKwkJaWYgKDAgPD0gbWF0Y2hsZW4pIHsKKwkJCS8qIGNvcmUuZ2l0cHJveHkgPSBub25lIGZvciBrZXJuZWwub3JnICovCisJCQlpZiAobWF0Y2hsZW4gPT0gNCAmJiAKKwkJCSAgICAhbWVtY21wKHZhbHVlLCAibm9uZSIsIDQpKQorCQkJCW1hdGNobGVuID0gMDsKKwkJCWdpdF9wcm94eV9jb21tYW5kID0geG1hbGxvYyhtYXRjaGxlbiArIDEpOworCQkJbWVtY3B5KGdpdF9wcm94eV9jb21tYW5kLCB2YWx1ZSwgbWF0Y2hsZW4pOworCQkJZ2l0X3Byb3h5X2NvbW1hbmRbbWF0Y2hsZW5dID0gMDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdpdF91c2VfcHJveHkoY29uc3QgY2hhciAqaG9zdCkKK3sKKwlyaG9zdF9uYW1lID0gaG9zdDsKKwlyaG9zdF9sZW4gPSBzdHJsZW4oaG9zdCk7CisJZ2l0X3Byb3h5X2NvbW1hbmQgPSBnZXRlbnYoIkdJVF9QUk9YWV9DT01NQU5EIik7CisJZ2l0X2NvbmZpZyhnaXRfcHJveHlfY29tbWFuZF9vcHRpb25zKTsKKwlyaG9zdF9uYW1lID0gTlVMTDsKKwlyZXR1cm4gKGdpdF9wcm94eV9jb21tYW5kICYmICpnaXRfcHJveHlfY29tbWFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIGdpdF9wcm94eV9jb25uZWN0KGludCBmZFsyXSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByb2csIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgpCit7CisJY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKwljaGFyICpjb2xvbiwgKmVuZDsKKwlpbnQgcGlwZWZkWzJdWzJdOworCXBpZF90IHBpZDsKKworCWlmIChob3N0WzBdID09ICdbJykgeworCQllbmQgPSBzdHJjaHIoaG9zdCArIDEsICddJyk7CisJCWlmIChlbmQpIHsKKwkJCSplbmQgPSAwOworCQkJZW5kKys7CisJCQlob3N0Kys7CisJCX0gZWxzZQorCQkJZW5kID0gaG9zdDsKKwl9IGVsc2UKKwkJZW5kID0gaG9zdDsKKwljb2xvbiA9IHN0cmNocihlbmQsICc6Jyk7CisKKwlpZiAoY29sb24pIHsKKwkJKmNvbG9uID0gMDsKKwkJcG9ydCA9IGNvbG9uICsgMTsKKwl9CisKKwlpZiAocGlwZShwaXBlZmRbMF0pIDwgMCB8fCBwaXBlKHBpcGVmZFsxXSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgcGlwZSBwYWlyIGZvciBjb21tdW5pY2F0aW9uIik7CisJcGlkID0gZm9yaygpOworCWlmICghcGlkKSB7CisJCWR1cDIocGlwZWZkWzFdWzBdLCAwKTsKKwkJZHVwMihwaXBlZmRbMF1bMV0sIDEpOworCQljbG9zZShwaXBlZmRbMF1bMF0pOworCQljbG9zZShwaXBlZmRbMF1bMV0pOworCQljbG9zZShwaXBlZmRbMV1bMF0pOworCQljbG9zZShwaXBlZmRbMV1bMV0pOworCQlleGVjbHAoZ2l0X3Byb3h5X2NvbW1hbmQsIGdpdF9wcm94eV9jb21tYW5kLCBob3N0LCBwb3J0LCBOVUxMKTsKKwkJZGllKCJleGVjIGZhaWxlZCIpOworCX0KKwlpZiAocGlkIDwgMCkKKwkJZGllKCJmb3JrIGZhaWxlZCIpOworCWZkWzBdID0gcGlwZWZkWzBdWzBdOworCWZkWzFdID0gcGlwZWZkWzFdWzFdOworCWNsb3NlKHBpcGVmZFswXVsxXSk7CisJY2xvc2UocGlwZWZkWzFdWzBdKTsKK30KKworLyoKKyAqIFllYWgsIHllYWgsIGZpeG1lLiBOZWVkIHRvIHBhc3MgaW4gdGhlIGhlYWRzIGV0Yy4KKyAqLworaW50IGdpdF9jb25uZWN0KGludCBmZFsyXSwgY2hhciAqdXJsLCBjb25zdCBjaGFyICpwcm9nKQoreworCWNoYXIgY29tbWFuZFsxMDI0XTsKKwljaGFyICpob3N0LCAqcGF0aCA9IHVybDsKKwljaGFyICplbmQ7CisJaW50IGM7CisJaW50IHBpcGVmZFsyXVsyXTsKKwlwaWRfdCBwaWQ7CisJZW51bSBwcm90b2NvbCBwcm90b2NvbCA9IFBST1RPX0xPQ0FMOworCWludCBmcmVlX3BhdGggPSAwOworCisJaG9zdCA9IHN0cnN0cih1cmwsICI6Ly8iKTsKKwlpZihob3N0KSB7CisJCSpob3N0ID0gJ1wwJzsKKwkJcHJvdG9jb2wgPSBnZXRfcHJvdG9jb2wodXJsKTsKKwkJaG9zdCArPSAzOworCQljID0gJy8nOworCX0gZWxzZSB7CisJCWhvc3QgPSB1cmw7CisJCWMgPSAnOic7CisJfQorCisJaWYgKGhvc3RbMF0gPT0gJ1snKSB7CisJCWVuZCA9IHN0cmNocihob3N0ICsgMSwgJ10nKTsKKwkJaWYgKGVuZCkgeworCQkJKmVuZCA9IDA7CisJCQllbmQrKzsKKwkJCWhvc3QrKzsKKwkJfSBlbHNlCisJCQllbmQgPSBob3N0OworCX0gZWxzZQorCQllbmQgPSBob3N0OworCisJcGF0aCA9IHN0cmNocihlbmQsIGMpOworCWlmIChjID09ICc6JykgeworCQlpZiAocGF0aCkgeworCQkJcHJvdG9jb2wgPSBQUk9UT19TU0g7CisJCQkqcGF0aCsrID0gJ1wwJzsKKwkJfSBlbHNlCisJCQlwYXRoID0gaG9zdDsKKwl9CisKKwlpZiAoIXBhdGggfHwgISpwYXRoKQorCQlkaWUoIk5vIHBhdGggc3BlY2lmaWVkLiBTZWUgJ21hbiBnaXQtcHVsbCcgZm9yIHZhbGlkIHVybCBzeW50YXgiKTsKKworCS8qCisJICogbnVsbC10ZXJtaW5hdGUgaG9zdG5hbWUgYW5kIHBvaW50IHBhdGggdG8gfiBmb3IgVVJMJ3MgbGlrZSB0aGlzOgorCSAqICAgIHNzaDovL2hvc3QueHovfnVzZXIvcmVwbworCSAqLworCWlmIChwcm90b2NvbCAhPSBQUk9UT19MT0NBTCAmJiBob3N0ICE9IHVybCkgeworCQljaGFyICpwdHIgPSBwYXRoOworCQlpZiAocGF0aFsxXSA9PSAnficpCisJCQlwYXRoKys7CisJCWVsc2UgeworCQkJcGF0aCA9IHN0cmR1cChwdHIpOworCQkJZnJlZV9wYXRoID0gMTsKKwkJfQorCisJCSpwdHIgPSAnXDAnOworCX0KKworCWlmIChwcm90b2NvbCA9PSBQUk9UT19HSVQpIHsKKwkJLyogVGhlc2UgdW5kZXJseWluZyBjb25uZWN0aW9uIGNvbW1hbmRzIGRpZSgpIGlmIHRoZXkKKwkJICogY2Fubm90IGNvbm5lY3QuCisJCSAqLworCQljaGFyICp0YXJnZXRfaG9zdCA9IHN0cmR1cChob3N0KTsKKwkJaWYgKGdpdF91c2VfcHJveHkoaG9zdCkpCisJCQlnaXRfcHJveHlfY29ubmVjdChmZCwgcHJvZywgaG9zdCwgcGF0aCk7CisJCWVsc2UKKwkJCWdpdF90Y3BfY29ubmVjdChmZCwgcHJvZywgaG9zdCwgcGF0aCk7CisJCS8qCisJCSAqIFNlcGFyYXRlIG9yaWdpbmFsIHByb3RvY29sIGNvbXBvbmVudHMgcHJvZyBhbmQgcGF0aAorCQkgKiBmcm9tIGV4dGVuZGVkIGNvbXBvbmVudHMgd2l0aCBhIE5VTCBieXRlLgorCQkgKi8KKwkJcGFja2V0X3dyaXRlKGZkWzFdLAorCQkJICAgICAiJXMgJXMlY2hvc3Q9JXMlYyIsCisJCQkgICAgIHByb2csIHBhdGgsIDAsCisJCQkgICAgIHRhcmdldF9ob3N0LCAwKTsKKwkJZnJlZSh0YXJnZXRfaG9zdCk7CisJCWlmIChmcmVlX3BhdGgpCisJCQlmcmVlKHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGlwZShwaXBlZmRbMF0pIDwgMCB8fCBwaXBlKHBpcGVmZFsxXSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgcGlwZSBwYWlyIGZvciBjb21tdW5pY2F0aW9uIik7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBmb3JrIik7CisJaWYgKCFwaWQpIHsKKwkJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAiJXMgJXMiLCBwcm9nLAorCQkJIHNxX3F1b3RlKHBhdGgpKTsKKwkJZHVwMihwaXBlZmRbMV1bMF0sIDApOworCQlkdXAyKHBpcGVmZFswXVsxXSwgMSk7CisJCWNsb3NlKHBpcGVmZFswXVswXSk7CisJCWNsb3NlKHBpcGVmZFswXVsxXSk7CisJCWNsb3NlKHBpcGVmZFsxXVswXSk7CisJCWNsb3NlKHBpcGVmZFsxXVsxXSk7CisJCWlmIChwcm90b2NvbCA9PSBQUk9UT19TU0gpIHsKKwkJCWNvbnN0IGNoYXIgKnNzaCwgKnNzaF9iYXNlbmFtZTsKKwkJCXNzaCA9IGdldGVudigiR0lUX1NTSCIpOworCQkJaWYgKCFzc2gpIHNzaCA9ICJzc2giOworCQkJc3NoX2Jhc2VuYW1lID0gc3RycmNocihzc2gsICcvJyk7CisJCQlpZiAoIXNzaF9iYXNlbmFtZSkKKwkJCQlzc2hfYmFzZW5hbWUgPSBzc2g7CisJCQllbHNlCisJCQkJc3NoX2Jhc2VuYW1lKys7CisJCQlleGVjbHAoc3NoLCBzc2hfYmFzZW5hbWUsIGhvc3QsIGNvbW1hbmQsIE5VTEwpOworCQl9CisJCWVsc2UgeworCQkJdW5zZXRlbnYoQUxURVJOQVRFX0RCX0VOVklST05NRU5UKTsKKwkJCXVuc2V0ZW52KERCX0VOVklST05NRU5UKTsKKwkJCXVuc2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpOworCQkJdW5zZXRlbnYoR1JBRlRfRU5WSVJPTk1FTlQpOworCQkJdW5zZXRlbnYoSU5ERVhfRU5WSVJPTk1FTlQpOworCQkJZXhlY2xwKCJzaCIsICJzaCIsICItYyIsIGNvbW1hbmQsIE5VTEwpOworCQl9CisJCWRpZSgiZXhlYyBmYWlsZWQiKTsKKwl9CisJZmRbMF0gPSBwaXBlZmRbMF1bMF07CisJZmRbMV0gPSBwaXBlZmRbMV1bMV07CisJY2xvc2UocGlwZWZkWzBdWzFdKTsKKwljbG9zZShwaXBlZmRbMV1bMF0pOworCWlmIChmcmVlX3BhdGgpCisJCWZyZWUocGF0aCk7CisJcmV0dXJuIHBpZDsKK30KKworaW50IGZpbmlzaF9jb25uZWN0KHBpZF90IHBpZCkKK3sKKwlpbnQgcmV0OworCisJZm9yICg7OykgeworCQlyZXQgPSB3YWl0cGlkKHBpZCwgTlVMTCwgMCk7CisJCWlmICghcmV0KQorCQkJYnJlYWs7CisJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SRUFETUUgYi9jb250cmliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMwYTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SRUFETUUKQEAgLTAsMCArMSw0NCBAQAorQ29udHJpYnV0ZWQgU29mdHdhcmUKKworQWx0aG91Z2ggdGhlc2UgcGllY2VzIGFyZSBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgb2ZmaWNpYWwgZ2l0Citzb3VyY2UgdHJlZSwgdGhleSBhcmUgaW4gc29tZXdoYXQgZGlmZmVyZW50IHN0YXR1cy4gIFRoZQoraW50ZW50aW9uIGlzIHRvIGtlZXAgaW50ZXJlc3RpbmcgdG9vbHMgYXJvdW5kIGdpdCBoZXJlLCBtYXliZQorZXZlbiBleHBlcmltZW50YWwgb25lcywgdG8gZ2l2ZSB1c2VycyBhbiBlYXNpZXIgYWNjZXNzIHRvIHRoZW0sCithbmQgdG8gZ2l2ZSB0b29scyB3aWRlciBleHBvc3VyZSwgc28gdGhhdCB0aGV5IGNhbiBiZSBpbXByb3ZlZAorZmFzdGVyLgorCitJIGFtIG5vdCBleHBlY3RpbmcgdG8gdG91Y2ggdGhlc2UgbXlzZWxmIHRoYXQgbXVjaC4gIEFzIGZhciBhcworbXkgZGF5LXRvLWRheSBvcGVyYXRpb24gaXMgY29uY2VybmVkLCB0aGVzZSBzdWJkaXJlY3RvcmllcyBhcmUKK293bmVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgcHJpbWFyeSBhdXRob3JzLiAgSSBhbSB3aWxsaW5nIHRvIGhlbHAKK2lmIHVzZXJzIG9mIHRoZXNlIGNvbXBvbmVudHMgYW5kIHRoZSBjb250cmliLyBzdWJ0cmVlICJvd25lcnMiCitoYXZlIHRlY2huaWNhbC9kZXNpZ24gaXNzdWVzIHRvIHJlc29sdmUsIGJ1dCB0aGUgaW5pdGlhdGl2ZSB0bworZml4IGFuZC9vciBlbmhhbmNlIHRoaW5ncyBfbXVzdF8gYmUgb24gdGhlIHNpZGUgb2YgdGhlIHN1YnRyZWUKK293bmVycy4gIElPVywgSSB3b24ndCBiZSBhY3RpdmVseSBsb29raW5nIGZvciBidWdzIGFuZCByb29tcyBmb3IKK2VuaGFuY2VtZW50cyBpbiB0aGVtIGFzIHRoZSBnaXQgbWFpbnRhaW5lciAtLSBJIG1heSBvbmx5IGRvIHNvCitqdXN0IGFzIG9uZSBvZiB0aGUgdXNlcnMgd2hlbiBJIHdhbnQgdG8gc2NyYXRjaCBteSBvd24gaXRjaC4gIElmCit5b3UgaGF2ZSBwYXRjaGVzIHRvIHRoaW5ncyBpbiBjb250cmliLyBhcmVhLCB0aGUgcGF0Y2ggc2hvdWxkIGJlCitmaXJzdCBzZW50IHRvIHRoZSBwcmltYXJ5IGF1dGhvciwgYW5kIHRoZW4gdGhlIHByaW1hcnkgYXV0aG9yCitzaG91bGQgYWNrIGFuZCBmb3J3YXJkIGl0IHRvIG1lIChnaXQgcHVsbCByZXF1ZXN0IGlzIG5pY2VyKS4KK1RoaXMgaXMgdGhlIHNhbWUgd2F5IGFzIGhvdyBJIGhhdmUgYmVlbiB0cmVhdGluZyBnaXRrLCBhbmQgdG8gYQorbGVzc2VyIGRlZ3JlZSB2YXJpb3VzIGZvcmVpZ24gU0NNIGludGVyZmFjZXMsIHNvIHlvdSBrbm93IHRoZQorZHJpbGwuCisKK0kgZXhwZWN0IHRoYXQgdGhpbmdzIHRoYXQgc3RhcnQgdGhlaXIgbGlmZSBpbiB0aGUgY29udHJpYi8gYXJlYQordG8gZ3JhZHVhdGUgb3V0IG9mIGNvbnRyaWIvIG9uY2UgdGhleSBtYXR1cmUsIGVpdGhlciBieSBiZWNvbWluZworcHJvamVjdHMgb24gdGhlaXIgb3duLCBvciBtb3ZpbmcgdG8gdGhlIHRvcGxldmVsIGRpcmVjdG9yeS4gIE9uCit0aGUgb3RoZXIgaGFuZCwgSSBleHBlY3QgSSdsbCBiZSBwcm9wb3NpbmcgcmVtb3ZhbCBvZiBkaXN1c2VkCithbmQgaW5hY3RpdmUgb25lcyBmcm9tIHRpbWUgdG8gdGltZS4KKworSWYgeW91IGhhdmUgbmV3IHRoaW5ncyB0byBhZGQgdG8gdGhpcyBhcmVhLCBwbGVhc2UgZmlyc3QgcHJvcG9zZQoraXQgb24gdGhlIGdpdCBtYWlsaW5nIGxpc3QsIGFuZCBhZnRlciBhIGxpc3QgZGlzY3Vzc2lvbiBwcm92ZXMKK3RoZXJlIGFyZSBzb21lIGdlbmVyYWwgaW50ZXJlc3RzIChpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGEKK2xpc3Qtd2lkZSBjb25zZW5zdXMgZm9yIGEgdG9vbCB0YXJnZXRlZCB0byBhIHJlbGF0aXZlbHkgbmFycm93CithdWRpZW5jZSAtLSBmb3IgZXhhbXBsZSBJIGRvIG5vdCB3b3JrIHdpdGggcHJvamVjdHMgd2hvc2UKK3Vwc3RyZWFtIGlzIHN2biwgc28gSSBoYXZlIG5vIHVzZSBmb3IgZ2l0LXN2biBteXNlbGYsIGJ1dCBpdCBpcworb2YgZ2VuZXJhbCBpbnRlcmVzdCBmb3IgcGVvcGxlIHdobyBuZWVkIHRvIGludGVyb3BlcmF0ZSB3aXRoIFNWTgorcmVwb3NpdG9yaWVzIGluIGEgd2F5IGdpdC1zdm4gd29ya3MgYmV0dGVyIHRoYW4gZ2l0LXN2bmltcG9ydCksCitzdWJtaXQgYSBwYXRjaCB0byBjcmVhdGUgYSBzdWJkaXJlY3Rvcnkgb2YgY29udHJpYi8gYW5kIHB1dCB5b3VyCitzdHVmZiB0aGVyZS4KKworLWpjCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvY29sb3JkaWZmL1JFQURNRSBiL2NvbnRyaWIvY29sb3JkaWZmL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc4ZmRmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb2xvcmRpZmYvUkVBRE1FCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBpcyAiY29sb3JkaWZmIiAoaHR0cDovL2NvbG9yZGlmZi5zb3VyY2Vmb3JnZS5uZXQvKSBieSBEYXZlCitFd2FydCA8ZGF2ZWVAc3VuZ2F0ZS5jby51az4sIG1vZGlmaWVkIHNwZWNpZmljYWxseSBmb3IgZ2l0LgpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb2xvcmRpZmYvY29sb3JkaWZmLnBlcmwgYi9jb250cmliL2NvbG9yZGlmZi9jb2xvcmRpZmYucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Nzg5Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb2xvcmRpZmYvY29sb3JkaWZmLnBlcmwKQEAgLTAsMCArMSwxOTYgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyAkSWQ6IGNvbG9yZGlmZi5wbCx2IDEuNC4yLjEwIDIwMDQvMDEvMDQgMTU6MDI6NTkgZGF2ZWV3YXJ0IEV4cCAkCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIENvbG9yRGlmZiAtIGEgd3JhcHBlci9yZXBsYWNtZW50IGZvciAnZGlmZicgcHJvZHVjaW5nICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgY29sb3VyZnVsIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIENvcHlyaWdodCAoQykyMDAyLTIwMDQgRGF2ZSBFd2FydCAoZGF2ZWVAc3VuZ2F0ZS5jby51aykgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgIworIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAjCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICMKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICMKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgIworIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAjCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAjCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICMKKyMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBwYXNzX3Rocm91Z2gpOwordXNlIElQQzo6T3BlbjI7CisKK215ICRhcHBfbmFtZSAgICAgPSAnY29sb3JkaWZmJzsKK215ICR2ZXJzaW9uICAgICAgPSAnMS4wLjQnOworbXkgJGF1dGhvciAgICAgICA9ICdEYXZlIEV3YXJ0JzsKK215ICRhdXRob3JfZW1haWwgPSAnZGF2ZWVAc3VuZ2F0ZS5jby51ayc7CitteSAkYXBwX3d3dyAgICAgID0gJ2h0dHA6Ly9jb2xvcmRpZmYuc291cmNlZm9yZ2UubmV0Lyc7CitteSAkY29weXJpZ2h0ICAgID0gJyhDKTIwMDItMjAwNCc7CitteSAkc2hvd19iYW5uZXIgID0gMTsKKworIyBBTlNJIHNlcXVlbmNlcyBmb3IgY29sb3VycworbXkgJWNvbG91cjsKKyRjb2xvdXJ7d2hpdGV9ICAgICAgID0gIlwwMzNbMTszN20iOworJGNvbG91cnt5ZWxsb3d9ICAgICAgPSAiXDAzM1sxOzMzbSI7CiskY29sb3Vye2dyZWVufSAgICAgICA9ICJcMDMzWzE7MzJtIjsKKyRjb2xvdXJ7Ymx1ZX0gICAgICAgID0gIlwwMzNbMTszNG0iOworJGNvbG91cntjeWFufSAgICAgICAgPSAiXDAzM1sxOzM2bSI7CiskY29sb3Vye3JlZH0gICAgICAgICA9ICJcMDMzWzE7MzFtIjsKKyRjb2xvdXJ7bWFnZW50YX0gICAgID0gIlwwMzNbMTszNW0iOworJGNvbG91cntibGFja30gICAgICAgPSAiXDAzM1sxOzMwbSI7CiskY29sb3Vye2Rhcmt3aGl0ZX0gICA9ICJcMDMzWzA7MzdtIjsKKyRjb2xvdXJ7ZGFya3llbGxvd30gID0gIlwwMzNbMDszM20iOworJGNvbG91cntkYXJrZ3JlZW59ICAgPSAiXDAzM1swOzMybSI7CiskY29sb3Vye2RhcmtibHVlfSAgICA9ICJcMDMzWzA7MzRtIjsKKyRjb2xvdXJ7ZGFya2N5YW59ICAgID0gIlwwMzNbMDszNm0iOworJGNvbG91cntkYXJrcmVkfSAgICAgPSAiXDAzM1swOzMxbSI7CiskY29sb3Vye2RhcmttYWdlbnRhfSA9ICJcMDMzWzA7MzVtIjsKKyRjb2xvdXJ7ZGFya2JsYWNrfSAgID0gIlwwMzNbMDszMG0iOworJGNvbG91cntPRkZ9ICAgICAgICAgPSAiXDAzM1swOzBtIjsKKworIyBEZWZhdWx0IGNvbG91cnMgaWYgL2V0Yy9jb2xvcmRpZmZyYyBvciB+Ly5jb2xvcmRpZmZyYyBkbyBub3QgZXhpc3QKK215ICRwbGFpbl90ZXh0ID0gJGNvbG91cntPRkZ9OworbXkgJGZpbGVfb2xkICAgPSAkY29sb3Vye3JlZH07CitteSAkZmlsZV9uZXcgICA9ICRjb2xvdXJ7Ymx1ZX07CitteSAkZGlmZl9zdHVmZiA9ICRjb2xvdXJ7bWFnZW50YX07CisKKyMgTG9jYXRpb25zIGZvciBwZXJzb25hbCBhbmQgc3lzdGVtLXdpZGUgY29sb3VyIGNvbmZpZ3VyYXRpb25zCitteSAkSE9NRSAgID0gJEVOVntIT01FfTsKK215ICRldGNkaXIgPSAnL2V0Yyc7CisKK215ICgkc2V0dGluZywgJHZhbHVlKTsKK215IEBjb25maWdfZmlsZXMgPSAoIiRldGNkaXIvY29sb3JkaWZmcmMiLCAiJEhPTUUvLmNvbG9yZGlmZnJjIik7CitteSAkY29uZmlnX2ZpbGU7CisKK2ZvcmVhY2ggJGNvbmZpZ19maWxlIChAY29uZmlnX2ZpbGVzKSB7CisgICAgaWYgKG9wZW4oQ09MT1JESUZGUkMsICI8JGNvbmZpZ19maWxlIikpIHsKKyAgICAgICAgd2hpbGUgKDxDT0xPUkRJRkZSQz4pIHsKKyAgICAgICAgICAgIGNob3A7CisgICAgICAgICAgICBuZXh0IGlmICgvXiMvIHx8IC9eJC8pOworICAgICAgICAgICAgcy9ccysvL2c7CisgICAgICAgICAgICAoJHNldHRpbmcsICR2YWx1ZSkgPSBzcGxpdCAoJz0nKTsKKyAgICAgICAgICAgIGlmICgkc2V0dGluZyBlcSAnYmFubmVyJykgeworICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgZXEgJ25vJykgeworICAgICAgICAgICAgICAgICAgICAkc2hvd19iYW5uZXIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjb2xvdXJ7JHZhbHVlfSkgeworICAgICAgICAgICAgICAgIHByaW50ICJJbnZhbGlkIGNvbG91ciBzcGVjaWZpY2F0aW9uICgkdmFsdWUpIGluICRjb25maWdfZmlsZVxuIjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXR0aW5nIGVxICdwbGFpbicpIHsKKyAgICAgICAgICAgICAgICAkcGxhaW5fdGV4dCA9ICRjb2xvdXJ7JHZhbHVlfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkc2V0dGluZyBlcSAnb2xkdGV4dCcpIHsKKyAgICAgICAgICAgICAgICAkZmlsZV9vbGQgPSAkY29sb3VyeyR2YWx1ZX07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJHNldHRpbmcgZXEgJ25ld3RleHQnKSB7CisgICAgICAgICAgICAgICAgJGZpbGVfbmV3ID0gJGNvbG91cnskdmFsdWV9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRzZXR0aW5nIGVxICdkaWZmc3R1ZmYnKSB7CisgICAgICAgICAgICAgICAgJGRpZmZfc3R1ZmYgPSAkY29sb3VyeyR2YWx1ZX07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludCAiVW5rbm93biBvcHRpb24gaW4gJGV0Y2Rpci9jb2xvcmRpZmZyYzogJHNldHRpbmdcbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgQ09MT1JESUZGUkM7CisgICAgfQorfQorCisjIGNvbG9yZGlmZiBzcGVjZmljIG9wdGlvbnMgaGVyZS4gIE5lZWQgdG8gcHJlLWRlY2xhcmUgaWYgdXNpbmcgdmFyaWFibGVzCitHZXRPcHRpb25zKAorICAgICJuby1iYW5uZXIiID0+IHN1YiB7ICRzaG93X2Jhbm5lciA9IDAgfSwKKyAgICAicGxhaW4tdGV4dD1zIiA9PiBcJnNldF9jb2xvciwKKyAgICAiZmlsZS1vbGQ9cyIgICA9PiBcJnNldF9jb2xvciwKKyAgICAiZmlsZS1uZXc9cyIgICA9PiBcJnNldF9jb2xvciwKKyAgICAiZGlmZi1zdHVmZj1zIiA9PiBcJnNldF9jb2xvcgorKTsKKworaWYgKCRzaG93X2Jhbm5lciA9PSAxKSB7CisgICAgcHJpbnQgU1RERVJSICIkYXBwX25hbWUgJHZlcnNpb24gKCRhcHBfd3d3KVxuIjsKKyAgICBwcmludCBTVERFUlIgIiRjb3B5cmlnaHQgJGF1dGhvciwgJGF1dGhvcl9lbWFpbFxuXG4iOworfQorCitpZiAoZGVmaW5lZCAkQVJHVlswXSkgeworICAgICMgTW9yZSByZWxpYWJsZSB3YXkgb2YgcHVsbGluZyBpbiBhcmd1bWVudHMKKyAgICBvcGVuMihcKklOUFVUU1RSRUFNLCB1bmRlZiwgImdpdCIsICJkaWZmIiwgQEFSR1YpOworfQorZWxzZSB7CisgICAgKklOUFVUU1RSRUFNID0gXCpTVERJTjsKK30KKworbXkgJHJlY29yZDsKK215ICRucmVjcyAgICAgICAgICAgPSAwOworbXkgJGluc2lkZV9maWxlX29sZCA9IDE7CitteSAkbnBhcmVudHMgICAgICAgID0gdW5kZWY7CisKK3doaWxlICg8SU5QVVRTVFJFQU0+KSB7CisgICAgJG5yZWNzKys7CisgICAgaWYgKC9eKFxAXEArKSAtWy0rMC05LCBdKyBcMS8pIHsKKwkgICAgcHJpbnQgIiRkaWZmX3N0dWZmIjsKKwkgICAgJG5wYXJlbnRzID0gbGVuZ3RoKCQxKSAtIDE7CisgICAgfQorICAgIGVsc2lmICgvXmRpZmYgLS8gfHwgL15pbmRleCAvIHx8CisJICAgL15vbGQgbW9kZSAvIHx8IC9ebmV3IG1vZGUgLyB8fAorCSAgIC9eZGVsZXRlZCBmaWxlIG1vZGUgLyB8fCAvXm5ldyBmaWxlIG1vZGUgLyB8fAorCSAgIC9ec2ltaWxhcml0eSBpbmRleCAvIHx8IC9eZGlzc2ltaWxhcml0eSBpbmRleCAvIHx8CisJICAgL15jb3B5IGZyb20gLyB8fCAvXmNvcHkgdG8gLyB8fAorCSAgIC9ecmVuYW1lIGZyb20gLyB8fCAvXnJlbmFtZSB0byAvKSB7CisJICAgICRucGFyZW50cyA9IHVuZGVmOworCSAgICBwcmludCAiJGRpZmZfc3R1ZmYiOworICAgIH0KKyAgICBlbHNpZiAoZGVmaW5lZCAkbnBhcmVudHMpIHsKKwkgICAgaWYgKCRucGFyZW50cyA9PSAxKSB7CisJCSAgICBpZiAoL15cKy8pIHsKKwkJCSAgICBwcmludCAkZmlsZV9uZXc7CisJCSAgICB9CisJCSAgICBlbHNpZiAoL14tLykgeworCQkJICAgIHByaW50ICRmaWxlX29sZDsKKwkJICAgIH0KKwkJICAgIGVsc2UgeworCQkJICAgIHByaW50ICRwbGFpbl90ZXh0OworCQkgICAgfQorCSAgICB9CisJICAgIGVsc2lmICgvXiB7JG5wYXJlbnRzfS8pIHsKKwkJICAgIHByaW50ICIkcGxhaW5fdGV4dCI7CisJICAgIH0KKwkgICAgZWxzaWYgKC9eWysgXXskbnBhcmVudHN9LykgeworCQkgICAgcHJpbnQgIiRmaWxlX25ldyI7CisJICAgIH0KKwkgICAgZWxzaWYgKC9eWy0gXXskbnBhcmVudHN9LykgeworCQkgICAgcHJpbnQgIiRmaWxlX29sZCI7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCSAgICBwcmludCAkcGxhaW5fdGV4dDsKKwkgICAgfQorICAgIH0KKyAgICBlbHNpZiAoL14tLS0gLyB8fCAvXlwrXCtcKyAvKSB7CisJICAgIHByaW50ICRkaWZmX3N0dWZmOworICAgIH0KKyAgICBlbHNlIHsKKwkgICAgcHJpbnQgIiRwbGFpbl90ZXh0IjsKKyAgICB9CisgICAgcy8kLyRjb2xvdXJ7T0ZGfS87CisgICAgcHJpbnQgIiRfIjsKK30KK2Nsb3NlIElOUFVUU1RSRUFNOworCitzdWIgc2V0X2NvbG9yIHsKKyAgICBteSAoJHR5cGUsICRjb2xvcikgPSBAXzsKKworICAgICR0eXBlID1+IHMvLS9fLzsKKyAgICBldmFsICJcJCR0eXBlID0gXCRjb2xvdXJ7JGNvbG9yfSI7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzLy5naXRpZ25vcmUgYi9jb250cmliL2VtYWNzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzMWQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZW1hY3MvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmVsYwpkaWZmIC0tZ2l0IGEvY29udHJpYi9lbWFjcy9NYWtlZmlsZSBiL2NvbnRyaWIvZW1hY3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2MTlkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZW1hY3MvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIyMgQnVpbGQgYW5kIGluc3RhbGwgc3R1ZmYKKworRU1BQ1MgPSBlbWFjcworCitFTEMgPSBnaXQuZWxjIHZjLWdpdC5lbGMKK0lOU1RBTEwgPSBpbnN0YWxsCitJTlNUQUxMX0VMQyA9ICQoSU5TVEFMTCkgLW0gNjQ0CitwcmVmaXggPSAkKEhPTUUpCitlbWFjc2RpciA9ICQocHJlZml4KS9zaGFyZS9lbWFjcy9zaXRlLWxpc3AKKworYWxsOiAkKEVMQykKKworaW5zdGFsbDogYWxsCisJJChJTlNUQUxMKSAtZCAkKGVtYWNzZGlyKQorCSQoSU5TVEFMTF9FTEMpICQoRUxDKSAkKGVtYWNzZGlyKQorCislLmVsYzogJS5lbAorCSQoRU1BQ1MpIC0tYmF0Y2ggLS1ldmFsICcoYnl0ZS1jb21waWxlLWZpbGUgIiQ8IiknCisKK2NsZWFuOjsgcm0gLWYgJChFTEMpCmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzL2dpdC5lbCBiL2NvbnRyaWIvZW1hY3MvZ2l0LmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDAwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2VtYWNzL2dpdC5lbApAQCAtMCwwICsxLDEwMTIgQEAKKzs7OyBnaXQuZWwgLS0tIEEgdXNlciBpbnRlcmZhY2UgZm9yIGdpdAorCis7OyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgQWxleGFuZHJlIEp1bGxpYXJkIDxqdWxsaWFyZEB3aW5laHEub3JnPgorCis7OyBWZXJzaW9uOiAxLjAKKworOzsgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKzs7IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCis7OyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCis7OyB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCis7OyB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCis7OyBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOzsKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworOzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorOzsgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKzs7IE1BIDAyMTExLTEzMDcgVVNBCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW50ZXJmYWNlIGZvciB0aGUgZ2l0IHZlcnNpb24gY29udHJvbAorOzsgc3lzdGVtLiBJdCBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgZ2l0Cis7OyBjb21tYW5kcy4gVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZhciBhcyBwb3NzaWJsZSBpZGVudGljYWwgdG8KKzs7IHRoYXQgb2YgdGhlIFBDTC1DVlMgbW9kZS4KKzs7Cis7OyBUbyBpbnN0YWxsOiBwdXQgdGhpcyBmaWxlIG9uIHRoZSBsb2FkLXBhdGggYW5kIHBsYWNlIHRoZSBmb2xsb3dpbmcKKzs7IGluIHlvdXIgLmVtYWNzIGZpbGU6Cis7OworOzsgICAgKHJlcXVpcmUgJ2dpdCkKKzs7Cis7OyBUbyBzdGFydDogYE0teCBnaXQtc3RhdHVzJworOzsKKzs7IFRPRE8KKzs7ICAtIHBvcnRhYmlsaXR5IHRvIFhFbWFjcworOzsgIC0gYmV0dGVyIGhhbmRsaW5nIG9mIHN1YnByb2Nlc3MgZXJyb3JzCis7OyAgLSBob29rIGludG8gZmlsZSBzYXZlIChhZnRlci1zYXZlLWhvb2spCis7OyAgLSBkaWZmIGFnYWluc3Qgb3RoZXIgYnJhbmNoCis7OyAgLSByZW5hbWluZyBmaWxlcyBmcm9tIHRoZSBzdGF0dXMgYnVmZmVyCis7OyAgLSBjcmVhdGluZyB0YWdzCis7OyAgLSBmZXRjaC9wdWxsCis7OyAgLSBzd2l0Y2hpbmcgYnJhbmNoZXMKKzs7ICAtIHJldmxpc3QgYnJvd3NlcgorOzsgIC0gZ2l0LXNob3ctYnJhbmNoIGJyb3dzZXIKKzs7ICAtIG1lbnVzCis7OworCisoZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ2NsKSkKKyhyZXF1aXJlICdld29jKQorCisKKzs7OzsgQ3VzdG9taXphdGlvbnMKKzs7OzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhkZWZncm91cCBnaXQgbmlsCisgICJHaXQgdXNlciBpbnRlcmZhY2UiKQorCisoZGVmY3VzdG9tIGdpdC1jb21taXR0ZXItbmFtZSBuaWwKKyAgIlVzZXIgbmFtZSB0byB1c2UgZm9yIGNvbW1pdHMuCitUaGUgZGVmYXVsdCBpcyB0byBmYWxsIGJhY2sgdG8gdGhlIHJlcG9zaXRvcnkgY29uZmlnLCB0aGVuIHRvIGBhZGQtbG9nLWZ1bGwtbmFtZScgYW5kIHRoZW4gdG8gYHVzZXItZnVsbC1uYW1lJy4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICcoY2hvaWNlIChjb25zdCA6dGFnICJEZWZhdWx0IiBuaWwpCisgICAgICAgICAgICAgICAgIChzdHJpbmcgOnRhZyAiTmFtZSIpKSkKKworKGRlZmN1c3RvbSBnaXQtY29tbWl0dGVyLWVtYWlsIG5pbAorICAiRW1haWwgYWRkcmVzcyB0byB1c2UgZm9yIGNvbW1pdHMuCitUaGUgZGVmYXVsdCBpcyB0byBmYWxsIGJhY2sgdG8gdGhlIGdpdCByZXBvc2l0b3J5IGNvbmZpZywgdGhlbiB0byBgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MnIGFuZCB0aGVuIHRvIGB1c2VyLW1haWwtYWRkcmVzcycuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnKGNob2ljZSAoY29uc3QgOnRhZyAiRGVmYXVsdCIgbmlsKQorICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcgIkVtYWlsIikpKQorCisoZGVmY3VzdG9tIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0gJ3V0Zi04CisgICJEZWZhdWx0IGNvZGluZyBzeXN0ZW0gZm9yIHRoZSBsb2cgbWVzc2FnZSBvZiBnaXQgY29tbWl0cy4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICdjb2Rpbmctc3lzdGVtKQorCisoZGVmY3VzdG9tIGdpdC1hcHBlbmQtc2lnbmVkLW9mZi1ieSBuaWwKKyAgIldoZXRoZXIgdG8gYXBwZW5kIGEgU2lnbmVkLW9mZi1ieSBsaW5lIHRvIHRoZSBjb21taXQgbWVzc2FnZSBiZWZvcmUgZWRpdGluZy4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICdib29sZWFuKQorCisoZGVmY3VzdG9tIGdpdC1wZXItZGlyLWlnbm9yZS1maWxlICIuZ2l0aWdub3JlIgorICAiTmFtZSBvZiB0aGUgcGVyLWRpcmVjdG9yeSBpZ25vcmUgZmlsZS4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICdzdHJpbmcpCisKKyhkZWZmYWNlIGdpdC1zdGF0dXMtZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAicHVycGxlIikpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCBhZGRlZCBhbmQgbW9kaWZpZWQgZmlsZXMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LXVubWVyZ2VkLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgInJlZCIgOmJvbGQgdCkpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCB1bm1lcmdlZCBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtdW5rbm93bi1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJnb2xkZW5yb2QiIDpib2xkIHQpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCB0byBoaWdobGlnaHQgdW5rbm93biBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtdXB0b2RhdGUtZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAiZ3JleTYwIikpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCB1cC10by1kYXRlIGZpbGVzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC1pZ25vcmVkLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgImdyZXk2MCIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCB0byBoaWdobGlnaHQgaWdub3JlZCBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtbWFyay1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJyZWQiIDpib2xkIHQpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCBmb3IgdGhlIGZpbGUgbWFya3MuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LWhlYWRlci1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJibHVlIikpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIGZvciBjb21taXQgaGVhZGVycy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtc2VwYXJhdG9yLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgImJyb3duIikpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIGZvciBjb21taXQgc2VwYXJhdG9yLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC1wZXJtaXNzaW9uLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgImdyZWVuIiA6Ym9sZCB0KSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgZm9yIHBlcm1pc3Npb24gY2hhbmdlcy4iCisgIDpncm91cCAnZ2l0KQorCisKKzs7OzsgVXRpbGl0aWVzCis7Ozs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoZGVmY29uc3QgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yICItLS0gbG9nIG1lc3NhZ2UgZm9sbG93cyB0aGlzIGxpbmUgLS0tIikKKworKGRlZnVuIGdpdC1nZXQtZW52LXN0cmluZ3MgKGVudikKKyAgIkJ1aWxkIGEgbGlzdCBvZiBOQU1FPVZBTFVFIHN0cmluZ3MgZnJvbSBhIGxpc3Qgb2YgZW52aXJvbm1lbnQgc3RyaW5ncy4iCisgIChtYXBjYXIgKGxhbWJkYSAoZW50cnkpIChjb25jYXQgKGNhciBlbnRyeSkgIj0iIChjZHIgZW50cnkpKSkgZW52KSkKKworKGRlZnVuIGdpdC1jYWxsLXByb2Nlc3MtZW52IChidWZmZXIgZW52ICZyZXN0IGFyZ3MpCisgICJXcmFwcGVyIGZvciBjYWxsLXByb2Nlc3MgdGhhdCBzZXRzIGVudmlyb25tZW50IHN0cmluZ3MuIgorICAoaWYgZW52CisgICAgICAoYXBwbHkgIydjYWxsLXByb2Nlc3MgImVudiIgbmlsIGJ1ZmZlciBuaWwKKyAgICAgICAgICAgICAoYXBwZW5kIChnaXQtZ2V0LWVudi1zdHJpbmdzIGVudikgKGxpc3QgImdpdCIpIGFyZ3MpKQorICAgIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgYnVmZmVyIG5pbCBhcmdzKSkpCisKKyhkZWZ1biBnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgKGVudiAmcmVzdCBhcmdzKQorICAiV3JhcHBlciBmb3IgY2FsbC1wcm9jZXNzIHRoYXQgc2V0cyBlbnZpcm9ubWVudCBzdHJpbmdzLCBhbmQgcmV0dXJucyB0aGUgcHJvY2VzcyBvdXRwdXQgYXMgYSBzdHJpbmcuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChhbmQgKGVxIDAgKGFwcGx5ICMnIGdpdC1jYWxsLXByb2Nlc3MtZW52IHQgZW52IGFyZ3MpKQorICAgICAgICAgKGJ1ZmZlci1zdHJpbmcpKSkpCisKKyhkZWZ1biBnaXQtcnVuLXByb2Nlc3MtcmVnaW9uIChidWZmZXIgc3RhcnQgZW5kIHByb2dyYW0gYXJncykKKyAgIlJ1biBhIGdpdCBwcm9jZXNzIHdpdGggYSBidWZmZXIgcmVnaW9uIGFzIGlucHV0LiIKKyAgKGxldCAoKG91dHB1dC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAgICAgKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAoY2QgZGlyKQorICAgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzLXJlZ2lvbiBzdGFydCBlbmQgcHJvZ3JhbQorICAgICAgICAgICAgIG5pbCAobGlzdCBvdXRwdXQtYnVmZmVyIG5pbCkgbmlsIGFyZ3MpKSkpCisKKyhkZWZ1biBnaXQtcnVuLWNvbW1hbmQtYnVmZmVyIChidWZmZXItbmFtZSAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQsIHNlbmRpbmcgdGhlIG91dHB1dCB0byBhIGJ1ZmZlciBuYW1lZCBCVUZGRVItTkFNRS4iCisgIChsZXQgKChkaXIgZGVmYXVsdC1kaXJlY3RvcnkpCisgICAgICAgIChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlIGJ1ZmZlci1uYW1lKSkpCisgICAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0ICVzLi4uIiAoY2FyIGFyZ3MpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGxldCAoKGRlZmF1bHQtZGlyZWN0b3J5IGRpcikKKyAgICAgICAgICAgIChidWZmZXItcmVhZC1vbmx5IG5pbCkpCisgICAgICAgIChlcmFzZS1idWZmZXIpCisgICAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IGJ1ZmZlciBuaWwgYXJncykpKQorICAgIChtZXNzYWdlICJSdW5uaW5nIGdpdCAlcy4uLmRvbmUiIChjYXIgYXJncykpCisgICAgYnVmZmVyKSkKKworKGRlZnVuIGdpdC1ydW4tY29tbWFuZCAoYnVmZmVyIGVudiAmcmVzdCBhcmdzKQorICAobWVzc2FnZSAiUnVubmluZyBnaXQgJXMuLi4iIChjYXIgYXJncykpCisgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IGJ1ZmZlciBlbnYgYXJncykKKyAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0ICVzLi4uZG9uZSIgKGNhciBhcmdzKSkpCisKKyhkZWZ1biBnaXQtcnVuLWNvbW1hbmQtcmVnaW9uIChidWZmZXIgc3RhcnQgZW5kIGVudiAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQgd2l0aCBzcGVjaWZpZWQgYnVmZmVyIHJlZ2lvbiBhcyBpbnB1dC4iCisgIChtZXNzYWdlICJSdW5uaW5nIGdpdCAlcy4uLiIgKGNhciBhcmdzKSkKKyAgKHVubGVzcyAoZXEgMCAoaWYgZW52CisgICAgICAgICAgICAgICAgICAgIChnaXQtcnVuLXByb2Nlc3MtcmVnaW9uCisgICAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJlbnYiCisgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIChnaXQtZ2V0LWVudi1zdHJpbmdzIGVudikgKGxpc3QgImdpdCIpIGFyZ3MpKQorICAgICAgICAgICAgICAgICAgKGdpdC1ydW4tcHJvY2Vzcy1yZWdpb24KKyAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJnaXQiIGFyZ3MpKSkKKyAgICAoZXJyb3IgIkZhaWxlZCB0byBydW4gXCJnaXQgJXNcIjpcbiVzIiAobWFwY29uY2F0IChsYW1iZGEgKHgpIHgpIGFyZ3MgIiAiKSAoYnVmZmVyLXN0cmluZykpKQorICAobWVzc2FnZSAiUnVubmluZyBnaXQgJXMuLi5kb25lIiAoY2FyIGFyZ3MpKSkKKworKGRlZnVuIGdpdC1nZXQtc3RyaW5nLXNoYTEgKHN0cmluZykKKyAgIlJlYWQgYSBTSEExIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuIgorICAoYW5kIHN0cmluZworICAgICAgIChzdHJpbmctbWF0Y2ggIlswLTlhLWZdXFx7NDBcXH0iIHN0cmluZykKKyAgICAgICAobWF0Y2gtc3RyaW5nIDAgc3RyaW5nKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWNvbW1pdHRlci1uYW1lICgpCisgICJSZXR1cm4gdGhlIG5hbWUgdG8gdXNlIGFzIEdJVF9DT01NSVRURVJfTkFNRS4iCisgIDsgY29waWVkIGZyb20gbG9nLWVkaXQKKyAgKG9yIGdpdC1jb21taXR0ZXItbmFtZQorICAgICAgKGdpdC1yZXBvLWNvbmZpZyAidXNlci5uYW1lIikKKyAgICAgIChhbmQgKGJvdW5kcCAnYWRkLWxvZy1mdWxsLW5hbWUpIGFkZC1sb2ctZnVsbC1uYW1lKQorICAgICAgKGFuZCAoZmJvdW5kcCAndXNlci1mdWxsLW5hbWUpICh1c2VyLWZ1bGwtbmFtZSkpCisgICAgICAoYW5kIChib3VuZHAgJ3VzZXItZnVsbC1uYW1lKSB1c2VyLWZ1bGwtbmFtZSkpKQorCisoZGVmdW4gZ2l0LWdldC1jb21taXR0ZXItZW1haWwgKCkKKyAgIlJldHVybiB0aGUgZW1haWwgYWRkcmVzcyB0byB1c2UgYXMgR0lUX0NPTU1JVFRFUl9FTUFJTC4iCisgIDsgY29waWVkIGZyb20gbG9nLWVkaXQKKyAgKG9yIGdpdC1jb21taXR0ZXItZW1haWwKKyAgICAgIChnaXQtcmVwby1jb25maWcgInVzZXIuZW1haWwiKQorICAgICAgKGFuZCAoYm91bmRwICdhZGQtbG9nLW1haWxpbmctYWRkcmVzcykgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpCisgICAgICAoYW5kIChmYm91bmRwICd1c2VyLW1haWwtYWRkcmVzcykgKHVzZXItbWFpbC1hZGRyZXNzKSkKKyAgICAgIChhbmQgKGJvdW5kcCAndXNlci1tYWlsLWFkZHJlc3MpIHVzZXItbWFpbC1hZGRyZXNzKSkpCisKKyhkZWZ1biBnaXQtZXNjYXBlLWZpbGUtbmFtZSAobmFtZSkKKyAgIkVzY2FwZSBhIGZpbGUgbmFtZSBpZiBuZWNlc3NhcnkuIgorICAoaWYgKHN0cmluZy1tYXRjaCAiW1xuXHRcIlxcXSIgbmFtZSkKKyAgICAgIChjb25jYXQgIlwiIgorICAgICAgICAgICAgICAobWFwY29uY2F0IChsYW1iZGEgKGMpCisgICAgICAgICAgICAgICAgICAgKGNhc2UgYworICAgICAgICAgICAgICAgICAgICAgKD9cbiAiXFxuIikKKyAgICAgICAgICAgICAgICAgICAgICg/XHQgIlxcdCIpCisgICAgICAgICAgICAgICAgICAgICAoP1xcICJcXFxcIikKKyAgICAgICAgICAgICAgICAgICAgICg/XCIgIlxcXCIiKQorICAgICAgICAgICAgICAgICAgICAgKHQgKGNoYXItdG8tc3RyaW5nIGMpKSkpCisgICAgICAgICAgICAgICAgIG5hbWUgIiIpCisgICAgICAgICAgICAgICJcIiIpCisgICAgbmFtZSkpCisKKyhkZWZ1biBnaXQtZ2V0LXRvcC1kaXIgKGRpcikKKyAgIlJldHJpZXZlIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIGEgZ2l0IHRyZWUuIgorICAobGV0ICgoY2R1cCAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQtb3V0cHV0CisgICAgICAgICAgICAgICAgICAoY2QgZGlyKQorICAgICAgICAgICAgICAgICAgKHVubGVzcyAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCB0IG5pbCAicmV2LXBhcnNlIiAiLS1zaG93LWNkdXAiKSkKKyAgICAgICAgICAgICAgICAgICAgKGVycm9yICJjYW5ub3QgZmluZCB0b3AtbGV2ZWwgZ2l0IHRyZWUgZm9yICVzLiIgZGlyKSkpKSkpCisgICAgKGV4cGFuZC1maWxlLW5hbWUgKGNvbmNhdCAoZmlsZS1uYW1lLWFzLWRpcmVjdG9yeSBkaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIChzcGxpdC1zdHJpbmcgY2R1cCAiXG4iKSkpKSkpCisKKztzdG9sZW4gZnJvbSBwY2wtY3ZzCisoZGVmdW4gZ2l0LWFwcGVuZC10by1pZ25vcmUgKGZpbGUpCisgICJBZGQgYSBmaWxlIG5hbWUgdG8gdGhlIGlnbm9yZSBmaWxlIGluIGl0cyBkaXJlY3RvcnkuIgorICAobGV0KiAoKGZ1bGxuYW1lIChleHBhbmQtZmlsZS1uYW1lIGZpbGUpKQorICAgICAgICAgKGRpciAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmdWxsbmFtZSkpCisgICAgICAgICAobmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBmdWxsbmFtZSkpCisgICAgICAgICAoaWdub3JlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgZ2l0LXBlci1kaXItaWdub3JlLWZpbGUgZGlyKSkKKyAgICAgICAgIChjcmVhdGVkIChub3QgKGZpbGUtZXhpc3RzLXAgaWdub3JlLW5hbWUpKSkpCisgIChzYXZlLXdpbmRvdy1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciAoZmluZC1maWxlLW5vc2VsZWN0IGlnbm9yZS1uYW1lKSkKKyAgICAoZ290by1jaGFyIChwb2ludC1tYXgpKQorICAgICh1bmxlc3MgKHplcm9wIChjdXJyZW50LWNvbHVtbikpIChpbnNlcnQgIlxuIikpCisgICAgKGluc2VydCBuYW1lICJcbiIpCisgICAgKHNvcnQtbGluZXMgbmlsIChwb2ludC1taW4pIChwb2ludC1tYXgpKQorICAgIChzYXZlLWJ1ZmZlcikpCisgICh3aGVuIGNyZWF0ZWQKKyAgICAoZ2l0LXJ1bi1jb21tYW5kIG5pbCBuaWwgInVwZGF0ZS1pbmRleCIgIi0taW5mby1vbmx5IiAiLS1hZGQiICItLSIgKGZpbGUtcmVsYXRpdmUtbmFtZSBpZ25vcmUtbmFtZSkpKQorICAoZ2l0LWFkZC1zdGF0dXMtZmlsZSAoaWYgY3JlYXRlZCAnYWRkZWQgJ21vZGlmaWVkKSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGlnbm9yZS1uYW1lKSkpKQorCisKKzs7OzsgV3JhcHBlcnMgZm9yIGJhc2ljIGdpdCBjb21tYW5kcworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZnVuIGdpdC1yZXYtcGFyc2UgKHJldikKKyAgIlBhcnNlIGEgcmV2aXNpb24gbmFtZSBhbmQgcmV0dXJuIGl0cyBTSEExLiIKKyAgKGdpdC1nZXQtc3RyaW5nLXNoYTEKKyAgIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgbmlsICJyZXYtcGFyc2UiIHJldikpKQorCisoZGVmdW4gZ2l0LXJlcG8tY29uZmlnIChrZXkpCisgICJSZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB0byBLRVkgaW4gdGhlIGdpdCByZXBvc2l0b3J5IGNvbmZpZyBmaWxlLiIKKyAgKGxldCAoKHN0ciAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYtc3RyaW5nIG5pbCAicmVwby1jb25maWciIGtleSkpKQorICAgIChhbmQgc3RyIChjYXIgKHNwbGl0LXN0cmluZyBzdHIgIlxuIikpKSkpCisKKyhkZWZ1biBnaXQtc3ltYm9saWMtcmVmIChyZWYpCisgICJXcmFwcGVyIGZvciB0aGUgZ2l0LXN5bWJvbGljLXJlZiBjb21tYW5kLiIKKyAgKGxldCAoKHN0ciAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYtc3RyaW5nIG5pbCAic3ltYm9saWMtcmVmIiByZWYpKSkKKyAgICAoYW5kIHN0ciAoY2FyIChzcGxpdC1zdHJpbmcgc3RyICJcbiIpKSkpKQorCisoZGVmdW4gZ2l0LXVwZGF0ZS1yZWYgKHJlZiB2YWwgJm9wdGlvbmFsIG9sZHZhbCkKKyAgIlVwZGF0ZSBhIHJlZmVyZW5jZSBieSBjYWxsaW5nIGdpdC11cGRhdGUtcmVmLiIKKyAgKGFwcGx5ICMnZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgbmlsIG5pbCAidXBkYXRlLXJlZiIgcmVmIHZhbCAoaWYgb2xkdmFsIChsaXN0IG9sZHZhbCkpKSkKKworKGRlZnVuIGdpdC1yZWFkLXRyZWUgKHRyZWUgJm9wdGlvbmFsIGluZGV4LWZpbGUpCisgICJSZWFkIGEgdHJlZSBpbnRvIHRoZSBpbmRleCBmaWxlLiIKKyAgKGFwcGx5ICMnZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgbmlsCisgICAgICAgICAoaWYgaW5kZXgtZmlsZSBgKCgiR0lUX0lOREVYX0ZJTEUiIC4gLGluZGV4LWZpbGUpKSBuaWwpCisgICAgICAgICAicmVhZC10cmVlIiAoaWYgdHJlZSAobGlzdCB0cmVlKSkpKQorCisoZGVmdW4gZ2l0LXdyaXRlLXRyZWUgKCZvcHRpb25hbCBpbmRleC1maWxlKQorICAiQ2FsbCBnaXQtd3JpdGUtdHJlZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgdHJlZSBTSEExIGFzIGEgc3RyaW5nLiIKKyAgKGdpdC1nZXQtc3RyaW5nLXNoYTEKKyAgIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgKGFuZCBpbmRleC1maWxlIGAoKCJHSVRfSU5ERVhfRklMRSIgLiAsaW5kZXgtZmlsZSkpKSAid3JpdGUtdHJlZSIpKSkKKworKGRlZnVuIGdpdC1jb21taXQtdHJlZSAoYnVmZmVyIHRyZWUgaGVhZCkKKyAgIkNhbGwgZ2l0LWNvbW1pdC10cmVlIHdpdGggYnVmZmVyIGFzIGlucHV0IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBjb21taXQgU0hBMS4iCisgIChsZXQgKChhdXRob3ItbmFtZSAoZ2l0LWdldC1jb21taXR0ZXItbmFtZSkpCisgICAgICAgIChhdXRob3ItZW1haWwgKGdpdC1nZXQtY29tbWl0dGVyLWVtYWlsKSkKKyAgICAgICAgYXV0aG9yLWRhdGUgbG9nLXN0YXJ0IGxvZy1lbmQgYXJncykKKyAgICAod2hlbiBoZWFkCisgICAgICAocHVzaCAiLXAiIGFyZ3MpCisgICAgICAocHVzaCBoZWFkIGFyZ3MpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgIChpZgorICAgICAgICAgIChzZXRxIGxvZy1zdGFydCAocmUtc2VhcmNoLWZvcndhcmQgKGNvbmNhdCAiXiIgKHJlZ2V4cC1xdW90ZSBnaXQtbG9nLW1zZy1zZXBhcmF0b3IpICJcbiIpIG5pbCB0KSkKKyAgICAgICAgICAoc2F2ZS1yZXN0cmljdGlvbgorICAgICAgICAgICAgKG5hcnJvdy10by1yZWdpb24gKHBvaW50LW1pbikgbG9nLXN0YXJ0KQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkF1dGhvcjogK1xcKC4qP1xcKSAqPFxcKC4qXFwpPiAqJCIgbmlsIHQpCisgICAgICAgICAgICAgIChzZXRxIGF1dGhvci1uYW1lIChtYXRjaC1zdHJpbmcgMSkKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yLWVtYWlsIChtYXRjaC1zdHJpbmcgMikpKQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkRhdGU6ICtcXCguKlxcKSQiIG5pbCB0KQorICAgICAgICAgICAgICAoc2V0cSBhdXRob3ItZGF0ZSAobWF0Y2gtc3RyaW5nIDEpKSkKKyAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJeUGFyZW50OiArXFwoWzAtOWEtZl0rXFwpIiBuaWwgdCkKKyAgICAgICAgICAgICAgKHVubGVzcyAoc3RyaW5nLWVxdWFsIGhlYWQgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgICAgICAocHVzaCAiLXAiIGFyZ3MpCisgICAgICAgICAgICAgICAgKHB1c2ggKG1hdGNoLXN0cmluZyAxKSBhcmdzKSkpKQorICAgICAgICAoc2V0cSBsb2ctc3RhcnQgKHBvaW50LW1pbikpKQorICAgICAgKHNldHEgbG9nLWVuZCAocG9pbnQtbWF4KSkpCisgICAgKGdpdC1nZXQtc3RyaW5nLXNoYTEKKyAgICAgKHdpdGgtb3V0cHV0LXRvLXN0cmluZworICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAorICAgICAgICAgKGxldCAoKGNvZGluZy1zeXN0ZW0tZm9yLXdyaXRlIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pCisgICAgICAgICAgICAgICAoZW52IGAoKCJHSVRfQVVUSE9SX05BTUUiIC4gLGF1dGhvci1uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICgiR0lUX0FVVEhPUl9FTUFJTCIgLiAsYXV0aG9yLWVtYWlsKQorICAgICAgICAgICAgICAgICAgICAgICgiR0lUX0NPTU1JVFRFUl9OQU1FIiAuICwoZ2l0LWdldC1jb21taXR0ZXItbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgKCJHSVRfQ09NTUlUVEVSX0VNQUlMIiAuICwoZ2l0LWdldC1jb21taXR0ZXItZW1haWwpKSkpKQorICAgICAgICAgICAod2hlbiBhdXRob3ItZGF0ZSAocHVzaCBgKCJHSVRfQVVUSE9SX0RBVEUiIC4gLGF1dGhvci1kYXRlKSBlbnYpKQorICAgICAgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQtcmVnaW9uCisgICAgICAgICAgICAgICAgICBidWZmZXIgbG9nLXN0YXJ0IGxvZy1lbmQgZW52CisgICAgICAgICAgICAgICAgICAiY29tbWl0LXRyZWUiIHRyZWUgKG5yZXZlcnNlIGFyZ3MpKSkpKSkpKQorCisoZGVmdW4gZ2l0LWVtcHR5LWRiLXAgKCkKKyAgIkNoZWNrIGlmIHRoZSBnaXQgZGIgaXMgZW1wdHkgKG5vIGNvbW1pdCBkb25lIHlldCkuIgorICAobm90IChlcSAwIChjYWxsLXByb2Nlc3MgImdpdCIgbmlsIG5pbCBuaWwgInJldi1wYXJzZSIgIi0tdmVyaWZ5IiAiSEVBRCIpKSkpCisKKyhkZWZ1biBnaXQtZ2V0LW1lcmdlLWhlYWRzICgpCisgICJSZXRyaWV2ZSB0aGUgbWVyZ2UgaGVhZHMgZnJvbSB0aGUgTUVSR0VfSEVBRCBmaWxlIGlmIHByZXNlbnQuIgorICAobGV0IChoZWFkcykKKyAgICAod2hlbiAoZmlsZS1yZWFkYWJsZS1wICIuZ2l0L01FUkdFX0hFQUQiKQorICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzICIuZ2l0L01FUkdFX0hFQUQiIG5pbCBuaWwgbmlsIHQpCisgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlswLTlhLWZdXFx7NDBcXH0iIG5pbCB0KQorICAgICAgICAgIChwdXNoIChtYXRjaC1zdHJpbmcgMCkgaGVhZHMpKSkpCisgICAgKG5yZXZlcnNlIGhlYWRzKSkpCisKKzs7OzsgRmlsZSBpbmZvIHN0cnVjdHVyZQorOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOyBmaWxlaW5mbyBzdHJ1Y3R1cmUgc3RvbGVuIGZyb20gcGNsLWN2cworKGRlZnN0cnVjdCAoZ2l0LWZpbGVpbmZvCisgICAgICAgICAgICAoOmNvcGllciBuaWwpCisgICAgICAgICAgICAoOmNvbnN0cnVjdG9yIGdpdC1jcmVhdGUtZmlsZWluZm8gKHN0YXRlIG5hbWUgJm9wdGlvbmFsIG9sZC1wZXJtIG5ldy1wZXJtIHJlbmFtZS1zdGF0ZSBvcmlnLW5hbWUgbWFya2VkKSkKKyAgICAgICAgICAgICg6Y29uYy1uYW1lIGdpdC1maWxlaW5mby0+KSkKKyAgbWFya2VkICAgICAgICAgICAgICA7OyB0L25pbAorICBzdGF0ZSAgICAgICAgICAgICAgIDs7IGN1cnJlbnQgc3RhdGUKKyAgbmFtZSAgICAgICAgICAgICAgICA7OyBmaWxlIG5hbWUKKyAgb2xkLXBlcm0gbmV3LXBlcm0gICA7OyBwZXJtaXNzaW9uIGZsYWdzCisgIHJlbmFtZS1zdGF0ZSAgICAgICAgOzsgcmVuYW1lIG9yIGNvcHkgc3RhdGUKKyAgb3JpZy1uYW1lICAgICAgICAgICA7OyBvcmlnaW5hbCBuYW1lIGZvciByZW5hbWVzIG9yIGNvcGllcworICBuZWVkcy1yZWZyZXNoKSAgICAgIDs7IHdoZXRoZXIgZmlsZSBuZWVkcyB0byBiZSByZWZyZXNoZWQKKworKGRlZnZhciBnaXQtc3RhdHVzIG5pbCkKKworKGRlZnVuIGdpdC1jbGVhci1zdGF0dXMgKHN0YXR1cykKKyAgIlJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIHN0YXR1cyBsaXN0LiIKKyAgKGV3b2MtZmlsdGVyIHN0YXR1cyAobGFtYmRhIChpbmZvKSBuaWwpKSkKKworKGRlZnVuIGdpdC1zZXQtZmlsZXMtc3RhdGUgKGZpbGVzIHN0YXRlKQorICAiU2V0IHRoZSBzdGF0ZSBvZiBhIGxpc3Qgb2YgZmlsZXMuIgorICAoZG9saXN0IChpbmZvIGZpbGVzKQorICAgICh1bmxlc3MgKGVxIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pIHN0YXRlKQorICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykgc3RhdGUpCisgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5yZW5hbWUtc3RhdGUgaW5mbykgbmlsKQorICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+b3JpZy1uYW1lIGluZm8pIG5pbCkKKyAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykgdCkpKSkKKworKGRlZnVuIGdpdC1zdGF0ZS1jb2RlIChjb2RlKQorICAiQ29udmVydCBmcm9tIGEgc3RyaW5nIHRvIGEgYWRkZWQvZGVsZXRlZC9tb2RpZmllZCBzdGF0ZS4iCisgIChjYXNlIChzdHJpbmctdG8tY2hhciBjb2RlKQorICAgICg/TSAnbW9kaWZpZWQpCisgICAgKD8/ICd1bmtub3duKQorICAgICg/QSAnYWRkZWQpCisgICAgKD9EICdkZWxldGVkKQorICAgICg/VSAndW5tZXJnZWQpCisgICAgKHQgbmlsKSkpCisKKyhkZWZ1biBnaXQtc3RhdHVzLWNvZGUtYXMtc3RyaW5nIChjb2RlKQorICAiRm9ybWF0IGEgZ2l0IHN0YXR1cyBjb2RlIGFzIHN0cmluZy4iCisgIChjYXNlIGNvZGUKKyAgICAoJ21vZGlmaWVkIChwcm9wZXJ0aXplICJNb2RpZmllZCIgJ2ZhY2UgJ2dpdC1zdGF0dXMtZmFjZSkpCisgICAgKCd1bmtub3duICAocHJvcGVydGl6ZSAiVW5rbm93biAiICdmYWNlICdnaXQtdW5rbm93bi1mYWNlKSkKKyAgICAoJ2FkZGVkICAgIChwcm9wZXJ0aXplICJBZGRlZCAgICIgJ2ZhY2UgJ2dpdC1zdGF0dXMtZmFjZSkpCisgICAgKCdkZWxldGVkICAocHJvcGVydGl6ZSAiRGVsZXRlZCAiICdmYWNlICdnaXQtc3RhdHVzLWZhY2UpKQorICAgICgndW5tZXJnZWQgKHByb3BlcnRpemUgIlVubWVyZ2VkIiAnZmFjZSAnZ2l0LXVubWVyZ2VkLWZhY2UpKQorICAgICgndXB0b2RhdGUgKHByb3BlcnRpemUgIlVwdG9kYXRlIiAnZmFjZSAnZ2l0LXVwdG9kYXRlLWZhY2UpKQorICAgICgnaWdub3JlZCAgKHByb3BlcnRpemUgIklnbm9yZWQgIiAnZmFjZSAnZ2l0LWlnbm9yZWQtZmFjZSkpCisgICAgKHQgIj8gICAgICAgIikpKQorCisoZGVmdW4gZ2l0LXJlbmFtZS1hcy1zdHJpbmcgKGluZm8pCisgICJSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29weSBvciByZW5hbWUgYXNzb2NpYXRlZCB3aXRoIElORk8sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub25lLiIKKyAgKGxldCAoKHN0YXRlIChnaXQtZmlsZWluZm8tPnJlbmFtZS1zdGF0ZSBpbmZvKSkpCisgICAgKGlmIHN0YXRlCisgICAgICAgIChwcm9wZXJ0aXplCisgICAgICAgICAoY29uY2F0ICIgICAoIgorICAgICAgICAgICAgICAgICAoaWYgKGVxIHN0YXRlICdjb3B5KSAiY29waWVkIGZyb20gIgorICAgICAgICAgICAgICAgICAgIChpZiAoZXEgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykgJ2FkZGVkKSAicmVuYW1lZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAicmVuYW1lZCBmcm9tICIpKQorICAgICAgICAgICAgICAgICAoZ2l0LWVzY2FwZS1maWxlLW5hbWUgKGdpdC1maWxlaW5mby0+b3JpZy1uYW1lIGluZm8pKQorICAgICAgICAgICAgICAgICAiKSIpICdmYWNlICdnaXQtc3RhdHVzLWZhY2UpCisgICAgICAiIikpKQorCisoZGVmdW4gZ2l0LXBlcm1pc3Npb25zLWFzLXN0cmluZyAob2xkLXBlcm0gbmV3LXBlcm0pCisgICJGb3JtYXQgYSBwZXJtaXNzaW9uIGNoYW5nZSBhcyBzdHJpbmcuIgorICAocHJvcGVydGl6ZQorICAgKGlmIChvciAobm90IG9sZC1wZXJtKQorICAgICAgICAgICAobm90IG5ldy1wZXJtKQorICAgICAgICAgICAoZXEgMCAobG9nYW5kID9cMTExIChsb2d4b3Igb2xkLXBlcm0gbmV3LXBlcm0pKSkpCisgICAgICAgIiAgIgorICAgICAoaWYgKGVxIDAgKGxvZ2FuZCA/XDExMSBvbGQtcGVybSkpICIreCIgIi14IikpCisgICdmYWNlICdnaXQtcGVybWlzc2lvbi1mYWNlKSkKKworKGRlZnVuIGdpdC1maWxlaW5mby1wcmV0dHlwcmludCAoaW5mbykKKyAgIlByZXR0eS1wcmludGVyIGZvciB0aGUgZ2l0LWZpbGVpbmZvIHN0cnVjdHVyZS4iCisgIChpbnNlcnQgKGZvcm1hdCAiICAgJXMgJXMgJXMgICVzJXMiCisgICAgICAgICAgICAgICAgICAoaWYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIChwcm9wZXJ0aXplICIqIiAnZmFjZSAnZ2l0LW1hcmstZmFjZSkgIiAiKQorICAgICAgICAgICAgICAgICAgKGdpdC1zdGF0dXMtY29kZS1hcy1zdHJpbmcgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykpCisgICAgICAgICAgICAgICAgICAoZ2l0LXBlcm1pc3Npb25zLWFzLXN0cmluZyAoZ2l0LWZpbGVpbmZvLT5vbGQtcGVybSBpbmZvKSAoZ2l0LWZpbGVpbmZvLT5uZXctcGVybSBpbmZvKSkKKyAgICAgICAgICAgICAgICAgIChnaXQtZXNjYXBlLWZpbGUtbmFtZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKQorICAgICAgICAgICAgICAgICAgKGdpdC1yZW5hbWUtYXMtc3RyaW5nIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcGFyc2Utc3RhdHVzIChzdGF0dXMpCisgICJQYXJzZSB0aGUgb3V0cHV0IG9mIGdpdC1kaWZmLWluZGV4IGluIHRoZSBjdXJyZW50IGJ1ZmZlci4iCisgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQKKyAgICAgICAgICAiOlxcKFswLTddXFx7NlxcfVxcKSBcXChbMC03XVxcezZcXH1cXCkgWzAtOWEtZl1cXHs0MFxcfSBbMC05YS1mXVxcezQwXFx9IFxcKFxcKFtBRE1VXVxcKVwwXFwoW15cMF0rXFwpXFx8XFwoW0NSXVxcKVswLTldKlwwXFwoW15cMF0rXFwpXDBcXChbXlwwXStcXClcXClcMCIKKyAgICAgICAgICBuaWwgdCAxKQorICAgIChsZXQgKChvbGQtcGVybSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDEpIDgpKQorICAgICAgICAgIChuZXctcGVybSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDIpIDgpKQorICAgICAgICAgIChzdGF0ZSAob3IgKG1hdGNoLXN0cmluZyA0KSAobWF0Y2gtc3RyaW5nIDYpKSkKKyAgICAgICAgICAobmFtZSAob3IgKG1hdGNoLXN0cmluZyA1KSAobWF0Y2gtc3RyaW5nIDcpKSkKKyAgICAgICAgICAobmV3LW5hbWUgKG1hdGNoLXN0cmluZyA4KSkpCisgICAgICAoaWYgbmV3LW5hbWUgIDsgY29weSBvciByZW5hbWUKKyAgICAgICAgICAoaWYgKGVxID9DIChzdHJpbmctdG8tY2hhciBzdGF0ZSkpCisgICAgICAgICAgICAgIChld29jLWVudGVyLWxhc3Qgc3RhdHVzIChnaXQtY3JlYXRlLWZpbGVpbmZvICdhZGRlZCBuZXctbmFtZSBvbGQtcGVybSBuZXctcGVybSAnY29weSBuYW1lKSkKKyAgICAgICAgICAgIChld29jLWVudGVyLWxhc3Qgc3RhdHVzIChnaXQtY3JlYXRlLWZpbGVpbmZvICdkZWxldGVkIG5hbWUgMCAwICdyZW5hbWUgbmV3LW5hbWUpKQorICAgICAgICAgICAgKGV3b2MtZW50ZXItbGFzdCBzdGF0dXMgKGdpdC1jcmVhdGUtZmlsZWluZm8gJ2FkZGVkIG5ldy1uYW1lIG9sZC1wZXJtIG5ldy1wZXJtICdyZW5hbWUgbmFtZSkpKQorICAgICAgICAoZXdvYy1lbnRlci1sYXN0IHN0YXR1cyAoZ2l0LWNyZWF0ZS1maWxlaW5mbyAoZ2l0LXN0YXRlLWNvZGUgc3RhdGUpIG5hbWUgb2xkLXBlcm0gbmV3LXBlcm0pKSkpKSkKKworKGRlZnVuIGdpdC1maW5kLXN0YXR1cy1maWxlIChzdGF0dXMgZmlsZSkKKyAgIkZpbmQgYSBnaXZlbiBmaWxlIGluIHRoZSBzdGF0dXMgZXdvYyBhbmQgcmV0dXJuIGl0cyBub2RlLiIKKyAgKGxldCAoKG5vZGUgKGV3b2MtbnRoIHN0YXR1cyAwKSkpCisgICAgKHdoaWxlIChhbmQgbm9kZSAobm90IChzdHJpbmc9IGZpbGUgKGdpdC1maWxlaW5mby0+bmFtZSAoZXdvYy1kYXRhIG5vZGUpKSkpKQorICAgICAgKHNldHEgbm9kZSAoZXdvYy1uZXh0IHN0YXR1cyBub2RlKSkpCisgICAgbm9kZSkpCisKKyhkZWZ1biBnaXQtcGFyc2UtbHMtZmlsZXMgKHN0YXR1cyBkZWZhdWx0LXN0YXRlICZvcHRpb25hbCBza2lwLWV4aXN0aW5nKQorICAiUGFyc2UgdGhlIG91dHB1dCBvZiBnaXQtbHMtZmlsZXMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiIKKyAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgKGxldCAoaW5mb2xpc3QpCisgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAiXFwoW0hNUkNLP11cXCkgXFwoW15cMF0qXFwpXDAiIG5pbCB0IDEpCisgICAgICAobGV0ICgoc3RhdGUgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgIChuYW1lIChtYXRjaC1zdHJpbmcgMikpKQorICAgICAgICAodW5sZXNzIChhbmQgc2tpcC1leGlzdGluZyAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgc3RhdHVzIG5hbWUpKQorICAgICAgICAgIChwdXNoIChnaXQtY3JlYXRlLWZpbGVpbmZvIChvciAoZ2l0LXN0YXRlLWNvZGUgc3RhdGUpIGRlZmF1bHQtc3RhdGUpIG5hbWUpIGluZm9saXN0KSkpKQorICAgIChkb2xpc3QgKGluZm8gKG5yZXZlcnNlIGluZm9saXN0KSkKKyAgICAgIChld29jLWVudGVyLWxhc3Qgc3RhdHVzIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcGFyc2UtbHMtdW5tZXJnZWQgKHN0YXR1cykKKyAgIlBhcnNlIHRoZSBvdXRwdXQgb2YgZ2l0LWxzLWZpbGVzIC11IGluIHRoZSBjdXJyZW50IGJ1ZmZlci4iCisgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgIChsZXQgKGZpbGVzKQorICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlswLTddXFx7NlxcfSBbMC05YS1mXVxcezQwXFx9IFsxMjNdXHRcXChbXlwwXStcXClcMCIgbmlsIHQpCisgICAgICAobGV0ICgobm9kZSAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgc3RhdHVzIChtYXRjaC1zdHJpbmcgMSkpKSkKKyAgICAgICAgKHdoZW4gbm9kZSAocHVzaCAoZXdvYy1kYXRhIG5vZGUpIGZpbGVzKSkpKQorICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGZpbGVzICd1bm1lcmdlZCkpKQorCisoZGVmdW4gZ2l0LWFkZC1zdGF0dXMtZmlsZSAoc3RhdGUgbmFtZSkKKyAgIkFkZCBhIG5ldyBmaWxlIHRvIHRoZSBzdGF0dXMgbGlzdCAoaWYgbm90IGV4aXN0aW5nIGFscmVhZHkpIGFuZCByZXR1cm4gaXRzIG5vZGUuIgorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChvciAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgZ2l0LXN0YXR1cyBuYW1lKQorICAgICAgKGV3b2MtZW50ZXItbGFzdCBnaXQtc3RhdHVzIChnaXQtY3JlYXRlLWZpbGVpbmZvIHN0YXRlIG5hbWUpKSkpCisKKyhkZWZ1biBnaXQtbWFya2VkLWZpbGVzICgpCisgICJSZXR1cm4gYSBsaXN0IG9mIGFsbCBtYXJrZWQgZmlsZXMsIG9yIGlmIG5vbmUgYSBsaXN0IGNvbnRhaW5pbmcganVzdCB0aGUgZmlsZSBhdCBjdXJzb3IgcG9zaXRpb24uIgorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChvciAoZXdvYy1jb2xsZWN0IGdpdC1zdGF0dXMgKGxhbWJkYSAoaW5mbykgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pKSkKKyAgICAgIChsaXN0IChld29jLWRhdGEgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKSkpKQorCisoZGVmdW4gZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAoJnJlc3Qgc3RhdGVzKQorICAiUmV0dXJuIG1hcmtlZCBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgc3BlY2lmaWVkIHN0YXRlcy4iCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpCisgICAgICAgIHJlc3VsdCkKKyAgICAoZG9saXN0IChpbmZvIGZpbGVzKQorICAgICAgKHdoZW4gKG1lbXEgKGdpdC1maWxlaW5mby0+c3RhdGUgaW5mbykgc3RhdGVzKQorICAgICAgICAocHVzaCBpbmZvIHJlc3VsdCkpKQorICAgIHJlc3VsdCkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1maWxlcyAoKQorICAiUmVmcmVzaCBhbGwgZmlsZXMgdGhhdCBuZWVkIGl0IGFuZCBjbGVhciB0aGUgbmVlZHMtcmVmcmVzaCBmbGFnLiIKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1tYXAKKyAgIChsYW1iZGEgKGluZm8pCisgICAgIChsZXQgKChyZWZyZXNoIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykpKQorICAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykgbmlsKQorICAgICAgIHJlZnJlc2gpKQorICAgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4KKyAgKHdoZW4gZ29hbC1jb2x1bW4gKG1vdmUtdG8tY29sdW1uIGdvYWwtY29sdW1uKSkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1ld29jLWhmIChzdGF0dXMpCisgICJSZWZyZXNoIHRoZSBld29jIGhlYWRlciBhbmQgZm9vdGVyLiIKKyAgKGxldCAoKGJyYW5jaCAoZ2l0LXN5bWJvbGljLXJlZiAiSEVBRCIpKQorICAgICAgICAoaGVhZCAoaWYgKGdpdC1lbXB0eS1kYi1wKSAiTm90aGluZyBjb21taXR0ZWQgeWV0IgorICAgICAgICAgICAgICAgIChzdWJzdHJpbmcgKGdpdC1yZXYtcGFyc2UgIkhFQUQiKSAwIDEwKSkpCisgICAgICAgIChtZXJnZS1oZWFkcyAoZ2l0LWdldC1tZXJnZS1oZWFkcykpKQorICAgIChld29jLXNldC1oZiBzdGF0dXMKKyAgICAgICAgICAgICAgICAgKGZvcm1hdCAiRGlyZWN0b3J5OiAgJXNcbkJyYW5jaDogICAgICVzXG5IZWFkOiAgICAgICAlcyVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdC1kaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHN0cmluZy1tYXRjaCAiXnJlZnMvaGVhZHMvIiBicmFuY2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJzdHJpbmcgYnJhbmNoIChtYXRjaC1lbmQgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBtZXJnZS1oZWFkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ICJcbk1lcmdpbmc6ICAgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwY29uY2F0IChsYW1iZGEgKHN0cikgKHN1YnN0cmluZyBzdHIgMCAxMCkpIG1lcmdlLWhlYWRzICIgIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIikpCisgICAgICAgICAgICAgICAgIChpZiAoZXdvYy1udGggc3RhdHVzIDApICIiICIgICAgTm8gY2hhbmdlcy4iKSkpKQorCisoZGVmdW4gZ2l0LWdldC1maWxlbmFtZXMgKGZpbGVzKQorICAobWFwY2FyIChsYW1iZGEgKGluZm8pIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpIGZpbGVzKSkKKworKGRlZnVuIGdpdC11cGRhdGUtaW5kZXggKGluZGV4LWZpbGUgZmlsZXMpCisgICJSdW4gZ2l0LXVwZGF0ZS1pbmRleCBvbiBhIGxpc3Qgb2YgZmlsZXMuIgorICAobGV0ICgoZW52IChhbmQgaW5kZXgtZmlsZSBgKCgiR0lUX0lOREVYX0ZJTEUiIC4gLGluZGV4LWZpbGUpKSkpCisgICAgICAgIGFkZGVkIGRlbGV0ZWQgbW9kaWZpZWQpCisgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAgIChjYXNlIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pCisgICAgICAgICgnYWRkZWQgKHB1c2ggaW5mbyBhZGRlZCkpCisgICAgICAgICgnZGVsZXRlZCAocHVzaCBpbmZvIGRlbGV0ZWQpKQorICAgICAgICAoJ21vZGlmaWVkIChwdXNoIGluZm8gbW9kaWZpZWQpKSkpCisgICAgKHdoZW4gYWRkZWQKKyAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgZW52ICJ1cGRhdGUtaW5kZXgiICItLWFkZCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgYWRkZWQpKSkKKyAgICAod2hlbiBkZWxldGVkCisgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIGVudiAidXBkYXRlLWluZGV4IiAiLS1yZW1vdmUiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGRlbGV0ZWQpKSkKKyAgICAod2hlbiBtb2RpZmllZAorICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kIG5pbCBlbnYgInVwZGF0ZS1pbmRleCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgbW9kaWZpZWQpKSkpKQorCisoZGVmdW4gZ2l0LWRvLWNvbW1pdCAoKQorICAiUGVyZm9ybSB0aGUgYWN0dWFsIGNvbW1pdCB1c2luZyB0aGUgY3VycmVudCBidWZmZXIgYXMgbG9nIG1lc3NhZ2UuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChidWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAgICAgKGluZGV4LWZpbGUgKG1ha2UtdGVtcC1maWxlICJnaXRpZHgiKSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgbG9nLWVkaXQtcGFyZW50LWJ1ZmZlcgorICAgICAgKGlmIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICd1bm1lcmdlZCkKKyAgICAgICAgICAobWVzc2FnZSAiWW91IGNhbm5vdCBjb21taXQgdW5tZXJnZWQgZmlsZXMsIHJlc29sdmUgdGhlbSBmaXJzdC4iKQorICAgICAgICAodW53aW5kLXByb3RlY3QKKyAgICAgICAgICAgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAnYWRkZWQgJ2RlbGV0ZWQgJ21vZGlmaWVkKSkKKyAgICAgICAgICAgICAgICAgIGhlYWQgaGVhZC10cmVlKQorICAgICAgICAgICAgICAodW5sZXNzIChnaXQtZW1wdHktZGItcCkKKyAgICAgICAgICAgICAgICAoc2V0cSBoZWFkIChnaXQtcmV2LXBhcnNlICJIRUFEIikKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkLXRyZWUgKGdpdC1yZXYtcGFyc2UgIkhFQURee3RyZWV9IikpKQorICAgICAgICAgICAgICAoaWYgZmlsZXMKKyAgICAgICAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAgICAgICAoZ2l0LXJlYWQtdHJlZSBoZWFkLXRyZWUgaW5kZXgtZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgKGdpdC11cGRhdGUtaW5kZXggbmlsIGZpbGVzKSAgICAgICAgIDt1cGRhdGUgYm90aCB0aGUgZGVmYXVsdCBpbmRleAorICAgICAgICAgICAgICAgICAgICAoZ2l0LXVwZGF0ZS1pbmRleCBpbmRleC1maWxlIGZpbGVzKSAgO2FuZCB0aGUgdGVtcG9yYXJ5IG9uZQorICAgICAgICAgICAgICAgICAgICAobGV0ICgodHJlZSAoZ2l0LXdyaXRlLXRyZWUgaW5kZXgtZmlsZSkpKQorICAgICAgICAgICAgICAgICAgICAgIChpZiAob3IgKG5vdCAoc3RyaW5nLWVxdWFsIHRyZWUgaGVhZC10cmVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5ZXMtb3Itbm8tcCAiVGhlIHRyZWUgd2FzIG5vdCBtb2RpZmllZCwgZG8geW91IHJlYWxseSB3YW50IHRvIHBlcmZvcm0gYW4gZW1wdHkgY29tbWl0PyAiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKGNvbW1pdCAoZ2l0LWNvbW1pdC10cmVlIGJ1ZmZlciB0cmVlIGhlYWQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXVwZGF0ZS1yZWYgIkhFQUQiIGNvbW1pdCBoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25kaXRpb24tY2FzZSBuaWwgKGRlbGV0ZS1maWxlICIuZ2l0L01FUkdFX0hFQUQiKSAoZXJyb3IgbmlsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIgKGVyYXNlLWJ1ZmZlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ3VwdG9kYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtcmVmcmVzaC1maWxlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXJlZnJlc2gtZXdvYy1oZiBnaXQtc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlICJDb21taXR0ZWQgJXMuIiBjb21taXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIkNvbW1pdCBhYm9ydGVkLiIpKSkpCisgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIk5vIGZpbGVzIHRvIGNvbW1pdC4iKSkpCisgICAgICAgICAgKGRlbGV0ZS1maWxlIGluZGV4LWZpbGUpKSkpKSkKKworCis7Ozs7IEludGVyYWN0aXZlIGZ1bmN0aW9ucworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZnVuIGdpdC1tYXJrLWZpbGUgKCkKKyAgIk1hcmsgdGhlIGZpbGUgdGhhdCB0aGUgY3Vyc29yIGlzIG9uIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSB0KQorICAgIChld29jLWludmFsaWRhdGUgZ2l0LXN0YXR1cyBwb3MpCisgICAgKGV3b2MtZ290by1uZXh0IGdpdC1zdGF0dXMgMSkpKQorCisoZGVmdW4gZ2l0LXVubWFyay1maWxlICgpCisgICJVbm1hcmsgdGhlIGZpbGUgdGhhdCB0aGUgY3Vyc29yIGlzIG9uIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSBuaWwpCisgICAgKGV3b2MtaW52YWxpZGF0ZSBnaXQtc3RhdHVzIHBvcykKKyAgICAoZXdvYy1nb3RvLW5leHQgZ2l0LXN0YXR1cyAxKSkpCisKKyhkZWZ1biBnaXQtdW5tYXJrLWZpbGUtdXAgKCkKKyAgIlVubWFyayB0aGUgZmlsZSB0aGF0IHRoZSBjdXJzb3IgaXMgb24gYW5kIG1vdmUgdG8gdGhlIHByZXZpb3VzIG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSBuaWwpCisgICAgKGV3b2MtaW52YWxpZGF0ZSBnaXQtc3RhdHVzIHBvcykKKyAgICAoZXdvYy1nb3RvLXByZXYgZ2l0LXN0YXR1cyAxKSkpCisKKyhkZWZ1biBnaXQtbWFyay1hbGwgKCkKKyAgIk1hcmsgYWxsIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgdCkgdCkgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4gYWZ0ZXIgaW52YWxpZGF0ZQorICAod2hlbiBnb2FsLWNvbHVtbiAobW92ZS10by1jb2x1bW4gZ29hbC1jb2x1bW4pKSkKKworKGRlZnVuIGdpdC11bm1hcmstYWxsICgpCisgICJVbm1hcmsgYWxsIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgbmlsKSB0KSBnaXQtc3RhdHVzKQorICA7IG1vdmUgYmFjayB0byBnb2FsIGNvbHVtbiBhZnRlciBpbnZhbGlkYXRlCisgICh3aGVuIGdvYWwtY29sdW1uIChtb3ZlLXRvLWNvbHVtbiBnb2FsLWNvbHVtbikpKQorCisoZGVmdW4gZ2l0LXRvZ2dsZS1hbGwtbWFya3MgKCkKKyAgIlRvZ2dsZSBhbGwgZmlsZSBtYXJrcy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1tYXAgKGxhbWJkYSAoaW5mbykgKHNldGYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIChub3QgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pKSkgdCkgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4gYWZ0ZXIgaW52YWxpZGF0ZQorICAod2hlbiBnb2FsLWNvbHVtbiAobW92ZS10by1jb2x1bW4gZ29hbC1jb2x1bW4pKSkKKworKGRlZnVuIGdpdC1uZXh0LWZpbGUgKCZvcHRpb25hbCBuKQorICAiTW92ZSB0aGUgc2VsZWN0aW9uIGRvd24gTiBmaWxlcy4iCisgIChpbnRlcmFjdGl2ZSAicCIpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGV3b2MtZ290by1uZXh0IGdpdC1zdGF0dXMgbikpCisKKyhkZWZ1biBnaXQtcHJldi1maWxlICgmb3B0aW9uYWwgbikKKyAgIk1vdmUgdGhlIHNlbGVjdGlvbiB1cCBOIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1nb3RvLXByZXYgZ2l0LXN0YXR1cyBuKSkKKworKGRlZnVuIGdpdC1hZGQtZmlsZSAoKQorICAiQWRkIG1hcmtlZCBmaWxlKHMpIHRvIHRoZSBpbmRleCBjYWNoZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICd1bmtub3duKSkpCisgICAgKHVubGVzcyBmaWxlcworICAgICAgKHB1c2ggKGV3b2MtZGF0YQorICAgICAgICAgICAgIChnaXQtYWRkLXN0YXR1cy1maWxlICdhZGRlZCAoZmlsZS1yZWxhdGl2ZS1uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZC1maWxlLW5hbWUgIkZpbGUgdG8gYWRkOiAiIG5pbCBuaWwgdCkpKSkKKyAgICAgICAgICAgIGZpbGVzKSkKKyAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1pbmZvLW9ubHkiICItLWFkZCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKQorICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGZpbGVzICdhZGRlZCkKKyAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpKSkKKworKGRlZnVuIGdpdC1pZ25vcmUtZmlsZSAoKQorICAiQWRkIG1hcmtlZCBmaWxlKHMpIHRvIHRoZSBpZ25vcmUgbGlzdC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICd1bmtub3duKSkpCisgICAgKHVubGVzcyBmaWxlcworICAgICAgKHB1c2ggKGV3b2MtZGF0YQorICAgICAgICAgICAgIChnaXQtYWRkLXN0YXR1cy1maWxlICd1bmtub3duIChmaWxlLXJlbGF0aXZlLW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWQtZmlsZS1uYW1lICJGaWxlIHRvIGlnbm9yZTogIiBuaWwgbmlsIHQpKSkpCisgICAgICAgICAgICBmaWxlcykpCisgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykgKGdpdC1hcHBlbmQtdG8taWdub3JlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpKQorICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGZpbGVzICdpZ25vcmVkKQorICAgIChnaXQtcmVmcmVzaC1maWxlcykpKQorCisoZGVmdW4gZ2l0LXJlbW92ZS1maWxlICgpCisgICJSZW1vdmUgdGhlIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdtb2RpZmllZCAndW5rbm93biAndXB0b2RhdGUpKSkKKyAgICAodW5sZXNzIGZpbGVzCisgICAgICAocHVzaCAoZXdvYy1kYXRhCisgICAgICAgICAgICAgKGdpdC1hZGQtc3RhdHVzLWZpbGUgJ3Vua25vd24gKGZpbGUtcmVsYXRpdmUtbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZC1maWxlLW5hbWUgIkZpbGUgdG8gcmVtb3ZlOiAiIG5pbCBuaWwgdCkpKSkKKyAgICAgICAgICAgIGZpbGVzKSkKKyAgICAoaWYgKHllcy1vci1uby1wCisgICAgICAgICAoZm9ybWF0ICJSZW1vdmUgJWQgZmlsZSVzPyAiIChsZW5ndGggZmlsZXMpIChpZiAoPiAobGVuZ3RoIGZpbGVzKSAxKSAicyIgIiIpKSkKKyAgICAgICAgKHByb2duCisgICAgICAgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAgICAgICAgIChsZXQgKChuYW1lIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpKQorICAgICAgICAgICAgICAod2hlbiAoZmlsZS1leGlzdHMtcCBuYW1lKSAoZGVsZXRlLWZpbGUgbmFtZSkpKSkKKyAgICAgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1pbmZvLW9ubHkiICItLXJlbW92ZSIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKQorICAgICAgICAgIDsgcmVtb3ZlIHVua25vd24gZmlsZXMgZnJvbSB0aGUgbGlzdCwgc2V0IHRoZSBvdGhlcnMgdG8gZGVsZXRlZAorICAgICAgICAgIChld29jLWZpbHRlciBnaXQtc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGluZm8gZmlsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoYW5kIChtZW1xIGluZm8gZmlsZXMpIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSAndW5rbm93bikpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpCisgICAgICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ2RlbGV0ZWQpCisgICAgICAgICAgKGdpdC1yZWZyZXNoLWZpbGVzKQorICAgICAgICAgICh1bmxlc3MgKGV3b2MtbnRoIGdpdC1zdGF0dXMgMCkgIDsgcmVmcmVzaCBoZWFkZXIgaWYgbGlzdCBpcyBlbXB0eQorICAgICAgICAgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgZ2l0LXN0YXR1cykpKQorICAgICAgKG1lc3NhZ2UgIkFib3J0aW5nIikpKSkKKworKGRlZnVuIGdpdC1yZXZlcnQtZmlsZSAoKQorICAiUmV2ZXJ0IGNoYW5nZXMgdG8gdGhlIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMpKQorICAgICAgICBhZGRlZCBtb2RpZmllZCkKKyAgICAod2hlbiAoYW5kIGZpbGVzCisgICAgICAgICAgICAgICAoeWVzLW9yLW5vLXAKKyAgICAgICAgICAgICAgICAoZm9ybWF0ICJSZXZlcnQgJWQgZmlsZSVzPyAiIChsZW5ndGggZmlsZXMpIChpZiAoPiAobGVuZ3RoIGZpbGVzKSAxKSAicyIgIiIpKSkpCisgICAgICAoZG9saXN0IChpbmZvIGZpbGVzKQorICAgICAgICAoY2FzZSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKQorICAgICAgICAgICgnYWRkZWQgKHB1c2ggaW5mbyBhZGRlZCkpCisgICAgICAgICAgKCdkZWxldGVkIChwdXNoIGluZm8gbW9kaWZpZWQpKQorICAgICAgICAgICgndW5tZXJnZWQgKHB1c2ggaW5mbyBtb2RpZmllZCkpCisgICAgICAgICAgKCdtb2RpZmllZCAocHVzaCBpbmZvIG1vZGlmaWVkKSkpKQorICAgICAgKHdoZW4gYWRkZWQKKyAgICAgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1mb3JjZS1yZW1vdmUiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGFkZGVkKSkKKyAgICAgICAgICAoZ2l0LXNldC1maWxlcy1zdGF0ZSBhZGRlZCAndW5rbm93bikpCisgICAgICAod2hlbiBtb2RpZmllZAorICAgICAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJjaGVja291dCIgIkhFQUQiIChnaXQtZ2V0LWZpbGVuYW1lcyBtb2RpZmllZCkpCisgICAgICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgbW9kaWZpZWQgJ3VwdG9kYXRlKSkKKyAgICAgIChnaXQtcmVmcmVzaC1maWxlcykpKSkKKworKGRlZnVuIGdpdC1yZXNvbHZlLWZpbGUgKCkKKyAgIlJlc29sdmUgY29uZmxpY3RzIGluIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ3VubWVyZ2VkKSkpCisgICAgKHdoZW4gZmlsZXMKKyAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKQorICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ21vZGlmaWVkKQorICAgICAgKGdpdC1yZWZyZXNoLWZpbGVzKSkpKQorCisoZGVmdW4gZ2l0LXJlbW92ZS1oYW5kbGVkICgpCisgICJSZW1vdmUgaGFuZGxlZCBmaWxlcyBmcm9tIHRoZSBzdGF0dXMgbGlzdC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGV3b2MtZmlsdGVyIGdpdC1zdGF0dXMKKyAgICAgICAgICAgICAgIChsYW1iZGEgKGluZm8pCisgICAgICAgICAgICAgICAgIChub3QgKG9yIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSAnaWdub3JlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pICd1cHRvZGF0ZSkpKSkpCisgICh1bmxlc3MgKGV3b2MtbnRoIGdpdC1zdGF0dXMgMCkgIDsgcmVmcmVzaCBoZWFkZXIgaWYgbGlzdCBpcyBlbXB0eQorICAgIChnaXQtcmVmcmVzaC1ld29jLWhmIGdpdC1zdGF0dXMpKSkKKworKGRlZnVuIGdpdC1zZXR1cC1kaWZmLWJ1ZmZlciAoYnVmZmVyKQorICAiU2V0dXAgYSBidWZmZXIgZm9yIGRpc3BsYXlpbmcgYSBkaWZmLiIKKyAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgKGRpZmYtbW9kZSkKKyAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgdCkpCisgIChkaXNwbGF5LWJ1ZmZlciBidWZmZXIpCisgIChzaHJpbmstd2luZG93LWlmLWxhcmdlci10aGFuLWJ1ZmZlcikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlICgpCisgICJEaWZmIHRoZSBtYXJrZWQgZmlsZShzKSBhZ2FpbnN0IEhFQUQuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpKQorICAgIChnaXQtc2V0dXAtZGlmZi1idWZmZXIKKyAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1kaWZmKiIgImRpZmYtaW5kZXgiICItcCIgIi1NIiAiSEVBRCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1tZXJnZS1oZWFkIChhcmcpCisgICJEaWZmIHRoZSBtYXJrZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBmaXJzdCBtZXJnZSBoZWFkIChvciB0aGUgbnRoIG9uZSB3aXRoIGEgbnVtZXJpYyBwcmVmaXgpLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzKSkKKyAgICAgICAgKG1lcmdlLWhlYWRzIChnaXQtZ2V0LW1lcmdlLWhlYWRzKSkpCisgICAgKHVubGVzcyBtZXJnZS1oZWFkcyAoZXJyb3IgIk5vIG1lcmdlIGluIHByb2dyZXNzIikpCisgICAgKGdpdC1zZXR1cC1kaWZmLWJ1ZmZlcgorICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQtYnVmZmVyICIqZ2l0LWRpZmYqIiAiZGlmZi1pbmRleCIgIi1wIiAiLU0iCisgICAgICAgICAgICAob3IgKG50aCAoMS0gYXJnKSBtZXJnZS1oZWFkcykgIkhFQUQiKSAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBmaWxlcykpKSkpCisKKyhkZWZ1biBnaXQtZGlmZi11bm1lcmdlZC1maWxlIChzdGFnZSkKKyAgIkRpZmYgdGhlIG1hcmtlZCB1bm1lcmdlZCBmaWxlKHMpIGFnYWluc3QgdGhlIHNwZWNpZmllZCBzdGFnZS4iCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpKQorICAgIChnaXQtc2V0dXAtZGlmZi1idWZmZXIKKyAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1kaWZmKiIgImRpZmYtZmlsZXMiICItcCIgc3RhZ2UgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1iYXNlICgpCisgICJEaWZmIHRoZSBtYXJrZWQgdW5tZXJnZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBjb21tb24gYmFzZSBmaWxlLiIKKyAgKGludGVyYWN0aXZlKQorICAoZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAiLTEiKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtbWluZSAoKQorICAiRGlmZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykgYWdhaW5zdCBteSBwcmUtbWVyZ2UgdmVyc2lvbi4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGdpdC1kaWZmLXVubWVyZ2VkLWZpbGUgIi0yIikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlLW90aGVyICgpCisgICJEaWZmIHRoZSBtYXJrZWQgdW5tZXJnZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBvdGhlcidzIHByZS1tZXJnZSB2ZXJzaW9uLiIKKyAgKGludGVyYWN0aXZlKQorICAoZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAiLTMiKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtY29tYmluZWQgKCkKKyAgIkRvIGEgY29tYmluZWQgZGlmZiBvZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChnaXQtZGlmZi11bm1lcmdlZC1maWxlICItYyIpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1pZGlmZiAoKQorICAiUGVyZm9ybSBhbiBpbnRlcmFjdGl2ZSBkaWZmIG9uIHRoZSBjdXJyZW50IGZpbGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChlcnJvciAiSW50ZXJhY3RpdmUgZGlmZnMgbm90IGltcGxlbWVudGVkIHlldC4iKSkKKworKGRlZnVuIGdpdC1sb2ctZmlsZSAoKQorICAiRGlzcGxheSBhIGxvZyBvZiBjaGFuZ2VzIHRvIHRoZSBtYXJrZWQgZmlsZShzKS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCogKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpCisgICAgICAgICAoY29kaW5nLXN5c3RlbS1mb3ItcmVhZCBnaXQtY29tbWl0cy1jb2Rpbmctc3lzdGVtKQorICAgICAgICAgKGJ1ZmZlciAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQtYnVmZmVyICIqZ2l0LWxvZyoiICJyZXYtbGlzdCIgIi0tcHJldHR5IiAiSEVBRCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICA7IChnaXQtbG9nLW1vZGUpICBGSVhNRTogaW1wbGVtZW50IGxvZyBtb2RlCisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgKHNldHEgYnVmZmVyLXJlYWQtb25seSB0KSkKKyAgICAoZGlzcGxheS1idWZmZXIgYnVmZmVyKSkpCisKKyhkZWZ1biBnaXQtbG9nLWVkaXQtZmlsZXMgKCkKKyAgIlJldHVybiBhIGxpc3Qgb2YgbWFya2VkIGZpbGVzIGZvciB1c2UgaW4gdGhlIGxvZy1lZGl0IGJ1ZmZlci4iCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGxvZy1lZGl0LXBhcmVudC1idWZmZXIKKyAgICAoZ2l0LWdldC1maWxlbmFtZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCkpKSkKKworKGRlZnVuIGdpdC1jb21taXQtZmlsZSAoKQorICAiQ29tbWl0IHRoZSBtYXJrZWQgZmlsZShzKSwgYXNraW5nIGZvciBhIGNvbW1pdCBtZXNzYWdlLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChsZXQgKChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlICIqZ2l0LWNvbW1pdCoiKSkKKyAgICAgICAgKG1lcmdlLWhlYWRzIChnaXQtZ2V0LW1lcmdlLWhlYWRzKSkKKyAgICAgICAgKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkKKyAgICAgICAgKHNpZ24tb2ZmIGdpdC1hcHBlbmQtc2lnbmVkLW9mZi1ieSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAod2hlbiAoZXEgMCAoYnVmZmVyLXNpemUpKQorICAgICAgICAoY2QgZGlyKQorICAgICAgICAoZXJhc2UtYnVmZmVyKQorICAgICAgICAoaW5zZXJ0CisgICAgICAgICAocHJvcGVydGl6ZQorICAgICAgICAgIChmb3JtYXQgIkF1dGhvcjogJXMgPCVzPlxuJXMiCisgICAgICAgICAgICAgICAgICAoZ2l0LWdldC1jb21taXR0ZXItbmFtZSkgKGdpdC1nZXQtY29tbWl0dGVyLWVtYWlsKQorICAgICAgICAgICAgICAgICAgKGlmIG1lcmdlLWhlYWRzCisgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiUGFyZW50OiAlc1xuJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtcmV2LXBhcnNlICJIRUFEIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgKGxhbWJkYSAoc3RyKSAoY29uY2F0ICJQYXJlbnQ6ICIgc3RyKSkgbWVyZ2UtaGVhZHMgIlxuIikpCisgICAgICAgICAgICAgICAgICAgICIiKSkKKyAgICAgICAgICAnZmFjZSAnZ2l0LWhlYWRlci1mYWNlKQorICAgICAgICAgKHByb3BlcnRpemUgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yICdmYWNlICdnaXQtc2VwYXJhdG9yLWZhY2UpCisgICAgICAgICAiXG4iKQorICAgICAgICAoY29uZCAoKGFuZCBtZXJnZS1oZWFkcyAoZmlsZS1yZWFkYWJsZS1wICIuZ2l0L01FUkdFX01TRyIpKQorICAgICAgICAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzICIuZ2l0L01FUkdFX01TRyIpKQorICAgICAgICAgICAgICAoc2lnbi1vZmYKKyAgICAgICAgICAgICAgIChpbnNlcnQgKGZvcm1hdCAiXG5cblNpZ25lZC1vZmYtYnk6ICVzIDwlcz5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWdldC1jb21taXR0ZXItbmFtZSkgKGdpdC1nZXQtY29tbWl0dGVyLWVtYWlsKSkpKSkpKQorICAgIChsZXQgKChsb2ctZWRpdC1mb250LWxvY2sta2V5d29yZHMKKyAgICAgICAgICAgYCgoIl5cXChBdXRob3I6XFx8RGF0ZTpcXHxQYXJlbnQ6XFx8U2lnbmVkLW9mZi1ieTpcXClcXCguKlxcKSIKKyAgICAgICAgICAgICAgKDEgZm9udC1sb2NrLWtleXdvcmQtZmFjZSkKKyAgICAgICAgICAgICAgKDIgZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkpCisgICAgICAgICAgICAgKCwoY29uY2F0ICJeXFwoIiAocmVnZXhwLXF1b3RlIGdpdC1sb2ctbXNnLXNlcGFyYXRvcikgIlxcKSQiKQorICAgICAgICAgICAgICAoMSBmb250LWxvY2stY29tbWVudC1mYWNlKSkpKSkKKyAgICAgIChsb2ctZWRpdCAjJ2dpdC1kby1jb21taXQgbmlsICMnZ2l0LWxvZy1lZGl0LWZpbGVzIGJ1ZmZlcikpKSkKKworKGRlZnVuIGdpdC1maW5kLWZpbGUgKCkKKyAgIlZpc2l0IHRoZSBjdXJyZW50IGZpbGUgaW4gaXRzIG93biBidWZmZXIuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGluZm8gKGV3b2MtZGF0YSAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpKSkKKyAgICAoZmluZC1maWxlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHdoZW4gKGVxICd1bm1lcmdlZCAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSkKKyAgICAgIChzbWVyZ2UtbW9kZSkpKSkKKworKGRlZnVuIGdpdC1maW5kLWZpbGUtaW1lcmdlICgpCisgICJWaXNpdCB0aGUgY3VycmVudCBmaWxlIGluIGludGVyYWN0aXZlIG1lcmdlIG1vZGUuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGluZm8gKGV3b2MtZGF0YSAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpKSkKKyAgICAoZmluZC1maWxlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHNtZXJnZS1lZGlmZikpKQorCisoZGVmdW4gZ2l0LXZpZXctZmlsZSAoKQorICAiVmlldyB0aGUgY3VycmVudCBmaWxlIGluIGl0cyBvd24gYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChsZXQgKChpbmZvIChld29jLWRhdGEgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKSkpCisgICAgKHZpZXctZmlsZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1zdGF0dXMgKCkKKyAgIlJlZnJlc2ggdGhlIGdpdCBzdGF0dXMgYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0KiAoKHN0YXR1cyBnaXQtc3RhdHVzKQorICAgICAgICAgKHBvcyAoZXdvYy1sb2NhdGUgc3RhdHVzKSkKKyAgICAgICAgIChjdXItbmFtZSAoYW5kIHBvcyAoZ2l0LWZpbGVpbmZvLT5uYW1lIChld29jLWRhdGEgcG9zKSkpKSkKKyAgICAodW5sZXNzIHN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgICAoZ2l0LWNsZWFyLXN0YXR1cyBzdGF0dXMpCisgICAgKGdpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tcmVmcmVzaCIpCisgICAgKGlmIChnaXQtZW1wdHktZGItcCkKKyAgICAgICAgOyB3ZSBuZWVkIHNvbWUgc3BlY2lhbCBoYW5kbGluZyBmb3IgYW4gZW1wdHkgZGIKKyAgICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgICAoZ2l0LXJ1bi1jb21tYW5kIHQgbmlsICJscy1maWxlcyIgIi16IiAiLXQiICItYyIpCisgICAgICAgICAgKGdpdC1wYXJzZS1scy1maWxlcyBzdGF0dXMgJ2FkZGVkKSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgIChnaXQtcnVuLWNvbW1hbmQgdCBuaWwgImRpZmYtaW5kZXgiICIteiIgIi1NIiAiSEVBRCIpCisgICAgICAgIChnaXQtcGFyc2Utc3RhdHVzIHN0YXR1cykpKQorICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgKGdpdC1ydW4tY29tbWFuZCB0IG5pbCAibHMtZmlsZXMiICIteiIgIi11IikKKyAgICAgICAgKGdpdC1wYXJzZS1scy11bm1lcmdlZCBzdGF0dXMpKQorICAgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCAiLmdpdC9pbmZvL2V4Y2x1ZGUiKQorICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAgIChnaXQtcnVuLWNvbW1hbmQgdCBuaWwgImxzLWZpbGVzIiAiLXoiICItdCIgIi1vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZXhjbHVkZS1mcm9tPS5naXQvaW5mby9leGNsdWRlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAiLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9IiBnaXQtcGVyLWRpci1pZ25vcmUtZmlsZSkpCisgICAgICAgICAgKGdpdC1wYXJzZS1scy1maWxlcyBzdGF0dXMgJ3Vua25vd24pKSkKKyAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpCisgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgc3RhdHVzKQorICAgIDsgbW92ZSBwb2ludCB0byB0aGUgY3VycmVudCBmaWxlIG5hbWUgaWYgYW55CisgICAgKGxldCAoKG5vZGUgKGFuZCBjdXItbmFtZSAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgc3RhdHVzIGN1ci1uYW1lKSkpKQorICAgICAgKHdoZW4gbm9kZSAoZXdvYy1nb3RvLW5vZGUgc3RhdHVzIG5vZGUpKSkpKQorCisoZGVmdW4gZ2l0LXN0YXR1cy1xdWl0ICgpCisgICJRdWl0IGdpdC1zdGF0dXMgbW9kZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGJ1cnktYnVmZmVyKSkKKworOzs7OyBNYWpvciBNb2RlCis7Ozs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoZGVmdmFyIGdpdC1zdGF0dXMtbW9kZS1ob29rIG5pbAorICAiUnVuIGFmdGVyIGBnaXQtc3RhdHVzLW1vZGUnIGlzIHNldHVwLiIpCisKKyhkZWZ2YXIgZ2l0LXN0YXR1cy1tb2RlLW1hcCBuaWwKKyAgIktleW1hcCBmb3IgZ2l0IG1ham9yIG1vZGUuIikKKworKGRlZnZhciBnaXQtc3RhdHVzIG5pbAorICAiTGlzdCBvZiBhbGwgZmlsZXMgbWFuYWdlZCBieSB0aGUgZ2l0LXN0YXR1cyBtb2RlLiIpCisKKyh1bmxlc3MgZ2l0LXN0YXR1cy1tb2RlLW1hcAorICAobGV0ICgobWFwIChtYWtlLWtleW1hcCkpCisgICAgICAgIChkaWZmLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkpCisgICAgKHN1cHByZXNzLWtleW1hcCBtYXApCisgICAgKGRlZmluZS1rZXkgbWFwICIgIiAgICdnaXQtbmV4dC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiYSIgICAnZ2l0LWFkZC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiYyIgICAnZ2l0LWNvbW1pdC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiZCIgICAgZGlmZi1tYXApCisgICAgKGRlZmluZS1rZXkgbWFwICI9IiAgICdnaXQtZGlmZi1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiZiIgICAnZ2l0LWZpbmQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlxyIiAgJ2dpdC1maW5kLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJnIiAgICdnaXQtcmVmcmVzaC1zdGF0dXMpCisgICAgKGRlZmluZS1rZXkgbWFwICJpIiAgICdnaXQtaWdub3JlLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJsIiAgICdnaXQtbG9nLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJtIiAgICdnaXQtbWFyay1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiTSIgICAnZ2l0LW1hcmstYWxsKQorICAgIChkZWZpbmUta2V5IG1hcCAibiIgICAnZ2l0LW5leHQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgInAiICAgJ2dpdC1wcmV2LWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJxIiAgICdnaXQtc3RhdHVzLXF1aXQpCisgICAgKGRlZmluZS1rZXkgbWFwICJyIiAgICdnaXQtcmVtb3ZlLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJSIiAgICdnaXQtcmVzb2x2ZS1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiVCIgICAnZ2l0LXRvZ2dsZS1hbGwtbWFya3MpCisgICAgKGRlZmluZS1rZXkgbWFwICJ1IiAgICdnaXQtdW5tYXJrLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJVIiAgICdnaXQtcmV2ZXJ0LWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJ2IiAgICdnaXQtdmlldy1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAieCIgICAnZ2l0LXJlbW92ZS1oYW5kbGVkKQorICAgIChkZWZpbmUta2V5IG1hcCAiXEMtPyIgJ2dpdC11bm1hcmstZmlsZS11cCkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlxNLVxDLT8iICdnaXQtdW5tYXJrLWFsbCkKKyAgICA7IHRoZSBkaWZmIHN1Ym1hcAorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICJiIiAnZ2l0LWRpZmYtZmlsZS1iYXNlKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICJjIiAnZ2l0LWRpZmYtZmlsZS1jb21iaW5lZCkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiPSIgJ2dpdC1kaWZmLWZpbGUpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgImUiICdnaXQtZGlmZi1maWxlLWlkaWZmKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICJFIiAnZ2l0LWZpbmQtZmlsZS1pbWVyZ2UpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgImgiICdnaXQtZGlmZi1maWxlLW1lcmdlLWhlYWQpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgIm0iICdnaXQtZGlmZi1maWxlLW1pbmUpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgIm8iICdnaXQtZGlmZi1maWxlLW90aGVyKQorICAgIChzZXRxIGdpdC1zdGF0dXMtbW9kZS1tYXAgbWFwKSkpCisKKzs7IGdpdCBtb2RlIHNob3VsZCBvbmx5IHJ1biBpbiB0aGUgKmdpdCBzdGF0dXMqIGJ1ZmZlcgorKHB1dCAnZ2l0LXN0YXR1cy1tb2RlICdtb2RlLWNsYXNzICdzcGVjaWFsKQorCisoZGVmdW4gZ2l0LXN0YXR1cy1tb2RlICgpCisgICJNYWpvciBtb2RlIGZvciBpbnRlcmFjdGluZyB3aXRoIEdpdC4KK0NvbW1hbmRzOgorXFx7Z2l0LXN0YXR1cy1tb2RlLW1hcH0iCisgIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpCisgIChidWZmZXItZGlzYWJsZS11bmRvKQorICAoc2V0cSBtb2RlLW5hbWUgImdpdCBzdGF0dXMiCisgICAgICAgIG1ham9yLW1vZGUgJ2dpdC1zdGF0dXMtbW9kZQorICAgICAgICBnb2FsLWNvbHVtbiAxNworICAgICAgICBidWZmZXItcmVhZC1vbmx5IHQpCisgICh1c2UtbG9jYWwtbWFwIGdpdC1zdGF0dXMtbW9kZS1tYXApCisgIChsZXQgKChidWZmZXItcmVhZC1vbmx5IG5pbCkpCisgICAgKGVyYXNlLWJ1ZmZlcikKKyAgKGxldCAoKHN0YXR1cyAoZXdvYy1jcmVhdGUgJ2dpdC1maWxlaW5mby1wcmV0dHlwcmludCAiIiAiIikpKQorICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2dpdC1zdGF0dXMpIHN0YXR1cykpCisgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2xpc3QtYnVmZmVycy1kaXJlY3RvcnkpIGRlZmF1bHQtZGlyZWN0b3J5KQorICAocnVuLWhvb2tzICdnaXQtc3RhdHVzLW1vZGUtaG9vaykpKQorCisoZGVmdW4gZ2l0LXN0YXR1cyAoZGlyKQorICAiRW50cnkgcG9pbnQgaW50byBnaXQtc3RhdHVzIG1vZGUuIgorICAoaW50ZXJhY3RpdmUgIkRTZWxlY3QgZGlyZWN0b3J5OiAiKQorICAoc2V0cSBkaXIgKGdpdC1nZXQtdG9wLWRpciBkaXIpKQorICAoaWYgKGZpbGUtZGlyZWN0b3J5LXAgKGNvbmNhdCAoZmlsZS1uYW1lLWFzLWRpcmVjdG9yeSBkaXIpICIuZ2l0IikpCisgICAgICAobGV0ICgoYnVmZmVyIChjcmVhdGUtZmlsZS1idWZmZXIgKGV4cGFuZC1maWxlLW5hbWUgIipnaXQtc3RhdHVzKiIgZGlyKSkpKQorICAgICAgICAoc3dpdGNoLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgICAgIChjZCBkaXIpCisgICAgICAgIChnaXQtc3RhdHVzLW1vZGUpCisgICAgICAgIChnaXQtcmVmcmVzaC1zdGF0dXMpCisgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpKQorICAgIChtZXNzYWdlICIlcyBpcyBub3QgYSBnaXQgd29ya2luZyB0cmVlLiIgZGlyKSkpCisKKyhwcm92aWRlICdnaXQpCis7OzsgZ2l0LmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9lbWFjcy92Yy1naXQuZWwgYi9jb250cmliL2VtYWNzL3ZjLWdpdC5lbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDUzY2RjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9lbWFjcy92Yy1naXQuZWwKQEAgLTAsMCArMSwxMzUgQEAKKzs7OyB2Yy1naXQuZWwgLS0tIFZDIGJhY2tlbmQgZm9yIHRoZSBnaXQgdmVyc2lvbiBjb250cm9sIHN5c3RlbQorCis7OyBDb3B5cmlnaHQgKEMpIDIwMDYgQWxleGFuZHJlIEp1bGxpYXJkCisKKzs7IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzs7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCis7OyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorOzsgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7OworOzsgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorOzsgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorOzsgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorOzsgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKzs7IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKzs7IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCis7OyBNQSAwMjExMS0xMzA3IFVTQQorCis7OzsgQ29tbWVudGFyeToKKworOzsgVGhpcyBmaWxlIGNvbnRhaW5zIGEgVkMgYmFja2VuZCBmb3IgdGhlIGdpdCB2ZXJzaW9uIGNvbnRyb2wKKzs7IHN5c3RlbS4KKzs7Cis7OyBUbyBpbnN0YWxsOiBwdXQgdGhpcyBmaWxlIG9uIHRoZSBsb2FkLXBhdGggYW5kIGFkZCBHSVQgdG8gdGhlIGxpc3QKKzs7IG9mIHN1cHBvcnRlZCBiYWNrZW5kcyBpbiBgdmMtaGFuZGxlZC1iYWNrZW5kcycuCis7OworOzsgVE9ETworOzsgIC0gY2hhbmdlbG9nIGdlbmVyYXRpb24KKzs7ICAtIHdvcmtpbmcgd2l0aCByZXZpc2lvbnMgb3RoZXIgdGhhbiBIRUFECis7OworCisoZGVmdmFyIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0gJ3V0Zi04CisgICJEZWZhdWx0IGNvZGluZyBzeXN0ZW0gZm9yIGdpdCBjb21taXRzLiIpCisKKyhkZWZ1biB2Yy1naXQtLXJ1bi1jb21tYW5kLXN0cmluZyAoZmlsZSAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQgb24gRklMRSBhbmQgcmV0dXJuIGl0cyBvdXRwdXQgYXMgc3RyaW5nLiIKKyAgKGxldCogKChvayB0KQorICAgICAgICAgKHN0ciAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQtb3V0cHV0CisgICAgICAgICAgICAgICAgICAodW5sZXNzIChlcSAwIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgJyh0IG5pbCkgbmlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIGFyZ3MgKGxpc3QgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgKHNldHEgb2sgbmlsKSkpKSkpCisgICAgKGFuZCBvayBzdHIpKSkKKworKGRlZnVuIHZjLWdpdC0tcnVuLWNvbW1hbmQgKGZpbGUgJnJlc3QgYXJncykKKyAgIlJ1biBhIGdpdCBjb21tYW5kIG9uIEZJTEUsIGRpc2NhcmRpbmcgYW55IG91dHB1dC4iCisgIChsZXQgKChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpKQorICAgIChlcSAwIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgKGdldC1idWZmZXIgIipNZXNzYWdlcyIpIG5pbCAoYXBwZW5kIGFyZ3MgKGxpc3QgbmFtZSkpKSkpKQorCisoZGVmdW4gdmMtZ2l0LXJlZ2lzdGVyZWQgKGZpbGUpCisgICJDaGVjayB3aGV0aGVyIEZJTEUgaXMgcmVnaXN0ZXJlZCB3aXRoIGdpdC4iCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGxldCogKChkaXIgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZSkpCisgICAgICAgICAgIChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSBkaXIpKSkKKyAgICAgICh3aGVuIGRpciAoY2QgZGlyKSkKKyAgICAgIChhbmQgKGVxIDAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgJyh0IG5pbCkgbmlsICJscy1maWxlcyIgIi1jIiAiLXoiICItLSIgbmFtZSkpCisgICAgICAgICAgIChsZXQgKChzdHIgKGJ1ZmZlci1zdHJpbmcpKSkKKyAgICAgICAgICAgICAoYW5kICg+IChsZW5ndGggc3RyKSAobGVuZ3RoIG5hbWUpKQorICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHN1YnN0cmluZyBzdHIgMCAoMSsgKGxlbmd0aCBuYW1lKSkpIChjb25jYXQgbmFtZSAiXDAiKSkpKSkpKSkKKworKGRlZnVuIHZjLWdpdC1zdGF0ZSAoZmlsZSkKKyAgImdpdC1zcGVjaWZpYyB2ZXJzaW9uIG9mIGB2Yy1zdGF0ZScuIgorICAobGV0ICgoZGlmZiAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAiZGlmZi1pbmRleCIgIi16IiAiSEVBRCIgIi0tIikpKQorICAgIChpZiAoYW5kIGRpZmYgKHN0cmluZy1tYXRjaCAiOlswLTddXFx7NlxcfSBbMC03XVxcezZcXH0gWzAtOWEtZl1cXHs0MFxcfSBbMC05YS1mXVxcezQwXFx9IFtBRE1VXVwwW15cMF0rXDAiIGRpZmYpKQorICAgICAgICAnZWRpdGVkCisgICAgICAndXAtdG8tZGF0ZSkpKQorCisoZGVmdW4gdmMtZ2l0LXdvcmtmaWxlLXZlcnNpb24gKGZpbGUpCisgICJnaXQtc3BlY2lmaWMgdmVyc2lvbiBvZiBgdmMtd29ya2ZpbGUtdmVyc2lvbicuIgorICAobGV0ICgoc3RyICh3aXRoLW91dHB1dC10by1zdHJpbmcKKyAgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAorICAgICAgICAgICAgICAgICAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCAnKHQgbmlsKSBuaWwgInN5bWJvbGljLXJlZiIgIkhFQUQiKSkpKSkKKyAgICAoaWYgKHN0cmluZy1tYXRjaCAiXlxcKHJlZnMvaGVhZHMvXFwpP1xcKC4rXFwpJCIgc3RyKQorICAgICAgICAobWF0Y2gtc3RyaW5nIDIgc3RyKQorICAgICAgc3RyKSkpCisKKyhkZWZ1biB2Yy1naXQtcmV2ZXJ0IChmaWxlICZvcHRpb25hbCBjb250ZW50cy1kb25lKQorICAiUmV2ZXJ0IEZJTEUgdG8gdGhlIHZlcnNpb24gc3RvcmVkIGluIHRoZSBnaXQgcmVwb3NpdG9yeS4iCisgIChpZiBjb250ZW50cy1kb25lCisgICAgICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJ1cGRhdGUtaW5kZXgiICItLSIpCisgICAgKHZjLWdpdC0tcnVuLWNvbW1hbmQgZmlsZSAiY2hlY2tvdXQiICJIRUFEIikpKQorCisoZGVmdW4gdmMtZ2l0LWNoZWNrb3V0LW1vZGVsIChmaWxlKQorICAnaW1wbGljaXQpCisKKyhkZWZ1biB2Yy1naXQtd29ya2ZpbGUtdW5jaGFuZ2VkLXAgKGZpbGUpCisgIChsZXQgKChzaGExICh2Yy1naXQtLXJ1bi1jb21tYW5kLXN0cmluZyBmaWxlICJoYXNoLW9iamVjdCIgIi0tIikpCisgICAgICAgIChoZWFkICh2Yy1naXQtLXJ1bi1jb21tYW5kLXN0cmluZyBmaWxlICJscy10cmVlIiAiLXoiICJIRUFEIiAiLS0iKSkpCisgICAgKGFuZCBoZWFkCisgICAgICAgICAoc3RyaW5nLW1hdGNoICJbMC03XVxcezZcXH0gYmxvYiBcXChbMC05YS1mXVxcezQwXFx9XFwpXHRbXlwwXStcMCIgaGVhZCkKKyAgICAgICAgIChzdHJpbmc9IChjYXIgKHNwbGl0LXN0cmluZyBzaGExICJcbiIpKSAobWF0Y2gtc3RyaW5nIDEgaGVhZCkpKSkpCisKKyhkZWZ1biB2Yy1naXQtcmVnaXN0ZXIgKGZpbGUgJm9wdGlvbmFsIHJldiBjb21tZW50KQorICAiUmVnaXN0ZXIgRklMRSBpbnRvIHRoZSBnaXQgdmVyc2lvbi1jb250cm9sIHN5c3RlbS4iCisgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgInVwZGF0ZS1pbmRleCIgIi0tYWRkIiAiLS0iKSkKKworKGRlZnVuIHZjLWdpdC1wcmludC1sb2cgKGZpbGUpCisgIChsZXQgKChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpCisgICAgICAgIChjb2Rpbmctc3lzdGVtLWZvci1yZWFkIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1kby1jb21tYW5kIG5pbCAnYXN5bmMgImdpdCIgbmFtZSAicmV2LWxpc3QiICItLXByZXR0eSIgIkhFQUQiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1kaWZmIChmaWxlICZvcHRpb25hbCByZXYxIHJldjIpCisgIChsZXQgKChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpKQorICAgIChpZiAoYW5kIHJldjEgcmV2MikKKyAgICAgICAgKHZjLWRvLWNvbW1hbmQgIip2Yy1kaWZmKiIgMCAiZ2l0IiBuYW1lICJkaWZmLXRyZWUiICItcCIgcmV2MSByZXYyICItLSIpCisgICAgICAodmMtZG8tY29tbWFuZCAiKnZjLWRpZmYqIiAwICJnaXQiIG5hbWUgImRpZmYtaW5kZXgiICItcCIgKG9yIHJldjEgIkhFQUQiKSAiLS0iKSkKKyAgICA7IGdpdC1kaWZmLWluZGV4IGRvZXNuJ3Qgc2V0IGV4aXQgc3RhdHVzIGxpa2UgZGlmZiBkb2VzCisgICAgKGlmICh2Yy1naXQtd29ya2ZpbGUtdW5jaGFuZ2VkLXAgZmlsZSkgMCAxKSkpCisKKyhkZWZ1biB2Yy1naXQtY2hlY2tpbiAoZmlsZSByZXYgY29tbWVudCkKKyAgKGxldCAoKGNvZGluZy1zeXN0ZW0tZm9yLXdyaXRlIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgImNvbW1pdCIgIi1tIiBjb21tZW50ICItLW9ubHkiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1jaGVja291dCAoZmlsZSAmb3B0aW9uYWwgZWRpdGFibGUgcmV2IGRlc3RmaWxlKQorICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJjaGVja291dCIgKG9yIHJldiAiSEVBRCIpKSkKKworKGRlZnVuIHZjLWdpdC1hbm5vdGF0ZS1jb21tYW5kIChmaWxlIGJ1ZiAmb3B0aW9uYWwgcmV2KQorICA7IEZJWE1FOiByZXYgaXMgaWdub3JlZAorICAobGV0ICgobmFtZSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUpKSkKKyAgICAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCBidWYgbmlsICJhbm5vdGF0ZSIgbmFtZSkpKQorCisoZGVmdW4gdmMtZ2l0LWFubm90YXRlLXRpbWUgKCkKKyAgKGFuZCAocmUtc2VhcmNoLWZvcndhcmQgIlswLTlhLWZdK1x0KC4qXHRcXChbMC05XStcXCktXFwoWzAtOV0rXFwpLVxcKFswLTldK1xcKSBcXChbMC05XStcXCk6XFwoWzAtOV0rXFwpOlxcKFswLTldK1xcKSBcXChbLSswLTldK1xcKVx0WzAtOV0rKSIgbmlsIHQpCisgICAgICAgKHZjLWFubm90YXRlLWNvbnZlcnQtdGltZQorICAgICAgICAoYXBwbHkgIydlbmNvZGUtdGltZSAobWFwY2FyIChsYW1iZGEgKG1hdGNoKSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIG1hdGNoKSkpICcoNiA1IDQgMyAyIDEgNykpKSkpKQorCis7OyBOb3QgcmVhbGx5IHVzZWZ1bCBzaW5jZSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSByZXZpc2lvbiB5ZXQKKzs7KGRlZnVuIHZjLWFubm90YXRlLWV4dHJhY3QtcmV2aXNpb24tYXQtbGluZSAoKQorOzsgIChzYXZlLWV4Y3Vyc2lvbgorOzsgICAgKG1vdmUtYmVnaW5uaW5nLW9mLWxpbmUgMSkKKzs7ICAgIChhbmQgKGxvb2tpbmctYXQgIlswLTlhLWZdKyIpCis7OyAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMCkgKG1hdGNoLWVuZCAwKSkpKSkKKworKHByb3ZpZGUgJ3ZjLWdpdCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0LXN2bi8uZ2l0aWdub3JlIGIvY29udHJpYi9naXQtc3ZuLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkODdlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZ2l0LXN2bi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorZ2l0LXN2bgorZ2l0LXN2bi54bWwKK2dpdC1zdm4uaHRtbAorZ2l0LXN2bi4xCmRpZmYgLS1naXQgYS9jb250cmliL2dpdC1zdm4vTWFrZWZpbGUgYi9jb250cmliL2dpdC1zdm4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmNjBiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZ2l0LXN2bi9NYWtlZmlsZQpAQCAtMCwwICsxLDM2IEBACithbGw6IGdpdC1zdm4KKworcHJlZml4Pz0kKEhPTUUpCitiaW5kaXI9JChwcmVmaXgpL2JpbgorbWFuZGlyPSQocHJlZml4KS9tYW4KK21hbjE9JChtYW5kaXIpL21hbjEKK0lOU1RBTEw/PWluc3RhbGwKK2RvY19jb25mPS4uLy4uL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZgorLWluY2x1ZGUgLi4vLi4vY29uZmlnLm1haworCitnaXQtc3ZuOiBnaXQtc3ZuLnBlcmwKKwljcCAkPCAkQAorCWNobW9kICt4ICRACisKK2luc3RhbGw6IGFsbAorCSQoSU5TVEFMTCkgLWQgLW03NTUgJChERVNURElSKSQoYmluZGlyKQorCSQoSU5TVEFMTCkgZ2l0LXN2biAkKERFU1RESVIpJChiaW5kaXIpCisKK2luc3RhbGwtZG9jOiBkb2MKKwkkKElOU1RBTEwpIGdpdC1zdm4uMSAkKERFU1RESVIpJChtYW4xKQorCitkb2M6IGdpdC1zdm4uMQorZ2l0LXN2bi4xIDogZ2l0LXN2bi54bWwKKwl4bWx0byBtYW4gZ2l0LXN2bi54bWwKK2dpdC1zdm4ueG1sIDogZ2l0LXN2bi50eHQKKwlhc2NpaWRvYyAtYiBkb2Nib29rIC1kIG1hbnBhZ2UgXAorCQktZiAuLi8uLi9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYgJDwKK2dpdC1zdm4uaHRtbCA6IGdpdC1zdm4udHh0CisJYXNjaWlkb2MgLWIgeGh0bWwxMSAtZCBtYW5wYWdlIFwKKwkJLWYgLi4vLi4vRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mICQ8Cit0ZXN0OiBnaXQtc3ZuCisJY2QgdCAmJiAkKFNIRUxMKSAuL3QwMDAwLWNvbnRyaWItZ2l0LXN2bi5zaAorCWNkIHQgJiYgJChTSEVMTCkgLi90MDAwMS1jb250cmliLWdpdC1zdm4tcHJvcHMuc2gKKworY2xlYW46CisJcm0gLWYgZ2l0LXN2biAqLnhtbCAqLmh0bWwgKi4xCmRpZmYgLS1naXQgYS9jb250cmliL2dpdC1zdm4vZ2l0LXN2bi5wZXJsIGIvY29udHJpYi9naXQtc3ZuL2dpdC1zdm4ucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYWM4Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9naXQtc3ZuL2dpdC1zdm4ucGVybApAQCAtMCwwICsxLDEyNDkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4KKyMgTGljZW5zZTogR1BMIHYyIG9yIGxhdGVyCit1c2Ugd2FybmluZ3M7Cit1c2Ugc3RyaWN0OwordXNlIHZhcnMgcXcvCSRBVVRIT1IgJFZFUlNJT04KKwkJJFNWTl9VUkwgJFNWTl9JTkZPICRTVk5fV0MgJFNWTl9VVUlECisJCSRHSVRfU1ZOX0lOREVYICRHSVRfU1ZOCisJCSRHSVRfRElSICRSRVZfRElSLzsKKyRBVVRIT1IgPSAnRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+JzsKKyRWRVJTSU9OID0gJzEuMS4wLXByZSc7CisKK3VzZSBDd2QgcXcvYWJzX3BhdGgvOworJEdJVF9ESVIgPSBhYnNfcGF0aCgkRU5We0dJVF9ESVJ9IHx8ICcuZ2l0Jyk7CiskRU5We0dJVF9ESVJ9ID0gJEdJVF9ESVI7CisKKyMgbWFrZSBzdXJlIHRoZSBzdm4gYmluYXJ5IGdpdmVzIGNvbnNpc3RlbnQgb3V0cHV0IGJldHdlZW4gbG9jYWxlcyBhbmQgVFpzOgorJEVOVntUWn0gPSAnVVRDJzsKKyRFTlZ7TENfQUxMfSA9ICdDJzsKKworIyBJZiBTVk46OiBsaWJyYXJ5IHN1cHBvcnQgaXMgYWRkZWQsIHBsZWFzZSBtYWtlIHRoZSBkZXBlbmRlbmNpZXMKKyMgb3B0aW9uYWwgYW5kIHByZXNlcnZlIHRoZSBjYXBhYmlsaXR5IHRvIHVzZSB0aGUgY29tbWFuZC1saW5lIGNsaWVudC4KKyMgdXNlIGV2YWwgeyByZXF1aXJlIFNWTjo6Li4uIH0gdG8gbWFrZSBpdCBsYXp5IGxvYWQKKyMgV2UgZG9uJ3QgdXNlIGFueSBtb2R1bGVzIG5vdCBpbiB0aGUgc3RhbmRhcmQgUGVybCBkaXN0cmlidXRpb246Cit1c2UgQ2FycCBxdy9jcm9hay87Cit1c2UgSU86OkZpbGUgcXcvLzsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdy9kaXJuYW1lIGJhc2VuYW1lLzsKK3VzZSBGaWxlOjpQYXRoIHF3L21rcGF0aC87Cit1c2UgR2V0b3B0OjpMb25nIHF3Lzpjb25maWcgZ251X2dldG9wdCBub19pZ25vcmVfY2FzZSBhdXRvX2FiYnJldi87Cit1c2UgRmlsZTo6U3BlYyBxdy8vOwordXNlIFBPU0lYIHF3L3N0cmZ0aW1lLzsKK215ICRzaGExID0gcXIvW2EtZlxkXXs0MH0vOworbXkgJHNoYTFfc2hvcnQgPSBxci9bYS1mXGRdezQsNDB9LzsKK215ICgkX3JldmlzaW9uLCRfc3RkaW4sJF9ub19pZ25vcmVfZXh0LCRfbm9fc3RvcF9jb3B5LCRfaGVscCwkX3JtZGlyLCRfZWRpdCwKKwkkX2ZpbmRfY29waWVzX2hhcmRlciwgJF9sLCAkX3ZlcnNpb24sICRfdXBncmFkZSwgJF9hdXRob3JzKTsKK215IChAX2JyYW5jaF9mcm9tLCAldHJlZV9tYXAsICV1c2Vycyk7CitteSAkX3N2bl9jb191cmxfcmV2czsKKworbXkgJWZjX29wdHMgPSAoICduby1pZ25vcmUtZXh0ZXJuYWxzJyA9PiBcJF9ub19pZ25vcmVfZXh0LAorCQknYnJhbmNofGI9cycgPT4gXEBfYnJhbmNoX2Zyb20sCisJCSdhdXRob3JzLWZpbGV8QT1zJyA9PiBcJF9hdXRob3JzICk7CisKKyMgeWVzLCAnbmF0aXZlJyBzZXRzICJcbiIuICBQYXRjaGVzIHRvIGZpeCB0aGlzIGZvciBub24tKm5peCBzeXN0ZW1zIHdlbGNvbWU6CitteSAlRU9MID0gKCBDUiA9PiAiXDAxNSIsIExGID0+ICJcMDEyIiwgQ1JMRiA9PiAiXDAxNVwwMTIiLCBuYXRpdmUgPT4gIlwwMTIiICk7CisKK215ICVjbWQgPSAoCisJZmV0Y2ggPT4gWyBcJmZldGNoLCAiRG93bmxvYWQgbmV3IHJldmlzaW9ucyBmcm9tIFNWTiIsCisJCQl7ICdyZXZpc2lvbnxyPXMnID0+IFwkX3JldmlzaW9uLCAlZmNfb3B0cyB9IF0sCisJaW5pdCA9PiBbIFwmaW5pdCwgIkluaXRpYWxpemUgYSByZXBvIGZvciB0cmFja2luZyIgLgorCQkJICAiIChyZXF1aXJlcyBVUkwgYXJndW1lbnQpIiwgeyB9IF0sCisJY29tbWl0ID0+IFsgXCZjb21taXQsICJDb21taXQgZ2l0IHJldmlzaW9ucyB0byBTVk4iLAorCQkJewknc3RkaW58JyA9PiBcJF9zdGRpbiwKKwkJCQknZWRpdHxlJyA9PiBcJF9lZGl0LAorCQkJCSdybWRpcicgPT4gXCRfcm1kaXIsCisJCQkJJ2ZpbmQtY29waWVzLWhhcmRlcicgPT4gXCRfZmluZF9jb3BpZXNfaGFyZGVyLAorCQkJCSdsPWknID0+IFwkX2wsCisJCQkJJWZjX29wdHMsCisJCQl9IF0sCisJJ3Nob3ctaWdub3JlJyA9PiBbIFwmc2hvd19pZ25vcmUsICJTaG93IHN2bjppZ25vcmUgbGlzdGluZ3MiLCB7IH0gXSwKKwlyZWJ1aWxkID0+IFsgXCZyZWJ1aWxkLCAiUmVidWlsZCBnaXQtc3ZuIG1ldGFkYXRhIChhZnRlciBnaXQgY2xvbmUpIiwKKwkJCXsgJ25vLWlnbm9yZS1leHRlcm5hbHMnID0+IFwkX25vX2lnbm9yZV9leHQsCisJCQkgICd1cGdyYWRlJyA9PiBcJF91cGdyYWRlIH0gXSwKKyk7CitteSAkY21kOworZm9yIChteSAkaSA9IDA7ICRpIDwgQEFSR1Y7ICRpKyspIHsKKwlpZiAoZGVmaW5lZCAkY21keyRBUkdWWyRpXX0pIHsKKwkJJGNtZCA9ICRBUkdWWyRpXTsKKwkJc3BsaWNlIEBBUkdWLCAkaSwgMTsKKwkJbGFzdDsKKwl9Cit9OworCitteSAlb3B0cyA9ICV7JGNtZHskY21kfS0+WzJdfSBpZiAoZGVmaW5lZCAkY21kKTsKKworIyBjb252ZXJ0IEdldE9wdDo6TG9uZyBzcGVjcyBmb3IgdXNlIGJ5IGdpdC1yZXBvLWNvbmZpZworZm9yZWFjaCBteSAkbyAoa2V5cyAlb3B0cykgeworCW15ICR2ID0gJG9wdHN7JG99OworCW15ICgka2V5KSA9ICgkbyA9fiAvXihbYS16XC1dKykvKTsKKwkka2V5ID1+IHMvLS8vZzsKKwlteSAkYXJnID0gJ2dpdC1yZXBvLWNvbmZpZyc7CisJJGFyZyAuPSAnIC0taW50JyBpZiAoJG8gPX4gLz1pJC8pOworCSRhcmcgLj0gJyAtLWJvb2wnIGlmICgkbyAhfiAvPVtzZmldJC8pOworCWlmIChyZWYgJHYgZXEgJ0FSUkFZJykgeworCQljaG9tcChteSBAdG1wID0gYCRhcmcgLS1nZXQtYWxsIHN2bi4ka2V5YCk7CisJCUAkdiA9IEB0bXAgaWYgQHRtcDsKKwl9IGVsc2UgeworCQljaG9tcChteSAkdG1wID0gYCRhcmcgLS1nZXQgc3ZuLiRrZXlgKTsKKwkJaWYgKCR0bXAgJiYgISgkYXJnID1+IC8gLS1ib29sIC8gJiYgJHRtcCBlcSAnZmFsc2UnKSkgeworCQkJJCR2ID0gJHRtcDsKKwkJfQorCX0KK30KKworR2V0T3B0aW9ucyglb3B0cywgJ2hlbHB8SHxoJyA9PiBcJF9oZWxwLAorCQkndmVyc2lvbnxWJyA9PiBcJF92ZXJzaW9uLAorCQknaWR8aT1zJyA9PiBcJEdJVF9TVk4pIG9yIGV4aXQgMTsKKworJEdJVF9TVk4gfHw9ICRFTlZ7R0lUX1NWTl9JRH0gfHwgJ2dpdC1zdm4nOworJEdJVF9TVk5fSU5ERVggPSAiJEdJVF9ESVIvJEdJVF9TVk4vaW5kZXgiOworJFNWTl9VUkwgPSB1bmRlZjsKKyRSRVZfRElSID0gIiRHSVRfRElSLyRHSVRfU1ZOL3JldnMiOworJFNWTl9XQyA9ICIkR0lUX0RJUi8kR0lUX1NWTi90cmVlIjsKKwordXNhZ2UoMCkgaWYgJF9oZWxwOwordmVyc2lvbigpIGlmICRfdmVyc2lvbjsKK3VzYWdlKDEpIHVubGVzcyBkZWZpbmVkICRjbWQ7Citsb2FkX2F1dGhvcnMoKSBpZiAkX2F1dGhvcnM7Citzdm5fY29tcGF0X2NoZWNrKCk7CiskY21keyRjbWR9LT5bMF0tPihAQVJHVik7CitleGl0IDA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHByaW1hcnkgZnVuY3Rpb25zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1YiB1c2FnZSB7CisJbXkgJGV4aXQgPSBzaGlmdCB8fCAwOworCW15ICRmZCA9ICRleGl0ID8gXCpTVERFUlIgOiBcKlNURE9VVDsKKwlwcmludCAkZmQgPDwiIjsKK2dpdC1zdm4gLSBiaWRpcmVjdGlvbmFsIG9wZXJhdGlvbnMgYmV0d2VlbiBhIHNpbmdsZSBTdWJ2ZXJzaW9uIHRyZWUgYW5kIGdpdAorVXNhZ2U6ICQwIDxjb21tYW5kPiBbb3B0aW9uc10gW2FyZ3VtZW50c11cbgorCisJcHJpbnQgJGZkICJBdmFpbGFibGUgY29tbWFuZHM6XG4iIHVubGVzcyAkY21kOworCisJZm9yZWFjaCAoc29ydCBrZXlzICVjbWQpIHsKKwkJbmV4dCBpZiAkY21kICYmICRjbWQgbmUgJF87CisJCXByaW50ICRmZCAnICAnLHBhY2soJ0ExMycsJF8pLCRjbWR7JF99LT5bMV0sIlxuIjsKKwkJZm9yZWFjaCAoa2V5cyAleyRjbWR7JF99LT5bMl19KSB7CisJCQkjIHByaW50cyBvdXQgYXJndW1lbnRzIGFzIHRoZXkgc2hvdWxkIGJlIHBhc3NlZDoKKwkJCW15ICR4ID0gcyM9cyQjIyA/ICc8YXJnPicgOiBzIz1pJCMjID8gJzxudW0+JyA6ICcnOworCQkJcHJpbnQgJGZkICcgJyB4IDE3LCBqb2luKCcsICcsIG1hcCB7IGxlbmd0aCAkXyA+IDEgPworCQkJCQkJCSItLSRfIiA6ICItJF8iIH0KKwkJCQkJCXNwbGl0IC9cfC8sJF8pLCIgJHhcbiI7CisJCX0KKwl9CisJcHJpbnQgJGZkIDw8IiI7CitcbkdJVF9TVk5fSUQgbWF5IGJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQgb3IgdmlhIHRoZSAtLWlkLy1pIHN3aXRjaCB0byBhbgorYXJiaXRyYXJ5IGlkZW50aWZpZXIgaWYgeW91J3JlIHRyYWNraW5nIG11bHRpcGxlIFNWTiBicmFuY2hlcy9yZXBvc2l0b3JpZXMgaW4KK29uZSBnaXQgcmVwb3NpdG9yeSBhbmQgd2FudCB0byBrZWVwIHRoZW0gc2VwYXJhdGUuICBTZWUgZ2l0LXN2bigxKSBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKKwlleGl0ICRleGl0OworfQorCitzdWIgdmVyc2lvbiB7CisJcHJpbnQgImdpdC1zdm4gdmVyc2lvbiAkVkVSU0lPTlxuIjsKKwlleGl0IDA7Cit9CisKK3N1YiByZWJ1aWxkIHsKKwkkU1ZOX1VSTCA9IHNoaWZ0IG9yIHVuZGVmOworCW15ICRuZXdlc3RfcmV2ID0gMDsKKwlpZiAoJF91cGdyYWRlKSB7CisJCXN5cygnZ2l0LXVwZGF0ZS1yZWYnLCJyZWZzL3JlbW90ZXMvJEdJVF9TVk4iLCIkR0lUX1NWTi1IRUFEIik7CisJfSBlbHNlIHsKKwkJY2hlY2tfdXBncmFkZV9uZWVkZWQoKTsKKwl9CisKKwlteSAkcGlkID0gb3BlbihteSAkcmV2X2xpc3QsJy18Jyk7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCWlmICgkcGlkID09IDApIHsKKwkJZXhlYygiZ2l0LXJldi1saXN0IiwicmVmcy9yZW1vdGVzLyRHSVRfU1ZOIikgb3IgY3JvYWsgJCE7CisJfQorCW15ICRsYXRlc3Q7CisJd2hpbGUgKDwkcmV2X2xpc3Q+KSB7CisJCWNob21wOworCQlteSAkYyA9ICRfOworCQljcm9hayAiTm9uLVNIQTE6ICRjXG4iIHVubGVzcyAkYyA9fiAvXiRzaGExJC9vOworCQlteSBAY29tbWl0ID0gZ3JlcCgvXmdpdC1zdm4taWQ6IC8sYGdpdC1jYXQtZmlsZSBjb21taXQgJGNgKTsKKwkJbmV4dCBpZiAoIUBjb21taXQpOyAjIHNraXAgbWVyZ2VzCisJCW15ICRpZCA9ICRjb21taXRbJCNjb21taXRdOworCQlteSAoJHVybCwgJHJldiwgJHV1aWQpID0gKCRpZCA9fiAvXmdpdC1zdm4taWQ6XHMoXFMrPylcQChcZCspCisJCQkJCQlccyhbYS1mXGRcLV0rKSQveCk7CisJCWlmICghJHJldiB8fCAhJHV1aWQgfHwgISR1cmwpIHsKKwkJCSMgc29tZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yaWVzIEkgbWFkZSBoYWQKKwkJCSMgaW5kZW50aWZpZXJzIGxpa2UgdGhpczoKKwkJCSgkcmV2LCAkdXVpZCkgPSAoJGlkID1+L15naXQtc3ZuLWlkOlxzKFxkKykKKwkJCQkJCQlcQChbYS1mXGRcLV0rKS94KTsKKwkJCWlmICghJHJldiB8fCAhJHV1aWQpIHsKKwkJCQljcm9hayAiVW5hYmxlIHRvIGV4dHJhY3QgcmV2aXNpb24gb3IgVVVJRCBmcm9tICIsCisJCQkJCSIkYywgJGlkXG4iOworCQkJfQorCQl9CisKKwkJIyBpZiB3ZSBtZXJnZWQgb3Igb3RoZXJ3aXNlIHN0YXJ0ZWQgZWxzZXdoZXJlLCB0aGlzIGlzCisJCSMgaG93IHdlIGJyZWFrIG91dCBvZiBpdAorCQluZXh0IGlmIChkZWZpbmVkICRTVk5fVVVJRCAmJiAoJHV1aWQgbmUgJFNWTl9VVUlEKSk7CisJCW5leHQgaWYgKGRlZmluZWQgJFNWTl9VUkwgJiYgZGVmaW5lZCAkdXJsICYmICgkdXJsIG5lICRTVk5fVVJMKSk7CisKKwkJcHJpbnQgInIkcmV2ID0gJGNcbiI7CisJCXVubGVzcyAoZGVmaW5lZCAkbGF0ZXN0KSB7CisJCQlpZiAoISRTVk5fVVJMICYmICEkdXJsKSB7CisJCQkJY3JvYWsgIlNWTiByZXBvc2l0b3J5IGxvY2F0aW9uIHJlcXVpcmVkOiAkdXJsXG4iOworCQkJfQorCQkJJFNWTl9VUkwgfHw9ICR1cmw7CisJCQkkU1ZOX1VVSUQgfHw9ICR1dWlkOworCQkJc2V0dXBfZ2l0X3N2bigpOworCQkJJGxhdGVzdCA9ICRyZXY7CisJCX0KKwkJYXNzZXJ0X3JldmlzaW9uX2VxX29yX3Vua25vd24oJHJldiwgJGMpOworCQlzeXMoJ2dpdC11cGRhdGUtcmVmJywiJEdJVF9TVk4vcmV2cy8kcmV2IiwkYyk7CisJCSRuZXdlc3RfcmV2ID0gJHJldiBpZiAoJHJldiA+ICRuZXdlc3RfcmV2KTsKKwl9CisJY2xvc2UgJHJldl9saXN0IG9yIGNyb2FrICQ/OworCWlmICghY2hkaXIgJFNWTl9XQykgeworCQlzdm5fY21kX2NoZWNrb3V0KCRTVk5fVVJMLCAkbGF0ZXN0LCAkU1ZOX1dDKTsKKwkJY2hkaXIgJFNWTl9XQyBvciBjcm9hayAkITsKKwl9CisKKwkkcGlkID0gZm9yazsKKwlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisJaWYgKCRwaWQgPT0gMCkgeworCQlteSBAc3ZuX3VwID0gcXcoc3ZuIHVwKTsKKwkJcHVzaCBAc3ZuX3VwLCAnLS1pZ25vcmUtZXh0ZXJuYWxzJyB1bmxlc3MgJF9ub19pZ25vcmVfZXh0OworCQlzeXMoQHN2bl91cCwiLXIkbmV3ZXN0X3JldiIpOworCQkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRHSVRfU1ZOX0lOREVYOworCQlpbmRleF9jaGFuZ2VzKCk7CisJCWV4ZWMoJ2dpdC13cml0ZS10cmVlJyk7CisJfQorCXdhaXRwaWQgJHBpZCwgMDsKKworCWlmICgkX3VwZ3JhZGUpIHsKKwkJcHJpbnQgU1RERVJSIDw8IiI7CitLZWVwaW5nIGRlcHJlY2F0ZWQgcmVmcy9oZWFkLyRHSVRfU1ZOLUhFQUQgZm9yIG5vdy4gIFBsZWFzZSByZW1vdmUgaXQKK3doZW4geW91IGhhdmUgdXBncmFkZWQgeW91ciB0b29scyBhbmQgaGFiaXRzIHRvIHVzZSByZWZzL3JlbW90ZXMvJEdJVF9TVk4KKworCX0KK30KKworc3ViIGluaXQgeworCSRTVk5fVVJMID0gc2hpZnQgb3IgZGllICJTVk4gcmVwb3NpdG9yeSBsb2NhdGlvbiByZXF1aXJlZCAiIC4KKwkJCQkiYXMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnRcbiI7CisJdW5sZXNzICgtZCAkR0lUX0RJUikgeworCQlzeXMoJ2dpdC1pbml0LWRiJyk7CisJfQorCXNldHVwX2dpdF9zdm4oKTsKK30KKworc3ViIGZldGNoIHsKKwlteSAoQHBhcmVudHMpID0gQF87CisJY2hlY2tfdXBncmFkZV9uZWVkZWQoKTsKKwkkU1ZOX1VSTCB8fD0gZmlsZV90b19zKCIkR0lUX0RJUi8kR0lUX1NWTi9pbmZvL3VybCIpOworCW15IEBsb2dfYXJncyA9IC1kICRTVk5fV0MgPyAoJFNWTl9XQykgOiAoJFNWTl9VUkwpOworCXVubGVzcyAoJF9yZXZpc2lvbikgeworCQkkX3JldmlzaW9uID0gLWQgJFNWTl9XQyA/ICdCQVNFOkhFQUQnIDogJzA6SEVBRCc7CisJfQorCXB1c2ggQGxvZ19hcmdzLCAiLXIkX3JldmlzaW9uIjsKKwlwdXNoIEBsb2dfYXJncywgJy0tc3RvcC1vbi1jb3B5JyB1bmxlc3MgJF9ub19zdG9wX2NvcHk7CisKKwlteSAkc3ZuX2xvZyA9IHN2bl9sb2dfcmF3KEBsb2dfYXJncyk7CisKKwlteSAkYmFzZSA9IG5leHRfbG9nX2VudHJ5KCRzdm5fbG9nKSBvciBjcm9hayAiTm8gYmFzZSByZXZpc2lvbiFcbiI7CisJbXkgJGxhc3RfY29tbWl0ID0gdW5kZWY7CisJdW5sZXNzICgtZCAkU1ZOX1dDKSB7CisJCXN2bl9jbWRfY2hlY2tvdXQoJFNWTl9VUkwsJGJhc2UtPntyZXZpc2lvbn0sJFNWTl9XQyk7CisJCWNoZGlyICRTVk5fV0Mgb3IgY3JvYWsgJCE7CisJCXJlYWRfdXVpZCgpOworCQkkbGFzdF9jb21taXQgPSBnaXRfY29tbWl0KCRiYXNlLCBAcGFyZW50cyk7CisJCWFzc2VydF90cmVlKCRsYXN0X2NvbW1pdCk7CisJfSBlbHNlIHsKKwkJY2hkaXIgJFNWTl9XQyBvciBjcm9hayAkITsKKwkJcmVhZF91dWlkKCk7CisJCSRsYXN0X2NvbW1pdCA9IGZpbGVfdG9fcygiJFJFVl9ESVIvJGJhc2UtPntyZXZpc2lvbn0iKTsKKwl9CisJbXkgQHN2bl91cCA9IHF3KHN2biB1cCk7CisJcHVzaCBAc3ZuX3VwLCAnLS1pZ25vcmUtZXh0ZXJuYWxzJyB1bmxlc3MgJF9ub19pZ25vcmVfZXh0OworCW15ICRsYXN0ID0gJGJhc2U7CisJd2hpbGUgKG15ICRsb2dfbXNnID0gbmV4dF9sb2dfZW50cnkoJHN2bl9sb2cpKSB7CisJCWFzc2VydF90cmVlKCRsYXN0X2NvbW1pdCk7CisJCWlmICgkbGFzdC0+e3JldmlzaW9ufSA+PSAkbG9nX21zZy0+e3JldmlzaW9ufSkgeworCQkJY3JvYWsgIk91dCBvZiBvcmRlcjogbGFzdCA+PSBjdXJyZW50OiAiLAorCQkJCSIkbGFzdC0+e3JldmlzaW9ufSA+PSAkbG9nX21zZy0+e3JldmlzaW9ufVxuIjsKKwkJfQorCQkjIFJldmVydCBpcyBuZWVkZWQgZm9yIGNhc2VzIGxpa2U6CisJCSMgaHR0cHM6Ly9zdm4ubXVzaWNwZC5vcmcvSmFtbWluZy90cnVuayAocjE2NjoxNjcpLCBidXQKKwkJIyBJIGNhbid0IHNlZW0gdG8gcmVwcm9kdWNlIHNvbWV0aGluZyBsaWtlIHRoYXQgb24gYSB0ZXN0Li4uCisJCXN5cyhxdy9zdm4gcmV2ZXJ0IC1SIC4vKTsKKwkJYXNzZXJ0X3N2bl93Y19jbGVhbigkbGFzdC0+e3JldmlzaW9ufSk7CisJCXN5cyhAc3ZuX3VwLCItciRsb2dfbXNnLT57cmV2aXNpb259Iik7CisJCSRsYXN0X2NvbW1pdCA9IGdpdF9jb21taXQoJGxvZ19tc2csICRsYXN0X2NvbW1pdCwgQHBhcmVudHMpOworCQkkbGFzdCA9ICRsb2dfbXNnOworCX0KKwl1bmxlc3MgKC1lICIkR0lUX0RJUi9yZWZzL2hlYWRzL21hc3RlciIpIHsKKwkJc3lzKHF3KGdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyKSwkbGFzdF9jb21taXQpOworCX0KKwlyZXR1cm4gJGxhc3Q7Cit9CisKK3N1YiBjb21taXQgeworCW15IChAY29tbWl0cykgPSBAXzsKKwljaGVja191cGdyYWRlX25lZWRlZCgpOworCWlmICgkX3N0ZGluIHx8ICFAY29tbWl0cykgeworCQlwcmludCAiUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iOworCQlAY29tbWl0cyA9ICgpOworCQl3aGlsZSAoPFNURElOPikgeworCQkJaWYgKC9cYigkc2hhMV9zaG9ydClcYi9vKSB7CisJCQkJdW5zaGlmdCBAY29tbWl0cywgJDE7CisJCQl9CisJCX0KKwl9CisJbXkgQHJldnM7CisJZm9yZWFjaCBteSAkYyAoQGNvbW1pdHMpIHsKKwkJY2hvbXAobXkgQHRtcCA9IHNhZmVfcXgoJ2dpdC1yZXYtcGFyc2UnLCRjKSk7CisJCWlmIChzY2FsYXIgQHRtcCA9PSAxKSB7CisJCQlwdXNoIEByZXZzLCAkdG1wWzBdOworCQl9IGVsc2lmIChzY2FsYXIgQHRtcCA+IDEpIHsKKwkJCXB1c2ggQHJldnMsIHJldmVyc2UgKHNhZmVfcXgoJ2dpdC1yZXYtbGlzdCcsQHRtcCkpOworCQl9IGVsc2UgeworCQkJZGllICJGYWlsZWQgdG8gcmV2LXBhcnNlICRjXG4iOworCQl9CisJfQorCWNob21wIEByZXZzOworCisJZmV0Y2goKTsKKwljaGRpciAkU1ZOX1dDIG9yIGNyb2FrICQhOworCW15ICRpbmZvID0gc3ZuX2luZm8oJy4nKTsKKwlyZWFkX3V1aWQoJGluZm8pOworCW15ICRzdm5fY3VycmVudF9yZXYgPSAgJGluZm8tPnsnTGFzdCBDaGFuZ2VkIFJldid9OworCWZvcmVhY2ggbXkgJGMgKEByZXZzKSB7CisJCW15ICRtb2RzID0gc3ZuX2NoZWNrb3V0X3RyZWUoJHN2bl9jdXJyZW50X3JldiwgJGMpOworCQlpZiAoc2NhbGFyIEAkbW9kcyA9PSAwKSB7CisJCQlwcmludCAiU2tpcHBpbmcsIG5vIGNoYW5nZXMgZGV0ZWN0ZWRcbiI7CisJCQluZXh0OworCQl9CisJCSRzdm5fY3VycmVudF9yZXYgPSBzdm5fY29tbWl0X3RyZWUoJHN2bl9jdXJyZW50X3JldiwgJGMpOworCX0KKwlwcmludCAiRG9uZSBjb21taXR0aW5nICIsc2NhbGFyIEByZXZzLCIgcmV2aXNpb25zIHRvIFNWTlxuIjsKK30KKworc3ViIHNob3dfaWdub3JlIHsKKwlyZXF1aXJlIEZpbGU6OkZpbmQgb3IgZGllICQhOworCW15ICRleGNsdWRlX2ZpbGUgPSAiJEdJVF9ESVIvaW5mby9leGNsdWRlIjsKKwlvcGVuIG15ICRmaCwgJzwnLCAkZXhjbHVkZV9maWxlIG9yIGNyb2FrICQhOworCWNob21wKG15IEBleGNsdWRlcyA9ICg8JGZoPikpOworCWNsb3NlICRmaCBvciBjcm9hayAkITsKKworCSRTVk5fVVJMIHx8PSBmaWxlX3RvX3MoIiRHSVRfRElSLyRHSVRfU1ZOL2luZm8vdXJsIik7CisJY2hkaXIgJFNWTl9XQyBvciBjcm9hayAkITsKKwlteSAlaWduOworCUZpbGU6OkZpbmQ6OmZpbmQoe3dhbnRlZD0+c3Vie2lmKGxzdGF0ICRfICYmIC1kIF8gJiYgLWQgIiRfLy5zdm4iKXsKKwkJcyNeXC4vIyM7CisJCUB7JGlnbnskX319ID0gc2FmZV9xeChxdyhzdm4gcHJvcGdldCBzdm46aWdub3JlKSwkXyk7CisJCX19LCBub19jaGRpcj0+MX0sJy4nKTsKKworCXByaW50ICJcbiMgL1xuIjsKKwlmb3JlYWNoIChAeyRpZ257Jy4nfX0pIHsgcHJpbnQgJy8nLCRfIGlmIC9cUy8gfQorCWRlbGV0ZSAkaWdueycuJ307CisJZm9yZWFjaCBteSAkaSAoc29ydCBrZXlzICVpZ24pIHsKKwkJcHJpbnQgIlxuIyAiLCRpLCJcbiI7CisJCWZvcmVhY2ggKEB7JGlnbnskaX19KSB7IHByaW50ICcvJywkaSwnLycsJF8gaWYgL1xTLyB9CisJfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgdXRpbGl0eSBmdW5jdGlvbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgcmVhZF91dWlkIHsKKwlyZXR1cm4gaWYgJFNWTl9VVUlEOworCW15ICRpbmZvID0gc2hpZnQgfHwgc3ZuX2luZm8oJy4nKTsKKwkkU1ZOX1VVSUQgPSAkaW5mby0+eydSZXBvc2l0b3J5IFVVSUQnfSBvcgorCQkJCQljcm9hayAiUmVwb3NpdG9yeSBVVUlEIHVucmVhZGFibGVcbiI7CisJc190b19maWxlKCRTVk5fVVVJRCwiJEdJVF9ESVIvJEdJVF9TVk4vaW5mby91dWlkIik7Cit9CisKK3N1YiBzZXR1cF9naXRfc3ZuIHsKKwlkZWZpbmVkICRTVk5fVVJMIG9yIGNyb2FrICJTVk4gcmVwb3NpdG9yeSBsb2NhdGlvbiByZXF1aXJlZFxuIjsKKwl1bmxlc3MgKC1kICRHSVRfRElSKSB7CisJCWNyb2FrICJHSVRfRElSPSRHSVRfRElSIGRvZXMgbm90IGV4aXN0IVxuIjsKKwl9CisJbWtwYXRoKFsiJEdJVF9ESVIvJEdJVF9TVk4iXSk7CisJbWtwYXRoKFsiJEdJVF9ESVIvJEdJVF9TVk4vaW5mbyJdKTsKKwlta3BhdGgoWyRSRVZfRElSXSk7CisJc190b19maWxlKCRTVk5fVVJMLCIkR0lUX0RJUi8kR0lUX1NWTi9pbmZvL3VybCIpOworCisJb3BlbiBteSAkZmQsICc+PicsICIkR0lUX0RJUi8kR0lUX1NWTi9pbmZvL2V4Y2x1ZGUiIG9yIGNyb2FrICQhOworCXByaW50ICRmZCAnLnN2bicsIlxuIjsKKwljbG9zZSAkZmQgb3IgY3JvYWsgJCE7Cit9CisKK3N1YiBhc3NlcnRfc3ZuX3djX2NsZWFuIHsKKwlteSAoJHN2bl9yZXYpID0gQF87CisJY3JvYWsgIiRzdm5fcmV2IGlzIG5vdCBhbiBpbnRlZ2VyIVxuIiB1bmxlc3MgKCRzdm5fcmV2ID1+IC9eXGQrJC8pOworCW15ICRsY3IgPSBzdm5faW5mbygnLicpLT57J0xhc3QgQ2hhbmdlZCBSZXYnfTsKKwlpZiAoJHN2bl9yZXYgIT0gJGxjcikgeworCQlwcmludCBTVERFUlIgIkNoZWNraW5nIGZvciBjb3B5LXRyZWUgLi4uICI7CisJCW15IEBkaWZmID0gZ3JlcCgvXkluZGV4OiAvLChzYWZlX3F4KHF3KHN2biBkaWZmKSwKKwkJCQkJCSItciRsY3I6JHN2bl9yZXYiKSkpOworCQlpZiAoQGRpZmYpIHsKKwkJCWNyb2FrICJOb3BlISAgRXhwZWN0ZWQgciRzdm5fcmV2LCBnb3QgciRsY3JcbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCBTVERFUlIgIk9LIVxuIjsKKwkJfQorCX0KKwlteSBAc3RhdHVzID0gZ3JlcCghL15QZXJmb3JtaW5nIHN0YXR1cyBvbiBleHRlcm5hbC8sKGBzdm4gc3RhdHVzYCkpOworCUBzdGF0dXMgPSBncmVwKCEvXlxzKiQvLEBzdGF0dXMpOworCWlmIChzY2FsYXIgQHN0YXR1cykgeworCQlwcmludCBTVERFUlIgIlRyZWUgKCRTVk5fV0MpIGlzIG5vdCBjbGVhbjpcbiI7CisJCXByaW50IFNUREVSUiAkXyBmb3JlYWNoIEBzdGF0dXM7CisJCWNyb2FrOworCX0KK30KKworc3ViIGFzc2VydF90cmVlIHsKKwlteSAoJHRyZWVpc2gpID0gQF87CisJY3JvYWsgIk5vdCBhIHNoYTE6ICR0cmVlaXNoXG4iIHVubGVzcyAkdHJlZWlzaCA9fiAvXiRzaGExJC9vOworCWNob21wKG15ICR0eXBlID0gYGdpdC1jYXQtZmlsZSAtdCAkdHJlZWlzaGApOworCW15ICRleHBlY3RlZDsKKwl3aGlsZSAoJHR5cGUgZXEgJ3RhZycpIHsKKwkJY2hvbXAoKCR0cmVlaXNoLCAkdHlwZSkgPSBgZ2l0LWNhdC1maWxlIHRhZyAkdHJlZWlzaGApOworCX0KKwlpZiAoJHR5cGUgZXEgJ2NvbW1pdCcpIHsKKwkJJGV4cGVjdGVkID0gKGdyZXAgL150cmVlIC8sYGdpdC1jYXQtZmlsZSBjb21taXQgJHRyZWVpc2hgKVswXTsKKwkJKCRleHBlY3RlZCkgPSAoJGV4cGVjdGVkID1+IC9edHJlZSAoJHNoYTEpJC8pOworCQlkaWUgIlVuYWJsZSB0byBnZXQgdHJlZSBmcm9tICR0cmVlaXNoXG4iIHVubGVzcyAkZXhwZWN0ZWQ7CisJfSBlbHNpZiAoJHR5cGUgZXEgJ3RyZWUnKSB7CisJCSRleHBlY3RlZCA9ICR0cmVlaXNoOworCX0gZWxzZSB7CisJCWRpZSAiJHRyZWVpc2ggaXMgYSAkdHlwZSwgZXhwZWN0ZWQgdHJlZSwgdGFnIG9yIGNvbW1pdFxuIjsKKwl9CisKKwlteSAkb2xkX2luZGV4ID0gJEVOVntHSVRfSU5ERVhfRklMRX07CisJbXkgJHRtcGluZGV4ID0gJEdJVF9TVk5fSU5ERVguJy5hc3NlcnQtdG1wJzsKKwlpZiAoLWUgJHRtcGluZGV4KSB7CisJCXVubGluayAkdG1waW5kZXggb3IgY3JvYWsgJCE7CisJfQorCSRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJHRtcGluZGV4OworCWluZGV4X2NoYW5nZXMoMSk7CisJY2hvbXAobXkgJHRyZWUgPSBgZ2l0LXdyaXRlLXRyZWVgKTsKKwlpZiAoJG9sZF9pbmRleCkgeworCQkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRvbGRfaW5kZXg7CisJfSBlbHNlIHsKKwkJZGVsZXRlICRFTlZ7R0lUX0lOREVYX0ZJTEV9OworCX0KKwlpZiAoJHRyZWUgbmUgJGV4cGVjdGVkKSB7CisJCWNyb2FrICJUcmVlIG1pc21hdGNoLCBHb3Q6ICR0cmVlLCBFeHBlY3RlZDogJGV4cGVjdGVkXG4iOworCX0KKwl1bmxpbmsgJHRtcGluZGV4OworfQorCitzdWIgcGFyc2VfZGlmZl90cmVlIHsKKwlteSAkZGlmZl9maCA9IHNoaWZ0OworCWxvY2FsICQvID0gIlwwIjsKKwlteSAkc3RhdGUgPSAnbWV0YSc7CisJbXkgQG1vZHM7CisJd2hpbGUgKDwkZGlmZl9maD4pIHsKKwkJY2hvbXAgJF87ICMgdGhpcyBnZXRzIHJpZCBvZiB0aGUgdHJhaWxpbmcgIlwwIgorCQlpZiAoJHN0YXRlIGVxICdtZXRhJyAmJiAvXjooXGR7Nn0pXHMoXGR7Nn0pXHMKKwkJCQkJJHNoYTFccygkc2hhMSlccyhbTVRDUkFEXSlcZCokL3hvKSB7CisJCQlwdXNoIEBtb2RzLCB7CW1vZGVfYSA9PiAkMSwgbW9kZV9iID0+ICQyLAorCQkJCQlzaGExX2IgPT4gJDMsIGNoZyA9PiAkNCB9OworCQkJaWYgKCQ0ID1+IC9eKD86Q3xSKSQvKSB7CisJCQkJJHN0YXRlID0gJ2ZpbGVfYSc7CisJCQl9IGVsc2UgeworCQkJCSRzdGF0ZSA9ICdmaWxlX2InOworCQkJfQorCQl9IGVsc2lmICgkc3RhdGUgZXEgJ2ZpbGVfYScpIHsKKwkJCW15ICR4ID0gJG1vZHNbJCNtb2RzXSBvciBjcm9hayAiRW1wdHkgYXJyYXlcbiI7CisJCQlpZiAoJHgtPntjaGd9ICF+IC9eKD86Q3xSKSQvKSB7CisJCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF8sICR4LT57Y2hnfVxuIjsKKwkJCX0KKwkJCSR4LT57ZmlsZV9hfSA9ICRfOworCQkJJHN0YXRlID0gJ2ZpbGVfYic7CisJCX0gZWxzaWYgKCRzdGF0ZSBlcSAnZmlsZV9iJykgeworCQkJbXkgJHggPSAkbW9kc1skI21vZHNdIG9yIGNyb2FrICJFbXB0eSBhcnJheVxuIjsKKwkJCWlmIChleGlzdHMgJHgtPntmaWxlX2F9ICYmICR4LT57Y2hnfSAhfiAvXig/OkN8UikkLykgeworCQkJCWNyb2FrICJFcnJvciBwYXJzaW5nICRfLCAkeC0+e2NoZ31cbiI7CisJCQl9CisJCQlpZiAoIWV4aXN0cyAkeC0+e2ZpbGVfYX0gJiYgJHgtPntjaGd9ID1+IC9eKD86Q3xSKSQvKSB7CisJCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF8sICR4LT57Y2hnfVxuIjsKKwkJCX0KKwkJCSR4LT57ZmlsZV9ifSA9ICRfOworCQkJJHN0YXRlID0gJ21ldGEnOworCQl9IGVsc2UgeworCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF9cbiI7CisJCX0KKwl9CisJY2xvc2UgJGRpZmZfZmggb3IgY3JvYWsgJCE7CisKKwlyZXR1cm4gXEBtb2RzOworfQorCitzdWIgc3ZuX2NoZWNrX3Byb3BfZXhlY3V0YWJsZSB7CisJbXkgJG0gPSBzaGlmdDsKKwlyZXR1cm4gaWYgLWwgJG0tPntmaWxlX2J9OworCWlmICgkbS0+e21vZGVfYn0gPX4gLzc1NSQvKSB7CisJCWNobW9kKCgwNzU1ICZ+IHVtYXNrKSwkbS0+e2ZpbGVfYn0pIG9yIGNyb2FrICQhOworCQlpZiAoJG0tPnttb2RlX2F9ICF+IC83NTUkLykgeworCQkJc3lzKHF3KHN2biBwcm9wc2V0IHN2bjpleGVjdXRhYmxlIDEpLCAkbS0+e2ZpbGVfYn0pOworCQl9CisJCS14ICRtLT57ZmlsZV9ifSBvciBjcm9hayAiJG0tPntmaWxlX2J9IGlzIG5vdCBleGVjdXRhYmxlIVxuIjsKKwl9IGVsc2lmICgkbS0+e21vZGVfYn0gIX4gLzc1NSQvICYmICRtLT57bW9kZV9hfSA9fiAvNzU1JC8pIHsKKwkJc3lzKHF3KHN2biBwcm9wZGVsIHN2bjpleGVjdXRhYmxlKSwgJG0tPntmaWxlX2J9KTsKKwkJY2htb2QoKDA2NDQgJn4gdW1hc2spLCRtLT57ZmlsZV9ifSkgb3IgY3JvYWsgJCE7CisJCS14ICRtLT57ZmlsZV9ifSBhbmQgY3JvYWsgIiRtLT57ZmlsZV9ifSBpcyBleGVjdXRhYmxlIVxuIjsKKwl9Cit9CisKK3N1YiBzdm5fZW5zdXJlX3BhcmVudF9wYXRoIHsKKwlteSAkZGlyX2IgPSBkaXJuYW1lKHNoaWZ0KTsKKwlzdm5fZW5zdXJlX3BhcmVudF9wYXRoKCRkaXJfYikgaWYgKCRkaXJfYiBuZSBGaWxlOjpTcGVjLT5jdXJkaXIpOworCW1rcGF0aChbJGRpcl9iXSkgdW5sZXNzICgtZCAkZGlyX2IpOworCXN5cyhxdyhzdm4gYWRkIC1OKSwgJGRpcl9iKSB1bmxlc3MgKC1kICIkZGlyX2IvLnN2biIpOworfQorCitzdWIgcHJlY29tbWl0X2NoZWNrIHsKKwlteSAkbW9kcyA9IHNoaWZ0OworCW15ICglcm1fZmlsZSwgJXJtZGlyX2NoZWNrLCAlYWRkZWRfY2hlY2spOworCisJbXkgJW8gPSAoIEQgPT4gMCwgUiA9PiAxLCBDID0+IDIsIEEgPT4gMywgTSA9PiAzLCBUID0+IDMgKTsKKwlmb3JlYWNoIG15ICRtIChzb3J0IHsgJG97JGEtPntjaGd9fSA8PT4gJG97JGItPntjaGd9fSB9IEAkbW9kcykgeworCQlpZiAoJG0tPntjaGd9IGVxICdSJykgeworCQkJaWYgKC1kICRtLT57ZmlsZV9ifSkgeworCQkJCWVycl9kaXJfdG9fZmlsZSgiJG0tPntmaWxlX2F9ID0+ICRtLT57ZmlsZV9ifSIpOworCQkJfQorCQkJIyBkaXIvJGZpbGUgPT4gZGlyL2ZpbGUvJGZpbGUKKwkJCW15ICRkaXJuYW1lID0gZGlybmFtZSgkbS0+e2ZpbGVfYn0pOworCQkJd2hpbGUgKCRkaXJuYW1lIG5lIEZpbGU6OlNwZWMtPmN1cmRpcikgeworCQkJCWlmICgkZGlybmFtZSBuZSAkbS0+e2ZpbGVfYX0pIHsKKwkJCQkJJGRpcm5hbWUgPSBkaXJuYW1lKCRkaXJuYW1lKTsKKwkJCQkJbmV4dDsKKwkJCQl9CisJCQkJZXJyX2ZpbGVfdG9fZGlyKCIkbS0+e2ZpbGVfYX0gPT4gJG0tPntmaWxlX2J9Iik7CisJCQl9CisJCQkjIGJhei96enogPT4gYmF6IChiYXogaXMgYSBmaWxlKQorCQkJJGRpcm5hbWUgPSBkaXJuYW1lKCRtLT57ZmlsZV9hfSk7CisJCQl3aGlsZSAoJGRpcm5hbWUgbmUgRmlsZTo6U3BlYy0+Y3VyZGlyKSB7CisJCQkJaWYgKCRkaXJuYW1lIG5lICRtLT57ZmlsZV9ifSkgeworCQkJCQkkZGlybmFtZSA9IGRpcm5hbWUoJGRpcm5hbWUpOworCQkJCQluZXh0OworCQkJCX0KKwkJCQllcnJfZGlyX3RvX2ZpbGUoIiRtLT57ZmlsZV9hfSA9PiAkbS0+e2ZpbGVfYn0iKTsKKwkJCX0KKwkJfQorCQlpZiAoJG0tPntjaGd9ID1+IC9eKER8UikkLykgeworCQkJbXkgJHQgPSAkMSBlcSAnRCcgPyAnZmlsZV9iJyA6ICdmaWxlX2EnOworCQkJJHJtX2ZpbGV7ICRtLT57JHR9IH0gPSAxOworCQkJbXkgJGRpcm5hbWUgPSBkaXJuYW1lKCAkbS0+eyR0fSApOworCQkJbXkgJGJhc2VuYW1lID0gYmFzZW5hbWUoICRtLT57JHR9ICk7CisJCQkkcm1kaXJfY2hlY2t7JGRpcm5hbWV9LT57JGJhc2VuYW1lfSA9IDE7CisJCX0gZWxzaWYgKCRtLT57Y2hnfSA9fiAvXig/OkF8QykkLykgeworCQkJaWYgKC1kICRtLT57ZmlsZV9ifSkgeworCQkJCWVycl9kaXJfdG9fZmlsZSgkbS0+e2ZpbGVfYn0pOworCQkJfQorCQkJbXkgJGRpcm5hbWUgPSBkaXJuYW1lKCAkbS0+e2ZpbGVfYn0gKTsKKwkJCW15ICRiYXNlbmFtZSA9IGJhc2VuYW1lKCAkbS0+e2ZpbGVfYn0gKTsKKwkJCSRhZGRlZF9jaGVja3skZGlybmFtZX0tPnskYmFzZW5hbWV9ID0gMTsKKwkJCXdoaWxlICgkZGlybmFtZSBuZSBGaWxlOjpTcGVjLT5jdXJkaXIpIHsKKwkJCQlpZiAoJHJtX2ZpbGV7JGRpcm5hbWV9KSB7CisJCQkJCWVycl9maWxlX3RvX2RpcigkbS0+e2ZpbGVfYn0pOworCQkJCX0KKwkJCQkkZGlybmFtZSA9IGRpcm5hbWUgJGRpcm5hbWU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIChcJXJtZGlyX2NoZWNrLCBcJWFkZGVkX2NoZWNrKTsKKworCXN1YiBlcnJfZGlyX3RvX2ZpbGUgeworCQlteSAkZmlsZSA9IHNoaWZ0OworCQlwcmludCBTVERFUlIgIk5vZGUgY2hhbmdlIGZyb20gZGlyZWN0b3J5IHRvIGZpbGUgIiwKKwkJCQkiaXMgbm90IHN1cHBvcnRlZCBieSBTdWJ2ZXJzaW9uOiAiLCRmaWxlLCJcbiI7CisJCWV4aXQgMTsKKwl9CisJc3ViIGVycl9maWxlX3RvX2RpciB7CisJCW15ICRmaWxlID0gc2hpZnQ7CisJCXByaW50IFNUREVSUiAiTm9kZSBjaGFuZ2UgZnJvbSBmaWxlIHRvIGRpcmVjdG9yeSAiLAorCQkJCSJpcyBub3Qgc3VwcG9ydGVkIGJ5IFN1YnZlcnNpb246ICIsJGZpbGUsIlxuIjsKKwkJZXhpdCAxOworCX0KK30KKworc3ViIHN2bl9jaGVja291dF90cmVlIHsKKwlteSAoJHN2bl9yZXYsICR0cmVlaXNoKSA9IEBfOworCW15ICRmcm9tID0gZmlsZV90b19zKCIkUkVWX0RJUi8kc3ZuX3JldiIpOworCWFzc2VydF90cmVlKCRmcm9tKTsKKwlwcmludCAiZGlmZi10cmVlICRmcm9tICR0cmVlaXNoXG4iOworCW15ICRwaWQgPSBvcGVuIG15ICRkaWZmX2ZoLCAnLXwnOworCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKwlpZiAoJHBpZCA9PSAwKSB7CisJCW15IEBkaWZmX3RyZWUgPSBxdyhnaXQtZGlmZi10cmVlIC16IC1yIC1DKTsKKwkJcHVzaCBAZGlmZl90cmVlLCAnLS1maW5kLWNvcGllcy1oYXJkZXInIGlmICRfZmluZF9jb3BpZXNfaGFyZGVyOworCQlwdXNoIEBkaWZmX3RyZWUsICItbCRfbCIgaWYgZGVmaW5lZCAkX2w7CisJCWV4ZWMoQGRpZmZfdHJlZSwgJGZyb20sICR0cmVlaXNoKSBvciBjcm9hayAkITsKKwl9CisJbXkgJG1vZHMgPSBwYXJzZV9kaWZmX3RyZWUoJGRpZmZfZmgpOworCXVubGVzcyAoQCRtb2RzKSB7CisJCSMgZ2l0IGNhbiBkbyBlbXB0eSBjb21taXRzLCBidXQgU1ZOIGRvZXNuJ3QgYWxsb3cgaXQuLi4KKwkJcmV0dXJuICRtb2RzOworCX0KKwlteSAoJHJtLCAkYWRkKSA9IHByZWNvbW1pdF9jaGVjaygkbW9kcyk7CisKKwlteSAlbyA9ICggRCA9PiAxLCBSID0+IDAsIEMgPT4gLTEsIEEgPT4gMywgTSA9PiAzLCBUID0+IDMgKTsKKwlmb3JlYWNoIG15ICRtIChzb3J0IHsgJG97JGEtPntjaGd9fSA8PT4gJG97JGItPntjaGd9fSB9IEAkbW9kcykgeworCQlpZiAoJG0tPntjaGd9IGVxICdDJykgeworCQkJc3ZuX2Vuc3VyZV9wYXJlbnRfcGF0aCggJG0tPntmaWxlX2J9ICk7CisJCQlzeXMocXcoc3ZuIGNwKSwJCSRtLT57ZmlsZV9hfSwgJG0tPntmaWxlX2J9KTsKKwkJCWFwcGx5X21vZF9saW5lX2Jsb2IoJG0pOworCQkJc3ZuX2NoZWNrX3Byb3BfZXhlY3V0YWJsZSgkbSk7CisJCX0gZWxzaWYgKCRtLT57Y2hnfSBlcSAnRCcpIHsKKwkJCXN5cyhxdyhzdm4gcm0gLS1mb3JjZSksICRtLT57ZmlsZV9ifSk7CisJCX0gZWxzaWYgKCRtLT57Y2hnfSBlcSAnUicpIHsKKwkJCXN2bl9lbnN1cmVfcGFyZW50X3BhdGgoICRtLT57ZmlsZV9ifSApOworCQkJc3lzKHF3KHN2biBtdiAtLWZvcmNlKSwgJG0tPntmaWxlX2F9LCAkbS0+e2ZpbGVfYn0pOworCQkJYXBwbHlfbW9kX2xpbmVfYmxvYigkbSk7CisJCQlzdm5fY2hlY2tfcHJvcF9leGVjdXRhYmxlKCRtKTsKKwkJfSBlbHNpZiAoJG0tPntjaGd9IGVxICdNJykgeworCQkJYXBwbHlfbW9kX2xpbmVfYmxvYigkbSk7CisJCQlzdm5fY2hlY2tfcHJvcF9leGVjdXRhYmxlKCRtKTsKKwkJfSBlbHNpZiAoJG0tPntjaGd9IGVxICdUJykgeworCQkJc3lzKHF3KHN2biBybSAtLWZvcmNlKSwkbS0+e2ZpbGVfYn0pOworCQkJYXBwbHlfbW9kX2xpbmVfYmxvYigkbSk7CisJCQlzeXMocXcoc3ZuIGFkZCAtLWZvcmNlKSwgJG0tPntmaWxlX2J9KTsKKwkJCXN2bl9jaGVja19wcm9wX2V4ZWN1dGFibGUoJG0pOworCQl9IGVsc2lmICgkbS0+e2NoZ30gZXEgJ0EnKSB7CisJCQlzdm5fZW5zdXJlX3BhcmVudF9wYXRoKCAkbS0+e2ZpbGVfYn0gKTsKKwkJCWFwcGx5X21vZF9saW5lX2Jsb2IoJG0pOworCQkJc3lzKHF3KHN2biBhZGQgLS1mb3JjZSksICRtLT57ZmlsZV9ifSk7CisJCQlzdm5fY2hlY2tfcHJvcF9leGVjdXRhYmxlKCRtKTsKKwkJfSBlbHNlIHsKKwkJCWNyb2FrICJJbnZhbGlkIGNoZzogJG0tPntjaGd9XG4iOworCQl9CisJfQorCisJYXNzZXJ0X3RyZWUoJHRyZWVpc2gpOworCWlmICgkX3JtZGlyKSB7ICMgcmVtb3ZlIGVtcHR5IGRpcmVjdG9yaWVzCisJCWhhbmRsZV9ybWRpcigkcm0sICRhZGQpOworCX0KKwlhc3NlcnRfdHJlZSgkdHJlZWlzaCk7CisJcmV0dXJuICRtb2RzOworfQorCisjIHN2biBscyBkb2Vzbid0IHdvcmsgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgdHJlZSwgYnV0IHdoYXQncworIyBpbiB0aGUgcmVwb3NpdG9yeS4gIFRoZXJlJ3Mgbm90IGV2ZW4gYW4gb3B0aW9uIGZvciBpdC4uLiAqc2lnaCoKKyMgKGFkZGVkIGZpbGVzIGRvbid0IHNob3cgdXAgYW5kIHJlbW92ZWQgZmlsZXMgcmVtYWluIGluIHRoZSBscyBsaXN0aW5nKQorc3ViIHN2bl9sc19jdXJyZW50IHsKKwlteSAoJGRpciwgJHJtLCAkYWRkKSA9IEBfOworCWNob21wKG15IEBscyA9IHNhZmVfcXgoJ3N2bicsJ2xzJywkZGlyKSk7CisJbXkgQHJldCA9ICgpOworCWZvcmVhY2ggKEBscykgeworCQlzIy8kIyM7ICMgdHJhaWxpbmcgc2xhc2hlcyBhcmUgZXZpbAorCQlwdXNoIEByZXQsICRfIHVubGVzcyAkcm0tPnskZGlyfS0+eyRffTsKKwl9CisJaWYgKGV4aXN0cyAkYWRkLT57JGRpcn0pIHsKKwkJcHVzaCBAcmV0LCBrZXlzICV7JGFkZC0+eyRkaXJ9fTsKKwl9CisJcmV0dXJuIFxAcmV0OworfQorCitzdWIgaGFuZGxlX3JtZGlyIHsKKwlteSAoJHJtLCAkYWRkKSA9IEBfOworCisJZm9yZWFjaCBteSAkZGlyIChzb3J0IHtsZW5ndGggJGIgPD0+IGxlbmd0aCAkYX0ga2V5cyAlJHJtKSB7CisJCW15ICRscyA9IHN2bl9sc19jdXJyZW50KCRkaXIsICRybSwgJGFkZCk7CisJCW5leHQgaWYgKHNjYWxhciBAJGxzKTsKKwkJc3lzKHF3KHN2biBybSAtLWZvcmNlKSwkZGlyKTsKKworCQlteSAkZG4gPSBkaXJuYW1lICRkaXI7CisJCSRybS0+eyAkZG4gfS0+eyBiYXNlbmFtZSAkZGlyIH0gPSAxOworCQkkbHMgPSBzdm5fbHNfY3VycmVudCgkZG4sICRybSwgJGFkZCk7CisJCXdoaWxlIChzY2FsYXIgQCRscyA9PSAwICYmICRkbiBuZSBGaWxlOjpTcGVjLT5jdXJkaXIpIHsKKwkJCXN5cyhxdyhzdm4gcm0gLS1mb3JjZSksJGRuKTsKKwkJCSRkaXIgPSBiYXNlbmFtZSAkZG47CisJCQkkZG4gPSBkaXJuYW1lICRkbjsKKwkJCSRybS0+eyAkZG4gfS0+eyAkZGlyIH0gPSAxOworCQkJJGxzID0gc3ZuX2xzX2N1cnJlbnQoJGRuLCAkcm0sICRhZGQpOworCQl9CisJfQorfQorCitzdWIgc3ZuX2NvbW1pdF90cmVlIHsKKwlteSAoJHN2bl9yZXYsICRjb21taXQpID0gQF87CisJbXkgJGNvbW1pdF9tc2cgPSAiJEdJVF9ESVIvJEdJVF9TVk4vLnN2bi1jb21taXQudG1wLiQkIjsKKwlteSAlbG9nX21zZyA9ICggbXNnID0+ICcnICk7CisJb3BlbiBteSAkbXNnLCAnPicsICRjb21taXRfbXNnIG9yIGNyb2FrICQhOworCisJY2hvbXAobXkgJHR5cGUgPSBgZ2l0LWNhdC1maWxlIC10ICRjb21taXRgKTsKKwlpZiAoJHR5cGUgZXEgJ2NvbW1pdCcpIHsKKwkJbXkgJHBpZCA9IG9wZW4gbXkgJG1zZ19maCwgJy18JzsKKwkJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCisJCWlmICgkcGlkID09IDApIHsKKwkJCWV4ZWMocXcoZ2l0LWNhdC1maWxlIGNvbW1pdCksICRjb21taXQpIG9yIGNyb2FrICQhOworCQl9CisJCW15ICRpbl9tc2cgPSAwOworCQl3aGlsZSAoPCRtc2dfZmg+KSB7CisJCQlpZiAoISRpbl9tc2cpIHsKKwkJCQkkaW5fbXNnID0gMSBpZiAoL15ccyokLyk7CisJCQl9IGVsc2lmICgvXmdpdC1zdm4taWQ6IC8pIHsKKwkJCQkjIHNraXAgdGhpcywgd2UgcmVnZW5lcmF0ZSB0aGUgY29ycmVjdCBvbmUKKwkJCQkjIG9uIHJlLWZldGNoIGFueXdheXMKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgJG1zZyAkXyBvciBjcm9hayAkITsKKwkJCX0KKwkJfQorCQljbG9zZSAkbXNnX2ZoIG9yIGNyb2FrICQhOworCX0KKwljbG9zZSAkbXNnIG9yIGNyb2FrICQhOworCisJaWYgKCRfZWRpdCB8fCAoJHR5cGUgZXEgJ3RyZWUnKSkgeworCQlteSAkZWRpdG9yID0gJEVOVntWSVNVQUx9IHx8ICRFTlZ7RURJVE9SfSB8fCAndmknOworCQlzeXN0ZW0oJGVkaXRvciwgJGNvbW1pdF9tc2cpOworCX0KKworCSMgZmlsZV90b19zIHJlbW92ZXMgYWxsIHRyYWlsaW5nIG5ld2xpbmVzLCBzbyBqdXN0IHVzZSBjaG9tcCgpIGhlcmU6CisJb3BlbiAkbXNnLCAnPCcsICRjb21taXRfbXNnIG9yIGNyb2FrICQhOworCXsgbG9jYWwgJC87IGNob21wKCRsb2dfbXNne21zZ30gPSA8JG1zZz4pOyB9CisJY2xvc2UgJG1zZyBvciBjcm9hayAkITsKKworCW15ICgkb25lbGluZSkgPSAoJGxvZ19tc2d7bXNnfSA9fiAvKFteXG5ccl0rKS8pOworCXByaW50ICJDb21taXR0aW5nICRjb21taXQ6ICRvbmVsaW5lXG4iOworCisJbXkgQGNpX291dHB1dCA9IHNhZmVfcXgocXcoc3ZuIGNvbW1pdCAtRiksJGNvbW1pdF9tc2cpOworCW15ICgkY29tbWl0dGVkKSA9IGdyZXAoL15Db21taXR0ZWQgcmV2aXNpb24gXGQrXC4vLEBjaV9vdXRwdXQpOworCXVubGluayAkY29tbWl0X21zZzsKKwlkZWZpbmVkICRjb21taXR0ZWQgb3IgY3JvYWsKKwkJCSJDb21taXQgb3V0cHV0IGZhaWxlZCB0byBwYXJzZSBjb21taXR0ZWQgcmV2aXNpb24hXG4iLAorCQkJam9pbigiXG4iLEBjaV9vdXRwdXQpLCJcbiI7CisJbXkgKCRyZXZfY29tbWl0dGVkKSA9ICgkY29tbWl0dGVkID1+IC9eQ29tbWl0dGVkIHJldmlzaW9uIChcZCspXC4vKTsKKworCW15IEBzdm5fdXAgPSBxdyhzdm4gdXApOworCXB1c2ggQHN2bl91cCwgJy0taWdub3JlLWV4dGVybmFscycgdW5sZXNzICRfbm9faWdub3JlX2V4dDsKKwlpZiAoJHJldl9jb21taXR0ZWQgPT0gKCRzdm5fcmV2ICsgMSkpIHsKKwkJcHVzaCBAc3ZuX3VwLCAiLXIkcmV2X2NvbW1pdHRlZCI7CisJCXN5cyhAc3ZuX3VwKTsKKwkJbXkgJGluZm8gPSBzdm5faW5mbygnLicpOworCQlteSAkZGF0ZSA9ICRpbmZvLT57J0xhc3QgQ2hhbmdlZCBEYXRlJ30gb3IgZGllICJNaXNzaW5nIGRhdGVcbiI7CisJCWlmICgkaW5mby0+eydMYXN0IENoYW5nZWQgUmV2J30gIT0gJHJldl9jb21taXR0ZWQpIHsKKwkJCWNyb2FrICIkaW5mby0+eydMYXN0IENoYW5nZWQgUmV2J30gIT0gJHJldl9jb21taXR0ZWRcbiIKKwkJfQorCQlteSAoJFksJG0sJGQsJEgsJE0sJFMsJHR6KSA9ICgkZGF0ZSA9fgorCQkJCQkvKFxkezR9KVwtKFxkXGQpXC0oXGRcZClccworCQkJCQkgKFxkXGQpXDooXGRcZClcOihcZFxkKVxzKFtcLVwrXVxkKykveCkKKwkJCQkJIG9yIGNyb2FrICJGYWlsZWQgdG8gcGFyc2UgZGF0ZTogJGRhdGVcbiI7CisJCSRsb2dfbXNne2RhdGV9ID0gIiR0eiAkWS0kbS0kZCAkSDokTTokUyI7CisJCSRsb2dfbXNne2F1dGhvcn0gPSAkaW5mby0+eydMYXN0IENoYW5nZWQgQXV0aG9yJ307CisJCSRsb2dfbXNne3JldmlzaW9ufSA9ICRyZXZfY29tbWl0dGVkOworCQkkbG9nX21zZ3ttc2d9IC49ICJcbiI7CisJCW15ICRwYXJlbnQgPSBmaWxlX3RvX3MoIiRSRVZfRElSLyRzdm5fcmV2Iik7CisJCWdpdF9jb21taXQoXCVsb2dfbXNnLCAkcGFyZW50LCAkY29tbWl0KTsKKwkJcmV0dXJuICRyZXZfY29tbWl0dGVkOworCX0KKwkjIHJlc3luYyBpbW1lZGlhdGVseQorCXB1c2ggQHN2bl91cCwgIi1yJHN2bl9yZXYiOworCXN5cyhAc3ZuX3VwKTsKKwlyZXR1cm4gZmV0Y2goIiRyZXZfY29tbWl0dGVkPSRjb21taXQiKS0+e3JldmlzaW9ufTsKK30KKworIyByZWFkIHRoZSBlbnRpcmUgbG9nIGludG8gYSB0ZW1wb3JhcnkgZmlsZSAod2hpY2ggaXMgcmVtb3ZlZCBBU0FQKQorIyBhbmQgc3RvcmUgdGhlIGZpbGUgaGFuZGxlICsgcGFyc2VyIHN0YXRlCitzdWIgc3ZuX2xvZ19yYXcgeworCW15IChAbG9nX2FyZ3MpID0gQF87CisJbXkgJGxvZ19maCA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZSBvciBjcm9hayAkITsKKwlteSAkcGlkID0gZm9yazsKKwlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisJaWYgKCEkcGlkKSB7CisJCW9wZW4gU1RET1VULCAnPiYnLCAkbG9nX2ZoIG9yIGNyb2FrICQhOworCQlleGVjIChxdyhzdm4gbG9nKSwgQGxvZ19hcmdzKSBvciBjcm9hayAkIQorCX0KKwl3YWl0cGlkICRwaWQsIDA7CisJY3JvYWsgaWYgJD87CisJc2VlayAkbG9nX2ZoLCAwLCAwIG9yIGNyb2FrICQhOworCXJldHVybiB7IHN0YXRlID0+ICdzZXAnLCBmaCA9PiAkbG9nX2ZoIH07Cit9CisKK3N1YiBuZXh0X2xvZ19lbnRyeSB7CisJbXkgJGxvZyA9IHNoaWZ0OyAjIHJldHZhbCBvZiBzdm5fbG9nX3JhdygpCisJbXkgJHJldCA9IHVuZGVmOworCW15ICRmaCA9ICRsb2ctPntmaH07CisKKwl3aGlsZSAoPCRmaD4pIHsKKwkJY2hvbXA7CisJCWlmICgvXlwtezcyfSQvKSB7CisJCQlpZiAoJGxvZy0+e3N0YXRlfSBlcSAnbXNnJykgeworCQkJCWlmICgkcmV0LT57bGluZXN9KSB7CisJCQkJCSRyZXQtPnttc2d9IC49ICRfLiJcbiI7CisJCQkJCXVubGVzcygtLSRyZXQtPntsaW5lc30pIHsKKwkJCQkJCSRsb2ctPntzdGF0ZX0gPSAnc2VwJzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWNyb2FrICJMb2cgcGFyc2UgZXJyb3IgYXQ6ICRfXG4iLAorCQkJCQkJJHJldC0+e3JldmlzaW9ufSwKKwkJCQkJCSJcbiI7CisJCQkJfQorCQkJCW5leHQ7CisJCQl9CisJCQlpZiAoJGxvZy0+e3N0YXRlfSBuZSAnc2VwJykgeworCQkJCWNyb2FrICJMb2cgcGFyc2UgZXJyb3IgYXQ6ICRfXG4iLAorCQkJCQkic3RhdGU6ICRsb2ctPntzdGF0ZX1cbiIsCisJCQkJCSRyZXQtPntyZXZpc2lvbn0sCisJCQkJCSJcbiI7CisJCQl9CisJCQkkbG9nLT57c3RhdGV9ID0gJ3Jldic7CisKKwkJCSMgaWYgd2UgaGF2ZSBhbiBlbXB0eSBsb2cgbWVzc2FnZSwgcHV0IHNvbWV0aGluZyB0aGVyZToKKwkJCWlmICgkcmV0KSB7CisJCQkJJHJldC0+e21zZ30gfHw9ICJcbiI7CisJCQkJZGVsZXRlICRyZXQtPntsaW5lc307CisJCQkJcmV0dXJuICRyZXQ7CisJCQl9CisJCQluZXh0OworCQl9CisJCWlmICgkbG9nLT57c3RhdGV9IGVxICdyZXYnICYmIHMvXnIoXGQrKVxzKlx8XHMqLy8pIHsKKwkJCW15ICRyZXYgPSAkMTsKKwkJCW15ICgkYXV0aG9yLCAkZGF0ZSwgJGxpbmVzKSA9IHNwbGl0KC9ccypcfFxzKi8sICRfLCAzKTsKKwkJCSgkbGluZXMpID0gKCRsaW5lcyA9fiAvKFxkKykvKTsKKwkJCW15ICgkWSwkbSwkZCwkSCwkTSwkUywkdHopID0gKCRkYXRlID1+CisJCQkJCS8oXGR7NH0pXC0oXGRcZClcLShcZFxkKVxzCisJCQkJCSAoXGRcZClcOihcZFxkKVw6KFxkXGQpXHMoW1wtXCtdXGQrKS94KQorCQkJCQkgb3IgY3JvYWsgIkZhaWxlZCB0byBwYXJzZSBkYXRlOiAkZGF0ZVxuIjsKKwkJCSRyZXQgPSB7CXJldmlzaW9uID0+ICRyZXYsCisJCQkJCWRhdGUgPT4gIiR0eiAkWS0kbS0kZCAkSDokTTokUyIsCisJCQkJCWF1dGhvciA9PiAkYXV0aG9yLAorCQkJCQlsaW5lcyA9PiAkbGluZXMsCisJCQkJCW1zZyA9PiAnJyB9OworCQkJaWYgKGRlZmluZWQgJF9hdXRob3JzICYmICEgZGVmaW5lZCAkdXNlcnN7JGF1dGhvcn0pIHsKKwkJCQlkaWUgIkF1dGhvcjogJGF1dGhvciBub3QgZGVmaW5lZCBpbiAiLAorCQkJCQkJIiRfYXV0aG9ycyBmaWxlXG4iOworCQkJfQorCQkJJGxvZy0+e3N0YXRlfSA9ICdtc2dfc3RhcnQnOworCQkJbmV4dDsKKwkJfQorCQkjIHNraXAgdGhlIGZpcnN0IGJsYW5rIGxpbmUgb2YgdGhlIG1lc3NhZ2U6CisJCWlmICgkbG9nLT57c3RhdGV9IGVxICdtc2dfc3RhcnQnICYmIC9eJC8pIHsKKwkJCSRsb2ctPntzdGF0ZX0gPSAnbXNnJzsKKwkJfSBlbHNpZiAoJGxvZy0+e3N0YXRlfSBlcSAnbXNnJykgeworCQkJaWYgKCRyZXQtPntsaW5lc30pIHsKKwkJCQkkcmV0LT57bXNnfSAuPSAkXy4iXG4iOworCQkJCXVubGVzcyAoLS0kcmV0LT57bGluZXN9KSB7CisJCQkJCSRsb2ctPntzdGF0ZX0gPSAnc2VwJzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNyb2FrICJMb2cgcGFyc2UgZXJyb3IgYXQ6ICRfXG4iLAorCQkJCQkkcmV0LT57cmV2aXNpb259LCJcbiI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICRyZXQ7Cit9CisKK3N1YiBzdm5faW5mbyB7CisJbXkgJHVybCA9IHNoaWZ0IHx8ICRTVk5fVVJMOworCisJbXkgJHBpZCA9IG9wZW4gbXkgJGluZm9fZmgsICctfCc7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCisJaWYgKCRwaWQgPT0gMCkgeworCQlleGVjKHF3KHN2biBpbmZvKSwkdXJsKSBvciBjcm9hayAkITsKKwl9CisKKwlteSAkcmV0ID0ge307CisJIyBvbmx5IHNpbmdsZS1saW5lcyBzZWVtIHRvIGV4aXN0IGluIHN2biBpbmZvIG91dHB1dAorCXdoaWxlICg8JGluZm9fZmg+KSB7CisJCWNob21wICRfOworCQlpZiAobSNeKFteOl0rKVxzKjpccyooXFMuKikkIykgeworCQkJJHJldC0+eyQxfSA9ICQyOworCQkJcHVzaCBAeyRyZXQtPnstb3JkZXJ9fSwgJDE7CisJCX0KKwl9CisJY2xvc2UgJGluZm9fZmggb3IgY3JvYWsgJCE7CisJcmV0dXJuICRyZXQ7Cit9CisKK3N1YiBzeXMgeyBzeXN0ZW0oQF8pID09IDAgb3IgY3JvYWsgJD8gfQorCitzdWIgZW9sX2NwIHsKKwlteSAoJGZyb20sICR0bykgPSBAXzsKKwlteSAkZXMgPSBzYWZlX3F4KHF3L3N2biBwcm9wZ2V0IHN2bjplb2wtc3R5bGUvLCAkdG8pOworCW9wZW4gbXkgJHJmZCwgJzwnLCAkZnJvbSBvciBjcm9hayAkITsKKwliaW5tb2RlICRyZmQgb3IgY3JvYWsgJCE7CisJb3BlbiBteSAkd2ZkLCAnPicsICR0byBvciBjcm9hayAkITsKKwliaW5tb2RlICR3ZmQgb3IgY3JvYWsgJCE7CisKKwlteSAkZW9sID0gJEVPTHskZXN9IG9yIHVuZGVmOworCWlmICgkZW9sKSB7CisJCXByaW50ICAiJGVvbDogJGZyb20gPT4gJHRvXG4iOworCX0KKwlteSAkYnVmOworCXdoaWxlICgxKSB7CisJCW15ICgkciwgJHcsICR0KTsKKwkJZGVmaW5lZCgkciA9IHN5c3JlYWQoJHJmZCwgJGJ1ZiwgNDA5NikpIG9yIGNyb2FrICQhOworCQlyZXR1cm4gdW5sZXNzICRyOworCQkkYnVmID1+IHMvKD86XDAxNXxcMDEyfFwwMTVcMDEyKS8kZW9sL2dzIGlmICRlb2w7CisJCWZvciAoJHcgPSAwOyAkdyA8ICRyOyAkdyArPSAkdCkgeworCQkJJHQgPSBzeXN3cml0ZSgkd2ZkLCAkYnVmLCAkciAtICR3LCAkdykgb3IgY3JvYWsgJCE7CisJCX0KKwl9Cit9CisKK3N1YiBkb191cGRhdGVfaW5kZXggeworCW15ICgkel9jbWQsICRjbWQsICRub190ZXh0X2Jhc2UpID0gQF87CisKKwlteSAkeiA9IG9wZW4gbXkgJHAsICctfCc7CisJZGVmaW5lZCAkeiBvciBjcm9hayAkITsKKwl1bmxlc3MgKCR6KSB7IGV4ZWMgQCR6X2NtZCBvciBjcm9hayAkISB9CisKKwlteSAkcGlkID0gb3BlbiBteSAkdWksICd8LSc7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCXVubGVzcyAoJHBpZCkgeworCQlleGVjKCdnaXQtdXBkYXRlLWluZGV4JywiLS0kY21kIiwnLXonLCctLXN0ZGluJykgb3IgY3JvYWsgJCE7CisJfQorCWxvY2FsICQvID0gIlwwIjsKKwl3aGlsZSAobXkgJHggPSA8JHA+KSB7CisJCWNob21wICR4OworCQlpZiAoISRub190ZXh0X2Jhc2UgJiYgbHN0YXQgJHggJiYgISAtbCBfICYmCisJCQkJc2FmZV9xeChxdy9zdm4gcHJvcGdldCBzdm46a2V5d29yZHMvLCR4KSkgeworCQkJbXkgJG1vZGUgPSAteCBfID8gMDc1NSA6IDA2NDQ7CisJCQlteSAoJHYsJGQsJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCR4KTsKKwkJCW15ICR0YiA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJGQsICcuc3ZuJywgJ3RtcCcsCisJCQkJCQkndGV4dC1iYXNlJywiJGYuc3ZuLWJhc2UiKTsKKwkJCSR0YiA9fiBzI14vIyM7CisJCQl1bmxlc3MgKC1mICR0YikgeworCQkJCSR0YiA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJGQsICcuc3ZuJywKKwkJCQkJCSd0ZXh0LWJhc2UnLCIkZi5zdm4tYmFzZSIpOworCQkJCSR0YiA9fiBzI14vIyM7CisJCQl9CisJCQl1bmxpbmsgJHggb3IgY3JvYWsgJCE7CisJCQllb2xfY3AoJHRiLCAkeCk7CisJCQljaG1vZCgoJG1vZGUgJn4gdW1hc2spLCAkeCkgb3IgY3JvYWsgJCE7CisJCX0KKwkJcHJpbnQgJHVpICR4LCJcMCI7CisJfQorCWNsb3NlICR1aSBvciBjcm9hayAkITsKK30KKworc3ViIGluZGV4X2NoYW5nZXMgeworCW15ICRub190ZXh0X2Jhc2UgPSBzaGlmdDsKKwlkb191cGRhdGVfaW5kZXgoW3F3L2dpdC1kaWZmLWZpbGVzIC0tbmFtZS1vbmx5IC16L10sCisJCQkncmVtb3ZlJywKKwkJCSRub190ZXh0X2Jhc2UpOworCWRvX3VwZGF0ZV9pbmRleChbcXcvZ2l0LWxzLWZpbGVzIC16IC0tb3RoZXJzLywKKwkJCSAgICAgICItLWV4Y2x1ZGUtZnJvbT0kR0lUX0RJUi8kR0lUX1NWTi9pbmZvL2V4Y2x1ZGUiXSwKKwkJCSdhZGQnLAorCQkJJG5vX3RleHRfYmFzZSk7Cit9CisKK3N1YiBzX3RvX2ZpbGUgeworCW15ICgkc3RyLCAkZmlsZSwgJG1vZGUpID0gQF87CisJb3BlbiBteSAkZmQsJz4nLCRmaWxlIG9yIGNyb2FrICQhOworCXByaW50ICRmZCAkc3RyLCJcbiIgb3IgY3JvYWsgJCE7CisJY2xvc2UgJGZkIG9yIGNyb2FrICQhOworCWNobW9kICgkbW9kZSAmfiB1bWFzaywgJGZpbGUpIGlmIChkZWZpbmVkICRtb2RlKTsKK30KKworc3ViIGZpbGVfdG9fcyB7CisJbXkgJGZpbGUgPSBzaGlmdDsKKwlvcGVuIG15ICRmZCwnPCcsJGZpbGUgb3IgY3JvYWsgIiQhOiBmaWxlOiAkZmlsZVxuIjsKKwlsb2NhbCAkLzsKKwlteSAkcmV0ID0gPCRmZD47CisJY2xvc2UgJGZkIG9yIGNyb2FrICQhOworCSRyZXQgPX4gcy9ccyokLy9zOworCXJldHVybiAkcmV0OworfQorCitzdWIgYXNzZXJ0X3JldmlzaW9uX3Vua25vd24geworCW15ICRyZXZubyA9IHNoaWZ0OworCWlmICgtZiAiJFJFVl9ESVIvJHJldm5vIikgeworCQljcm9hayAiJFJFVl9ESVIvJHJldm5vIGFscmVhZHkgZXhpc3RzISAiLAorCQkJCSJXaHkgYXJlIHdlIHJlZmV0Y2hpbmcgaXQ/IjsKKwl9Cit9CisKK3N1YiB0cmVlc19lcSB7CisJbXkgKCR4LCAkeSkgPSBAXzsKKwlteSBAeCA9IHNhZmVfcXgoJ2dpdC1jYXQtZmlsZScsJ2NvbW1pdCcsJHgpOworCW15IEB5ID0gc2FmZV9xeCgnZ2l0LWNhdC1maWxlJywnY29tbWl0JywkeSk7CisJaWYgKCgkeVswXSBuZSAkeFswXSkgfHwgJHhbMF0gIX4gL150cmVlICRzaGExXG4kLworCQkJCXx8ICR5WzBdICF+IC9edHJlZSAkc2hhMVxuJC8pIHsKKwkJcHJpbnQgU1RERVJSICJUcmVlcyBub3QgZXF1YWw6ICR5WzBdICE9ICR4WzBdXG4iOworCQlyZXR1cm4gMAorCX0KKwlyZXR1cm4gMTsKK30KKworc3ViIGFzc2VydF9yZXZpc2lvbl9lcV9vcl91bmtub3duIHsKKwlteSAoJHJldm5vLCAkY29tbWl0KSA9IEBfOworCWlmICgtZiAiJFJFVl9ESVIvJHJldm5vIikgeworCQlteSAkY3VycmVudCA9IGZpbGVfdG9fcygiJFJFVl9ESVIvJHJldm5vIik7CisJCWlmICgoJGNvbW1pdCBuZSAkY3VycmVudCkgJiYgIXRyZWVzX2VxKCRjb21taXQsICRjdXJyZW50KSkgeworCQkJY3JvYWsgIiRSRVZfRElSLyRyZXZubyBhbHJlYWR5IGV4aXN0cyFcbiIsCisJCQkJImN1cnJlbnQ6ICRjdXJyZW50XG5leHBlY3RlZDogJGNvbW1pdFxuIjsKKwkJfQorCQlyZXR1cm47CisJfQorfQorCitzdWIgZ2l0X2NvbW1pdCB7CisJbXkgKCRsb2dfbXNnLCBAcGFyZW50cykgPSBAXzsKKwlhc3NlcnRfcmV2aXNpb25fdW5rbm93bigkbG9nX21zZy0+e3JldmlzaW9ufSk7CisJbXkgJG91dF9maCA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZSBvciBjcm9hayAkITsKKworCW1hcF90cmVlX2pvaW5zKCkgaWYgKEBfYnJhbmNoX2Zyb20gJiYgISV0cmVlX21hcCk7CisKKwkjIGNvbW1pdCBwYXJlbnRzIGNhbiBiZSBjb25kaXRpb25hbGx5IGJvdW5kIHRvIGEgcGFydGljdWxhcgorCSMgc3ZuIHJldmlzaW9uIHZpYTogInN2bl9yZXZubz1jb21taXRfc2hhMSIsIGZpbHRlciB0aGVtIG91dCBoZXJlOgorCW15IEBleGVjX3BhcmVudHM7CisJZm9yZWFjaCBteSAkcCAoQHBhcmVudHMpIHsKKwkJbmV4dCB1bmxlc3MgZGVmaW5lZCAkcDsKKwkJaWYgKCRwID1+IC9eKFxkKyk9KCRzaGExX3Nob3J0KSQvbykgeworCQkJaWYgKCQxID09ICRsb2dfbXNnLT57cmV2aXNpb259KSB7CisJCQkJcHVzaCBAZXhlY19wYXJlbnRzLCAkMjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXB1c2ggQGV4ZWNfcGFyZW50cywgJHAgaWYgJHAgPX4gLyRzaGExX3Nob3J0L287CisJCX0KKwl9CisKKwlteSAkcGlkID0gZm9yazsKKwlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisJaWYgKCRwaWQgPT0gMCkgeworCQkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRHSVRfU1ZOX0lOREVYOworCQlpbmRleF9jaGFuZ2VzKCk7CisJCWNob21wKG15ICR0cmVlID0gYGdpdC13cml0ZS10cmVlYCk7CisJCWNyb2FrIGlmICQ/OworCQlpZiAoZXhpc3RzICR0cmVlX21hcHskdHJlZX0pIHsKKwkJCW15ICVzZWVuX3BhcmVudCA9IG1hcCB7ICRfID0+IDEgfSBAZXhlY19wYXJlbnRzOworCQkJZm9yZWFjaCAoQHskdHJlZV9tYXB7JHRyZWV9fSkgeworCQkJCSMgTUFYUEFSRU5UIGlzIGRlZmluZWQgdG8gMTYgaW4gY29tbWl0LXRyZWUuYzoKKwkJCQlpZiAoJHNlZW5fcGFyZW50eyRffSB8fCBAZXhlY19wYXJlbnRzID4gMTYpIHsKKwkJCQkJbmV4dDsKKwkJCQl9CisJCQkJcHVzaCBAZXhlY19wYXJlbnRzLCAkXzsKKwkJCQkkc2Vlbl9wYXJlbnR7JF99ID0gMTsKKwkJCX0KKwkJfQorCQlteSAkbXNnX2ZoID0gSU86OkZpbGUtPm5ld190bXBmaWxlIG9yIGNyb2FrICQhOworCQlwcmludCAkbXNnX2ZoICRsb2dfbXNnLT57bXNnfSwgIlxuZ2l0LXN2bi1pZDogIiwKKwkJCQkJIiRTVk5fVVJMXEAkbG9nX21zZy0+e3JldmlzaW9ufSIsCisJCQkJCSIgJFNWTl9VVUlEXG4iIG9yIGNyb2FrICQhOworCQkkbXNnX2ZoLT5mbHVzaCA9PSAwIG9yIGNyb2FrICQhOworCQlzZWVrICRtc2dfZmgsIDAsIDAgb3IgY3JvYWsgJCE7CisKKwkJc2V0X2NvbW1pdF9lbnYoJGxvZ19tc2cpOworCisJCW15IEBleGVjID0gKCdnaXQtY29tbWl0LXRyZWUnLCR0cmVlKTsKKwkJcHVzaCBAZXhlYywgJy1wJywgJF8gIGZvcmVhY2ggQGV4ZWNfcGFyZW50czsKKwkJb3BlbiBTVERJTiwgJzwmJywgJG1zZ19maCBvciBjcm9hayAkITsKKwkJb3BlbiBTVERPVVQsICc+JicsICRvdXRfZmggb3IgY3JvYWsgJCE7CisJCWV4ZWMgQGV4ZWMgb3IgY3JvYWsgJCE7CisJfQorCXdhaXRwaWQoJHBpZCwwKTsKKwljcm9hayBpZiAkPzsKKworCSRvdXRfZmgtPmZsdXNoID09IDAgb3IgY3JvYWsgJCE7CisJc2VlayAkb3V0X2ZoLCAwLCAwIG9yIGNyb2FrICQhOworCWNob21wKG15ICRjb21taXQgPSBkbyB7IGxvY2FsICQvOyA8JG91dF9maD4gfSk7CisJaWYgKCRjb21taXQgIX4gL14kc2hhMSQvbykgeworCQljcm9hayAiRmFpbGVkIHRvIGNvbW1pdCwgaW52YWxpZCBzaGExOiAkY29tbWl0XG4iOworCX0KKwlteSBAdXBkYXRlX3JlZiA9ICgnZ2l0LXVwZGF0ZS1yZWYnLCJyZWZzL3JlbW90ZXMvJEdJVF9TVk4iLCRjb21taXQpOworCWlmIChteSAkcHJpbWFyeV9wYXJlbnQgPSBzaGlmdCBAZXhlY19wYXJlbnRzKSB7CisJCSRwaWQgPSBmb3JrOworCQlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisJCWlmICghJHBpZCkgeworCQkJY2xvc2UgU1RERVJSOworCQkJY2xvc2UgU1RET1VUOworCQkJZXhlYyAnZ2l0LXJldi1wYXJzZScsJy0tdmVyaWZ5JywKKwkJCQkJCSJyZWZzL3JlbW90ZXMvJEdJVF9TVk5eMCI7CisJCX0KKwkJd2FpdHBpZCAkcGlkLCAwOworCQlwdXNoIEB1cGRhdGVfcmVmLCAkcHJpbWFyeV9wYXJlbnQgdW5sZXNzICQ/OworCX0KKwlzeXMoQHVwZGF0ZV9yZWYpOworCXN5cygnZ2l0LXVwZGF0ZS1yZWYnLCIkR0lUX1NWTi9yZXZzLyRsb2dfbXNnLT57cmV2aXNpb259IiwkY29tbWl0KTsKKwlwcmludCAiciRsb2dfbXNnLT57cmV2aXNpb259ID0gJGNvbW1pdFxuIjsKKwlyZXR1cm4gJGNvbW1pdDsKK30KKworc3ViIHNldF9jb21taXRfZW52IHsKKwlteSAoJGxvZ19tc2cpID0gQF87CisJbXkgJGF1dGhvciA9ICRsb2dfbXNnLT57YXV0aG9yfTsKKwlteSAoJG5hbWUsJGVtYWlsKSA9IGRlZmluZWQgJHVzZXJzeyRhdXRob3J9ID8gIEB7JHVzZXJzeyRhdXRob3J9fQorCQkJCTogKCRhdXRob3IsIiRhdXRob3JcQCRTVk5fVVVJRCIpOworCSRFTlZ7R0lUX0FVVEhPUl9OQU1FfSA9ICRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSA9ICRuYW1lOworCSRFTlZ7R0lUX0FVVEhPUl9FTUFJTH0gPSAkRU5We0dJVF9DT01NSVRURVJfRU1BSUx9ID0gJGVtYWlsOworCSRFTlZ7R0lUX0FVVEhPUl9EQVRFfSA9ICRFTlZ7R0lUX0NPTU1JVFRFUl9EQVRFfSA9ICRsb2dfbXNnLT57ZGF0ZX07Cit9CisKK3N1YiBhcHBseV9tb2RfbGluZV9ibG9iIHsKKwlteSAkbSA9IHNoaWZ0OworCWlmICgkbS0+e21vZGVfYn0gPX4gL14xMjAvKSB7CisJCWJsb2JfdG9fc3ltbGluaygkbS0+e3NoYTFfYn0sICRtLT57ZmlsZV9ifSk7CisJfSBlbHNlIHsKKwkJYmxvYl90b19maWxlKCRtLT57c2hhMV9ifSwgJG0tPntmaWxlX2J9KTsKKwl9Cit9CisKK3N1YiBibG9iX3RvX3N5bWxpbmsgeworCW15ICgkYmxvYiwgJGxpbmspID0gQF87CisJZGVmaW5lZCAkbGluayBvciBjcm9hayAiXCRsaW5rIG5vdCBkZWZpbmVkIVxuIjsKKwljcm9hayAiTm90IGEgc2hhMTogJGJsb2JcbiIgdW5sZXNzICRibG9iID1+IC9eJHNoYTEkL287CisJaWYgKC1sICRsaW5rIHx8IC1mIF8pIHsKKwkJdW5saW5rICRsaW5rIG9yIGNyb2FrICQhOworCX0KKworCW15ICRkZXN0ID0gYGdpdC1jYXQtZmlsZSBibG9iICRibG9iYDsgIyBubyBuZXdsaW5lLCBzbyBubyBjaG9tcAorCXN5bWxpbmsgJGRlc3QsICRsaW5rIG9yIGNyb2FrICQhOworfQorCitzdWIgYmxvYl90b19maWxlIHsKKwlteSAoJGJsb2IsICRmaWxlKSA9IEBfOworCWRlZmluZWQgJGZpbGUgb3IgY3JvYWsgIlwkZmlsZSBub3QgZGVmaW5lZCFcbiI7CisJY3JvYWsgIk5vdCBhIHNoYTE6ICRibG9iXG4iIHVubGVzcyAkYmxvYiA9fiAvXiRzaGExJC9vOworCWlmICgtbCAkZmlsZSB8fCAtZiBfKSB7CisJCXVubGluayAkZmlsZSBvciBjcm9hayAkITsKKwl9CisKKwlvcGVuIG15ICRibG9iX2ZoLCAnPicsICRmaWxlIG9yIGNyb2FrICIkITogJGZpbGVcbiI7CisJbXkgJHBpZCA9IGZvcms7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCisJaWYgKCRwaWQgPT0gMCkgeworCQlvcGVuIFNURE9VVCwgJz4mJywgJGJsb2JfZmggb3IgY3JvYWsgJCE7CisJCWV4ZWMoJ2dpdC1jYXQtZmlsZScsJ2Jsb2InLCRibG9iKTsKKwl9CisJd2FpdHBpZCAkcGlkLCAwOworCWNyb2FrICQ/IGlmICQ/OworCisJY2xvc2UgJGJsb2JfZmggb3IgY3JvYWsgJCE7Cit9CisKK3N1YiBzYWZlX3F4IHsKKwlteSAkcGlkID0gb3BlbiBteSAkY2hpbGQsICctfCc7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCWlmICgkcGlkID09IDApIHsKKwkJZXhlYyhAXykgb3IgY3JvYWsgJD87CisJfQorCW15IEByZXQgPSAoPCRjaGlsZD4pOworCWNsb3NlICRjaGlsZCBvciBjcm9hayAkPzsKKwlkaWUgJD8gaWYgJD87ICMganVzdCBpbiBjYXNlIGNsb3NlIGRpZG4ndCBlcnJvciBvdXQKKwlyZXR1cm4gd2FudGFycmF5ID8gQHJldCA6IGpvaW4oJycsQHJldCk7Cit9CisKK3N1YiBzdm5fY29tcGF0X2NoZWNrIHsKKwlteSBAY29faGVscCA9IHNhZmVfcXgocXcoc3ZuIGNvIC1oKSk7CisJdW5sZXNzIChncmVwIC9pZ25vcmUtZXh0ZXJuYWxzLyxAY29faGVscCkgeworCQlwcmludCBTVERFUlIgIlc6IEluc3RhbGxlZCBzdm4gdmVyc2lvbiBkb2VzIG5vdCBzdXBwb3J0ICIsCisJCQkJIi0taWdub3JlLWV4dGVybmFsc1xuIjsKKwkJJF9ub19pZ25vcmVfZXh0ID0gMTsKKwl9CisJaWYgKGdyZXAgL3VzYWdlOiBjaGVja291dCBVUkxcW1xAUkVWXF0vLEBjb19oZWxwKSB7CisJCSRfc3ZuX2NvX3VybF9yZXZzID0gMTsKKwl9CisKKwkjIEkgcmVhbGx5LCByZWFsbHkgaG9wZSBub2JvZHkgaGl0cyB0aGlzLi4uCisJdW5sZXNzIChncmVwIC9zdG9wLW9uLWNvcHkvLCAoc2FmZV9xeChxdyhzdm4gbG9nIC1oKSkpKSB7CisJCXByaW50IFNUREVSUiA8PCcnOworVzogVGhlIGluc3RhbGxlZCBzdm4gdmVyc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSAtLXN0b3Atb24tY29weSBmbGFnIGluCisgICB0aGUgbG9nIGNvbW1hbmQuCisgICBMZXRzIGhvcGUgdGhlIGRpcmVjdG9yeSB5b3UncmUgdHJhY2tpbmcgaXMgbm90IGEgYnJhbmNoIG9yIHRhZworICAgYW5kIHdhcyBuZXZlciBtb3ZlZCB3aXRoaW4gdGhlIHJlcG9zaXRvcnkuLi4KKworCQkkX25vX3N0b3BfY29weSA9IDE7CisJfQorfQorCisjICpzaWdoKiwgbmV3IHZlcnNpb25zIG9mIHN2biB3b24ndCBob25vciAtcjxyZXY+IHdpdGhvdXQgVVJMQDxyZXY+LAorIyAoYW5kIHRoZXkgd29uJ3QgaG9ub3IgVVJMQDxyZXY+IHdpdGhvdXQgLXI8cmV2PiwgdG9vISkKK3N1YiBzdm5fY21kX2NoZWNrb3V0IHsKKwlteSAoJHVybCwgJHJldiwgJGRpcikgPSBAXzsKKwlteSBAY21kID0gKCdzdm4nLCdjbycsICItciRyZXYiKTsKKwlwdXNoIEBjbWQsICctLWlnbm9yZS1leHRlcm5hbHMnIHVubGVzcyAkX25vX2lnbm9yZV9leHQ7CisJJHVybCAuPSAiXEAkcmV2IiBpZiAkX3N2bl9jb191cmxfcmV2czsKKwlzeXMoQGNtZCwgJHVybCwgJGRpcik7Cit9CisKK3N1YiBjaGVja191cGdyYWRlX25lZWRlZCB7CisJbXkgJG9sZCA9IGV2YWwgeworCQlteSAkcGlkID0gb3BlbiBteSAkY2hpbGQsICctfCc7CisJCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKwkJaWYgKCRwaWQgPT0gMCkgeworCQkJY2xvc2UgU1RERVJSOworCQkJZXhlYygnZ2l0LXJldi1wYXJzZScsIiRHSVRfU1ZOLUhFQUQiKSBvciBjcm9hayAkPzsKKwkJfQorCQlteSBAcmV0ID0gKDwkY2hpbGQ+KTsKKwkJY2xvc2UgJGNoaWxkIG9yIGNyb2FrICQ/OworCQlkaWUgJD8gaWYgJD87ICMganVzdCBpbiBjYXNlIGNsb3NlIGRpZG4ndCBlcnJvciBvdXQKKwkJcmV0dXJuIHdhbnRhcnJheSA/IEByZXQgOiBqb2luKCcnLEByZXQpOworCX07CisJcmV0dXJuIHVubGVzcyAkb2xkOworCW15ICRoZWFkID0gZXZhbCB7IHNhZmVfcXgoJ2dpdC1yZXYtcGFyc2UnLCJyZWZzL3JlbW90ZXMvJEdJVF9TVk4iKSB9OworCWlmICgkQCB8fCAhJGhlYWQpIHsKKwkJcHJpbnQgU1RERVJSICJQbGVhc2UgcnVuOiAkMCByZWJ1aWxkIC0tdXBncmFkZVxuIjsKKwkJZXhpdCAxOworCX0KK30KKworIyBmaWxscyAldHJlZV9tYXAgd2l0aCBhIHJldmVyc2UgbWFwcGluZyBvZiB0cmVlcyB0byBjb21taXRzLiAgVXNlZnVsCisjIGZvciBmaW5kaW5nIHBhcmVudHMgdG8gY29tbWl0IG9uLgorc3ViIG1hcF90cmVlX2pvaW5zIHsKKwlmb3JlYWNoIG15ICRiciAoQF9icmFuY2hfZnJvbSkgeworCQlteSAkcGlkID0gb3BlbiBteSAkcGlwZSwgJy18JzsKKwkJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCQlpZiAoJHBpZCA9PSAwKSB7CisJCQlleGVjKHF3KGdpdC1yZXYtbGlzdCAtLXByZXR0eT1yYXcpLCAkYnIpIG9yIGNyb2FrICQ/OworCQl9CisJCXdoaWxlICg8JHBpcGU+KSB7CisJCQlpZiAoL15jb21taXQgKCRzaGExKSQvbykgeworCQkJCW15ICRjb21taXQgPSAkMTsKKwkJCQlteSAoJHRyZWUpID0gKDwkcGlwZT4gPX4gL150cmVlICgkc2hhMSkkL28pOworCQkJCXVubGVzcyAoZGVmaW5lZCAkdHJlZSkgeworCQkJCQlkaWUgIkZhaWxlZCB0byBwYXJzZSBjb21taXQgJGNvbW1pdFxuIjsKKwkJCQl9CisJCQkJcHVzaCBAeyR0cmVlX21hcHskdHJlZX19LCAkY29tbWl0OworCQkJfQorCQl9CisJCWNsb3NlICRwaXBlIG9yIGNyb2FrICQ/OworCX0KK30KKworIyAnPHN2biB1c2VybmFtZT4gPSByZWFsLW5hbWUgPGVtYWlsIGFkZHJlc3M+JyBtYXBwaW5nIGJhc2VkIG9uIGdpdC1zdm5pbXBvcnQ6CitzdWIgbG9hZF9hdXRob3JzIHsKKwlvcGVuIG15ICRhdXRob3JzLCAnPCcsICRfYXV0aG9ycyBvciBkaWUgIkNhbid0IG9wZW4gJF9hdXRob3JzICQhXG4iOworCXdoaWxlICg8JGF1dGhvcnM+KSB7CisJCWNob21wOworCQluZXh0IHVubGVzcyAvXihcUys/KVxzKj1ccyooLis/KVxzKjwoLispPlxzKiQvOworCQlteSAoJHVzZXIsICRuYW1lLCAkZW1haWwpID0gKCQxLCAkMiwgJDMpOworCQkkdXNlcnN7JHVzZXJ9ID0gWyRuYW1lLCAkZW1haWxdOworCX0KKwljbG9zZSAkYXV0aG9ycyBvciBjcm9hayAkITsKK30KKworX19FTkRfXworCitEYXRhIHN0cnVjdHVyZXM6CisKKyRzdm5fbG9nIGhhc2hyZWYgKGFzIHJldHVybmVkIGJ5IHN2bl9sb2dfcmF3KQoreworCWZoID0+IGZpbGUgaGFuZGxlIG9mIHRoZSBsb2cgZmlsZSwKKwlzdGF0ZSA9PiBzdGF0ZSBvZiB0aGUgbG9nIGZpbGUgcGFyc2VyIChzZXAvbXNnL3Jldi9tc2dfc3RhcnQuLi4pCit9CisKKyRsb2dfbXNnIGhhc2hyZWYgYXMgcmV0dXJuZWQgYnkgbmV4dF9sb2dfZW50cnkoJHN2bl9sb2cpCit7CisJbXNnID0+ICd3aGl0ZXNwYWNlLWZvcm1hdHRlZCBsb2cgZW50cnkKKycsCQkJCQkJIyB0cmFpbGluZyBuZXdsaW5lIGlzIHByZXNlcnZlZAorCXJldmlzaW9uID0+ICc4JywJCQkjIGludGVnZXIKKwlkYXRlID0+ICcyMDA0LTAyLTI0VDE3OjAxOjQ0LjEwODM0NVonLAkjIGNvbW1pdCBkYXRlCisJYXV0aG9yID0+ICdjb21taXR0ZXIgbmFtZScKK307CisKKworQG1vZHMgPSBhcnJheSBvZiBkaWZmLWluZGV4IGxpbmUgaGFzaGVzLCBlYWNoIGVsZW1lbnQgcmVwcmVzZW50cyBvbmUgbGluZQorCW9mIGRpZmYtaW5kZXggb3V0cHV0CisKK2RpZmYtaW5kZXggbGluZSAoJG0gaGFzaCkKK3sKKwltb2RlX2EgPT4gZmlyc3QgY29sdW1uIG9mIGRpZmYtaW5kZXggb3V0cHV0LCBubyBsZWFkaW5nICc6JywKKwltb2RlX2IgPT4gc2Vjb25kIGNvbHVtbiBvZiBkaWZmLWluZGV4IG91dHB1dCwKKwlzaGExX2IgPT4gc2hhMXN1bSBvZiB0aGUgZmluYWwgYmxvYiwKKwljaGcgPT4gY2hhbmdlIHR5cGUgW01DUkFEVF0sCisJZmlsZV9hID0+IG9yaWdpbmFsIGZpbGUgbmFtZSBvZiBhIGZpbGUgKGlmZiBjaGcgaXMgJ0MnIG9yICdSJykKKwlmaWxlX2IgPT4gbmV3L2N1cnJlbnQgZmlsZSBuYW1lIG9mIGEgZmlsZSAoYW55IGNoZykKK30KKzsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0LXN2bi9naXQtc3ZuLnR4dCBiL2NvbnRyaWIvZ2l0LXN2bi9naXQtc3ZuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2QzZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9naXQtc3ZuL2dpdC1zdm4udHh0CkBAIC0wLDAgKzEsMzE5IEBACitnaXQtc3ZuKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zdm4gLSBiaWRpcmVjdGlvbmFsIG9wZXJhdGlvbiBiZXR3ZWVuIGEgc2luZ2xlIFN1YnZlcnNpb24gYnJhbmNoIGFuZCBnaXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN2bicgPGNvbW1hbmQ+IFtvcHRpb25zXSBbYXJndW1lbnRzXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK2dpdC1zdm4gaXMgYSBzaW1wbGUgY29uZHVpdCBmb3IgY2hhbmdlc2V0cyBiZXR3ZWVuIGEgc2luZ2xlIFN1YnZlcnNpb24KK2JyYW5jaCBhbmQgZ2l0LgorCitnaXQtc3ZuIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGdpdC1zdm5pbXBvcnQuICBUaGUgd2VyZSBkZXNpZ25lZAord2l0aCB2ZXJ5IGRpZmZlcmVudCBnb2FscyBpbiBtaW5kLgorCitnaXQtc3ZuIGlzIGRlc2lnbmVkIGZvciBhbiBpbmRpdmlkdWFsIGRldmVsb3BlciB3aG8gd2FudHMgYQorYmlkaXJlY3Rpb25hbCBmbG93IG9mIGNoYW5nZXNldHMgYmV0d2VlbiBhIHNpbmdsZSBicmFuY2ggaW4gU3VidmVyc2lvbgorYW5kIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgYnJhbmNoZXMgaW4gZ2l0LiAgZ2l0LXN2bmltcG9ydCBpcyBkZXNpZ25lZAorZm9yIHJlYWQtb25seSBvcGVyYXRpb24gb24gcmVwb3NpdG9yaWVzIHRoYXQgbWF0Y2ggYSBwYXJ0aWN1bGFyIGxheW91dAorKGFsYmVpdCB0aGUgcmVjb21tZW5kZWQgb25lIGJ5IFNWTiBkZXZlbG9wZXJzKS4KKworRm9yIGltcG9ydGluZyBzdm4sIGdpdC1zdm5pbXBvcnQgaXMgcG90ZW50aWFsbHkgbW9yZSBwb3dlcmZ1bCB3aGVuCitvcGVyYXRpbmcgb24gcmVwb3NpdG9yaWVzIG9yZ2FuaXplZCB1bmRlciB0aGUgcmVjb21tZW5kZWQKK3RydW5rL2JyYW5jaC90YWdzIHN0cnVjdHVyZSwgYW5kIHNob3VsZCBiZSBmYXN0ZXIsIHRvby4KKworZ2l0LXN2biBtb3N0bHkgaWdub3JlcyB0aGUgdmVyeSBsaW1pdGVkIHZpZXcgb2YgYnJhbmNoaW5nIHRoYXQKK1N1YnZlcnNpb24gaGFzLiAgVGhpcyBhbGxvd3MgZ2l0LXN2biB0byBiZSBtdWNoIGVhc2llciB0byB1c2UsCitlc3BlY2lhbGx5IG9uIHJlcG9zaXRvcmllcyB0aGF0IGFyZSBub3Qgb3JnYW5pemVkIGluIGEgbWFubmVyIHRoYXQKK2dpdC1zdm5pbXBvcnQgaXMgZGVzaWduZWQgZm9yLgorCitDT01NQU5EUworLS0tLS0tLS0KK2luaXQ6OgorCUNyZWF0ZXMgYW4gZW1wdHkgZ2l0IHJlcG9zaXRvcnkgd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhCisJZGlyZWN0b3JpZXMgZm9yIGdpdC1zdm4uICBUaGUgU3VidmVyc2lvbiBVUkwgbXVzdCBiZSBzcGVjaWZpZWQKKwlhcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC4KKworZmV0Y2g6OgorCUZldGNoIHVuZmV0Y2hlZCByZXZpc2lvbnMgZnJvbSB0aGUgU3VidmVyc2lvbiBVUkwgd2UgYXJlCisJdHJhY2tpbmcuICByZWZzL3JlbW90ZXMvZ2l0LXN2biB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlCisJbGF0ZXN0IHJldmlzaW9uLgorCisJTm90ZTogWW91IHNob3VsZCBuZXZlciBhdHRlbXB0IHRvIG1vZGlmeSB0aGUgcmVtb3Rlcy9naXQtc3ZuCisJYnJhbmNoIG91dHNpZGUgb2YgZ2l0LXN2bi4gIEluc3RlYWQsIGNyZWF0ZSBhIGJyYW5jaCBmcm9tCisJcmVtb3Rlcy9naXQtc3ZuIGFuZCB3b3JrIG9uIHRoYXQgYnJhbmNoLiAgVXNlIHRoZSAnY29tbWl0JworCWNvbW1hbmQgKHNlZSBiZWxvdykgdG8gd3JpdGUgZ2l0IGNvbW1pdHMgYmFjayB0bworCXJlbW90ZXMvZ2l0LXN2bi4KKworCVNlZSAnQWRkaXRpb25hbCBGZXRjaCBBcmd1bWVudHMnIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbgorCW1hbnVhbGx5IGpvaW5pbmcgYnJhbmNoZXMgb24gY29tbWl0LgorCitjb21taXQ6OgorCUNvbW1pdCBzcGVjaWZpZWQgY29tbWl0IG9yIHRyZWUgb2JqZWN0cyB0byBTVk4uICBUaGlzIHJlbGllcyBvbgorCXlvdXIgaW1wb3J0ZWQgZmV0Y2ggZGF0YSBiZWluZyB1cC10by1kYXRlLiAgVGhpcyBtYWtlcworCWFic29sdXRlbHkgbm8gYXR0ZW1wdHMgdG8gZG8gcGF0Y2hpbmcgd2hlbiBjb21taXR0aW5nIHRvIFNWTiwgaXQKKwlzaW1wbHkgb3ZlcndyaXRlcyBmaWxlcyB3aXRoIHRob3NlIHNwZWNpZmllZCBpbiB0aGUgdHJlZSBvcgorCWNvbW1pdC4gIEFsbCBtZXJnaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0YWtlbiBwbGFjZQorCWluZGVwZW5kZW50bHkgb2YgZ2l0LXN2biBmdW5jdGlvbnMuCisKK3JlYnVpbGQ6OgorCU5vdCBhIHBhcnQgb2YgZGFpbHkgdXNhZ2UsIGJ1dCB0aGlzIGlzIGEgdXNlZnVsIGNvbW1hbmQgaWYKKwl5b3UndmUganVzdCBjbG9uZWQgYSByZXBvc2l0b3J5ICh1c2luZyBnaXQtY2xvbmUpIHRoYXQgd2FzCisJdHJhY2tlZCB3aXRoIGdpdC1zdm4uICBVbmZvcnR1bmF0ZWx5LCBnaXQtY2xvbmUgZG9lcyBub3QgY2xvbmUKKwlnaXQtc3ZuIG1ldGFkYXRhIGFuZCB0aGUgc3ZuIHdvcmtpbmcgdHJlZSB0aGF0IGdpdC1zdm4gdXNlcyBmb3IKKwlpdHMgb3BlcmF0aW9ucy4gIFRoaXMgcmVidWlsZHMgdGhlIG1ldGFkYXRhIHNvIGdpdC1zdm4gY2FuCisJcmVzdW1lIGZldGNoIG9wZXJhdGlvbnMuICBBIFN1YnZlcnNpb24gVVJMIG1heSBiZSBvcHRpb25hbGx5CisJc3BlY2lmaWVkIGF0IHRoZSBjb21tYW5kLWxpbmUgaWYgdGhlIGRpcmVjdG9yeS9yZXBvc2l0b3J5IHlvdSdyZQorCXRyYWNraW5nIGhhcyBtb3ZlZCBvciBjaGFuZ2VkIHByb3RvY29scy4KKworc2hvdy1pZ25vcmU6OgorCVJlY3Vyc2l2ZWx5IGZpbmRzIGFuZCBsaXN0cyB0aGUgc3ZuOmlnbm9yZSBwcm9wZXJ0eSBvbgorCWRpcmVjdG9yaWVzLiAgVGhlIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgYXBwZW5kaW5nIHRvCisJdGhlICRHSVRfRElSL2luZm8vZXhjbHVkZSBmaWxlLgorCitPUFRJT05TCistLS0tLS0tCistciA8QVJHPjo6CistLXJldmlzaW9uIDxBUkc+OjoKKwlPbmx5IHVzZWQgd2l0aCB0aGUgJ2ZldGNoJyBjb21tYW5kLgorCisJVGFrZXMgYW55IHZhbGlkIC1yPGFyZ3VtZW50PiBzdm4gd291bGQgYWNjZXB0IGFuZCBwYXNzZXMgaXQKKwlkaXJlY3RseSB0byBzdm4uIC1yPEFSRzE+OjxBUkcyPiByYW5nZXMgYW5kICJ7IiBEQVRFICJ9IiBzeW50YXgKKwlpcyBhbHNvIHN1cHBvcnRlZC4gIFRoaXMgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIHN2biwgc2VlIHN2bgorCWRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKworCVRoaXMgY2FuIGFsbG93IHlvdSB0byBtYWtlIHBhcnRpYWwgbWlycm9ycyB3aGVuIHJ1bm5pbmcgZmV0Y2guCisKKy06OgorLS1zdGRpbjo6CisJT25seSB1c2VkIHdpdGggdGhlICdjb21taXQnIGNvbW1hbmQuCisKKwlSZWFkIGEgbGlzdCBvZiBjb21taXRzIGZyb20gc3RkaW4gYW5kIGNvbW1pdCB0aGVtIGluIHJldmVyc2UKKwlvcmRlci4gIE9ubHkgdGhlIGxlYWRpbmcgc2hhMSBpcyByZWFkIGZyb20gZWFjaCBsaW5lLCBzbworCWdpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIG91dHB1dCBjYW4gYmUgdXNlZC4KKworLS1ybWRpcjo6CisJT25seSB1c2VkIHdpdGggdGhlICdjb21taXQnIGNvbW1hbmQuCisKKwlSZW1vdmUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgU1ZOIHRyZWUgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIGxlZnQKKwliZWhpbmQuICBTVk4gY2FuIHZlcnNpb24gZW1wdHkgZGlyZWN0b3JpZXMsIGFuZCB0aGV5IGFyZSBub3QKKwlyZW1vdmVkIGJ5IGRlZmF1bHQgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIGxlZnQgaW4gdGhlbS4gIGdpdAorCWNhbm5vdCB2ZXJzaW9uIGVtcHR5IGRpcmVjdG9yaWVzLiAgRW5hYmxpbmcgdGhpcyBmbGFnIHdpbGwgbWFrZQorCXRoZSBjb21taXQgdG8gU1ZOIGFjdCBsaWtlIGdpdC4KKworCXJlcG8tY29uZmlnIGtleTogc3ZuLnJtZGlyCisKKy1lOjoKKy0tZWRpdDo6CisJT25seSB1c2VkIHdpdGggdGhlICdjb21taXQnIGNvbW1hbmQuCisKKwlFZGl0IHRoZSBjb21taXQgbWVzc2FnZSBiZWZvcmUgY29tbWl0dGluZyB0byBTVk4uICBUaGlzIGlzIG9mZiBieQorCWRlZmF1bHQgZm9yIG9iamVjdHMgdGhhdCBhcmUgY29tbWl0cywgYW5kIGZvcmNlZCBvbiB3aGVuIGNvbW1pdHRpbmcKKwl0cmVlIG9iamVjdHMuCisKKwlyZXBvLWNvbmZpZyBrZXk6IHN2bi5lZGl0CisKKy1sPG51bT46OgorLS1maW5kLWNvcGllcy1oYXJkZXI6OgorCUJvdGggb2YgdGhlc2UgYXJlIG9ubHkgdXNlZCB3aXRoIHRoZSAnY29tbWl0JyBjb21tYW5kLgorCisJVGhleSBhcmUgYm90aCBwYXNzZWQgZGlyZWN0bHkgdG8gZ2l0LWRpZmYtdHJlZSBzZWUKKwlnaXQtZGlmZi10cmVlKDEpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJcmVwby1jb25maWcga2V5OiBzdm4ubAorCXJlcG8tY29uZmlnIGtleTogc3ZuLmZpbmRjb3BpZXNoYXJkZXIKKworLUE8ZmlsZW5hbWU+OjoKKy0tYXV0aG9ycy1maWxlPTxmaWxlbmFtZT46OgorCisJU3ludGF4IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZmlsZXMgdXNlZCBieSBnaXQtc3ZuaW1wb3J0IGFuZAorCWdpdC1jdnNpbXBvcnQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9naW5uYW1lID0gSm9lIFVzZXIgPHVzZXJAZXhhbXBsZS5jb20+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUlmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCBhbmQgZ2l0LXN2biBlbmNvdW50ZXJzIGFuIFNWTgorCWNvbW1pdHRlciBuYW1lIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGF1dGhvcnMtZmlsZSwgZ2l0LXN2bgorCXdpbGwgYWJvcnQgb3BlcmF0aW9uLiBUaGUgdXNlciB3aWxsIHRoZW4gaGF2ZSB0byBhZGQgdGhlCisJYXBwcm9wcmlhdGUgZW50cnkuICBSZS1ydW5uaW5nIHRoZSBwcmV2aW91cyBnaXQtc3ZuIGNvbW1hbmQKKwlhZnRlciB0aGUgYXV0aG9ycy1maWxlIGlzIG1vZGlmaWVkIHNob3VsZCBjb250aW51ZSBvcGVyYXRpb24uCisKKwlyZXBvLWNvbmZpZyBrZXk6IHN2bi5hdXRob3JzLWZpbGUKKworQURWQU5DRUQgT1BUSU9OUworLS0tLS0tLS0tLS0tLS0tLQorLWI8cmVmbmFtZT46OgorLS1icmFuY2ggPHJlZm5hbWU+OjoKKwlVc2VkIHdpdGggJ2ZldGNoJyBvciAnY29tbWl0Jy4KKworCVRoaXMgY2FuIGJlIHVzZWQgdG8gam9pbiBhcmJpdHJhcnkgZ2l0IGJyYW5jaGVzIHRvIHJlbW90ZXMvZ2l0LXN2bgorCW9uIG5ldyBjb21taXRzIHdoZXJlIHRoZSB0cmVlIG9iamVjdCBpcyBlcXVpdmFsZW50LgorCisJV2hlbiB1c2VkIHdpdGggZGlmZmVyZW50IEdJVF9TVk5fSUQgdmFsdWVzLCB0YWdzIGFuZCBicmFuY2hlcyBpbgorCVNWTiBjYW4gYmUgdHJhY2tlZCB0aGlzIHdheSwgYXMgY2FuIHNvbWUgbWVyZ2VzIHdoZXJlIHRoZSBoZWFkcworCWVuZCB1cCBoYXZpbmcgY29tcGxldGVseSBlcXVpdmFsZW50IGNvbnRlbnQuICBUaGlzIGNhbiBldmVuIGJlCisJdXNlZCB0byB0cmFjayBicmFuY2hlcyBhY3Jvc3MgbXVsdGlwbGUgU1ZOIF9yZXBvc2l0b3JpZXNfLgorCisJVGhpcyBvcHRpb24gbWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaAorCWJyYW5jaC4KKworCXJlcG8tY29uZmlnIGtleTogc3ZuLmJyYW5jaAorCistaTxHSVRfU1ZOX0lEPjo6CistLWlkIDxHSVRfU1ZOX0lEPjo6CisJVGhpcyBzZXRzIEdJVF9TVk5fSUQgKGluc3RlYWQgb2YgdXNpbmcgdGhlIGVudmlyb25tZW50KS4gIFNlZQorCXRoZSBzZWN0aW9uIG9uICJUcmFja2luZyBNdWx0aXBsZSBSZXBvc2l0b3JpZXMgb3IgQnJhbmNoZXMiIGZvcgorCW1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgR0lUX1NWTl9JRC4KKworQ09NUEFUSUJJTElUWSBPUFRJT05TCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tdXBncmFkZTo6CisJT25seSB1c2VkIHdpdGggdGhlICdyZWJ1aWxkJyBjb21tYW5kLgorCisJUnVuIHRoaXMgaWYgeW91IHVzZWQgYW4gb2xkIHZlcnNpb24gb2YgZ2l0LXN2biB0aGF0IHVzZWQKKwkiZ2l0LXN2bi1IRUFEIiBpbnN0ZWFkIG9mICJyZW1vdGVzL2dpdC1zdm4iIGFzIHRoZSBicmFuY2gKKwlmb3IgdHJhY2tpbmcgdGhlIHJlbW90ZS4KKworLS1uby1pZ25vcmUtZXh0ZXJuYWxzOjoKKwlPbmx5IHVzZWQgd2l0aCB0aGUgJ2ZldGNoJyBhbmQgJ3JlYnVpbGQnIGNvbW1hbmQuCisKKwlCeSBkZWZhdWx0LCBnaXQtc3ZuIHBhc3NlcyAtLWlnbm9yZS1leHRlcm5hbHMgdG8gc3ZuIHRvIGF2b2lkCisJZmV0Y2hpbmcgc3ZuOmV4dGVybmFsIHRyZWVzIGludG8gZ2l0LiAgUGFzcyB0aGlzIGZsYWcgdG8gZW5hYmxlCisJZXh0ZXJuYWxzIHRyYWNraW5nIGRpcmVjdGx5IHZpYSBnaXQuCisKKwlWZXJzaW9ucyBvZiBzdm4gdGhhdCBkbyBub3Qgc3VwcG9ydCAtLWlnbm9yZS1leHRlcm5hbHMgYXJlCisJYXV0b21hdGljYWxseSBkZXRlY3RlZCBhbmQgdGhpcyBmbGFnIHdpbGwgYmUgYXV0b21hdGljYWxseQorCWVuYWJsZWQgZm9yIHRoZW0uCisKKwlPdGhlcndpc2UsIGRvIG5vdCBlbmFibGUgdGhpcyBmbGFnIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZQorCWRvaW5nLgorCisJcmVwby1jb25maWcga2V5OiBzdm4ubm9pZ25vcmVleHRlcm5hbHMKKworQmFzaWMgRXhhbXBsZXMKK35+fn5+fn5+fn5+fn5+CisKK1RyYWNraW5nIGFuZCBjb250cmlidXRpbmcgdG8gYW4gU3VidmVyc2lvbiBtYW5hZ2VkLXByb2plY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbml0aWFsaXplIGEgdHJlZSAobGlrZSBnaXQgaW5pdC1kYik6CisJZ2l0LXN2biBpbml0IGh0dHA6Ly9zdm4uZm9vLm9yZy9wcm9qZWN0L3RydW5rCisjIEZldGNoIHJlbW90ZSByZXZpc2lvbnM6CisJZ2l0LXN2biBmZXRjaAorIyBDcmVhdGUgeW91ciBvd24gYnJhbmNoIHRvIGhhY2sgb246CisJZ2l0IGNoZWNrb3V0IC1iIG15LWJyYW5jaCByZW1vdGVzL2dpdC1zdm4KKyMgQ29tbWl0IG9ubHkgdGhlIGdpdCBjb21taXRzIHlvdSB3YW50IHRvIFNWTjoKKwlnaXQtc3ZuIGNvbW1pdCA8dHJlZS1pc2g+IFs8dHJlZS1pc2hfMj4gLi4uXQorIyBDb21taXQgYWxsIHRoZSBnaXQgY29tbWl0cyBmcm9tIG15LWJyYW5jaCB0aGF0IGRvbid0IGV4aXN0IGluIFNWTjoKKwlnaXQtc3ZuIGNvbW1pdCByZW1vdGVzL2dpdC1zdm4uLm15LWJyYW5jaAorIyBTb21ldGhpbmcgaXMgY29tbWl0dGVkIHRvIFNWTiwgcHVsbCB0aGUgbGF0ZXN0IGludG8geW91ciBicmFuY2g6CisJZ2l0LXN2biBmZXRjaCAmJiBnaXQgcHVsbCAuIHJlbW90ZXMvZ2l0LXN2bgorIyBBcHBlbmQgc3ZuOmlnbm9yZSBzZXR0aW5ncyB0byB0aGUgZGVmYXVsdCBnaXQgZXhjbHVkZSBmaWxlOgorCWdpdC1zdm4gc2hvdy1pZ25vcmUgPj4gLmdpdC9pbmZvL2V4Y2x1ZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitERVNJR04gUEhJTE9TT1BIWQorLS0tLS0tLS0tLS0tLS0tLS0KK01lcmdlIHRyYWNraW5nIGluIFN1YnZlcnNpb24gaXMgbGFja2luZyBhbmQgZG9pbmcgYnJhbmNoZWQgZGV2ZWxvcG1lbnQKK3dpdGggU3VidmVyc2lvbiBpcyBjdW1iZXJzb21lIGFzIGEgcmVzdWx0LiAgZ2l0LXN2biBjb21wbGV0ZWx5IGZvcmdvZXMKK2FueSBhdXRvbWF0ZWQgbWVyZ2UvYnJhbmNoIHRyYWNraW5nIG9uIHRoZSBTdWJ2ZXJzaW9uIHNpZGUgYW5kIGxlYXZlcyBpdAorZW50aXJlbHkgdXAgdG8gdGhlIHVzZXIgb24gdGhlIGdpdCBzaWRlLiAgSXQncyBzaW1wbHkgbm90IHdvcnRoIGl0IHRvIGRvCithIHVzZWZ1bCB0cmFuc2xhdGlvbiB3aGVuIHRoZSB0aGUgb3JpZ2luYWwgc2lnbmFsIGlzIHdlYWsuCisKK1RSQUNLSU5HIE1VTFRJUExFIFJFUE9TSVRPUklFUyBPUiBCUkFOQ0hFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGlzIGZvciBhZHZhbmNlZCB1c2VycywgbW9zdCB1c2VycyBzaG91bGQgaWdub3JlIHRoaXMgc2VjdGlvbi4KKworQmVjYXVzZSBnaXQtc3ZuIGRvZXMgbm90IGNhcmUgYWJvdXQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRpZmZlcmVudAorYnJhbmNoZXMgb3IgZGlyZWN0b3JpZXMgaW4gYSBTdWJ2ZXJzaW9uIHJlcG9zaXRvcnksIGdpdC1zdm4gaGFzIGEgc2ltcGxlCitoYWNrIHRvIGFsbG93IGl0IHRvIHRyYWNrIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcmVsYXRlZCBfb3JfIHVucmVsYXRlZAorU1ZOIHJlcG9zaXRvcmllcyB2aWEgb25lIGdpdCByZXBvc2l0b3J5LiAgU2ltcGx5IHNldCB0aGUgR0lUX1NWTl9JRAorZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSBuYW1lIG90aGVyIG90aGVyIHRoYW4gImdpdC1zdm4iICh0aGUgZGVmYXVsdCkKK2FuZCBnaXQtc3ZuIHdpbGwgaWdub3JlIHRoZSBjb250ZW50cyBvZiB0aGUgJEdJVF9ESVIvZ2l0LXN2biBkaXJlY3RvcnkKK2FuZCBpbnN0ZWFkIGRvIGFsbCBvZiBpdHMgd29yayBpbiAkR0lUX0RJUi8kR0lUX1NWTl9JRCBmb3IgdGhhdAoraW52b2NhdGlvbi4gIFRoZSBpbnRlcmZhY2UgYnJhbmNoIHdpbGwgYmUgcmVtb3Rlcy8kR0lUX1NWTl9JRCwgaW5zdGVhZCBvZgorcmVtb3Rlcy9naXQtc3ZuLiAgQW55IHJlbW90ZXMvJEdJVF9TVk5fSUQgYnJhbmNoIHNob3VsZCBuZXZlciBiZSBtb2RpZmllZAorYnkgdGhlIHVzZXIgb3V0c2lkZSBvZiBnaXQtc3ZuIGNvbW1hbmRzLgorCitBRERJVElPTkFMIEZFVENIIEFSR1VNRU5UUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgaXMgZm9yIGFkdmFuY2VkIHVzZXJzLCBtb3N0IHVzZXJzIHNob3VsZCBpZ25vcmUgdGhpcyBzZWN0aW9uLgorCitVbmZldGNoZWQgU1ZOIHJldmlzaW9ucyBtYXkgYmUgaW1wb3J0ZWQgYXMgY2hpbGRyZW4gb2YgZXhpc3RpbmcgY29tbWl0cworYnkgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byAnZmV0Y2gnLiAgQWRkaXRpb25hbCBwYXJlbnRzIG1heQorb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvcm0gb2Ygc2hhMSBoZXggc3VtcyBhdCB0aGUKK2NvbW1hbmQtbGluZS4gIFVuZmV0Y2hlZCBTVk4gcmV2aXNpb25zIG1heSBhbHNvIGJlIHRpZWQgdG8gcGFydGljdWxhcgorZ2l0IGNvbW1pdHMgd2l0aCB0aGUgZm9sbG93aW5nIHN5bnRheDoKKworCXN2bl9yZXZpc2lvbl9udW1iZXI9Z2l0X2NvbW1pdF9zaGExCisKK1RoaXMgYWxsb3dzIHlvdSB0byB0aWUgdW5mZXRjaGVkIFNWTiByZXZpc2lvbiAzNzUgdG8geW91ciBjdXJyZW50IEhFQUQ6OgorCisJYGdpdC1zdm4gZmV0Y2ggMzc1PSQoZ2l0LXJldi1wYXJzZSBIRUFEKWAKKworQWR2YW5jZWQgRXhhbXBsZTogVHJhY2tpbmcgYSBSZW9yZ2FuaXplZCBSZXBvc2l0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0lmIHlvdSdyZSB0cmFja2luZyBhIGRpcmVjdG9yeSB0aGF0IGhhcyBtb3ZlZCwgb3Igb3RoZXJ3aXNlIGJlZW4KK2JyYW5jaGVkIG9yIHRhZ2dlZCBvZmYgb2YgYW5vdGhlciBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkgYW5kIHlvdQorY2FyZSBhYm91dCB0aGUgZnVsbCBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0LCB0aGVuIHlvdSBjYW4gcmVhZCB0aGlzCitzZWN0aW9uLgorCitUaGlzIGlzIGhvdyBZYW5uIERpcnNvbiB0cmFja2VkIHRoZSB0cnVuayBvZiB0aGUgdWZvYWkgZGlyZWN0b3J5IHdoZW4KK3RoZSAvdHJ1bmsgZGlyZWN0b3J5IG9mIGhpcyByZXBvc2l0b3J5IHdhcyBtb3ZlZCB0byAvdWZvYWkvdHJ1bmsgYW5kCitoZSBuZWVkZWQgdG8gY29udGludWUgdHJhY2tpbmcgL3Vmb2FpL3RydW5rIHdoZXJlIC90cnVuayBsZWZ0IG9mZi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJIyBUaGlzIGxvZyBtZXNzYWdlIHNob3dzIHdoZW4gdGhlIHJlcG9zaXRvcnkgd2FzIHJlb3JnYW5pemVkOgorCXIxNjYgfCB5ZGlyc29uIHwgMjAwNi0wMy0wMiAwMTozNjo1NSArMDEwMCAoVGh1LCAwMiBNYXIgMjAwNikgfCAxIGxpbmUKKwlDaGFuZ2VkIHBhdGhzOgorCSAgIEQgL3RydW5rCisJICAgQSAvdWZvYWkvdHJ1bmsgKGZyb20gL3RydW5rOjE2NSkKKworCSMgRmlyc3Qgd2Ugc3RhcnQgdHJhY2tpbmcgdGhlIG9sZCByZXZpc2lvbnM6CisJR0lUX1NWTl9JRD1naXQtb2xkc3ZuIGdpdC1zdm4gaW5pdCBcCisJCQlodHRwczovL3N2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC91Zm9haS90cnVuaworCUdJVF9TVk5fSUQ9Z2l0LW9sZHN2biBnaXQtc3ZuIGZldGNoIC1yMToxNjUKKworCSMgQW5kIG5vdywgd2UgY29udGludWUgdHJhY2tpbmcgdGhlIG5ldyByZXZpc2lvbnM6CisJR0lUX1NWTl9JRD1naXQtbmV3c3ZuIGdpdC1zdm4gaW5pdCBcCisJICAgICAgaHR0cHM6Ly9zdm4uc291cmNlZm9yZ2UubmV0L3N2bnJvb3QvdWZvYWkvdWZvYWkvdHJ1bmsKKwlHSVRfU1ZOX0lEPWdpdC1uZXdzdm4gZ2l0LXN2biBmZXRjaCBcCisJICAgICAgMTY2PWBnaXQtcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy9naXQtb2xkc3ZuYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JVR1MKKy0tLS0KK0lmIHNvbWVib2R5IGNvbW1pdHMgYSBjb25mbGljdGluZyBjaGFuZ2VzZXQgdG8gU1ZOIGF0IGEgYmFkIG1vbWVudAorKHJpZ2h0IGJlZm9yZSB5b3UgY29tbWl0KSBjYXVzaW5nIGEgY29uZmxpY3QgYW5kIHlvdXIgY29tbWl0IHRvIGZhaWwsCit5b3VyIHN2biB3b3JraW5nIHRyZWUgKCRHSVRfRElSL2dpdC1zdm4vdHJlZSkgbWF5IGJlIGRpcnRpZWQuICBUaGUKK2Vhc2llc3QgdGhpbmcgdG8gZG8gaXMgcHJvYmFibHkganVzdCB0byBybSAtcmYgJEdJVF9ESVIvZ2l0LXN2bi90cmVlIGFuZAorcnVuICdyZWJ1aWxkJy4KKworV2UgaWdub3JlIGFsbCBTVk4gcHJvcGVydGllcyBleGNlcHQgc3ZuOmV4ZWN1dGFibGUuICBUb28gZGlmZmljdWx0IHRvCittYXAgdGhlbSBzaW5jZSB3ZSByZWx5IGhlYXZpbHkgb24gZ2l0IHdyaXRlLXRyZWUgYmVpbmcgX2V4YWN0bHlfIHRoZQorc2FtZSBvbiBib3RoIHRoZSBTVk4gYW5kIGdpdCB3b3JraW5nIHRyZWVzIGFuZCBJIHByZWZlciBub3QgdG8gY2x1dHRlcgord29ya2luZyB0cmVlcyB3aXRoIG1ldGFkYXRhIGZpbGVzLgorCitzdm46a2V5d29yZHMgY2FuJ3QgYmUgaWdub3JlZCBpbiBTdWJ2ZXJzaW9uIChhdCBsZWFzdCBJIGRvbid0IGtub3cgb2YKK2Egd2F5IHRvIGlnbm9yZSB0aGVtKS4KKworUmVuYW1lZCBhbmQgY29waWVkIGRpcmVjdG9yaWVzIGFyZSBub3QgZGV0ZWN0ZWQgYnkgZ2l0IGFuZCBoZW5jZSBub3QKK3RyYWNrZWQgd2hlbiBjb21taXR0aW5nIHRvIFNWTi4gIEkgZG8gbm90IHBsYW4gb24gYWRkaW5nIHN1cHBvcnQgZm9yCit0aGlzIGFzIGl0J3MgcXVpdGUgZGlmZmljdWx0IGFuZCB0aW1lLWNvbnN1bWluZyB0byBnZXQgd29ya2luZyBmb3IgYWxsCit0aGUgcG9zc2libGUgY29ybmVyIGNhc2VzIChnaXQgZG9lc24ndCBkbyBpdCwgZWl0aGVyKS4gIFJlbmFtZWQgYW5kCitjb3BpZWQgZmlsZXMgYXJlIGZ1bGx5IHN1cHBvcnRlZCBpZiB0aGV5J3JlIHNpbWlsYXIgZW5vdWdoIGZvciBnaXQgdG8KK2RldGVjdCB0aGVtLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK1dyaXR0ZW4gYnkgRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+LgpkaWZmIC0tZ2l0IGEvY29udHJpYi9naXQtc3ZuL3QvbGliLWdpdC1zdm4uc2ggYi9jb250cmliL2dpdC1zdm4vdC9saWItZ2l0LXN2bi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOThlOWQxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9naXQtc3ZuL3QvbGliLWdpdC1zdm4uc2gKQEAgLTAsMCArMSwzOSBAQAorUEFUSD0kUFdELy4uLzokUEFUSAoraWYgdGVzdCAtZCAuLi8uLi8uLi90Cit0aGVuCisgICAgY2QgLi4vLi4vLi4vdAorZWxzZQorICAgIGVjaG8gIk11c3QgYmUgcnVuIGluIGNvbnRyaWIvZ2l0LXN2bi90IiA+JjIKKyAgICBleGl0IDEKK2ZpCisKKy4gLi90ZXN0LWxpYi5zaAorCitHSVRfRElSPSRQV0QvLmdpdAorR0lUX1NWTl9ESVI9JEdJVF9ESVIvZ2l0LXN2bgorU1ZOX1RSRUU9JEdJVF9TVk5fRElSL3RyZWUKKworc3ZuYWRtaW4gPi9kZXYvbnVsbCAyPiYxCitpZiB0ZXN0ICQ/ICE9IDEKK3RoZW4KKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzICdza2lwcGluZyBjb250cmliL2dpdC1zdm4gdGVzdCcgOgorICAgIHRlc3RfZG9uZQorICAgIGV4aXQKK2ZpCisKK3N2biA+L2Rldi9udWxsIDI+JjEKK2lmIHRlc3QgJD8gIT0gMQordGhlbgorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NraXBwaW5nIGNvbnRyaWIvZ2l0LXN2biB0ZXN0JyA6CisgICAgdGVzdF9kb25lCisgICAgZXhpdAorZmkKKworc3ZucmVwbz0kUFdEL3N2bnJlcG8KKworc2V0IC1lCisKK3N2bmFkbWluIGNyZWF0ZSAkc3ZucmVwbworc3ZucmVwbz0iZmlsZTovLyRzdm5yZXBvL3Rlc3QtZ2l0LXN2biIKKworCmRpZmYgLS1naXQgYS9jb250cmliL2dpdC1zdm4vdC90MDAwMC1jb250cmliLWdpdC1zdm4uc2ggYi9jb250cmliL2dpdC1zdm4vdC90MDAwMC1jb250cmliLWdpdC1zdm4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzYTBkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZ2l0LXN2bi90L3QwMDAwLWNvbnRyaWItZ2l0LXN2bi5zaApAQCAtMCwwICsxLDE3NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biB0ZXN0cycKKy4gLi9saWItZ2l0LXN2bi5zaAorCitta2RpciBpbXBvcnQKK2NkIGltcG9ydAorCitlY2hvIGZvbyA+IGZvbworbG4gLXMgZm9vIGZvby5saW5rCitta2RpciAtcCBkaXIvYS9iL2MvZC9lCitlY2hvICdkZWVwIGRpcicgPiBkaXIvYS9iL2MvZC9lL2ZpbGUKK21rZGlyIC1wIGJhcgorZWNobyAnenp6JyA+IGJhci96enoKK2VjaG8gJyMhL2Jpbi9zaCcgPiBleGVjLnNoCitjaG1vZCAreCBleGVjLnNoCitzdm4gaW1wb3J0IC1tICdpbXBvcnQgZm9yIGdpdC1zdm4nIC4gIiRzdm5yZXBvIiA+L2Rldi9udWxsCisKK2NkIC4uCitybSAtcmYgaW1wb3J0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbml0aWFsaXplIGdpdC1zdm4nIFwKKyAgICAiZ2l0LXN2biBpbml0ICRzdm5yZXBvIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW1wb3J0IGFuIFNWTiByZXZpc2lvbiBpbnRvIGdpdCcgXAorICAgICdnaXQtc3ZuIGZldGNoJworCisKK25hbWU9J3RyeSBhIGRlZXAgLS1ybWRpciB3aXRoIGEgY29tbWl0JworZ2l0IGNoZWNrb3V0IC1iIG15YnJhbmNoIHJlbW90ZXMvZ2l0LXN2bgorbXYgZGlyL2EvYi9jL2QvZS9maWxlIGRpci9maWxlCitjcCBkaXIvZmlsZSBmaWxlCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGRpci9hL2IvYy9kL2UvZmlsZSBkaXIvZmlsZSBmaWxlCitnaXQgY29tbWl0IC1tICIkbmFtZSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiIFwKKyAgICAiZ2l0LXN2biBjb21taXQgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciByZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoICYmCisgICAgIHRlc3QgLWQgJFNWTl9UUkVFL2RpciAmJiB0ZXN0ICEgLWQgJFNWTl9UUkVFL2Rpci9hIgorCisKK25hbWU9J2RldGVjdCBub2RlIGNoYW5nZSBmcm9tIGZpbGUgdG8gZGlyZWN0b3J5ICMxJworbWtkaXIgZGlyL25ld19maWxlCittdiBkaXIvZmlsZSBkaXIvbmV3X2ZpbGUvZmlsZQorbXYgZGlyL25ld19maWxlIGRpci9maWxlCitnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIGRpci9maWxlCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGRpci9maWxlL2ZpbGUKK2dpdCBjb21taXQgLW0gIiRuYW1lIgorCit0ZXN0X2V4cGVjdF9jb2RlIDEgIiRuYW1lIiBcCisgICAgJ2dpdC1zdm4gY29tbWl0IC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaCcgXAorICAgIHx8IHRydWUKKworCituYW1lPSdkZXRlY3Qgbm9kZSBjaGFuZ2UgZnJvbSBkaXJlY3RvcnkgdG8gZmlsZSAjMScKK3JtIC1yZiBkaXIgJEdJVF9ESVIvaW5kZXgKK2dpdCBjaGVja291dCAtYiBteWJyYW5jaDIgcmVtb3Rlcy9naXQtc3ZuCittdiBiYXIvenp6IHp6egorcm0gLXJmIGJhcgorbXYgenp6IGJhcgorZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLSBiYXIvenp6CitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tIGJhcgorZ2l0IGNvbW1pdCAtbSAiJG5hbWUiCisKK3Rlc3RfZXhwZWN0X2NvZGUgMSAiJG5hbWUiIFwKKyAgICAnZ2l0LXN2biBjb21taXQgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciByZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoMicgXAorICAgIHx8IHRydWUKKworCituYW1lPSdkZXRlY3Qgbm9kZSBjaGFuZ2UgZnJvbSBmaWxlIHRvIGRpcmVjdG9yeSAjMicKK3JtIC1mICRHSVRfRElSL2luZGV4CitnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2gzIHJlbW90ZXMvZ2l0LXN2bgorcm0gYmFyL3p6egorZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSBiYXIvenp6Citta2RpciBiYXIvenp6CitlY2hvIHl5eSA+IGJhci96enoveXl5CitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJhci96enoveXl5CitnaXQgY29tbWl0IC1tICIkbmFtZSIKKwordGVzdF9leHBlY3RfY29kZSAxICIkbmFtZSIgXAorICAgICdnaXQtc3ZuIGNvbW1pdCAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIHJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2gzJyBcCisgICAgfHwgdHJ1ZQorCisKK25hbWU9J2RldGVjdCBub2RlIGNoYW5nZSBmcm9tIGRpcmVjdG9yeSB0byBmaWxlICMyJworcm0gLWYgJEdJVF9ESVIvaW5kZXgKK2dpdCBjaGVja291dCAtYiBteWJyYW5jaDQgcmVtb3Rlcy9naXQtc3ZuCitybSAtcmYgZGlyCitnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tIGRpci9maWxlCit0b3VjaCBkaXIKK2VjaG8gYXNkZiA+IGRpcgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLSBkaXIKK2dpdCBjb21taXQgLW0gIiRuYW1lIgorCit0ZXN0X2V4cGVjdF9jb2RlIDEgIiRuYW1lIiBcCisgICAgJ2dpdC1zdm4gY29tbWl0IC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDQnIFwKKyAgICB8fCB0cnVlCisKKworbmFtZT0ncmVtb3ZlIGV4ZWN1dGFibGUgYml0IGZyb20gYSBmaWxlJworcm0gLWYgJEdJVF9ESVIvaW5kZXgKK2dpdCBjaGVja291dCAtYiBteWJyYW5jaDUgcmVtb3Rlcy9naXQtc3ZuCitjaG1vZCAteCBleGVjLnNoCitnaXQgdXBkYXRlLWluZGV4IGV4ZWMuc2gKK2dpdCBjb21taXQgLW0gIiRuYW1lIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorICAgICJnaXQtc3ZuIGNvbW1pdCAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIHJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisgICAgIHRlc3QgISAteCAkU1ZOX1RSRUUvZXhlYy5zaCIKKworCituYW1lPSdhZGQgZXhlY3V0YWJsZSBiaXQgYmFjayBmaWxlJworY2htb2QgK3ggZXhlYy5zaAorZ2l0IHVwZGF0ZS1pbmRleCBleGVjLnNoCitnaXQgY29tbWl0IC1tICIkbmFtZSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiIFwKKyAgICAiZ2l0LXN2biBjb21taXQgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciByZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoNSAmJgorICAgICB0ZXN0IC14ICRTVk5fVFJFRS9leGVjLnNoIgorCisKKworbmFtZT0nZXhlY3V0YWJsZSBmaWxlIGJlY29tZXMgYSBzeW1saW5rIHRvIGJhci96enogKGZpbGUpJworcm0gZXhlYy5zaAorbG4gLXMgYmFyL3p6eiBleGVjLnNoCitnaXQgdXBkYXRlLWluZGV4IGV4ZWMuc2gKK2dpdCBjb21taXQgLW0gIiRuYW1lIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorICAgICJnaXQtc3ZuIGNvbW1pdCAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIHJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisgICAgIHRlc3QgLUwgJFNWTl9UUkVFL2V4ZWMuc2giCisKKworCituYW1lPSduZXcgc3ltbGluayBpcyBhZGRlZCB0byBhIGZpbGUgdGhhdCB3YXMgYWxzbyBqdXN0IG1hZGUgZXhlY3V0YWJsZScKK2NobW9kICt4IGJhci96enoKK2xuIC1zIGJhci96enogZXhlYy0yLnNoCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGJhci96enogZXhlYy0yLnNoCitnaXQgY29tbWl0IC1tICIkbmFtZSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiIFwKKyAgICAiZ2l0LXN2biBjb21taXQgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciByZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoNSAmJgorICAgICB0ZXN0IC14ICRTVk5fVFJFRS9iYXIvenp6ICYmCisgICAgIHRlc3QgLUwgJFNWTl9UUkVFL2V4ZWMtMi5zaCIKKworCisKK25hbWU9J21vZGlmeSBhIHN5bWxpbmsgdG8gYmVjb21lIGEgZmlsZScKK2dpdCBoZWxwID4gaGVscCB8fCB0cnVlCitybSBleGVjLTIuc2gKK2NwIGhlbHAgZXhlYy0yLnNoCitnaXQgdXBkYXRlLWluZGV4IGV4ZWMtMi5zaAorZ2l0IGNvbW1pdCAtbSAiJG5hbWUiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiBcCisgICAgImdpdC1zdm4gY29tbWl0IC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDUgJiYKKyAgICAgdGVzdCAtZiAkU1ZOX1RSRUUvZXhlYy0yLnNoICYmCisgICAgIHRlc3QgISAtTCAkU1ZOX1RSRUUvZXhlYy0yLnNoICYmCisgICAgIGRpZmYgLXUgaGVscCAkU1ZOX1RSRUUvZXhlYy0yLnNoIgorCisKKworbmFtZT0ndGVzdCBmZXRjaCBmdW5jdGlvbmFsaXR5IChzdm4gPT4gZ2l0KSB3aXRoIGFsdGVybmF0ZSBHSVRfU1ZOX0lEJworR0lUX1NWTl9JRD1hbHQKK2V4cG9ydCBHSVRfU1ZOX0lECit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorICAgICJnaXQtc3ZuIGluaXQgJHN2bnJlcG8gJiYgZ2l0LXN2biBmZXRjaCAmJgorICAgICBnaXQtcmV2LWxpc3QgLS1wcmV0dHk9cmF3IHJlbW90ZXMvZ2l0LXN2biB8IGdyZXAgXnRyZWUgfCB1bmlxID4gYSAmJgorICAgICBnaXQtcmV2LWxpc3QgLS1wcmV0dHk9cmF3IHJlbW90ZXMvYWx0IHwgZ3JlcCBedHJlZSB8IHVuaXEgPiBiICYmCisgICAgIGRpZmYgLXUgYSBiIgorCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9naXQtc3ZuL3QvdDAwMDEtY29udHJpYi1naXQtc3ZuLXByb3BzLnNoIGIvY29udHJpYi9naXQtc3ZuL3QvdDAwMDEtY29udHJpYi1naXQtc3ZuLXByb3BzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYTVhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2dpdC1zdm4vdC90MDAwMS1jb250cmliLWdpdC1zdm4tcHJvcHMuc2gKQEAgLTAsMCArMSwxMjYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gcHJvcGVydHkgdGVzdHMnCisuIC4vbGliLWdpdC1zdm4uc2gKKworbWtkaXIgaW1wb3J0CisKK2FfY3JsZj0KK2FfbGY9CithX2NyPQorYV9uZV9jcmxmPQorYV9uZV9sZj0KK2FfbmVfY3I9CithX2VtcHR5PQorYV9lbXB0eV9sZj0KK2FfZW1wdHlfY3I9CithX2VtcHR5X2NybGY9CisKK2NkIGltcG9ydAorCWNhdCA+PiBrdy5jIDw8XEVPRgorLyogTWFrZSBpdCBsb29rIGxpa2Ugc29tZWJvZHkgY29waWVkIGEgZmlsZSBmcm9tIENWUyBpbnRvIFNWTjogKi8KKy8qICRJZDoga3cuYyx2IDEuMS4xLjEgMTk5NC8wMy8wNiAwMDowMDowMCBlcmljIEV4cCAkICovCitFT0YKKworCXByaW50ZiAiSGVsbG9cclxuV29ybGRcclxuIiA+IGNybGYKKwlhX2NybGY9YGdpdC1oYXNoLW9iamVjdCAtdyBjcmxmYAorCXByaW50ZiAiSGVsbG9ccldvcmxkXHIiID4gY3IKKwlhX2NyPWBnaXQtaGFzaC1vYmplY3QgLXcgY3JgCisJcHJpbnRmICJIZWxsb1xuV29ybGRcbiIgPiBsZgorCWFfbGY9YGdpdC1oYXNoLW9iamVjdCAtdyBsZmAKKworCXByaW50ZiAiSGVsbG9cclxuV29ybGQiID4gbmVfY3JsZgorCWFfbmVfY3JsZj1gZ2l0LWhhc2gtb2JqZWN0IC13IG5lX2NybGZgCisJcHJpbnRmICJIZWxsb1xuV29ybGQiID4gbmVfbGYKKwlhX25lX2xmPWBnaXQtaGFzaC1vYmplY3QgLXcgbmVfbGZgCisJcHJpbnRmICJIZWxsb1xyV29ybGQiID4gbmVfY3IKKwlhX25lX2NyPWBnaXQtaGFzaC1vYmplY3QgLXcgbmVfY3JgCisKKwl0b3VjaCBlbXB0eQorCWFfZW1wdHk9YGdpdC1oYXNoLW9iamVjdCAtdyBlbXB0eWAKKwlwcmludGYgIlxuIiA+IGVtcHR5X2xmCisJYV9lbXB0eV9sZj1gZ2l0LWhhc2gtb2JqZWN0IC13IGVtcHR5X2xmYAorCXByaW50ZiAiXHIiID4gZW1wdHlfY3IKKwlhX2VtcHR5X2NyPWBnaXQtaGFzaC1vYmplY3QgLXcgZW1wdHlfY3JgCisJcHJpbnRmICJcclxuIiA+IGVtcHR5X2NybGYKKwlhX2VtcHR5X2NybGY9YGdpdC1oYXNoLW9iamVjdCAtdyBlbXB0eV9jcmxmYAorCisJc3ZuIGltcG9ydCAtbSAnaW1wb3J0IGZvciBnaXQtc3ZuJyAuICIkc3ZucmVwbyIgPi9kZXYvbnVsbAorY2QgLi4KKworcm0gLXJmIGltcG9ydAorc3ZuIGNvICIkc3ZucmVwbyIgdGVzdF93YworCitjZCB0ZXN0X3djCisJZWNobyAnR3JlZXRpbmdzJyA+PiBrdy5jCisJc3ZuIGNvbW1pdCAtbSAnTm90IHlldCBhbiAkSWQkJworCXN2biB1cAorCisJZWNobyAnSGVsbG8gd29ybGQnID4+IGt3LmMKKwlzdm4gY29tbWl0IC1tICdNb2RpZmllZCBmaWxlLCBidXQgc3RpbGwgbm90IHlldCBhbiAkSWQkJworCXN2biB1cAorCisJc3ZuIHByb3BzZXQgc3ZuOmtleXdvcmRzIElkIGt3LmMKKwlzdm4gY29tbWl0IC1tICdQcm9wc2V0ICRJZCQnCisJc3ZuIHVwCitjZCAuLgorCitnaXQtc3ZuIGluaXQgIiRzdm5yZXBvIgorZ2l0LXN2biBmZXRjaAorCitnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2ggcmVtb3Rlcy9naXQtc3ZuCitlY2hvICdIaSBhZ2FpbicgPj4ga3cuYworbmFtZT0ndGVzdCBzdm46a2V5d29yZHMgaWdub3JpbmcnCisKK2dpdCBjb21taXQgLWEgLW0gIiRuYW1lIgorZ2l0LXN2biBjb21taXQgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaAorZ2l0IHB1bGwgLiByZW1vdGVzL2dpdC1zdm4KKworZXhwZWN0PScvKiAkSWQkICovJworZ290PSJgc2VkIC1uZSAycCBrdy5jYCIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JhdyAkSWQkIGZvdW5kIGluIGt3LmMnICJ0ZXN0ICckZXhwZWN0JyA9ICckZ290JyIKKworY2QgdGVzdF93YworCXN2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1IgZW1wdHkKKwlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIGNybGYKKwlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIG5lX2NybGYKKwlzdm4gY29tbWl0IC1tICdwcm9wc2V0IENSIG9uIGNybGYgZmlsZXMnCisJc3ZuIHVwCitjZCAuLgorCitnaXQtc3ZuIGZldGNoCitnaXQgcHVsbCAuIHJlbW90ZXMvZ2l0LXN2bgorCitzdm4gY28gIiRzdm5yZXBvIiBuZXdfd2MKK2ZvciBpIGluIGNybGYgbmVfY3JsZiBsZiBuZV9sZiBjciBuZV9jciBlbXB0eV9jciBlbXB0eV9sZiBlbXB0eSBlbXB0eV9jcmxmCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIkNvbXBhcmluZyAkaSIgImNtcCAkaSBuZXdfd2MvJGkiCitkb25lCisKKworY2QgdGVzdF93YworCXByaW50ZiAnJElkJFxySGVsbG9ccldvcmxkXHInID4gY3IKKwlwcmludGYgJyRJZCRcckhlbGxvXHJXb3JsZCcgPiBuZV9jcgorCWFfY3I9YHByaW50ZiAnJElkJFxyXG5IZWxsb1xyXG5Xb3JsZFxyXG4nIHwgZ2l0LWhhc2gtb2JqZWN0IC0tc3RkaW5gCisJYV9uZV9jcj1gcHJpbnRmICckSWQkXHJcbkhlbGxvXHJcbldvcmxkJyB8IGdpdC1oYXNoLW9iamVjdCAtLXN0ZGluYAorCXN2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1JMRiBjcgorCXN2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1JMRiBuZV9jcgorCXN2biBwcm9wc2V0IHN2bjprZXl3b3JkcyBJZCBjcgorCXN2biBwcm9wc2V0IHN2bjprZXl3b3JkcyBJZCBuZV9jcgorCXN2biBjb21taXQgLW0gJ3Byb3BzZXQgQ1JMRiBvbiBjciBmaWxlcycKKwlzdm4gdXAKK2NkIC4uCisKK2dpdC1zdm4gZmV0Y2gKK2dpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuCisKK2JfY3I9ImBnaXQtaGFzaC1vYmplY3QgY3JgIgorYl9uZV9jcj0iYGdpdC1oYXNoLW9iamVjdCBuZV9jcmAiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NSTEYgKyAkSWQkJyAidGVzdCAnJGFfY3InID0gJyRiX2NyJyIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NSTEYgKyAkSWQkIChubyBuZXdsaW5lKScgInRlc3QgJyRhX25lX2NyJyA9ICckYl9uZV9jciciCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9naXR2aWV3L2dpdHZpZXcgYi9jb250cmliL2dpdHZpZXcvZ2l0dmlldwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYjZiZGNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9naXR2aWV3L2dpdHZpZXcKQEAgLTAsMCArMSwxMDI5IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIiIiIGdpdHZpZXcKK0dVSSBicm93c2VyIGZvciBnaXQgcmVwb3NpdG9yeQorVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIGJ6cmsgYnkgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAdWJ1bnR1LmNvbT4KKyIiIgorX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgKEMpIDIwMDYgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4iCitfX2F1dGhvcl9fICAgID0gIkFuZWVzaCBLdW1hciBLLlYgPGFuZWVzaC5rdW1hckBocC5jb20+IgorCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGd0aworaW1wb3J0IHB5Z3RrCitpbXBvcnQgcGFuZ28KK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgY2Fpcm8KK2ltcG9ydCBtYXRoCitpbXBvcnQgc3RyaW5nCisKK3RyeToKKyAgICBpbXBvcnQgZ3Rrc291cmNldmlldworICAgIGhhdmVfZ3Rrc291cmNldmlldyA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBoYXZlX2d0a3NvdXJjZXZpZXcgPSBGYWxzZQorICAgIHByaW50ICJSdW5uaW5nIHdpdGhvdXQgZ3Rrc291cmNldmlldyBtb2R1bGUiCisKK3JlX2lkZW50ID0gcmUuY29tcGlsZSgnKGF1dGhvcnxjb21taXR0ZXIpICg/UDxpZGVudD4uKikgKD9QPGVwb2NoPlxkKykgKD9QPHR6PlsrLV1cZHs0fSknKQorCitkZWYgbGlzdF90b19zdHJpbmcoYXJncywgc2tpcCk6CisJY291bnQgPSBsZW4oYXJncykKKwlpID0gc2tpcAorCXN0cl9hcmc9IiAiCisJd2hpbGUgKGkgPCBjb3VudCApOgorCQlzdHJfYXJnID0gc3RyX2FyZyArIGFyZ3NbaV0KKwkJc3RyX2FyZyA9IHN0cl9hcmcgKyAiICIKKwkJaSA9IGkrMQorCisJcmV0dXJuIHN0cl9hcmcKKworZGVmIHNob3dfZGF0ZShlcG9jaCwgdHopOgorCXNlY3MgPSBmbG9hdChlcG9jaCkKKwl0enNlY3MgPSBmbG9hdCh0elsxOjNdKSAqIDM2MDAKKwl0enNlY3MgKz0gZmxvYXQodHpbMzo1XSkgKiA2MAorCWlmICh0elswXSA9PSAiKyIpOgorCQlzZWNzICs9IHR6c2VjcworCWVsc2U6CisJCXNlY3MgLT0gdHpzZWNzCisKKwlyZXR1cm4gdGltZS5zdHJmdGltZSgiJVktJW0tJWQgJUg6JU06JVMiLCB0aW1lLmdtdGltZShzZWNzKSkKKworCitjbGFzcyBDZWxsUmVuZGVyZXJHcmFwaChndGsuR2VuZXJpY0NlbGxSZW5kZXJlcik6CisJIiIiQ2VsbCByZW5kZXJlciBmb3IgZGlyZWN0ZWQgZ3JhcGguCisKKwlUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBjdXN0b20gR3RrQ2VsbFJlbmRlcmVyIHRoYXQKKwlkcmF3cyBwYXJ0IG9mIHRoZSBkaXJlY3RlZCBncmFwaCBiYXNlZCBvbiB0aGUgbGluZXMgc3VnZ2VzdGVkIGJ5IHRoZSBjb2RlCisJaW4gZ3JhcGgucHkuCisKKwlCZWNhdXNlIHdlJ3JlIHNoaW55LCB3ZSB1c2UgQ2Fpcm8gdG8gZG8gdGhpcywgYW5kIGJlY2F1c2Ugd2UncmUgbmF1Z2h0eQorCXdlIGNoZWF0IGFuZCBkcmF3IG92ZXIgdGhlIGJpdHMgb2YgdGhlIFRyZWVWaWV3Q29sdW1uIHRoYXQgYXJlIHN1cHBvc2VkIHRvCisJanVzdCBiZSBmb3IgdGhlIGJhY2tncm91bmQuCisKKwlQcm9wZXJ0aWVzOgorCW5vZGUgICAgICAgICAgICAgIChjb2x1bW4sIGNvbG91ciwgWyBuYW1lcyBdKSB0dXBsZSB0byBkcmF3IHJldmlzaW9uIG5vZGUsCisJaW5fbGluZXMgICAgICAgICAgKHN0YXJ0LCBlbmQsIGNvbG91cikgdHVwbGUgbGlzdCB0byBkcmF3IGlud2FyZCBsaW5lcywKKwlvdXRfbGluZXMgICAgICAgICAoc3RhcnQsIGVuZCwgY29sb3VyKSB0dXBsZSBsaXN0IHRvIGRyYXcgb3V0d2FyZCBsaW5lcy4KKwkiIiIKKworCV9fZ3Byb3BlcnRpZXNfXyA9IHsKKwkibm9kZSI6ICAgICAgICAgKCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsICJub2RlIiwKKwkJCSAgInJldmlzaW9uIG5vZGUgaW5zdHJ1Y3Rpb24iLAorCQkJICBnb2JqZWN0LlBBUkFNX1dSSVRBQkxFCisJCQkpLAorCSJpbi1saW5lcyI6ICAgICAoIGdvYmplY3QuVFlQRV9QWU9CSkVDVCwgImluLWxpbmVzIiwKKwkJCSAgImluc3RydWN0aW9ucyB0byBkcmF3IGxpbmVzIGludG8gdGhlIGNlbGwiLAorCQkJICBnb2JqZWN0LlBBUkFNX1dSSVRBQkxFCisJCQkpLAorCSJvdXQtbGluZXMiOiAgICAoIGdvYmplY3QuVFlQRV9QWU9CSkVDVCwgIm91dC1saW5lcyIsCisJCQkgICJpbnN0cnVjdGlvbnMgdG8gZHJhdyBsaW5lcyBvdXQgb2YgdGhlIGNlbGwiLAorCQkJICBnb2JqZWN0LlBBUkFNX1dSSVRBQkxFCisJCQkpLAorCX0KKworCWRlZiBkb19zZXRfcHJvcGVydHkoc2VsZiwgcHJvcGVydHksIHZhbHVlKToKKwkJIiIiU2V0IHByb3BlcnRpZXMgZnJvbSBHT2JqZWN0IHByb3BlcnRpZXMuIiIiCisJCWlmIHByb3BlcnR5Lm5hbWUgPT0gIm5vZGUiOgorCQkJc2VsZi5ub2RlID0gdmFsdWUKKwkJZWxpZiBwcm9wZXJ0eS5uYW1lID09ICJpbi1saW5lcyI6CisJCQlzZWxmLmluX2xpbmVzID0gdmFsdWUKKwkJZWxpZiBwcm9wZXJ0eS5uYW1lID09ICJvdXQtbGluZXMiOgorCQkJc2VsZi5vdXRfbGluZXMgPSB2YWx1ZQorCQllbHNlOgorCQkJcmFpc2UgQXR0cmlidXRlRXJyb3IsICJubyBzdWNoIHByb3BlcnR5OiAnJXMnIiAlIHByb3BlcnR5Lm5hbWUKKworCWRlZiBib3hfc2l6ZShzZWxmLCB3aWRnZXQpOgorCQkiIiJDYWxjdWxhdGUgYm94IHNpemUgYmFzZWQgb24gd2lkZ2V0J3MgZm9udC4KKworCQlDYWNoZSB0aGlzIGFzIGl0J3MgcHJvYmFibHkgZXhwZW5zaXZlIHRvIGdldC4gIEl0IGVuc3VyZXMgdGhhdCB3ZQorCQlkcmF3IHRoZSBncmFwaCBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgdGV4dC4KKwkJIiIiCisJCXRyeToKKwkJCXJldHVybiBzZWxmLl9ib3hfc2l6ZQorCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6CisJCQlwYW5nb19jdHggPSB3aWRnZXQuZ2V0X3BhbmdvX2NvbnRleHQoKQorCQkJZm9udF9kZXNjID0gd2lkZ2V0LmdldF9zdHlsZSgpLmZvbnRfZGVzYworCQkJbWV0cmljcyA9IHBhbmdvX2N0eC5nZXRfbWV0cmljcyhmb250X2Rlc2MpCisKKwkJCWFzY2VudCA9IHBhbmdvLlBJWEVMUyhtZXRyaWNzLmdldF9hc2NlbnQoKSkKKwkJCWRlc2NlbnQgPSBwYW5nby5QSVhFTFMobWV0cmljcy5nZXRfZGVzY2VudCgpKQorCisJCQlzZWxmLl9ib3hfc2l6ZSA9IGFzY2VudCArIGRlc2NlbnQgKyA2CisJCQlyZXR1cm4gc2VsZi5fYm94X3NpemUKKworCWRlZiBzZXRfY29sb3VyKHNlbGYsIGN0eCwgY29sb3VyLCBiZywgZmcpOgorCQkiIiJTZXQgdGhlIGNvbnRleHQgc291cmNlIGNvbG91ci4KKworCQlQaWNrcyBhIGRpc3RpbmN0IGNvbG91ciBiYXNlZCBvbiBhbiBpbnRlcm5hbCB3aGVlbDsgdGhlIGJnCisJCXBhcmFtZXRlciBwcm92aWRlcyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlICd6ZXJvJworCQljb2xvdXJzIGFuZCB0aGUgZmcgcGFyYW1ldGVyIHByb3ZpZGVzIHRoZSBtdWx0aXBsaWVyIHRoYXQgc2hvdWxkIGJlCisJCWFwcGxpZWQgdG8gdGhlIGZvcmVncm91bmQgY29sb3Vycy4KKwkJIiIiCisJCWNvbG91cnMgPSBbCisJCSAgICAoIDEuMCwgMC4wLCAwLjAgKSwKKwkJICAgICggMS4wLCAxLjAsIDAuMCApLAorCQkgICAgKCAwLjAsIDEuMCwgMC4wICksCisJCSAgICAoIDAuMCwgMS4wLCAxLjAgKSwKKwkJICAgICggMC4wLCAwLjAsIDEuMCApLAorCQkgICAgKCAxLjAsIDAuMCwgMS4wICksCisJCSAgICBdCisKKwkJY29sb3VyICU9IGxlbihjb2xvdXJzKQorCQlyZWQgICA9IChjb2xvdXJzW2NvbG91cl1bMF0gKiBmZykgb3IgYmcKKwkJZ3JlZW4gPSAoY29sb3Vyc1tjb2xvdXJdWzFdICogZmcpIG9yIGJnCisJCWJsdWUgID0gKGNvbG91cnNbY29sb3VyXVsyXSAqIGZnKSBvciBiZworCisJCWN0eC5zZXRfc291cmNlX3JnYihyZWQsIGdyZWVuLCBibHVlKQorCisJZGVmIG9uX2dldF9zaXplKHNlbGYsIHdpZGdldCwgY2VsbF9hcmVhKToKKwkJIiIiUmV0dXJuIHRoZSBzaXplIHdlIG5lZWQgZm9yIHRoaXMgY2VsbC4KKworCQlFYWNoIGNlbGwgaXMgZHJhd24gaW5kaXZpZHVhbGx5IGFuZCBpcyBvbmx5IGFzIHdpZGUgYXMgaXQgbmVlZHMKKwkJdG8gYmUsIHdlIGxldCB0aGUgVHJlZVZpZXdDb2x1bW4gdGFrZSBjYXJlIG9mIG1ha2luZyB0aGVtIGFsbAorCQlsaW5lIHVwLgorCQkiIiIKKwkJYm94X3NpemUgPSBzZWxmLmJveF9zaXplKHdpZGdldCkKKworCQljb2xzID0gc2VsZi5ub2RlWzBdCisJCWZvciBzdGFydCwgZW5kLCBjb2xvdXIgaW4gc2VsZi5pbl9saW5lcyArIHNlbGYub3V0X2xpbmVzOgorCQkJY29scyA9IGludChtYXgoY29scywgc3RhcnQsIGVuZCkpCisKKwkJKGNvbHVtbiwgY29sb3VyLCBuYW1lcykgPSBzZWxmLm5vZGUKKwkJbmFtZXNfbGVuID0gMAorCQlpZiAobGVuKG5hbWVzKSAhPSAwKToKKwkJCWZvciBpdGVtIGluIG5hbWVzOgorCQkJCW5hbWVzX2xlbiArPSBsZW4oaXRlbSkKKworCQl3aWR0aCA9IGJveF9zaXplICogKGNvbHMgKyAxICkgKyBuYW1lc19sZW4KKwkJaGVpZ2h0ID0gYm94X3NpemUKKworCQkjIEZJWE1FIEkgaGF2ZSBubyBpZGVhIGhvdyB0byB1c2UgY2VsbF9hcmVhIHByb3Blcmx5CisJCXJldHVybiAoMCwgMCwgd2lkdGgsIGhlaWdodCkKKworCWRlZiBvbl9yZW5kZXIoc2VsZiwgd2luZG93LCB3aWRnZXQsIGJnX2FyZWEsIGNlbGxfYXJlYSwgZXhwX2FyZWEsIGZsYWdzKToKKwkJIiIiUmVuZGVyIGFuIGluZGl2aWR1YWwgY2VsbC4KKworCQlEcmF3cyB0aGUgY2VsbCBjb250ZW50cyB1c2luZyBjYWlybywgdGFraW5nIGNhcmUgdG8gY2xpcCB3aGF0IHdlCisJCWRvIHRvIHdpdGhpbiB0aGUgYmFja2dyb3VuZCBhcmVhIHNvIHdlIGRvbid0IGRyYXcgb3ZlciBvdGhlciBjZWxscy4KKwkJTm90ZSB0aGF0IHdlJ3JlIGEgYml0IG5hdWdodHkgdGhlcmUgYW5kIHNob3VsZCByZWFsbHkgYmUgZHJhd2luZworCQlpbiB0aGUgY2VsbF9hcmVhIChvciBldmVuIHRoZSBleHBvc2VkIGFyZWEpLCBidXQgd2UgZXhwbGljaXRseSBkb24ndAorCQl3YW50IGFueSBndXR0ZXIuCisKKwkJV2UgdHJ5IGFuZCBiZSBhIGxpdHRsZSBjbGV2ZXIsIGlmIHRoZSBsaW5lIHdlIG5lZWQgdG8gZHJhdyBpcyBnb2luZworCQl0byBjcm9zcyBvdGhlciBjb2x1bW5zIHdlIGFjdHVhbGx5IGRyYXcgaXQgYXMgaW4gdGhlIC4tLS0nIHN0eWxlCisJCWluc3RlYWQgb2YgYSBwdXJlIGRpYWdvbmFsIC4uLiB0aGlzIHJlZHVjZXMgY29uZnVzaW9uIGJ5IGFuCisJCWluY3JlZGlibGUgYW1vdW50LgorCQkiIiIKKwkJY3R4ID0gd2luZG93LmNhaXJvX2NyZWF0ZSgpCisJCWN0eC5yZWN0YW5nbGUoYmdfYXJlYS54LCBiZ19hcmVhLnksIGJnX2FyZWEud2lkdGgsIGJnX2FyZWEuaGVpZ2h0KQorCQljdHguY2xpcCgpCisKKwkJYm94X3NpemUgPSBzZWxmLmJveF9zaXplKHdpZGdldCkKKworCQljdHguc2V0X2xpbmVfd2lkdGgoYm94X3NpemUgLyA4KQorCQljdHguc2V0X2xpbmVfY2FwKGNhaXJvLkxJTkVfQ0FQX1NRVUFSRSkKKworCQkjIERyYXcgbGluZXMgaW50byB0aGUgY2VsbAorCQlmb3Igc3RhcnQsIGVuZCwgY29sb3VyIGluIHNlbGYuaW5fbGluZXM6CisJCQljdHgubW92ZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQgKyBib3hfc2l6ZSAvIDIsCisJCQkJCWJnX2FyZWEueSAtIGJnX2FyZWEuaGVpZ2h0IC8gMikKKworCQkJaWYgc3RhcnQgLSBlbmQgPiAxOgorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCwgYmdfYXJlYS55KQorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQgKyBib3hfc2l6ZSwgYmdfYXJlYS55KQorCQkJZWxpZiBzdGFydCAtIGVuZCA8IC0xOgorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCArIGJveF9zaXplLAorCQkJCQkJYmdfYXJlYS55KQorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQsIGJnX2FyZWEueSkKKworCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGVuZCArIGJveF9zaXplIC8gMiwKKwkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQgLyAyKQorCisJCQlzZWxmLnNldF9jb2xvdXIoY3R4LCBjb2xvdXIsIDAuMCwgMC42NSkKKwkJCWN0eC5zdHJva2UoKQorCisJCSMgRHJhdyBsaW5lcyBvdXQgb2YgdGhlIGNlbGwKKwkJZm9yIHN0YXJ0LCBlbmQsIGNvbG91ciBpbiBzZWxmLm91dF9saW5lczoKKwkJCWN0eC5tb3ZlX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCArIGJveF9zaXplIC8gMiwKKwkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQgLyAyKQorCisJCQlpZiBzdGFydCAtIGVuZCA+IDE6CisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIHN0YXJ0LAorCQkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQpCisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGVuZCArIGJveF9zaXplLAorCQkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQpCisJCQllbGlmIHN0YXJ0IC0gZW5kIDwgLTE6CisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIHN0YXJ0ICsgYm94X3NpemUsCisJCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCkKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kLAorCQkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQpCisKKwkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQgKyBib3hfc2l6ZSAvIDIsCisJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0IC8gMiArIGJnX2FyZWEuaGVpZ2h0KQorCisJCQlzZWxmLnNldF9jb2xvdXIoY3R4LCBjb2xvdXIsIDAuMCwgMC42NSkKKwkJCWN0eC5zdHJva2UoKQorCisJCSMgRHJhdyB0aGUgcmV2aXNpb24gbm9kZSBpbiB0aGUgcmlnaHQgY29sdW1uCisJCShjb2x1bW4sIGNvbG91ciwgbmFtZXMpID0gc2VsZi5ub2RlCisJCWN0eC5hcmMoY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGNvbHVtbiArIGJveF9zaXplIC8gMiwKKwkJCQljZWxsX2FyZWEueSArIGNlbGxfYXJlYS5oZWlnaHQgLyAyLAorCQkJCWJveF9zaXplIC8gNCwgMCwgMiAqIG1hdGgucGkpCisKKworCQlzZWxmLnNldF9jb2xvdXIoY3R4LCBjb2xvdXIsIDAuMCwgMC41KQorCQljdHguc3Ryb2tlX3ByZXNlcnZlKCkKKworCQlzZWxmLnNldF9jb2xvdXIoY3R4LCBjb2xvdXIsIDAuNSwgMS4wKQorCQljdHguZmlsbF9wcmVzZXJ2ZSgpCisKKwkJaWYgKGxlbihuYW1lcykgIT0gMCk6CisJCQluYW1lID0gIiAiCisJCQlmb3IgaXRlbSBpbiBuYW1lczoKKwkJCQluYW1lID0gbmFtZSArIGl0ZW0gKyAiICIKKworCQkJY3R4LnNldF9mb250X3NpemUoMTMpCisJCQlpZiAoZmxhZ3MgJiAxKToKKwkJCQlzZWxmLnNldF9jb2xvdXIoY3R4LCBjb2xvdXIsIDAuNSwgMS4wKQorCQkJZWxzZToKKwkJCQlzZWxmLnNldF9jb2xvdXIoY3R4LCBjb2xvdXIsIDAuMCwgMC41KQorCQkJY3R4LnNob3dfdGV4dChuYW1lKQorCitjbGFzcyBDb21taXQ6CisJIiIiIFRoaXMgcmVwcmVzZW50IGEgY29tbWl0IG9iamVjdCBvYnRhaW5lZCBhZnRlciBwYXJzaW5nIHRoZSBnaXQtcmV2LWxpc3QKKwlvdXRwdXQgIiIiCisKKwljaGlsZHJlbl9zaGExID0ge30KKworCWRlZiBfX2luaXRfXyhzZWxmLCBjb21taXRfbGluZXMpOgorCQlzZWxmLm1lc3NhZ2UJCT0gIiIKKwkJc2VsZi5hdXRob3IJCT0gIiIKKwkJc2VsZi5kYXRlCQk9ICIiCisJCXNlbGYuY29tbWl0dGVyCQk9ICIiCisJCXNlbGYuY29tbWl0X2RhdGUJPSAiIgorCQlzZWxmLmNvbW1pdF9zaGExCT0gIiIKKwkJc2VsZi5wYXJlbnRfc2hhMQk9IFsgXQorCQlzZWxmLnBhcnNlX2NvbW1pdChjb21taXRfbGluZXMpCisKKworCWRlZiBwYXJzZV9jb21taXQoc2VsZiwgY29tbWl0X2xpbmVzKToKKworCQkjIEZpcnN0IGxpbmUgaXMgdGhlIHNoYTEgbGluZXMKKwkJbGluZSA9IHN0cmluZy5zdHJpcChjb21taXRfbGluZXNbMF0pCisJCXNoYTEgPSByZS5zcGxpdCgiICIsIGxpbmUpCisJCXNlbGYuY29tbWl0X3NoYTEgPSBzaGExWzBdCisJCXNlbGYucGFyZW50X3NoYTEgPSBzaGExWzE6XQorCisJCSNidWlsZCB0aGUgY2hpbGQgbGlzdAorCQlmb3IgcGFyZW50X2lkIGluIHNlbGYucGFyZW50X3NoYTE6CisJCQl0cnk6CisJCQkJQ29tbWl0LmNoaWxkcmVuX3NoYTFbcGFyZW50X2lkXS5hcHBlbmQoc2VsZi5jb21taXRfc2hhMSkKKwkJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCQlDb21taXQuY2hpbGRyZW5fc2hhMVtwYXJlbnRfaWRdID0gW3NlbGYuY29tbWl0X3NoYTFdCisKKwkJIyBJRiB3ZSBkb24ndCBoYXZlIHBhcmVudAorCQlpZiAobGVuKHNlbGYucGFyZW50X3NoYTEpID09IDApOgorCQkJc2VsZi5wYXJlbnRfc2hhMSA9IFswXQorCisJCWZvciBsaW5lIGluIGNvbW1pdF9saW5lc1sxOl06CisJCQltID0gcmUubWF0Y2goIl4gIiwgbGluZSkKKwkJCWlmIChtICE9IE5vbmUpOgorCQkJCSMgRmlyc3QgbGluZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2UgdXNlZCBmb3Igc2hvcnQgbG9nCisJCQkJaWYgc2VsZi5tZXNzYWdlID09ICIiOgorCQkJCQlzZWxmLm1lc3NhZ2UgPSBzdHJpbmcuc3RyaXAobGluZSkKKwkJCQljb250aW51ZQorCisJCQltID0gcmUubWF0Y2goInRyZWUiLCBsaW5lKQorCQkJaWYgKG0gIT0gTm9uZSk6CisJCQkJY29udGludWUKKworCQkJbSA9IHJlLm1hdGNoKCJwYXJlbnQiLCBsaW5lKQorCQkJaWYgKG0gIT0gTm9uZSk6CisJCQkJY29udGludWUKKworCQkJbSA9IHJlX2lkZW50Lm1hdGNoKGxpbmUpCisJCQlpZiAobSAhPSBOb25lKToKKwkJCQlkYXRlID0gc2hvd19kYXRlKG0uZ3JvdXAoJ2Vwb2NoJyksIG0uZ3JvdXAoJ3R6JykpCisJCQkJaWYgbS5ncm91cCgxKSA9PSAiYXV0aG9yIjoKKwkJCQkJc2VsZi5hdXRob3IgPSBtLmdyb3VwKCdpZGVudCcpCisJCQkJCXNlbGYuZGF0ZSA9IGRhdGUKKwkJCQllbGlmIG0uZ3JvdXAoMSkgPT0gImNvbW1pdHRlciI6CisJCQkJCXNlbGYuY29tbWl0dGVyID0gbS5ncm91cCgnaWRlbnQnKQorCQkJCQlzZWxmLmNvbW1pdF9kYXRlID0gZGF0ZQorCisJCQkJY29udGludWUKKworCWRlZiBnZXRfbWVzc2FnZShzZWxmLCB3aXRoX2RpZmY9MCk6CisJCWlmICh3aXRoX2RpZmYgPT0gMSk6CisJCQltZXNzYWdlID0gc2VsZi5kaWZmX3RyZWUoKQorCQllbHNlOgorCQkJZnAgPSBvcy5wb3BlbigiZ2l0IGNhdC1maWxlIGNvbW1pdCAiICsgc2VsZi5jb21taXRfc2hhMSkKKwkJCW1lc3NhZ2UgPSBmcC5yZWFkKCkKKwkJCWZwLmNsb3NlKCkKKworCQlyZXR1cm4gbWVzc2FnZQorCisJZGVmIGRpZmZfdHJlZShzZWxmKToKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLWNjICAtdiAtcCAtLWFsd2F5cyAiICsgIHNlbGYuY29tbWl0X3NoYTEpCisJCWRpZmYgPSBmcC5yZWFkKCkKKwkJZnAuY2xvc2UoKQorCQlyZXR1cm4gZGlmZgorCitjbGFzcyBEaWZmV2luZG93OgorCSIiIkRpZmYgd2luZG93LgorCVRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYW5kIG1hbmFnZXMgYSBzaW5nbGUgd2luZG93IGNvbnRhaW5pbmcgdGhlCisJZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gcmV2aXNpb25zIG9uIGEgYnJhbmNoLgorCSIiIgorCisJZGVmIF9faW5pdF9fKHNlbGYpOgorCQlzZWxmLndpbmRvdyA9IGd0ay5XaW5kb3coZ3RrLldJTkRPV19UT1BMRVZFTCkKKwkJc2VsZi53aW5kb3cuc2V0X2JvcmRlcl93aWR0aCgwKQorCQlzZWxmLndpbmRvdy5zZXRfdGl0bGUoIkdpdCByZXBvc2l0b3J5IGJyb3dzZXIgZGlmZiB3aW5kb3ciKQorCisJCSMgVXNlIHR3byB0aGlyZHMgb2YgdGhlIHNjcmVlbiBieSBkZWZhdWx0CisJCXNjcmVlbiA9IHNlbGYud2luZG93LmdldF9zY3JlZW4oKQorCQltb25pdG9yID0gc2NyZWVuLmdldF9tb25pdG9yX2dlb21ldHJ5KDApCisJCXdpZHRoID0gaW50KG1vbml0b3Iud2lkdGggKiAwLjY2KQorCQloZWlnaHQgPSBpbnQobW9uaXRvci5oZWlnaHQgKiAwLjY2KQorCQlzZWxmLndpbmRvdy5zZXRfZGVmYXVsdF9zaXplKHdpZHRoLCBoZWlnaHQpCisKKwkJc2VsZi5jb25zdHJ1Y3QoKQorCisJZGVmIGNvbnN0cnVjdChzZWxmKToKKwkJIiIiQ29uc3RydWN0IHRoZSB3aW5kb3cgY29udGVudHMuIiIiCisJCXZib3ggPSBndGsuVkJveCgpCisJCXNlbGYud2luZG93LmFkZCh2Ym94KQorCQl2Ym94LnNob3coKQorCisJCW1lbnVfYmFyID0gZ3RrLk1lbnVCYXIoKQorCQlzYXZlX21lbnUgPSBndGsuSW1hZ2VNZW51SXRlbShndGsuU1RPQ0tfU0FWRSkKKwkJc2F2ZV9tZW51LmNvbm5lY3QoImFjdGl2YXRlIiwgc2VsZi5zYXZlX21lbnVfcmVzcG9uc2UsICJzYXZlIikKKwkJc2F2ZV9tZW51LnNob3coKQorCQltZW51X2Jhci5hcHBlbmQoc2F2ZV9tZW51KQorCQl2Ym94LnBhY2tfc3RhcnQobWVudV9iYXIsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQltZW51X2Jhci5zaG93KCkKKworCQlzY3JvbGx3aW4gPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorCQlzY3JvbGx3aW4uc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisJCXNjcm9sbHdpbi5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKwkJdmJveC5wYWNrX3N0YXJ0KHNjcm9sbHdpbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKwkJc2Nyb2xsd2luLnNob3coKQorCisJCWlmIGhhdmVfZ3Rrc291cmNldmlldzoKKwkJCXNlbGYuYnVmZmVyID0gZ3Rrc291cmNldmlldy5Tb3VyY2VCdWZmZXIoKQorCQkJc2xtID0gZ3Rrc291cmNldmlldy5Tb3VyY2VMYW5ndWFnZXNNYW5hZ2VyKCkKKwkJCWdzbCA9IHNsbS5nZXRfbGFuZ3VhZ2VfZnJvbV9taW1lX3R5cGUoInRleHQveC1wYXRjaCIpCisJCQlzZWxmLmJ1ZmZlci5zZXRfaGlnaGxpZ2h0KFRydWUpCisJCQlzZWxmLmJ1ZmZlci5zZXRfbGFuZ3VhZ2UoZ3NsKQorCQkJc291cmNldmlldyA9IGd0a3NvdXJjZXZpZXcuU291cmNlVmlldyhzZWxmLmJ1ZmZlcikKKwkJZWxzZToKKwkJCXNlbGYuYnVmZmVyID0gZ3RrLlRleHRCdWZmZXIoKQorCQkJc291cmNldmlldyA9IGd0ay5UZXh0VmlldyhzZWxmLmJ1ZmZlcikKKworCQlzb3VyY2V2aWV3LnNldF9lZGl0YWJsZShGYWxzZSkKKwkJc291cmNldmlldy5tb2RpZnlfZm9udChwYW5nby5Gb250RGVzY3JpcHRpb24oIk1vbm9zcGFjZSIpKQorCQlzY3JvbGx3aW4uYWRkKHNvdXJjZXZpZXcpCisJCXNvdXJjZXZpZXcuc2hvdygpCisKKworCWRlZiBzZXRfZGlmZihzZWxmLCBjb21taXRfc2hhMSwgcGFyZW50X3NoYTEsIGVuY29kaW5nKToKKwkJIiIiU2V0IHRoZSBkaWZmZXJlbmNlcyBzaG93ZWQgYnkgdGhpcyB3aW5kb3cuCisJCUNvbXBhcmVzIHRoZSB0d28gdHJlZXMgYW5kIHBvcHVsYXRlcyB0aGUgd2luZG93IHdpdGggdGhlCisJCWRpZmZlcmVuY2VzLgorCQkiIiIKKwkJIyBEaWZmIHdpdGggdGhlIGZpcnN0IGNvbW1pdCBvciB0aGUgbGFzdCBjb21taXQgc2hvd3Mgbm90aGluZworCQlpZiAoY29tbWl0X3NoYTEgPT0gMCBvciBwYXJlbnRfc2hhMSA9PSAwICk6CisJCQlyZXR1cm4KKworCQlmcCA9IG9zLnBvcGVuKCJnaXQgZGlmZi10cmVlIC1wICIgKyBwYXJlbnRfc2hhMSArICIgIiArIGNvbW1pdF9zaGExKQorCQlzZWxmLmJ1ZmZlci5zZXRfdGV4dCh1bmljb2RlKGZwLnJlYWQoKSwgZW5jb2RpbmcpLmVuY29kZSgndXRmLTgnKSkKKwkJZnAuY2xvc2UoKQorCQlzZWxmLndpbmRvdy5zaG93KCkKKworCWRlZiBzYXZlX21lbnVfcmVzcG9uc2Uoc2VsZiwgd2lkZ2V0LCBzdHJpbmcpOgorCQlkaWFsb2cgPSBndGsuRmlsZUNob29zZXJEaWFsb2coIlNhdmUuLiIsIE5vbmUsIGd0ay5GSUxFX0NIT09TRVJfQUNUSU9OX1NBVkUsCisJCQkJKGd0ay5TVE9DS19DQU5DRUwsIGd0ay5SRVNQT05TRV9DQU5DRUwsCisJCQkJCWd0ay5TVE9DS19TQVZFLCBndGsuUkVTUE9OU0VfT0spKQorCQlkaWFsb2cuc2V0X2RlZmF1bHRfcmVzcG9uc2UoZ3RrLlJFU1BPTlNFX09LKQorCQlyZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorCQlpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfT0s6CisJCQlwYXRjaF9idWZmZXIgPSBzZWxmLmJ1ZmZlci5nZXRfdGV4dChzZWxmLmJ1ZmZlci5nZXRfc3RhcnRfaXRlcigpLAorCQkJCQlzZWxmLmJ1ZmZlci5nZXRfZW5kX2l0ZXIoKSkKKwkJCWZwID0gb3BlbihkaWFsb2cuZ2V0X2ZpbGVuYW1lKCksICJ3IikKKwkJCWZwLndyaXRlKHBhdGNoX2J1ZmZlcikKKwkJCWZwLmNsb3NlKCkKKwkJZGlhbG9nLmRlc3Ryb3koKQorCitjbGFzcyBHaXRWaWV3OgorCSIiIiBUaGlzIGlzIHRoZSBtYWluIGNsYXNzCisJIiIiCisJdmVyc2lvbiA9ICIwLjgiCisKKwlkZWYgX19pbml0X18oc2VsZiwgd2l0aF9kaWZmPTApOgorCQlzZWxmLndpdGhfZGlmZiA9IHdpdGhfZGlmZgorCQlzZWxmLndpbmRvdyA9CWd0ay5XaW5kb3coZ3RrLldJTkRPV19UT1BMRVZFTCkKKwkJc2VsZi53aW5kb3cuc2V0X2JvcmRlcl93aWR0aCgwKQorCQlzZWxmLndpbmRvdy5zZXRfdGl0bGUoIkdpdCByZXBvc2l0b3J5IGJyb3dzZXIiKQorCisJCXNlbGYuZ2V0X2VuY29kaW5nKCkKKwkJc2VsZi5nZXRfYnRfc2hhMSgpCisKKwkJIyBVc2UgdGhyZWUtcXVhcnRlcnMgb2YgdGhlIHNjcmVlbiBieSBkZWZhdWx0CisJCXNjcmVlbiA9IHNlbGYud2luZG93LmdldF9zY3JlZW4oKQorCQltb25pdG9yID0gc2NyZWVuLmdldF9tb25pdG9yX2dlb21ldHJ5KDApCisJCXdpZHRoID0gaW50KG1vbml0b3Iud2lkdGggKiAwLjc1KQorCQloZWlnaHQgPSBpbnQobW9uaXRvci5oZWlnaHQgKiAwLjc1KQorCQlzZWxmLndpbmRvdy5zZXRfZGVmYXVsdF9zaXplKHdpZHRoLCBoZWlnaHQpCisKKwkJIyBGSVhNRSBBbmR5Rml0eiEKKwkJaWNvbiA9IHNlbGYud2luZG93LnJlbmRlcl9pY29uKGd0ay5TVE9DS19JTkRFWCwgZ3RrLklDT05fU0laRV9CVVRUT04pCisJCXNlbGYud2luZG93LnNldF9pY29uKGljb24pCisKKwkJc2VsZi5hY2NlbF9ncm91cCA9IGd0ay5BY2NlbEdyb3VwKCkKKwkJc2VsZi53aW5kb3cuYWRkX2FjY2VsX2dyb3VwKHNlbGYuYWNjZWxfZ3JvdXApCisJCXNlbGYuYWNjZWxfZ3JvdXAuY29ubmVjdF9ncm91cCgweGZmYzIsIDAsIGd0ay5BQ0NFTF9MT0NLRUQsIHNlbGYucmVmcmVzaCk7CisJCXNlbGYuYWNjZWxfZ3JvdXAuY29ubmVjdF9ncm91cCgweGZmYzEsIDAsIGd0ay5BQ0NFTF9MT0NLRUQsIHNlbGYubWF4aW1pemUpOworCQlzZWxmLmFjY2VsX2dyb3VwLmNvbm5lY3RfZ3JvdXAoMHhmZmM4LCAwLCBndGsuQUNDRUxfTE9DS0VELCBzZWxmLmZ1bGxzY3JlZW4pOworCQlzZWxmLmFjY2VsX2dyb3VwLmNvbm5lY3RfZ3JvdXAoMHhmZmM5LCAwLCBndGsuQUNDRUxfTE9DS0VELCBzZWxmLnVuZnVsbHNjcmVlbik7CisKKwkJc2VsZi53aW5kb3cuYWRkKHNlbGYuY29uc3RydWN0KCkpCisKKwlkZWYgcmVmcmVzaChzZWxmLCB3aWRnZXQsIGV2ZW50PU5vbmUsICphcmd1bWVudHMsICoqa2V5d29yZHMpOgorCQlzZWxmLmdldF9lbmNvZGluZygpCisJCXNlbGYuZ2V0X2J0X3NoYTEoKQorCQlDb21taXQuY2hpbGRyZW5fc2hhMSA9IHt9CisJCXNlbGYuc2V0X2JyYW5jaChzeXMuYXJndlt3aXRob3V0X2RpZmY6XSkKKwkJc2VsZi53aW5kb3cuc2hvdygpCisJCXJldHVybiBUcnVlCisKKwlkZWYgbWF4aW1pemUoc2VsZiwgd2lkZ2V0LCBldmVudD1Ob25lLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKKwkJc2VsZi53aW5kb3cubWF4aW1pemUoKQorCQlyZXR1cm4gVHJ1ZQorCisJZGVmIGZ1bGxzY3JlZW4oc2VsZiwgd2lkZ2V0LCBldmVudD1Ob25lLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKKwkJc2VsZi53aW5kb3cuZnVsbHNjcmVlbigpCisJCXJldHVybiBUcnVlCisKKwlkZWYgdW5mdWxsc2NyZWVuKHNlbGYsIHdpZGdldCwgZXZlbnQ9Tm9uZSwgKmFyZ3VtZW50cywgKiprZXl3b3Jkcyk6CisJCXNlbGYud2luZG93LnVuZnVsbHNjcmVlbigpCisJCXJldHVybiBUcnVlCisKKwlkZWYgZ2V0X2J0X3NoYTEoc2VsZik6CisJCSIiIiBVcGRhdGUgdGhlIGJ0X3NoYTEgZGljdGlvbmFyeSB3aXRoIHRoZQorCQlyZXNwZWN0aXZlIHNoYTEgZGV0YWlscyAiIiIKKworCQlzZWxmLmJ0X3NoYTEgPSB7IH0KKwkJbHNfcmVtb3RlID0gcmUuY29tcGlsZSgnXiguezQwfSlcdHJlZnMvKFteXl0rKSg/OlxcXiguLikpPyQnKTsKKwkJZnAgPSBvcy5wb3BlbignZ2l0IGxzLXJlbW90ZSAiJHtHSVRfRElSLS5naXR9IicpCisJCXdoaWxlIDE6CisJCQlsaW5lID0gc3RyaW5nLnN0cmlwKGZwLnJlYWRsaW5lKCkpCisJCQlpZiBsaW5lID09ICcnOgorCQkJCWJyZWFrCisJCQltID0gbHNfcmVtb3RlLm1hdGNoKGxpbmUpCisJCQlpZiBub3QgbToKKwkJCQljb250aW51ZQorCQkJKHNoYTEsIG5hbWUpID0gKG0uZ3JvdXAoMSksIG0uZ3JvdXAoMikpCisJCQlpZiBub3Qgc2VsZi5idF9zaGExLmhhc19rZXkoc2hhMSk6CisJCQkJc2VsZi5idF9zaGExW3NoYTFdID0gW10KKwkJCXNlbGYuYnRfc2hhMVtzaGExXS5hcHBlbmQobmFtZSkKKwkJZnAuY2xvc2UoKQorCisJZGVmIGdldF9lbmNvZGluZyhzZWxmKToKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IHJlcG8tY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmciKQorCQlzZWxmLmVuY29kaW5nPXN0cmluZy5zdHJpcChmcC5yZWFkbGluZSgpKQorCQlmcC5jbG9zZSgpCisJCWlmIChzZWxmLmVuY29kaW5nID09ICIiKToKKwkJCXNlbGYuZW5jb2RpbmcgPSAidXRmLTgiCisKKworCWRlZiBjb25zdHJ1Y3Qoc2VsZik6CisJCSIiIkNvbnN0cnVjdCB0aGUgd2luZG93IGNvbnRlbnRzLiIiIgorCQl2Ym94ID0gZ3RrLlZCb3goKQorCQlwYW5lZCA9IGd0ay5WUGFuZWQoKQorCQlwYW5lZC5wYWNrMShzZWxmLmNvbnN0cnVjdF90b3AoKSwgcmVzaXplPUZhbHNlLCBzaHJpbms9VHJ1ZSkKKwkJcGFuZWQucGFjazIoc2VsZi5jb25zdHJ1Y3RfYm90dG9tKCksIHJlc2l6ZT1GYWxzZSwgc2hyaW5rPVRydWUpCisJCW1lbnVfYmFyID0gZ3RrLk1lbnVCYXIoKQorCQltZW51X2Jhci5zZXRfcGFja19kaXJlY3Rpb24oZ3RrLlBBQ0tfRElSRUNUSU9OX1JUTCkKKwkJaGVscF9tZW51ID0gZ3RrLk1lbnVJdGVtKCJIZWxwIikKKwkJbWVudSA9IGd0ay5NZW51KCkKKwkJYWJvdXRfbWVudSA9IGd0ay5NZW51SXRlbSgiQWJvdXQiKQorCQltZW51LmFwcGVuZChhYm91dF9tZW51KQorCQlhYm91dF9tZW51LmNvbm5lY3QoImFjdGl2YXRlIiwgc2VsZi5hYm91dF9tZW51X3Jlc3BvbnNlLCAiYWJvdXQiKQorCQlhYm91dF9tZW51LnNob3coKQorCQloZWxwX21lbnUuc2V0X3N1Ym1lbnUobWVudSkKKwkJaGVscF9tZW51LnNob3coKQorCQltZW51X2Jhci5hcHBlbmQoaGVscF9tZW51KQorCQltZW51X2Jhci5zaG93KCkKKwkJdmJveC5wYWNrX3N0YXJ0KG1lbnVfYmFyLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJdmJveC5wYWNrX3N0YXJ0KHBhbmVkLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCQlwYW5lZC5zaG93KCkKKwkJdmJveC5zaG93KCkKKwkJcmV0dXJuIHZib3gKKworCisJZGVmIGNvbnN0cnVjdF90b3Aoc2VsZik6CisJCSIiIkNvbnN0cnVjdCB0aGUgdG9wLWhhbGYgb2YgdGhlIHdpbmRvdy4iIiIKKwkJdmJveCA9IGd0ay5WQm94KHNwYWNpbmc9NikKKwkJdmJveC5zZXRfYm9yZGVyX3dpZHRoKDEyKQorCQl2Ym94LnNob3coKQorCisKKwkJc2Nyb2xsd2luID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKwkJc2Nyb2xsd2luLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorCQlzY3JvbGx3aW4uc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisJCXZib3gucGFja19zdGFydChzY3JvbGx3aW4sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisJCXNjcm9sbHdpbi5zaG93KCkKKworCQlzZWxmLnRyZWV2aWV3ID0gZ3RrLlRyZWVWaWV3KCkKKwkJc2VsZi50cmVldmlldy5zZXRfcnVsZXNfaGludChUcnVlKQorCQlzZWxmLnRyZWV2aWV3LnNldF9zZWFyY2hfY29sdW1uKDQpCisJCXNlbGYudHJlZXZpZXcuY29ubmVjdCgiY3Vyc29yLWNoYW5nZWQiLCBzZWxmLl90cmVldmlld19jdXJzb3JfY2IpCisJCXNjcm9sbHdpbi5hZGQoc2VsZi50cmVldmlldykKKwkJc2VsZi50cmVldmlldy5zaG93KCkKKworCQljZWxsID0gQ2VsbFJlbmRlcmVyR3JhcGgoKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgIm5vZGUiLCAxKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAiaW4tbGluZXMiLCAyKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAib3V0LWxpbmVzIiwgMykKKwkJc2VsZi50cmVldmlldy5hcHBlbmRfY29sdW1uKGNvbHVtbikKKworCQljZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorCQljZWxsLnNldF9wcm9wZXJ0eSgid2lkdGgtY2hhcnMiLCA2NSkKKwkJY2VsbC5zZXRfcHJvcGVydHkoImVsbGlwc2l6ZSIsIHBhbmdvLkVMTElQU0laRV9FTkQpCisJCWNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiTWVzc2FnZSIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDQpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoIndpZHRoLWNoYXJzIiwgNDApCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIkF1dGhvciIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDUpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoImVsbGlwc2l6ZSIsIHBhbmdvLkVMTElQU0laRV9FTkQpCisJCWNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiRGF0ZSIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDYpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJcmV0dXJuIHZib3gKKworCWRlZiBhYm91dF9tZW51X3Jlc3BvbnNlKHNlbGYsIHdpZGdldCwgc3RyaW5nKToKKwkJZGlhbG9nID0gZ3RrLkFib3V0RGlhbG9nKCkKKwkJZGlhbG9nLnNldF9uYW1lKCJHaXR2aWV3IikKKwkJZGlhbG9nLnNldF92ZXJzaW9uKEdpdFZpZXcudmVyc2lvbikKKwkJZGlhbG9nLnNldF9hdXRob3JzKFsiQW5lZXNoIEt1bWFyIEsuViA8YW5lZXNoLmt1bWFyQGhwLmNvbT4iXSkKKwkJZGlhbG9nLnNldF93ZWJzaXRlKCJodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvIikKKwkJZGlhbG9nLnNldF9jb3B5cmlnaHQoIlVzZSBhbmQgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIikKKwkJZGlhbG9nLnNldF93cmFwX2xpY2Vuc2UoVHJ1ZSkKKwkJZGlhbG9nLnJ1bigpCisJCWRpYWxvZy5kZXN0cm95KCkKKworCisJZGVmIGNvbnN0cnVjdF9ib3R0b20oc2VsZik6CisJCSIiIkNvbnN0cnVjdCB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIHdpbmRvdy4iIiIKKwkJdmJveCA9IGd0ay5WQm94KEZhbHNlLCBzcGFjaW5nPTYpCisJCXZib3guc2V0X2JvcmRlcl93aWR0aCgxMikKKwkJKHdpZHRoLCBoZWlnaHQpID0gc2VsZi53aW5kb3cuZ2V0X3NpemUoKQorCQl2Ym94LnNldF9zaXplX3JlcXVlc3Qod2lkdGgsIGludChoZWlnaHQgLyAyLjUpKQorCQl2Ym94LnNob3coKQorCisJCXNlbGYudGFibGUgPSBndGsuVGFibGUocm93cz00LCBjb2x1bW5zPTQpCisJCXNlbGYudGFibGUuc2V0X3Jvd19zcGFjaW5ncyg2KQorCQlzZWxmLnRhYmxlLnNldF9jb2xfc3BhY2luZ3MoNikKKwkJdmJveC5wYWNrX3N0YXJ0KHNlbGYudGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQlzZWxmLnRhYmxlLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJbGFiZWwgPSBndGsuTGFiZWwoKQorCQlsYWJlbC5zZXRfbWFya3VwKCI8Yj5SZXZpc2lvbjo8L2I+IikKKwkJYWxpZ24uYWRkKGxhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMCwgMSwgMCwgMSwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlsYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlzZWxmLnJldmlkX2xhYmVsID0gZ3RrLkxhYmVsKCkKKwkJc2VsZi5yZXZpZF9sYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQlhbGlnbi5hZGQoc2VsZi5yZXZpZF9sYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDEsIDIsIDAsIDEsIGd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCXNlbGYucmV2aWRfbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJbGFiZWwgPSBndGsuTGFiZWwoKQorCQlsYWJlbC5zZXRfbWFya3VwKCI8Yj5Db21taXR0ZXI6PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDEsIDIsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwgPSBndGsuTGFiZWwoKQorCQlzZWxmLmNvbW1pdHRlcl9sYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQlhbGlnbi5hZGQoc2VsZi5jb21taXR0ZXJfbGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCAxLCAyLCBndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlzZWxmLmNvbW1pdHRlcl9sYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlsYWJlbCA9IGd0ay5MYWJlbCgpCisJCWxhYmVsLnNldF9tYXJrdXAoIjxiPlRpbWVzdGFtcDo8L2I+IikKKwkJYWxpZ24uYWRkKGxhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMCwgMSwgMiwgMywgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlsYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbCA9IGd0ay5MYWJlbCgpCisJCXNlbGYudGltZXN0YW1wX2xhYmVsLnNldF9zZWxlY3RhYmxlKFRydWUpCisJCWFsaWduLmFkZChzZWxmLnRpbWVzdGFtcF9sYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDEsIDIsIDIsIDMsIGd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCXNlbGYudGltZXN0YW1wX2xhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+UGFyZW50czo8L2I+IikKKwkJYWxpZ24uYWRkKGxhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMCwgMSwgMywgNCwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlsYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisJCXNlbGYucGFyZW50c193aWRnZXRzID0gW10KKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+Q2hpbGRyZW46PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDIsIDMsIDMsIDQsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCQlzZWxmLmNoaWxkcmVuX3dpZGdldHMgPSBbXQorCisJCXNjcm9sbHdpbiA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisJCXNjcm9sbHdpbi5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKwkJc2Nyb2xsd2luLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorCQl2Ym94LnBhY2tfc3RhcnQoc2Nyb2xsd2luLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJaWYgaGF2ZV9ndGtzb3VyY2V2aWV3OgorCQkJc2VsZi5tZXNzYWdlX2J1ZmZlciA9IGd0a3NvdXJjZXZpZXcuU291cmNlQnVmZmVyKCkKKwkJCXNsbSA9IGd0a3NvdXJjZXZpZXcuU291cmNlTGFuZ3VhZ2VzTWFuYWdlcigpCisJCQlnc2wgPSBzbG0uZ2V0X2xhbmd1YWdlX2Zyb21fbWltZV90eXBlKCJ0ZXh0L3gtcGF0Y2giKQorCQkJc2VsZi5tZXNzYWdlX2J1ZmZlci5zZXRfaGlnaGxpZ2h0KFRydWUpCisJCQlzZWxmLm1lc3NhZ2VfYnVmZmVyLnNldF9sYW5ndWFnZShnc2wpCisJCQlzb3VyY2V2aWV3ID0gZ3Rrc291cmNldmlldy5Tb3VyY2VWaWV3KHNlbGYubWVzc2FnZV9idWZmZXIpCisJCWVsc2U6CisJCQlzZWxmLm1lc3NhZ2VfYnVmZmVyID0gZ3RrLlRleHRCdWZmZXIoKQorCQkJc291cmNldmlldyA9IGd0ay5UZXh0VmlldyhzZWxmLm1lc3NhZ2VfYnVmZmVyKQorCisJCXNvdXJjZXZpZXcuc2V0X2VkaXRhYmxlKEZhbHNlKQorCQlzb3VyY2V2aWV3Lm1vZGlmeV9mb250KHBhbmdvLkZvbnREZXNjcmlwdGlvbigiTW9ub3NwYWNlIikpCisJCXNjcm9sbHdpbi5hZGQoc291cmNldmlldykKKwkJc291cmNldmlldy5zaG93KCkKKworCQlyZXR1cm4gdmJveAorCisJZGVmIF90cmVldmlld19jdXJzb3JfY2Ioc2VsZiwgKmFyZ3MpOgorCQkiIiJDYWxsYmFjayBmb3Igd2hlbiB0aGUgdHJlZXZpZXcgY3Vyc29yIGNoYW5nZXMuIiIiCisJCShwYXRoLCBjb2wpID0gc2VsZi50cmVldmlldy5nZXRfY3Vyc29yKCkKKwkJY29tbWl0ID0gc2VsZi5tb2RlbFtwYXRoXVswXQorCisJCWlmIGNvbW1pdC5jb21taXR0ZXIgaXMgbm90IE5vbmU6CisJCQljb21taXR0ZXIgPSBjb21taXQuY29tbWl0dGVyCisJCQl0aW1lc3RhbXAgPSBjb21taXQuY29tbWl0X2RhdGUKKwkJCW1lc3NhZ2UgICA9ICBjb21taXQuZ2V0X21lc3NhZ2Uoc2VsZi53aXRoX2RpZmYpCisJCQlyZXZpZF9sYWJlbCA9IGNvbW1pdC5jb21taXRfc2hhMQorCQllbHNlOgorCQkJY29tbWl0dGVyID0gIiIKKwkJCXRpbWVzdGFtcCA9ICIiCisJCQltZXNzYWdlID0gIiIKKwkJCXJldmlkX2xhYmVsID0gIiIKKworCQlzZWxmLnJldmlkX2xhYmVsLnNldF90ZXh0KHJldmlkX2xhYmVsKQorCQlzZWxmLmNvbW1pdHRlcl9sYWJlbC5zZXRfdGV4dChjb21taXR0ZXIpCisJCXNlbGYudGltZXN0YW1wX2xhYmVsLnNldF90ZXh0KHRpbWVzdGFtcCkKKwkJc2VsZi5tZXNzYWdlX2J1ZmZlci5zZXRfdGV4dCh1bmljb2RlKG1lc3NhZ2UsIHNlbGYuZW5jb2RpbmcpLmVuY29kZSgndXRmLTgnKSkKKworCQlmb3Igd2lkZ2V0IGluIHNlbGYucGFyZW50c193aWRnZXRzOgorCQkJc2VsZi50YWJsZS5yZW1vdmUod2lkZ2V0KQorCisJCXNlbGYucGFyZW50c193aWRnZXRzID0gW10KKwkJc2VsZi50YWJsZS5yZXNpemUoNCArIGxlbihjb21taXQucGFyZW50X3NoYTEpIC0gMSwgNCkKKwkJZm9yIGlkeCwgcGFyZW50X2lkIGluIGVudW1lcmF0ZShjb21taXQucGFyZW50X3NoYTEpOgorCQkJc2VsZi50YWJsZS5zZXRfcm93X3NwYWNpbmcoaWR4ICsgMywgMCkKKworCQkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC4wKQorCQkJc2VsZi5wYXJlbnRzX3dpZGdldHMuYXBwZW5kKGFsaWduKQorCQkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDEsIDIsIGlkeCArIDMsIGlkeCArIDQsCisJCQkJCWd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCQlhbGlnbi5zaG93KCkKKworCQkJaGJveCA9IGd0ay5IQm94KEZhbHNlLCAwKQorCQkJYWxpZ24uYWRkKGhib3gpCisJCQloYm94LnNob3coKQorCisJCQlsYWJlbCA9IGd0ay5MYWJlbChwYXJlbnRfaWQpCisJCQlsYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQkJaGJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWxhYmVsLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfSlVNUF9UTywgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5fZ29fY2xpY2tlZF9jYiwgcGFyZW50X2lkKQorCQkJaGJveC5wYWNrX3N0YXJ0KGJ1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPVRydWUpCisJCQlidXR0b24uc2hvdygpCisKKwkJCWltYWdlID0gZ3RrLkltYWdlKCkKKwkJCWltYWdlLnNldF9mcm9tX3N0b2NrKGd0ay5TVE9DS19GSU5ELCBndGsuSUNPTl9TSVpFX01FTlUpCisJCQlpbWFnZS5zaG93KCkKKworCQkJYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisJCQlidXR0b24uYWRkKGltYWdlKQorCQkJYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9OT05FKQorCQkJYnV0dG9uLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKwkJCWJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5fc2hvd19jbGlja2VkX2NiLAorCQkJCQljb21taXQuY29tbWl0X3NoYTEsIHBhcmVudF9pZCwgc2VsZi5lbmNvZGluZykKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJCSMgUG9wdWxhdGUgd2l0aCBjaGlsZCBkZXRhaWxzCisJCWZvciB3aWRnZXQgaW4gc2VsZi5jaGlsZHJlbl93aWRnZXRzOgorCQkJc2VsZi50YWJsZS5yZW1vdmUod2lkZ2V0KQorCisJCXNlbGYuY2hpbGRyZW5fd2lkZ2V0cyA9IFtdCisJCXRyeToKKwkJCWNoaWxkX3NoYTEgPSBDb21taXQuY2hpbGRyZW5fc2hhMVtjb21taXQuY29tbWl0X3NoYTFdCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCSMgV2UgZG9uJ3QgaGF2ZSBjaGlsZAorCQkJY2hpbGRfc2hhMSA9IFsgMCBdCisKKwkJaWYgKCBsZW4oY2hpbGRfc2hhMSkgPiBsZW4oY29tbWl0LnBhcmVudF9zaGExKSk6CisJCQlzZWxmLnRhYmxlLnJlc2l6ZSg0ICsgbGVuKGNoaWxkX3NoYTEpIC0gMSwgNCkKKworCQlmb3IgaWR4LCBjaGlsZF9pZCBpbiBlbnVtZXJhdGUoY2hpbGRfc2hhMSk6CisJCQlzZWxmLnRhYmxlLnNldF9yb3dfc3BhY2luZyhpZHggKyAzLCAwKQorCisJCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjApCisJCQlzZWxmLmNoaWxkcmVuX3dpZGdldHMuYXBwZW5kKGFsaWduKQorCQkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDMsIDQsIGlkeCArIDMsIGlkeCArIDQsCisJCQkJCWd0ay5FWFBBTkQgfCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCQlhbGlnbi5zaG93KCkKKworCQkJaGJveCA9IGd0ay5IQm94KEZhbHNlLCAwKQorCQkJYWxpZ24uYWRkKGhib3gpCisJCQloYm94LnNob3coKQorCisJCQlsYWJlbCA9IGd0ay5MYWJlbChjaGlsZF9pZCkKKwkJCWxhYmVsLnNldF9zZWxlY3RhYmxlKFRydWUpCisJCQloYm94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJbGFiZWwuc2hvdygpCisKKwkJCWltYWdlID0gZ3RrLkltYWdlKCkKKwkJCWltYWdlLnNldF9mcm9tX3N0b2NrKGd0ay5TVE9DS19KVU1QX1RPLCBndGsuSUNPTl9TSVpFX01FTlUpCisJCQlpbWFnZS5zaG93KCkKKworCQkJYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisJCQlidXR0b24uYWRkKGltYWdlKQorCQkJYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9OT05FKQorCQkJYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLl9nb19jbGlja2VkX2NiLCBjaGlsZF9pZCkKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfRklORCwgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5zZXRfc2Vuc2l0aXZlKFRydWUpCisJCQlidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuX3Nob3dfY2xpY2tlZF9jYiwKKwkJCQkJY2hpbGRfaWQsIGNvbW1pdC5jb21taXRfc2hhMSwgc2VsZi5lbmNvZGluZykKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJZGVmIF9kZXN0cm95X2NiKHNlbGYsIHdpZGdldCk6CisJCSIiIkNhbGxiYWNrIGZvciB3aGVuIGEgd2luZG93IHdlIG1hbmFnZSBpcyBkZXN0cm95ZWQuIiIiCisJCXNlbGYucXVpdCgpCisKKworCWRlZiBxdWl0KHNlbGYpOgorCQkiIiJTdG9wIHRoZSBHVEsrIG1haW4gbG9vcC4iIiIKKwkJZ3RrLm1haW5fcXVpdCgpCisKKwlkZWYgcnVuKHNlbGYsIGFyZ3MpOgorCQlzZWxmLnNldF9icmFuY2goYXJncykKKwkJc2VsZi53aW5kb3cuY29ubmVjdCgiZGVzdHJveSIsIHNlbGYuX2Rlc3Ryb3lfY2IpCisJCXNlbGYud2luZG93LnNob3coKQorCQlndGsubWFpbigpCisKKwlkZWYgc2V0X2JyYW5jaChzZWxmLCBhcmdzKToKKwkJIiIiRmlsbCBpbiBkaWZmZXJlbnQgd2luZG93cyB3aXRoIGluZm8gZnJvbSB0aGUgcmVwb3Npcm90eSIiIgorCQlmcCA9IG9zLnBvcGVuKCJnaXQgcmV2LXBhcnNlIC0tc3EgLS1kZWZhdWx0IEhFQUQgIiArIGxpc3RfdG9fc3RyaW5nKGFyZ3MsIDEpKQorCQlnaXRfcmV2X2xpc3RfY21kID0gZnAucmVhZCgpCisJCWZwLmNsb3NlKCkKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IHJldi1saXN0ICAtLWhlYWRlciAtLXRvcG8tb3JkZXIgLS1wYXJlbnRzICIgKyBnaXRfcmV2X2xpc3RfY21kKQorCQlzZWxmLnVwZGF0ZV93aW5kb3coZnApCisKKwlkZWYgdXBkYXRlX3dpbmRvdyhzZWxmLCBmcCk6CisJCWNvbW1pdF9saW5lcyA9IFtdCisKKwkJc2VsZi5tb2RlbCA9IGd0ay5MaXN0U3RvcmUoZ29iamVjdC5UWVBFX1BZT0JKRUNULCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsCisJCQkJZ29iamVjdC5UWVBFX1BZT0JKRUNULCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsIHN0ciwgc3RyLCBzdHIpCisKKwkJIyB1c2VkIGZvciBjdXJzb3IgcG9zaXRpb25pbmcKKwkJc2VsZi5pbmRleCA9IHt9CisKKwkJc2VsZi5jb2xvdXJzID0ge30KKwkJc2VsZi5ub2RlcG9zID0ge30KKwkJc2VsZi5pbmNvbXBsZXRlX2xpbmUgPSB7fQorCQlzZWxmLmNvbW1pdHMgPSBbXQorCisJCWluZGV4ID0gMAorCQlsYXN0X2NvbG91ciA9IDAKKwkJbGFzdF9ub2RlcG9zID0gLTEKKwkJb3V0X2xpbmUgPSBbXQorCQlpbnB1dF9saW5lID0gZnAucmVhZGxpbmUoKQorCQl3aGlsZSAoaW5wdXRfbGluZSAhPSAiIik6CisJCQkjIFRoZSBjb21taXQgaGVhZGVyIGVuZHMgd2l0aCAnXDAnCisJCQkjIFRoaXMgTlVMTCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgc2hhMSBvZiB0aGUKKwkJCSMgbmV4dCBjb21taXQKKwkJCWlmIChpbnB1dF9saW5lWzBdICE9ICdcMCcpOgorCQkJCWNvbW1pdF9saW5lcy5hcHBlbmQoaW5wdXRfbGluZSkKKwkJCQlpbnB1dF9saW5lID0gZnAucmVhZGxpbmUoKQorCQkJCWNvbnRpbnVlOworCisJCQljb21taXQgPSBDb21taXQoY29tbWl0X2xpbmVzKQorCQkJaWYgKGNvbW1pdCAhPSBOb25lICk6CisJCQkJc2VsZi5jb21taXRzLmFwcGVuZChjb21taXQpCisKKwkJCSMgU2tpcCB0aGUgJ1wwCisJCQljb21taXRfbGluZXMgPSBbXQorCQkJY29tbWl0X2xpbmVzLmFwcGVuZChpbnB1dF9saW5lWzE6XSkKKwkJCWlucHV0X2xpbmUgPSBmcC5yZWFkbGluZSgpCisKKwkJZnAuY2xvc2UoKQorCisJCWZvciBjb21taXQgaW4gc2VsZi5jb21taXRzOgorCQkJKG91dF9saW5lLCBsYXN0X2NvbG91ciwgbGFzdF9ub2RlcG9zKSA9IHNlbGYuZHJhd19ncmFwaChjb21taXQsCisJCQkJCQkJCQkJaW5kZXgsIG91dF9saW5lLAorCQkJCQkJCQkJCWxhc3RfY29sb3VyLAorCQkJCQkJCQkJCWxhc3Rfbm9kZXBvcykKKwkJCXNlbGYuaW5kZXhbY29tbWl0LmNvbW1pdF9zaGExXSA9IGluZGV4CisJCQlpbmRleCArPSAxCisKKwkJc2VsZi50cmVldmlldy5zZXRfbW9kZWwoc2VsZi5tb2RlbCkKKwkJc2VsZi50cmVldmlldy5zaG93KCkKKworCWRlZiBkcmF3X2dyYXBoKHNlbGYsIGNvbW1pdCwgaW5kZXgsIG91dF9saW5lLCBsYXN0X2NvbG91ciwgbGFzdF9ub2RlcG9zKToKKwkJaW5fbGluZT1bXQorCisJCSMgICB8ICAgLT4gb3V0bGluZQorCQkjICAgWAorCQkjICAgfFwgIDwtIGlubGluZQorCisJCSMgUmVzZXQgbm9kZXBvc3Rpb24KKwkJaWYgKGxhc3Rfbm9kZXBvcyA+IDUpOgorCQkJbGFzdF9ub2RlcG9zID0gLTEKKworCQkjIEFkZCB0aGUgaW5jb21wbGV0ZSBsaW5lcyBvZiB0aGUgbGFzdCBjZWxsIGluIHRoaXMKKwkJdHJ5OgorCQkJY29sb3VyID0gc2VsZi5jb2xvdXJzW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5jb2xvdXJzW2NvbW1pdC5jb21taXRfc2hhMV0gPSBsYXN0X2NvbG91cisxCisJCQlsYXN0X2NvbG91ciA9IHNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdCisJCQljb2xvdXIgPSAgIHNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdCisKKwkJdHJ5OgorCQkJbm9kZV9wb3MgPSBzZWxmLm5vZGVwb3NbY29tbWl0LmNvbW1pdF9zaGExXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlzZWxmLm5vZGVwb3NbY29tbWl0LmNvbW1pdF9zaGExXSA9IGxhc3Rfbm9kZXBvcysxCisJCQlsYXN0X25vZGVwb3MgPSBzZWxmLm5vZGVwb3NbY29tbWl0LmNvbW1pdF9zaGExXQorCQkJbm9kZV9wb3MgPSAgc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0KKworCQkjVGhlIGZpcnN0IHBhcmVudCBhbHdheXMgY29udGludWUgb24gdGhlIHNhbWUgbGluZQorCQl0cnk6CisJCQkjIGNoZWNrIHdlIGFscmVheSBoYXZlIHRoZSB2YWx1ZQorCQkJdG1wX25vZGVfcG9zID0gc2VsZi5ub2RlcG9zW2NvbW1pdC5wYXJlbnRfc2hhMVswXV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5jb2xvdXJzW2NvbW1pdC5wYXJlbnRfc2hhMVswXV0gPSBjb2xvdXIKKwkJCXNlbGYubm9kZXBvc1tjb21taXQucGFyZW50X3NoYTFbMF1dID0gbm9kZV9wb3MKKworCQlmb3Igc2hhMSBpbiBzZWxmLmluY29tcGxldGVfbGluZS5rZXlzKCk6CisJCQlpZiAoc2hhMSAhPSBjb21taXQuY29tbWl0X3NoYTEpOgorCQkJCXNlbGYuZHJhd19pbmNvbXBsZXRlX2xpbmUoc2hhMSwgbm9kZV9wb3MsCisJCQkJCQlvdXRfbGluZSwgaW5fbGluZSwgaW5kZXgpCisJCQllbHNlOgorCQkJCWRlbCBzZWxmLmluY29tcGxldGVfbGluZVtzaGExXQorCisKKwkJZm9yIHBhcmVudF9pZCBpbiBjb21taXQucGFyZW50X3NoYTE6CisJCQl0cnk6CisJCQkJdG1wX25vZGVfcG9zID0gc2VsZi5ub2RlcG9zW3BhcmVudF9pZF0KKwkJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCQlzZWxmLmNvbG91cnNbcGFyZW50X2lkXSA9IGxhc3RfY29sb3VyKzEKKwkJCQlsYXN0X2NvbG91ciA9IHNlbGYuY29sb3Vyc1twYXJlbnRfaWRdCisJCQkJc2VsZi5ub2RlcG9zW3BhcmVudF9pZF0gPSBsYXN0X25vZGVwb3MrMQorCQkJCWxhc3Rfbm9kZXBvcyA9IHNlbGYubm9kZXBvc1twYXJlbnRfaWRdCisKKwkJCWluX2xpbmUuYXBwZW5kKChub2RlX3Bvcywgc2VsZi5ub2RlcG9zW3BhcmVudF9pZF0sCisJCQkJCQlzZWxmLmNvbG91cnNbcGFyZW50X2lkXSkpCisJCQlzZWxmLmFkZF9pbmNvbXBsZXRlX2xpbmUocGFyZW50X2lkKQorCisJCXRyeToKKwkJCWJyYW5jaF90YWcgPSBzZWxmLmJ0X3NoYTFbY29tbWl0LmNvbW1pdF9zaGExXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlicmFuY2hfdGFnID0gWyBdCisKKworCQlub2RlID0gKG5vZGVfcG9zLCBjb2xvdXIsIGJyYW5jaF90YWcpCisKKwkJc2VsZi5tb2RlbC5hcHBlbmQoW2NvbW1pdCwgbm9kZSwgb3V0X2xpbmUsIGluX2xpbmUsCisJCQkJY29tbWl0Lm1lc3NhZ2UsIGNvbW1pdC5hdXRob3IsIGNvbW1pdC5kYXRlXSkKKworCQlyZXR1cm4gKGluX2xpbmUsIGxhc3RfY29sb3VyLCBsYXN0X25vZGVwb3MpCisKKwlkZWYgYWRkX2luY29tcGxldGVfbGluZShzZWxmLCBzaGExKToKKwkJdHJ5OgorCQkJc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV0uYXBwZW5kKHNlbGYubm9kZXBvc1tzaGExXSkKKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV0gPSBbc2VsZi5ub2RlcG9zW3NoYTFdXQorCisJZGVmIGRyYXdfaW5jb21wbGV0ZV9saW5lKHNlbGYsIHNoYTEsIG5vZGVfcG9zLCBvdXRfbGluZSwgaW5fbGluZSwgaW5kZXgpOgorCQlmb3IgaWR4LCBwb3MgaW4gZW51bWVyYXRlKHNlbGYuaW5jb21wbGV0ZV9saW5lW3NoYTFdKToKKwkJCWlmKHBvcyA9PSBub2RlX3Bvcyk6CisJCQkJI3JlbW92ZSB0aGUgc3RyYWlnaHQgbGluZSBhbmQgYWRkIGEgc2xhc2gKKwkJCQlpZiAoKHBvcywgcG9zLCBzZWxmLmNvbG91cnNbc2hhMV0pIGluIG91dF9saW5lKToKKwkJCQkJb3V0X2xpbmUucmVtb3ZlKChwb3MsIHBvcywgc2VsZi5jb2xvdXJzW3NoYTFdKSkKKwkJCQlvdXRfbGluZS5hcHBlbmQoKHBvcywgcG9zKzAuNSwgc2VsZi5jb2xvdXJzW3NoYTFdKSkKKwkJCQlzZWxmLmluY29tcGxldGVfbGluZVtzaGExXVtpZHhdID0gcG9zID0gcG9zKzAuNQorCQkJdHJ5OgorCQkJCW5leHRfY29tbWl0ID0gc2VsZi5jb21taXRzW2luZGV4KzFdCisJCQkJaWYgKG5leHRfY29tbWl0LmNvbW1pdF9zaGExID09IHNoYTEgYW5kIHBvcyAhPSBpbnQocG9zKSk6CisJCQkJIyBqb2luIHRoZSBsaW5lIGJhY2sgdG8gdGhlIG5vZGUgcG9pbnQKKwkJCQkjIFRoaXMgbmVlZCB0byBiZSBkb25lIG9ubHkgaWYgd2UgbW9kaWZpZWQgaXQKKwkJCQkJaW5fbGluZS5hcHBlbmQoKHBvcywgcG9zLTAuNSwgc2VsZi5jb2xvdXJzW3NoYTFdKSkKKwkJCQkJY29udGludWU7CisJCQlleGNlcHQgSW5kZXhFcnJvcjoKKwkJCQlwYXNzCisJCQlpbl9saW5lLmFwcGVuZCgocG9zLCBwb3MsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisKKworCWRlZiBfZ29fY2xpY2tlZF9jYihzZWxmLCB3aWRnZXQsIHJldmlkKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIGdvIGJ1dHRvbiBmb3IgYSBwYXJlbnQgaXMgY2xpY2tlZC4iIiIKKwkJdHJ5OgorCQkJc2VsZi50cmVldmlldy5zZXRfY3Vyc29yKHNlbGYuaW5kZXhbcmV2aWRdKQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlkaWFsb2cgPSBndGsuTWVzc2FnZURpYWxvZyhwYXJlbnQ9Tm9uZSwgZmxhZ3M9MCwKKwkJCQkJdHlwZT1ndGsuTUVTU0FHRV9XQVJOSU5HLCBidXR0b25zPWd0ay5CVVRUT05TX0NMT1NFLAorCQkJCQltZXNzYWdlX2Zvcm1hdD1Ob25lKQorCQkJZGlhbG9nLnNldF9tYXJrdXAoIlJldmlzaW9uIDxiPiVzPC9iPiBub3QgcHJlc2VudCBpbiB0aGUgbGlzdCIgJSByZXZpZCkKKwkJCSMgcmV2aWQgPT0gMCBpcyB0aGUgcGFyZW50IG9mIHRoZSBmaXJzdCBjb21taXQKKwkJCWlmIChyZXZpZCAhPSAwICk6CisJCQkJZGlhbG9nLmZvcm1hdF9zZWNvbmRhcnlfdGV4dCgiVHJ5IHJ1bm5pbmcgZ2l0dmlldyB3aXRob3V0IGFueSBvcHRpb25zIikKKwkJCWRpYWxvZy5ydW4oKQorCQkJZGlhbG9nLmRlc3Ryb3koKQorCisJCXNlbGYudHJlZXZpZXcuZ3JhYl9mb2N1cygpCisKKwlkZWYgX3Nob3dfY2xpY2tlZF9jYihzZWxmLCB3aWRnZXQsICBjb21taXRfc2hhMSwgcGFyZW50X3NoYTEsIGVuY29kaW5nKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIHNob3cgYnV0dG9uIGZvciBhIHBhcmVudCBpcyBjbGlja2VkLiIiIgorCQl3aW5kb3cgPSBEaWZmV2luZG93KCkKKwkJd2luZG93LnNldF9kaWZmKGNvbW1pdF9zaGExLCBwYXJlbnRfc2hhMSwgZW5jb2RpbmcpCisJCXNlbGYudHJlZXZpZXcuZ3JhYl9mb2N1cygpCisKK3dpdGhvdXRfZGlmZiA9IDAKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisKKwlpZiAobGVuKHN5cy5hcmd2KSA+IDEgKToKKwkJaWYgKHN5cy5hcmd2WzFdID09ICItLXdpdGhvdXQtZGlmZiIpOgorCQkJd2l0aG91dF9kaWZmID0gMQorCisJdmlldyA9IEdpdFZpZXcoIHdpdGhvdXRfZGlmZiAhPSAxKQorCXZpZXcucnVuKHN5cy5hcmd2W3dpdGhvdXRfZGlmZjpdKQorCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3LnR4dCBiL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI0ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9naXR2aWV3L2dpdHZpZXcudHh0CkBAIC0wLDAgKzEsNDYgQEAKK2dpdHZpZXcoMSkKKz09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0dmlldyAtIEEgR1RLIGJhc2VkIHJlcG9zaXRvcnkgYnJvd3NlciBmb3IgZ2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdHZpZXcnICBbb3B0aW9uc10gW2FyZ3NdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0KKworRGVwZW5kZW5jaWVzCisKKyogUHl0aG9uIDIuNAorKiBQeUdUSyAyLjggb3IgbGF0ZXIKKyogUHlDYWlybyAxLjAgb3IgbGF0ZXIKKworT1BUSU9OUworLS0tLS0tCisJLS13aXRob3V0LWRpZmYKKwkJSWYgdGhlIHVzZXIgZG9lc24ndCB3YW50IHRvIGxpc3QgdGhlIGNvbW1pdCBkaWZmcyBpbiB0aGUgbWFpbiB3aW5kb3cuIFRoaXMgbWF5IHNwZWVkIHVwIHRoZSByZXBvc2l0b3J5IGJyb3dzaW5nLgorCisJPGFyZ3M+CisJCUFsbCB0aGUgdmFsaWQgb3B0aW9uIGZvciBnaXQtcmV2LWxpc3QoMSkKKwlLZXkgQmluZGluZ3M6CisJRjQ6CisJCVRvIG1heGltaXplIHRoZSB3aW5kb3cKKwlGNToKKwkJVG8gcmVyZWFkIHJlZmVyZW5jZXMuCisJRjExOgorCQlGdWxsIHNjcmVlbgorCUYxMjoKKwkJTGVhdmUgZnVsbCBzY3JlZW4KKworRVhBTVBMRVMKKy0tLS0tLQorCWdpdHZpZXcgdjIuNi4xMi4uIGluY2x1ZGUvc2NzaSBkcml2ZXJzL3Njc2kKKwkgIFNob3cgYXMgdGhlIGNoYW5nZXMgc2luY2UgdmVyc2lvbiB2Mi42LjEyIHRoYXQgY2hhbmdlZCBhbnkgZmlsZSBpbiB0aGUgaW5jbHVkZS9zY3NpCisJICBvciBkcml2ZXJzL3Njc2kgc3ViZGlyZWN0b3JpZXMKKworCWdpdHZpZXcgLS1zaW5jZT0yLndlZWtzLmFnbworCSAgU2hvdyB0aGUgY2hhbmdlcyBkdXJpbmcgdGhlIGxhc3QgdHdvIHdlZWtzCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcmVtb3RlczJjb25maWcuc2ggYi9jb250cmliL3JlbW90ZXMyY29uZmlnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTAxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3JlbW90ZXMyY29uZmlnLnNoCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorCisjIFVzZSB0aGlzIHRvb2wgdG8gcmV3cml0ZSB5b3VyIC5naXQvcmVtb3Rlcy8gZmlsZXMgaW50byB0aGUgY29uZmlnLgorCisuIGdpdC1zaC1zZXR1cAorCitpZiBbIC1kICIkR0lUX0RJUiIvcmVtb3RlcyBdOyB0aGVuCisJZWNobyAiUmV3cml0aW5nICRHSVRfRElSL3JlbW90ZXMiID4mMgorCWVycm9yPTAKKwkjIHJld3JpdGUgaW50byBjb25maWcKKwl7CisJCWNkICIkR0lUX0RJUiIvcmVtb3RlcworCQlscyB8IHdoaWxlIHJlYWQgZjsgZG8KKwkJCW5hbWU9JChlY2hvIC1uICIkZiIgfCB0ciAtYyAiQS1aYS16MC05IiAiLiIpCisJCQlzZWQgLW4gXAorCQkJLWUgInMvXlVSTDogXCguKlwpJC9yZW1vdGUuJG5hbWUudXJsIFwxIC4vcCIgXAorCQkJLWUgInMvXlB1bGw6IFwoLipcKSQvcmVtb3RlLiRuYW1lLmZldGNoIFwxIF4kIC9wIiBcCisJCQktZSAicy9eUHVzaDogXCguKlwpJC9yZW1vdGUuJG5hbWUucHVzaCBcMSBeJCAvcCIgXAorCQkJPCAiJGYiCisJCWRvbmUKKwkJZWNobyBkb25lCisJfSB8IHdoaWxlIHJlYWQga2V5IHZhbHVlIHJlZ2V4OyBkbworCQljYXNlICRrZXkgaW4KKwkJZG9uZSkKKwkJCWlmIFsgJGVycm9yID0gMCBdOyB0aGVuCisJCQkJbXYgIiRHSVRfRElSIi9yZW1vdGVzICIkR0lUX0RJUiIvcmVtb3Rlcy5vbGQKKwkJCWZpIDs7CisJCSopCisJCQllY2hvICJnaXQtcmVwby1jb25maWcgJGtleSAiJHZhbHVlIiAkcmVnZXgiCisJCQlnaXQtcmVwby1jb25maWcgJGtleSAiJHZhbHVlIiAkcmVnZXggfHwgZXJyb3I9MSA7OworCQllc2FjCisJZG9uZQorZmkKKworCmRpZmYgLS1naXQgYS9jb252ZXJ0LW9iamVjdHMuYyBiL2NvbnZlcnQtb2JqZWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2N2Q2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb252ZXJ0LW9iamVjdHMuYwpAQCAtMCwwICsxLDMzMiBAQAorI2RlZmluZSBfWE9QRU5fU09VUkNFIDUwMCAvKiBnbGliYzIgYW5kIEFJWCA1LjNMIG5lZWQgdGhpcyAqLworI2RlZmluZSBfWE9QRU5fU09VUkNFX0VYVEVOREVEIDEgLyogQUlYIDUuM0wgbmVlZHMgdGhpcyAqLworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKK3N0cnVjdCBlbnRyeSB7CisJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBuZXdfc2hhMVsyMF07CisJaW50IGNvbnZlcnRlZDsKK307CisKKyNkZWZpbmUgTUFYT0JKRUNUUyAoMTAwMDAwMCkKKworc3RhdGljIHN0cnVjdCBlbnRyeSAqY29udmVydFtNQVhPQkpFQ1RTXTsKK3N0YXRpYyBpbnQgbnJfY29udmVydDsKKworc3RhdGljIHN0cnVjdCBlbnRyeSAqIGNvbnZlcnRfZW50cnkodW5zaWduZWQgY2hhciAqc2hhMSk7CisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKmluc2VydF9uZXcodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IHBvcykKK3sKKwlzdHJ1Y3QgZW50cnkgKm5ldyA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBlbnRyeSkpOworCW1lbWNweShuZXctPm9sZF9zaGExLCBzaGExLCAyMCk7CisJbWVtbW92ZShjb252ZXJ0ICsgcG9zICsgMSwgY29udmVydCArIHBvcywgKG5yX2NvbnZlcnQgLSBwb3MpICogc2l6ZW9mKHN0cnVjdCBlbnRyeSAqKSk7CisJY29udmVydFtwb3NdID0gbmV3OworCW5yX2NvbnZlcnQrKzsKKwlpZiAobnJfY29udmVydCA9PSBNQVhPQkpFQ1RTKQorCQlkaWUoInlvdSdyZSBraWRkaW5nIG1lIC0gaGl0IG1heGltdW0gb2JqZWN0IGxpbWl0Iik7CisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIHN0cnVjdCBlbnRyeSAqbG9va3VwX2VudHJ5KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGxvdyA9IDAsIGhpZ2ggPSBucl9jb252ZXJ0OworCisJd2hpbGUgKGxvdyA8IGhpZ2gpIHsKKwkJaW50IG5leHQgPSAobG93ICsgaGlnaCkgLyAyOworCQlzdHJ1Y3QgZW50cnkgKm4gPSBjb252ZXJ0W25leHRdOworCQlpbnQgY21wID0gbWVtY21wKHNoYTEsIG4tPm9sZF9zaGExLCAyMCk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIG47CisJCWlmIChjbXAgPCAwKSB7CisJCQloaWdoID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxvdyA9IG5leHQrMTsKKwl9CisJcmV0dXJuIGluc2VydF9uZXcoc2hhMSwgbG93KTsKK30KKworc3RhdGljIHZvaWQgY29udmVydF9iaW5hcnlfc2hhMSh2b2lkICpidWZmZXIpCit7CisJc3RydWN0IGVudHJ5ICplbnRyeSA9IGNvbnZlcnRfZW50cnkoYnVmZmVyKTsKKwltZW1jcHkoYnVmZmVyLCBlbnRyeS0+bmV3X3NoYTEsIDIwKTsKK30KKworc3RhdGljIHZvaWQgY29udmVydF9hc2NpaV9zaGExKHZvaWQgKmJ1ZmZlcikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBlbnRyeSAqZW50cnk7CisKKwlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgc2hhMSkpCisJCWRpZSgiZXhwZWN0ZWQgc2hhMSwgZ290ICclcyciLCAoY2hhciopIGJ1ZmZlcik7CisJZW50cnkgPSBjb252ZXJ0X2VudHJ5KHNoYTEpOworCW1lbWNweShidWZmZXIsIHNoYTFfdG9faGV4KGVudHJ5LT5uZXdfc2hhMSksIDQwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjb252ZXJ0X21vZGUodW5zaWduZWQgaW50IG1vZGUpCit7CisJdW5zaWduZWQgaW50IG5ld21vZGU7CisKKwluZXdtb2RlID0gbW9kZSAmIFNfSUZNVDsKKwlpZiAoU19JU1JFRyhtb2RlKSkKKwkJbmV3bW9kZSB8PSAobW9kZSAmIDAxMDApID8gMDc1NSA6IDA2NDQ7CisJcmV0dXJuIG5ld21vZGU7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfc3ViZGlyZWN0b3J5KHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJY2hhciAqbmV3ID0geG1hbGxvYyhzaXplKTsKKwl1bnNpZ25lZCBsb25nIG5ld2xlbiA9IDA7CisJdW5zaWduZWQgbG9uZyB1c2VkOworCisJdXNlZCA9IDA7CisJd2hpbGUgKHNpemUpIHsKKwkJaW50IGxlbiA9IDIxICsgc3RybGVuKGJ1ZmZlcik7CisJCWNoYXIgKnBhdGggPSBzdHJjaHIoYnVmZmVyLCAnICcpOworCQl1bnNpZ25lZCBjaGFyICpzaGExOworCQl1bnNpZ25lZCBpbnQgbW9kZTsKKwkJY2hhciAqc2xhc2gsICpvcmlncGF0aDsKKworCQlpZiAoIXBhdGggfHwgc3NjYW5mKGJ1ZmZlciwgIiVvIiwgJm1vZGUpICE9IDEpCisJCQlkaWUoImJhZCB0cmVlIGNvbnZlcnNpb24iKTsKKwkJbW9kZSA9IGNvbnZlcnRfbW9kZShtb2RlKTsKKwkJcGF0aCsrOworCQlpZiAobWVtY21wKHBhdGgsIGJhc2UsIGJhc2VsZW4pKQorCQkJYnJlYWs7CisJCW9yaWdwYXRoID0gcGF0aDsKKwkJcGF0aCArPSBiYXNlbGVuOworCQlzbGFzaCA9IHN0cmNocihwYXRoLCAnLycpOworCQlpZiAoIXNsYXNoKSB7CisJCQluZXdsZW4gKz0gc3ByaW50ZihuZXcgKyBuZXdsZW4sICIlbyAlcyIsIG1vZGUsIHBhdGgpOworCQkJbmV3W25ld2xlbisrXSA9ICdcMCc7CisJCQltZW1jcHkobmV3ICsgbmV3bGVuLCBidWZmZXIgKyBsZW4gLSAyMCwgMjApOworCQkJbmV3bGVuICs9IDIwOworCisJCQl1c2VkICs9IGxlbjsKKwkJCXNpemUgLT0gbGVuOworCQkJYnVmZmVyICs9IGxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbmV3bGVuICs9IHNwcmludGYobmV3ICsgbmV3bGVuLCAiJW8gJS4qcyIsIFNfSUZESVIsIChpbnQpKHNsYXNoIC0gcGF0aCksIHBhdGgpOworCQluZXdbbmV3bGVuKytdID0gMDsKKwkJc2hhMSA9ICh1bnNpZ25lZCBjaGFyICopKG5ldyArIG5ld2xlbik7CisJCW5ld2xlbiArPSAyMDsKKworCQlsZW4gPSB3cml0ZV9zdWJkaXJlY3RvcnkoYnVmZmVyLCBzaXplLCBvcmlncGF0aCwgc2xhc2gtb3JpZ3BhdGgrMSwgc2hhMSk7CisKKwkJdXNlZCArPSBsZW47CisJCXNpemUgLT0gbGVuOworCQlidWZmZXIgKz0gbGVuOworCX0KKworCXdyaXRlX3NoYTFfZmlsZShuZXcsIG5ld2xlbiwgdHJlZV90eXBlLCByZXN1bHRfc2hhMSk7CisJZnJlZShuZXcpOworCXJldHVybiB1c2VkOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X3RyZWUodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCXZvaWQgKm9yaWdfYnVmZmVyID0gYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgb3JpZ19zaXplID0gc2l6ZTsKKworCXdoaWxlIChzaXplKSB7CisJCWludCBsZW4gPSAxK3N0cmxlbihidWZmZXIpOworCisJCWNvbnZlcnRfYmluYXJ5X3NoYTEoYnVmZmVyICsgbGVuKTsKKworCQlsZW4gKz0gMjA7CisJCWlmIChsZW4gPiBzaXplKQorCQkJZGllKCJjb3JydXB0IHRyZWUgb2JqZWN0Iik7CisJCXNpemUgLT0gbGVuOworCQlidWZmZXIgKz0gbGVuOworCX0KKworCXdyaXRlX3N1YmRpcmVjdG9yeShvcmlnX2J1ZmZlciwgb3JpZ19zaXplLCAiIiwgMCwgcmVzdWx0X3NoYTEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJzZV9vbGRzdHlsZV9kYXRlKGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwljaGFyIGMsICpwOworCWNoYXIgYnVmZmVyWzEwMF07CisJc3RydWN0IHRtIHRtOworCWNvbnN0IGNoYXIgKmZvcm1hdHNbXSA9IHsKKwkJIiVjIiwKKwkJIiVhICViICVkICVUIiwKKwkJIiVaIiwKKwkJIiVZIiwKKwkJIiAlWSIsCisJCU5VTEwKKwl9OworCS8qIFdlIG9ubHkgZXZlciBkaWQgdHdvIHRpbWV6b25lcyBpbiB0aGUgYmFkIG9sZCBmb3JtYXQgLi4gKi8KKwljb25zdCBjaGFyICp0aW1lem9uZXNbXSA9IHsKKwkJIlBEVCIsICJQU1QiLCAiQ0VTVCIsIE5VTEwKKwl9OworCWNvbnN0IGNoYXIgKipmbXQgPSBmb3JtYXRzOworCisJcCA9IGJ1ZmZlcjsKKwl3aGlsZSAoaXNzcGFjZShjID0gKmJ1ZikpCisJCWJ1ZisrOworCXdoaWxlICgoYyA9ICpidWYrKykgIT0gJ1xuJykKKwkJKnArKyA9IGM7CisJKnArKyA9IDA7CisJYnVmID0gYnVmZmVyOworCW1lbXNldCgmdG0sIDAsIHNpemVvZih0bSkpOworCWRvIHsKKwkJY29uc3QgY2hhciAqbmV4dCA9IHN0cnB0aW1lKGJ1ZiwgKmZtdCwgJnRtKTsKKwkJaWYgKG5leHQpIHsKKwkJCWlmICghKm5leHQpCisJCQkJcmV0dXJuIG1rdGltZSgmdG0pOworCQkJYnVmID0gbmV4dDsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0IGNoYXIgKipwID0gdGltZXpvbmVzOworCQkJd2hpbGUgKGlzc3BhY2UoKmJ1ZikpCisJCQkJYnVmKys7CisJCQl3aGlsZSAoKnApIHsKKwkJCQlpZiAoIW1lbWNtcChidWYsICpwLCBzdHJsZW4oKnApKSkgeworCQkJCQlidWYgKz0gc3RybGVuKCpwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXArKzsKKwkJCX0KKwkJfQorCQlmbXQrKzsKKwl9IHdoaWxlICgqYnVmICYmICpmbXQpOworCXByaW50ZigibGVmdDogJXNcbiIsIGJ1Zik7CisJcmV0dXJuIG1rdGltZSgmdG0pOwkJCQkKK30KKworc3RhdGljIGludCBjb252ZXJ0X2RhdGVfbGluZShjaGFyICpkc3QsIHZvaWQgKipidWYsIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICpzcDsKKwljaGFyICpsaW5lID0gKmJ1ZjsKKwljaGFyICpuZXh0ID0gc3RyY2hyKGxpbmUsICdcbicpOworCWNoYXIgKmRhdGUgPSBzdHJjaHIobGluZSwgJz4nKTsKKwlpbnQgbGVuOworCisJaWYgKCFuZXh0IHx8ICFkYXRlKQorCQlkaWUoIm1pc3Npbmcgb3IgYmFkIGF1dGhvci9jb21taXR0ZXIgbGluZSAlcyIsIGxpbmUpOworCW5leHQrKzsgZGF0ZSArPSAyOworCisJKmJ1ZiA9IG5leHQ7CisJKnNwID0gc2l6ZSAtIChuZXh0IC0gbGluZSk7CisKKwlsZW4gPSBkYXRlIC0gbGluZTsKKwltZW1jcHkoZHN0LCBsaW5lLCBsZW4pOworCWRzdCArPSBsZW47CisKKwkvKiBJcyBpdCBhbHJlYWR5IGluIG5ldyBmb3JtYXQ/ICovCisJaWYgKGlzZGlnaXQoKmRhdGUpKSB7CisJCWludCBkYXRlbGVuID0gbmV4dCAtIGRhdGU7CisJCW1lbWNweShkc3QsIGRhdGUsIGRhdGVsZW4pOworCQlyZXR1cm4gbGVuICsgZGF0ZWxlbjsKKwl9CisKKwkvKgorCSAqIEhhY2t5IGhhY2t5OiBvbmUgb2YgdGhlIHNwYXJzZSBvbGQtc3R5bGUgY29tbWl0cyBkb2VzIG5vdCBoYXZlCisJICogYW55IGRhdGUgYXQgYWxsLCBidXQgd2UgY2FuIGZha2UgaXQgYnkgdXNpbmcgdGhlIGNvbW1pdHRlciBkYXRlLgorCSAqLworCWlmICgqZGF0ZSA9PSAnXG4nICYmIHN0cmNocihuZXh0LCAnPicpKQorCQlkYXRlID0gc3RyY2hyKG5leHQsICc+JykrMjsKKworCXJldHVybiBsZW4gKyBzcHJpbnRmKGRzdCwgIiVsdSAtMDcwMFxuIiwgcGFyc2Vfb2xkc3R5bGVfZGF0ZShkYXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfZGF0ZSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJY2hhciAqbmV3ID0geG1hbGxvYyhzaXplICsgMTAwKTsKKwl1bnNpZ25lZCBsb25nIG5ld2xlbiA9IDA7CisJCisJLy8gInRyZWUgPHNoYTE+XG4iCisJbWVtY3B5KG5ldyArIG5ld2xlbiwgYnVmZmVyLCA0Nik7CisJbmV3bGVuICs9IDQ2OworCWJ1ZmZlciArPSA0NjsKKwlzaXplIC09IDQ2OworCisJLy8gInBhcmVudCA8c2hhMT5cbiIKKwl3aGlsZSAoIW1lbWNtcChidWZmZXIsICJwYXJlbnQgIiwgNykpIHsKKwkJbWVtY3B5KG5ldyArIG5ld2xlbiwgYnVmZmVyLCA0OCk7CisJCW5ld2xlbiArPSA0ODsKKwkJYnVmZmVyICs9IDQ4OworCQlzaXplIC09IDQ4OworCX0KKworCS8vICJhdXRob3IgeHl6IDx4eXo+IGRhdGUiCisJbmV3bGVuICs9IGNvbnZlcnRfZGF0ZV9saW5lKG5ldyArIG5ld2xlbiwgJmJ1ZmZlciwgJnNpemUpOworCS8vICJjb21taXR0ZXIgeHl6IDx4eXo+IGRhdGUiCisJbmV3bGVuICs9IGNvbnZlcnRfZGF0ZV9saW5lKG5ldyArIG5ld2xlbiwgJmJ1ZmZlciwgJnNpemUpOworCisJLy8gUmVzdAorCW1lbWNweShuZXcgKyBuZXdsZW4sIGJ1ZmZlciwgc2l6ZSk7CisJbmV3bGVuICs9IHNpemU7CisKKwl3cml0ZV9zaGExX2ZpbGUobmV3LCBuZXdsZW4sIGNvbW1pdF90eXBlLCByZXN1bHRfc2hhMSk7CisJZnJlZShuZXcpOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X2NvbW1pdCh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJdm9pZCAqb3JpZ19idWZmZXIgPSBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NpemUgPSBzaXplOworCisJaWYgKG1lbWNtcChidWZmZXIsICJ0cmVlICIsIDUpKQorCQlkaWUoIkJhZCBjb21taXQgJyVzJyIsIChjaGFyKikgYnVmZmVyKTsKKwljb252ZXJ0X2FzY2lpX3NoYTEoYnVmZmVyKzUpOworCWJ1ZmZlciArPSA0NjsgICAgLyogInRyZWUgIiArICJoZXggc2hhMSIgKyAiXG4iICovCisJd2hpbGUgKCFtZW1jbXAoYnVmZmVyLCAicGFyZW50ICIsIDcpKSB7CisJCWNvbnZlcnRfYXNjaWlfc2hhMShidWZmZXIrNyk7CisJCWJ1ZmZlciArPSA0ODsKKwl9CisJY29udmVydF9kYXRlKG9yaWdfYnVmZmVyLCBvcmlnX3NpemUsIHJlc3VsdF9zaGExKTsKK30KKworc3RhdGljIHN0cnVjdCBlbnRyeSAqIGNvbnZlcnRfZW50cnkodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5ID0gbG9va3VwX2VudHJ5KHNoYTEpOworCWNoYXIgdHlwZVsyMF07CisJdm9pZCAqYnVmZmVyLCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlpZiAoZW50cnktPmNvbnZlcnRlZCkKKwkJcmV0dXJuIGVudHJ5OworCWRhdGEgPSByZWFkX3NoYTFfZmlsZShzaGExLCB0eXBlLCAmc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlkaWUoInVuYWJsZSB0byByZWFkIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisKKwlpZiAoIXN0cmNtcCh0eXBlLCBibG9iX3R5cGUpKSB7CisJCXdyaXRlX3NoYTFfZmlsZShidWZmZXIsIHNpemUsIGJsb2JfdHlwZSwgZW50cnktPm5ld19zaGExKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgdHJlZV90eXBlKSkKKwkJY29udmVydF90cmVlKGJ1ZmZlciwgc2l6ZSwgZW50cnktPm5ld19zaGExKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsIGNvbW1pdF90eXBlKSkKKwkJY29udmVydF9jb21taXQoYnVmZmVyLCBzaXplLCBlbnRyeS0+bmV3X3NoYTEpOworCWVsc2UKKwkJZGllKCJ1bmtub3duIG9iamVjdCB0eXBlICclcycgaW4gJXMiLCB0eXBlLCBzaGExX3RvX2hleChzaGExKSk7CisJZW50cnktPmNvbnZlcnRlZCA9IDE7CisJZnJlZShidWZmZXIpOworCWZyZWUoZGF0YSk7CisJcmV0dXJuIGVudHJ5OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5OworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoImdpdC1jb252ZXJ0LW9iamVjdHMgPHNoYTE+Iik7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisKKwllbnRyeSA9IGNvbnZlcnRfZW50cnkoc2hhMSk7CisJcHJpbnRmKCJuZXcgc2hhMTogJXNcbiIsIHNoYTFfdG9faGV4KGVudHJ5LT5uZXdfc2hhMSkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29weS5jIGIvY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3B5LmMKQEAgLTAsMCArMSwzOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBjb3B5X2ZkKGludCBpZmQsIGludCBvZmQpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IGxlbjsKKwkJY2hhciBidWZmZXJbODE5Ml07CisJCWNoYXIgKmJ1ZiA9IGJ1ZmZlcjsKKwkJbGVuID0geHJlYWQoaWZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCWludCByZWFkX2Vycm9yOworCQkJcmVhZF9lcnJvciA9IGVycm5vOworCQkJY2xvc2UoaWZkKTsKKwkJCXJldHVybiBlcnJvcigiY29weS1mZDogcmVhZCByZXR1cm5lZCAlcyIsCisJCQkJICAgICBzdHJlcnJvcihyZWFkX2Vycm9yKSk7CisJCX0KKwkJd2hpbGUgKGxlbikgeworCQkJaW50IHdyaXR0ZW4gPSB4d3JpdGUob2ZkLCBidWYsIGxlbik7CisJCQlpZiAod3JpdHRlbiA+IDApIHsKKwkJCQlidWYgKz0gd3JpdHRlbjsKKwkJCQlsZW4gLT0gd3JpdHRlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKCF3cml0dGVuKSB7CisJCQkJY2xvc2UoaWZkKTsKKwkJCQlyZXR1cm4gZXJyb3IoImNvcHktZmQ6IHdyaXRlIHJldHVybmVkIDAiKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xvc2UoaWZkKTsKKwkJCQlyZXR1cm4gZXJyb3IoImNvcHktZmQ6IHdyaXRlIHJldHVybmVkICVzIiwKKwkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQl9CisJfQorCWNsb3NlKGlmZCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2NzdW0tZmlsZS5jIGIvY3N1bS1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5MjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2NzdW0tZmlsZS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogY3N1bS1maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyAqCisgKiBTaW1wbGUgZmlsZSB3cml0ZSBpbmZyYXN0cnVjdHVyZSBmb3Igd3JpdGluZyBTSEExLXN1bW1lZAorICogZmlsZXMuIFVzZWZ1bCB3aGVuIHlvdSB3cml0ZSBhIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBiZQorICogYWJsZSB0byB2ZXJpZnkgaGFzbid0IGJlZW4gbWVzc2VkIHdpdGggYWZ0ZXJ3YXJkcy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY3N1bS1maWxlLmgiCisKK3N0YXRpYyBpbnQgc2hhMWZsdXNoKHN0cnVjdCBzaGExZmlsZSAqZiwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXZvaWQgKmJ1ZiA9IGYtPmJ1ZmZlcjsKKworCWZvciAoOzspIHsKKwkJaW50IHJldCA9IHh3cml0ZShmLT5mZCwgYnVmLCBjb3VudCk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlidWYgKz0gcmV0OworCQkJY291bnQgLT0gcmV0OworCQkJaWYgKGNvdW50KQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFyZXQpCisJCQlkaWUoInNoYTEgZmlsZSAnJXMnIHdyaXRlIGVycm9yLiBPdXQgb2YgZGlza3NwYWNlIiwgZi0+bmFtZSk7CisJCWRpZSgic2hhMSBmaWxlICclcycgd3JpdGUgZXJyb3IgKCVzKSIsIGYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorfQorCitpbnQgc2hhMWNsb3NlKHN0cnVjdCBzaGExZmlsZSAqZiwgdW5zaWduZWQgY2hhciAqcmVzdWx0LCBpbnQgdXBkYXRlKQoreworCXVuc2lnbmVkIG9mZnNldCA9IGYtPm9mZnNldDsKKwlpZiAob2Zmc2V0KSB7CisJCVNIQTFfVXBkYXRlKCZmLT5jdHgsIGYtPmJ1ZmZlciwgb2Zmc2V0KTsKKwkJc2hhMWZsdXNoKGYsIG9mZnNldCk7CisJfQorCVNIQTFfRmluYWwoZi0+YnVmZmVyLCAmZi0+Y3R4KTsKKwlpZiAocmVzdWx0KQorCQltZW1jcHkocmVzdWx0LCBmLT5idWZmZXIsIDIwKTsKKwlpZiAodXBkYXRlKQorCQlzaGExZmx1c2goZiwgMjApOworCWlmIChjbG9zZShmLT5mZCkpCisJCWRpZSgiJXM6IHNoYTEgZmlsZSBlcnJvciBvbiBjbG9zZSAoJXMpIiwgZi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlmcmVlKGYpOworCXJldHVybiAwOworfQorCitpbnQgc2hhMXdyaXRlKHN0cnVjdCBzaGExZmlsZSAqZiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCXVuc2lnbmVkIG9mZnNldCA9IGYtPm9mZnNldDsKKwkJdW5zaWduZWQgbGVmdCA9IHNpemVvZihmLT5idWZmZXIpIC0gb2Zmc2V0OworCQl1bnNpZ25lZCBuciA9IGNvdW50ID4gbGVmdCA/IGxlZnQgOiBjb3VudDsKKworCQltZW1jcHkoZi0+YnVmZmVyICsgb2Zmc2V0LCBidWYsIG5yKTsKKwkJY291bnQgLT0gbnI7CisJCW9mZnNldCArPSBucjsKKwkJYnVmICs9IG5yOworCQlsZWZ0IC09IG5yOworCQlpZiAoIWxlZnQpIHsKKwkJCVNIQTFfVXBkYXRlKCZmLT5jdHgsIGYtPmJ1ZmZlciwgb2Zmc2V0KTsKKwkJCXNoYTFmbHVzaChmLCBvZmZzZXQpOworCQkJb2Zmc2V0ID0gMDsKKwkJfQorCQlmLT5vZmZzZXQgPSBvZmZzZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFjcmVhdGUoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IHNoYTFmaWxlICpmOworCXVuc2lnbmVkIGxlbjsKKwl2YV9saXN0IGFyZzsKKwlpbnQgZmQ7CisKKwlmID0geG1hbGxvYyhzaXplb2YoKmYpKTsKKworCXZhX3N0YXJ0KGFyZywgZm10KTsKKwlsZW4gPSB2c25wcmludGYoZi0+bmFtZSwgc2l6ZW9mKGYtPm5hbWUpLCBmbXQsIGFyZyk7CisJdmFfZW5kKGFyZyk7CisJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJZGllKCJ5b3Ugd2FzY2FsbHkgd2FiYml0LCB5b3UiKTsKKwlmLT5uYW1lbGVuID0gbGVuOworCisJZmQgPSBvcGVuKGYtPm5hbWUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gb3BlbiAlcyAoJXMpIiwgZi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlmLT5mZCA9IGZkOworCWYtPmVycm9yID0gMDsKKwlmLT5vZmZzZXQgPSAwOworCVNIQTFfSW5pdCgmZi0+Y3R4KTsKKwlyZXR1cm4gZjsKK30KKworc3RydWN0IHNoYTFmaWxlICpzaGExZmQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzaGExZmlsZSAqZjsKKwl1bnNpZ25lZCBsZW47CisKKwlmID0geG1hbGxvYyhzaXplb2YoKmYpKTsKKworCWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlkaWUoInlvdSB3YXNjYWxseSB3YWJiaXQsIHlvdSIpOworCWYtPm5hbWVsZW4gPSBsZW47CisJbWVtY3B5KGYtPm5hbWUsIG5hbWUsIGxlbisxKTsKKworCWYtPmZkID0gZmQ7CisJZi0+ZXJyb3IgPSAwOworCWYtPm9mZnNldCA9IDA7CisJU0hBMV9Jbml0KCZmLT5jdHgpOworCXJldHVybiBmOworfQorCitpbnQgc2hhMXdyaXRlX2NvbXByZXNzZWQoc3RydWN0IHNoYTFmaWxlICpmLCB2b2lkICppbiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJel9zdHJlYW0gc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgbWF4c2l6ZTsKKwl2b2lkICpvdXQ7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCWRlZmxhdGVJbml0KCZzdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CisJbWF4c2l6ZSA9IGRlZmxhdGVCb3VuZCgmc3RyZWFtLCBzaXplKTsKKwlvdXQgPSB4bWFsbG9jKG1heHNpemUpOworCisJLyogQ29tcHJlc3MgaXQgKi8KKwlzdHJlYW0ubmV4dF9pbiA9IGluOworCXN0cmVhbS5hdmFpbF9pbiA9IHNpemU7CisKKwlzdHJlYW0ubmV4dF9vdXQgPSBvdXQ7CisJc3RyZWFtLmF2YWlsX291dCA9IG1heHNpemU7CisKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKwlkZWZsYXRlRW5kKCZzdHJlYW0pOworCisJc2l6ZSA9IHN0cmVhbS50b3RhbF9vdXQ7CisJc2hhMXdyaXRlKGYsIG91dCwgc2l6ZSk7CisJZnJlZShvdXQpOworCXJldHVybiBzaXplOworfQorCisKZGlmZiAtLWdpdCBhL2NzdW0tZmlsZS5oIGIvY3N1bS1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkMWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2NzdW0tZmlsZS5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgQ1NVTV9GSUxFX0gKKyNkZWZpbmUgQ1NVTV9GSUxFX0gKKworLyogQSBTSEExLXByb3RlY3RlZCBmaWxlICovCitzdHJ1Y3Qgc2hhMWZpbGUgeworCWludCBmZCwgZXJyb3I7CisJdW5zaWduZWQgaW50IG9mZnNldCwgbmFtZWxlbjsKKwlTSEFfQ1RYIGN0eDsKKwljaGFyIG5hbWVbUEFUSF9NQVhdOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzgxOTJdOworfTsKKworZXh0ZXJuIHN0cnVjdCBzaGExZmlsZSAqc2hhMWZkKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gc3RydWN0IHNoYTFmaWxlICpzaGExY3JlYXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBpbnQgc2hhMWNsb3NlKHN0cnVjdCBzaGExZmlsZSAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitleHRlcm4gaW50IHNoYTF3cml0ZShzdHJ1Y3Qgc2hhMWZpbGUgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBzaGExd3JpdGVfY29tcHJlc3NlZChzdHJ1Y3Qgc2hhMWZpbGUgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2N0eXBlLmMgYi9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YmRmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jdHlwZS5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBTYW5lIGxvY2FsZS1pbmRlcGVuZGVudCwgQVNDSUkgY3R5cGUuCisgKgorICogTm8gc3VycHJpc2VzLCBhbmQgd29ya3Mgd2l0aCBzaWduZWQgYW5kIHVuc2lnbmVkIGNoYXJzLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2RlZmluZSBTUyBHSVRfU1BBQ0UKKyNkZWZpbmUgQUEgR0lUX0FMUEhBCisjZGVmaW5lIEREIEdJVF9ESUdJVAorCit1bnNpZ25lZCBjaGFyIHNhbmVfY3R5cGVbMjU2XSA9IHsKKwkgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCBTUywgU1MsICAwLCAgMCwgU1MsICAwLCAgMCwJCS8qIDAtMTUgKi8KKwkgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDE2LTE1ICovCisJU1MsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCQkvKiAzMi0xNSAqLworCURELCBERCwgREQsIERELCBERCwgREQsIERELCBERCwgREQsIERELCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAkJLyogNDgtMTUgKi8KKwkgMCwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwJCS8qIDY0LTE1ICovCisJQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCAgMCwgIDAsICAwLCAgMCwgIDAsCQkvKiA4MC0xNSAqLworCSAwLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLAkJLyogOTYtMTUgKi8KKwlBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDExMi0xNSAqLworCS8qIE5vdGhpbmcgaW4gdGhlIDEyOC4uIHJhbmdlICovCit9OworCmRpZmYgLS1naXQgYS9kYWVtb24uYyBiL2RhZW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMDNmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb24uYwpAQCAtMCwwICsxLDc1OSBAQAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKworc3RhdGljIGludCBsb2dfc3lzbG9nOworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCByZXVzZWFkZHI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGRhZW1vbl91c2FnZVtdID0KKyJnaXQtZGFlbW9uIFstLXZlcmJvc2VdIFstLXN5c2xvZ10gWy0taW5ldGQgfCAtLXBvcnQ9bl0gWy0tZXhwb3J0LWFsbF1cbiIKKyIgICAgICAgICAgIFstLXRpbWVvdXQ9bl0gWy0taW5pdC10aW1lb3V0PW5dIFstLXN0cmljdC1wYXRoc11cbiIKKyIgICAgICAgICAgIFstLWJhc2UtcGF0aD1wYXRoXSBbLS11c2VyLXBhdGggfCAtLXVzZXItcGF0aD1wYXRoXVxuIgorIiAgICAgICAgICAgWy0tcmV1c2VhZGRyXSBbZGlyZWN0b3J5Li4uXSI7CisKKy8qIExpc3Qgb2YgYWNjZXB0YWJsZSBwYXRobmFtZSBwcmVmaXhlcyAqLworc3RhdGljIGNoYXIgKipva19wYXRocyA9IE5VTEw7CitzdGF0aWMgaW50IHN0cmljdF9wYXRocyA9IDA7CisKKy8qIElmIHRoaXMgaXMgc2V0LCBnaXQtZGFlbW9uLWV4cG9ydC1vayBpcyBub3QgcmVxdWlyZWQgKi8KK3N0YXRpYyBpbnQgZXhwb3J0X2FsbF90cmVlcyA9IDA7CisKKy8qIFRha2UgYWxsIHBhdGhzIHJlbGF0aXZlIHRvIHRoaXMgb25lIGlmIG5vbi1OVUxMICovCitzdGF0aWMgY2hhciAqYmFzZV9wYXRoID0gTlVMTDsKKworLyogSWYgZGVmaW5lZCwgfnVzZXIgbm90YXRpb24gaXMgYWxsb3dlZCBhbmQgdGhlIHN0cmluZyBpcyBpbnNlcnRlZAorICogYWZ0ZXIgfnVzZXIvLiAgRS5nLiBhIHJlcXVlc3QgdG8gZ2l0Oi8vaG9zdC9+YWxpY2UvZnJvdHogd291bGQKKyAqIGdvIHRvIC9ob21lL2FsaWNlL3B1Yl9naXQvZnJvdHogd2l0aCAtLXVzZXItcGF0aD1wdWJfZ2l0LgorICovCitzdGF0aWMgY2hhciAqdXNlcl9wYXRoID0gTlVMTDsKKworLyogVGltZW91dCwgYW5kIGluaXRpYWwgdGltZW91dCAqLworc3RhdGljIHVuc2lnbmVkIGludCB0aW1lb3V0ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF90aW1lb3V0ID0gMDsKKworc3RhdGljIHZvaWQgbG9ncmVwb3J0KGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwkvKiBXZSBzaG91bGQgZG8gYSBzaW5nbGUgd3JpdGUgc28gdGhhdCBpdCBpcyBhdG9taWMgYW5kIG91dHB1dAorCSAqIG9mIHNldmVyYWwgcHJvY2Vzc2VzIGRvIG5vdCBnZXQgaW50ZXJtaW5nbGVkLiAqLworCWNoYXIgYnVmWzEwMjRdOworCWludCBidWZsZW47CisJaW50IG1heGxlbiwgbXNnbGVuOworCisJLyogc2l6ZW9mKGJ1Zikgc2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yICJbcGlkXSBcbiIgKi8KKwlidWZsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiWyVsZF0gIiwgKGxvbmcpIGdldHBpZCgpKTsKKworCW1heGxlbiA9IHNpemVvZihidWYpIC0gYnVmbGVuIC0gMTsgLyogLTEgZm9yIG91ciBvd24gTEYgKi8KKwltc2dsZW4gPSB2c25wcmludGYoYnVmICsgYnVmbGVuLCBtYXhsZW4sIGVyciwgcGFyYW1zKTsKKworCWlmIChsb2dfc3lzbG9nKSB7CisJCXN5c2xvZyhwcmlvcml0eSwgIiVzIiwgYnVmKTsKKwkJcmV0dXJuOworCX0KKworCS8qIG1heGxlbiBjb3VudGVkIG91ciBvd24gTEYgYnV0IGFsc28gY291bnRzIHNwYWNlIGdpdmVuIHRvCisJICogdnNucHJpbnRmIGZvciB0aGUgdGVybWluYXRpbmcgTlVMLiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdAorCSAqIHdlIGhhdmUgc3BhY2UgZm9yIG91ciBvd24gTEYgYW5kIE5VTCBhZnRlciB0aGUgIm1lYXQiIG9mIHRoZQorCSAqIG1lc3NhZ2UsIHNvIHRydW5jYXRlIGl0IGF0IG1heGxlbiAtIDEuCisJICovCisJaWYgKG1zZ2xlbiA+IG1heGxlbiAtIDEpCisJCW1zZ2xlbiA9IG1heGxlbiAtIDE7CisJZWxzZSBpZiAobXNnbGVuIDwgMCkKKwkJbXNnbGVuID0gMDsgLyogUHJvdGVjdCBhZ2FpbnN0IHdlaXJkIHJldHVybiB2YWx1ZXMuICovCisJYnVmbGVuICs9IG1zZ2xlbjsKKworCWJ1ZltidWZsZW4rK10gPSAnXG4nOworCWJ1ZltidWZsZW5dID0gJ1wwJzsKKworCXdyaXRlKDIsIGJ1ZiwgYnVmbGVuKTsKK30KKworc3RhdGljIHZvaWQgbG9nZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCWxvZ3JlcG9ydChMT0dfRVJSLCBlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ2luZm8oY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJaWYgKCF2ZXJib3NlKQorCQlyZXR1cm47CisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCWxvZ3JlcG9ydChMT0dfSU5GTywgZXJyLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworfQorCitzdGF0aWMgaW50IGF2b2lkX2FsaWFzKGNoYXIgKnApCit7CisJaW50IHNsLCBuZG90OworCisJLyogCisJICogVGhpcyByZXN1cnJlY3RzIHRoZSBiZWx0cyBhbmQgc3VzcGVuZGVycyBwYXJhbm9pYSBjaGVjayBieSBIUEEKKwkgKiBkb25lIGluIDw0MzU1NjBGNy40MDgwMDA2QHp5dG9yLmNvbT4gdGhyZWFkLCBub3cgZW50ZXJfcmVwbygpCisJICogZG9lcyBub3QgZG8gZ2V0Y3dkKCkgYmFzZWQgcGF0aCBjYW5vbmljYWxpemF0aW9ucy4KKwkgKgorCSAqIHNsIGJlY29tZXMgdHJ1ZSBpbW1lZGlhdGVseSBhZnRlciBzZWVpbmcgJy8nIGFuZCBjb250aW51ZXMgdG8KKwkgKiBiZSB0cnVlIGFzIGxvbmcgYXMgZG90cyBjb250aW51ZSBhZnRlciB0aGF0IHdpdGhvdXQgaW50ZXJ2ZW5pbmcKKwkgKiBub24tZG90IGNoYXJhY3Rlci4KKwkgKi8KKwlpZiAoIXAgfHwgKCpwICE9ICcvJyAmJiAqcCAhPSAnficpKQorCQlyZXR1cm4gLTE7CisJc2wgPSAxOyBuZG90ID0gMDsKKwlwKys7CisKKwl3aGlsZSAoMSkgeworCQljaGFyIGNoID0gKnArKzsKKwkJaWYgKHNsKSB7CisJCQlpZiAoY2ggPT0gJy4nKQorCQkJCW5kb3QrKzsKKwkJCWVsc2UgaWYgKGNoID09ICcvJykgeworCQkJCWlmIChuZG90IDwgMykKKwkJCQkJLyogcmVqZWN0IC8vLCAvLi8gYW5kIC8uLi8gKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCW5kb3QgPSAwOworCQkJfQorCQkJZWxzZSBpZiAoY2ggPT0gMCkgeworCQkJCWlmICgwIDwgbmRvdCAmJiBuZG90IDwgMykKKwkJCQkJLyogcmVqZWN0IC8uJCBhbmQgLy4uJCAqLworCQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQllbHNlCisJCQkJc2wgPSBuZG90ID0gMDsKKwkJfQorCQllbHNlIGlmIChjaCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKGNoID09ICcvJykgeworCQkJc2wgPSAxOworCQkJbmRvdCA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjaGFyICpwYXRoX29rKGNoYXIgKmRpcikKK3sKKwlzdGF0aWMgY2hhciBycGF0aFtQQVRIX01BWF07CisJY2hhciAqcGF0aDsKKworCWlmIChhdm9pZF9hbGlhcyhkaXIpKSB7CisJCWxvZ2Vycm9yKCInJXMnOiBhbGlhc2VkIiwgZGlyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCpkaXIgPT0gJ34nKSB7CisJCWlmICghdXNlcl9wYXRoKSB7CisJCQlsb2dlcnJvcigiJyVzJzogVXNlci1wYXRoIG5vdCBhbGxvd2VkIiwgZGlyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgqdXNlcl9wYXRoKSB7CisJCQkvKiBHb3QgZWl0aGVyICJ+YWxpY2UiIG9yICJ+YWxpY2UvZm9vIjsKKwkJCSAqIHJld3JpdGUgdGhlbSB0byAifmFsaWNlLyVzIiBvcgorCQkJICogIn5hbGljZS8lcy9mb28iLgorCQkJICovCisJCQlpbnQgbmFtbGVuLCByZXN0bGVuID0gc3RybGVuKGRpcik7CisJCQljaGFyICpzbGFzaCA9IHN0cmNocihkaXIsICcvJyk7CisJCQlpZiAoIXNsYXNoKQorCQkJCXNsYXNoID0gZGlyICsgcmVzdGxlbjsKKwkJCW5hbWxlbiA9IHNsYXNoIC0gZGlyOworCQkJcmVzdGxlbiAtPSBuYW1sZW47CisJCQlsb2dpbmZvKCJ1c2VycGF0aCA8JXM+LCByZXF1ZXN0IDwlcz4sIG5hbWxlbiAlZCwgcmVzdGxlbiAlZCwgc2xhc2ggPCVzPiIsIHVzZXJfcGF0aCwgZGlyLCBuYW1sZW4sIHJlc3RsZW4sIHNsYXNoKTsKKwkJCXNucHJpbnRmKHJwYXRoLCBQQVRIX01BWCwgIiUuKnMvJXMlLipzIiwKKwkJCQkgbmFtbGVuLCBkaXIsIHVzZXJfcGF0aCwgcmVzdGxlbiwgc2xhc2gpOworCQkJZGlyID0gcnBhdGg7CisJCX0KKwl9CisJZWxzZSBpZiAoYmFzZV9wYXRoKSB7CisJCWlmICgqZGlyICE9ICcvJykgeworCQkJLyogQWxsb3cgb25seSBhYnNvbHV0ZSAqLworCQkJbG9nZXJyb3IoIiclcyc6IE5vbi1hYnNvbHV0ZSBwYXRoIGRlbmllZCAoYmFzZS1wYXRoIGFjdGl2ZSkiLCBkaXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZWxzZSB7CisJCQlzbnByaW50ZihycGF0aCwgUEFUSF9NQVgsICIlcyVzIiwgYmFzZV9wYXRoLCBkaXIpOworCQkJZGlyID0gcnBhdGg7CisJCX0KKwl9CisKKwlwYXRoID0gZW50ZXJfcmVwbyhkaXIsIHN0cmljdF9wYXRocyk7CisKKwlpZiAoIXBhdGgpIHsKKwkJbG9nZXJyb3IoIiclcyc6IHVuYWJsZSB0byBjaGRpciBvciBub3QgYSBnaXQgYXJjaGl2ZSIsIGRpcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICggb2tfcGF0aHMgJiYgKm9rX3BhdGhzICkgeworCQljaGFyICoqcHA7CisJCWludCBwYXRobGVuID0gc3RybGVuKHBhdGgpOworCisJCS8qIFRoZSB2YWxpZGF0aW9uIGlzIGRvbmUgb24gdGhlIHBhdGhzIGFmdGVyIGVudGVyX3JlcG8KKwkJICogYXBwZW5kcyBvcHRpb25hbCB7LmdpdCwuZ2l0Ly5naXR9IGFuZCBmcmllbmRzLCBidXQgCisJCSAqIGl0IGRvZXMgbm90IHVzZSBnZXRjd2QoKS4gIFNvIGlmIHlvdXIgL3B1YiBpcworCQkgKiBhIHN5bWxpbmsgdG8gL21udC9wdWIsIHlvdSBjYW4gd2hpdGVsaXN0IC9wdWIgYW5kCisJCSAqIGRvIG5vdCBoYXZlIHRvIHNheSAvbW50L3B1Yi4KKwkJICogRG8gbm90IHNheSAvcHViLy4KKwkJICovCisJCWZvciAoIHBwID0gb2tfcGF0aHMgOyAqcHAgOyBwcCsrICkgeworCQkJaW50IGxlbiA9IHN0cmxlbigqcHApOworCQkJaWYgKGxlbiA8PSBwYXRobGVuICYmCisJCQkgICAgIW1lbWNtcCgqcHAsIHBhdGgsIGxlbikgJiYKKwkJCSAgICAocGF0aFtsZW5dID09ICdcMCcgfHwKKwkJCSAgICAgKCFzdHJpY3RfcGF0aHMgJiYgcGF0aFtsZW5dID09ICcvJykpKQorCQkJCXJldHVybiBwYXRoOworCQl9CisJfQorCWVsc2UgeworCQkvKiBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLworCQlpZiAoIXN0cmljdF9wYXRocykKKwkJCXJldHVybiBwYXRoOworCX0KKworCWxvZ2Vycm9yKCInJXMnOiBub3QgaW4gd2hpdGVsaXN0IiwgcGF0aCk7CisJcmV0dXJuIE5VTEw7CQkvKiBGYWxsdGhyb3VnaC4gRGVueSBieSBkZWZhdWx0ICovCit9CisKK3N0YXRpYyBpbnQgdXBsb2FkKGNoYXIgKmRpcikKK3sKKwkvKiBUaW1lb3V0IGFzIHN0cmluZyAqLworCWNoYXIgdGltZW91dF9idWZbNjRdOworCWNvbnN0IGNoYXIgKnBhdGg7CisKKwlsb2dpbmZvKCJSZXF1ZXN0IGZvciAnJXMnIiwgZGlyKTsKKworCWlmICghKHBhdGggPSBwYXRoX29rKGRpcikpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIFNlY3VyaXR5IG9uIHRoZSBjaGVhcC4KKwkgKgorCSAqIFdlIHdhbnQgYSByZWFkYWJsZSBIRUFELCB1c2FibGUgIm9iamVjdHMiIGRpcmVjdG9yeSwgYW5kCisJICogYSAiZ2l0LWRhZW1vbi1leHBvcnQtb2siIGZsYWcgdGhhdCBzYXlzIHRoYXQgdGhlIG90aGVyIHNpZGUKKwkgKiBpcyBvayB3aXRoIHVzIGRvaW5nIHRoaXMuCisJICoKKwkgKiBwYXRoX29rKCkgdXNlcyBlbnRlcl9yZXBvKCkgYW5kIGRvZXMgd2hpdGVsaXN0IGNoZWNraW5nLgorCSAqIFdlIG9ubHkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHJlcG9zaXRvcnkgaXMgZXhwb3J0ZWQuCisJICovCisKKwlpZiAoIWV4cG9ydF9hbGxfdHJlZXMgJiYgYWNjZXNzKCJnaXQtZGFlbW9uLWV4cG9ydC1vayIsIEZfT0spKSB7CisJCWxvZ2Vycm9yKCInJXMnOiByZXBvc2l0b3J5IG5vdCBleHBvcnRlZC4iLCBwYXRoKTsKKwkJZXJybm8gPSBFQUNDRVM7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFdlJ2xsIGlnbm9yZSBTSUdURVJNIGZyb20gbm93IG9uLCB3ZSBoYXZlIGEKKwkgKiBnb29kIGNsaWVudC4KKwkgKi8KKwlzaWduYWwoU0lHVEVSTSwgU0lHX0lHTik7CisKKwlzbnByaW50Zih0aW1lb3V0X2J1Ziwgc2l6ZW9mIHRpbWVvdXRfYnVmLCAiLS10aW1lb3V0PSV1IiwgdGltZW91dCk7CisKKwkvKiBnaXQtdXBsb2FkLXBhY2sgb25seSBldmVyIHJlYWRzIHN0dWZmLCBzbyB0aGlzIGlzIHNhZmUgKi8KKwlleGVjbF9naXRfY21kKCJ1cGxvYWQtcGFjayIsICItLXN0cmljdCIsIHRpbWVvdXRfYnVmLCAiLiIsIE5VTEwpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBleGVjdXRlKHZvaWQpCit7CisJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKKwlpbnQgcGt0bGVuLCBsZW47CisKKwlhbGFybShpbml0X3RpbWVvdXQgPyBpbml0X3RpbWVvdXQgOiB0aW1lb3V0KTsKKwlwa3RsZW4gPSBwYWNrZXRfcmVhZF9saW5lKDAsIGxpbmUsIHNpemVvZihsaW5lKSk7CisJYWxhcm0oMCk7CisKKwlsZW4gPSBzdHJsZW4obGluZSk7CisJaWYgKHBrdGxlbiAhPSBsZW4pCisJCWxvZ2luZm8oIkV4dGVuZGVkIGF0dHJpYnV0ZXMgKCVkIGJ5dGVzKSBleGlzdCA8JS4qcz4iLAorCQkJKGludCkgcGt0bGVuIC0gbGVuLAorCQkJKGludCkgcGt0bGVuIC0gbGVuLCBsaW5lICsgbGVuICsgMSk7CisJaWYgKGxlbiAmJiBsaW5lW2xlbi0xXSA9PSAnXG4nKQorCQlsaW5lWy0tbGVuXSA9IDA7CisKKwlpZiAoIXN0cm5jbXAoImdpdC11cGxvYWQtcGFjayAiLCBsaW5lLCAxNikpCisJCXJldHVybiB1cGxvYWQobGluZSsxNik7CisKKwlsb2dlcnJvcigiUHJvdG9jb2wgZXJyb3I6ICclcyciLCBsaW5lKTsKKwlyZXR1cm4gLTE7Cit9CisKKworLyoKKyAqIFdlIGNvdW50IHNwYXduZWQvcmVhcGVkIHNlcGFyYXRlbHksIGp1c3QgdG8gYXZvaWQgYW55CisgKiByYWNlcyB3aGVuIHVwZGF0aW5nIHRoZW0gZnJvbSBzaWduYWxzLiBUaGUgU0lHQ0hMRCBoYW5kbGVyCisgKiB3aWxsIG9ubHkgdXBkYXRlIGNoaWxkcmVuX3JlYXBlZCwgYW5kIHRoZSBmb3JrIGxvZ2ljIHdpbGwKKyAqIG9ubHkgdXBkYXRlIGNoaWxkcmVuX3NwYXduZWQuCisgKgorICogTUFYX0NISUxEUkVOIHNob3VsZCBiZSBhIHBvd2VyLW9mLXR3byB0byBtYWtlIHRoZSBtb2R1bHVzCisgKiBvcGVyYXRpb24gY2hlYXAuIEl0IHNob3VsZCBhbHNvIGJlIGF0IGxlYXN0IHR3aWNlCisgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2Ugd2lsbCBldmVyIGFsbG93LgorICovCisjZGVmaW5lIE1BWF9DSElMRFJFTiAxMjgKKworc3RhdGljIGludCBtYXhfY29ubmVjdGlvbnMgPSAyNTsKKworLyogVGhlc2UgYXJlIHVwZGF0ZWQgYnkgdGhlIHNpZ25hbCBoYW5kbGVyICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IGNoaWxkcmVuX3JlYXBlZCA9IDA7CitzdGF0aWMgcGlkX3QgZGVhZF9jaGlsZFtNQVhfQ0hJTERSRU5dOworCisvKiBUaGVzZSBhcmUgdXBkYXRlZCBieSB0aGUgbWFpbiBsb29wICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNoaWxkcmVuX3NwYXduZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjaGlsZHJlbl9kZWxldGVkID0gMDsKKworc3RhdGljIHN0cnVjdCBjaGlsZCB7CisJcGlkX3QgcGlkOworCWludCBhZGRybGVuOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7Cit9IGxpdmVfY2hpbGRbTUFYX0NISUxEUkVOXTsKKworc3RhdGljIHZvaWQgYWRkX2NoaWxkKGludCBpZHgsIHBpZF90IHBpZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlsaXZlX2NoaWxkW2lkeF0ucGlkID0gcGlkOworCWxpdmVfY2hpbGRbaWR4XS5hZGRybGVuID0gYWRkcmxlbjsKKwltZW1jcHkoJmxpdmVfY2hpbGRbaWR4XS5hZGRyZXNzLCBhZGRyLCBhZGRybGVuKTsKK30KKworLyoKKyAqIFdhbGsgZnJvbSAiZGVsZXRlZCIgdG8gInNwYXduZWQiLCBhbmQgcmVtb3ZlIGNoaWxkICJwaWQiLgorICoKKyAqIFdlIG1vdmUgZXZlcnl0aGluZyB1cCBieSBvbmUsIHNpbmNlIHRoZSBuZXcgImRlbGV0ZWQiIHdpbGwKKyAqIGJlIG9uZSBoaWdoZXIuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9jaGlsZChwaWRfdCBwaWQsIHVuc2lnbmVkIGRlbGV0ZWQsIHVuc2lnbmVkIHNwYXduZWQpCit7CisJc3RydWN0IGNoaWxkIG47CisKKwlkZWxldGVkICU9IE1BWF9DSElMRFJFTjsKKwlzcGF3bmVkICU9IE1BWF9DSElMRFJFTjsKKwlpZiAobGl2ZV9jaGlsZFtkZWxldGVkXS5waWQgPT0gcGlkKSB7CisJCWxpdmVfY2hpbGRbZGVsZXRlZF0ucGlkID0gLTE7CisJCXJldHVybjsKKwl9CisJbiA9IGxpdmVfY2hpbGRbZGVsZXRlZF07CisJZm9yICg7OykgeworCQlzdHJ1Y3QgY2hpbGQgbTsKKwkJZGVsZXRlZCA9IChkZWxldGVkICsgMSkgJSBNQVhfQ0hJTERSRU47CisJCWlmIChkZWxldGVkID09IHNwYXduZWQpCisJCQlkaWUoImNvdWxkIG5vdCBmaW5kIGRlYWQgY2hpbGQgJWRcbiIsIHBpZCk7CisJCW0gPSBsaXZlX2NoaWxkW2RlbGV0ZWRdOworCQlsaXZlX2NoaWxkW2RlbGV0ZWRdID0gbjsKKwkJaWYgKG0ucGlkID09IHBpZCkKKwkJCXJldHVybjsKKwkJbiA9IG07CisJfQorfQorCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCBpZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGdyb3dzCisgKiBwYXN0ICJtYXhfY29ubmVjdGlvbnMiLgorICoKKyAqIFdlIF9zaG91bGRfIHN0YXJ0IG9mZiBieSBzZWFyY2hpbmcgZm9yIGNvbm5lY3Rpb25zCisgKiBmcm9tIHRoZSBzYW1lIElQLCBhbmQgaWYgdGhlcmUgaXMgc29tZSBhZGRyZXNzIHd0aAorICogbXVsdGlwbGUgY29ubmVjdGlvbnMsIHdlIHNob3VsZCBraWxsIHRoYXQgZmlyc3QuCisgKgorICogQXMgaXQgaXMsIHdlIGp1c3QgInJhbmRvbWx5IiBraWxsIDI1JSBvZiB0aGUgY29ubmVjdGlvbnMsCisgKiBhbmQgb3VyIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9yIHN1Y2tzIHRvby4gSSBoYXZlIG5vCisgKiBzaGFtZS4KKyAqCisgKiBSZWFsbHksIHRoaXMgaXMganVzdCBhIHBsYWNlLWhvbGRlciBmb3IgYSBfcmVhbF8gYWxnb3JpdGhtLgorICovCitzdGF0aWMgdm9pZCBraWxsX3NvbWVfY2hpbGRyZW4oaW50IHNpZ25vLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3RvcCkKK3sKKwlzdGFydCAlPSBNQVhfQ0hJTERSRU47CisJc3RvcCAlPSBNQVhfQ0hJTERSRU47CisJd2hpbGUgKHN0YXJ0ICE9IHN0b3ApIHsKKwkJaWYgKCEoc3RhcnQgJiAzKSkKKwkJCWtpbGwobGl2ZV9jaGlsZFtzdGFydF0ucGlkLCBzaWdubyk7CisJCXN0YXJ0ID0gKHN0YXJ0ICsgMSkgJSBNQVhfQ0hJTERSRU47CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19tYXhfY29ubmVjdGlvbnModm9pZCkKK3sKKwlmb3IgKDs7KSB7CisJCWludCBhY3RpdmU7CisJCXVuc2lnbmVkIHNwYXduZWQsIHJlYXBlZCwgZGVsZXRlZDsKKworCQlzcGF3bmVkID0gY2hpbGRyZW5fc3Bhd25lZDsKKwkJcmVhcGVkID0gY2hpbGRyZW5fcmVhcGVkOworCQlkZWxldGVkID0gY2hpbGRyZW5fZGVsZXRlZDsKKworCQl3aGlsZSAoZGVsZXRlZCA8IHJlYXBlZCkgeworCQkJcGlkX3QgcGlkID0gZGVhZF9jaGlsZFtkZWxldGVkICUgTUFYX0NISUxEUkVOXTsKKwkJCXJlbW92ZV9jaGlsZChwaWQsIGRlbGV0ZWQsIHNwYXduZWQpOworCQkJZGVsZXRlZCsrOworCQl9CisJCWNoaWxkcmVuX2RlbGV0ZWQgPSBkZWxldGVkOworCisJCWFjdGl2ZSA9IHNwYXduZWQgLSBkZWxldGVkOworCQlpZiAoYWN0aXZlIDw9IG1heF9jb25uZWN0aW9ucykKKwkJCWJyZWFrOworCisJCS8qIEtpbGwgc29tZSB1bnN0YXJ0ZWQgY29ubmVjdGlvbnMgd2l0aCBTSUdURVJNICovCisJCWtpbGxfc29tZV9jaGlsZHJlbihTSUdURVJNLCBkZWxldGVkLCBzcGF3bmVkKTsKKwkJaWYgKGFjdGl2ZSA8PSBtYXhfY29ubmVjdGlvbnMgPDwgMSkKKwkJCWJyZWFrOworCisJCS8qIElmIHRoZSBTSUdURVJNIHRoaW5nIGlzbid0IGhlbHBpbmcgdXNlIFNJR0tJTEwgKi8KKwkJa2lsbF9zb21lX2NoaWxkcmVuKFNJR0tJTEwsIGRlbGV0ZWQsIHNwYXduZWQpOworCQlzbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZShpbnQgaW5jb21pbmcsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4pCit7CisJcGlkX3QgcGlkID0gZm9yaygpOworCWNoYXIgYWRkcmJ1ZlsyNTZdID0gIiI7CisJaW50IHBvcnQgPSAtMTsKKworCWlmIChwaWQpIHsKKwkJdW5zaWduZWQgaWR4OworCisJCWNsb3NlKGluY29taW5nKTsKKwkJaWYgKHBpZCA8IDApCisJCQlyZXR1cm47CisKKwkJaWR4ID0gY2hpbGRyZW5fc3Bhd25lZCAlIE1BWF9DSElMRFJFTjsKKwkJY2hpbGRyZW5fc3Bhd25lZCsrOworCQlhZGRfY2hpbGQoaWR4LCBwaWQsIGFkZHIsIGFkZHJsZW4pOworCisJCWNoZWNrX21heF9jb25uZWN0aW9ucygpOworCQlyZXR1cm47CisJfQorCisJZHVwMihpbmNvbWluZywgMCk7CisJZHVwMihpbmNvbWluZywgMSk7CisJY2xvc2UoaW5jb21pbmcpOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luX2FkZHIgPSAodm9pZCAqKSBhZGRyOworCQlpbmV0X250b3AoQUZfSU5FVCwgJnNpbl9hZGRyLT5zaW5fYWRkciwgYWRkcmJ1Ziwgc2l6ZW9mKGFkZHJidWYpKTsKKwkJcG9ydCA9IHNpbl9hZGRyLT5zaW5fcG9ydDsKKworI2lmbmRlZiBOT19JUFY2CisJfSBlbHNlIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNl9hZGRyID0gKHZvaWQgKikgYWRkcjsKKworCQljaGFyICpidWYgPSBhZGRyYnVmOworCQkqYnVmKysgPSAnWyc7ICpidWYgPSAnXDAnOyAvKiBzdHBjcHkoKSBpcyBjb29sICovCisJCWluZXRfbnRvcChBRl9JTkVUNiwgJnNpbjZfYWRkci0+c2luNl9hZGRyLCBidWYsIHNpemVvZihhZGRyYnVmKSAtIDEpOworCQlzdHJjYXQoYnVmLCAiXSIpOworCisJCXBvcnQgPSBzaW42X2FkZHItPnNpbjZfcG9ydDsKKyNlbmRpZgorCX0KKwlsb2dpbmZvKCJDb25uZWN0aW9uIGZyb20gJXM6JWQiLCBhZGRyYnVmLCBwb3J0KTsKKworCWV4aXQoZXhlY3V0ZSgpKTsKK30KKworc3RhdGljIHZvaWQgY2hpbGRfaGFuZGxlcihpbnQgc2lnbm8pCit7CisJZm9yICg7OykgeworCQlpbnQgc3RhdHVzOworCQlwaWRfdCBwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKTsKKworCQlpZiAocGlkID4gMCkgeworCQkJdW5zaWduZWQgcmVhcGVkID0gY2hpbGRyZW5fcmVhcGVkOworCQkJZGVhZF9jaGlsZFtyZWFwZWQgJSBNQVhfQ0hJTERSRU5dID0gcGlkOworCQkJY2hpbGRyZW5fcmVhcGVkID0gcmVhcGVkICsgMTsKKwkJCS8qIFhYWDogQ3VzdG9tIGxvZ2dpbmcsIHNpbmNlIHdlIGRvbid0IHdhbm5hIGdldHBpZCgpICovCisJCQlpZiAodmVyYm9zZSkgeworCQkJCWNoYXIgKmRlYWQgPSAiIjsKKwkJCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgPiAwKQorCQkJCQlkZWFkID0gIiAod2l0aCBlcnJvcikiOworCQkJCWlmIChsb2dfc3lzbG9nKQorCQkJCQlzeXNsb2coTE9HX0lORk8sICJbJWRdIERpc2Nvbm5lY3RlZCVzIiwgcGlkLCBkZWFkKTsKKwkJCQllbHNlCisJCQkJCWZwcmludGYoc3RkZXJyLCAiWyVkXSBEaXNjb25uZWN0ZWQlc1xuIiwgcGlkLCBkZWFkKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBzZXRfcmV1c2VfYWRkcihpbnQgc29ja2ZkKQoreworCWludCBvbiA9IDE7CisKKwlpZiAoIXJldXNlYWRkcikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsCisJCQkgICZvbiwgc2l6ZW9mKG9uKSk7Cit9CisKKyNpZm5kZWYgTk9fSVBWNgorCitzdGF0aWMgaW50IHNvY2tzZXR1cChpbnQgcG9ydCwgaW50ICoqc29ja2xpc3RfcCkKK3sKKwlpbnQgc29ja251bSA9IDAsICpzb2NrbGlzdCA9IE5VTEw7CisJaW50IG1heGZkID0gLTE7CisJY2hhciBwYnVmW05JX01BWFNFUlZdOworCisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWkwLCAqYWk7CisJaW50IGdhaTsKKworCXNwcmludGYocGJ1ZiwgIiVkIiwgcG9ydCk7CisJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKwloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisKKwlnYWkgPSBnZXRhZGRyaW5mbyhOVUxMLCBwYnVmLCAmaGludHMsICZhaTApOworCWlmIChnYWkpCisJCWRpZSgiZ2V0YWRkcmluZm8oKSBmYWlsZWQ6ICVzXG4iLCBnYWlfc3RyZXJyb3IoZ2FpKSk7CisKKwlmb3IgKGFpID0gYWkwOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworCQlpbnQgc29ja2ZkOworCQlpbnQgKm5ld2xpc3Q7CisKKwkJc29ja2ZkID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKKwkJaWYgKHNvY2tmZCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKHNvY2tmZCA+PSBGRF9TRVRTSVpFKSB7CisJCQllcnJvcigidG9vIGxhcmdlIHNvY2tldCBkZXNjcmlwdG9yLiIpOworCQkJY2xvc2Uoc29ja2ZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKyNpZmRlZiBJUFY2X1Y2T05MWQorCQlpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJaW50IG9uID0gMTsKKwkJCXNldHNvY2tvcHQoc29ja2ZkLCBJUFBST1RPX0lQVjYsIElQVjZfVjZPTkxZLAorCQkJCSAgICZvbiwgc2l6ZW9mKG9uKSk7CisJCQkvKiBOb3RlOiBlcnJvciBpcyBub3QgZmF0YWwgKi8KKwkJfQorI2VuZGlmCisKKwkJaWYgKHNldF9yZXVzZV9hZGRyKHNvY2tmZCkpIHsKKwkJCWNsb3NlKHNvY2tmZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChiaW5kKHNvY2tmZCwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKKwkJCWNsb3NlKHNvY2tmZCk7CisJCQljb250aW51ZTsJLyogbm90IGZhdGFsICovCisJCX0KKwkJaWYgKGxpc3Rlbihzb2NrZmQsIDUpIDwgMCkgeworCQkJY2xvc2Uoc29ja2ZkKTsKKwkJCWNvbnRpbnVlOwkvKiBub3QgZmF0YWwgKi8KKwkJfQorCisJCW5ld2xpc3QgPSByZWFsbG9jKHNvY2tsaXN0LCBzaXplb2YoaW50KSAqIChzb2NrbnVtICsgMSkpOworCQlpZiAoIW5ld2xpc3QpCisJCQlkaWUoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCisJCXNvY2tsaXN0ID0gbmV3bGlzdDsKKwkJc29ja2xpc3Rbc29ja251bSsrXSA9IHNvY2tmZDsKKworCQlpZiAobWF4ZmQgPCBzb2NrZmQpCisJCQltYXhmZCA9IHNvY2tmZDsKKwl9CisKKwlmcmVlYWRkcmluZm8oYWkwKTsKKworCSpzb2NrbGlzdF9wID0gc29ja2xpc3Q7CisJcmV0dXJuIHNvY2tudW07Cit9CisKKyNlbHNlIC8qIE5PX0lQVjYgKi8KKworc3RhdGljIGludCBzb2Nrc2V0dXAoaW50IHBvcnQsIGludCAqKnNvY2tsaXN0X3ApCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgc29ja2ZkOworCisJc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKwlpZiAoc29ja2ZkIDwgMCkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mIHNpbik7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKwlzaW4uc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworCWlmIChzZXRfcmV1c2VfYWRkcihzb2NrZmQpKSB7CisJCWNsb3NlKHNvY2tmZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICggYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Ygc2luKSA8IDAgKSB7CisJCWNsb3NlKHNvY2tmZCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsaXN0ZW4oc29ja2ZkLCA1KSA8IDApIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvY2tsaXN0X3AgPSB4bWFsbG9jKHNpemVvZihpbnQpKTsKKwkqKnNvY2tsaXN0X3AgPSBzb2NrZmQ7CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHNlcnZpY2VfbG9vcChpbnQgc29ja251bSwgaW50ICpzb2NrbGlzdCkKK3sKKwlzdHJ1Y3QgcG9sbGZkICpwZmQ7CisJaW50IGk7CisKKwlwZmQgPSB4Y2FsbG9jKHNvY2tudW0sIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29ja251bTsgaSsrKSB7CisJCXBmZFtpXS5mZCA9IHNvY2tsaXN0W2ldOworCQlwZmRbaV0uZXZlbnRzID0gUE9MTElOOworCX0KKworCXNpZ25hbChTSUdDSExELCBjaGlsZF9oYW5kbGVyKTsKKworCWZvciAoOzspIHsKKwkJaW50IGk7CisKKwkJaWYgKHBvbGwocGZkLCBzb2NrbnVtLCAtMSkgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKKwkJCQllcnJvcigicG9sbCBmYWlsZWQsIHJlc3VtaW5nOiAlcyIsCisJCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlzbGVlcCgxKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHNvY2tudW07IGkrKykgeworCQkJaWYgKHBmZFtpXS5yZXZlbnRzICYgUE9MTElOKSB7CisJCQkJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3M7CisJCQkJdW5zaWduZWQgaW50IHNzbGVuID0gc2l6ZW9mKHNzKTsKKwkJCQlpbnQgaW5jb21pbmcgPSBhY2NlcHQocGZkW2ldLmZkLCAoc3RydWN0IHNvY2thZGRyICopJnNzLCAmc3NsZW4pOworCQkJCWlmIChpbmNvbWluZyA8IDApIHsKKwkJCQkJc3dpdGNoIChlcnJubykgeworCQkJCQljYXNlIEVBR0FJTjoKKwkJCQkJY2FzZSBFSU5UUjoKKwkJCQkJY2FzZSBFQ09OTkFCT1JURUQ6CisJCQkJCQljb250aW51ZTsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWRpZSgiYWNjZXB0IHJldHVybmVkICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJfQorCQkJCX0KKwkJCQloYW5kbGUoaW5jb21pbmcsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3MsIHNzbGVuKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBzZXJ2ZShpbnQgcG9ydCkKK3sKKwlpbnQgc29ja251bSwgKnNvY2tsaXN0OworCisJc29ja251bSA9IHNvY2tzZXR1cChwb3J0LCAmc29ja2xpc3QpOworCWlmIChzb2NrbnVtID09IDApCisJCWRpZSgidW5hYmxlIHRvIGFsbG9jYXRlIGFueSBsaXN0ZW4gc29ja2V0cyBvbiBwb3J0ICV1IiwgcG9ydCk7CisKKwlyZXR1cm4gc2VydmljZV9sb29wKHNvY2tudW0sIHNvY2tsaXN0KTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBwb3J0ID0gREVGQVVMVF9HSVRfUE9SVDsKKwlpbnQgaW5ldGRfbW9kZSA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tcG9ydD0iLCA3KSkgeworCQkJY2hhciAqZW5kOworCQkJdW5zaWduZWQgbG9uZyBuOworCQkJbiA9IHN0cnRvdWwoYXJnKzcsICZlbmQsIDApOworCQkJaWYgKGFyZ1s3XSAmJiAhKmVuZCkgeworCQkJCXBvcnQgPSBuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0taW5ldGQiKSkgeworCQkJaW5ldGRfbW9kZSA9IDE7CisJCQlsb2dfc3lzbG9nID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQl2ZXJib3NlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tc3lzbG9nIikpIHsKKwkJCWxvZ19zeXNsb2cgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1leHBvcnQtYWxsIikpIHsKKwkJCWV4cG9ydF9hbGxfdHJlZXMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tdGltZW91dD0iLCAxMCkpIHsKKwkJCXRpbWVvdXQgPSBhdG9pKGFyZysxMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1pbml0LXRpbWVvdXQ9IiwgMTUpKSB7CisJCQlpbml0X3RpbWVvdXQgPSBhdG9pKGFyZysxNSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0cmljdC1wYXRocyIpKSB7CisJCQlzdHJpY3RfcGF0aHMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tYmFzZS1wYXRoPSIsIDEyKSkgeworCQkJYmFzZV9wYXRoID0gYXJnKzEyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZXVzZWFkZHIiKSkgeworCQkJcmV1c2VhZGRyID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdXNlci1wYXRoIikpIHsKKwkJCXVzZXJfcGF0aCA9ICIiOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tdXNlci1wYXRoPSIsIDEyKSkgeworCQkJdXNlcl9wYXRoID0gYXJnICsgMTI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlva19wYXRocyA9ICZhcmd2W2krMV07CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChhcmdbMF0gIT0gJy0nKSB7CisJCQlva19wYXRocyA9ICZhcmd2W2ldOworCQkJYnJlYWs7CisJCX0KKworCQl1c2FnZShkYWVtb25fdXNhZ2UpOworCX0KKworCWlmIChsb2dfc3lzbG9nKQorCQlvcGVubG9nKCJnaXQtZGFlbW9uIiwgMCwgTE9HX0RBRU1PTik7CisKKwlpZiAoc3RyaWN0X3BhdGhzICYmICghb2tfcGF0aHMgfHwgISpva19wYXRocykpIHsKKwkJaWYgKCFpbmV0ZF9tb2RlKQorCQkJZGllKCJnaXQtZGFlbW9uOiBvcHRpb24gLS1zdHJpY3QtcGF0aHMgcmVxdWlyZXMgYSB3aGl0ZWxpc3QiKTsKKworCQlsb2dlcnJvcigib3B0aW9uIC0tc3RyaWN0LXBhdGhzIHJlcXVpcmVzIGEgd2hpdGVsaXN0Iik7CisJCWV4aXQgKDEpOworCX0KKworCWlmIChpbmV0ZF9tb2RlKSB7CisJCWZjbG9zZShzdGRlcnIpOyAvL0ZJWE1FOiB3b3JrYXJvdW5kCisJCXJldHVybiBleGVjdXRlKCk7CisJfQorCisJcmV0dXJuIHNlcnZlKHBvcnQpOworfQpkaWZmIC0tZ2l0IGEvZGF0ZS5jIGIvZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWRjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRlLmMKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIHRpbWVfdCBteV9ta3RpbWUoc3RydWN0IHRtICp0bSkKK3sKKwlzdGF0aWMgY29uc3QgaW50IG1kYXlzW10gPSB7CisJICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0CisJfTsKKwlpbnQgeWVhciA9IHRtLT50bV95ZWFyIC0gNzA7CisJaW50IG1vbnRoID0gdG0tPnRtX21vbjsKKwlpbnQgZGF5ID0gdG0tPnRtX21kYXk7CisKKwlpZiAoeWVhciA8IDAgfHwgeWVhciA+IDEyOSkgLyogYWxnbyBvbmx5IHdvcmtzIGZvciAxOTcwLTIwOTkgKi8KKwkJcmV0dXJuIC0xOworCWlmIChtb250aCA8IDAgfHwgbW9udGggPiAxMSkgLyogYXJyYXkgYm91bmRzICovCisJCXJldHVybiAtMTsKKwlpZiAobW9udGggPCAyIHx8ICh5ZWFyICsgMikgJSA0KQorCQlkYXktLTsKKwlyZXR1cm4gKHllYXIgKiAzNjUgKyAoeWVhciArIDEpIC8gNCArIG1kYXlzW21vbnRoXSArIGRheSkgKiAyNCo2MCo2MFVMICsKKwkJdG0tPnRtX2hvdXIgKiA2MCo2MCArIHRtLT50bV9taW4gKiA2MCArIHRtLT50bV9zZWM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptb250aF9uYW1lc1tdID0geworCSJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKKwkiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqd2Vla2RheV9uYW1lc1tdID0geworCSJTdW5kYXlzIiwgIk1vbmRheXMiLCAiVHVlc2RheXMiLCAiV2VkbmVzZGF5cyIsICJUaHVyc2RheXMiLCAiRnJpZGF5cyIsICJTYXR1cmRheXMiCit9OworCisvKgorICogVGhlICJ0eiIgdGhpbmcgaXMgcGFzc2VkIGluIGFzIHRoaXMgc3RyYW5nZSAiZGVjaW1hbCBwYXJzZSBvZiB0eiIKKyAqIHRoaW5nLCB3aGljaCBtZWFucyB0aGF0IHR6IC0wMTAwIGlzIHBhc3NlZCBpbiBhcyB0aGUgaW50ZWdlciAtMTAwLAorICogZXZlbiB0aG91Z2ggaXQgbWVhbnMgInNpeHR5IG1pbnV0ZXMgb2ZmIgorICovCitzdGF0aWMgc3RydWN0IHRtICp0aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCXRpbWVfdCB0OworCWludCBtaW51dGVzOworCisJbWludXRlcyA9IHR6IDwgMCA/IC10eiA6IHR6OworCW1pbnV0ZXMgPSAobWludXRlcyAvIDEwMCkqNjAgKyAobWludXRlcyAlIDEwMCk7CisJbWludXRlcyA9IHR6IDwgMCA/IC1taW51dGVzIDogbWludXRlczsKKwl0ID0gdGltZSArIG1pbnV0ZXMgKiA2MDsKKwlyZXR1cm4gZ210aW1lKCZ0KTsKK30KKworY29uc3QgY2hhciAqc2hvd19kYXRlKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCXN0cnVjdCB0bSAqdG07CisJc3RhdGljIGNoYXIgdGltZWJ1ZlsyMDBdOworCisJdG0gPSB0aW1lX3RvX3RtKHRpbWUsIHR6KTsKKwlpZiAoIXRtKQorCQlyZXR1cm4gTlVMTDsKKwlzcHJpbnRmKHRpbWVidWYsICIlLjNzICUuM3MgJWQgJTAyZDolMDJkOiUwMmQgJWQgJSswNWQiLAorCQl3ZWVrZGF5X25hbWVzW3RtLT50bV93ZGF5XSwKKwkJbW9udGhfbmFtZXNbdG0tPnRtX21vbl0sCisJCXRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYywKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0eik7CisJcmV0dXJuIHRpbWVidWY7Cit9CisKK2NvbnN0IGNoYXIgKnNob3dfcmZjMjgyMl9kYXRlKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCXN0cnVjdCB0bSAqdG07CisJc3RhdGljIGNoYXIgdGltZWJ1ZlsyMDBdOworCisJdG0gPSB0aW1lX3RvX3RtKHRpbWUsIHR6KTsKKwlpZiAoIXRtKQorCQlyZXR1cm4gTlVMTDsKKwlzcHJpbnRmKHRpbWVidWYsICIlLjNzLCAlZCAlLjNzICVkICUwMmQ6JTAyZDolMDJkICUrMDVkIiwKKwkJd2Vla2RheV9uYW1lc1t0bS0+dG1fd2RheV0sIHRtLT50bV9tZGF5LAorCQltb250aF9uYW1lc1t0bS0+dG1fbW9uXSwgdG0tPnRtX3llYXIgKyAxOTAwLAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYywgdHopOworCXJldHVybiB0aW1lYnVmOworfQorCisvKgorICogQ2hlY2sgdGhlc2UuIEFuZCBub3RlIGhvdyBpdCBkb2Vzbid0IGRvIHRoZSBzdW1tZXItdGltZSBjb252ZXJzaW9uLgorICoKKyAqIEluIG15IHdvcmxkLCBpdCdzIGFsd2F5cyBzdW1tZXIsIGFuZCB0aGluZ3MgYXJlIHByb2JhYmx5IGEgYml0IG9mZgorICogaW4gb3RoZXIgd2F5cyB0b28uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG9mZnNldDsKKwlpbnQgZHN0OworfSB0aW1lem9uZV9uYW1lc1tdID0geworCXsgIklETFciLCAtMTIsIDAsIH0sCS8qIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIFdlc3QgKi8KKwl7ICJOVCIsICAgLTExLCAwLCB9LAkvKiBOb21lICovCisJeyAiQ0FUIiwgIC0xMCwgMCwgfSwJLyogQ2VudHJhbCBBbGFza2EgKi8KKwl7ICJIU1QiLCAgLTEwLCAwLCB9LAkvKiBIYXdhaWkgU3RhbmRhcmQgKi8KKwl7ICJIRFQiLCAgLTEwLCAxLCB9LAkvKiBIYXdhaWkgRGF5bGlnaHQgKi8KKwl7ICJZU1QiLCAgIC05LCAwLCB9LAkvKiBZdWtvbiBTdGFuZGFyZCAqLworCXsgIllEVCIsICAgLTksIDEsIH0sCS8qIFl1a29uIERheWxpZ2h0ICovCisJeyAiUFNUIiwgICAtOCwgMCwgfSwJLyogUGFjaWZpYyBTdGFuZGFyZCAqLworCXsgIlBEVCIsICAgLTgsIDEsIH0sCS8qIFBhY2lmaWMgRGF5bGlnaHQgKi8KKwl7ICJNU1QiLCAgIC03LCAwLCB9LAkvKiBNb3VudGFpbiBTdGFuZGFyZCAqLworCXsgIk1EVCIsICAgLTcsIDEsIH0sCS8qIE1vdW50YWluIERheWxpZ2h0ICovCisJeyAiQ1NUIiwgICAtNiwgMCwgfSwJLyogQ2VudHJhbCBTdGFuZGFyZCAqLworCXsgIkNEVCIsICAgLTYsIDEsIH0sCS8qIENlbnRyYWwgRGF5bGlnaHQgKi8KKwl7ICJFU1QiLCAgIC01LCAwLCB9LAkvKiBFYXN0ZXJuIFN0YW5kYXJkICovCisJeyAiRURUIiwgICAtNSwgMSwgfSwJLyogRWFzdGVybiBEYXlsaWdodCAqLworCXsgIkFTVCIsICAgLTMsIDAsIH0sCS8qIEF0bGFudGljIFN0YW5kYXJkICovCisJeyAiQURUIiwgICAtMywgMSwgfSwJLyogQXRsYW50aWMgRGF5bGlnaHQgKi8KKwl7ICJXQVQiLCAgIC0xLCAwLCB9LAkvKiBXZXN0IEFmcmljYSAqLworCisJeyAiR01UIiwgICAgMCwgMCwgfSwJLyogR3JlZW53aWNoIE1lYW4gKi8KKwl7ICJVVEMiLCAgICAwLCAwLCB9LAkvKiBVbml2ZXJzYWwgKENvb3JkaW5hdGVkKSAqLworCisJeyAiV0VUIiwgICAgMCwgMCwgfSwJLyogV2VzdGVybiBFdXJvcGVhbiAqLworCXsgIkJTVCIsICAgIDAsIDEsIH0sCS8qIEJyaXRpc2ggU3VtbWVyICovCisJeyAiQ0VUIiwgICArMSwgMCwgfSwJLyogQ2VudHJhbCBFdXJvcGVhbiAqLworCXsgIk1FVCIsICAgKzEsIDAsIH0sCS8qIE1pZGRsZSBFdXJvcGVhbiAqLworCXsgIk1FV1QiLCAgKzEsIDAsIH0sCS8qIE1pZGRsZSBFdXJvcGVhbiBXaW50ZXIgKi8KKwl7ICJNRVNUIiwgICsxLCAxLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gU3VtbWVyICovCisJeyAiQ0VTVCIsICArMSwgMSwgfSwJLyogQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgKi8KKwl7ICJNRVNaIiwgICsxLCAxLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gU3VtbWVyICovCisJeyAiRldUIiwgICArMSwgMCwgfSwJLyogRnJlbmNoIFdpbnRlciAqLworCXsgIkZTVCIsICAgKzEsIDEsIH0sCS8qIEZyZW5jaCBTdW1tZXIgKi8KKwl7ICJFRVQiLCAgICsyLCAwLCB9LAkvKiBFYXN0ZXJuIEV1cm9wZSwgVVNTUiBab25lIDEgKi8KKwl7ICJFRVNUIiwgICsyLCAxLCB9LAkvKiBFYXN0ZXJuIEV1cm9wZWFuIERheWxpZ2h0ICovCisJeyAiV0FTVCIsICArNywgMCwgfSwJLyogV2VzdCBBdXN0cmFsaWFuIFN0YW5kYXJkICovCisJeyAiV0FEVCIsICArNywgMSwgfSwJLyogV2VzdCBBdXN0cmFsaWFuIERheWxpZ2h0ICovCisJeyAiQ0NUIiwgICArOCwgMCwgfSwJLyogQ2hpbmEgQ29hc3QsIFVTU1IgWm9uZSA3ICovCisJeyAiSlNUIiwgICArOSwgMCwgfSwJLyogSmFwYW4gU3RhbmRhcmQsIFVTU1IgWm9uZSA4ICovCisJeyAiRUFTVCIsICsxMCwgMCwgfSwJLyogRWFzdGVybiBBdXN0cmFsaWFuIFN0YW5kYXJkICovCisJeyAiRUFEVCIsICsxMCwgMSwgfSwJLyogRWFzdGVybiBBdXN0cmFsaWFuIERheWxpZ2h0ICovCisJeyAiR1NUIiwgICsxMCwgMCwgfSwJLyogR3VhbSBTdGFuZGFyZCwgVVNTUiBab25lIDkgKi8KKwl7ICJOWlQiLCAgKzExLCAwLCB9LAkvKiBOZXcgWmVhbGFuZCAqLworCXsgIk5aU1QiLCArMTEsIDAsIH0sCS8qIE5ldyBaZWFsYW5kIFN0YW5kYXJkICovCisJeyAiTlpEVCIsICsxMSwgMSwgfSwJLyogTmV3IFplYWxhbmQgRGF5bGlnaHQgKi8KKwl7ICJJRExFIiwgKzEyLCAwLCB9LAkvKiBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBFYXN0ICovCit9OworCitzdGF0aWMgaW50IG1hdGNoX3N0cmluZyhjb25zdCBjaGFyICpkYXRlLCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgKmRhdGU7IGRhdGUrKywgc3RyKyssIGkrKykgeworCQlpZiAoKmRhdGUgPT0gKnN0cikKKwkJCWNvbnRpbnVlOworCQlpZiAodG91cHBlcigqZGF0ZSkgPT0gdG91cHBlcigqc3RyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlzYWxudW0oKmRhdGUpKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBza2lwX2FscGhhKGNvbnN0IGNoYXIgKmRhdGUpCit7CisJaW50IGkgPSAwOworCWRvIHsKKwkJaSsrOworCX0gd2hpbGUgKGlzYWxwaGEoZGF0ZVtpXSkpOworCXJldHVybiBpOworfQorCisvKgorKiBQYXJzZSBtb250aCwgd2Vla2RheSwgb3IgdGltZXpvbmUgbmFtZQorKi8KK3N0YXRpYyBpbnQgbWF0Y2hfYWxwaGEoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpvZmZzZXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgbW9udGhfbmFtZXNbaV0pOworCQlpZiAobWF0Y2ggPj0gMykgeworCQkJdG0tPnRtX21vbiA9IGk7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCB3ZWVrZGF5X25hbWVzW2ldKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCXRtLT50bV93ZGF5ID0gaTsKKwkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRpbWV6b25lX25hbWVzKTsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCB0aW1lem9uZV9uYW1lc1tpXS5uYW1lKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCWludCBvZmYgPSB0aW1lem9uZV9uYW1lc1tpXS5vZmZzZXQ7CisKKwkJCS8qIFRoaXMgaXMgYm9ndXMsIGJ1dCB3ZSBsaWtlIHN1bW1lciAqLworCQkJb2ZmICs9IHRpbWV6b25lX25hbWVzW2ldLmRzdDsKKworCQkJLyogT25seSB1c2UgdGhlIHR6IG5hbWUgb2Zmc2V0IGlmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgYmV0dGVyICovCisJCQlpZiAoKm9mZnNldCA9PSAtMSkKKwkJCQkqb2Zmc2V0ID0gNjAqb2ZmOworCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsICJQTSIpID09IDIpIHsKKwkJaWYgKHRtLT50bV9ob3VyID4gMCAmJiB0bS0+dG1faG91ciA8IDEyKQorCQkJdG0tPnRtX2hvdXIgKz0gMTI7CisJCXJldHVybiAyOworCX0KKworCS8qIEJBRCBDUkFQICovCisJcmV0dXJuIHNraXBfYWxwaGEoZGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfZGF0ZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBzdHJ1Y3QgdG0gKm5vd190bSwgdGltZV90IG5vdywgc3RydWN0IHRtICp0bSkKK3sKKwlpZiAobW9udGggPiAwICYmIG1vbnRoIDwgMTMgJiYgZGF5ID4gMCAmJiBkYXkgPCAzMikgeworCQlzdHJ1Y3QgdG0gY2hlY2sgPSAqdG07CisJCXN0cnVjdCB0bSAqciA9IChub3dfdG0gPyAmY2hlY2sgOiB0bSk7CisJCXRpbWVfdCBzcGVjaWZpZWQ7CisKKwkJci0+dG1fbW9uID0gbW9udGggLSAxOworCQlyLT50bV9tZGF5ID0gZGF5OworCQlpZiAoeWVhciA9PSAtMSkgeworCQkJaWYgKCFub3dfdG0pCisJCQkJcmV0dXJuIDE7CisJCQlyLT50bV95ZWFyID0gbm93X3RtLT50bV95ZWFyOworCQl9CisJCWVsc2UgaWYgKHllYXIgPj0gMTk3MCAmJiB5ZWFyIDwgMjEwMCkKKwkJCXItPnRtX3llYXIgPSB5ZWFyIC0gMTkwMDsKKwkJZWxzZSBpZiAoeWVhciA+IDcwICYmIHllYXIgPCAxMDApCisJCQlyLT50bV95ZWFyID0geWVhcjsKKwkJZWxzZSBpZiAoeWVhciA8IDM4KQorCQkJci0+dG1feWVhciA9IHllYXIgKyAxMDA7CisJCWVsc2UKKwkJCXJldHVybiAwOworCQlpZiAoIW5vd190bSkKKwkJCXJldHVybiAxOworCisJCXNwZWNpZmllZCA9IG15X21rdGltZShyKTsKKworCQkvKiBCZSBpdCBjb21taXQgdGltZSBvciBhdXRob3IgdGltZSwgaXQgZG9lcyBub3QgbWFrZQorCQkgKiBzZW5zZSB0byBzcGVjaWZ5IHRpbWVzdGFtcCB3YXkgaW50byB0aGUgZnV0dXJlLiAgTWFrZQorCQkgKiBzdXJlIGl0IGlzIG5vdCBsYXRlciB0aGFuIHRlbiBkYXlzIGZyb20gbm93Li4uCisJCSAqLworCQlpZiAobm93ICsgMTAqMjQqMzYwMCA8IHNwZWNpZmllZCkKKwkJCXJldHVybiAwOworCQl0bS0+dG1fbW9uID0gci0+dG1fbW9uOworCQl0bS0+dG1fbWRheSA9IHItPnRtX21kYXk7CisJCWlmICh5ZWFyICE9IC0xKQorCQkJdG0tPnRtX3llYXIgPSByLT50bV95ZWFyOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfbXVsdGlfbnVtYmVyKHVuc2lnbmVkIGxvbmcgbnVtLCBjaGFyIGMsIGNvbnN0IGNoYXIgKmRhdGUsIGNoYXIgKmVuZCwgc3RydWN0IHRtICp0bSkKK3sKKwl0aW1lX3Qgbm93OworCXN0cnVjdCB0bSBub3dfdG07CisJc3RydWN0IHRtICpyZWZ1c2VfZnV0dXJlOworCWxvbmcgbnVtMiwgbnVtMzsKKworCW51bTIgPSBzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKKwludW0zID0gLTE7CisJaWYgKCplbmQgPT0gYyAmJiBpc2RpZ2l0KGVuZFsxXSkpCisJCW51bTMgPSBzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKKworCS8qIFRpbWU/IERhdGU/ICovCisJc3dpdGNoIChjKSB7CisJY2FzZSAnOic6CisJCWlmIChudW0zIDwgMCkKKwkJCW51bTMgPSAwOworCQlpZiAobnVtIDwgMjUgJiYgbnVtMiA+PSAwICYmIG51bTIgPCA2MCAmJiBudW0zID49IDAgJiYgbnVtMyA8PSA2MCkgeworCQkJdG0tPnRtX2hvdXIgPSBudW07CisJCQl0bS0+dG1fbWluID0gbnVtMjsKKwkJCXRtLT50bV9zZWMgPSBudW0zOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlICctJzoKKwljYXNlICcvJzoKKwljYXNlICcuJzoKKwkJbm93ID0gdGltZShOVUxMKTsKKwkJcmVmdXNlX2Z1dHVyZSA9IE5VTEw7CisJCWlmIChnbXRpbWVfcigmbm93LCAmbm93X3RtKSkKKwkJCXJlZnVzZV9mdXR1cmUgPSAmbm93X3RtOworCisJCWlmIChudW0gPiA3MCkgeworCQkJLyogeXl5eS1tbS1kZD8gKi8KKwkJCWlmIChpc19kYXRlKG51bSwgbnVtMiwgbnVtMywgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQkJYnJlYWs7CisJCQkvKiB5eXl5LWRkLW1tPyAqLworCQkJaWYgKGlzX2RhdGUobnVtLCBudW0zLCBudW0yLCByZWZ1c2VfZnV0dXJlLCBub3csIHRtKSkKKwkJCQlicmVhazsKKwkJfQorCQkvKiBPdXIgZWFzdGVybiBFdXJvcGVhbiBmcmllbmRzIHNheSBkZC5tbS55eVt5eV0KKwkJICogaXMgdGhlIG5vcm0gdGhlcmUsIHNvIGdpdmluZyBwcmVjZWRlbmNlIHRvCisJCSAqIG1tL2RkL3l5W3l5XSBmb3JtIG9ubHkgd2hlbiBzZXBhcmF0b3IgaXMgbm90ICcuJworCQkgKi8KKwkJaWYgKGMgIT0gJy4nICYmCisJCSAgICBpc19kYXRlKG51bTMsIG51bSwgbnVtMiwgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQlicmVhazsKKwkJLyogRXVyb3BlYW4gZGQubW0ueXlbeXldIG9yIGZ1bm55IFVTIGRkL21tL3l5W3l5XSAqLworCQlpZiAoaXNfZGF0ZShudW0zLCBudW0yLCBudW0sIHJlZnVzZV9mdXR1cmUsIG5vdywgdG0pKQorCQkJYnJlYWs7CisJCS8qIEZ1bm55IEV1cm9wZWFuIG1tLmRkLnl5ICovCisJCWlmIChjID09ICcuJyAmJgorCQkgICAgaXNfZGF0ZShudW0zLCBudW0sIG51bTIsIHJlZnVzZV9mdXR1cmUsIG5vdywgdG0pKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZW5kIC0gZGF0ZTsKK30KKworLyoKKyAqIFdlJ3ZlIHNlZW4gYSBkaWdpdC4gVGltZT8gWWVhcj8gRGF0ZT8gCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfZGlnaXQoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpvZmZzZXQsIGludCAqdG1fZ210KQoreworCWludCBuOworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIG51bTsKKworCW51bSA9IHN0cnRvdWwoZGF0ZSwgJmVuZCwgMTApOworCisJLyoKKwkgKiBTZWNvbmRzIHNpbmNlIDE5NzA/IFdlIHRyaWdnZXIgb24gdGhhdCBmb3IgYW55dGhpbmcgYWZ0ZXIgSmFuIDEsIDIwMDAKKwkgKi8KKwlpZiAobnVtID4gOTQ2Njg0ODAwKSB7CisJCXRpbWVfdCB0aW1lID0gbnVtOworCQlpZiAoZ210aW1lX3IoJnRpbWUsIHRtKSkgeworCQkJKnRtX2dtdCA9IDE7CisJCQlyZXR1cm4gZW5kIC0gZGF0ZTsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHNwZWNpYWwgZm9ybWF0czogbnVtWy0uOi9dbnVtW3NhbWVdbnVtCisJICovCisJc3dpdGNoICgqZW5kKSB7CisJY2FzZSAnOic6CisJY2FzZSAnLic6CisJY2FzZSAnLyc6CisJY2FzZSAnLSc6CisJCWlmIChpc2RpZ2l0KGVuZFsxXSkpIHsKKwkJCWludCBtYXRjaCA9IG1hdGNoX211bHRpX251bWJlcihudW0sICplbmQsIGRhdGUsIGVuZCwgdG0pOworCQkJaWYgKG1hdGNoKQorCQkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0KKworCS8qCisJICogTm9uZSBvZiB0aGUgc3BlY2lhbCBmb3JtYXRzPyBUcnkgdG8gZ3Vlc3Mgd2hhdAorCSAqIHRoZSBudW1iZXIgbWVhbnQuIFdlIHVzZSB0aGUgbnVtYmVyIG9mIGRpZ2l0cworCSAqIHRvIG1ha2UgYSBtb3JlIGVkdWNhdGVkIGd1ZXNzLi4KKwkgKi8KKwluID0gMDsKKwlkbyB7CisJCW4rKzsKKwl9IHdoaWxlIChpc2RpZ2l0KGRhdGVbbl0pKTsKKworCS8qIEZvdXItZGlnaXQgeWVhciBvciBhIHRpbWV6b25lPyAqLworCWlmIChuID09IDQpIHsKKwkJaWYgKG51bSA8PSAxMjAwICYmICpvZmZzZXQgPT0gLTEpIHsKKwkJCXVuc2lnbmVkIGludCBtaW51dGVzID0gbnVtICUgMTAwOworCQkJdW5zaWduZWQgaW50IGhvdXJzID0gbnVtIC8gMTAwOworCQkJKm9mZnNldCA9IGhvdXJzKjYwICsgbWludXRlczsKKwkJfSBlbHNlIGlmIChudW0gPiAxOTAwICYmIG51bSA8IDIxMDApCisJCQl0bS0+dG1feWVhciA9IG51bSAtIDE5MDA7CisJCXJldHVybiBuOworCX0KKworCS8qCisJICogTk9URSEgV2Ugd2lsbCBnaXZlIHByZWNlZGVuY2UgdG8gZGF5LW9mLW1vbnRoIG92ZXIgbW9udGggb3IKKwkgKiB5ZWFyIG51bWJlcnMgaW4gdGhlIDEtMTIgcmFuZ2UuIFNvIDA1IGlzIGFsd2F5cyAibWRheSA1IiwKKwkgKiB1bmxlc3Mgd2UgYWxyZWFkeSBoYXZlIGEgbWRheS4uCisJICoKKwkgKiBJT1csIDAxIEFwciAwNSBwYXJzZXMgYXMgIkFwcmlsIDFzdCwgMjAwNSIuCisJICovCisJaWYgKG51bSA+IDAgJiYgbnVtIDwgMzIgJiYgdG0tPnRtX21kYXkgPCAwKSB7CisJCXRtLT50bV9tZGF5ID0gbnVtOworCQlyZXR1cm4gbjsKKwl9CisKKwkvKiBUd28tZGlnaXQgeWVhcj8gKi8KKwlpZiAobiA9PSAyICYmIHRtLT50bV95ZWFyIDwgMCkgeworCQlpZiAobnVtIDwgMTAgJiYgdG0tPnRtX21kYXkgPj0gMCkgeworCQkJdG0tPnRtX3llYXIgPSBudW0gKyAxMDA7CisJCQlyZXR1cm4gbjsKKwkJfQorCQlpZiAobnVtID49IDcwKSB7CisJCQl0bS0+dG1feWVhciA9IG51bTsKKwkJCXJldHVybiBuOworCQl9CisJfQorCisJaWYgKG51bSA+IDAgJiYgbnVtIDwgMzIpIHsKKwkJdG0tPnRtX21kYXkgPSBudW07CisJfSBlbHNlIGlmIChudW0gPiAxOTAwKSB7CisJCXRtLT50bV95ZWFyID0gbnVtIC0gMTkwMDsKKwl9IGVsc2UgaWYgKG51bSA+IDcwKSB7CisJCXRtLT50bV95ZWFyID0gbnVtOworCX0gZWxzZSBpZiAobnVtID4gMCAmJiBudW0gPCAxMykgeworCQl0bS0+dG1fbW9uID0gbnVtLTE7CisJfQorCQkKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBtYXRjaF90eihjb25zdCBjaGFyICpkYXRlLCBpbnQgKm9mZnApCit7CisJY2hhciAqZW5kOworCWludCBvZmZzZXQgPSBzdHJ0b3VsKGRhdGUrMSwgJmVuZCwgMTApOworCWludCBtaW4sIGhvdXI7CisJaW50IG4gPSBlbmQgLSBkYXRlIC0gMTsKKworCW1pbiA9IG9mZnNldCAlIDEwMDsKKwlob3VyID0gb2Zmc2V0IC8gMTAwOworCisJLyoKKwkgKiBEb24ndCBhY2NlcHQgYW55IHJhbmRvbSBjcmFwLi4gQXQgbGVhc3QgMyBkaWdpdHMsIGFuZAorCSAqIGEgdmFsaWQgbWludXRlLiBXZSBtaWdodCB3YW50IHRvIGNoZWNrIHRoYXQgdGhlIG1pbnV0ZXMKKwkgKiBhcmUgZGl2aXNpYmxlIGJ5IDMwIG9yIHNvbWV0aGluZyB0b28uCisJICovCisJaWYgKG1pbiA8IDYwICYmIG4gPiAyKSB7CisJCW9mZnNldCA9IGhvdXIqNjArbWluOworCQlpZiAoKmRhdGUgPT0gJy0nKQorCQkJb2Zmc2V0ID0gLW9mZnNldDsKKworCQkqb2ZmcCA9IG9mZnNldDsKKwl9CisJcmV0dXJuIGVuZCAtIGRhdGU7Cit9CisKK3N0YXRpYyBpbnQgZGF0ZV9zdHJpbmcodW5zaWduZWQgbG9uZyBkYXRlLCBpbnQgb2Zmc2V0LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHNpZ24gPSAnKyc7CisKKwlpZiAob2Zmc2V0IDwgMCkgeworCQlvZmZzZXQgPSAtb2Zmc2V0OworCQlzaWduID0gJy0nOworCX0KKwlyZXR1cm4gc25wcmludGYoYnVmLCBsZW4sICIlbHUgJWMlMDJkJTAyZCIsIGRhdGUsIHNpZ24sIG9mZnNldCAvIDYwLCBvZmZzZXQgJSA2MCk7Cit9CisKKy8qIEdyLiBzdHJwdGltZSBpcyBjcmFwIGZvciB0aGlzOyBpdCBkb2Vzbid0IGhhdmUgYSB3YXkgdG8gcmVxdWlyZSBSRkMyODIyCisgICAoaS5lLiBFbmdsaXNoKSBkYXkvbW9udGggbmFtZXMsIGFuZCBpdCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IHdpdGggJXouICovCitpbnQgcGFyc2VfZGF0ZShjb25zdCBjaGFyICpkYXRlLCBjaGFyICpyZXN1bHQsIGludCBtYXhsZW4pCit7CisJc3RydWN0IHRtIHRtOworCWludCBvZmZzZXQsIHRtX2dtdDsKKwl0aW1lX3QgdGhlbjsKKworCW1lbXNldCgmdG0sIDAsIHNpemVvZih0bSkpOworCXRtLnRtX3llYXIgPSAtMTsKKwl0bS50bV9tb24gPSAtMTsKKwl0bS50bV9tZGF5ID0gLTE7CisJdG0udG1faXNkc3QgPSAtMTsKKwlvZmZzZXQgPSAtMTsKKwl0bV9nbXQgPSAwOworCisJZm9yICg7OykgeworCQlpbnQgbWF0Y2ggPSAwOworCQl1bnNpZ25lZCBjaGFyIGMgPSAqZGF0ZTsKKworCQkvKiBTdG9wIGF0IGVuZCBvZiBzdHJpbmcgb3IgbmV3bGluZSAqLworCQlpZiAoIWMgfHwgYyA9PSAnXG4nKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzYWxwaGEoYykpCisJCQltYXRjaCA9IG1hdGNoX2FscGhhKGRhdGUsICZ0bSwgJm9mZnNldCk7CisJCWVsc2UgaWYgKGlzZGlnaXQoYykpCisJCQltYXRjaCA9IG1hdGNoX2RpZ2l0KGRhdGUsICZ0bSwgJm9mZnNldCwgJnRtX2dtdCk7CisJCWVsc2UgaWYgKChjID09ICctJyB8fCBjID09ICcrJykgJiYgaXNkaWdpdChkYXRlWzFdKSkKKwkJCW1hdGNoID0gbWF0Y2hfdHooZGF0ZSwgJm9mZnNldCk7CisKKwkJaWYgKCFtYXRjaCkgeworCQkJLyogQkFEIENSQVAgKi8KKwkJCW1hdGNoID0gMTsKKwkJfQkKKworCQlkYXRlICs9IG1hdGNoOworCX0KKworCS8qIG1rdGltZSB1c2VzIGxvY2FsIHRpbWV6b25lICovCisJdGhlbiA9IG15X21rdGltZSgmdG0pOyAKKwlpZiAob2Zmc2V0ID09IC0xKQorCQlvZmZzZXQgPSAodGhlbiAtIG1rdGltZSgmdG0pKSAvIDYwOworCisJaWYgKHRoZW4gPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmICghdG1fZ210KQorCQl0aGVuIC09IG9mZnNldCAqIDYwOworCXJldHVybiBkYXRlX3N0cmluZyh0aGVuLCBvZmZzZXQsIHJlc3VsdCwgbWF4bGVuKTsKK30KKwordm9pZCBkYXRlc3RhbXAoY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSkKK3sKKwl0aW1lX3Qgbm93OworCWludCBvZmZzZXQ7CisKKwl0aW1lKCZub3cpOworCisJb2Zmc2V0ID0gbXlfbWt0aW1lKGxvY2FsdGltZSgmbm93KSkgLSBub3c7CisJb2Zmc2V0IC89IDYwOworCisJZGF0ZV9zdHJpbmcobm93LCBvZmZzZXQsIGJ1ZiwgYnVmc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90bShzdHJ1Y3QgdG0gKnRtLCB1bnNpZ25lZCBsb25nIHNlYykKK3sKKwl0aW1lX3QgbiA9IG1rdGltZSh0bSkgLSBzZWM7CisJbG9jYWx0aW1lX3IoJm4sIHRtKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV95ZXN0ZXJkYXkoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJdXBkYXRlX3RtKHRtLCAyNCo2MCo2MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfdGltZShzdHJ1Y3QgdG0gKnRtLCBpbnQgaG91cikKK3sKKwlpZiAodG0tPnRtX2hvdXIgPCBob3VyKQorCQlkYXRlX3llc3RlcmRheSh0bSwgTlVMTCk7CisJdG0tPnRtX2hvdXIgPSBob3VyOworCXRtLT50bV9taW4gPSAwOworCXRtLT50bV9zZWMgPSAwOworfQorCitzdGF0aWMgdm9pZCBkYXRlX21pZG5pZ2h0KHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWRhdGVfdGltZSh0bSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfbm9vbihzdHJ1Y3QgdG0gKnRtLCBpbnQgKm51bSkKK3sKKwlkYXRlX3RpbWUodG0sIDEyKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV90ZWEoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJZGF0ZV90aW1lKHRtLCAxNyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BlY2lhbCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICgqZm4pKHN0cnVjdCB0bSAqLCBpbnQgKik7Cit9IHNwZWNpYWxbXSA9IHsKKwl7ICJ5ZXN0ZXJkYXkiLCBkYXRlX3llc3RlcmRheSB9LAorCXsgIm5vb24iLCBkYXRlX25vb24gfSwKKwl7ICJtaWRuaWdodCIsIGRhdGVfbWlkbmlnaHQgfSwKKwl7ICJ0ZWEiLCBkYXRlX3RlYSB9LAorCXsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbnVtYmVyX25hbWVbXSA9IHsKKwkiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLAorCSJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgInRlbiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGVsZW4geworCWNvbnN0IGNoYXIgKnR5cGU7CisJaW50IGxlbmd0aDsKK30gdHlwZWxlbltdID0geworCXsgInNlY29uZHMiLCAxIH0sCisJeyAibWludXRlcyIsIDYwIH0sCisJeyAiaG91cnMiLCA2MCo2MCB9LAorCXsgImRheXMiLCAyNCo2MCo2MCB9LAorCXsgIndlZWtzIiwgNyoyNCo2MCo2MCB9LAorCXsgTlVMTCB9Cit9OwkKKworc3RhdGljIGNvbnN0IGNoYXIgKmFwcHJveGlkYXRlX2FscGhhKGNvbnN0IGNoYXIgKmRhdGUsIHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWNvbnN0IHN0cnVjdCB0eXBlbGVuICp0bDsKKwljb25zdCBzdHJ1Y3Qgc3BlY2lhbCAqczsKKwljb25zdCBjaGFyICplbmQgPSBkYXRlOworCWludCBuID0gMSwgaTsKKworCXdoaWxlIChpc2FscGhhKCorK2VuZCkpCisJCW4rKzsKKworCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCBtb250aF9uYW1lc1tpXSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQl0bS0+dG1fbW9uID0gaTsKKwkJCXJldHVybiBlbmQ7CisJCX0KKwl9CisKKwlmb3IgKHMgPSBzcGVjaWFsOyBzLT5uYW1lOyBzKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbihzLT5uYW1lKTsKKwkJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCBzLT5uYW1lKSA9PSBsZW4pIHsKKwkJCXMtPmZuKHRtLCBudW0pOworCQkJcmV0dXJuIGVuZDsKKwkJfQorCX0KKworCWlmICghKm51bSkgeworCQlmb3IgKGkgPSAxOyBpIDwgMTE7IGkrKykgeworCQkJaW50IGxlbiA9IHN0cmxlbihudW1iZXJfbmFtZVtpXSk7CisJCQlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsIG51bWJlcl9uYW1lW2ldKSA9PSBsZW4pIHsKKwkJCQkqbnVtID0gaTsKKwkJCQlyZXR1cm4gZW5kOworCQkJfQorCQl9CisJCWlmIChtYXRjaF9zdHJpbmcoZGF0ZSwgImxhc3QiKSA9PSA0KQorCQkJKm51bSA9IDE7CisJCXJldHVybiBlbmQ7CisJfQorCisJdGwgPSB0eXBlbGVuOworCXdoaWxlICh0bC0+dHlwZSkgeworCQlpbnQgbGVuID0gc3RybGVuKHRsLT50eXBlKTsKKwkJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCB0bC0+dHlwZSkgPj0gbGVuLTEpIHsKKwkJCXVwZGF0ZV90bSh0bSwgdGwtPmxlbmd0aCAqICpudW0pOworCQkJKm51bSA9IDA7CisJCQlyZXR1cm4gZW5kOworCQl9CisJCXRsKys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgd2Vla2RheV9uYW1lc1tpXSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQlpbnQgZGlmZiwgbiA9ICpudW0gLTE7CisJCQkqbnVtID0gMDsKKworCQkJZGlmZiA9IHRtLT50bV93ZGF5IC0gaTsKKwkJCWlmIChkaWZmIDw9IDApCisJCQkJbisrOworCQkJZGlmZiArPSA3Km47CisKKwkJCXVwZGF0ZV90bSh0bSwgZGlmZiAqIDI0ICogNjAgKiA2MCk7CisJCQlyZXR1cm4gZW5kOworCQl9CisJfQorCisJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCAibW9udGhzIikgPj0gNSkgeworCQlpbnQgbiA9IHRtLT50bV9tb24gLSAqbnVtOworCQkqbnVtID0gMDsKKwkJd2hpbGUgKG4gPCAwKSB7CisJCQluICs9IDEyOworCQkJdG0tPnRtX3llYXItLTsKKwkJfQorCQl0bS0+dG1fbW9uID0gbjsKKwkJcmV0dXJuIGVuZDsKKwl9CisKKwlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsICJ5ZWFycyIpID49IDQpIHsKKwkJdG0tPnRtX3llYXIgLT0gKm51bTsKKwkJKm51bSA9IDA7CisJCXJldHVybiBlbmQ7CisJfQorCisJcmV0dXJuIGVuZDsKK30KKwordW5zaWduZWQgbG9uZyBhcHByb3hpZGF0ZShjb25zdCBjaGFyICpkYXRlKQoreworCWludCBudW1iZXIgPSAwOworCXN0cnVjdCB0bSB0bSwgbm93OworCXN0cnVjdCB0aW1ldmFsIHR2OworCWNoYXIgYnVmZmVyWzUwXTsKKworCWlmIChwYXJzZV9kYXRlKGRhdGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpID4gMCkKKwkJcmV0dXJuIHN0cnRvdWwoYnVmZmVyLCBOVUxMLCAxMCk7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOworCW5vdyA9IHRtOworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKmRhdGU7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlkYXRlKys7CisJCWlmIChpc2RpZ2l0KGMpKSB7CisJCQljaGFyICplbmQ7CisJCQludW1iZXIgPSBzdHJ0b3VsKGRhdGUtMSwgJmVuZCwgMTApOworCQkJZGF0ZSA9IGVuZDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpc2FscGhhKGMpKQorCQkJZGF0ZSA9IGFwcHJveGlkYXRlX2FscGhhKGRhdGUtMSwgJnRtLCAmbnVtYmVyKTsKKwl9CisJaWYgKG51bWJlciA+IDAgJiYgbnVtYmVyIDwgMzIpCisJCXRtLnRtX21kYXkgPSBudW1iZXI7CisJaWYgKHRtLnRtX21vbiA+IG5vdy50bV9tb24gJiYgdG0udG1feWVhciA9PSBub3cudG1feWVhcikKKwkJdG0udG1feWVhci0tOworCXJldHVybiBta3RpbWUoJnRtKTsKK30KZGlmZiAtLWdpdCBhL2RlbHRhLmggYi9kZWx0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2Y4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWx0YS5oCkBAIC0wLDAgKzEsOTggQEAKKyNpZm5kZWYgREVMVEFfSAorI2RlZmluZSBERUxUQV9ICisKKy8qIG9wYXF1ZSBvYmplY3QgZm9yIGRlbHRhIGluZGV4ICovCitzdHJ1Y3QgZGVsdGFfaW5kZXg7CisKKy8qCisgKiBjcmVhdGVfZGVsdGFfaW5kZXg6IGNvbXB1dGUgaW5kZXggZGF0YSBmcm9tIGdpdmVuIGJ1ZmZlcgorICoKKyAqIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVsdGFfaW5kZXggdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvCisgKiBzdWJzZXF1ZW50IGNyZWF0ZV9kZWx0YSgpIGNhbGxzLCBvciB0byBmcmVlX2RlbHRhX2luZGV4KCkuICBBIE5VTEwgcG9pbnRlcgorICogaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4gIFRoZSBnaXZlbiBidWZmZXIgbXVzdCBub3QgYmUgZnJlZWQgbm9yIGFsdGVyZWQKKyAqIGJlZm9yZSBmcmVlX2RlbHRhX2luZGV4KCkgaXMgY2FsbGVkLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgbXVzdCBiZSBmcmVlZAorICogdXNpbmcgZnJlZV9kZWx0YV9pbmRleCgpLgorICovCitleHRlcm4gc3RydWN0IGRlbHRhX2luZGV4ICoKK2NyZWF0ZV9kZWx0YV9pbmRleChjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgYnVmc2l6ZSk7CisKKy8qCisgKiBmcmVlX2RlbHRhX2luZGV4OiBmcmVlIHRoZSBpbmRleCBjcmVhdGVkIGJ5IGNyZWF0ZV9kZWx0YV9pbmRleCgpCisgKgorICogR2l2ZW4gcG9pbnRlciBtdXN0IGJlIHdoYXQgY3JlYXRlX2RlbHRhX2luZGV4KCkgcmV0dXJuZWQsIG9yIE5VTEwuCisgKi8KK2V4dGVybiB2b2lkIGZyZWVfZGVsdGFfaW5kZXgoc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCk7CisKKy8qCisgKiBjcmVhdGVfZGVsdGE6IGNyZWF0ZSBhIGRlbHRhIGZyb20gZ2l2ZW4gaW5kZXggZm9yIHRoZSBnaXZlbiBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgYnVmZmVycyB1c2luZworICogdGhlIHNhbWUgZGVsdGFfaW5kZXggcG9pbnRlci4gIElmIG1heF9kZWx0YV9zaXplIGlzIG5vbi16ZXJvIGFuZCB0aGUKKyAqIHJlc3VsdGluZyBkZWx0YSBpcyB0byBiZSBsYXJnZXIgdGhhbiBtYXhfZGVsdGFfc2l6ZSB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuCisgKiBPbiBzdWNjZXNzLCBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWx0YSBkYXRhIGlzCisgKiByZXR1cm5lZCBhbmQgKmRlbHRhX3NpemUgaXMgdXBkYXRlZCB3aXRoIGl0cyBzaXplLiAgVGhlIHJldHVybmVkIGJ1ZmZlcgorICogbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitleHRlcm4gdm9pZCAqCitjcmVhdGVfZGVsdGEoY29uc3Qgc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCwKKwkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBidWZzaXplLAorCSAgICAgdW5zaWduZWQgbG9uZyAqZGVsdGFfc2l6ZSwgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGFfc2l6ZSk7CisKKy8qCisgKiBkaWZmX2RlbHRhOiBjcmVhdGUgYSBkZWx0YSBmcm9tIHNvdXJjZSBidWZmZXIgdG8gdGFyZ2V0IGJ1ZmZlcgorICoKKyAqIElmIG1heF9kZWx0YV9zaXplIGlzIG5vbi16ZXJvIGFuZCB0aGUgcmVzdWx0aW5nIGRlbHRhIGlzIHRvIGJlIGxhcmdlcgorICogdGhhbiBtYXhfZGVsdGFfc2l6ZSB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuICBPbiBzdWNjZXNzLCBhIG5vbi1OVUxMCisgKiBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsdGEgZGF0YSBpcyByZXR1cm5lZCBhbmQgKmRlbHRhX3NpemUgaXMKKyAqIHVwZGF0ZWQgd2l0aCBpdHMgc2l6ZS4gIFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorZGlmZl9kZWx0YShjb25zdCB2b2lkICpzcmNfYnVmLCB1bnNpZ25lZCBsb25nIHNyY19idWZzaXplLAorCSAgIGNvbnN0IHZvaWQgKnRyZ19idWYsIHVuc2lnbmVkIGxvbmcgdHJnX2J1ZnNpemUsCisJICAgdW5zaWduZWQgbG9uZyAqZGVsdGFfc2l6ZSwgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGFfc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4ID0gY3JlYXRlX2RlbHRhX2luZGV4KHNyY19idWYsIHNyY19idWZzaXplKTsKKwlpZiAoaW5kZXgpIHsKKwkJdm9pZCAqZGVsdGEgPSBjcmVhdGVfZGVsdGEoaW5kZXgsIHRyZ19idWYsIHRyZ19idWZzaXplLAorCQkJCQkgICBkZWx0YV9zaXplLCBtYXhfZGVsdGFfc2l6ZSk7CisJCWZyZWVfZGVsdGFfaW5kZXgoaW5kZXgpOworCQlyZXR1cm4gZGVsdGE7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogcGF0Y2hfZGVsdGE6IHJlY3JlYXRlIHRhcmdldCBidWZmZXIgZ2l2ZW4gc291cmNlIGJ1ZmZlciBhbmQgZGVsdGEgZGF0YQorICoKKyAqIE9uIHN1Y2Nlc3MsIGEgbm9uLU5VTEwgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1ZmZlciBpcyByZXR1cm5lZCBhbmQKKyAqICp0cmdfYnVmc2l6ZSBpcyB1cGRhdGVkIHdpdGggaXRzIHNpemUuICBPbiBmYWlsdXJlIGEgTlVMTCBwb2ludGVyIGlzCisgKiByZXR1cm5lZC4gIFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitleHRlcm4gdm9pZCAqcGF0Y2hfZGVsdGEoY29uc3Qgdm9pZCAqc3JjX2J1ZiwgdW5zaWduZWQgbG9uZyBzcmNfc2l6ZSwKKwkJCSBjb25zdCB2b2lkICpkZWx0YV9idWYsIHVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSwKKwkJCSB1bnNpZ25lZCBsb25nICpkc3Rfc2l6ZSk7CisKKy8qIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkZWx0YSBzaXplIGlzIDQgYnl0ZXMgKi8KKyNkZWZpbmUgREVMVEFfU0laRV9NSU4JNAorCisvKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCB0d2ljZSBvbiB0aGUgZGVsdGEgZGF0YSBidWZmZXIsIGZpcnN0IHRvIGdldCB0aGUKKyAqIGV4cGVjdGVkIHNvdXJjZSBidWZmZXIgc2l6ZSwgYW5kIGFnYWluIHRvIGdldCB0aGUgdGFyZ2V0IGJ1ZmZlciBzaXplLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2RlbHRhX2hkcl9zaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipkYXRhcCwKKwkJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRvcCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gKmRhdGFwOworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJaW50IGkgPSAwOworCWRvIHsKKwkJY21kID0gKmRhdGErKzsKKwkJc2l6ZSB8PSAoY21kICYgfjB4ODApIDw8IGk7CisJCWkgKz0gNzsKKwl9IHdoaWxlIChjbWQgJiAweDgwICYmIGRhdGEgPCB0b3ApOworCSpkYXRhcCA9IGRhdGE7CisJcmV0dXJuIHNpemU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGVzY3JpYmUuYyBiL2Rlc2NyaWJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5Y2Q1ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rlc2NyaWJlLmMKQEAgLTAsMCArMSwxNzMgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworI2RlZmluZSBTRUVOICgxdSA8PCAwKQorCitzdGF0aWMgY29uc3QgY2hhciBkZXNjcmliZV91c2FnZVtdID0KKyJnaXQtZGVzY3JpYmUgWy0tYWxsXSBbLS10YWdzXSBbLS1hYmJyZXY9PG4+XSA8Y29tbWl0dGlzaD4qIjsKKworc3RhdGljIGludCBhbGwgPSAwOwkvKiBEZWZhdWx0IHRvIGFubm90YXRlZCB0YWdzIG9ubHkgKi8KK3N0YXRpYyBpbnQgdGFncyA9IDA7CS8qIEJ1dCBhbGxvdyBhbnkgdGFncyBpZiAtLXRhZ3MgaXMgc3BlY2lmaWVkICovCisKK3N0YXRpYyBpbnQgYWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisKK3N0YXRpYyBpbnQgbmFtZXMgPSAwLCBhbGxvY3MgPSAwOworc3RhdGljIHN0cnVjdCBjb21taXRfbmFtZSB7CisJY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWludCBwcmlvOyAvKiBhbm5vdGF0ZWQgdGFnID0gMiwgdGFnID0gMSwgaGVhZCA9IDAgKi8KKwljaGFyIHBhdGhbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK30gKipuYW1lX2FycmF5ID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCBjb21taXRfbmFtZSAqbWF0Y2goc3RydWN0IGNvbW1pdCAqY21pdCkKK3sKKwlpbnQgaSA9IG5hbWVzOworCXN0cnVjdCBjb21taXRfbmFtZSAqKnAgPSBuYW1lX2FycmF5OworCisJd2hpbGUgKGktLSA+IDApIHsKKwkJc3RydWN0IGNvbW1pdF9uYW1lICpuID0gKnArKzsKKwkJaWYgKG4tPmNvbW1pdCA9PSBjbWl0KQorCQkJcmV0dXJuIG47CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhZGRfdG9fa25vd25fbmFtZXMoY29uc3QgY2hhciAqcGF0aCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCQkgICAgICAgaW50IHByaW8pCit7CisJaW50IGlkeDsKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgpKzE7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1pdF9uYW1lKSArIGxlbik7CisKKwluYW1lLT5jb21taXQgPSBjb21taXQ7CisJbmFtZS0+cHJpbyA9IHByaW87IAorCW1lbWNweShuYW1lLT5wYXRoLCBwYXRoLCBsZW4pOworCWlkeCA9IG5hbWVzOworCWlmIChpZHggPj0gYWxsb2NzKSB7CisJCWFsbG9jcyA9IChpZHggKyA1MCkgKiAzIC8gMjsKKwkJbmFtZV9hcnJheSA9IHhyZWFsbG9jKG5hbWVfYXJyYXksIGFsbG9jcypzaXplb2YoKm5hbWVfYXJyYXkpKTsKKwl9CisJbmFtZV9hcnJheVtpZHhdID0gbmFtZTsKKwluYW1lcyA9ICsraWR4OworfQorCitzdGF0aWMgaW50IGdldF9uYW1lKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHNoYTEsIDEpOworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKwlpbnQgcHJpbzsKKworCWlmICghY29tbWl0KQorCQlyZXR1cm4gMDsKKwlvYmplY3QgPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJLyogSWYgLS1hbGwsIHRoZW4gYW55IHJlZnMgYXJlIHVzZWQuCisJICogSWYgLS10YWdzLCB0aGVuIGFueSB0YWdzIGFyZSB1c2VkLgorCSAqIE90aGVyd2lzZSBvbmx5IGFubm90YXRlZCB0YWdzIGFyZSB1c2VkLgorCSAqLworCWlmICghc3RybmNtcChwYXRoLCAicmVmcy90YWdzLyIsIDEwKSkgeworCQlpZiAob2JqZWN0LT50eXBlID09IHRhZ190eXBlKQorCQkJcHJpbyA9IDI7CisJCWVsc2UKKwkJCXByaW8gPSAxOworCX0KKwllbHNlCisJCXByaW8gPSAwOworCisJaWYgKCFhbGwpIHsKKwkJaWYgKCFwcmlvKQorCQkJcmV0dXJuIDA7CisJCWlmICghdGFncyAmJiBwcmlvIDwgMikKKwkJCXJldHVybiAwOworCX0KKwlhZGRfdG9fa25vd25fbmFtZXMoYWxsID8gcGF0aCArIDUgOiBwYXRoICsgMTAsIGNvbW1pdCwgcHJpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9uYW1lcyhjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJc3RydWN0IGNvbW1pdF9uYW1lICphID0gKihzdHJ1Y3QgY29tbWl0X25hbWUgKiopX2E7CisJc3RydWN0IGNvbW1pdF9uYW1lICpiID0gKihzdHJ1Y3QgY29tbWl0X25hbWUgKiopX2I7CisJdW5zaWduZWQgbG9uZyBhX2RhdGUgPSBhLT5jb21taXQtPmRhdGU7CisJdW5zaWduZWQgbG9uZyBiX2RhdGUgPSBiLT5jb21taXQtPmRhdGU7CisKKwlpZiAoYS0+cHJpbyAhPSBiLT5wcmlvKQorCQlyZXR1cm4gYi0+cHJpbyAtIGEtPnByaW87CisJcmV0dXJuIChhX2RhdGUgPiBiX2RhdGUpID8gLTEgOiAoYV9kYXRlID09IGJfZGF0ZSkgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgZGVzY3JpYmUoY2hhciAqYXJnLCBpbnQgbGFzdF9vbmUpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgY29tbWl0ICpjbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdDsKKwlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKm47CisKKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZyk7CisJY21pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCWlmICghY21pdCkKKwkJZGllKCIlcyBpcyBub3QgYSB2YWxpZCAnJXMnIG9iamVjdCIsIGFyZywgY29tbWl0X3R5cGUpOworCisJaWYgKCFpbml0aWFsaXplZCkgeworCQlpbml0aWFsaXplZCA9IDE7CisJCWZvcl9lYWNoX3JlZihnZXRfbmFtZSk7CisJCXFzb3J0KG5hbWVfYXJyYXksIG5hbWVzLCBzaXplb2YoKm5hbWVfYXJyYXkpLCBjb21wYXJlX25hbWVzKTsKKwl9CisKKwluID0gbWF0Y2goY21pdCk7CisJaWYgKG4pIHsKKwkJcHJpbnRmKCIlc1xuIiwgbi0+cGF0aCk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0ID0gTlVMTDsKKwljb21taXRfbGlzdF9pbnNlcnQoY21pdCwgJmxpc3QpOworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmMgPSBwb3BfbW9zdF9yZWNlbnRfY29tbWl0KCZsaXN0LCBTRUVOKTsKKwkJbiA9IG1hdGNoKGMpOworCQlpZiAobikgeworCQkJcHJpbnRmKCIlcy1nJXNcbiIsIG4tPnBhdGgsCisJCQkgICAgICAgZmluZF91bmlxdWVfYWJicmV2KGNtaXQtPm9iamVjdC5zaGExLCBhYmJyZXYpKTsKKwkJCWlmICghbGFzdF9vbmUpCisJCQkJY2xlYXJfY29tbWl0X21hcmtzKGNtaXQsIFNFRU4pOworCQkJcmV0dXJuOworCQl9CisJfQorCWRpZSgiY2Fubm90IGRlc2NyaWJlICclcyciLCBzaGExX3RvX2hleChjbWl0LT5vYmplY3Quc2hhMSkpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgIT0gJy0nKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkKKwkJCWFsbCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS10YWdzIikpCisJCQl0YWdzID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiLS1hYmJyZXY9IiwgOSkpIHsKKwkJCWFiYnJldiA9IHN0cnRvdWwoYXJnICsgOSwgTlVMTCwgMTApOworCQkJaWYgKGFiYnJldiA8IE1JTklNVU1fQUJCUkVWIHx8IDQwIDw9IGFiYnJldikKKwkJCQlhYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJfQorCQllbHNlCisJCQl1c2FnZShkZXNjcmliZV91c2FnZSk7CisJfQorCisJaWYgKGkgPT0gYXJnYykKKwkJZGVzY3JpYmUoIkhFQUQiLCAxKTsKKwllbHNlCisJCXdoaWxlIChpIDwgYXJnYykgeworCQkJZGVzY3JpYmUoYXJndltpXSwgKGkgPT0gYXJnYyAtIDEpKTsKKwkJCWkrKzsKKwkJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kaWZmLWRlbHRhLmMgYi9kaWZmLWRlbHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhNzk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYtZGVsdGEuYwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIGRpZmYtZGVsdGEuYzogZ2VuZXJhdGUgYSBkZWx0YSBiZXR3ZWVuIHR3byBidWZmZXJzCisgKgorICogIE1hbnkgcGFydHMgb2YgdGhpcyBmaWxlIGhhdmUgYmVlbiBsaWZ0ZWQgZnJvbSBMaWJYRGlmZiB2ZXJzaW9uIDAuMTAuCisgKiAgaHR0cDovL3d3dy54bWFpbHNlcnZlci5vcmcveGRpZmYtbGliLmh0bWwKKyAqCisgKiAgTGliWERpZmYgd2FzIHdyaXR0ZW4gYnkgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMwlEYXZpZGUgTGliZW56aQorICoKKyAqICBNYW55IG1vZHMgZm9yIEdJVCB1c2FnZSBieSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+LCAoQykgMjAwNS4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVXNlIG9mIHRoaXMgd2l0aGluIGdpdCBhdXRvbWF0aWNhbGx5IG1lYW5zIHRoYXQgdGhlIExHUEwKKyAqICBsaWNlbnNpbmcgZ2V0cyB0dXJuZWQgaW50byBHUEx2MiB3aXRoaW4gdGhpcyBwcm9qZWN0LgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkZWx0YS5oIgorCisKKy8qIG1heGltdW0gaGFzaCBlbnRyeSBsaXN0IGZvciB0aGUgc2FtZSBoYXNoIGJ1Y2tldCAqLworI2RlZmluZSBIQVNIX0xJTUlUIDY0CisKKyNkZWZpbmUgUkFCSU5fU0hJRlQgMjMKKyNkZWZpbmUgUkFCSU5fV0lORE9XIDE2CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgVFsyNTZdID0geworCTB4MDAwMDAwMDAsIDB4YWI1OWI0ZDEsIDB4NTZiMzY5YTIsIDB4ZmRlYWRkNzMsIDB4MDYzZjY3OTUsIDB4YWQ2NmQzNDQsCisJMHg1MDhjMGUzNywgMHhmYmQ1YmFlNiwgMHgwYzdlY2YyYSwgMHhhNzI3N2JmYiwgMHg1YWNkYTY4OCwgMHhmMTk0MTI1OSwKKwkweDBhNDFhOGJmLCAweGExMTgxYzZlLCAweDVjZjJjMTFkLCAweGY3YWI3NWNjLCAweDE4ZmQ5ZTU0LCAweGIzYTQyYTg1LAorCTB4NGU0ZWY3ZjYsIDB4ZTUxNzQzMjcsIDB4MWVjMmY5YzEsIDB4YjU5YjRkMTAsIDB4NDg3MTkwNjMsIDB4ZTMyODI0YjIsCisJMHgxNDgzNTE3ZSwgMHhiZmRhZTVhZiwgMHg0MjMwMzhkYywgMHhlOTY5OGMwZCwgMHgxMmJjMzZlYiwgMHhiOWU1ODIzYSwKKwkweDQ0MGY1ZjQ5LCAweGVmNTZlYjk4LCAweDMxZmIzY2E4LCAweDlhYTI4ODc5LCAweDY3NDg1NTBhLCAweGNjMTFlMWRiLAorCTB4MzdjNDViM2QsIDB4OWM5ZGVmZWMsIDB4NjE3NzMyOWYsIDB4Y2EyZTg2NGUsIDB4M2Q4NWYzODIsIDB4OTZkYzQ3NTMsCisJMHg2YjM2OWEyMCwgMHhjMDZmMmVmMSwgMHgzYmJhOTQxNywgMHg5MGUzMjBjNiwgMHg2ZDA5ZmRiNSwgMHhjNjUwNDk2NCwKKwkweDI5MDZhMmZjLCAweDgyNWYxNjJkLCAweDdmYjVjYjVlLCAweGQ0ZWM3ZjhmLCAweDJmMzljNTY5LCAweDg0NjA3MWI4LAorCTB4Nzk4YWFjY2IsIDB4ZDJkMzE4MWEsIDB4MjU3ODZkZDYsIDB4OGUyMWQ5MDcsIDB4NzNjYjA0NzQsIDB4ZDg5MmIwYTUsCisJMHgyMzQ3MGE0MywgMHg4ODFlYmU5MiwgMHg3NWY0NjNlMSwgMHhkZWFkZDczMCwgMHg2M2Y2Nzk1MCwgMHhjOGFmY2Q4MSwKKwkweDM1NDUxMGYyLCAweDllMWNhNDIzLCAweDY1YzkxZWM1LCAweGNlOTBhYTE0LCAweDMzN2E3NzY3LCAweDk4MjNjM2I2LAorCTB4NmY4OGI2N2EsIDB4YzRkMTAyYWIsIDB4MzkzYmRmZDgsIDB4OTI2MjZiMDksIDB4NjliN2QxZWYsIDB4YzJlZTY1M2UsCisJMHgzZjA0Yjg0ZCwgMHg5NDVkMGM5YywgMHg3YjBiZTcwNCwgMHhkMDUyNTNkNSwgMHgyZGI4OGVhNiwgMHg4NmUxM2E3NywKKwkweDdkMzQ4MDkxLCAweGQ2NmQzNDQwLCAweDJiODdlOTMzLCAweDgwZGU1ZGUyLCAweDc3NzUyODJlLCAweGRjMmM5Y2ZmLAorCTB4MjFjNjQxOGMsIDB4OGE5ZmY1NWQsIDB4NzE0YTRmYmIsIDB4ZGExM2ZiNmEsIDB4MjdmOTI2MTksIDB4OGNhMDkyYzgsCisJMHg1MjBkNDVmOCwgMHhmOTU0ZjEyOSwgMHgwNGJlMmM1YSwgMHhhZmU3OTg4YiwgMHg1NDMyMjI2ZCwgMHhmZjZiOTZiYywKKwkweDAyODE0YmNmLCAweGE5ZDhmZjFlLCAweDVlNzM4YWQyLCAweGY1MmEzZTAzLCAweDA4YzBlMzcwLCAweGEzOTk1N2ExLAorCTB4NTg0Y2VkNDcsIDB4ZjMxNTU5OTYsIDB4MGVmZjg0ZTUsIDB4YTVhNjMwMzQsIDB4NGFmMGRiYWMsIDB4ZTFhOTZmN2QsCisJMHgxYzQzYjIwZSwgMHhiNzFhMDZkZiwgMHg0Y2NmYmMzOSwgMHhlNzk2MDhlOCwgMHgxYTdjZDU5YiwgMHhiMTI1NjE0YSwKKwkweDQ2OGUxNDg2LCAweGVkZDdhMDU3LCAweDEwM2Q3ZDI0LCAweGJiNjRjOWY1LCAweDQwYjE3MzEzLCAweGViZThjN2MyLAorCTB4MTYwMjFhYjEsIDB4YmQ1YmFlNjAsIDB4NmNiNTQ2NzEsIDB4YzdlY2YyYTAsIDB4M2EwNjJmZDMsIDB4OTE1ZjliMDIsCisJMHg2YThhMjFlNCwgMHhjMWQzOTUzNSwgMHgzYzM5NDg0NiwgMHg5NzYwZmM5NywgMHg2MGNiODk1YiwgMHhjYjkyM2Q4YSwKKwkweDM2NzhlMGY5LCAweDlkMjE1NDI4LCAweDY2ZjRlZWNlLCAweGNkYWQ1YTFmLCAweDMwNDc4NzZjLCAweDliMWUzM2JkLAorCTB4NzQ0OGQ4MjUsIDB4ZGYxMTZjZjQsIDB4MjJmYmIxODcsIDB4ODlhMjA1NTYsIDB4NzI3N2JmYjAsIDB4ZDkyZTBiNjEsCisJMHgyNGM0ZDYxMiwgMHg4ZjlkNjJjMywgMHg3ODM2MTcwZiwgMHhkMzZmYTNkZSwgMHgyZTg1N2VhZCwgMHg4NWRjY2E3YywKKwkweDdlMDk3MDlhLCAweGQ1NTBjNDRiLCAweDI4YmExOTM4LCAweDgzZTNhZGU5LCAweDVkNGU3YWQ5LCAweGY2MTdjZTA4LAorCTB4MGJmZDEzN2IsIDB4YTBhNGE3YWEsIDB4NWI3MTFkNGMsIDB4ZjAyOGE5OWQsIDB4MGRjMjc0ZWUsIDB4YTY5YmMwM2YsCisJMHg1MTMwYjVmMywgMHhmYTY5MDEyMiwgMHgwNzgzZGM1MSwgMHhhY2RhNjg4MCwgMHg1NzBmZDI2NiwgMHhmYzU2NjZiNywKKwkweDAxYmNiYmM0LCAweGFhZTUwZjE1LCAweDQ1YjNlNDhkLCAweGVlZWE1MDVjLCAweDEzMDA4ZDJmLCAweGI4NTkzOWZlLAorCTB4NDM4YzgzMTgsIDB4ZThkNTM3YzksIDB4MTUzZmVhYmEsIDB4YmU2NjVlNmIsIDB4NDljZDJiYTcsIDB4ZTI5NDlmNzYsCisJMHgxZjdlNDIwNSwgMHhiNDI3ZjZkNCwgMHg0ZmYyNGMzMiwgMHhlNGFiZjhlMywgMHgxOTQxMjU5MCwgMHhiMjE4OTE0MSwKKwkweDBmNDMzZjIxLCAweGE0MWE4YmYwLCAweDU5ZjA1NjgzLCAweGYyYTllMjUyLCAweDA5N2M1OGI0LCAweGEyMjVlYzY1LAorCTB4NWZjZjMxMTYsIDB4ZjQ5Njg1YzcsIDB4MDMzZGYwMGIsIDB4YTg2NDQ0ZGEsIDB4NTU4ZTk5YTksIDB4ZmVkNzJkNzgsCisJMHgwNTAyOTc5ZSwgMHhhZTViMjM0ZiwgMHg1M2IxZmUzYywgMHhmOGU4NGFlZCwgMHgxN2JlYTE3NSwgMHhiY2U3MTVhNCwKKwkweDQxMGRjOGQ3LCAweGVhNTQ3YzA2LCAweDExODFjNmUwLCAweGJhZDg3MjMxLCAweDQ3MzJhZjQyLCAweGVjNmIxYjkzLAorCTB4MWJjMDZlNWYsIDB4YjA5OWRhOGUsIDB4NGQ3MzA3ZmQsIDB4ZTYyYWIzMmMsIDB4MWRmZjA5Y2EsIDB4YjZhNmJkMWIsCisJMHg0YjRjNjA2OCwgMHhlMDE1ZDRiOSwgMHgzZWI4MDM4OSwgMHg5NWUxYjc1OCwgMHg2ODBiNmEyYiwgMHhjMzUyZGVmYSwKKwkweDM4ODc2NDFjLCAweDkzZGVkMGNkLCAweDZlMzQwZGJlLCAweGM1NmRiOTZmLCAweDMyYzZjY2EzLCAweDk5OWY3ODcyLAorCTB4NjQ3NWE1MDEsIDB4Y2YyYzExZDAsIDB4MzRmOWFiMzYsIDB4OWZhMDFmZTcsIDB4NjI0YWMyOTQsIDB4YzkxMzc2NDUsCisJMHgyNjQ1OWRkZCwgMHg4ZDFjMjkwYywgMHg3MGY2ZjQ3ZiwgMHhkYmFmNDBhZSwgMHgyMDdhZmE0OCwgMHg4YjIzNGU5OSwKKwkweDc2Yzk5M2VhLCAweGRkOTAyNzNiLCAweDJhM2I1MmY3LCAweDgxNjJlNjI2LCAweDdjODgzYjU1LCAweGQ3ZDE4Zjg0LAorCTB4MmMwNDM1NjIsIDB4ODc1ZDgxYjMsIDB4N2FiNzVjYzAsIDB4ZDFlZWU4MTEKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgVVsyNTZdID0geworCTB4MDAwMDAwMDAsIDB4N2ViNTIwMGQsIDB4NTYzM2Y0Y2IsIDB4Mjg4NmQ0YzYsIDB4MDczZTVkNDcsIDB4Nzk4YjdkNGEsCisJMHg1MTBkYTk4YywgMHgyZmI4ODk4MSwgMHgwZTdjYmE4ZSwgMHg3MGM5OWE4MywgMHg1ODRmNGU0NSwgMHgyNmZhNmU0OCwKKwkweDA5NDJlN2M5LCAweDc3ZjdjN2M0LCAweDVmNzExMzAyLCAweDIxYzQzMzBmLCAweDFjZjk3NTFjLCAweDYyNGM1NTExLAorCTB4NGFjYTgxZDcsIDB4MzQ3ZmExZGEsIDB4MWJjNzI4NWIsIDB4NjU3MjA4NTYsIDB4NGRmNGRjOTAsIDB4MzM0MWZjOWQsCisJMHgxMjg1Y2Y5MiwgMHg2YzMwZWY5ZiwgMHg0NGI2M2I1OSwgMHgzYTAzMWI1NCwgMHgxNWJiOTJkNSwgMHg2YjBlYjJkOCwKKwkweDQzODg2NjFlLCAweDNkM2Q0NjEzLCAweDM5ZjJlYTM4LCAweDQ3NDdjYTM1LCAweDZmYzExZWYzLCAweDExNzQzZWZlLAorCTB4M2VjY2I3N2YsIDB4NDA3OTk3NzIsIDB4NjhmZjQzYjQsIDB4MTY0YTYzYjksIDB4Mzc4ZTUwYjYsIDB4NDkzYjcwYmIsCisJMHg2MWJkYTQ3ZCwgMHgxZjA4ODQ3MCwgMHgzMGIwMGRmMSwgMHg0ZTA1MmRmYywgMHg2NjgzZjkzYSwgMHgxODM2ZDkzNywKKwkweDI1MGI5ZjI0LCAweDViYmViZjI5LCAweDczMzg2YmVmLCAweDBkOGQ0YmUyLCAweDIyMzVjMjYzLCAweDVjODBlMjZlLAorCTB4NzQwNjM2YTgsIDB4MGFiMzE2YTUsIDB4MmI3NzI1YWEsIDB4NTVjMjA1YTcsIDB4N2Q0NGQxNjEsIDB4MDNmMWYxNmMsCisJMHgyYzQ5NzhlZCwgMHg1MmZjNThlMCwgMHg3YTdhOGMyNiwgMHgwNGNmYWMyYiwgMHg3M2U1ZDQ3MCwgMHgwZDUwZjQ3ZCwKKwkweDI1ZDYyMGJiLCAweDViNjMwMGI2LCAweDc0ZGI4OTM3LCAweDBhNmVhOTNhLCAweDIyZTg3ZGZjLCAweDVjNWQ1ZGYxLAorCTB4N2Q5OTZlZmUsIDB4MDMyYzRlZjMsIDB4MmJhYTlhMzUsIDB4NTUxZmJhMzgsIDB4N2FhNzMzYjksIDB4MDQxMjEzYjQsCisJMHgyYzk0Yzc3MiwgMHg1MjIxZTc3ZiwgMHg2ZjFjYTE2YywgMHgxMWE5ODE2MSwgMHgzOTJmNTVhNywgMHg0NzlhNzVhYSwKKwkweDY4MjJmYzJiLCAweDE2OTdkYzI2LCAweDNlMTEwOGUwLCAweDQwYTQyOGVkLCAweDYxNjAxYmUyLCAweDFmZDUzYmVmLAorCTB4Mzc1M2VmMjksIDB4NDllNmNmMjQsIDB4NjY1ZTQ2YTUsIDB4MThlYjY2YTgsIDB4MzA2ZGIyNmUsIDB4NGVkODkyNjMsCisJMHg0YTE3M2U0OCwgMHgzNGEyMWU0NSwgMHgxYzI0Y2E4MywgMHg2MjkxZWE4ZSwgMHg0ZDI5NjMwZiwgMHgzMzljNDMwMiwKKwkweDFiMWE5N2M0LCAweDY1YWZiN2M5LCAweDQ0NmI4NGM2LCAweDNhZGVhNGNiLCAweDEyNTg3MDBkLCAweDZjZWQ1MDAwLAorCTB4NDM1NWQ5ODEsIDB4M2RlMGY5OGMsIDB4MTU2NjJkNGEsIDB4NmJkMzBkNDcsIDB4NTZlZTRiNTQsIDB4Mjg1YjZiNTksCisJMHgwMGRkYmY5ZiwgMHg3ZTY4OWY5MiwgMHg1MWQwMTYxMywgMHgyZjY1MzYxZSwgMHgwN2UzZTJkOCwgMHg3OTU2YzJkNSwKKwkweDU4OTJmMWRhLCAweDI2MjdkMWQ3LCAweDBlYTEwNTExLCAweDcwMTQyNTFjLCAweDVmYWNhYzlkLCAweDIxMTk4YzkwLAorCTB4MDk5ZjU4NTYsIDB4NzcyYTc4NWIsIDB4NGM5MjFjMzEsIDB4MzIyNzNjM2MsIDB4MWFhMWU4ZmEsIDB4NjQxNGM4ZjcsCisJMHg0YmFjNDE3NiwgMHgzNTE5NjE3YiwgMHgxZDlmYjViZCwgMHg2MzJhOTViMCwgMHg0MmVlYTZiZiwgMHgzYzViODZiMiwKKwkweDE0ZGQ1Mjc0LCAweDZhNjg3Mjc5LCAweDQ1ZDBmYmY4LCAweDNiNjVkYmY1LCAweDEzZTMwZjMzLCAweDZkNTYyZjNlLAorCTB4NTA2YjY5MmQsIDB4MmVkZTQ5MjAsIDB4MDY1ODlkZTYsIDB4NzhlZGJkZWIsIDB4NTc1NTM0NmEsIDB4MjllMDE0NjcsCisJMHgwMTY2YzBhMSwgMHg3ZmQzZTBhYywgMHg1ZTE3ZDNhMywgMHgyMGEyZjNhZSwgMHgwODI0Mjc2OCwgMHg3NjkxMDc2NSwKKwkweDU5Mjk4ZWU0LCAweDI3OWNhZWU5LCAweDBmMWE3YTJmLCAweDcxYWY1YTIyLCAweDc1NjBmNjA5LCAweDBiZDVkNjA0LAorCTB4MjM1MzAyYzIsIDB4NWRlNjIyY2YsIDB4NzI1ZWFiNGUsIDB4MGNlYjhiNDMsIDB4MjQ2ZDVmODUsIDB4NWFkODdmODgsCisJMHg3YjFjNGM4NywgMHgwNWE5NmM4YSwgMHgyZDJmYjg0YywgMHg1MzlhOTg0MSwgMHg3YzIyMTFjMCwgMHgwMjk3MzFjZCwKKwkweDJhMTFlNTBiLCAweDU0YTRjNTA2LCAweDY5OTk4MzE1LCAweDE3MmNhMzE4LCAweDNmYWE3N2RlLCAweDQxMWY1N2QzLAorCTB4NmVhN2RlNTIsIDB4MTAxMmZlNWYsIDB4Mzg5NDJhOTksIDB4NDYyMTBhOTQsIDB4NjdlNTM5OWIsIDB4MTk1MDE5OTYsCisJMHgzMWQ2Y2Q1MCwgMHg0ZjYzZWQ1ZCwgMHg2MGRiNjRkYywgMHgxZTZlNDRkMSwgMHgzNmU4OTAxNywgMHg0ODVkYjAxYSwKKwkweDNmNzdjODQxLCAweDQxYzJlODRjLCAweDY5NDQzYzhhLCAweDE3ZjExYzg3LCAweDM4NDk5NTA2LCAweDQ2ZmNiNTBiLAorCTB4NmU3YTYxY2QsIDB4MTBjZjQxYzAsIDB4MzEwYjcyY2YsIDB4NGZiZTUyYzIsIDB4NjczODg2MDQsIDB4MTk4ZGE2MDksCisJMHgzNjM1MmY4OCwgMHg0ODgwMGY4NSwgMHg2MDA2ZGI0MywgMHgxZWIzZmI0ZSwgMHgyMzhlYmQ1ZCwgMHg1ZDNiOWQ1MCwKKwkweDc1YmQ0OTk2LCAweDBiMDg2OTliLCAweDI0YjBlMDFhLCAweDVhMDVjMDE3LCAweDcyODMxNGQxLCAweDBjMzYzNGRjLAorCTB4MmRmMjA3ZDMsIDB4NTM0NzI3ZGUsIDB4N2JjMWYzMTgsIDB4MDU3NGQzMTUsIDB4MmFjYzVhOTQsIDB4NTQ3OTdhOTksCisJMHg3Y2ZmYWU1ZiwgMHgwMjRhOGU1MiwgMHgwNjg1MjI3OSwgMHg3ODMwMDI3NCwgMHg1MGI2ZDZiMiwgMHgyZTAzZjZiZiwKKwkweDAxYmI3ZjNlLCAweDdmMGU1ZjMzLCAweDU3ODg4YmY1LCAweDI5M2RhYmY4LCAweDA4Zjk5OGY3LCAweDc2NGNiOGZhLAorCTB4NWVjYTZjM2MsIDB4MjA3ZjRjMzEsIDB4MGZjN2M1YjAsIDB4NzE3MmU1YmQsIDB4NTlmNDMxN2IsIDB4Mjc0MTExNzYsCisJMHgxYTdjNTc2NSwgMHg2NGM5Nzc2OCwgMHg0YzRmYTNhZSwgMHgzMmZhODNhMywgMHgxZDQyMGEyMiwgMHg2M2Y3MmEyZiwKKwkweDRiNzFmZWU5LCAweDM1YzRkZWU0LCAweDE0MDBlZGViLCAweDZhYjVjZGU2LCAweDQyMzMxOTIwLCAweDNjODYzOTJkLAorCTB4MTMzZWIwYWMsIDB4NmQ4YjkwYTEsIDB4NDUwZDQ0NjcsIDB4M2JiODY0NmEKK307CisKK3N0cnVjdCBpbmRleF9lbnRyeSB7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRyOworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IGluZGV4X2VudHJ5ICpuZXh0OworfTsKKworc3RydWN0IGRlbHRhX2luZGV4IHsKKwljb25zdCB2b2lkICpzcmNfYnVmOworCXVuc2lnbmVkIGxvbmcgc3JjX3NpemU7CisJdW5zaWduZWQgaW50IGhhc2hfbWFzazsKKwlzdHJ1Y3QgaW5kZXhfZW50cnkgKmhhc2hbMF07Cit9OworCitzdHJ1Y3QgZGVsdGFfaW5kZXggKiBjcmVhdGVfZGVsdGFfaW5kZXgoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGJ1ZnNpemUpCit7CisJdW5zaWduZWQgaW50IGksIGhzaXplLCBobWFzaywgZW50cmllcywgcHJldl92YWwsICpoYXNoX2NvdW50OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsICpidWZmZXIgPSBidWY7CisJc3RydWN0IGRlbHRhX2luZGV4ICppbmRleDsKKwlzdHJ1Y3QgaW5kZXhfZW50cnkgKmVudHJ5LCAqKmhhc2g7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZTsKKworCWlmICghYnVmIHx8ICFidWZzaXplKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIERldGVybWluZSBpbmRleCBoYXNoIHNpemUuICBOb3RlIHRoYXQgaW5kZXhpbmcgc2tpcHMgdGhlCisJICAgZmlyc3QgYnl0ZSB0byBhbGxvdyBmb3Igb3B0aW1pemluZyB0aGUgcmFiaW4gcG9seW5vbWlhbAorCSAgIGluaXRpYWxpemF0aW9uIGluIGNyZWF0ZV9kZWx0YSgpLiAqLworCWVudHJpZXMgPSAoYnVmc2l6ZSAtIDEpICAvIFJBQklOX1dJTkRPVzsKKwloc2l6ZSA9IGVudHJpZXMgLyA0OworCWZvciAoaSA9IDQ7ICgxIDw8IGkpIDwgaHNpemUgJiYgaSA8IDMxOyBpKyspOworCWhzaXplID0gMSA8PCBpOworCWhtYXNrID0gaHNpemUgLSAxOworCisJLyogYWxsb2NhdGUgbG9va3VwIGluZGV4ICovCisJbWVtc2l6ZSA9IHNpemVvZigqaW5kZXgpICsKKwkJICBzaXplb2YoKmhhc2gpICogaHNpemUgKworCQkgIHNpemVvZigqZW50cnkpICogZW50cmllczsKKwltZW0gPSBtYWxsb2MobWVtc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCWluZGV4ID0gbWVtOworCW1lbSA9IGluZGV4ICsgMTsKKwloYXNoID0gbWVtOworCW1lbSA9IGhhc2ggKyBoc2l6ZTsKKwllbnRyeSA9IG1lbTsKKworCWluZGV4LT5zcmNfYnVmID0gYnVmOworCWluZGV4LT5zcmNfc2l6ZSA9IGJ1ZnNpemU7CisJaW5kZXgtPmhhc2hfbWFzayA9IGhtYXNrOworCW1lbXNldChoYXNoLCAwLCBoc2l6ZSAqIHNpemVvZigqaGFzaCkpOworCisJLyogYWxsb2NhdGUgYW4gYXJyYXkgdG8gY291bnQgaGFzaCBlbnRyaWVzICovCisJaGFzaF9jb3VudCA9IGNhbGxvYyhoc2l6ZSwgc2l6ZW9mKCpoYXNoX2NvdW50KSk7CisJaWYgKCFoYXNoX2NvdW50KSB7CisJCWZyZWUoaW5kZXgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiB0aGVuIHBvcHVsYXRlIHRoZSBpbmRleCAqLworCXByZXZfdmFsID0gfjA7CisJZm9yIChkYXRhID0gYnVmZmVyICsgZW50cmllcyAqIFJBQklOX1dJTkRPVyAtIFJBQklOX1dJTkRPVzsKKwkgICAgIGRhdGEgPj0gYnVmZmVyOworCSAgICAgZGF0YSAtPSBSQUJJTl9XSU5ET1cpIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9IDA7CisJCWZvciAoaSA9IDE7IGkgPD0gUkFCSU5fV0lORE9XOyBpKyspCisJCQl2YWwgPSAoKHZhbCA8PCA4KSB8IGRhdGFbaV0pIF4gVFt2YWwgPj4gUkFCSU5fU0hJRlRdOworCQlpZiAodmFsID09IHByZXZfdmFsKSB7CisJCQkvKiBrZWVwIHRoZSBsb3dlc3Qgb2YgY29uc2VjdXRpdmUgaWRlbnRpY2FsIGJsb2NrcyAqLworCQkJZW50cnlbLTFdLnB0ciA9IGRhdGEgKyBSQUJJTl9XSU5ET1c7CisJCX0gZWxzZSB7CisJCQlwcmV2X3ZhbCA9IHZhbDsKKwkJCWkgPSB2YWwgJiBobWFzazsKKwkJCWVudHJ5LT5wdHIgPSBkYXRhICsgUkFCSU5fV0lORE9XOworCQkJZW50cnktPnZhbCA9IHZhbDsKKwkJCWVudHJ5LT5uZXh0ID0gaGFzaFtpXTsKKwkJCWhhc2hbaV0gPSBlbnRyeSsrOworCQkJaGFzaF9jb3VudFtpXSsrOworCQl9CisJfQorCisJLyoKKwkgKiBEZXRlcm1pbmUgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNhbWUgaGFzaAorCSAqIGJ1Y2tldC4gIFRoaXMgZ3VhcmQgdXMgYWdhaW5zdCBwYXRvbG9naWNhbCBkYXRhIHNldHMgY2F1c2luZworCSAqIHJlYWxseSBiYWQgaGFzaCBkaXN0cmlidXRpb24gd2l0aCBtb3N0IGVudHJpZXMgaW4gdGhlIHNhbWUgaGFzaAorCSAqIGJ1Y2tldCB0aGF0IHdvdWxkIGJyaW5nIHVzIHRvIE8obSpuKSBjb21wdXRpbmcgY29zdHMgKG0gYW5kIG4KKwkgKiBjb3JyZXNwb25kaW5nIHRvIHJlZmVyZW5jZSBhbmQgdGFyZ2V0IGJ1ZmZlciBzaXplcykuCisJICoKKwkgKiBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgaGFzaCBidWNrZXRzIGhhcyBtb3JlIGVudHJpZXMgdGhhbgorCSAqIHdlJ3JlIHdpbGxpbmcgdG8gdGVzdC4gIE90aGVyd2lzZSB3ZSBjdWxsIHRoZSBlbnRyeSBsaXN0CisJICogdW5pZm9ybWx5IHRvIHN0aWxsIHByZXNlcnZlIGEgZ29vZCByZXBhcnRpdGlvbiBhY3Jvc3MKKwkgKiB0aGUgcmVmZXJlbmNlIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworCQlpZiAoaGFzaF9jb3VudFtpXSA8IEhBU0hfTElNSVQpCisJCQljb250aW51ZTsKKwkJZW50cnkgPSBoYXNoW2ldOworCQlkbyB7CisJCQlzdHJ1Y3QgaW5kZXhfZW50cnkgKmtlZXAgPSBlbnRyeTsKKwkJCWludCBza2lwID0gaGFzaF9jb3VudFtpXSAvIEhBU0hfTElNSVQgLyAyOworCQkJZG8geworCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQl9IHdoaWxlKC0tc2tpcCAmJiBlbnRyeSk7CisJCQlrZWVwLT5uZXh0ID0gZW50cnk7CisJCX0gd2hpbGUoZW50cnkpOworCX0KKwlmcmVlKGhhc2hfY291bnQpOworCisJcmV0dXJuIGluZGV4OworfQorCit2b2lkIGZyZWVfZGVsdGFfaW5kZXgoc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCkKK3sKKwlmcmVlKGluZGV4KTsKK30KKworLyoKKyAqIFRoZSBtYXhpbXVtIHNpemUgZm9yIGFueSBvcGNvZGUgc2VxdWVuY2UsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBoZWFkZXIKKyAqIHBsdXMgcmFiaW4gd2luZG93IHBsdXMgYmlnZ2VzdCBjb3B5LgorICovCisjZGVmaW5lIE1BWF9PUF9TSVpFCSg1ICsgNSArIDEgKyBSQUJJTl9XSU5ET1cgKyA3KQorCit2b2lkICoKK2NyZWF0ZV9kZWx0YShjb25zdCBzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4LAorCSAgICAgY29uc3Qgdm9pZCAqdHJnX2J1ZiwgdW5zaWduZWQgbG9uZyB0cmdfc2l6ZSwKKwkgICAgIHVuc2lnbmVkIGxvbmcgKmRlbHRhX3NpemUsIHVuc2lnbmVkIGxvbmcgbWF4X3NpemUpCit7CisJdW5zaWduZWQgaW50IGksIG91dHBvcywgb3V0c2l6ZSwgdmFsOworCWludCBpbnNjbnQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX2RhdGEsICpyZWZfdG9wLCAqZGF0YSwgKnRvcDsKKwl1bnNpZ25lZCBjaGFyICpvdXQ7CisKKwlpZiAoIXRyZ19idWYgfHwgIXRyZ19zaXplKQorCQlyZXR1cm4gTlVMTDsKKworCW91dHBvcyA9IDA7CisJb3V0c2l6ZSA9IDgxOTI7CisJaWYgKG1heF9zaXplICYmIG91dHNpemUgPj0gbWF4X3NpemUpCisJCW91dHNpemUgPSBtYXhfc2l6ZSArIE1BWF9PUF9TSVpFICsgMTsKKwlvdXQgPSBtYWxsb2Mob3V0c2l6ZSk7CisJaWYgKCFvdXQpCisJCXJldHVybiBOVUxMOworCisJLyogc3RvcmUgcmVmZXJlbmNlIGJ1ZmZlciBzaXplICovCisJaSA9IGluZGV4LT5zcmNfc2l6ZTsKKwl3aGlsZSAoaSA+PSAweDgwKSB7CisJCW91dFtvdXRwb3MrK10gPSBpIHwgMHg4MDsKKwkJaSA+Pj0gNzsKKwl9CisJb3V0W291dHBvcysrXSA9IGk7CisKKwkvKiBzdG9yZSB0YXJnZXQgYnVmZmVyIHNpemUgKi8KKwlpID0gdHJnX3NpemU7CisJd2hpbGUgKGkgPj0gMHg4MCkgeworCQlvdXRbb3V0cG9zKytdID0gaSB8IDB4ODA7CisJCWkgPj49IDc7CisJfQorCW91dFtvdXRwb3MrK10gPSBpOworCisJcmVmX2RhdGEgPSBpbmRleC0+c3JjX2J1ZjsKKwlyZWZfdG9wID0gcmVmX2RhdGEgKyBpbmRleC0+c3JjX3NpemU7CisJZGF0YSA9IHRyZ19idWY7CisJdG9wID0gdHJnX2J1ZiArIHRyZ19zaXplOworCisJb3V0cG9zKys7CisJdmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgUkFCSU5fV0lORE9XICYmIGRhdGEgPCB0b3A7IGkrKywgZGF0YSsrKSB7CisJCW91dFtvdXRwb3MrK10gPSAqZGF0YTsKKwkJdmFsID0gKCh2YWwgPDwgOCkgfCAqZGF0YSkgXiBUW3ZhbCA+PiBSQUJJTl9TSElGVF07CisJfQorCWluc2NudCA9IGk7CisKKwl3aGlsZSAoZGF0YSA8IHRvcCkgeworCQl1bnNpZ25lZCBpbnQgbW9mZiA9IDAsIG1zaXplID0gMDsKKwkJc3RydWN0IGluZGV4X2VudHJ5ICplbnRyeTsKKwkJdmFsIF49IFVbZGF0YVstUkFCSU5fV0lORE9XXV07CisJCXZhbCA9ICgodmFsIDw8IDgpIHwgKmRhdGEpIF4gVFt2YWwgPj4gUkFCSU5fU0hJRlRdOworCQlpID0gdmFsICYgaW5kZXgtPmhhc2hfbWFzazsKKwkJZm9yIChlbnRyeSA9IGluZGV4LT5oYXNoW2ldOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcmVmID0gZW50cnktPnB0cjsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IGRhdGE7CisJCQl1bnNpZ25lZCBpbnQgcmVmX3NpemUgPSByZWZfdG9wIC0gcmVmOworCQkJaWYgKGVudHJ5LT52YWwgIT0gdmFsKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJlZl9zaXplID4gdG9wIC0gc3JjKQorCQkJCXJlZl9zaXplID0gdG9wIC0gc3JjOworCQkJaWYgKHJlZl9zaXplID4gMHgxMDAwMCkKKwkJCQlyZWZfc2l6ZSA9IDB4MTAwMDA7CisJCQlpZiAocmVmX3NpemUgPD0gbXNpemUpCisJCQkJYnJlYWs7CisJCQl3aGlsZSAocmVmX3NpemUtLSAmJiAqc3JjKysgPT0gKnJlZikKKwkJCQlyZWYrKzsKKwkJCWlmIChtc2l6ZSA8IHJlZiAtIGVudHJ5LT5wdHIpIHsKKwkJCQkvKiB0aGlzIGlzIG91ciBiZXN0IG1hdGNoIHNvIGZhciAqLworCQkJCW1zaXplID0gcmVmIC0gZW50cnktPnB0cjsKKwkJCQltb2ZmID0gZW50cnktPnB0ciAtIHJlZl9kYXRhOworCQkJfQorCQl9CisKKwkJaWYgKG1zaXplIDwgNCkgeworCQkJaWYgKCFpbnNjbnQpCisJCQkJb3V0cG9zKys7CisJCQlvdXRbb3V0cG9zKytdID0gKmRhdGErKzsKKwkJCWluc2NudCsrOworCQkJaWYgKGluc2NudCA9PSAweDdmKSB7CisJCQkJb3V0W291dHBvcyAtIGluc2NudCAtIDFdID0gaW5zY250OworCQkJCWluc2NudCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBjaGFyICpvcDsKKworCQkJaWYgKG1zaXplID49IFJBQklOX1dJTkRPVykgeworCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNrOworCQkJCXNrID0gZGF0YSArIG1zaXplIC0gUkFCSU5fV0lORE9XOworCQkJCXZhbCA9IDA7CisJCQkJZm9yIChpID0gMDsgaSA8IFJBQklOX1dJTkRPVzsgaSsrKQorCQkJCQl2YWwgPSAoKHZhbCA8PCA4KSB8ICpzaysrKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwkJCX0gZWxzZSB7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2sgPSBkYXRhICsgMTsKKwkJCQlmb3IgKGkgPSAxOyBpIDwgbXNpemU7IGkrKykgeworCQkJCQl2YWwgXj0gVVtza1stUkFCSU5fV0lORE9XXV07CisJCQkJCXZhbCA9ICgodmFsIDw8IDgpIHwgKnNrKyspIF4gVFt2YWwgPj4gUkFCSU5fU0hJRlRdOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluc2NudCkgeworCQkJCXdoaWxlIChtb2ZmICYmIHJlZl9kYXRhW21vZmYtMV0gPT0gZGF0YVstMV0pIHsKKwkJCQkJaWYgKG1zaXplID09IDB4MTAwMDApCisJCQkJCQlicmVhazsKKwkJCQkJLyogd2UgY2FuIG1hdGNoIG9uZSBieXRlIGJhY2sgKi8KKwkJCQkJbXNpemUrKzsKKwkJCQkJbW9mZi0tOworCQkJCQlkYXRhLS07CisJCQkJCW91dHBvcy0tOworCQkJCQlpZiAoLS1pbnNjbnQpCisJCQkJCQljb250aW51ZTsKKwkJCQkJb3V0cG9zLS07ICAvKiByZW1vdmUgY291bnQgc2xvdCAqLworCQkJCQlpbnNjbnQtLTsgIC8qIG1ha2UgaXQgLTEgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW91dFtvdXRwb3MgLSBpbnNjbnQgLSAxXSA9IGluc2NudDsKKwkJCQlpbnNjbnQgPSAwOworCQkJfQorCisJCQlkYXRhICs9IG1zaXplOworCQkJb3AgPSBvdXQgKyBvdXRwb3MrKzsKKwkJCWkgPSAweDgwOworCisJCQlpZiAobW9mZiAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1vZmY7IGkgfD0gMHgwMTsgfQorCQkJbW9mZiA+Pj0gODsKKwkJCWlmIChtb2ZmICYgMHhmZikgeyBvdXRbb3V0cG9zKytdID0gbW9mZjsgaSB8PSAweDAyOyB9CisJCQltb2ZmID4+PSA4OworCQkJaWYgKG1vZmYgJiAweGZmKSB7IG91dFtvdXRwb3MrK10gPSBtb2ZmOyBpIHw9IDB4MDQ7IH0KKwkJCW1vZmYgPj49IDg7CisJCQlpZiAobW9mZiAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1vZmY7IGkgfD0gMHgwODsgfQorCisJCQlpZiAobXNpemUgJiAweGZmKSB7IG91dFtvdXRwb3MrK10gPSBtc2l6ZTsgaSB8PSAweDEwOyB9CisJCQltc2l6ZSA+Pj0gODsKKwkJCWlmIChtc2l6ZSAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1zaXplOyBpIHw9IDB4MjA7IH0KKworCQkJKm9wID0gaTsKKwkJfQorCisJCWlmIChvdXRwb3MgPj0gb3V0c2l6ZSAtIE1BWF9PUF9TSVpFKSB7CisJCQl2b2lkICp0bXAgPSBvdXQ7CisJCQlvdXRzaXplID0gb3V0c2l6ZSAqIDMgLyAyOworCQkJaWYgKG1heF9zaXplICYmIG91dHNpemUgPj0gbWF4X3NpemUpCisJCQkJb3V0c2l6ZSA9IG1heF9zaXplICsgTUFYX09QX1NJWkUgKyAxOworCQkJaWYgKG1heF9zaXplICYmIG91dHBvcyA+IG1heF9zaXplKQorCQkJCWJyZWFrOworCQkJb3V0ID0gcmVhbGxvYyhvdXQsIG91dHNpemUpOworCQkJaWYgKCFvdXQpIHsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaW5zY250KQorCQlvdXRbb3V0cG9zIC0gaW5zY250IC0gMV0gPSBpbnNjbnQ7CisKKwlpZiAobWF4X3NpemUgJiYgb3V0cG9zID4gbWF4X3NpemUpIHsKKwkJZnJlZShvdXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqZGVsdGFfc2l6ZSA9IG91dHBvczsKKwlyZXR1cm4gb3V0OworfQpkaWZmIC0tZ2l0IGEvZGlmZi1saWIuYyBiL2RpZmYtbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4M2I0MQotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYtbGliLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorCisvKgorICogZGlmZi1maWxlcworICovCisKK2ludCBydW5fZGlmZl9maWxlcyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGludCBzaWxlbnRfb25fcmVtb3ZlZCkKK3sKKwlpbnQgZW50cmllcywgaTsKKwlpbnQgZGlmZl91bm1lcmdlZF9zdGFnZSA9IHJldnMtPm1heF9jb3VudDsKKworCWlmIChkaWZmX3VubWVyZ2VkX3N0YWdlIDwgMCkKKwkJZGlmZl91bm1lcmdlZF9zdGFnZSA9IDI7CisJZW50cmllcyA9IHJlYWRfY2FjaGUoKTsKKwlpZiAoZW50cmllcyA8IDApIHsKKwkJcGVycm9yKCJyZWFkX2NhY2hlIik7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJdW5zaWduZWQgaW50IG9sZG1vZGUsIG5ld21vZGU7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWludCBjaGFuZ2VkOworCisJCWlmICghY2VfcGF0aF9tYXRjaChjZSwgcmV2cy0+cHJ1bmVfZGF0YSkpCisJCQljb250aW51ZTsKKworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCBwOworCQkJCXN0cnVjdCBjb21iaW5lX2RpZmZfcGFyZW50IGZpbGxlcls1XTsKKwkJCX0gY29tYmluZTsKKwkJCWludCBudW1fY29tcGFyZV9zdGFnZXMgPSAwOworCisJCQljb21iaW5lLnAubmV4dCA9IE5VTEw7CisJCQljb21iaW5lLnAubGVuID0gY2VfbmFtZWxlbihjZSk7CisJCQljb21iaW5lLnAucGF0aCA9IHhtYWxsb2MoY29tYmluZS5wLmxlbiArIDEpOworCQkJbWVtY3B5KGNvbWJpbmUucC5wYXRoLCBjZS0+bmFtZSwgY29tYmluZS5wLmxlbik7CisJCQljb21iaW5lLnAucGF0aFtjb21iaW5lLnAubGVuXSA9IDA7CisJCQljb21iaW5lLnAubW9kZSA9IDA7CisJCQltZW1zZXQoY29tYmluZS5wLnNoYTEsIDAsIDIwKTsKKwkJCW1lbXNldCgmY29tYmluZS5wLnBhcmVudFswXSwgMCwKKwkJCSAgICAgICBzaXplb2YoY29tYmluZS5maWxsZXIpKTsKKworCQkJd2hpbGUgKGkgPCBlbnRyaWVzKSB7CisJCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpuY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCQkJaW50IHN0YWdlOworCisJCQkJaWYgKHN0cmNtcChjZS0+bmFtZSwgbmNlLT5uYW1lKSkKKwkJCQkJYnJlYWs7CisKKwkJCQkvKiBTdGFnZSAjMiAob3VycykgaXMgdGhlIGZpcnN0IHBhcmVudCwKKwkJCQkgKiBzdGFnZSAjMyAodGhlaXJzKSBpcyB0aGUgc2Vjb25kLgorCQkJCSAqLworCQkJCXN0YWdlID0gY2Vfc3RhZ2UobmNlKTsKKwkJCQlpZiAoMiA8PSBzdGFnZSkgeworCQkJCQlpbnQgbW9kZSA9IG50b2hsKG5jZS0+Y2VfbW9kZSk7CisJCQkJCW51bV9jb21wYXJlX3N0YWdlcysrOworCQkJCQltZW1jcHkoY29tYmluZS5wLnBhcmVudFtzdGFnZS0yXS5zaGExLAorCQkJCQkgICAgICAgbmNlLT5zaGExLCAyMCk7CisJCQkJCWNvbWJpbmUucC5wYXJlbnRbc3RhZ2UtMl0ubW9kZSA9CisJCQkJCQljYW5vbl9tb2RlKG1vZGUpOworCQkJCQljb21iaW5lLnAucGFyZW50W3N0YWdlLTJdLnN0YXR1cyA9CisJCQkJCQlESUZGX1NUQVRVU19NT0RJRklFRDsKKwkJCQl9CisKKwkJCQkvKiBkaWZmIGFnYWluc3QgdGhlIHByb3BlciB1bm1lcmdlZCBzdGFnZSAqLworCQkJCWlmIChzdGFnZSA9PSBkaWZmX3VubWVyZ2VkX3N0YWdlKQorCQkJCQljZSA9IG5jZTsKKwkJCQlpKys7CisJCQl9CisJCQkvKgorCQkJICogQ29tcGVuc2F0ZSBmb3IgbG9vcCB1cGRhdGUKKwkJCSAqLworCQkJaS0tOworCisJCQlpZiAocmV2cy0+Y29tYmluZV9tZXJnZXMgJiYgbnVtX2NvbXBhcmVfc3RhZ2VzID09IDIpIHsKKwkJCQlzaG93X2NvbWJpbmVkX2RpZmYoJmNvbWJpbmUucCwgMiwKKwkJCQkJCSAgIHJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcywKKwkJCQkJCSAgIHJldnMpOworCQkJCWZyZWUoY29tYmluZS5wLnBhdGgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnJlZShjb21iaW5lLnAucGF0aCk7CisKKwkJCS8qCisJCQkgKiBTaG93IHRoZSBkaWZmIGZvciB0aGUgJ2NlJyBpZiB3ZSBmb3VuZCB0aGUgb25lCisJCQkgKiBmcm9tIHRoZSBkZXNpcmVkIHN0YWdlLgorCQkJICovCisJCQlkaWZmX3VubWVyZ2UoJnJldnMtPmRpZmZvcHQsIGNlLT5uYW1lKTsKKwkJCWlmIChjZV9zdGFnZShjZSkgIT0gZGlmZl91bm1lcmdlZF9zdGFnZSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsc3RhdChjZS0+bmFtZSwgJnN0KSA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQgJiYgZXJybm8gIT0gRU5PVERJUikgeworCQkJCXBlcnJvcihjZS0+bmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc2lsZW50X29uX3JlbW92ZWQpCisJCQkJY29udGludWU7CisJCQlkaWZmX2FkZHJlbW92ZSgmcmV2cy0+ZGlmZm9wdCwgJy0nLCBudG9obChjZS0+Y2VfbW9kZSksCisJCQkJICAgICAgIGNlLT5zaGExLCBjZS0+bmFtZSwgTlVMTCk7CisJCQljb250aW51ZTsKKwkJfQorCQljaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCAwKTsKKwkJaWYgKCFjaGFuZ2VkICYmICFyZXZzLT5kaWZmb3B0LmZpbmRfY29waWVzX2hhcmRlcikKKwkJCWNvbnRpbnVlOworCQlvbGRtb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCisJCW5ld21vZGUgPSBjYW5vbl9tb2RlKHN0LnN0X21vZGUpOworCQlpZiAoIXRydXN0X2V4ZWN1dGFibGVfYml0ICYmCisJCSAgICBTX0lTUkVHKG5ld21vZGUpICYmIFNfSVNSRUcob2xkbW9kZSkgJiYKKwkJICAgICgobmV3bW9kZSBeIG9sZG1vZGUpID09IDAxMTEpKQorCQkJbmV3bW9kZSA9IG9sZG1vZGU7CisJCWRpZmZfY2hhbmdlKCZyZXZzLT5kaWZmb3B0LCBvbGRtb2RlLCBuZXdtb2RlLAorCQkJICAgIGNlLT5zaGExLCAoY2hhbmdlZCA/IG51bGxfc2hhMSA6IGNlLT5zaGExKSwKKwkJCSAgICBjZS0+bmFtZSwgTlVMTCk7CisKKwl9CisJZGlmZmNvcmVfc3RkKCZyZXZzLT5kaWZmb3B0KTsKKwlkaWZmX2ZsdXNoKCZyZXZzLT5kaWZmb3B0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRpZmYtaW5kZXgKKyAqLworCisvKiBBIGZpbGUgZW50cnkgd2VudCBhd2F5IG9yIGFwcGVhcmVkICovCitzdGF0aWMgdm9pZCBkaWZmX2luZGV4X3Nob3dfZmlsZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkJIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCQkgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwKKwkJCQkgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJZGlmZl9hZGRyZW1vdmUoJnJldnMtPmRpZmZvcHQsIHByZWZpeFswXSwgbnRvaGwobW9kZSksCisJCSAgICAgICBzaGExLCBjZS0+bmFtZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3N0YXRfZGF0YShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLAorCQkJIHVuc2lnbmVkIGNoYXIgKipzaGExcCwKKwkJCSB1bnNpZ25lZCBpbnQgKm1vZGVwLAorCQkJIGludCBjYWNoZWQsIGludCBtYXRjaF9taXNzaW5nKQoreworCXVuc2lnbmVkIGNoYXIgKnNoYTEgPSBjZS0+c2hhMTsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IGNlLT5jZV9tb2RlOworCisJaWYgKCFjYWNoZWQpIHsKKwkJc3RhdGljIHVuc2lnbmVkIGNoYXIgbm9fc2hhMVsyMF07CisJCWludCBjaGFuZ2VkOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCAmJiBtYXRjaF9taXNzaW5nKSB7CisJCQkJKnNoYTFwID0gc2hhMTsKKwkJCQkqbW9kZXAgPSBtb2RlOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisJCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDApOworCQlpZiAoY2hhbmdlZCkgeworCQkJbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKHN0LnN0X21vZGUpOworCQkJaWYgKCF0cnVzdF9leGVjdXRhYmxlX2JpdCAmJiBTX0lTUkVHKHN0LnN0X21vZGUpKQorCQkJCW1vZGUgPSBjZS0+Y2VfbW9kZTsKKwkJCXNoYTEgPSBub19zaGExOworCQl9CisJfQorCisJKnNoYTFwID0gc2hhMTsKKwkqbW9kZXAgPSBtb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaG93X25ld19maWxlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgc3RydWN0IGNhY2hlX2VudHJ5ICpuZXcsCisJCQkgIGludCBjYWNoZWQsIGludCBtYXRjaF9taXNzaW5nKQoreworCXVuc2lnbmVkIGNoYXIgKnNoYTE7CisJdW5zaWduZWQgaW50IG1vZGU7CisKKwkvKiBOZXcgZmlsZSBpbiB0aGUgaW5kZXg6IGl0IG1pZ2h0IGFjdHVhbGx5IGJlIGRpZmZlcmVudCBpbgorCSAqIHRoZSB3b3JraW5nIGNvcHkuCisJICovCisJaWYgKGdldF9zdGF0X2RhdGEobmV3LCAmc2hhMSwgJm1vZGUsIGNhY2hlZCwgbWF0Y2hfbWlzc2luZykgPCAwKQorCQlyZXR1cm47CisKKwlkaWZmX2luZGV4X3Nob3dfZmlsZShyZXZzLCAiKyIsIG5ldywgc2hhMSwgbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19tb2RpZmllZChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQsCisJCQkgc3RydWN0IGNhY2hlX2VudHJ5ICpuZXcsCisJCQkgaW50IHJlcG9ydF9taXNzaW5nLAorCQkJIGludCBjYWNoZWQsIGludCBtYXRjaF9taXNzaW5nKQoreworCXVuc2lnbmVkIGludCBtb2RlLCBvbGRtb2RlOworCXVuc2lnbmVkIGNoYXIgKnNoYTE7CisKKwlpZiAoZ2V0X3N0YXRfZGF0YShuZXcsICZzaGExLCAmbW9kZSwgY2FjaGVkLCBtYXRjaF9taXNzaW5nKSA8IDApIHsKKwkJaWYgKHJlcG9ydF9taXNzaW5nKQorCQkJZGlmZl9pbmRleF9zaG93X2ZpbGUocmV2cywgIi0iLCBvbGQsCisJCQkJCSAgICAgb2xkLT5zaGExLCBvbGQtPmNlX21vZGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJb2xkbW9kZSA9IG9sZC0+Y2VfbW9kZTsKKwlpZiAobW9kZSA9PSBvbGRtb2RlICYmICFtZW1jbXAoc2hhMSwgb2xkLT5zaGExLCAyMCkgJiYKKwkgICAgIXJldnMtPmRpZmZvcHQuZmluZF9jb3BpZXNfaGFyZGVyKQorCQlyZXR1cm4gMDsKKworCW1vZGUgPSBudG9obChtb2RlKTsKKwlvbGRtb2RlID0gbnRvaGwob2xkbW9kZSk7CisKKwlkaWZmX2NoYW5nZSgmcmV2cy0+ZGlmZm9wdCwgb2xkbW9kZSwgbW9kZSwKKwkJICAgIG9sZC0+c2hhMSwgc2hhMSwgb2xkLT5uYW1lLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWZmX2NhY2hlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJICAgICAgc3RydWN0IGNhY2hlX2VudHJ5ICoqYWMsIGludCBlbnRyaWVzLAorCQkgICAgICBjb25zdCBjaGFyICoqcGF0aHNwZWMsCisJCSAgICAgIGludCBjYWNoZWQsIGludCBtYXRjaF9taXNzaW5nKQoreworCXdoaWxlIChlbnRyaWVzKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSAqYWM7CisJCWludCBzYW1lID0gKGVudHJpZXMgPiAxKSAmJiBjZV9zYW1lX25hbWUoY2UsIGFjWzFdKTsKKworCQlpZiAoIWNlX3BhdGhfbWF0Y2goY2UsIHBhdGhzcGVjKSkKKwkJCWdvdG8gc2tpcF9lbnRyeTsKKworCQlzd2l0Y2ggKGNlX3N0YWdlKGNlKSkgeworCQljYXNlIDA6CisJCQkvKiBObyBzdGFnZSAxIGVudHJ5PyBUaGF0IG1lYW5zIGl0J3MgYSBuZXcgZmlsZSAqLworCQkJaWYgKCFzYW1lKSB7CisJCQkJc2hvd19uZXdfZmlsZShyZXZzLCBjZSwgY2FjaGVkLCBtYXRjaF9taXNzaW5nKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFNob3cgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3ICovCisJCQlzaG93X21vZGlmaWVkKHJldnMsYWNbMV0sIGNlLCAxLAorCQkJCSAgICAgIGNhY2hlZCwgbWF0Y2hfbWlzc2luZyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJLyogTm8gc3RhZ2UgMyAobWVyZ2UpIGVudHJ5PworCQkJICogVGhhdCBtZWFucyBpdCdzIGJlZW4gZGVsZXRlZC4KKwkJCSAqLworCQkJaWYgKCFzYW1lKSB7CisJCQkJZGlmZl9pbmRleF9zaG93X2ZpbGUocmV2cywgIi0iLCBjZSwKKwkJCQkJCSAgICAgY2UtPnNoYTEsIGNlLT5jZV9tb2RlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFdlIGNvbWUgaGVyZSB3aXRoIGNlIHBvaW50aW5nIGF0IHN0YWdlIDEKKwkJCSAqIChvcmlnaW5hbCB0cmVlKSBhbmQgYWNbMV0gcG9pbnRpbmcgYXQgc3RhZ2UKKwkJCSAqIDMgKHVubWVyZ2VkKS4gIHNob3ctbW9kaWZpZWQgd2l0aAorCQkJICogcmVwb3J0LW1pc3Npbmcgc2V0IHRvIGZhbHNlIGRvZXMgbm90IHNheSB0aGUKKwkJCSAqIGZpbGUgaXMgZGVsZXRlZCBidXQgcmVwb3J0cyB0cnVlIGlmIHdvcmsKKwkJCSAqIHRyZWUgZG9lcyBub3QgaGF2ZSBpdCwgaW4gd2hpY2ggY2FzZSB3ZQorCQkJICogZmFsbCB0aHJvdWdoIHRvIHJlcG9ydCB0aGUgdW5tZXJnZWQgc3RhdGUuCisJCQkgKiBPdGhlcndpc2UsIHdlIHNob3cgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KKwkJCSAqIHRoZSBvcmlnaW5hbCB0cmVlIGFuZCB0aGUgd29yayB0cmVlLgorCQkJICovCisJCQlpZiAoIWNhY2hlZCAmJgorCQkJICAgICFzaG93X21vZGlmaWVkKHJldnMsIGNlLCBhY1sxXSwgMCwKKwkJCQkJICAgY2FjaGVkLCBtYXRjaF9taXNzaW5nKSkKKwkJCQlicmVhazsKKwkJCS8qIGZhbGx0aHJ1ICovCisJCWNhc2UgMzoKKwkJCWRpZmZfdW5tZXJnZSgmcmV2cy0+ZGlmZm9wdCwgY2UtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRpZSgiaW1wb3NzaWJsZSBjYWNoZSBlbnRyeSBzdGFnZSIpOworCQl9CisKK3NraXBfZW50cnk6CisJCS8qCisJCSAqIElnbm9yZSBhbGwgdGhlIGRpZmZlcmVudCBzdGFnZXMgZm9yIHRoaXMgZmlsZSwKKwkJICogd2UndmUgaGFuZGxlZCB0aGUgcmVsZXZhbnQgY2FzZXMgbm93LgorCQkgKi8KKwkJZG8geworCQkJYWMrKzsKKwkJCWVudHJpZXMtLTsKKwkJfSB3aGlsZSAoZW50cmllcyAmJiBjZV9zYW1lX25hbWUoY2UsIGFjWzBdKSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyB0dXJucyBhbGwgbWVyZ2UgZW50cmllcyBpbnRvICJzdGFnZSAzIi4gVGhhdCBndWFyYW50ZWVzIHRoYXQKKyAqIHdoZW4gd2UgcmVhZCBpbiB0aGUgbmV3IHRyZWUgKGludG8gInN0YWdlIDEiKSwgd2Ugd29uJ3QgbG9zZSBzaWdodAorICogb2YgdGhlIGZhY3QgdGhhdCB3ZSBoYWQgdW5tZXJnZWQgZW50cmllcy4KKyAqLworc3RhdGljIHZvaWQgbWFya19tZXJnZV9lbnRyaWVzKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghY2Vfc3RhZ2UoY2UpKQorCQkJY29udGludWU7CisJCWNlLT5jZV9mbGFncyB8PSBodG9ucyhDRV9TVEFHRU1BU0spOworCX0KK30KKworaW50IHJ1bl9kaWZmX2luZGV4KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IGNhY2hlZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvYmplY3QgKmVudDsKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKwljb25zdCBjaGFyICp0cmVlX25hbWU7CisJaW50IG1hdGNoX21pc3NpbmcgPSAwOworCisJLyogCisJICogQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3YXJ0IC0gImRpZmYtaW5kZXggLW0iIGRvZXMKKwkgKiBub3QgbWVhbiAiZG8gbm90IGlnbm9yZSBtZXJnZXMiLCBidXQgdG90YWxseSBkaWZmZXJlbnQuCisJICovCisJaWYgKCFyZXZzLT5pZ25vcmVfbWVyZ2VzKQorCQltYXRjaF9taXNzaW5nID0gMTsKKworCWlmIChyZWFkX2NhY2hlKCkgPCAwKSB7CisJCXBlcnJvcigicmVhZF9jYWNoZSIpOworCQlyZXR1cm4gLTE7CisJfQorCW1hcmtfbWVyZ2VfZW50cmllcygpOworCisJZW50ID0gcmV2cy0+cGVuZGluZ19vYmplY3RzLT5pdGVtOworCXRyZWVfbmFtZSA9IHJldnMtPnBlbmRpbmdfb2JqZWN0cy0+bmFtZTsKKwl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdChlbnQtPnNoYTEpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIGVycm9yKCJiYWQgdHJlZSBvYmplY3QgJXMiLCB0cmVlX25hbWUpOworCWlmIChyZWFkX3RyZWUodHJlZSwgMSwgcmV2cy0+cHJ1bmVfZGF0YSkpCisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHJlYWQgdHJlZSBvYmplY3QgJXMiLCB0cmVlX25hbWUpOworCXJldCA9IGRpZmZfY2FjaGUocmV2cywgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIsIHJldnMtPnBydW5lX2RhdGEsCisJCQkgY2FjaGVkLCBtYXRjaF9taXNzaW5nKTsKKwlkaWZmY29yZV9zdGQoJnJldnMtPmRpZmZvcHQpOworCWRpZmZfZmx1c2goJnJldnMtPmRpZmZvcHQpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kaWZmLmMgYi9kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5Y2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYuYwpAQCAtMCwwICsxLDIxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisKK3N0YXRpYyBpbnQgdXNlX3NpemVfY2FjaGU7CisKK2ludCBkaWZmX3JlbmFtZV9saW1pdF9kZWZhdWx0ID0gLTE7CisKK2ludCBnaXRfZGlmZl9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJkaWZmLnJlbmFtZWxpbWl0IikpIHsKKwkJZGlmZl9yZW5hbWVfbGltaXRfZGVmYXVsdCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfb25lKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbmVlZGxlbjsKKwljaGFyICp4cDsKKworCWlmICghc3RyKQorCQlyZXR1cm4gTlVMTDsKKwluZWVkbGVuID0gcXVvdGVfY19zdHlsZShzdHIsIE5VTEwsIE5VTEwsIDApOworCWlmICghbmVlZGxlbikKKwkJcmV0dXJuIHN0cmR1cChzdHIpOworCXhwID0geG1hbGxvYyhuZWVkbGVuICsgMSk7CisJcXVvdGVfY19zdHlsZShzdHIsIHhwLCBOVUxMLCAwKTsKKwlyZXR1cm4geHA7Cit9CisKK3N0YXRpYyBjaGFyICpxdW90ZV90d28oY29uc3QgY2hhciAqb25lLCBjb25zdCBjaGFyICp0d28pCit7CisJaW50IG5lZWRfb25lID0gcXVvdGVfY19zdHlsZShvbmUsIE5VTEwsIE5VTEwsIDEpOworCWludCBuZWVkX3R3byA9IHF1b3RlX2Nfc3R5bGUodHdvLCBOVUxMLCBOVUxMLCAxKTsKKwljaGFyICp4cDsKKworCWlmIChuZWVkX29uZSArIG5lZWRfdHdvKSB7CisJCWlmICghbmVlZF9vbmUpIG5lZWRfb25lID0gc3RybGVuKG9uZSk7CisJCWlmICghbmVlZF90d28pIG5lZWRfb25lID0gc3RybGVuKHR3byk7CisKKwkJeHAgPSB4bWFsbG9jKG5lZWRfb25lICsgbmVlZF90d28gKyAzKTsKKwkJeHBbMF0gPSAnIic7CisJCXF1b3RlX2Nfc3R5bGUob25lLCB4cCArIDEsIE5VTEwsIDEpOworCQlxdW90ZV9jX3N0eWxlKHR3bywgeHAgKyBuZWVkX29uZSArIDEsIE5VTEwsIDEpOworCQlzdHJjcHkoeHAgKyBuZWVkX29uZSArIG5lZWRfdHdvICsgMSwgIlwiIik7CisJCXJldHVybiB4cDsKKwl9CisJbmVlZF9vbmUgPSBzdHJsZW4ob25lKTsKKwluZWVkX3R3byA9IHN0cmxlbih0d28pOworCXhwID0geG1hbGxvYyhuZWVkX29uZSArIG5lZWRfdHdvICsgMSk7CisJc3RyY3B5KHhwLCBvbmUpOworCXN0cmNweSh4cCArIG5lZWRfb25lLCB0d28pOworCXJldHVybiB4cDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVybmFsX2RpZmYodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqZXh0ZXJuYWxfZGlmZl9jbWQgPSBOVUxMOworCXN0YXRpYyBpbnQgZG9uZV9wcmVwYXJpbmcgPSAwOworCisJaWYgKGRvbmVfcHJlcGFyaW5nKQorCQlyZXR1cm4gZXh0ZXJuYWxfZGlmZl9jbWQ7CisJZXh0ZXJuYWxfZGlmZl9jbWQgPSBnZXRlbnYoIkdJVF9FWFRFUk5BTF9ESUZGIik7CisJZG9uZV9wcmVwYXJpbmcgPSAxOworCXJldHVybiBleHRlcm5hbF9kaWZmX2NtZDsKK30KKworI2RlZmluZSBURU1QRklMRV9QQVRIX0xFTgkJNTAKKworc3RhdGljIHN0cnVjdCBkaWZmX3RlbXBmaWxlIHsKKwljb25zdCBjaGFyICpuYW1lOyAvKiBmaWxlbmFtZSBleHRlcm5hbCBkaWZmIHNob3VsZCByZWFkIGZyb20gKi8KKwljaGFyIGhleFs0MV07CisJY2hhciBtb2RlWzEwXTsKKwljaGFyIHRtcF9wYXRoW1RFTVBGSUxFX1BBVEhfTEVOXTsKK30gZGlmZl90ZW1wWzJdOworCitzdGF0aWMgaW50IGNvdW50X2xpbmVzKGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCWludCBjb3VudCwgY2gsIGNvbXBsZXRlbHlfZW1wdHkgPSAxLCBubF9qdXN0X3NlZW4gPSAwOworCWNvdW50ID0gMDsKKwl3aGlsZSAoMCA8IHNpemUtLSkgeworCQljaCA9ICpkYXRhKys7CisJCWlmIChjaCA9PSAnXG4nKSB7CisJCQljb3VudCsrOworCQkJbmxfanVzdF9zZWVuID0gMTsKKwkJCWNvbXBsZXRlbHlfZW1wdHkgPSAwOworCQl9CisJCWVsc2UgeworCQkJbmxfanVzdF9zZWVuID0gMDsKKwkJCWNvbXBsZXRlbHlfZW1wdHkgPSAwOworCQl9CisJfQorCWlmIChjb21wbGV0ZWx5X2VtcHR5KQorCQlyZXR1cm4gMDsKKwlpZiAoIW5sX2p1c3Rfc2VlbikKKwkJY291bnQrKzsgLyogbm8gdHJhaWxpbmcgbmV3bGluZSAqLworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbGluZV9jb3VudChpbnQgY291bnQpCit7CisJc3dpdGNoIChjb3VudCkgeworCWNhc2UgMDoKKwkJcHJpbnRmKCIwLDAiKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwcmludGYoIjEiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIxLCVkIiwgY291bnQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfZmlsZShpbnQgcHJlZml4LCBjb25zdCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwlpbnQgY2gsIG5sX2p1c3Rfc2VlbiA9IDE7CisJd2hpbGUgKDAgPCBzaXplLS0pIHsKKwkJY2ggPSAqZGF0YSsrOworCQlpZiAobmxfanVzdF9zZWVuKQorCQkJcHV0Y2hhcihwcmVmaXgpOworCQlwdXRjaGFyKGNoKTsKKwkJaWYgKGNoID09ICdcbicpCisJCQlubF9qdXN0X3NlZW4gPSAxOworCQllbHNlCisJCQlubF9qdXN0X3NlZW4gPSAwOworCX0KKwlpZiAoIW5sX2p1c3Rfc2VlbikKKwkJcHJpbnRmKCJcblxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcbiIpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3Jld3JpdGVfZGlmZihjb25zdCBjaGFyICpuYW1lX2EsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lX2IsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bykKK3sKKwlpbnQgbGNfYSwgbGNfYjsKKwlkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKG9uZSwgMCk7CisJZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyh0d28sIDApOworCWxjX2EgPSBjb3VudF9saW5lcyhvbmUtPmRhdGEsIG9uZS0+c2l6ZSk7CisJbGNfYiA9IGNvdW50X2xpbmVzKHR3by0+ZGF0YSwgdHdvLT5zaXplKTsKKwlwcmludGYoIi0tLSAlc1xuKysrICVzXG5AQCAtIiwgbmFtZV9hLCBuYW1lX2IpOworCXByaW50X2xpbmVfY291bnQobGNfYSk7CisJcHJpbnRmKCIgKyIpOworCXByaW50X2xpbmVfY291bnQobGNfYik7CisJcHJpbnRmKCIgQEBcbiIpOworCWlmIChsY19hKQorCQljb3B5X2ZpbGUoJy0nLCBvbmUtPmRhdGEsIG9uZS0+c2l6ZSk7CisJaWYgKGxjX2IpCisJCWNvcHlfZmlsZSgnKycsIHR3by0+ZGF0YSwgdHdvLT5zaXplKTsKK30KKworc3RhdGljIGludCBmaWxsX21tZmlsZShtbWZpbGVfdCAqbWYsIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJaWYgKCFESUZGX0ZJTEVfVkFMSUQob25lKSkgeworCQltZi0+cHRyID0gIiI7IC8qIGRvZXMgbm90IG1hdHRlciAqLworCQltZi0+c2l6ZSA9IDA7CisJCXJldHVybiAwOworCX0KKwllbHNlIGlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKG9uZSwgMCkpCisJCXJldHVybiAtMTsKKwltZi0+cHRyID0gb25lLT5kYXRhOworCW1mLT5zaXplID0gb25lLT5zaXplOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZW1pdF9jYWxsYmFjayB7CisJY29uc3QgY2hhciAqKmxhYmVsX3BhdGg7Cit9OworCitzdGF0aWMgaW50IGZuX291dCh2b2lkICpwcml2LCBtbWJ1ZmZlcl90ICptYiwgaW50IG5idWYpCit7CisJaW50IGk7CisJc3RydWN0IGVtaXRfY2FsbGJhY2sgKmVjYmRhdGEgPSBwcml2OworCisJaWYgKGVjYmRhdGEtPmxhYmVsX3BhdGhbMF0pIHsKKwkJcHJpbnRmKCItLS0gJXNcbiIsIGVjYmRhdGEtPmxhYmVsX3BhdGhbMF0pOworCQlwcmludGYoIisrKyAlc1xuIiwgZWNiZGF0YS0+bGFiZWxfcGF0aFsxXSk7CisJCWVjYmRhdGEtPmxhYmVsX3BhdGhbMF0gPSBlY2JkYXRhLT5sYWJlbF9wYXRoWzFdID0gTlVMTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykKKwkJaWYgKCFmd3JpdGUobWJbaV0ucHRyLCBtYltpXS5zaXplLCAxLCBzdGRvdXQpKQorCQkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqcHByaW50X3JlbmFtZShjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCWNvbnN0IGNoYXIgKm9sZCA9IGE7CisJY29uc3QgY2hhciAqbmV3ID0gYjsKKwljaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgcGZ4X2xlbmd0aCwgc2Z4X2xlbmd0aDsKKwlpbnQgbGVuX2EgPSBzdHJsZW4oYSk7CisJaW50IGxlbl9iID0gc3RybGVuKGIpOworCisJLyogRmluZCBjb21tb24gcHJlZml4ICovCisJcGZ4X2xlbmd0aCA9IDA7CisJd2hpbGUgKCpvbGQgJiYgKm5ldyAmJiAqb2xkID09ICpuZXcpIHsKKwkJaWYgKCpvbGQgPT0gJy8nKQorCQkJcGZ4X2xlbmd0aCA9IG9sZCAtIGEgKyAxOworCQlvbGQrKzsKKwkJbmV3Kys7CisJfQorCisJLyogRmluZCBjb21tb24gc3VmZml4ICovCisJb2xkID0gYSArIGxlbl9hOworCW5ldyA9IGIgKyBsZW5fYjsKKwlzZnhfbGVuZ3RoID0gMDsKKwl3aGlsZSAoYSA8PSBvbGQgJiYgYiA8PSBuZXcgJiYgKm9sZCA9PSAqbmV3KSB7CisJCWlmICgqb2xkID09ICcvJykKKwkJCXNmeF9sZW5ndGggPSBsZW5fYSAtIChvbGQgLSBhKTsKKwkJb2xkLS07CisJCW5ldy0tOworCX0KKworCS8qCisJICogcGZ4e21pZC1hID0+IG1pZC1ifXNmeAorCSAqIHtwZngtYSA9PiBwZngtYn1zZngKKwkgKiBwZnh7c2Z4LWEgPT4gc2Z4LWJ9CisJICogbmFtZS1hID0+IG5hbWUtYgorCSAqLworCWlmIChwZnhfbGVuZ3RoICsgc2Z4X2xlbmd0aCkgeworCQlpbnQgYV9taWRsZW4gPSBsZW5fYSAtIHBmeF9sZW5ndGggLSBzZnhfbGVuZ3RoOworCQlpbnQgYl9taWRsZW4gPSBsZW5fYiAtIHBmeF9sZW5ndGggLSBzZnhfbGVuZ3RoOworCQlpZiAoYV9taWRsZW4gPCAwKSBhX21pZGxlbiA9IDA7CisJCWlmIChiX21pZGxlbiA8IDApIGJfbWlkbGVuID0gMDsKKworCQluYW1lID0geG1hbGxvYyhwZnhfbGVuZ3RoICsgYV9taWRsZW4gKyBiX21pZGxlbiArIHNmeF9sZW5ndGggKyA3KTsKKwkJc3ByaW50ZihuYW1lLCAiJS4qc3slLipzID0+ICUuKnN9JXMiLAorCQkJcGZ4X2xlbmd0aCwgYSwKKwkJCWFfbWlkbGVuLCBhICsgcGZ4X2xlbmd0aCwKKwkJCWJfbWlkbGVuLCBiICsgcGZ4X2xlbmd0aCwKKwkJCWEgKyBsZW5fYSAtIHNmeF9sZW5ndGgpOworCX0KKwllbHNlIHsKKwkJbmFtZSA9IHhtYWxsb2MobGVuX2EgKyBsZW5fYiArIDUpOworCQlzcHJpbnRmKG5hbWUsICIlcyA9PiAlcyIsIGEsIGIpOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKworc3RydWN0IGRpZmZzdGF0X3QgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCisJaW50IG5yOworCWludCBhbGxvYzsKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSB7CisJCWNoYXIgKm5hbWU7CisJCXVuc2lnbmVkIGlzX3VubWVyZ2VkOjE7CisJCXVuc2lnbmVkIGlzX2JpbmFyeToxOworCQl1bnNpZ25lZCBpc19yZW5hbWVkOjE7CisJCXVuc2lnbmVkIGludCBhZGRlZCwgZGVsZXRlZDsKKwl9ICoqZmlsZXM7Cit9OworCitzdGF0aWMgc3RydWN0IGRpZmZzdGF0X2ZpbGUgKmRpZmZzdGF0X2FkZChzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZV9hLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWVfYikKK3sKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqeDsKKwl4ID0geGNhbGxvYyhzaXplb2YgKCp4KSwgMSk7CisJaWYgKGRpZmZzdGF0LT5uciA9PSBkaWZmc3RhdC0+YWxsb2MpIHsKKwkJZGlmZnN0YXQtPmFsbG9jID0gYWxsb2NfbnIoZGlmZnN0YXQtPmFsbG9jKTsKKwkJZGlmZnN0YXQtPmZpbGVzID0geHJlYWxsb2MoZGlmZnN0YXQtPmZpbGVzLAorCQkJCWRpZmZzdGF0LT5hbGxvYyAqIHNpemVvZih4KSk7CisJfQorCWRpZmZzdGF0LT5maWxlc1tkaWZmc3RhdC0+bnIrK10gPSB4OworCWlmIChuYW1lX2IpIHsKKwkJeC0+bmFtZSA9IHBwcmludF9yZW5hbWUobmFtZV9hLCBuYW1lX2IpOworCQl4LT5pc19yZW5hbWVkID0gMTsKKwl9CisJZWxzZQorCQl4LT5uYW1lID0gc3RyZHVwKG5hbWVfYSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZzdGF0X2NvbnN1bWUodm9pZCAqcHJpdiwgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0ID0gcHJpdjsKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqeCA9IGRpZmZzdGF0LT5maWxlc1tkaWZmc3RhdC0+bnIgLSAxXTsKKworCWlmIChsaW5lWzBdID09ICcrJykKKwkJeC0+YWRkZWQrKzsKKwllbHNlIGlmIChsaW5lWzBdID09ICctJykKKwkJeC0+ZGVsZXRlZCsrOworfQorCitzdGF0aWMgY29uc3QgY2hhciBwbHVzZXNbXSA9ICIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbnVzZXNbXT0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOworY29uc3QgY2hhciBtaW1lX2JvdW5kYXJ5X2xlYWRlcltdID0gIi0tLS0tLS0tLS0tLSI7CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoc3RydWN0IGRpZmZzdGF0X3QqIGRhdGEpCit7CisJaW50IGksIGxlbiwgYWRkLCBkZWwsIHRvdGFsLCBhZGRzID0gMCwgZGVscyA9IDA7CisJaW50IG1heCwgbWF4X2NoYW5nZSA9IDAsIG1heF9sZW4gPSAwOworCWludCB0b3RhbF9maWxlcyA9IGRhdGEtPm5yOworCisJaWYgKGRhdGEtPm5yID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmc3RhdF9maWxlICpmaWxlID0gZGF0YS0+ZmlsZXNbaV07CisKKwkJbGVuID0gc3RybGVuKGZpbGUtPm5hbWUpOworCQlpZiAobWF4X2xlbiA8IGxlbikKKwkJCW1heF9sZW4gPSBsZW47CisKKwkJaWYgKGZpbGUtPmlzX2JpbmFyeSB8fCBmaWxlLT5pc191bm1lcmdlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF4X2NoYW5nZSA8IGZpbGUtPmFkZGVkICsgZmlsZS0+ZGVsZXRlZCkKKwkJCW1heF9jaGFuZ2UgPSBmaWxlLT5hZGRlZCArIGZpbGUtPmRlbGV0ZWQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yOyBpKyspIHsKKwkJY2hhciAqcHJlZml4ID0gIiI7CisJCWNoYXIgKm5hbWUgPSBkYXRhLT5maWxlc1tpXS0+bmFtZTsKKwkJaW50IGFkZGVkID0gZGF0YS0+ZmlsZXNbaV0tPmFkZGVkOworCQlpbnQgZGVsZXRlZCA9IGRhdGEtPmZpbGVzW2ldLT5kZWxldGVkOworCisJCWlmICgwIDwgKGxlbiA9IHF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgTlVMTCwgMCkpKSB7CisJCQljaGFyICpxbmFtZSA9IHhtYWxsb2MobGVuICsgMSk7CisJCQlxdW90ZV9jX3N0eWxlKG5hbWUsIHFuYW1lLCBOVUxMLCAwKTsKKwkJCWZyZWUobmFtZSk7CisJCQlkYXRhLT5maWxlc1tpXS0+bmFtZSA9IG5hbWUgPSBxbmFtZTsKKwkJfQorCisJCS8qCisJCSAqICJzY2FsZSIgdGhlIGZpbGVuYW1lCisJCSAqLworCQlsZW4gPSBzdHJsZW4obmFtZSk7CisJCW1heCA9IG1heF9sZW47CisJCWlmIChtYXggPiA1MCkKKwkJCW1heCA9IDUwOworCQlpZiAobGVuID4gbWF4KSB7CisJCQljaGFyICpzbGFzaDsKKwkJCXByZWZpeCA9ICIuLi4iOworCQkJbWF4IC09IDM7CisJCQluYW1lICs9IGxlbiAtIG1heDsKKwkJCXNsYXNoID0gc3RyY2hyKG5hbWUsICcvJyk7CisJCQlpZiAoc2xhc2gpCisJCQkJbmFtZSA9IHNsYXNoOworCQl9CisJCWxlbiA9IG1heDsKKworCQkvKgorCQkgKiBzY2FsZSB0aGUgYWRkL2RlbGV0ZQorCQkgKi8KKwkJbWF4ID0gbWF4X2NoYW5nZTsKKwkJaWYgKG1heCArIGxlbiA+IDcwKQorCQkJbWF4ID0gNzAgLSBsZW47CisKKwkJaWYgKGRhdGEtPmZpbGVzW2ldLT5pc19iaW5hcnkpIHsKKwkJCXByaW50ZigiICVzJS0qcyB8ICBCaW5cbiIsIHByZWZpeCwgbGVuLCBuYW1lKTsKKwkJCWdvdG8gZnJlZV9kaWZmc3RhdF9maWxlOworCQl9CisJCWVsc2UgaWYgKGRhdGEtPmZpbGVzW2ldLT5pc191bm1lcmdlZCkgeworCQkJcHJpbnRmKCIgJXMlLSpzIHwgIFVubWVyZ2VkXG4iLCBwcmVmaXgsIGxlbiwgbmFtZSk7CisJCQlnb3RvIGZyZWVfZGlmZnN0YXRfZmlsZTsKKwkJfQorCQllbHNlIGlmICghZGF0YS0+ZmlsZXNbaV0tPmlzX3JlbmFtZWQgJiYKKwkJCSAoYWRkZWQgKyBkZWxldGVkID09IDApKSB7CisJCQl0b3RhbF9maWxlcy0tOworCQkJZ290byBmcmVlX2RpZmZzdGF0X2ZpbGU7CisJCX0KKworCQlhZGQgPSBhZGRlZDsKKwkJZGVsID0gZGVsZXRlZDsKKwkJdG90YWwgPSBhZGQgKyBkZWw7CisJCWFkZHMgKz0gYWRkOworCQlkZWxzICs9IGRlbDsKKworCQlpZiAobWF4X2NoYW5nZSA+IDApIHsKKwkJCXRvdGFsID0gKHRvdGFsICogbWF4ICsgbWF4X2NoYW5nZSAvIDIpIC8gbWF4X2NoYW5nZTsKKwkJCWFkZCA9IChhZGQgKiBtYXggKyBtYXhfY2hhbmdlIC8gMikgLyBtYXhfY2hhbmdlOworCQkJZGVsID0gdG90YWwgLSBhZGQ7CisJCX0KKwkJcHJpbnRmKCIgJXMlLSpzIHwlNWQgJS4qcyUuKnNcbiIsIHByZWZpeCwKKwkJCQlsZW4sIG5hbWUsIGFkZGVkICsgZGVsZXRlZCwKKwkJCQlhZGQsIHBsdXNlcywgZGVsLCBtaW51c2VzKTsKKwlmcmVlX2RpZmZzdGF0X2ZpbGU6CisJCWZyZWUoZGF0YS0+ZmlsZXNbaV0tPm5hbWUpOworCQlmcmVlKGRhdGEtPmZpbGVzW2ldKTsKKwl9CisJZnJlZShkYXRhLT5maWxlcyk7CisJcHJpbnRmKCIgJWQgZmlsZXMgY2hhbmdlZCwgJWQgaW5zZXJ0aW9ucygrKSwgJWQgZGVsZXRpb25zKC0pXG4iLAorCQkJdG90YWxfZmlsZXMsIGFkZHMsIGRlbHMpOworfQorCitzdHJ1Y3QgY2hlY2tkaWZmX3QgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWludCBsaW5lbm87Cit9OworCitzdGF0aWMgdm9pZCBjaGVja2RpZmZfY29uc3VtZSh2b2lkICpwcml2LCBjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgY2hlY2tkaWZmX3QgKmRhdGEgPSBwcml2OworCisJaWYgKGxpbmVbMF0gPT0gJysnKSB7CisJCWludCBpLCBzcGFjZXMgPSAwOworCisJCWRhdGEtPmxpbmVubysrOworCisJCS8qIGNoZWNrIHNwYWNlIGJlZm9yZSB0YWIgKi8KKwkJZm9yIChpID0gMTsgaSA8IGxlbiAmJiAobGluZVtpXSA9PSAnICcgfHwgbGluZVtpXSA9PSAnXHQnKTsgaSsrKQorCQkJaWYgKGxpbmVbaV0gPT0gJyAnKQorCQkJCXNwYWNlcysrOworCQlpZiAobGluZVtpIC0gMV0gPT0gJ1x0JyAmJiBzcGFjZXMpCisJCQlwcmludGYoIiVzOiVkOiBzcGFjZSBiZWZvcmUgdGFiOiUuKnNcbiIsCisJCQkJZGF0YS0+ZmlsZW5hbWUsIGRhdGEtPmxpbmVubywgKGludClsZW4sIGxpbmUpOworCisJCS8qIGNoZWNrIHdoaXRlIHNwYWNlIGF0IGxpbmUgZW5kICovCisJCWlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpCisJCQlsZW4tLTsKKwkJaWYgKGlzc3BhY2UobGluZVtsZW4gLSAxXSkpCisJCQlwcmludGYoIiVzOiVkOiB3aGl0ZSBzcGFjZSBhdCBlbmQ6ICUuKnNcbiIsCisJCQkJZGF0YS0+ZmlsZW5hbWUsIGRhdGEtPmxpbmVubywgKGludClsZW4sIGxpbmUpOworCX0gZWxzZSBpZiAobGluZVswXSA9PSAnICcpCisJCWRhdGEtPmxpbmVubysrOworCWVsc2UgaWYgKGxpbmVbMF0gPT0gJ0AnKSB7CisJCWNoYXIgKnBsdXMgPSBzdHJjaHIobGluZSwgJysnKTsKKwkJaWYgKHBsdXMpCisJCQlkYXRhLT5saW5lbm8gPSBzdHJ0b2wocGx1cywgTlVMTCwgMTApOworCQllbHNlCisJCQlkaWUoImludmFsaWQgZGlmZiIpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRlZmxhdGVfaXQoY2hhciAqZGF0YSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSB1bnNpZ25lZCBsb25nICpyZXN1bHRfc2l6ZSkKK3sKKwlpbnQgYm91bmQ7CisJdW5zaWduZWQgY2hhciAqZGVmbGF0ZWQ7CisJel9zdHJlYW0gc3RyZWFtOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04pOworCWJvdW5kID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIHNpemUpOworCWRlZmxhdGVkID0geG1hbGxvYyhib3VuZCk7CisJc3RyZWFtLm5leHRfb3V0ID0gZGVmbGF0ZWQ7CisJc3RyZWFtLmF2YWlsX291dCA9IGJvdW5kOworCisJc3RyZWFtLm5leHRfaW4gPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CisJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJOyAvKiBub3RoaW5nICovCisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwkqcmVzdWx0X3NpemUgPSBzdHJlYW0udG90YWxfb3V0OworCXJldHVybiBkZWZsYXRlZDsKK30KKworc3RhdGljIHZvaWQgZW1pdF9iaW5hcnlfZGlmZihtbWZpbGVfdCAqb25lLCBtbWZpbGVfdCAqdHdvKQoreworCXZvaWQgKmNwOworCXZvaWQgKmRlbHRhOworCXZvaWQgKmRlZmxhdGVkOworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NpemU7CisJdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplOworCXVuc2lnbmVkIGxvbmcgZGVmbGF0ZV9zaXplOworCXVuc2lnbmVkIGxvbmcgZGF0YV9zaXplOworCisJcHJpbnRmKCJHSVQgYmluYXJ5IHBhdGNoXG4iKTsKKwkvKiBXZSBjb3VsZCBkbyBkZWZsYXRlZCBkZWx0YSwgb3Igd2UgY291bGQgZG8ganVzdCBkZWZsYXRlZCB0d28sCisJICogd2hpY2hldmVyIGlzIHNtYWxsZXIuCisJICovCisJZGVsdGEgPSBOVUxMOworCWRlZmxhdGVkID0gZGVmbGF0ZV9pdCh0d28tPnB0ciwgdHdvLT5zaXplLCAmZGVmbGF0ZV9zaXplKTsKKwlpZiAob25lLT5zaXplICYmIHR3by0+c2l6ZSkgeworCQlkZWx0YSA9IGRpZmZfZGVsdGEob25lLT5wdHIsIG9uZS0+c2l6ZSwKKwkJCQkgICB0d28tPnB0ciwgdHdvLT5zaXplLAorCQkJCSAgICZkZWx0YV9zaXplLCBkZWZsYXRlX3NpemUpOworCQlpZiAoZGVsdGEpIHsKKwkJCXZvaWQgKnRvX2ZyZWUgPSBkZWx0YTsKKwkJCW9yaWdfc2l6ZSA9IGRlbHRhX3NpemU7CisJCQlkZWx0YSA9IGRlZmxhdGVfaXQoZGVsdGEsIGRlbHRhX3NpemUsICZkZWx0YV9zaXplKTsKKwkJCWZyZWUodG9fZnJlZSk7CisJCX0KKwl9CisKKwlpZiAoZGVsdGEgJiYgZGVsdGFfc2l6ZSA8IGRlZmxhdGVfc2l6ZSkgeworCQlwcmludGYoImRlbHRhICVsdVxuIiwgb3JpZ19zaXplKTsKKwkJZnJlZShkZWZsYXRlZCk7CisJCWRhdGEgPSBkZWx0YTsKKwkJZGF0YV9zaXplID0gZGVsdGFfc2l6ZTsKKwl9CisJZWxzZSB7CisJCXByaW50ZigibGl0ZXJhbCAlbHVcbiIsIHR3by0+c2l6ZSk7CisJCWZyZWUoZGVsdGEpOworCQlkYXRhID0gZGVmbGF0ZWQ7CisJCWRhdGFfc2l6ZSA9IGRlZmxhdGVfc2l6ZTsKKwl9CisKKwkvKiBlbWl0IGRhdGEgZW5jb2RlZCBpbiBiYXNlODUgKi8KKwljcCA9IGRhdGE7CisJd2hpbGUgKGRhdGFfc2l6ZSkgeworCQlpbnQgYnl0ZXMgPSAoNTIgPCBkYXRhX3NpemUpID8gNTIgOiBkYXRhX3NpemU7CisJCWNoYXIgbGluZVs3MF07CisJCWRhdGFfc2l6ZSAtPSBieXRlczsKKwkJaWYgKGJ5dGVzIDw9IDI2KQorCQkJbGluZVswXSA9IGJ5dGVzICsgJ0EnIC0gMTsKKwkJZWxzZQorCQkJbGluZVswXSA9IGJ5dGVzIC0gMjYgKyAnYScgLSAxOworCQllbmNvZGVfODUobGluZSArIDEsIGNwLCBieXRlcyk7CisJCWNwICs9IGJ5dGVzOworCQlwdXRzKGxpbmUpOworCX0KKwlwcmludGYoIlxuIik7CisJZnJlZShkYXRhKTsKK30KKworI2RlZmluZSBGSVJTVF9GRVdfQllURVMgODAwMAorc3RhdGljIGludCBtbWZpbGVfaXNfYmluYXJ5KG1tZmlsZV90ICptZikKK3sKKwlsb25nIHN6ID0gbWYtPnNpemU7CisJaWYgKEZJUlNUX0ZFV19CWVRFUyA8IHN6KQorCQlzeiA9IEZJUlNUX0ZFV19CWVRFUzsKKwlpZiAobWVtY2hyKG1mLT5wdHIsIDAsIHN6KSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWx0aW5fZGlmZihjb25zdCBjaGFyICpuYW1lX2EsCisJCQkgY29uc3QgY2hhciAqbmFtZV9iLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSBjb25zdCBjaGFyICp4ZnJtX21zZywKKwkJCSBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvLAorCQkJIGludCBjb21wbGV0ZV9yZXdyaXRlKQoreworCW1tZmlsZV90IG1mMSwgbWYyOworCWNvbnN0IGNoYXIgKmxibFsyXTsKKwljaGFyICphX29uZSwgKmJfdHdvOworCisJYV9vbmUgPSBxdW90ZV90d28oImEvIiwgbmFtZV9hKTsKKwliX3R3byA9IHF1b3RlX3R3bygiYi8iLCBuYW1lX2IpOworCWxibFswXSA9IERJRkZfRklMRV9WQUxJRChvbmUpID8gYV9vbmUgOiAiL2Rldi9udWxsIjsKKwlsYmxbMV0gPSBESUZGX0ZJTEVfVkFMSUQodHdvKSA/IGJfdHdvIDogIi9kZXYvbnVsbCI7CisJcHJpbnRmKCJkaWZmIC0tZ2l0ICVzICVzXG4iLCBhX29uZSwgYl90d28pOworCWlmIChsYmxbMF1bMF0gPT0gJy8nKSB7CisJCS8qIC9kZXYvbnVsbCAqLworCQlwcmludGYoIm5ldyBmaWxlIG1vZGUgJTA2b1xuIiwgdHdvLT5tb2RlKTsKKwkJaWYgKHhmcm1fbXNnICYmIHhmcm1fbXNnWzBdKQorCQkJcHV0cyh4ZnJtX21zZyk7CisJfQorCWVsc2UgaWYgKGxibFsxXVswXSA9PSAnLycpIHsKKwkJcHJpbnRmKCJkZWxldGVkIGZpbGUgbW9kZSAlMDZvXG4iLCBvbmUtPm1vZGUpOworCQlpZiAoeGZybV9tc2cgJiYgeGZybV9tc2dbMF0pCisJCQlwdXRzKHhmcm1fbXNnKTsKKwl9CisJZWxzZSB7CisJCWlmIChvbmUtPm1vZGUgIT0gdHdvLT5tb2RlKSB7CisJCQlwcmludGYoIm9sZCBtb2RlICUwNm9cbiIsIG9uZS0+bW9kZSk7CisJCQlwcmludGYoIm5ldyBtb2RlICUwNm9cbiIsIHR3by0+bW9kZSk7CisJCX0KKwkJaWYgKHhmcm1fbXNnICYmIHhmcm1fbXNnWzBdKQorCQkJcHV0cyh4ZnJtX21zZyk7CisJCS8qCisJCSAqIHdlIGRvIG5vdCBydW4gZGlmZiBiZXR3ZWVuIGRpZmZlcmVudCBraW5kCisJCSAqIG9mIG9iamVjdHMuCisJCSAqLworCQlpZiAoKG9uZS0+bW9kZSBeIHR3by0+bW9kZSkgJiBTX0lGTVQpCisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJaWYgKGNvbXBsZXRlX3Jld3JpdGUpIHsKKwkJCWVtaXRfcmV3cml0ZV9kaWZmKG5hbWVfYSwgbmFtZV9iLCBvbmUsIHR3byk7CisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJfQorCX0KKworCWlmIChmaWxsX21tZmlsZSgmbWYxLCBvbmUpIDwgMCB8fCBmaWxsX21tZmlsZSgmbWYyLCB0d28pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBmaWxlcyB0byBkaWZmIik7CisKKwlpZiAobW1maWxlX2lzX2JpbmFyeSgmbWYxKSB8fCBtbWZpbGVfaXNfYmluYXJ5KCZtZjIpKSB7CisJCS8qIFF1aXRlIGNvbW1vbiBjb25mdXNpbmcgY2FzZSAqLworCQlpZiAobWYxLnNpemUgPT0gbWYyLnNpemUgJiYKKwkJICAgICFtZW1jbXAobWYxLnB0ciwgbWYyLnB0ciwgbWYxLnNpemUpKQorCQkJZ290byBmcmVlX2FiX2FuZF9yZXR1cm47CisJCWlmIChvLT5iaW5hcnkpCisJCQllbWl0X2JpbmFyeV9kaWZmKCZtZjEsICZtZjIpOworCQllbHNlCisJCQlwcmludGYoIkJpbmFyeSBmaWxlcyAlcyBhbmQgJXMgZGlmZmVyXG4iLAorCQkJICAgICAgIGxibFswXSwgbGJsWzFdKTsKKwl9CisJZWxzZSB7CisJCS8qIENyYXp5IHhkbCBpbnRlcmZhY2VzLi4gKi8KKwkJY29uc3QgY2hhciAqZGlmZm9wdHMgPSBnZXRlbnYoIkdJVF9ESUZGX09QVFMiKTsKKwkJeHBwYXJhbV90IHhwcDsKKwkJeGRlbWl0Y29uZl90IHhlY2ZnOworCQl4ZGVtaXRjYl90IGVjYjsKKwkJc3RydWN0IGVtaXRfY2FsbGJhY2sgZWNiZGF0YTsKKworCQllY2JkYXRhLmxhYmVsX3BhdGggPSBsYmw7CisJCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJCXhlY2ZnLmN0eGxlbiA9IG8tPmNvbnRleHQ7CisJCXhlY2ZnLmZsYWdzID0gWERMX0VNSVRfRlVOQ05BTUVTOworCQlpZiAoIWRpZmZvcHRzKQorCQkJOworCQllbHNlIGlmICghc3RybmNtcChkaWZmb3B0cywgIi0tdW5pZmllZD0iLCAxMCkpCisJCQl4ZWNmZy5jdHhsZW4gPSBzdHJ0b3VsKGRpZmZvcHRzICsgMTAsIE5VTEwsIDEwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoZGlmZm9wdHMsICItdSIsIDIpKQorCQkJeGVjZmcuY3R4bGVuID0gc3RydG91bChkaWZmb3B0cyArIDIsIE5VTEwsIDEwKTsKKwkJZWNiLm91dGYgPSBmbl9vdXQ7CisJCWVjYi5wcml2ID0gJmVjYmRhdGE7CisJCXhkbF9kaWZmKCZtZjEsICZtZjIsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJfQorCisgZnJlZV9hYl9hbmRfcmV0dXJuOgorCWZyZWUoYV9vbmUpOworCWZyZWUoYl90d28pOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYnVpbHRpbl9kaWZmc3RhdChjb25zdCBjaGFyICpuYW1lX2EsIGNvbnN0IGNoYXIgKm5hbWVfYiwKKwkJCSAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCSAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSAgICAgc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0LAorCQkJICAgICBpbnQgY29tcGxldGVfcmV3cml0ZSkKK3sKKwltbWZpbGVfdCBtZjEsIG1mMjsKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqZGF0YTsKKworCWRhdGEgPSBkaWZmc3RhdF9hZGQoZGlmZnN0YXQsIG5hbWVfYSwgbmFtZV9iKTsKKworCWlmICghb25lIHx8ICF0d28pIHsKKwkJZGF0YS0+aXNfdW5tZXJnZWQgPSAxOworCQlyZXR1cm47CisJfQorCWlmIChjb21wbGV0ZV9yZXdyaXRlKSB7CisJCWRpZmZfcG9wdWxhdGVfZmlsZXNwZWMob25lLCAwKTsKKwkJZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyh0d28sIDApOworCQlkYXRhLT5kZWxldGVkID0gY291bnRfbGluZXMob25lLT5kYXRhLCBvbmUtPnNpemUpOworCQlkYXRhLT5hZGRlZCA9IGNvdW50X2xpbmVzKHR3by0+ZGF0YSwgdHdvLT5zaXplKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZmlsbF9tbWZpbGUoJm1mMSwgb25lKSA8IDAgfHwgZmlsbF9tbWZpbGUoJm1mMiwgdHdvKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgZmlsZXMgdG8gZGlmZiIpOworCisJaWYgKG1tZmlsZV9pc19iaW5hcnkoJm1mMSkgfHwgbW1maWxlX2lzX2JpbmFyeSgmbWYyKSkKKwkJZGF0YS0+aXNfYmluYXJ5ID0gMTsKKwllbHNlIHsKKwkJLyogQ3JhenkgeGRsIGludGVyZmFjZXMuLiAqLworCQl4cHBhcmFtX3QgeHBwOworCQl4ZGVtaXRjb25mX3QgeGVjZmc7CisJCXhkZW1pdGNiX3QgZWNiOworCisJCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJCXhlY2ZnLmN0eGxlbiA9IDA7CisJCXhlY2ZnLmZsYWdzID0gMDsKKwkJZWNiLm91dGYgPSB4ZGlmZl9vdXRmOworCQllY2IucHJpdiA9IGRpZmZzdGF0OworCQl4ZGxfZGlmZigmbWYxLCAmbWYyLCAmeHBwLCAmeGVjZmcsICZlY2IpOworCX0KK30KKworc3RhdGljIHZvaWQgYnVpbHRpbl9jaGVja2RpZmYoY29uc3QgY2hhciAqbmFtZV9hLCBjb25zdCBjaGFyICpuYW1lX2IsCisJCQkgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28pCit7CisJbW1maWxlX3QgbWYxLCBtZjI7CisJc3RydWN0IGNoZWNrZGlmZl90IGRhdGE7CisKKwlpZiAoIXR3bykKKwkJcmV0dXJuOworCisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCWRhdGEueG0uY29uc3VtZSA9IGNoZWNrZGlmZl9jb25zdW1lOworCWRhdGEuZmlsZW5hbWUgPSBuYW1lX2IgPyBuYW1lX2IgOiBuYW1lX2E7CisJZGF0YS5saW5lbm8gPSAwOworCisJaWYgKGZpbGxfbW1maWxlKCZtZjEsIG9uZSkgPCAwIHx8IGZpbGxfbW1maWxlKCZtZjIsIHR3bykgPCAwKQorCQlkaWUoInVuYWJsZSB0byByZWFkIGZpbGVzIHRvIGRpZmYiKTsKKworCWlmIChtbWZpbGVfaXNfYmluYXJ5KCZtZjIpKQorCQlyZXR1cm47CisJZWxzZSB7CisJCS8qIENyYXp5IHhkbCBpbnRlcmZhY2VzLi4gKi8KKwkJeHBwYXJhbV90IHhwcDsKKwkJeGRlbWl0Y29uZl90IHhlY2ZnOworCQl4ZGVtaXRjYl90IGVjYjsKKworCQl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMOworCQl4ZWNmZy5jdHhsZW4gPSAwOworCQl4ZWNmZy5mbGFncyA9IDA7CisJCWVjYi5vdXRmID0geGRpZmZfb3V0ZjsKKwkJZWNiLnByaXYgPSAmZGF0YTsKKwkJeGRsX2RpZmYoJm1mMSwgJm1mMiwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKwl9Cit9CisKK3N0cnVjdCBkaWZmX2ZpbGVzcGVjICphbGxvY19maWxlc3BlYyhjb25zdCBjaGFyICpwYXRoKQoreworCWludCBuYW1lbGVuID0gc3RybGVuKHBhdGgpOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcGVjID0geG1hbGxvYyhzaXplb2YoKnNwZWMpICsgbmFtZWxlbiArIDEpOworCisJbWVtc2V0KHNwZWMsIDAsIHNpemVvZigqc3BlYykpOworCXNwZWMtPnBhdGggPSAoY2hhciAqKShzcGVjICsgMSk7CisJbWVtY3B5KHNwZWMtPnBhdGgsIHBhdGgsIG5hbWVsZW4rMSk7CisJcmV0dXJuIHNwZWM7Cit9CisKK3ZvaWQgZmlsbF9maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3BlYywgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJICAgdW5zaWduZWQgc2hvcnQgbW9kZSkKK3sKKwlpZiAobW9kZSkgeworCQlzcGVjLT5tb2RlID0gY2Fub25fbW9kZShtb2RlKTsKKwkJbWVtY3B5KHNwZWMtPnNoYTEsIHNoYTEsIDIwKTsKKwkJc3BlYy0+c2hhMV92YWxpZCA9ICEhbWVtY21wKHNoYTEsIG51bGxfc2hhMSwgMjApOworCX0KK30KKworLyoKKyAqIEdpdmVuIGEgbmFtZSBhbmQgc2hhMSBwYWlyLCBpZiB0aGUgZGlyY2FjaGUgdGVsbHMgdXMgdGhlIGZpbGUgaW4KKyAqIHRoZSB3b3JrIHRyZWUgaGFzIHRoYXQgb2JqZWN0IGNvbnRlbnRzLCByZXR1cm4gdHJ1ZSwgc28gdGhhdAorICogcHJlcGFyZV90ZW1wX2ZpbGUoKSBkb2VzIG5vdCBoYXZlIHRvIGluZmxhdGUgYW5kIGV4dHJhY3QuCisgKi8KK3N0YXRpYyBpbnQgd29ya190cmVlX21hdGNoZXMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCXN0cnVjdCBzdGF0IHN0OworCWludCBwb3MsIGxlbjsKKworCS8qIFdlIGRvIG5vdCByZWFkIHRoZSBjYWNoZSBvdXJzZWx2ZXMgaGVyZSwgYmVjYXVzZSB0aGUKKwkgKiBiZW5jaG1hcmsgd2l0aCBteSBwcmV2aW91cyB2ZXJzaW9uIHRoYXQgYWx3YXlzIHJlYWRzIGNhY2hlCisJICogc2hvd3MgdGhhdCBpdCBtYWtlcyB0aGluZ3Mgd29yc2UgZm9yIGRpZmYtdHJlZSBjb21wYXJpbmcKKwkgKiB0d28gbGludXgtMi42IGtlcm5lbCB0cmVlcyBpbiBhbiBhbHJlYWR5IGNoZWNrZWQgb3V0IHdvcmsKKwkgKiB0cmVlLiAgVGhpcyBpcyBiZWNhdXNlIG1vc3QgZGlmZi10cmVlIGNvbXBhcmlzb25zIGRlYWwgd2l0aAorCSAqIG9ubHkgYSBzbWFsbCBudW1iZXIgb2YgZmlsZXMsIHdoaWxlIHJlYWRpbmcgdGhlIGNhY2hlIGlzCisJICogZXhwZW5zaXZlIGZvciBhIGxhcmdlIHByb2plY3QsIGFuZCBpdHMgY29zdCBvdXR3ZWlnaHMgdGhlCisJICogc2F2aW5ncyB3ZSBnZXQgYnkgbm90IGluZmxhdGluZyB0aGUgb2JqZWN0IHRvIGEgdGVtcG9yYXJ5CisJICogZmlsZS4gIFByYWN0aWNhbGx5LCB0aGlzIGNvZGUgb25seSBoZWxwcyB3aGVuIHdlIGFyZSB1c2VkCisJICogYnkgZGlmZi1jYWNoZSAtLWNhY2hlZCwgd2hpY2ggZG9lcyByZWFkIHRoZSBjYWNoZSBiZWZvcmUKKwkgKiBjYWxsaW5nIHVzLgorCSAqLworCWlmICghYWN0aXZlX2NhY2hlKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHN0cmxlbihuYW1lKTsKKwlwb3MgPSBjYWNoZV9uYW1lX3BvcyhuYW1lLCBsZW4pOworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gMDsKKwljZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCWlmICgobHN0YXQobmFtZSwgJnN0KSA8IDApIHx8CisJICAgICFTX0lTUkVHKHN0LnN0X21vZGUpIHx8IC8qIGNhcmVmdWwhICovCisJICAgIGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMCkgfHwKKwkgICAgbWVtY21wKHNoYTEsIGNlLT5zaGExLCAyMCkpCisJCXJldHVybiAwOworCS8qIHdlIHJldHVybiAxIG9ubHkgd2hlbiB3ZSBjYW4gc3RhdCwgaXQgaXMgYSByZWd1bGFyIGZpbGUsCisJICogc3RhdCBpbmZvcm1hdGlvbiBtYXRjaGVzLCBhbmQgc2hhMSByZWNvcmRlZCBpbiB0aGUgY2FjaGUKKwkgKiBtYXRjaGVzLiAgSS5lLiB3ZSBrbm93IHRoZSBmaWxlIGluIHRoZSB3b3JrIHRyZWUgcmVhbGx5IGlzCisJICogdGhlIHNhbWUgYXMgdGhlIDxuYW1lLCBzaGExPiBwYWlyLgorCSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNoYTFfc2l6ZV9jYWNoZSB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9ICoqc2hhMV9zaXplX2NhY2hlOworc3RhdGljIGludCBzaGExX3NpemVfY2FjaGVfbnIsIHNoYTFfc2l6ZV9jYWNoZV9hbGxvYzsKKworc3RhdGljIHN0cnVjdCBzaGExX3NpemVfY2FjaGUgKmxvY2F0ZV9zaXplX2NhY2hlKHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCQkgaW50IGZpbmRfb25seSwKKwkJCQkJCSB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGZpcnN0LCBsYXN0OworCXN0cnVjdCBzaGExX3NpemVfY2FjaGUgKmU7CisKKwlmaXJzdCA9IDA7CisJbGFzdCA9IHNoYTFfc2l6ZV9jYWNoZV9ucjsKKwl3aGlsZSAobGFzdCA+IGZpcnN0KSB7CisJCWludCBjbXAsIG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQllID0gc2hhMV9zaXplX2NhY2hlW25leHRdOworCQljbXAgPSBtZW1jbXAoZS0+c2hhMSwgc2hhMSwgMjApOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBlOworCQlpZiAoY21wIDwgMCkgeworCQkJbGFzdCA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlmaXJzdCA9IG5leHQrMTsKKwl9CisJLyogbm90IGZvdW5kICovCisJaWYgKGZpbmRfb25seSkKKwkJcmV0dXJuIE5VTEw7CisJLyogaW5zZXJ0IHRvIG1ha2UgaXQgYXQgImZpcnN0IiAqLworCWlmIChzaGExX3NpemVfY2FjaGVfYWxsb2MgPD0gc2hhMV9zaXplX2NhY2hlX25yKSB7CisJCXNoYTFfc2l6ZV9jYWNoZV9hbGxvYyA9IGFsbG9jX25yKHNoYTFfc2l6ZV9jYWNoZV9hbGxvYyk7CisJCXNoYTFfc2l6ZV9jYWNoZSA9IHhyZWFsbG9jKHNoYTFfc2l6ZV9jYWNoZSwKKwkJCQkJICAgc2hhMV9zaXplX2NhY2hlX2FsbG9jICoKKwkJCQkJICAgc2l6ZW9mKCpzaGExX3NpemVfY2FjaGUpKTsKKwl9CisJc2hhMV9zaXplX2NhY2hlX25yKys7CisJaWYgKGZpcnN0IDwgc2hhMV9zaXplX2NhY2hlX25yKQorCQltZW1tb3ZlKHNoYTFfc2l6ZV9jYWNoZSArIGZpcnN0ICsgMSwgc2hhMV9zaXplX2NhY2hlICsgZmlyc3QsCisJCQkoc2hhMV9zaXplX2NhY2hlX25yIC0gZmlyc3QgLSAxKSAqCisJCQlzaXplb2YoKnNoYTFfc2l6ZV9jYWNoZSkpOworCWUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hhMV9zaXplX2NhY2hlKSk7CisJc2hhMV9zaXplX2NhY2hlW2ZpcnN0XSA9IGU7CisJbWVtY3B5KGUtPnNoYTEsIHNoYTEsIDIwKTsKKwllLT5zaXplID0gc2l6ZTsKKwlyZXR1cm4gZTsKK30KKworLyoKKyAqIFdoaWxlIGRvaW5nIHJlbmFtZSBkZXRlY3Rpb24gYW5kIHBpY2theGUgb3BlcmF0aW9uLCB3ZSBtYXkgbmVlZCB0bworICogZ3JhYiB0aGUgZGF0YSBmb3IgdGhlIGJsb2IgKG9yIGZpbGUpIGZvciBvdXIgb3duIGluLWNvcmUgY29tcGFyaXNvbi4KKyAqIGRpZmZfZmlsZXNwZWMgaGFzIGRhdGEgYW5kIHNpemUgZmllbGRzIGZvciB0aGlzIHB1cnBvc2UuCisgKi8KK2ludCBkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzLCBpbnQgc2l6ZV9vbmx5KQoreworCWludCBlcnIgPSAwOworCWlmICghRElGRl9GSUxFX1ZBTElEKHMpKQorCQlkaWUoImludGVybmFsIGVycm9yOiBhc2tpbmcgdG8gcG9wdWxhdGUgaW52YWxpZCBmaWxlLiIpOworCWlmIChTX0lTRElSKHMtPm1vZGUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXVzZV9zaXplX2NhY2hlKQorCQlzaXplX29ubHkgPSAwOworCisJaWYgKHMtPmRhdGEpCisJCXJldHVybiBlcnI7CisJaWYgKCFzLT5zaGExX3ZhbGlkIHx8CisJICAgIHdvcmtfdHJlZV9tYXRjaGVzKHMtPnBhdGgsIHMtPnNoYTEpKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQlpbnQgZmQ7CisJCWlmIChsc3RhdChzLT5wYXRoLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCkgeworCQkJZXJyX2VtcHR5OgorCQkJCWVyciA9IC0xOworCQkJZW1wdHk6CisJCQkJcy0+ZGF0YSA9ICIiOworCQkJCXMtPnNpemUgPSAwOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwkJcy0+c2l6ZSA9IHN0LnN0X3NpemU7CisJCWlmICghcy0+c2l6ZSkKKwkJCWdvdG8gZW1wdHk7CisJCWlmIChzaXplX29ubHkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCWludCByZXQ7CisJCQlzLT5kYXRhID0geG1hbGxvYyhzLT5zaXplKTsKKwkJCXMtPnNob3VsZF9mcmVlID0gMTsKKwkJCXJldCA9IHJlYWRsaW5rKHMtPnBhdGgsIHMtPmRhdGEsIHMtPnNpemUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcmVlKHMtPmRhdGEpOworCQkJCWdvdG8gZXJyX2VtcHR5OworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJZmQgPSBvcGVuKHMtPnBhdGgsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWdvdG8gZXJyX2VtcHR5OworCQlzLT5kYXRhID0gbW1hcChOVUxMLCBzLT5zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKHMtPmRhdGEgPT0gTUFQX0ZBSUxFRCkKKwkJCWdvdG8gZXJyX2VtcHR5OworCQlzLT5zaG91bGRfbXVubWFwID0gMTsKKwl9CisJZWxzZSB7CisJCWNoYXIgdHlwZVsyMF07CisJCXN0cnVjdCBzaGExX3NpemVfY2FjaGUgKmU7CisKKwkJaWYgKHNpemVfb25seSkgeworCQkJZSA9IGxvY2F0ZV9zaXplX2NhY2hlKHMtPnNoYTEsIDEsIDApOworCQkJaWYgKGUpIHsKKwkJCQlzLT5zaXplID0gZS0+c2l6ZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghc2hhMV9vYmplY3RfaW5mbyhzLT5zaGExLCB0eXBlLCAmcy0+c2l6ZSkpCisJCQkJbG9jYXRlX3NpemVfY2FjaGUocy0+c2hhMSwgMCwgcy0+c2l6ZSk7CisJCX0KKwkJZWxzZSB7CisJCQlzLT5kYXRhID0gcmVhZF9zaGExX2ZpbGUocy0+c2hhMSwgdHlwZSwgJnMtPnNpemUpOworCQkJcy0+c2hvdWxkX2ZyZWUgPSAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzKQoreworCWlmIChzLT5zaG91bGRfZnJlZSkKKwkJZnJlZShzLT5kYXRhKTsKKwllbHNlIGlmIChzLT5zaG91bGRfbXVubWFwKQorCQltdW5tYXAocy0+ZGF0YSwgcy0+c2l6ZSk7CisJcy0+c2hvdWxkX2ZyZWUgPSBzLT5zaG91bGRfbXVubWFwID0gMDsKKwlzLT5kYXRhID0gTlVMTDsKKwlmcmVlKHMtPmNudF9kYXRhKTsKKwlzLT5jbnRfZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBfdGVtcF9ibG9iKHN0cnVjdCBkaWZmX3RlbXBmaWxlICp0ZW1wLAorCQkJICAgdm9pZCAqYmxvYiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgICBpbnQgbW9kZSkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IGdpdF9ta3N0ZW1wKHRlbXAtPnRtcF9wYXRoLCBURU1QRklMRV9QQVRIX0xFTiwgIi5kaWZmX1hYWFhYWCIpOworCWlmIChmZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSB0ZW1wLWZpbGUiKTsKKwlpZiAod3JpdGUoZmQsIGJsb2IsIHNpemUpICE9IHNpemUpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHRlbXAtZmlsZSIpOworCWNsb3NlKGZkKTsKKwl0ZW1wLT5uYW1lID0gdGVtcC0+dG1wX3BhdGg7CisJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgoc2hhMSkpOworCXRlbXAtPmhleFs0MF0gPSAwOworCXNwcmludGYodGVtcC0+bW9kZSwgIiUwNm8iLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV90ZW1wX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgIHN0cnVjdCBkaWZmX3RlbXBmaWxlICp0ZW1wLAorCQkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSkKK3sKKwlpZiAoIURJRkZfRklMRV9WQUxJRChvbmUpKSB7CisJbm90X2FfdmFsaWRfZmlsZToKKwkJLyogQSAnLScgZW50cnkgcHJvZHVjZXMgdGhpcyBmb3IgZmlsZS0yLCBhbmQKKwkJICogYSAnKycgZW50cnkgcHJvZHVjZXMgdGhpcyBmb3IgZmlsZS0xLgorCQkgKi8KKwkJdGVtcC0+bmFtZSA9ICIvZGV2L251bGwiOworCQlzdHJjcHkodGVtcC0+aGV4LCAiLiIpOworCQlzdHJjcHkodGVtcC0+bW9kZSwgIi4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghb25lLT5zaGExX3ZhbGlkIHx8CisJICAgIHdvcmtfdHJlZV9tYXRjaGVzKG5hbWUsIG9uZS0+c2hhMSkpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChsc3RhdChuYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCQlnb3RvIG5vdF9hX3ZhbGlkX2ZpbGU7CisJCQlkaWUoInN0YXQoJXMpOiAlcyIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCWludCByZXQ7CisJCQljaGFyIGJ1ZltQQVRIX01BWCArIDFdOyAvKiBvdWdodCB0byBiZSBTWU1MSU5LX01BWCAqLworCQkJaWYgKHNpemVvZihidWYpIDw9IHN0LnN0X3NpemUpCisJCQkJZGllKCJzeW1saW5rIHRvbyBsb25nOiAlcyIsIG5hbWUpOworCQkJcmV0ID0gcmVhZGxpbmsobmFtZSwgYnVmLCBzdC5zdF9zaXplKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWRpZSgicmVhZGxpbmsoJXMpIiwgbmFtZSk7CisJCQlwcmVwX3RlbXBfYmxvYih0ZW1wLCBidWYsIHN0LnN0X3NpemUsCisJCQkJICAgICAgIChvbmUtPnNoYTFfdmFsaWQgPworCQkJCQlvbmUtPnNoYTEgOiBudWxsX3NoYTEpLAorCQkJCSAgICAgICAob25lLT5zaGExX3ZhbGlkID8KKwkJCQkJb25lLT5tb2RlIDogU19JRkxOSykpOworCQl9CisJCWVsc2UgeworCQkJLyogd2UgY2FuIGJvcnJvdyBmcm9tIHRoZSBmaWxlIGluIHRoZSB3b3JrIHRyZWUgKi8KKwkJCXRlbXAtPm5hbWUgPSBuYW1lOworCQkJaWYgKCFvbmUtPnNoYTFfdmFsaWQpCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgobnVsbF9zaGExKSk7CisJCQllbHNlCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgob25lLT5zaGExKSk7CisJCQkvKiBFdmVuIHRob3VnaCB3ZSBtYXkgc29tZXRpbWVzIGJvcnJvdyB0aGUKKwkJCSAqIGNvbnRlbnRzIGZyb20gdGhlIHdvcmsgdHJlZSwgd2UgYWx3YXlzIHdhbnQKKwkJCSAqIG9uZS0+bW9kZS4gIG1vZGUgaXMgdHJ1c3R3b3J0aHkgZXZlbiB3aGVuCisJCQkgKiAhKG9uZS0+c2hhMV92YWxpZCksIGFzIGxvbmcgYXMKKwkJCSAqIERJRkZfRklMRV9WQUxJRChvbmUpLgorCQkJICovCisJCQlzcHJpbnRmKHRlbXAtPm1vZGUsICIlMDZvIiwgb25lLT5tb2RlKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWVsc2UgeworCQlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQkJZGllKCJjYW5ub3QgcmVhZCBkYXRhIGJsb2IgZm9yICVzIiwgb25lLT5wYXRoKTsKKwkJcHJlcF90ZW1wX2Jsb2IodGVtcCwgb25lLT5kYXRhLCBvbmUtPnNpemUsCisJCQkgICAgICAgb25lLT5zaGExLCBvbmUtPm1vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3RlbXBmaWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpZiAoZGlmZl90ZW1wW2ldLm5hbWUgPT0gZGlmZl90ZW1wW2ldLnRtcF9wYXRoKSB7CisJCQl1bmxpbmsoZGlmZl90ZW1wW2ldLm5hbWUpOworCQkJZGlmZl90ZW1wW2ldLm5hbWUgPSBOVUxMOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV90ZW1wZmlsZV9vbl9zaWduYWwoaW50IHNpZ25vKQoreworCXJlbW92ZV90ZW1wZmlsZSgpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJhaXNlKHNpZ25vKTsKK30KKworc3RhdGljIGludCBzcGF3bl9wcm9nKGNvbnN0IGNoYXIgKnBnbSwgY29uc3QgY2hhciAqKmFyZykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHN0YXR1czsKKworCWZmbHVzaChOVUxMKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGZvcmsiKTsKKwlpZiAoIXBpZCkgeworCQlleGVjdnAocGdtLCAoY2hhciAqY29uc3QqKSBhcmcpOworCQlleGl0KDI1NSk7CisJfQorCisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBFYXJsaWVyIHdlIGRpZCBub3QgY2hlY2sgdGhlIGV4aXQgc3RhdHVzIGJlY2F1c2UKKwkgKiBkaWZmIGV4aXRzIG5vbi16ZXJvIGlmIGZpbGVzIGFyZSBkaWZmZXJlbnQsIGFuZAorCSAqIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBrbm93aW5nIHRoYXQuICBJdCB3YXMgYQorCSAqIG1pc3Rha2Ugd2hpY2ggbWFkZSBpdCBoYXJkZXIgdG8gcXVpdCBhIGRpZmYtKgorCSAqIHNlc3Npb24gdGhhdCB1c2VzIHRoZSBnaXQtYXBwbHktcGF0Y2gtc2NyaXB0IGFzCisJICogdGhlIEdJVF9FWFRFUk5BTF9ESUZGLiAgQSBjdXN0b20gR0lUX0VYVEVSTkFMX0RJRkYKKwkgKiBzaG91bGQgYWxzbyBleGl0IG5vbi16ZXJvIG9ubHkgd2hlbiBpdCB3YW50cyB0bworCSAqIGFib3J0IHRoZSBlbnRpcmUgZGlmZi0qIHNlc3Npb24uCisJICovCisJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmICFXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIEFuIGV4dGVybmFsIGRpZmYgY29tbWFuZCB0YWtlczoKKyAqCisgKiBkaWZmLWNtZCBuYW1lIGluZmlsZTEgaW5maWxlMS1zaGExIGluZmlsZTEtbW9kZSBcCisgKiAgICAgICAgICAgICAgIGluZmlsZTIgaW5maWxlMi1zaGExIGluZmlsZTItbW9kZSBbIHJlbmFtZS10byBdCisgKgorICovCitzdGF0aWMgdm9pZCBydW5fZXh0ZXJuYWxfZGlmZihjb25zdCBjaGFyICpwZ20sCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgY29uc3QgY2hhciAqb3RoZXIsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnhmcm1fbXNnLAorCQkJICAgICAgaW50IGNvbXBsZXRlX3Jld3JpdGUpCit7CisJY29uc3QgY2hhciAqc3Bhd25fYXJnWzEwXTsKKwlzdHJ1Y3QgZGlmZl90ZW1wZmlsZSAqdGVtcCA9IGRpZmZfdGVtcDsKKwlpbnQgcmV0dmFsOworCXN0YXRpYyBpbnQgYXRleGl0X2Fza2VkID0gMDsKKwljb25zdCBjaGFyICpvdGhlcm5hbWU7CisJY29uc3QgY2hhciAqKmFyZyA9ICZzcGF3bl9hcmdbMF07CisKKwlvdGhlcm5hbWUgPSAob3RoZXI/IG90aGVyIDogbmFtZSk7CisJaWYgKG9uZSAmJiB0d28pIHsKKwkJcHJlcGFyZV90ZW1wX2ZpbGUobmFtZSwgJnRlbXBbMF0sIG9uZSk7CisJCXByZXBhcmVfdGVtcF9maWxlKG90aGVybmFtZSwgJnRlbXBbMV0sIHR3byk7CisJCWlmICghIGF0ZXhpdF9hc2tlZCAmJgorCQkgICAgKHRlbXBbMF0ubmFtZSA9PSB0ZW1wWzBdLnRtcF9wYXRoIHx8CisJCSAgICAgdGVtcFsxXS5uYW1lID09IHRlbXBbMV0udG1wX3BhdGgpKSB7CisJCQlhdGV4aXRfYXNrZWQgPSAxOworCQkJYXRleGl0KHJlbW92ZV90ZW1wZmlsZSk7CisJCX0KKwkJc2lnbmFsKFNJR0lOVCwgcmVtb3ZlX3RlbXBmaWxlX29uX3NpZ25hbCk7CisJfQorCisJaWYgKG9uZSAmJiB0d28pIHsKKwkJKmFyZysrID0gcGdtOworCQkqYXJnKysgPSBuYW1lOworCQkqYXJnKysgPSB0ZW1wWzBdLm5hbWU7CisJCSphcmcrKyA9IHRlbXBbMF0uaGV4OworCQkqYXJnKysgPSB0ZW1wWzBdLm1vZGU7CisJCSphcmcrKyA9IHRlbXBbMV0ubmFtZTsKKwkJKmFyZysrID0gdGVtcFsxXS5oZXg7CisJCSphcmcrKyA9IHRlbXBbMV0ubW9kZTsKKwkJaWYgKG90aGVyKSB7CisJCQkqYXJnKysgPSBvdGhlcjsKKwkJCSphcmcrKyA9IHhmcm1fbXNnOworCQl9CisJfSBlbHNlIHsKKwkJKmFyZysrID0gcGdtOworCQkqYXJnKysgPSBuYW1lOworCX0KKwkqYXJnID0gTlVMTDsKKwlyZXR2YWwgPSBzcGF3bl9wcm9nKHBnbSwgc3Bhd25fYXJnKTsKKwlyZW1vdmVfdGVtcGZpbGUoKTsKKwlpZiAocmV0dmFsKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXh0ZXJuYWwgZGlmZiBkaWVkLCBzdG9wcGluZyBhdCAlcy5cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgcnVuX2RpZmZfY21kKGNvbnN0IGNoYXIgKnBnbSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IGNoYXIgKm90aGVyLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSBjb25zdCBjaGFyICp4ZnJtX21zZywKKwkJCSBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvLAorCQkJIGludCBjb21wbGV0ZV9yZXdyaXRlKQoreworCWlmIChwZ20pIHsKKwkJcnVuX2V4dGVybmFsX2RpZmYocGdtLCBuYW1lLCBvdGhlciwgb25lLCB0d28sIHhmcm1fbXNnLAorCQkJCSAgY29tcGxldGVfcmV3cml0ZSk7CisJCXJldHVybjsKKwl9CisJaWYgKG9uZSAmJiB0d28pCisJCWJ1aWx0aW5fZGlmZihuYW1lLCBvdGhlciA/IG90aGVyIDogbmFtZSwKKwkJCSAgICAgb25lLCB0d28sIHhmcm1fbXNnLCBvLCBjb21wbGV0ZV9yZXdyaXRlKTsKKwllbHNlCisJCXByaW50ZigiKiBVbm1lcmdlZCBwYXRoICVzXG4iLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9maWxsX3NoYTFfaW5mbyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lKQoreworCWlmIChESUZGX0ZJTEVfVkFMSUQob25lKSkgeworCQlpZiAoIW9uZS0+c2hhMV92YWxpZCkgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlpZiAobHN0YXQob25lLT5wYXRoLCAmc3QpIDwgMCkKKwkJCQlkaWUoInN0YXQgJXMiLCBvbmUtPnBhdGgpOworCQkJaWYgKGluZGV4X3BhdGgob25lLT5zaGExLCBvbmUtPnBhdGgsICZzdCwgMCkpCisJCQkJZGllKCJjYW5ub3QgaGFzaCAlc1xuIiwgb25lLT5wYXRoKTsKKwkJfQorCX0KKwllbHNlCisJCW1lbXNldChvbmUtPnNoYTEsIDAsIDIwKTsKK30KKworc3RhdGljIHZvaWQgcnVuX2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJY29uc3QgY2hhciAqcGdtID0gZXh0ZXJuYWxfZGlmZigpOworCWNoYXIgbXNnW1BBVEhfTUFYKjIrMzAwXSwgKnhmcm1fbXNnOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmU7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bzsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKm90aGVyOworCWNoYXIgKm5hbWVfbXVuZ2VkLCAqb3RoZXJfbXVuZ2VkOworCWludCBjb21wbGV0ZV9yZXdyaXRlID0gMDsKKwlpbnQgbGVuOworCisJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkgeworCQkvKiB1bm1lcmdlZCAqLworCQlydW5fZGlmZl9jbWQocGdtLCBwLT5vbmUtPnBhdGgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIG8sIDApOworCQlyZXR1cm47CisJfQorCisJbmFtZSA9IHAtPm9uZS0+cGF0aDsKKwlvdGhlciA9IChzdHJjbXAobmFtZSwgcC0+dHdvLT5wYXRoKSA/IHAtPnR3by0+cGF0aCA6IE5VTEwpOworCW5hbWVfbXVuZ2VkID0gcXVvdGVfb25lKG5hbWUpOworCW90aGVyX211bmdlZCA9IHF1b3RlX29uZShvdGhlcik7CisJb25lID0gcC0+b25lOyB0d28gPSBwLT50d287CisKKwlkaWZmX2ZpbGxfc2hhMV9pbmZvKG9uZSk7CisJZGlmZl9maWxsX3NoYTFfaW5mbyh0d28pOworCisJbGVuID0gMDsKKwlzd2l0Y2ggKHAtPnN0YXR1cykgeworCWNhc2UgRElGRl9TVEFUVVNfQ09QSUVEOgorCQlsZW4gKz0gc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCQkic2ltaWxhcml0eSBpbmRleCAlZCUlXG4iCisJCQkJImNvcHkgZnJvbSAlc1xuIgorCQkJCSJjb3B5IHRvICVzXG4iLAorCQkJCShpbnQpKDAuNSArIHAtPnNjb3JlICogMTAwLjAvTUFYX1NDT1JFKSwKKwkJCQluYW1lX211bmdlZCwgb3RoZXJfbXVuZ2VkKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQlsZW4gKz0gc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCQkic2ltaWxhcml0eSBpbmRleCAlZCUlXG4iCisJCQkJInJlbmFtZSBmcm9tICVzXG4iCisJCQkJInJlbmFtZSB0byAlc1xuIiwKKwkJCQkoaW50KSgwLjUgKyBwLT5zY29yZSAqIDEwMC4wL01BWF9TQ09SRSksCisJCQkJbmFtZV9tdW5nZWQsIG90aGVyX211bmdlZCk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfTU9ESUZJRUQ6CisJCWlmIChwLT5zY29yZSkgeworCQkJbGVuICs9IHNucHJpbnRmKG1zZyArIGxlbiwgc2l6ZW9mKG1zZykgLSBsZW4sCisJCQkJCSJkaXNzaW1pbGFyaXR5IGluZGV4ICVkJSVcbiIsCisJCQkJCShpbnQpKDAuNSArIHAtPnNjb3JlICoKKwkJCQkJICAgICAgMTAwLjAvTUFYX1NDT1JFKSk7CisJCQljb21wbGV0ZV9yZXdyaXRlID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGx0aHJ1ICovCisJZGVmYXVsdDoKKwkJLyogbm90aGluZyAqLworCQk7CisJfQorCisJaWYgKG1lbWNtcChvbmUtPnNoYTEsIHR3by0+c2hhMSwgMjApKSB7CisJCWludCBhYmJyZXYgPSBvLT5mdWxsX2luZGV4ID8gNDAgOiBERUZBVUxUX0FCQlJFVjsKKworCQlsZW4gKz0gc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCQkiaW5kZXggJS4qcy4uJS4qcyIsCisJCQkJYWJicmV2LCBzaGExX3RvX2hleChvbmUtPnNoYTEpLAorCQkJCWFiYnJldiwgc2hhMV90b19oZXgodHdvLT5zaGExKSk7CisJCWlmIChvbmUtPm1vZGUgPT0gdHdvLT5tb2RlKQorCQkJbGVuICs9IHNucHJpbnRmKG1zZyArIGxlbiwgc2l6ZW9mKG1zZykgLSBsZW4sCisJCQkJCSIgJTA2byIsIG9uZS0+bW9kZSk7CisJCWxlbiArPSBzbnByaW50Zihtc2cgKyBsZW4sIHNpemVvZihtc2cpIC0gbGVuLCAiXG4iKTsKKwl9CisKKwlpZiAobGVuKQorCQltc2dbLS1sZW5dID0gMDsKKwl4ZnJtX21zZyA9IGxlbiA/IG1zZyA6IE5VTEw7CisKKwlpZiAoIXBnbSAmJgorCSAgICBESUZGX0ZJTEVfVkFMSUQob25lKSAmJiBESUZGX0ZJTEVfVkFMSUQodHdvKSAmJgorCSAgICAoU19JRk1UICYgb25lLT5tb2RlKSAhPSAoU19JRk1UICYgdHdvLT5tb2RlKSkgeworCQkvKiBhIGZpbGVwYWlyIHRoYXQgY2hhbmdlcyBiZXR3ZWVuIGZpbGUgYW5kIHN5bWxpbmsKKwkJICogbmVlZHMgdG8gYmUgc3BsaXQgaW50byBkZWxldGlvbiBhbmQgY3JlYXRpb24uCisJCSAqLworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbnVsbCA9IGFsbG9jX2ZpbGVzcGVjKHR3by0+cGF0aCk7CisJCXJ1bl9kaWZmX2NtZChOVUxMLCBuYW1lLCBvdGhlciwgb25lLCBudWxsLCB4ZnJtX21zZywgbywgMCk7CisJCWZyZWUobnVsbCk7CisJCW51bGwgPSBhbGxvY19maWxlc3BlYyhvbmUtPnBhdGgpOworCQlydW5fZGlmZl9jbWQoTlVMTCwgbmFtZSwgb3RoZXIsIG51bGwsIHR3bywgeGZybV9tc2csIG8sIDApOworCQlmcmVlKG51bGwpOworCX0KKwllbHNlCisJCXJ1bl9kaWZmX2NtZChwZ20sIG5hbWUsIG90aGVyLCBvbmUsIHR3bywgeGZybV9tc2csIG8sCisJCQkgICAgIGNvbXBsZXRlX3Jld3JpdGUpOworCisJZnJlZShuYW1lX211bmdlZCk7CisJZnJlZShvdGhlcl9tdW5nZWQpOworfQorCitzdGF0aWMgdm9pZCBydW5fZGlmZnN0YXQoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0KQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqb3RoZXI7CisJaW50IGNvbXBsZXRlX3Jld3JpdGUgPSAwOworCisJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkgeworCQkvKiB1bm1lcmdlZCAqLworCQlidWlsdGluX2RpZmZzdGF0KHAtPm9uZS0+cGF0aCwgTlVMTCwgTlVMTCwgTlVMTCwgZGlmZnN0YXQsIDApOworCQlyZXR1cm47CisJfQorCisJbmFtZSA9IHAtPm9uZS0+cGF0aDsKKwlvdGhlciA9IChzdHJjbXAobmFtZSwgcC0+dHdvLT5wYXRoKSA/IHAtPnR3by0+cGF0aCA6IE5VTEwpOworCisJZGlmZl9maWxsX3NoYTFfaW5mbyhwLT5vbmUpOworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+dHdvKTsKKworCWlmIChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQgJiYgcC0+c2NvcmUpCisJCWNvbXBsZXRlX3Jld3JpdGUgPSAxOworCWJ1aWx0aW5fZGlmZnN0YXQobmFtZSwgb3RoZXIsIHAtPm9uZSwgcC0+dHdvLCBkaWZmc3RhdCwgY29tcGxldGVfcmV3cml0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9jaGVja2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpvdGhlcjsKKworCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpIHsKKwkJLyogdW5tZXJnZWQgKi8KKwkJcmV0dXJuOworCX0KKworCW5hbWUgPSBwLT5vbmUtPnBhdGg7CisJb3RoZXIgPSAoc3RyY21wKG5hbWUsIHAtPnR3by0+cGF0aCkgPyBwLT50d28tPnBhdGggOiBOVUxMKTsKKworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+b25lKTsKKwlkaWZmX2ZpbGxfc2hhMV9pbmZvKHAtPnR3byk7CisKKwlidWlsdGluX2NoZWNrZGlmZihuYW1lLCBvdGhlciwgcC0+b25lLCBwLT50d28pOworfQorCit2b2lkIGRpZmZfc2V0dXAoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwltZW1zZXQob3B0aW9ucywgMCwgc2l6ZW9mKCpvcHRpb25zKSk7CisJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKwlvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKwlvcHRpb25zLT5icmVha19vcHQgPSAtMTsKKwlvcHRpb25zLT5yZW5hbWVfbGltaXQgPSAtMTsKKwlvcHRpb25zLT5jb250ZXh0ID0gMzsKKworCW9wdGlvbnMtPmNoYW5nZSA9IGRpZmZfY2hhbmdlOworCW9wdGlvbnMtPmFkZF9yZW1vdmUgPSBkaWZmX2FkZHJlbW92ZTsKK30KKworaW50IGRpZmZfc2V0dXBfZG9uZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWlmICgob3B0aW9ucy0+ZmluZF9jb3BpZXNfaGFyZGVyICYmCisJICAgICBvcHRpb25zLT5kZXRlY3RfcmVuYW1lICE9IERJRkZfREVURUNUX0NPUFkpIHx8CisJICAgICgwIDw9IG9wdGlvbnMtPnJlbmFtZV9saW1pdCAmJiAhb3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSkpCisJCXJldHVybiAtMTsKKworCS8qCisJICogVGhlc2UgY2FzZXMgYWx3YXlzIG5lZWQgcmVjdXJzaXZlOyB3ZSBkbyBub3QgZHJvcCBjYWxsZXItc3VwcGxpZWQKKwkgKiByZWN1cnNpdmUgYml0cyBmb3Igb3RoZXIgZm9ybWF0cyBoZXJlLgorCSAqLworCWlmICgob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9QQVRDSCkgfHwKKwkgICAgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPT0gRElGRl9GT1JNQVRfRElGRlNUQVQpIHx8CisJICAgIChvcHRpb25zLT5vdXRwdXRfZm9ybWF0ID09IERJRkZfRk9STUFUX0NIRUNLRElGRikpCisJCW9wdGlvbnMtPnJlY3Vyc2l2ZSA9IDE7CisKKwkvKgorCSAqIFRoZXNlIGNvbWJpbmF0aW9ucyBkbyBub3QgbWFrZSBzZW5zZS4KKwkgKi8KKwlpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9SQVcpCisJCW9wdGlvbnMtPndpdGhfcmF3ID0gMDsKKwlpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9ESUZGU1RBVCkKKwkJb3B0aW9ucy0+d2l0aF9zdGF0ICA9IDA7CisKKwlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSAmJiBvcHRpb25zLT5yZW5hbWVfbGltaXQgPCAwKQorCQlvcHRpb25zLT5yZW5hbWVfbGltaXQgPSBkaWZmX3JlbmFtZV9saW1pdF9kZWZhdWx0OworCWlmIChvcHRpb25zLT5zZXR1cCAmIERJRkZfU0VUVVBfVVNFX0NBQ0hFKSB7CisJCWlmICghYWN0aXZlX2NhY2hlKQorCQkJLyogcmVhZC1jYWNoZSBkb2VzIG5vdCBkaWUgZXZlbiB3aGVuIGl0IGZhaWxzCisJCQkgKiBzbyBpdCBpcyBzYWZlIGZvciB1cyB0byBkbyB0aGlzIGhlcmUuICBBbHNvCisJCQkgKiBpdCBkb2VzIG5vdCBzbXVkZ2UgYWN0aXZlX2NhY2hlIG9yIGFjdGl2ZV9ucgorCQkJICogd2hlbiBpdCBmYWlscywgc28gd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQKKwkJCSAqIGNsZWFuaW5nIGl0IHVwIG91cnNlbHZlcyBlaXRoZXIuCisJCQkgKi8KKwkJCXJlYWRfY2FjaGUoKTsKKwl9CisJaWYgKG9wdGlvbnMtPnNldHVwICYgRElGRl9TRVRVUF9VU0VfU0laRV9DQUNIRSkKKwkJdXNlX3NpemVfY2FjaGUgPSAxOworCWlmIChvcHRpb25zLT5hYmJyZXYgPD0gMCB8fCA0MCA8IG9wdGlvbnMtPmFiYnJldikKKwkJb3B0aW9ucy0+YWJicmV2ID0gNDA7IC8qIGZ1bGwgKi8KKworCXJldHVybiAwOworfQorCitpbnQgb3B0X2FyZyhjb25zdCBjaGFyICphcmcsIGludCBhcmdfc2hvcnQsIGNvbnN0IGNoYXIgKmFyZ19sb25nLCBpbnQgKnZhbCkKK3sKKwljaGFyIGMsICplcTsKKwlpbnQgbGVuOworCisJaWYgKCphcmcgIT0gJy0nKQorCQlyZXR1cm4gMDsKKwljID0gKisrYXJnOworCWlmICghYykKKwkJcmV0dXJuIDA7CisJaWYgKGMgPT0gYXJnX3Nob3J0KSB7CisJCWMgPSAqKythcmc7CisJCWlmICghYykKKwkJCXJldHVybiAxOworCQlpZiAodmFsICYmIGlzZGlnaXQoYykpIHsKKwkJCWNoYXIgKmVuZDsKKwkJCWludCBuID0gc3RydG91bChhcmcsICZlbmQsIDEwKTsKKwkJCWlmICgqZW5kKQorCQkJCXJldHVybiAwOworCQkJKnZhbCA9IG47CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKGMgIT0gJy0nKQorCQlyZXR1cm4gMDsKKwlhcmcrKzsKKwllcSA9IHN0cmNocihhcmcsICc9Jyk7CisJaWYgKGVxKQorCQlsZW4gPSBlcSAtIGFyZzsKKwllbHNlCisJCWxlbiA9IHN0cmxlbihhcmcpOworCWlmICghbGVuIHx8IHN0cm5jbXAoYXJnLCBhcmdfbG9uZywgbGVuKSkKKwkJcmV0dXJuIDA7CisJaWYgKGVxKSB7CisJCWludCBuOworCQljaGFyICplbmQ7CisJCWlmICghaXNkaWdpdCgqKytlcSkpCisJCQlyZXR1cm4gMDsKKwkJbiA9IHN0cnRvdWwoZXEsICZlbmQsIDEwKTsKKwkJaWYgKCplbmQpCisJCQlyZXR1cm4gMDsKKwkJKnZhbCA9IG47CisJfQorCXJldHVybiAxOworfQorCitpbnQgZGlmZl9vcHRfcGFyc2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywgY29uc3QgY2hhciAqKmF2LCBpbnQgYWMpCit7CisJY29uc3QgY2hhciAqYXJnID0gYXZbMF07CisJaWYgKCFzdHJjbXAoYXJnLCAiLXAiKSB8fCAhc3RyY21wKGFyZywgIi11IikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9QQVRDSDsKKwllbHNlIGlmIChvcHRfYXJnKGFyZywgJ1UnLCAidW5pZmllZCIsICZvcHRpb25zLT5jb250ZXh0KSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1BBVENIOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1wYXRjaC13aXRoLXJhdyIpKSB7CisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9QQVRDSDsKKwkJb3B0aW9ucy0+d2l0aF9yYXcgPSAxOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc3RhdCIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfRElGRlNUQVQ7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNoZWNrIikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9DSEVDS0RJRkY7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXN1bW1hcnkiKSkKKwkJb3B0aW9ucy0+c3VtbWFyeSA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXBhdGNoLXdpdGgtc3RhdCIpKSB7CisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9QQVRDSDsKKwkJb3B0aW9ucy0+d2l0aF9zdGF0ID0gMTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICIteiIpKQorCQlvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uID0gMDsKKwllbHNlIGlmICghc3RybmNtcChhcmcsICItbCIsIDIpKQorCQlvcHRpb25zLT5yZW5hbWVfbGltaXQgPSBzdHJ0b3VsKGFyZysyLCBOVUxMLCAxMCk7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWZ1bGwtaW5kZXgiKSkKKwkJb3B0aW9ucy0+ZnVsbF9pbmRleCA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWJpbmFyeSIpKSB7CisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9QQVRDSDsKKwkJb3B0aW9ucy0+ZnVsbF9pbmRleCA9IG9wdGlvbnMtPmJpbmFyeSA9IDE7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uYW1lLW9ubHkiKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05BTUU7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW5hbWUtc3RhdHVzIikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUzsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi1SIikpCisJCW9wdGlvbnMtPnJldmVyc2VfZGlmZiA9IDE7CisJZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiLVMiLCAyKSkKKwkJb3B0aW9ucy0+cGlja2F4ZSA9IGFyZyArIDI7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItcyIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCWVsc2UgaWYgKCFzdHJuY21wKGFyZywgIi1PIiwgMikpCisJCW9wdGlvbnMtPm9yZGVyZmlsZSA9IGFyZyArIDI7CisJZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiLS1kaWZmLWZpbHRlcj0iLCAxNCkpCisJCW9wdGlvbnMtPmZpbHRlciA9IGFyZyArIDE0OworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1waWNrYXhlLWFsbCIpKQorCQlvcHRpb25zLT5waWNrYXhlX29wdHMgPSBESUZGX1BJQ0tBWEVfQUxMOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1waWNrYXhlLXJlZ2V4IikpCisJCW9wdGlvbnMtPnBpY2theGVfb3B0cyA9IERJRkZfUElDS0FYRV9SRUdFWDsKKwllbHNlIGlmICghc3RybmNtcChhcmcsICItQiIsIDIpKSB7CisJCWlmICgob3B0aW9ucy0+YnJlYWtfb3B0ID0KKwkJICAgICBkaWZmX3Njb3Jlb3B0X3BhcnNlKGFyZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmICghc3RybmNtcChhcmcsICItTSIsIDIpKSB7CisJCWlmICgob3B0aW9ucy0+cmVuYW1lX3Njb3JlID0KKwkJICAgICBkaWZmX3Njb3Jlb3B0X3BhcnNlKGFyZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCX0KKwllbHNlIGlmICghc3RybmNtcChhcmcsICItQyIsIDIpKSB7CisJCWlmICgob3B0aW9ucy0+cmVuYW1lX3Njb3JlID0KKwkJICAgICBkaWZmX3Njb3Jlb3B0X3BhcnNlKGFyZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfQ09QWTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWZpbmQtY29waWVzLWhhcmRlciIpKQorCQlvcHRpb25zLT5maW5kX2NvcGllc19oYXJkZXIgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1hYmJyZXYiKSkKKwkJb3B0aW9ucy0+YWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiLS1hYmJyZXY9IiwgOSkpIHsKKwkJb3B0aW9ucy0+YWJicmV2ID0gc3RydG91bChhcmcgKyA5LCBOVUxMLCAxMCk7CisJCWlmIChvcHRpb25zLT5hYmJyZXYgPCBNSU5JTVVNX0FCQlJFVikKKwkJCW9wdGlvbnMtPmFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQllbHNlIGlmICg0MCA8IG9wdGlvbnMtPmFiYnJldikKKwkJCW9wdGlvbnMtPmFiYnJldiA9IDQwOworCX0KKwllbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX251bShjb25zdCBjaGFyICoqY3BfcCkKK3sKKwl1bnNpZ25lZCBsb25nIG51bSwgc2NhbGU7CisJaW50IGNoLCBkb3Q7CisJY29uc3QgY2hhciAqY3AgPSAqY3BfcDsKKworCW51bSA9IDA7CisJc2NhbGUgPSAxOworCWRvdCA9IDA7CisJZm9yKDs7KSB7CisJCWNoID0gKmNwOworCQlpZiAoICFkb3QgJiYgY2ggPT0gJy4nICkgeworCQkJc2NhbGUgPSAxOworCQkJZG90ID0gMTsKKwkJfSBlbHNlIGlmICggY2ggPT0gJyUnICkgeworCQkJc2NhbGUgPSBkb3QgPyBzY2FsZSoxMDAgOiAxMDA7CisJCQljcCsrOwkvKiAlIGlzIGFsd2F5cyBhdCB0aGUgZW5kICovCisJCQlicmVhazsKKwkJfSBlbHNlIGlmICggY2ggPj0gJzAnICYmIGNoIDw9ICc5JyApIHsKKwkJCWlmICggc2NhbGUgPCAxMDAwMDAgKSB7CisJCQkJc2NhbGUgKj0gMTA7CisJCQkJbnVtID0gKG51bSoxMCkgKyAoY2gtJzAnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWNwKys7CisJfQorCSpjcF9wID0gY3A7CisKKwkvKiB1c2VyIHNheXMgbnVtIGRpdmlkZWQgYnkgc2NhbGUgYW5kIHdlIHNheSBpbnRlcm5hbGx5IHRoYXQKKwkgKiBpcyBNQVhfU0NPUkUgKiBudW0gLyBzY2FsZS4KKwkgKi8KKwlyZXR1cm4gKG51bSA+PSBzY2FsZSkgPyBNQVhfU0NPUkUgOiAoTUFYX1NDT1JFICogbnVtIC8gc2NhbGUpOworfQorCitpbnQgZGlmZl9zY29yZW9wdF9wYXJzZShjb25zdCBjaGFyICpvcHQpCit7CisJaW50IG9wdDEsIG9wdDIsIGNtZDsKKworCWlmICgqb3B0KysgIT0gJy0nKQorCQlyZXR1cm4gLTE7CisJY21kID0gKm9wdCsrOworCWlmIChjbWQgIT0gJ00nICYmIGNtZCAhPSAnQycgJiYgY21kICE9ICdCJykKKwkJcmV0dXJuIC0xOyAvKiB0aGF0IGlzIG5vdCBhIC1NLCAtQyBub3IgLUIgb3B0aW9uICovCisKKwlvcHQxID0gcGFyc2VfbnVtKCZvcHQpOworCWlmIChjbWQgIT0gJ0InKQorCQlvcHQyID0gMDsKKwllbHNlIHsKKwkJaWYgKCpvcHQgPT0gMCkKKwkJCW9wdDIgPSAwOworCQllbHNlIGlmICgqb3B0ICE9ICcvJykKKwkJCXJldHVybiAtMTsgLyogd2UgZXhwZWN0IC1CODAvOTkgb3IgLUI4MCAqLworCQllbHNlIHsKKwkJCW9wdCsrOworCQkJb3B0MiA9IHBhcnNlX251bSgmb3B0KTsKKwkJfQorCX0KKwlpZiAoKm9wdCAhPSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIG9wdDEgfCAob3B0MiA8PCAxNik7Cit9CisKK3N0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBkaWZmX3F1ZXVlZF9kaWZmOworCit2b2lkIGRpZmZfcShzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnF1ZXVlLCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqZHApCit7CisJaWYgKHF1ZXVlLT5hbGxvYyA8PSBxdWV1ZS0+bnIpIHsKKwkJcXVldWUtPmFsbG9jID0gYWxsb2NfbnIocXVldWUtPmFsbG9jKTsKKwkJcXVldWUtPnF1ZXVlID0geHJlYWxsb2MocXVldWUtPnF1ZXVlLAorCQkJCQlzaXplb2YoZHApICogcXVldWUtPmFsbG9jKTsKKwl9CisJcXVldWUtPnF1ZXVlW3F1ZXVlLT5ucisrXSA9IGRwOworfQorCitzdHJ1Y3QgZGlmZl9maWxlcGFpciAqZGlmZl9xdWV1ZShzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnF1ZXVlLAorCQkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvKQoreworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcCA9IHhtYWxsb2Moc2l6ZW9mKCpkcCkpOworCWRwLT5vbmUgPSBvbmU7CisJZHAtPnR3byA9IHR3bzsKKwlkcC0+c2NvcmUgPSAwOworCWRwLT5zdGF0dXMgPSAwOworCWRwLT5zb3VyY2Vfc3RheXMgPSAwOworCWRwLT5icm9rZW5fcGFpciA9IDA7CisJaWYgKHF1ZXVlKQorCQlkaWZmX3EocXVldWUsIGRwKTsKKwlyZXR1cm4gZHA7Cit9CisKK3ZvaWQgZGlmZl9mcmVlX2ZpbGVwYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHAtPm9uZSk7CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEocC0+dHdvKTsKKwlmcmVlKHAtPm9uZSk7CisJZnJlZShwLT50d28pOworCWZyZWUocCk7Cit9CisKKy8qIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gZmluZF91bmlxdWVfYWJicmV2KCkgaW4gdGhhdAorICogaXQgc3R1ZmZzIHRoZSByZXN1bHQgd2l0aCBkb3RzIGZvciBhbGlnbm1lbnQuCisgKi8KK2NvbnN0IGNoYXIgKmRpZmZfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgbGVuKQoreworCWludCBhYmJsZW47CisJY29uc3QgY2hhciAqYWJicmV2OworCWlmIChsZW4gPT0gNDApCisJCXJldHVybiBzaGExX3RvX2hleChzaGExKTsKKworCWFiYnJldiA9IGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBsZW4pOworCWlmICghYWJicmV2KQorCQlyZXR1cm4gc2hhMV90b19oZXgoc2hhMSk7CisJYWJibGVuID0gc3RybGVuKGFiYnJldik7CisJaWYgKGFiYmxlbiA8IDM3KSB7CisJCXN0YXRpYyBjaGFyIGhleFs0MV07CisJCWlmIChsZW4gPCBhYmJsZW4gJiYgYWJibGVuIDw9IGxlbiArIDIpCisJCQlzcHJpbnRmKGhleCwgIiVzJS4qcyIsIGFiYnJldiwgbGVuKzMtYWJibGVuLCAiLi4iKTsKKwkJZWxzZQorCQkJc3ByaW50ZihoZXgsICIlcy4uLiIsIGFiYnJldik7CisJCXJldHVybiBoZXg7CisJfQorCXJldHVybiBzaGExX3RvX2hleChzaGExKTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9mbHVzaF9yYXcoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsCisJCQkgICBpbnQgbGluZV90ZXJtaW5hdGlvbiwKKwkJCSAgIGludCBpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uLAorCQkJICAgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJCSAgIGludCBvdXRwdXRfZm9ybWF0KQoreworCWludCB0d29fcGF0aHM7CisJY2hhciBzdGF0dXNbMTBdOworCWludCBhYmJyZXYgPSBvcHRpb25zLT5hYmJyZXY7CisJY29uc3QgY2hhciAqcGF0aF9vbmUsICpwYXRoX3R3bzsKKworCXBhdGhfb25lID0gcC0+b25lLT5wYXRoOworCXBhdGhfdHdvID0gcC0+dHdvLT5wYXRoOworCWlmIChsaW5lX3Rlcm1pbmF0aW9uKSB7CisJCXBhdGhfb25lID0gcXVvdGVfb25lKHBhdGhfb25lKTsKKwkJcGF0aF90d28gPSBxdW90ZV9vbmUocGF0aF90d28pOworCX0KKworCWlmIChwLT5zY29yZSkKKwkJc3ByaW50ZihzdGF0dXMsICIlYyUwM2QiLCBwLT5zdGF0dXMsCisJCQkoaW50KSgwLjUgKyBwLT5zY29yZSAqIDEwMC4wL01BWF9TQ09SRSkpOworCWVsc2UgeworCQlzdGF0dXNbMF0gPSBwLT5zdGF0dXM7CisJCXN0YXR1c1sxXSA9IDA7CisJfQorCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQl0d29fcGF0aHMgPSAxOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX0FEREVEOgorCWNhc2UgRElGRl9TVEFUVVNfREVMRVRFRDoKKwkJdHdvX3BhdGhzID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHdvX3BhdGhzID0gMDsKKwkJYnJlYWs7CisJfQorCWlmIChvdXRwdXRfZm9ybWF0ICE9IERJRkZfRk9STUFUX05BTUVfU1RBVFVTKSB7CisJCXByaW50ZigiOiUwNm8gJTA2byAlcyAiLAorCQkgICAgICAgcC0+b25lLT5tb2RlLCBwLT50d28tPm1vZGUsCisJCSAgICAgICBkaWZmX3VuaXF1ZV9hYmJyZXYocC0+b25lLT5zaGExLCBhYmJyZXYpKTsKKwkJcHJpbnRmKCIlcyAiLAorCQkgICAgICAgZGlmZl91bmlxdWVfYWJicmV2KHAtPnR3by0+c2hhMSwgYWJicmV2KSk7CisJfQorCXByaW50ZigiJXMlYyVzIiwgc3RhdHVzLCBpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uLCBwYXRoX29uZSk7CisJaWYgKHR3b19wYXRocykKKwkJcHJpbnRmKCIlYyVzIiwgaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiwgcGF0aF90d28pOworCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CisJaWYgKHBhdGhfb25lICE9IHAtPm9uZS0+cGF0aCkKKwkJZnJlZSgodm9pZCopcGF0aF9vbmUpOworCWlmIChwYXRoX3R3byAhPSBwLT50d28tPnBhdGgpCisJCWZyZWUoKHZvaWQqKXBhdGhfdHdvKTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9mbHVzaF9uYW1lKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLAorCQkJICAgIGludCBpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uLAorCQkJICAgIGludCBsaW5lX3Rlcm1pbmF0aW9uKQoreworCWNoYXIgKnBhdGggPSBwLT50d28tPnBhdGg7CisKKwlpZiAobGluZV90ZXJtaW5hdGlvbikKKwkJcGF0aCA9IHF1b3RlX29uZShwLT50d28tPnBhdGgpOworCWVsc2UKKwkJcGF0aCA9IHAtPnR3by0+cGF0aDsKKwlwcmludGYoIiVzJWMiLCBwYXRoLCBsaW5lX3Rlcm1pbmF0aW9uKTsKKwlpZiAocC0+dHdvLT5wYXRoICE9IHBhdGgpCisJCWZyZWUocGF0aCk7Cit9CisKK2ludCBkaWZmX3VubW9kaWZpZWRfcGFpcihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCkKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIHdyaXR0ZW4gc3RyaWN0ZXIgdGhhbiBuZWNlc3NhcnkgdG8gc3VwcG9ydAorCSAqIHRoZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgdHJhbnNmb3JtZXJzLCBidXQgdGhlIGlkZWEgaXMgdG8KKwkgKiBsZXQgdHJhbnNmb3JtZXJzIHRvIHByb2R1Y2UgZGlmZl9maWxlcGFpcnMgYW55IHdheSB0aGV5IHdhbnQsCisJICogYW5kIGZpbHRlciBhbmQgY2xlYW4gdGhlbSB1cCBoZXJlIGJlZm9yZSBwcm9kdWNpbmcgdGhlIG91dHB1dC4KKwkgKi8KKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvOworCisJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkKKwkJcmV0dXJuIDA7IC8qIHVubWVyZ2VkIGlzIGludGVyZXN0aW5nICovCisKKwlvbmUgPSBwLT5vbmU7CisJdHdvID0gcC0+dHdvOworCisJLyogZGVsZXRpb24sIGFkZGl0aW9uLCBtb2RlIG9yIHR5cGUgY2hhbmdlCisJICogYW5kIHJlbmFtZSBhcmUgYWxsIGludGVyZXN0aW5nLgorCSAqLworCWlmIChESUZGX0ZJTEVfVkFMSUQob25lKSAhPSBESUZGX0ZJTEVfVkFMSUQodHdvKSB8fAorCSAgICBESUZGX1BBSVJfTU9ERV9DSEFOR0VEKHApIHx8CisJICAgIHN0cmNtcChvbmUtPnBhdGgsIHR3by0+cGF0aCkpCisJCXJldHVybiAwOworCisJLyogYm90aCBhcmUgdmFsaWQgYW5kIHBvaW50IGF0IHRoZSBzYW1lIHBhdGguICB0aGF0IGlzLCB3ZSBhcmUKKwkgKiBkZWFsaW5nIHdpdGggYSBjaGFuZ2UuCisJICovCisJaWYgKG9uZS0+c2hhMV92YWxpZCAmJiB0d28tPnNoYTFfdmFsaWQgJiYKKwkgICAgIW1lbWNtcChvbmUtPnNoYTEsIHR3by0+c2hhMSwgc2l6ZW9mKG9uZS0+c2hhMSkpKQorCQlyZXR1cm4gMTsgLyogbm8gY2hhbmdlICovCisJaWYgKCFvbmUtPnNoYTFfdmFsaWQgJiYgIXR3by0+c2hhMV92YWxpZCkKKwkJcmV0dXJuIDE7IC8qIGJvdGggbG9vayBhdCB0aGUgc2FtZSBmaWxlIG9uIHRoZSBmaWxlc3lzdGVtLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaWZmX2ZsdXNoX3BhdGNoKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvKQoreworCWlmIChkaWZmX3VubW9kaWZpZWRfcGFpcihwKSkKKwkJcmV0dXJuOworCisJaWYgKChESUZGX0ZJTEVfVkFMSUQocC0+b25lKSAmJiBTX0lTRElSKHAtPm9uZS0+bW9kZSkpIHx8CisJICAgIChESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSAmJiBTX0lTRElSKHAtPnR3by0+bW9kZSkpKQorCQlyZXR1cm47IC8qIG5vIHRyZWUgZGlmZnMgaW4gcGF0Y2ggZm9ybWF0ICovCisKKwlydW5fZGlmZihwLCBvKTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9mbHVzaF9zdGF0KHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvLAorCQkJICAgIHN0cnVjdCBkaWZmc3RhdF90ICpkaWZmc3RhdCkKK3sKKwlpZiAoZGlmZl91bm1vZGlmaWVkX3BhaXIocCkpCisJCXJldHVybjsKKworCWlmICgoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgU19JU0RJUihwLT5vbmUtPm1vZGUpKSB8fAorCSAgICAoRElGRl9GSUxFX1ZBTElEKHAtPnR3bykgJiYgU19JU0RJUihwLT50d28tPm1vZGUpKSkKKwkJcmV0dXJuOyAvKiBubyB0cmVlIGRpZmZzIGluIHBhdGNoIGZvcm1hdCAqLworCisJcnVuX2RpZmZzdGF0KHAsIG8sIGRpZmZzdGF0KTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9mbHVzaF9jaGVja2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsCisJCXN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQlyZXR1cm47CisKKwlpZiAoKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIFNfSVNESVIocC0+b25lLT5tb2RlKSkgfHwKKwkgICAgKERJRkZfRklMRV9WQUxJRChwLT50d28pICYmIFNfSVNESVIocC0+dHdvLT5tb2RlKSkpCisJCXJldHVybjsgLyogbm8gdHJlZSBkaWZmcyBpbiBwYXRjaCBmb3JtYXQgKi8KKworCXJ1bl9jaGVja2RpZmYocCwgbyk7Cit9CisKK2ludCBkaWZmX3F1ZXVlX2lzX2VtcHR5KHZvaWQpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspCisJCWlmICghZGlmZl91bm1vZGlmaWVkX3BhaXIocS0+cXVldWVbaV0pKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKyNpZiBESUZGX0RFQlVHCit2b2lkIGRpZmZfZGVidWdfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnMsIGludCB4LCBjb25zdCBjaGFyICpvbmUpCit7CisJZnByaW50ZihzdGRlcnIsICJxdWV1ZVslZF0gJXMgKCVzKSAlcyAlMDZvICVzXG4iLAorCQl4LCBvbmUgPyBvbmUgOiAiIiwKKwkJcy0+cGF0aCwKKwkJRElGRl9GSUxFX1ZBTElEKHMpID8gInZhbGlkIiA6ICJpbnZhbGlkIiwKKwkJcy0+bW9kZSwKKwkJcy0+c2hhMV92YWxpZCA/IHNoYTFfdG9faGV4KHMtPnNoYTEpIDogIiIpOworCWZwcmludGYoc3RkZXJyLCAicXVldWVbJWRdICVzIHNpemUgJWx1IGZsYWdzICVkXG4iLAorCQl4LCBvbmUgPyBvbmUgOiAiIiwKKwkJcy0+c2l6ZSwgcy0+eGZybV9mbGFncyk7Cit9CisKK3ZvaWQgZGlmZl9kZWJ1Z19maWxlcGFpcihjb25zdCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgaW50IGkpCit7CisJZGlmZl9kZWJ1Z19maWxlc3BlYyhwLT5vbmUsIGksICJvbmUiKTsKKwlkaWZmX2RlYnVnX2ZpbGVzcGVjKHAtPnR3bywgaSwgInR3byIpOworCWZwcmludGYoc3RkZXJyLCAic2NvcmUgJWQsIHN0YXR1cyAlYyBzdGF5cyAlZCBicm9rZW4gJWRcbiIsCisJCXAtPnNjb3JlLCBwLT5zdGF0dXMgPyBwLT5zdGF0dXMgOiAnPycsCisJCXAtPnNvdXJjZV9zdGF5cywgcC0+YnJva2VuX3BhaXIpOworfQorCit2b2lkIGRpZmZfZGVidWdfcXVldWUoY29uc3QgY2hhciAqbXNnLCBzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEpCit7CisJaW50IGk7CisJaWYgKG1zZykKKwkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKTsKKwlmcHJpbnRmKHN0ZGVyciwgInEtPm5yID0gJWRcbiIsIHEtPm5yKTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQlkaWZmX2RlYnVnX2ZpbGVwYWlyKHAsIGkpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaWZmX3Jlc29sdmVfcmVuYW1lX2NvcHkodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgKnBwOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCisJZGlmZl9kZWJ1Z19xdWV1ZSgicmVzb2x2ZS1yZW5hbWUtY29weSIsIHEpOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJcCA9IHEtPnF1ZXVlW2ldOworCQlwLT5zdGF0dXMgPSAwOyAvKiB1bmRlY2lkZWQgKi8KKwkJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX1VOTUVSR0VEOworCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpCisJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19BRERFRDsKKwkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfREVMRVRFRDsKKwkJZWxzZSBpZiAoRElGRl9QQUlSX1RZUEVfQ0hBTkdFRChwKSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX1RZUEVfQ0hBTkdFRDsKKworCQkvKiBmcm9tIHRoaXMgcG9pbnQgb24sIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBwYWlyCisJCSAqIHdob3NlIGJvdGggc2lkZXMgYXJlIHZhbGlkIGFuZCBvZiB0aGUgc2FtZSB0eXBlLCBpLmUuCisJCSAqIGVpdGhlciBpbi1wbGFjZSBlZGl0IG9yIHJlbmFtZS9jb3B5IGVkaXQuCisJCSAqLworCQllbHNlIGlmIChESUZGX1BBSVJfUkVOQU1FKHApKSB7CisJCQlpZiAocC0+c291cmNlX3N0YXlzKSB7CisJCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfQ09QSUVEOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogU2VlIGlmIHRoZXJlIGlzIHNvbWUgb3RoZXIgZmlsZXBhaXIgdGhhdAorCQkJICogY29waWVzIGZyb20gdGhlIHNhbWUgc291cmNlIGFzIHVzLiAgSWYgc28KKwkJCSAqIHdlIGFyZSBhIGNvcHkuICBPdGhlcndpc2Ugd2UgYXJlIGVpdGhlciBhCisJCQkgKiBjb3B5IGlmIHRoZSBwYXRoIHN0YXlzLCBvciBhIHJlbmFtZSBpZiBpdAorCQkJICogZG9lcyBub3QsIGJ1dCB3ZSBhbHJlYWR5IGhhbmRsZWQgInN0YXlzIiBjYXNlLgorCQkJICovCisJCQlmb3IgKGogPSBpICsgMTsgaiA8IHEtPm5yOyBqKyspIHsKKwkJCQlwcCA9IHEtPnF1ZXVlW2pdOworCQkJCWlmIChzdHJjbXAocHAtPm9uZS0+cGF0aCwgcC0+b25lLT5wYXRoKSkKKwkJCQkJY29udGludWU7IC8qIG5vdCB1cyAqLworCQkJCWlmICghRElGRl9QQUlSX1JFTkFNRShwcCkpCisJCQkJCWNvbnRpbnVlOyAvKiBub3QgYSByZW5hbWUvY29weSAqLworCQkJCS8qIHBwIGlzIGEgcmVuYW1lL2NvcHkgZnJvbSB0aGUgc2FtZSBzb3VyY2UgKi8KKwkJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19DT1BJRUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXAtPnN0YXR1cykKKwkJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19SRU5BTUVEOworCQl9CisJCWVsc2UgaWYgKG1lbWNtcChwLT5vbmUtPnNoYTEsIHAtPnR3by0+c2hhMSwgMjApIHx8CisJCQkgcC0+b25lLT5tb2RlICE9IHAtPnR3by0+bW9kZSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX01PRElGSUVEOworCQllbHNlIHsKKwkJCS8qIFRoaXMgaXMgYSAibm8tY2hhbmdlIiBlbnRyeSBhbmQgc2hvdWxkIG5vdAorCQkJICogaGFwcGVuIGFueW1vcmUsIGJ1dCBwcmVwYXJlIGZvciBicm9rZW4gY2FsbGVycy4KKwkJCSAqLworCQkJZXJyb3IoImZlZWRpbmcgdW5tb2RpZmllZCAlcyB0byBkaWZmY29yZSIsCisJCQkgICAgICBwLT5vbmUtPnBhdGgpOworCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfVU5LTk9XTjsKKwkJfQorCX0KKwlkaWZmX2RlYnVnX3F1ZXVlKCJyZXNvbHZlLXJlbmFtZS1jb3B5IGRvbmUiLCBxKTsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfb25lX3BhaXIoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsCisJCQkgICBpbnQgZGlmZl9vdXRwdXRfZm9ybWF0LAorCQkJICAgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJCSAgIHN0cnVjdCBkaWZmc3RhdF90ICpkaWZmc3RhdCkKK3sKKwlpbnQgaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9ICdcdCc7CisJaW50IGxpbmVfdGVybWluYXRpb24gPSBvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uOworCWlmICghbGluZV90ZXJtaW5hdGlvbikKKwkJaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9IDA7CisKKwlzd2l0Y2ggKHAtPnN0YXR1cykgeworCWNhc2UgRElGRl9TVEFUVVNfVU5LTk9XTjoKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlkaWUoImludGVybmFsIGVycm9yIGluIGRpZmYtcmVzb2x2ZS1yZW5hbWUtY29weSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzd2l0Y2ggKGRpZmZfb3V0cHV0X2Zvcm1hdCkgeworCQljYXNlIERJRkZfRk9STUFUX0RJRkZTVEFUOgorCQkJZGlmZl9mbHVzaF9zdGF0KHAsIG9wdGlvbnMsIGRpZmZzdGF0KTsKKwkJCWJyZWFrOworCQljYXNlIERJRkZfRk9STUFUX0NIRUNLRElGRjoKKwkJCWRpZmZfZmx1c2hfY2hlY2tkaWZmKHAsIG9wdGlvbnMpOworCQkJYnJlYWs7CisJCWNhc2UgRElGRl9GT1JNQVRfUEFUQ0g6CisJCQlkaWZmX2ZsdXNoX3BhdGNoKHAsIG9wdGlvbnMpOworCQkJYnJlYWs7CisJCWNhc2UgRElGRl9GT1JNQVRfUkFXOgorCQljYXNlIERJRkZfRk9STUFUX05BTUVfU1RBVFVTOgorCQkJZGlmZl9mbHVzaF9yYXcocCwgbGluZV90ZXJtaW5hdGlvbiwKKwkJCQkgICAgICAgaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiwKKwkJCQkgICAgICAgb3B0aW9ucywgZGlmZl9vdXRwdXRfZm9ybWF0KTsKKwkJCWJyZWFrOworCQljYXNlIERJRkZfRk9STUFUX05BTUU6CisJCQlkaWZmX2ZsdXNoX25hbWUocCwKKwkJCQkJaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiwKKwkJCQkJbGluZV90ZXJtaW5hdGlvbik7CisJCQlicmVhazsKKwkJY2FzZSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlX21vZGVfbmFtZShjb25zdCBjaGFyICpuZXdkZWxldGUsIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpmcykKK3sKKwlpZiAoZnMtPm1vZGUpCisJCXByaW50ZigiICVzIG1vZGUgJTA2byAlc1xuIiwgbmV3ZGVsZXRlLCBmcy0+bW9kZSwgZnMtPnBhdGgpOworCWVsc2UKKwkJcHJpbnRmKCIgJXMgJXNcbiIsIG5ld2RlbGV0ZSwgZnMtPnBhdGgpOworfQorCisKK3N0YXRpYyB2b2lkIHNob3dfbW9kZV9jaGFuZ2Uoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIGludCBzaG93X25hbWUpCit7CisJaWYgKHAtPm9uZS0+bW9kZSAmJiBwLT50d28tPm1vZGUgJiYgcC0+b25lLT5tb2RlICE9IHAtPnR3by0+bW9kZSkgeworCQlpZiAoc2hvd19uYW1lKQorCQkJcHJpbnRmKCIgbW9kZSBjaGFuZ2UgJTA2byA9PiAlMDZvICVzXG4iLAorCQkJICAgICAgIHAtPm9uZS0+bW9kZSwgcC0+dHdvLT5tb2RlLCBwLT50d28tPnBhdGgpOworCQllbHNlCisJCQlwcmludGYoIiBtb2RlIGNoYW5nZSAlMDZvID0+ICUwNm9cbiIsCisJCQkgICAgICAgcC0+b25lLT5tb2RlLCBwLT50d28tPm1vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19yZW5hbWVfY29weShjb25zdCBjaGFyICpyZW5hbWVjb3B5LCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCkKK3sKKwljb25zdCBjaGFyICpvbGQsICpuZXc7CisKKwkvKiBGaW5kIGNvbW1vbiBwcmVmaXggKi8KKwlvbGQgPSBwLT5vbmUtPnBhdGg7CisJbmV3ID0gcC0+dHdvLT5wYXRoOworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKnNsYXNoX29sZCwgKnNsYXNoX25ldzsKKwkJc2xhc2hfb2xkID0gc3RyY2hyKG9sZCwgJy8nKTsKKwkJc2xhc2hfbmV3ID0gc3RyY2hyKG5ldywgJy8nKTsKKwkJaWYgKCFzbGFzaF9vbGQgfHwKKwkJICAgICFzbGFzaF9uZXcgfHwKKwkJICAgIHNsYXNoX29sZCAtIG9sZCAhPSBzbGFzaF9uZXcgLSBuZXcgfHwKKwkJICAgIG1lbWNtcChvbGQsIG5ldywgc2xhc2hfbmV3IC0gbmV3KSkKKwkJCWJyZWFrOworCQlvbGQgPSBzbGFzaF9vbGQgKyAxOworCQluZXcgPSBzbGFzaF9uZXcgKyAxOworCX0KKwkvKiBwLT5vbmUtPnBhdGggdGhydSBvbGQgaXMgdGhlIGNvbW1vbiBwcmVmaXgsIGFuZCBvbGQgYW5kIG5ldworCSAqIHRocm91Z2ggdGhlIGVuZCBvZiBuYW1lcyBhcmUgcmVuYW1lcworCSAqLworCWlmIChvbGQgIT0gcC0+b25lLT5wYXRoKQorCQlwcmludGYoIiAlcyAlLipzeyVzID0+ICVzfSAoJWQlJSlcbiIsIHJlbmFtZWNvcHksCisJCSAgICAgICAoaW50KShvbGQgLSBwLT5vbmUtPnBhdGgpLCBwLT5vbmUtPnBhdGgsCisJCSAgICAgICBvbGQsIG5ldywgKGludCkoMC41ICsgcC0+c2NvcmUgKiAxMDAuMC9NQVhfU0NPUkUpKTsKKwllbHNlCisJCXByaW50ZigiICVzICVzID0+ICVzICglZCUlKVxuIiwgcmVuYW1lY29weSwKKwkJICAgICAgIHAtPm9uZS0+cGF0aCwgcC0+dHdvLT5wYXRoLAorCQkgICAgICAgKGludCkoMC41ICsgcC0+c2NvcmUgKiAxMDAuMC9NQVhfU0NPUkUpKTsKKwlzaG93X21vZGVfY2hhbmdlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBkaWZmX3N1bW1hcnkoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJc3dpdGNoKHAtPnN0YXR1cykgeworCWNhc2UgRElGRl9TVEFUVVNfREVMRVRFRDoKKwkJc2hvd19maWxlX21vZGVfbmFtZSgiZGVsZXRlIiwgcC0+b25lKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19BRERFRDoKKwkJc2hvd19maWxlX21vZGVfbmFtZSgiY3JlYXRlIiwgcC0+dHdvKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJCXNob3dfcmVuYW1lX2NvcHkoImNvcHkiLCBwKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQlzaG93X3JlbmFtZV9jb3B5KCJyZW5hbWUiLCBwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHAtPnNjb3JlKSB7CisJCQlwcmludGYoIiByZXdyaXRlICVzICglZCUlKVxuIiwgcC0+dHdvLT5wYXRoLAorCQkJCShpbnQpKDAuNSArIHAtPnNjb3JlICogMTAwLjAvTUFYX1NDT1JFKSk7CisJCQlzaG93X21vZGVfY2hhbmdlKHAsIDApOworCQl9IGVsc2UJc2hvd19tb2RlX2NoYW5nZShwLCAxKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIGRpZmZfZmx1c2goc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlpbnQgaTsKKwlpbnQgZGlmZl9vdXRwdXRfZm9ybWF0ID0gb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdDsKKwlzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQgPSBOVUxMOworCisJaWYgKGRpZmZfb3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9ESUZGU1RBVCB8fCBvcHRpb25zLT53aXRoX3N0YXQpIHsKKwkJZGlmZnN0YXQgPSB4Y2FsbG9jKHNpemVvZiAoc3RydWN0IGRpZmZzdGF0X3QpLCAxKTsKKwkJZGlmZnN0YXQtPnhtLmNvbnN1bWUgPSBkaWZmc3RhdF9jb25zdW1lOworCX0KKworCWlmIChvcHRpb25zLT53aXRoX3JhdykgeworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWZsdXNoX29uZV9wYWlyKHAsIERJRkZfRk9STUFUX1JBVywgb3B0aW9ucywgTlVMTCk7CisJCX0KKwkJcHV0Y2hhcihvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uKTsKKwl9CisJaWYgKG9wdGlvbnMtPndpdGhfc3RhdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWZsdXNoX29uZV9wYWlyKHAsIERJRkZfRk9STUFUX0RJRkZTVEFULCBvcHRpb25zLAorCQkJCSAgICAgICBkaWZmc3RhdCk7CisJCX0KKwkJc2hvd19zdGF0cyhkaWZmc3RhdCk7CisJCWZyZWUoZGlmZnN0YXQpOworCQlkaWZmc3RhdCA9IE5VTEw7CisJCWlmIChvcHRpb25zLT5zdW1tYXJ5KQorCQkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspCisJCQkJZGlmZl9zdW1tYXJ5KHEtPnF1ZXVlW2ldKTsKKwkJaWYgKG9wdGlvbnMtPnN0YXRfc2VwKQorCQkJZnB1dHMob3B0aW9ucy0+c3RhdF9zZXAsIHN0ZG91dCk7CisJCWVsc2UKKwkJCXB1dGNoYXIob3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbik7CisJfQorCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWZsdXNoX29uZV9wYWlyKHAsIGRpZmZfb3V0cHV0X2Zvcm1hdCwgb3B0aW9ucywgZGlmZnN0YXQpOworCX0KKworCWlmIChkaWZmc3RhdCkgeworCQlzaG93X3N0YXRzKGRpZmZzdGF0KTsKKwkJZnJlZShkaWZmc3RhdCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJaWYgKGRpZmZzdGF0ICYmIG9wdGlvbnMtPnN1bW1hcnkpCisJCQlkaWZmX3N1bW1hcnkocS0+cXVldWVbaV0pOworCQlkaWZmX2ZyZWVfZmlsZXBhaXIocS0+cXVldWVbaV0pOworCX0KKworCWZyZWUocS0+cXVldWUpOworCXEtPnF1ZXVlID0gTlVMTDsKKwlxLT5uciA9IHEtPmFsbG9jID0gMDsKK30KKworc3RhdGljIHZvaWQgZGlmZmNvcmVfYXBwbHlfZmlsdGVyKGNvbnN0IGNoYXIgKmZpbHRlcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3Qgb3V0cTsKKwlvdXRxLnF1ZXVlID0gTlVMTDsKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisKKwlpZiAoIWZpbHRlcikKKwkJcmV0dXJuOworCisJaWYgKHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX0ZJTFRFUl9BT04pKSB7CisJCWludCBmb3VuZDsKKwkJZm9yIChpID0gZm91bmQgPSAwOyAhZm91bmQgJiYgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCQlpZiAoKChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQpICYmCisJCQkgICAgICgocC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19GSUxURVJfQlJPS0VOKSkgfHwKKwkJCSAgICAgICghcC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19NT0RJRklFRCkpKSkgfHwKKwkJCSAgICAoKHAtPnN0YXR1cyAhPSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgc3RyY2hyKGZpbHRlciwgcC0+c3RhdHVzKSkpCisJCQkJZm91bmQrKzsKKwkJfQorCQlpZiAoZm91bmQpCisJCQlyZXR1cm47CisKKwkJLyogb3RoZXJ3aXNlIHdlIHdpbGwgY2xlYXIgdGhlIHdob2xlIHF1ZXVlCisJCSAqIGJ5IGNvcHlpbmcgdGhlIGVtcHR5IG91dHEgYXQgdGhlIGVuZCBvZiB0aGlzCisJCSAqIGZ1bmN0aW9uLCBidXQgZmlyc3QgY2xlYXIgdGhlIGN1cnJlbnQgZW50cmllcworCQkgKiBpbiB0aGUgcXVldWUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJCWRpZmZfZnJlZV9maWxlcGFpcihxLT5xdWV1ZVtpXSk7CisJfQorCWVsc2UgeworCQkvKiBPbmx5IHRoZSBtYXRjaGluZyBvbmVzICovCisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCisJCQlpZiAoKChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQpICYmCisJCQkgICAgICgocC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19GSUxURVJfQlJPS0VOKSkgfHwKKwkJCSAgICAgICghcC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19NT0RJRklFRCkpKSkgfHwKKwkJCSAgICAoKHAtPnN0YXR1cyAhPSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgc3RyY2hyKGZpbHRlciwgcC0+c3RhdHVzKSkpCisJCQkJZGlmZl9xKCZvdXRxLCBwKTsKKwkJCWVsc2UKKwkJCQlkaWZmX2ZyZWVfZmlsZXBhaXIocCk7CisJCX0KKwl9CisJZnJlZShxLT5xdWV1ZSk7CisJKnEgPSBvdXRxOworfQorCit2b2lkIGRpZmZjb3JlX3N0ZChzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWlmIChvcHRpb25zLT5icmVha19vcHQgIT0gLTEpCisJCWRpZmZjb3JlX2JyZWFrKG9wdGlvbnMtPmJyZWFrX29wdCk7CisJaWYgKG9wdGlvbnMtPmRldGVjdF9yZW5hbWUpCisJCWRpZmZjb3JlX3JlbmFtZShvcHRpb25zKTsKKwlpZiAob3B0aW9ucy0+YnJlYWtfb3B0ICE9IC0xKQorCQlkaWZmY29yZV9tZXJnZV9icm9rZW4oKTsKKwlpZiAob3B0aW9ucy0+cGlja2F4ZSkKKwkJZGlmZmNvcmVfcGlja2F4ZShvcHRpb25zLT5waWNrYXhlLCBvcHRpb25zLT5waWNrYXhlX29wdHMpOworCWlmIChvcHRpb25zLT5vcmRlcmZpbGUpCisJCWRpZmZjb3JlX29yZGVyKG9wdGlvbnMtPm9yZGVyZmlsZSk7CisJZGlmZl9yZXNvbHZlX3JlbmFtZV9jb3B5KCk7CisJZGlmZmNvcmVfYXBwbHlfZmlsdGVyKG9wdGlvbnMtPmZpbHRlcik7Cit9CisKKwordm9pZCBkaWZmY29yZV9zdGRfbm9fcmVzb2x2ZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWlmIChvcHRpb25zLT5waWNrYXhlKQorCQlkaWZmY29yZV9waWNrYXhlKG9wdGlvbnMtPnBpY2theGUsIG9wdGlvbnMtPnBpY2theGVfb3B0cyk7CisJaWYgKG9wdGlvbnMtPm9yZGVyZmlsZSkKKwkJZGlmZmNvcmVfb3JkZXIob3B0aW9ucy0+b3JkZXJmaWxlKTsKKwlkaWZmY29yZV9hcHBseV9maWx0ZXIob3B0aW9ucy0+ZmlsdGVyKTsKK30KKwordm9pZCBkaWZmX2FkZHJlbW92ZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgICAgaW50IGFkZHJlbW92ZSwgdW5zaWduZWQgbW9kZSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgICBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgY29uY2F0cGF0aFtQQVRIX01BWF07CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwgKnR3bzsKKworCS8qIFRoaXMgbWF5IGxvb2sgb2RkLCBidXQgaXQgaXMgYSBwcmVwYXJhdGlvbiBmb3IKKwkgKiBmZWVkaW5nICJ0aGVyZSBhcmUgdW5jaGFuZ2VkIGZpbGVzIHdoaWNoIHNob3VsZAorCSAqIG5vdCBwcm9kdWNlIGRpZmZzLCBidXQgd2hlbiB5b3UgYXJlIGRvaW5nIGNvcHkKKwkgKiBkZXRlY3Rpb24geW91IHdvdWxkIG5lZWQgdGhlbSwgc28gaGVyZSB0aGV5IGFyZSIKKwkgKiBlbnRyaWVzIHRvIHRoZSBkaWZmLWNvcmUuICBUaGV5IHdpbGwgYmUgcHJlZml4ZWQKKwkgKiB3aXRoIHNvbWV0aGluZyBsaWtlICc9JyBvciAnKicgKEkgaGF2ZW4ndCBkZWNpZGVkCisJICogd2hpY2ggYnV0IHNob3VsZCBub3QgbWFrZSBhbnkgZGlmZmVyZW5jZSkuCisJICogRmVlZGluZyB0aGUgc2FtZSBuZXcgYW5kIG9sZCB0byBkaWZmX2NoYW5nZSgpIAorCSAqIGFsc28gaGFzIHRoZSBzYW1lIGVmZmVjdC4KKwkgKiBCZWZvcmUgdGhlIGZpbmFsIG91dHB1dCBoYXBwZW5zLCB0aGV5IGFyZSBwcnVuZWQgYWZ0ZXIKKwkgKiBtZXJnZWQgaW50byByZW5hbWUvY29weSBwYWlycyBhcyBhcHByb3ByaWF0ZS4KKwkgKi8KKwlpZiAob3B0aW9ucy0+cmV2ZXJzZV9kaWZmKQorCQlhZGRyZW1vdmUgPSAoYWRkcmVtb3ZlID09ICcrJyA/ICctJyA6CisJCQkgICAgIGFkZHJlbW92ZSA9PSAnLScgPyAnKycgOiBhZGRyZW1vdmUpOworCisJaWYgKCFwYXRoKSBwYXRoID0gIiI7CisJc3ByaW50Zihjb25jYXRwYXRoLCAiJXMlcyIsIGJhc2UsIHBhdGgpOworCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCXR3byA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCisJaWYgKGFkZHJlbW92ZSAhPSAnKycpCisJCWZpbGxfZmlsZXNwZWMob25lLCBzaGExLCBtb2RlKTsKKwlpZiAoYWRkcmVtb3ZlICE9ICctJykKKwkJZmlsbF9maWxlc3BlYyh0d28sIHNoYTEsIG1vZGUpOworCisJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgb25lLCB0d28pOworfQorCit2b2lkIGRpZmZfY2hhbmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCSB1bnNpZ25lZCBvbGRfbW9kZSwgdW5zaWduZWQgbmV3X21vZGUsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCkgCit7CisJY2hhciBjb25jYXRwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvOworCisJaWYgKG9wdGlvbnMtPnJldmVyc2VfZGlmZikgeworCQl1bnNpZ25lZCB0bXA7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRtcF9jOworCQl0bXAgPSBvbGRfbW9kZTsgb2xkX21vZGUgPSBuZXdfbW9kZTsgbmV3X21vZGUgPSB0bXA7CisJCXRtcF9jID0gb2xkX3NoYTE7IG9sZF9zaGExID0gbmV3X3NoYTE7IG5ld19zaGExID0gdG1wX2M7CisJfQorCWlmICghcGF0aCkgcGF0aCA9ICIiOworCXNwcmludGYoY29uY2F0cGF0aCwgIiVzJXMiLCBiYXNlLCBwYXRoKTsKKwlvbmUgPSBhbGxvY19maWxlc3BlYyhjb25jYXRwYXRoKTsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhjb25jYXRwYXRoKTsKKwlmaWxsX2ZpbGVzcGVjKG9uZSwgb2xkX3NoYTEsIG9sZF9tb2RlKTsKKwlmaWxsX2ZpbGVzcGVjKHR3bywgbmV3X3NoYTEsIG5ld19tb2RlKTsKKworCWRpZmZfcXVldWUoJmRpZmZfcXVldWVkX2RpZmYsIG9uZSwgdHdvKTsKK30KKwordm9pZCBkaWZmX3VubWVyZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICBjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsICp0d287CisJb25lID0gYWxsb2NfZmlsZXNwZWMocGF0aCk7CisJdHdvID0gYWxsb2NfZmlsZXNwZWMocGF0aCk7CisJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgb25lLCB0d28pOworfQpkaWZmIC0tZ2l0IGEvZGlmZi5oIGIvZGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzU5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2lmbmRlZiBESUZGX0gKKyNkZWZpbmUgRElGRl9ICisKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKworc3RydWN0IHJldl9pbmZvOworc3RydWN0IGRpZmZfb3B0aW9uczsKKwordHlwZWRlZiB2b2lkICgqY2hhbmdlX2ZuX3QpKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCSB1bnNpZ25lZCBvbGRfbW9kZSwgdW5zaWduZWQgbmV3X21vZGUsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCk7CisKK3R5cGVkZWYgdm9pZCAoKmFkZF9yZW1vdmVfZm5fdCkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIGludCBhZGRyZW1vdmUsIHVuc2lnbmVkIG1vZGUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkgICAgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCk7CisKK3N0cnVjdCBkaWZmX29wdGlvbnMgeworCWNvbnN0IGNoYXIgKmZpbHRlcjsKKwljb25zdCBjaGFyICpvcmRlcmZpbGU7CisJY29uc3QgY2hhciAqcGlja2F4ZTsKKwl1bnNpZ25lZCByZWN1cnNpdmU6MSwKKwkJIHdpdGhfcmF3OjEsCisJCSB3aXRoX3N0YXQ6MSwKKwkJIHRyZWVfaW5fcmVjdXJzaXZlOjEsCisJCSBiaW5hcnk6MSwKKwkJIGZ1bGxfaW5kZXg6MSwKKwkJIHNpbGVudF9vbl9yZW1vdmU6MSwKKwkJIGZpbmRfY29waWVzX2hhcmRlcjoxLAorCQkgc3VtbWFyeToxOworCWludCBjb250ZXh0OworCWludCBicmVha19vcHQ7CisJaW50IGRldGVjdF9yZW5hbWU7CisJaW50IGxpbmVfdGVybWluYXRpb247CisJaW50IG91dHB1dF9mb3JtYXQ7CisJaW50IHBpY2theGVfb3B0czsKKwlpbnQgcmVuYW1lX3Njb3JlOworCWludCByZXZlcnNlX2RpZmY7CisJaW50IHJlbmFtZV9saW1pdDsKKwlpbnQgc2V0dXA7CisJaW50IGFiYnJldjsKKwljb25zdCBjaGFyICpzdGF0X3NlcDsKKworCWludCBucl9wYXRoczsKKwljb25zdCBjaGFyICoqcGF0aHM7CisJaW50ICpwYXRobGVuczsKKwljaGFuZ2VfZm5fdCBjaGFuZ2U7CisJYWRkX3JlbW92ZV9mbl90IGFkZF9yZW1vdmU7Cit9OworCitleHRlcm4gY29uc3QgY2hhciBtaW1lX2JvdW5kYXJ5X2xlYWRlcltdOworCitleHRlcm4gdm9pZCBkaWZmX3RyZWVfc2V0dXBfcGF0aHMoY29uc3QgY2hhciAqKnBhdGhzLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIHZvaWQgZGlmZl90cmVlX3JlbGVhc2VfcGF0aHMoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKK2V4dGVybiBpbnQgZGlmZl90cmVlKHN0cnVjdCB0cmVlX2Rlc2MgKnQxLCBzdHJ1Y3QgdHJlZV9kZXNjICp0MiwKKwkJICAgICBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpOworZXh0ZXJuIGludCBkaWZmX3RyZWVfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpvbGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldywKKwkJCSAgY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KTsKKworc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoIHsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKm5leHQ7CisJaW50IGxlbjsKKwljaGFyICpwYXRoOworCXVuc2lnbmVkIGludCBtb2RlOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGNvbWJpbmVfZGlmZl9wYXJlbnQgeworCQljaGFyIHN0YXR1czsKKwkJdW5zaWduZWQgaW50IG1vZGU7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJfSBwYXJlbnRbRkxFWF9BUlJBWV07Cit9OworI2RlZmluZSBjb21iaW5lX2RpZmZfcGF0aF9zaXplKG4sIGwpIFwKKwkoc2l6ZW9mKHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCkgKyBcCisJIHNpemVvZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhcmVudCkgKiAobikgKyAobCkgKyAxKQorCitleHRlcm4gdm9pZCBzaG93X2NvbWJpbmVkX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICplbGVtLCBpbnQgbnVtX3BhcmVudCwKKwkJCSAgICAgIGludCBkZW5zZSwgc3RydWN0IHJldl9pbmZvICopOworCitleHRlcm4gdm9pZCBkaWZmX3RyZWVfY29tYmluZWQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgdW5zaWduZWQgY2hhciBwYXJlbnRbXVsyMF0sIGludCBudW1fcGFyZW50LCBpbnQgZGVuc2UsIHN0cnVjdCByZXZfaW5mbyAqcmV2KTsKKworZXh0ZXJuIHZvaWQgZGlmZl90cmVlX2NvbWJpbmVkX21lcmdlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCwgc3RydWN0IHJldl9pbmZvICopOworCitleHRlcm4gdm9pZCBkaWZmX2FkZHJlbW92ZShzdHJ1Y3QgZGlmZl9vcHRpb25zICosCisJCQkgICBpbnQgYWRkcmVtb3ZlLAorCQkJICAgdW5zaWduZWQgbW9kZSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgICBjb25zdCBjaGFyICpiYXNlLAorCQkJICAgY29uc3QgY2hhciAqcGF0aCk7CisKK2V4dGVybiB2b2lkIGRpZmZfY2hhbmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwKKwkJCXVuc2lnbmVkIG1vZGUxLCB1bnNpZ25lZCBtb2RlMiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGEyLAorCQkJY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCk7CisKK2V4dGVybiB2b2lkIGRpZmZfdW5tZXJnZShzdHJ1Y3QgZGlmZl9vcHRpb25zICosCisJCQkgY29uc3QgY2hhciAqcGF0aCk7CisKK2V4dGVybiBpbnQgZGlmZl9zY29yZW9wdF9wYXJzZShjb25zdCBjaGFyICpvcHQpOworCisjZGVmaW5lIERJRkZfU0VUVVBfUkVWRVJTRSAgICAgIAkxCisjZGVmaW5lIERJRkZfU0VUVVBfVVNFX0NBQ0hFCQkyCisjZGVmaW5lIERJRkZfU0VUVVBfVVNFX1NJWkVfQ0FDSEUJNAorCitleHRlcm4gaW50IGdpdF9kaWZmX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGRpZmZfc2V0dXAoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKK2V4dGVybiBpbnQgZGlmZl9vcHRfcGFyc2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqLCBjb25zdCBjaGFyICoqLCBpbnQpOworZXh0ZXJuIGludCBkaWZmX3NldHVwX2RvbmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKKworI2RlZmluZSBESUZGX0RFVEVDVF9SRU5BTUUJMQorI2RlZmluZSBESUZGX0RFVEVDVF9DT1BZCTIKKworI2RlZmluZSBESUZGX1BJQ0tBWEVfQUxMCTEKKyNkZWZpbmUgRElGRl9QSUNLQVhFX1JFR0VYCTIKKworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfc3RkKHN0cnVjdCBkaWZmX29wdGlvbnMgKik7CisKK2V4dGVybiB2b2lkIGRpZmZjb3JlX3N0ZF9ub19yZXNvbHZlKHN0cnVjdCBkaWZmX29wdGlvbnMgKik7CisKKyNkZWZpbmUgQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQIFwKKyJcbmNvbW1vbiBkaWZmIG9wdGlvbnM6XG4iIFwKKyIgIC16ICAgICAgICAgICAgb3V0cHV0IGRpZmYtcmF3IHdpdGggbGluZXMgdGVybWluYXRlZCB3aXRoIE5VTC5cbiIgXAorIiAgLXAgICAgICAgICAgICBvdXRwdXQgcGF0Y2ggZm9ybWF0LlxuIiBcCisiICAtdSAgICAgICAgICAgIHN5bm9ueW0gZm9yIC1wLlxuIiBcCisiICAtLXBhdGNoLXdpdGgtcmF3XG4iIFwKKyIgICAgICAgICAgICAgICAgb3V0cHV0IGJvdGggYSBwYXRjaCBhbmQgdGhlIGRpZmYtcmF3IGZvcm1hdC5cbiIgXAorIiAgLS1zdGF0ICAgICAgICBzaG93IGRpZmZzdGF0IGluc3RlYWQgb2YgcGF0Y2guXG4iIFwKKyIgIC0tcGF0Y2gtd2l0aC1zdGF0XG4iIFwKKyIgICAgICAgICAgICAgICAgb3V0cHV0IGEgcGF0Y2ggYW5kIHByZXBlbmQgaXRzIGRpZmZzdGF0LlxuIiBcCisiICAtLW5hbWUtb25seSAgIHNob3cgb25seSBuYW1lcyBvZiBjaGFuZ2VkIGZpbGVzLlxuIiBcCisiICAtLW5hbWUtc3RhdHVzIHNob3cgbmFtZXMgYW5kIHN0YXR1cyBvZiBjaGFuZ2VkIGZpbGVzLlxuIiBcCisiICAtLWZ1bGwtaW5kZXggIHNob3cgZnVsbCBvYmplY3QgbmFtZSBvbiBpbmRleCBsaW5lcy5cbiIgXAorIiAgLS1hYmJyZXY9PG4+ICBhYmJyZXZpYXRlIG9iamVjdCBuYW1lcyBpbiBkaWZmLXRyZWUgaGVhZGVyIGFuZCBkaWZmLXJhdy5cbiIgXAorIiAgLVIgICAgICAgICAgICBzd2FwIGlucHV0IGZpbGUgcGFpcnMuXG4iIFwKKyIgIC1CICAgICAgICAgICAgZGV0ZWN0IGNvbXBsZXRlIHJld3JpdGVzLlxuIiBcCisiICAtTSAgICAgICAgICAgIGRldGVjdCByZW5hbWVzLlxuIiBcCisiICAtQyAgICAgICAgICAgIGRldGVjdCBjb3BpZXMuXG4iIFwKKyIgIC0tZmluZC1jb3BpZXMtaGFyZGVyXG4iIFwKKyIgICAgICAgICAgICAgICAgdHJ5IHVuY2hhbmdlZCBmaWxlcyBhcyBjYW5kaWRhdGUgZm9yIGNvcHkgZGV0ZWN0aW9uLlxuIiBcCisiICAtbDxuPiAgICAgICAgIGxpbWl0IHJlbmFtZSBhdHRlbXB0cyB1cCB0byA8bj4gcGF0aHMuXG4iIFwKKyIgIC1PPGZpbGU+ICAgICAgcmVvcmRlciBkaWZmcyBhY2NvcmRpbmcgdG8gdGhlIDxmaWxlPi5cbiIgXAorIiAgLVM8c3RyaW5nPiAgICBmaW5kIGZpbGVwYWlyIHdob3NlIG9ubHkgb25lIHNpZGUgY29udGFpbnMgdGhlIHN0cmluZy5cbiIgXAorIiAgLS1waWNrYXhlLWFsbFxuIiBcCisiICAgICAgICAgICAgICAgIHNob3cgYWxsIGZpbGVzIGRpZmYgd2hlbiAtUyBpcyB1c2VkIGFuZCBoaXQgaXMgZm91bmQuXG4iCisKK2V4dGVybiBpbnQgZGlmZl9xdWV1ZV9pc19lbXB0eSh2b2lkKTsKKworI2RlZmluZSBESUZGX0ZPUk1BVF9SQVcJCTEKKyNkZWZpbmUgRElGRl9GT1JNQVRfUEFUQ0gJMgorI2RlZmluZSBESUZGX0ZPUk1BVF9OT19PVVRQVVQJMworI2RlZmluZSBESUZGX0ZPUk1BVF9OQU1FCTQKKyNkZWZpbmUgRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMJNQorI2RlZmluZSBESUZGX0ZPUk1BVF9ESUZGU1RBVAk2CisjZGVmaW5lIERJRkZfRk9STUFUX0NIRUNLRElGRgk3CisKK2V4dGVybiB2b2lkIGRpZmZfZmx1c2goc3RydWN0IGRpZmZfb3B0aW9ucyopOworCisvKiBkaWZmLXJhdyBzdGF0dXMgbGV0dGVycyAqLworI2RlZmluZSBESUZGX1NUQVRVU19BRERFRAkJJ0EnCisjZGVmaW5lIERJRkZfU1RBVFVTX0NPUElFRAkJJ0MnCisjZGVmaW5lIERJRkZfU1RBVFVTX0RFTEVURUQJCSdEJworI2RlZmluZSBESUZGX1NUQVRVU19NT0RJRklFRAkJJ00nCisjZGVmaW5lIERJRkZfU1RBVFVTX1JFTkFNRUQJCSdSJworI2RlZmluZSBESUZGX1NUQVRVU19UWVBFX0NIQU5HRUQJJ1QnCisjZGVmaW5lIERJRkZfU1RBVFVTX1VOS05PV04JCSdYJworI2RlZmluZSBESUZGX1NUQVRVU19VTk1FUkdFRAkJJ1UnCisKKy8qIHRoZXNlIGFyZSBub3QgZGlmZi1yYXcgc3RhdHVzIGxldHRlcnMgcHJvcGVyLCBidXQgdXNlZCBieQorICogZGlmZmNvcmUtZmlsdGVyIGluc24gdG8gc3BlY2lmeSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucy4KKyAqLworI2RlZmluZSBESUZGX1NUQVRVU19GSUxURVJfQU9OCQknKicKKyNkZWZpbmUgRElGRl9TVEFUVVNfRklMVEVSX0JST0tFTgknQicKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRpZmZfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKK2V4dGVybiBpbnQgcnVuX2RpZmZfZmlsZXMoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgc2lsZW50X29uX3JlbW92ZWQpOworCitleHRlcm4gaW50IHJ1bl9kaWZmX2luZGV4KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IGNhY2hlZCk7CisKKyNlbmRpZiAvKiBESUZGX0ggKi8KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLWJyZWFrLmMgYi9kaWZmY29yZS1icmVhay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMGUxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1icmVhay5jCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorCitzdGF0aWMgaW50IHNob3VsZF9icmVhayhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3JjLAorCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKmRzdCwKKwkJCWludCBicmVha19zY29yZSwKKwkJCWludCAqbWVyZ2Vfc2NvcmVfcCkKK3sKKwkvKiBkc3QgaXMgcmVjb3JkZWQgYXMgYSBtb2RpZmljYXRpb24gb2Ygc3JjLiAgQXJlIHRoZXkgc28KKwkgKiBkaWZmZXJlbnQgdGhhdCB3ZSBhcmUgYmV0dGVyIG9mZiByZWNvcmRpbmcgdGhpcyBhcyBhIHBhaXIKKwkgKiBvZiBkZWxldGUgYW5kIGNyZWF0ZT8KKwkgKgorCSAqIFRoZXJlIGFyZSB0d28gY3JpdGVyaWEgdXNlZCBpbiB0aGlzIGFsZ29yaXRobS4gIEZvciB0aGUKKwkgKiBwdXJwb3NlcyBvZiBoZWxwaW5nIGxhdGVyIHJlbmFtZS9jb3B5LCB3ZSB0YWtlIGJvdGggZGVsZXRlCisJICogYW5kIGluc2VydCBpbnRvIGFjY291bnQgYW5kIGVzdGltYXRlIHRoZSBhbW91bnQgb2YgImVkaXQiLgorCSAqIElmIHRoZSBlZGl0IGlzIHZlcnkgbGFyZ2UsIHdlIGJyZWFrIHRoaXMgcGFpciBzbyB0aGF0CisJICogcmVuYW1lL2NvcHkgY2FuIHBpY2sgdGhlIHBpZWNlcyB1cCB0byBtYXRjaCB3aXRoIG90aGVyCisJICogZmlsZXMuCisJICoKKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgd2Ugd291bGQgd2FudCB0byBpZ25vcmUgaW5zZXJ0cyBmb3IgdGhlCisJICogcHVyZSAiY29tcGxldGUgcmV3cml0ZSIgZGV0ZWN0aW9uLiAgQXMgbG9uZyBhcyBtb3N0IG9mIHRoZQorCSAqIGV4aXN0aW5nIGNvbnRlbnRzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBmaWxlLCBpdCBpcyBhCisJICogY29tcGxldGUgcmV3cml0ZSwgYW5kIGlmIHNpemFibGUgY2h1bmsgZnJvbSB0aGUgb3JpZ2luYWwKKwkgKiBzdGlsbCByZW1haW5zIGluIHRoZSByZXN1bHQsIGl0IGlzIG5vdCBhIHJld3JpdGUuICBJdCBkb2VzCisJICogbm90IG1hdHRlciBob3cgbXVjaCBvciBob3cgbGl0dGxlIG5ldyBtYXRlcmlhbCBpcyBhZGRlZCB0bworCSAqIHRoZSBmaWxlLgorCSAqCisJICogVGhlIHNjb3JlIHdlIGxlYXZlIGZvciBzdWNoIGEgYnJva2VuIGZpbGVwYWlyIHVzZXMgdGhlCisJICogbGF0dGVyIGRlZmluaXRpb24gc28gdGhhdCBsYXRlciBjbGVhbi11cCBzdGFnZSBjYW4gZmluZCB0aGUKKwkgKiBwaWVjZXMgdGhhdCBzaG91bGQgbm90IGhhdmUgYmVlbiBicm9rZW4gYWNjb3JkaW5nIHRvIHRoZQorCSAqIGxhdHRlciBkZWZpbml0aW9uIGFmdGVyIHJlbmFtZS9jb3B5IHJ1bnMsIGFuZCBtZXJnZSB0aGUKKwkgKiBicm9rZW4gcGFpciB0aGF0IGhhdmUgYSBzY29yZSBsb3dlciB0aGFuIGdpdmVuIGNyaXRlcmlhCisJICogYmFjayB0b2dldGhlci4gIFRoZSBicmVhayBvcGVyYXRpb24gaXRzZWxmIGhhcHBlbnMKKwkgKiBhY2NvcmRpbmcgdG8gdGhlIGZvcm1lciBkZWZpbml0aW9uLgorCSAqCisJICogVGhlIG1pbmltdW1fZWRpdCBwYXJhbWV0ZXIgdGVsbHMgdXMgd2hlbiB0byBicmVhayAodGhlCisJICogYW1vdW50IG9mICJlZGl0IiByZXF1aXJlZCBmb3IgdXMgdG8gY29uc2lkZXIgYnJlYWtpbmcgdGhlCisJICogcGFpcikuICBXZSBsZWF2ZSB0aGUgYW1vdW50IG9mIGRlbGV0aW9uIGluICptZXJnZV9zY29yZV9wCisJICogd2hlbiB3ZSByZXR1cm4uCisJICoKKwkgKiBUaGUgdmFsdWUgd2UgcmV0dXJuIGlzIDEgaWYgd2Ugd2FudCB0aGUgcGFpciB0byBiZSBicm9rZW4sCisJICogb3IgMCBpZiB3ZSBkbyBub3QuCisJICovCisJdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplLCBiYXNlX3NpemUsIHNyY19jb3BpZWQsIGxpdGVyYWxfYWRkZWQsCisJCXNyY19yZW1vdmVkOworCisJKm1lcmdlX3Njb3JlX3AgPSAwOyAvKiBhc3N1bWUgbm8gZGVsZXRpb24gLS0tICJkbyBub3QgYnJlYWsiCisJCQkgICAgICogaXMgdGhlIGRlZmF1bHQuCisJCQkgICAgICovCisKKwlpZiAoIVNfSVNSRUcoc3JjLT5tb2RlKSB8fCAhU19JU1JFRyhkc3QtPm1vZGUpKQorCQlyZXR1cm4gMDsgLyogbGVhdmUgc3ltbGluayByZW5hbWUgYWxvbmUgKi8KKworCWlmIChzcmMtPnNoYTFfdmFsaWQgJiYgZHN0LT5zaGExX3ZhbGlkICYmCisJICAgICFtZW1jbXAoc3JjLT5zaGExLCBkc3QtPnNoYTEsIDIwKSkKKwkJcmV0dXJuIDA7IC8qIHRoZXkgYXJlIHRoZSBzYW1lICovCisKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzcmMsIDApIHx8IGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoZHN0LCAwKSkKKwkJcmV0dXJuIDA7IC8qIGVycm9yIGJ1dCBjYXVnaHQgZG93bnN0cmVhbSAqLworCisJYmFzZV9zaXplID0gKChzcmMtPnNpemUgPCBkc3QtPnNpemUpID8gc3JjLT5zaXplIDogZHN0LT5zaXplKTsKKwlpZiAoYmFzZV9zaXplIDwgTUlOSU1VTV9CUkVBS19TSVpFKQorCQlyZXR1cm4gMDsgLyogd2UgZG8gbm90IGJyZWFrIHRvbyBzbWFsbCBmaWxlcGFpciAqLworCisJaWYgKGRpZmZjb3JlX2NvdW50X2NoYW5nZXMoc3JjLT5kYXRhLCBzcmMtPnNpemUsCisJCQkJICAgZHN0LT5kYXRhLCBkc3QtPnNpemUsCisJCQkJICAgTlVMTCwgTlVMTCwKKwkJCQkgICAwLAorCQkJCSAgICZzcmNfY29waWVkLCAmbGl0ZXJhbF9hZGRlZCkpCisJCXJldHVybiAwOworCisJLyogc2FuaXR5ICovCisJaWYgKHNyYy0+c2l6ZSA8IHNyY19jb3BpZWQpCisJCXNyY19jb3BpZWQgPSBzcmMtPnNpemU7CisJaWYgKGRzdC0+c2l6ZSA8IGxpdGVyYWxfYWRkZWQgKyBzcmNfY29waWVkKSB7CisJCWlmIChzcmNfY29waWVkIDwgZHN0LT5zaXplKQorCQkJbGl0ZXJhbF9hZGRlZCA9IGRzdC0+c2l6ZSAtIHNyY19jb3BpZWQ7CisJCWVsc2UKKwkJCWxpdGVyYWxfYWRkZWQgPSAwOworCX0KKwlzcmNfcmVtb3ZlZCA9IHNyYy0+c2l6ZSAtIHNyY19jb3BpZWQ7CisKKwkvKiBDb21wdXRlIG1lcmdlLXNjb3JlLCB3aGljaCBpcyAiaG93IG11Y2ggaXMgcmVtb3ZlZAorCSAqIGZyb20gdGhlIHNvdXJjZSBtYXRlcmlhbCIuICBUaGUgY2xlYW4tdXAgc3RhZ2Ugd2lsbAorCSAqIG1lcmdlIHRoZSBzdXJ2aXZpbmcgcGFpciB0b2dldGhlciBpZiB0aGUgc2NvcmUgaXMKKwkgKiBsZXNzIHRoYW4gdGhlIG1pbmltdW0sIGFmdGVyIHJlbmFtZS9jb3B5IHJ1bnMuCisJICovCisJKm1lcmdlX3Njb3JlX3AgPSBzcmNfcmVtb3ZlZCAqIE1BWF9TQ09SRSAvIHNyYy0+c2l6ZTsKKworCS8qIEV4dGVudCBvZiBkYW1hZ2UsIHdoaWNoIGNvdW50cyBib3RoIGluc2VydHMgYW5kCisJICogZGVsZXRlcy4KKwkgKi8KKwlkZWx0YV9zaXplID0gc3JjX3JlbW92ZWQgKyBsaXRlcmFsX2FkZGVkOworCWlmIChkZWx0YV9zaXplICogTUFYX1NDT1JFIC8gYmFzZV9zaXplIDwgYnJlYWtfc2NvcmUpCisJCXJldHVybiAwOworCisJLyogSWYgeW91IHJlbW92ZWQgYSBsb3Qgd2l0aG91dCBhZGRpbmcgbmV3IG1hdGVyaWFsLCB0aGF0IGlzCisJICogbm90IHJlYWxseSBhIHJld3JpdGUuCisJICovCisJaWYgKChzcmMtPnNpemUgKiBicmVha19zY29yZSA8IHNyY19yZW1vdmVkICogTUFYX1NDT1JFKSAmJgorCSAgICAobGl0ZXJhbF9hZGRlZCAqIDIwIDwgc3JjX3JlbW92ZWQpICYmCisJICAgIChsaXRlcmFsX2FkZGVkICogMjAgPCBzcmNfY29waWVkKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkaWZmY29yZV9icmVhayhpbnQgYnJlYWtfc2NvcmUpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisKKwkvKiBXaGVuIHRoZSBmaWxlcGFpciBoYXMgdGhpcyBtdWNoIGVkaXQgKGluc2VydCBhbmQgZGVsZXRlKSwKKwkgKiBpdCBpcyBmaXJzdCBjb25zaWRlcmVkIHRvIGJlIGEgcmV3cml0ZSBhbmQgYnJva2VuIGludG8gYQorCSAqIGNyZWF0ZSBhbmQgZGVsZXRlIGZpbGVwYWlyLiAgVGhpcyBpcyB0byBoZWxwIGJyZWFraW5nIGEKKwkgKiBmaWxlIHRoYXQgaGFkIHRvbyBtdWNoIG5ldyBzdHVmZiBhZGRlZCwgcG9zc2libHkgZnJvbQorCSAqIG1vdmluZyBjb250ZW50cyBmcm9tIGFub3RoZXIgZmlsZSwgc28gdGhhdCByZW5hbWUvY29weSBjYW4KKwkgKiBtYXRjaCBpdCB3aXRoIHRoZSBvdGhlciBmaWxlLgorCSAqCisJICogaW50IGJyZWFrX3Njb3JlOyB3ZSByZXVzZSBpbmNvbWluZyBwYXJhbWV0ZXIgZm9yIHRoaXMuCisJICovCisKKwkvKiBBZnRlciBhIHBhaXIgaXMgYnJva2VuIGFjY29yZGluZyB0byBicmVha19zY29yZSBhbmQKKwkgKiBzdWJqZWN0ZWQgdG8gcmVuYW1lL2NvcHksIGJvdGggb2YgdGhlbSBtYXkgc3Vydml2ZSBpbnRhY3QsCisJICogZHVlIHRvIGxhY2sgb2Ygc3VpdGFibGUgcmVuYW1lL2NvcHkgcGVlci4gIE9yLCB0aGUgY2FsbGVyCisJICogbWF5IGJlIGNhbGxpbmcgdXMgd2l0aG91dCB1c2luZyByZW5hbWUvY29weS4gIFdoZW4gdGhhdAorCSAqIGhhcHBlbnMsIHdlIG1lcmdlIHRoZSBicm9rZW4gcGllY2VzIGJhY2sgaW50byBvbmUKKwkgKiBtb2RpZmljYXRpb24gdG9nZXRoZXIgaWYgdGhlIHBhaXIgZGlkIG5vdCBoYXZlIG1vcmUgdGhhbgorCSAqIHRoaXMgbXVjaCBkZWxldGUuICBGb3IgdGhpcyBjb21wdXRhdGlvbiwgd2UgZG8gbm90IHRha2UKKwkgKiBpbnNlcnQgaW50byBhY2NvdW50IGF0IGFsbC4gIElmIHlvdSBzdGFydCBmcm9tIGEgMTAwLWxpbmUKKwkgKiBmaWxlIGFuZCBkZWxldGUgOTcgbGluZXMgb2YgaXQsIGl0IGRvZXMgbm90IG1hdHRlciBpZiB5b3UKKwkgKiBhZGQgMjcgbGluZXMgdG8gaXQgdG8gbWFrZSBhIG5ldyAzMC1saW5lIGZpbGUgb3IgaWYgeW91IGFkZAorCSAqIDk5NyBsaW5lcyB0byBpdCB0byBtYWtlIGEgMTAwMC1saW5lIGZpbGUuICBFaXRoZXIgd2F5IHdoYXQKKwkgKiB5b3UgZGlkIHdhcyBhIHJld3JpdGUgb2YgOTclLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdQorCSAqIGRlbGV0ZSAzIGxpbmVzLCBrZWVwaW5nIDk3IGxpbmVzIGludGFjdCwgaXQgZG9lcyBub3QgbWF0dGVyCisJICogaWYgeW91IGFkZCAzIGxpbmVzIHRvIGl0IHRvIG1ha2UgYSBuZXcgMTAwLWxpbmUgZmlsZSBvciBpZgorCSAqIHlvdSBhZGQgOTAzIGxpbmVzIHRvIGl0IHRvIG1ha2UgYSBuZXcgMTAwMC1saW5lIGZpbGUuCisJICogRWl0aGVyIHdheSB5b3UgZGlkIGEgbG90IG9mIGFkZGl0aW9ucyBhbmQgbm90IGEgcmV3cml0ZS4KKwkgKiBUaGlzIG1lcmdlIGhhcHBlbnMgdG8gY2F0Y2ggdGhlIGxhdHRlciBjYXNlLiAgQSBtZXJnZV9zY29yZQorCSAqIG9mIDgwJSB3b3VsZCBiZSBhIGdvb2QgZGVmYXVsdCB2YWx1ZSAoYSBicm9rZW4gcGFpciB0aGF0CisJICogaGFzIHNjb3JlIGxvd2VyIHRoYW4gbWVyZ2Vfc2NvcmUgd2lsbCBiZSBtZXJnZWQgYmFjaworCSAqIHRvZ2V0aGVyKS4KKwkgKi8KKwlpbnQgbWVyZ2Vfc2NvcmU7CisJaW50IGk7CisKKwkvKiBTZWUgY29tbWVudCBvbiBERUZBVUxUX0JSRUFLX1NDT1JFIGFuZAorCSAqIERFRkFVTFRfTUVSR0VfU0NPUkUgaW4gZGlmZmNvcmUuaAorCSAqLworCW1lcmdlX3Njb3JlID0gKGJyZWFrX3Njb3JlID4+IDE2KSAmIDB4RkZGRjsKKwlicmVha19zY29yZSA9IChicmVha19zY29yZSAmIDB4RkZGRik7CisKKwlpZiAoIWJyZWFrX3Njb3JlKQorCQlicmVha19zY29yZSA9IERFRkFVTFRfQlJFQUtfU0NPUkU7CisJaWYgKCFtZXJnZV9zY29yZSkKKwkJbWVyZ2Vfc2NvcmUgPSBERUZBVUxUX01FUkdFX1NDT1JFOworCisJb3V0cS5uciA9IG91dHEuYWxsb2MgPSAwOworCW91dHEucXVldWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaW50IHNjb3JlOworCisJCS8qIFdlIGRlYWwgb25seSB3aXRoIGluLXBsYWNlIGVkaXQgb2Ygbm9uIGRpcmVjdG9yeS4KKwkJICogV2UgZG8gbm90IGJyZWFrIGFueXRoaW5nIGVsc2UuCisJCSAqLworCQlpZiAoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgRElGRl9GSUxFX1ZBTElEKHAtPnR3bykgJiYKKwkJICAgICFTX0lTRElSKHAtPm9uZS0+bW9kZSkgJiYgIVNfSVNESVIocC0+dHdvLT5tb2RlKSAmJgorCQkgICAgIXN0cmNtcChwLT5vbmUtPnBhdGgsIHAtPnR3by0+cGF0aCkpIHsKKwkJCWlmIChzaG91bGRfYnJlYWsocC0+b25lLCBwLT50d28sCisJCQkJCSBicmVha19zY29yZSwgJnNjb3JlKSkgeworCQkJCS8qIFNwbGl0IHRoaXMgaW50byBkZWxldGUgYW5kIGNyZWF0ZSAqLworCQkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpudWxsX29uZSwgKm51bGxfdHdvOworCQkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcDsKKworCQkJCS8qIFNldCBzY29yZSB0byAwIGZvciB0aGUgcGFpciB0aGF0CisJCQkJICogbmVlZHMgdG8gYmUgbWVyZ2VkIGJhY2sgdG9nZXRoZXIKKwkJCQkgKiBzaG91bGQgdGhleSBzdXJ2aXZlIHJlbmFtZS9jb3B5LgorCQkJCSAqIEFsc28gd2UgZG8gbm90IHdhbnQgdG8gYnJlYWsgdmVyeQorCQkJCSAqIHNtYWxsIGZpbGVzLgorCQkJCSAqLworCQkJCWlmIChzY29yZSA8IG1lcmdlX3Njb3JlKQorCQkJCQlzY29yZSA9IDA7CisKKwkJCQkvKiBkZWxldGlvbiBvZiBvbmUgKi8KKwkJCQludWxsX29uZSA9IGFsbG9jX2ZpbGVzcGVjKHAtPm9uZS0+cGF0aCk7CisJCQkJZHAgPSBkaWZmX3F1ZXVlKCZvdXRxLCBwLT5vbmUsIG51bGxfb25lKTsKKwkJCQlkcC0+c2NvcmUgPSBzY29yZTsKKwkJCQlkcC0+YnJva2VuX3BhaXIgPSAxOworCisJCQkJLyogY3JlYXRpb24gb2YgdHdvICovCisJCQkJbnVsbF90d28gPSBhbGxvY19maWxlc3BlYyhwLT50d28tPnBhdGgpOworCQkJCWRwID0gZGlmZl9xdWV1ZSgmb3V0cSwgbnVsbF90d28sIHAtPnR3byk7CisJCQkJZHAtPnNjb3JlID0gc2NvcmU7CisJCQkJZHAtPmJyb2tlbl9wYWlyID0gMTsKKworCQkJCWZyZWUocCk7IC8qIG5vdCBkaWZmX2ZyZWVfZmlsZXBhaXIoKSwgd2UgYXJlCisJCQkJCSAgKiByZXVzaW5nIG9uZSBhbmQgdHdvIGhlcmUuCisJCQkJCSAgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlkaWZmX3EoJm91dHEsIHApOworCX0KKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX2Jyb2tlbihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcHAsCisJCQkgc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpvdXRxKQoreworCS8qIHAgYW5kIHBwIGFyZSBicm9rZW4gcGFpcnMgd2Ugd2FudCB0byBtZXJnZSAqLworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpjID0gcCwgKmQgPSBwcCwgKmRwOworCWlmIChESUZGX0ZJTEVfVkFMSUQocC0+b25lKSkgeworCQkvKiB0aGlzIG11c3QgYmUgYSBkZWxldGUgaGFsZiAqLworCQlkID0gcDsgYyA9IHBwOworCX0KKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoIURJRkZfRklMRV9WQUxJRChkLT5vbmUpKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICMxIik7CisJaWYgKERJRkZfRklMRV9WQUxJRChkLT50d28pKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICMyIik7CisJaWYgKERJRkZfRklMRV9WQUxJRChjLT5vbmUpKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICMzIik7CisJaWYgKCFESUZGX0ZJTEVfVkFMSUQoYy0+dHdvKSkKKwkJZGllKCJpbnRlcm5hbCBlcnJvciBpbiBtZXJnZSAjNCIpOworCisJZHAgPSBkaWZmX3F1ZXVlKG91dHEsIGQtPm9uZSwgYy0+dHdvKTsKKwlkcC0+c2NvcmUgPSBwLT5zY29yZTsKKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShkLT50d28pOworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKGMtPm9uZSk7CisJZnJlZShkKTsKKwlmcmVlKGMpOworfQorCit2b2lkIGRpZmZjb3JlX21lcmdlX2Jyb2tlbih2b2lkKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCWludCBpLCBqOworCisJb3V0cS5uciA9IG91dHEuYWxsb2MgPSAwOworCW91dHEucXVldWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaWYgKCFwKQorCQkJLyogd2UgYWxyZWFkeSBtZXJnZWQgdGhpcyB3aXRoIGl0cyBwZWVyICovCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAocC0+YnJva2VuX3BhaXIgJiYKKwkJCSAhc3RyY21wKHAtPm9uZS0+cGF0aCwgcC0+dHdvLT5wYXRoKSkgeworCQkJLyogSWYgdGhlIHBlZXIgYWxzbyBzdXJ2aXZlZCByZW5hbWUvY29weSwgdGhlbgorCQkJICogd2UgbWVyZ2UgdGhlbSBiYWNrIHRvZ2V0aGVyLgorCQkJICovCisJCQlmb3IgKGogPSBpICsgMTsgaiA8IHEtPm5yOyBqKyspIHsKKwkJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcHAgPSBxLT5xdWV1ZVtqXTsKKwkJCQlpZiAocHAtPmJyb2tlbl9wYWlyICYmCisJCQkJICAgICFzdHJjbXAocHAtPm9uZS0+cGF0aCwgcHAtPnR3by0+cGF0aCkgJiYKKwkJCQkgICAgIXN0cmNtcChwLT5vbmUtPnBhdGgsIHBwLT50d28tPnBhdGgpKSB7CisJCQkJCS8qIFBlZXIgc3Vydml2ZWQuICBNZXJnZSB0aGVtICovCisJCQkJCW1lcmdlX2Jyb2tlbihwLCBwcCwgJm91dHEpOworCQkJCQlxLT5xdWV1ZVtqXSA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChxLT5uciA8PSBqKQorCQkJCS8qIFRoZSBwZWVyIGRpZCBub3Qgc3Vydml2ZSwgc28gd2Uga2VlcAorCQkJCSAqIGl0IGluIHRoZSBvdXRwdXQuCisJCQkJICovCisJCQkJZGlmZl9xKCZvdXRxLCBwKTsKKwkJfQorCQllbHNlCisJCQlkaWZmX3EoJm91dHEsIHApOworCX0KKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1kZWx0YS5jIGIvZGlmZmNvcmUtZGVsdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzM4YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUtZGVsdGEuYwpAQCAtMCwwICsxLDIxMyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisKKy8qCisgKiBJZGVhIGhlcmUgaXMgdmVyeSBzaW1wbGUuCisgKgorICogV2UgaGF2ZSB0b3RhbCBvZiAoc3otTisxKSBOLWJ5dGUgb3ZlcmxhcHBpbmcgc2VxdWVuY2VzIGluIGJ1ZiB3aG9zZQorICogc2l6ZSBpcyBzei4gIElmIHRoZSBzYW1lIE4tYnl0ZSBzZXF1ZW5jZSBhcHBlYXJzIGluIGJvdGggc291cmNlIGFuZAorICogZGVzdGluYXRpb24sIHdlIHNheSB0aGUgYnl0ZSB0aGF0IHN0YXJ0cyB0aGF0IHNlcXVlbmNlIGlzIHNoYXJlZAorICogYmV0d2VlbiB0aGVtIChpLmUuIGNvcGllZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbikuCisgKgorICogRm9yIGVhY2ggcG9zc2libGUgTi1ieXRlIHNlcXVlbmNlLCBpZiB0aGUgc291cmNlIGJ1ZmZlciBoYXMgbW9yZQorICogaW5zdGFuY2VzIG9mIGl0IHRoYW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgdGhhdCBtZWFucyB0aGUKKyAqIGRpZmZlcmVuY2UgYXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgbm90IGNvcGllZCBmcm9tIHNvdXJjZSB0bworICogZGVzdGluYXRpb24uICBJZiB0aGUgY291bnRzIGFyZSB0aGUgc2FtZSwgZXZlcnl0aGluZyB3YXMgY29waWVkCisgKiBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4gIElmIHRoZSBkZXN0aW5hdGlvbiBoYXMgbW9yZSwKKyAqIGV2ZXJ5dGhpbmcgd2FzIGNvcGllZCwgYW5kIGRlc3RpbmF0aW9uIGFkZGVkIG1vcmUuCisgKgorICogV2UgYXJlIGRvaW5nIGFuIGFwcHJveGltYXRpb24gc28gd2UgZG8gbm90IHJlYWxseSBoYXZlIHRvIHdhc3RlCisgKiBtZW1vcnkgYnkgYWN0dWFsbHkgc3RvcmluZyB0aGUgc2VxdWVuY2UuICBXZSBqdXN0IGhhc2ggdGhlbSBpbnRvCisgKiBzb21ld2hlcmUgYXJvdW5kIDJeMTYgaGFzaGJ1Y2tldHMgYW5kIGNvdW50IHRoZSBvY2N1cnJlbmNlcy4KKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBpcyBhcmJpdHJhcmlseSBzZXQgdG8gOCBmb3Igbm93LgorICovCisKKy8qIFdpbGQgZ3Vlc3MgYXQgdGhlIGluaXRpYWwgaGFzaCBzaXplICovCisjZGVmaW5lIElOSVRJQUxfSEFTSF9TSVpFIDkKKworLyogV2UgbGVhdmUgbW9yZSByb29tIGluIHNtYWxsZXIgaGFzaCBidXQgZG8gbm90IGxldCBpdAorICogZ3JvdyB0byBoYXZlIHVudXNlZCBob2xlIHRvbyBtdWNoLgorICovCisjZGVmaW5lIElOSVRJQUxfRlJFRShzel9sb2cyKSAoKDE8PChzel9sb2cyKSkqKHN6X2xvZzItMykvKHN6X2xvZzIpKQorCisvKiBBIHByaW1lIHJhdGhlciBjYXJlZnVsbHkgY2hvc2VuIGJldHdlZW4gMl4xNi4uMl4xNywgc28gdGhhdAorICogSEFTSEJBU0UgPCBJTklUSUFMX0ZSRUUoMTcpLiAgV2Ugd2FudCB0byBrZWVwIHRoZSBtYXhpbXVtIGhhc2h0YWJsZQorICogc2l6ZSB1bmRlciB0aGUgY3VycmVudCAyPDwxNyBtYXhpbXVtLCB3aGljaCBjYW4gaG9sZCB0aGlzIG1hbnkKKyAqIGRpZmZlcmVudCB2YWx1ZXMgYmVmb3JlIG92ZXJmbG93aW5nIHRvIGhhc2h0YWJsZSBvZiBzaXplIDI8PDE4LgorICovCisjZGVmaW5lIEhBU0hCQVNFIDEwNzkyNworCitzdHJ1Y3Qgc3Bhbmhhc2ggeworCXVuc2lnbmVkIGludCBoYXNodmFsOworCXVuc2lnbmVkIGludCBjbnQ7Cit9Oworc3RydWN0IHNwYW5oYXNoX3RvcCB7CisJaW50IGFsbG9jX2xvZzI7CisJaW50IGZyZWU7CisJc3RydWN0IHNwYW5oYXNoIGRhdGFbRkxFWF9BUlJBWV07Cit9OworCitzdGF0aWMgc3RydWN0IHNwYW5oYXNoICpzcGFuaGFzaF9maW5kKHN0cnVjdCBzcGFuaGFzaF90b3AgKnRvcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgaGFzaHZhbCkKK3sKKwlpbnQgc3ogPSAxIDw8IHRvcC0+YWxsb2NfbG9nMjsKKwlpbnQgYnVja2V0ID0gaGFzaHZhbCAmIChzeiAtIDEpOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBzcGFuaGFzaCAqaCA9ICYodG9wLT5kYXRhW2J1Y2tldCsrXSk7CisJCWlmICghaC0+Y250KQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChoLT5oYXNodmFsID09IGhhc2h2YWwpCisJCQlyZXR1cm4gaDsKKwkJaWYgKHN6IDw9IGJ1Y2tldCkKKwkJCWJ1Y2tldCA9IDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNwYW5oYXNoX3RvcCAqc3Bhbmhhc2hfcmVoYXNoKHN0cnVjdCBzcGFuaGFzaF90b3AgKm9yaWcpCit7CisJc3RydWN0IHNwYW5oYXNoX3RvcCAqbmV3OworCWludCBpOworCWludCBvc3ogPSAxIDw8IG9yaWctPmFsbG9jX2xvZzI7CisJaW50IHN6ID0gb3N6IDw8IDE7CisKKwluZXcgPSB4bWFsbG9jKHNpemVvZigqb3JpZykgKyBzaXplb2Yoc3RydWN0IHNwYW5oYXNoKSAqIHN6KTsKKwluZXctPmFsbG9jX2xvZzIgPSBvcmlnLT5hbGxvY19sb2cyICsgMTsKKwluZXctPmZyZWUgPSBJTklUSUFMX0ZSRUUobmV3LT5hbGxvY19sb2cyKTsKKwltZW1zZXQobmV3LT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHNwYW5oYXNoKSAqIHN6KTsKKwlmb3IgKGkgPSAwOyBpIDwgb3N6OyBpKyspIHsKKwkJc3RydWN0IHNwYW5oYXNoICpvID0gJihvcmlnLT5kYXRhW2ldKTsKKwkJaW50IGJ1Y2tldDsKKwkJaWYgKCFvLT5jbnQpCisJCQljb250aW51ZTsKKwkJYnVja2V0ID0gby0+aGFzaHZhbCAmIChzeiAtIDEpOworCQl3aGlsZSAoMSkgeworCQkJc3RydWN0IHNwYW5oYXNoICpoID0gJihuZXctPmRhdGFbYnVja2V0KytdKTsKKwkJCWlmICghaC0+Y250KSB7CisJCQkJaC0+aGFzaHZhbCA9IG8tPmhhc2h2YWw7CisJCQkJaC0+Y250ID0gby0+Y250OworCQkJCW5ldy0+ZnJlZS0tOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN6IDw9IGJ1Y2tldCkKKwkJCQlidWNrZXQgPSAwOworCQl9CisJfQorCWZyZWUob3JpZyk7CisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIHN0cnVjdCBzcGFuaGFzaF90b3AgKmFkZF9zcGFuaGFzaChzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICp0b3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgaGFzaHZhbCwgaW50IGNudCkKK3sKKwlpbnQgYnVja2V0LCBsaW07CisJc3RydWN0IHNwYW5oYXNoICpoOworCisJbGltID0gKDEgPDwgdG9wLT5hbGxvY19sb2cyKTsKKwlidWNrZXQgPSBoYXNodmFsICYgKGxpbSAtIDEpOworCXdoaWxlICgxKSB7CisJCWggPSAmKHRvcC0+ZGF0YVtidWNrZXQrK10pOworCQlpZiAoIWgtPmNudCkgeworCQkJaC0+aGFzaHZhbCA9IGhhc2h2YWw7CisJCQloLT5jbnQgPSBjbnQ7CisJCQl0b3AtPmZyZWUtLTsKKwkJCWlmICh0b3AtPmZyZWUgPCAwKQorCQkJCXJldHVybiBzcGFuaGFzaF9yZWhhc2godG9wKTsKKwkJCXJldHVybiB0b3A7CisJCX0KKwkJaWYgKGgtPmhhc2h2YWwgPT0gaGFzaHZhbCkgeworCQkJaC0+Y250ICs9IGNudDsKKwkJCXJldHVybiB0b3A7CisJCX0KKwkJaWYgKGxpbSA8PSBidWNrZXQpCisJCQlidWNrZXQgPSAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzcGFuaGFzaF90b3AgKmhhc2hfY2hhcnModW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgc3opCit7CisJaW50IGksIG47CisJdW5zaWduZWQgaW50IGFjY3VtMSwgYWNjdW0yLCBoYXNodmFsOworCXN0cnVjdCBzcGFuaGFzaF90b3AgKmhhc2g7CisKKwlpID0gSU5JVElBTF9IQVNIX1NJWkU7CisJaGFzaCA9IHhtYWxsb2Moc2l6ZW9mKCpoYXNoKSArIHNpemVvZihzdHJ1Y3Qgc3Bhbmhhc2gpICogKDE8PGkpKTsKKwloYXNoLT5hbGxvY19sb2cyID0gaTsKKwloYXNoLT5mcmVlID0gSU5JVElBTF9GUkVFKGkpOworCW1lbXNldChoYXNoLT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHNwYW5oYXNoKSAqICgxPDxpKSk7CisKKwluID0gMDsKKwlhY2N1bTEgPSBhY2N1bTIgPSAwOworCXdoaWxlIChzeikgeworCQl1bnNpZ25lZCBpbnQgYyA9ICpidWYrKzsKKwkJdW5zaWduZWQgaW50IG9sZF8xID0gYWNjdW0xOworCQlzei0tOworCQlhY2N1bTEgPSAoYWNjdW0xIDw8IDcpIF4gKGFjY3VtMiA+PiAyNSk7CisJCWFjY3VtMiA9IChhY2N1bTIgPDwgNykgXiAob2xkXzEgPj4gMjUpOworCQlhY2N1bTEgKz0gYzsKKwkJaWYgKCsrbiA8IDY0ICYmIGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQloYXNodmFsID0gKGFjY3VtMSArIGFjY3VtMiAqIDB4NjEpICUgSEFTSEJBU0U7CisJCWhhc2ggPSBhZGRfc3Bhbmhhc2goaGFzaCwgaGFzaHZhbCwgbik7CisJCW4gPSAwOworCQlhY2N1bTEgPSBhY2N1bTIgPSAwOworCX0KKwlyZXR1cm4gaGFzaDsKK30KKworaW50IGRpZmZjb3JlX2NvdW50X2NoYW5nZXModm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIHNyY19zaXplLAorCQkJICAgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGRzdF9zaXplLAorCQkJICAgdm9pZCAqKnNyY19jb3VudF9wLAorCQkJICAgdm9pZCAqKmRzdF9jb3VudF9wLAorCQkJICAgdW5zaWduZWQgbG9uZyBkZWx0YV9saW1pdCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKnNyY19jb3BpZWQsCisJCQkgICB1bnNpZ25lZCBsb25nICpsaXRlcmFsX2FkZGVkKQoreworCWludCBpLCBzc3o7CisJc3RydWN0IHNwYW5oYXNoX3RvcCAqc3JjX2NvdW50LCAqZHN0X2NvdW50OworCXVuc2lnbmVkIGxvbmcgc2MsIGxhOworCisJc3JjX2NvdW50ID0gZHN0X2NvdW50ID0gTlVMTDsKKwlpZiAoc3JjX2NvdW50X3ApCisJCXNyY19jb3VudCA9ICpzcmNfY291bnRfcDsKKwlpZiAoIXNyY19jb3VudCkgeworCQlzcmNfY291bnQgPSBoYXNoX2NoYXJzKHNyYywgc3JjX3NpemUpOworCQlpZiAoc3JjX2NvdW50X3ApCisJCQkqc3JjX2NvdW50X3AgPSBzcmNfY291bnQ7CisJfQorCWlmIChkc3RfY291bnRfcCkKKwkJZHN0X2NvdW50ID0gKmRzdF9jb3VudF9wOworCWlmICghZHN0X2NvdW50KSB7CisJCWRzdF9jb3VudCA9IGhhc2hfY2hhcnMoZHN0LCBkc3Rfc2l6ZSk7CisJCWlmIChkc3RfY291bnRfcCkKKwkJCSpkc3RfY291bnRfcCA9IGRzdF9jb3VudDsKKwl9CisJc2MgPSBsYSA9IDA7CisKKwlzc3ogPSAxIDw8IHNyY19jb3VudC0+YWxsb2NfbG9nMjsKKwlmb3IgKGkgPSAwOyBpIDwgc3N6OyBpKyspIHsKKwkJc3RydWN0IHNwYW5oYXNoICpzID0gJihzcmNfY291bnQtPmRhdGFbaV0pOworCQlzdHJ1Y3Qgc3Bhbmhhc2ggKmQ7CisJCXVuc2lnbmVkIGRzdF9jbnQsIHNyY19jbnQ7CisJCWlmICghcy0+Y250KQorCQkJY29udGludWU7CisJCXNyY19jbnQgPSBzLT5jbnQ7CisJCWQgPSBzcGFuaGFzaF9maW5kKGRzdF9jb3VudCwgcy0+aGFzaHZhbCk7CisJCWRzdF9jbnQgPSBkID8gZC0+Y250IDogMDsKKwkJaWYgKHNyY19jbnQgPCBkc3RfY250KSB7CisJCQlsYSArPSBkc3RfY250IC0gc3JjX2NudDsKKwkJCXNjICs9IHNyY19jbnQ7CisJCX0KKwkJZWxzZQorCQkJc2MgKz0gZHN0X2NudDsKKwl9CisKKwlpZiAoIXNyY19jb3VudF9wKQorCQlmcmVlKHNyY19jb3VudCk7CisJaWYgKCFkc3RfY291bnRfcCkKKwkJZnJlZShkc3RfY291bnQpOworCSpzcmNfY29waWVkID0gc2M7CisJKmxpdGVyYWxfYWRkZWQgPSBsYTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLW9yZGVyLmMgYi9kaWZmY29yZS1vcmRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzJiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1vcmRlci5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKworc3RhdGljIGNoYXIgKipvcmRlcjsKK3N0YXRpYyBpbnQgb3JkZXJfY250OworCitzdGF0aWMgdm9pZCBwcmVwYXJlX29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyZmlsZSkKK3sKKwlpbnQgZmQsIGNudCwgcGFzczsKKwl2b2lkICptYXA7CisJY2hhciAqY3AsICplbmRwOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKG9yZGVyKQorCQlyZXR1cm47CisKKwlmZCA9IG9wZW4ob3JkZXJmaWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCWlmIChmc3RhdChmZCwgJnN0KSkgeworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJbWFwID0gbW1hcChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm47CisJZW5kcCA9IG1hcCArIHN0LnN0X3NpemU7CisJZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykgeworCQljbnQgPSAwOworCQljcCA9IG1hcDsKKwkJd2hpbGUgKGNwIDwgZW5kcCkgeworCQkJY2hhciAqZXA7CisJCQlmb3IgKGVwID0gY3A7IGVwIDwgZW5kcCAmJiAqZXAgIT0gJ1xuJzsgZXArKykKKwkJCQk7CisJCQkvKiBjcCB0byBlcCBoYXMgb25lIGxpbmUgKi8KKwkJCWlmICgqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJyMnKQorCQkJCTsgLyogY29tbWVudCAqLworCQkJZWxzZSBpZiAocGFzcyA9PSAwKQorCQkJCWNudCsrOworCQkJZWxzZSB7CisJCQkJaWYgKCplcCA9PSAnXG4nKSB7CisJCQkJCSplcCA9IDA7CisJCQkJCW9yZGVyW2NudF0gPSBjcDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW9yZGVyW2NudF0gPSB4bWFsbG9jKGVwLWNwKzEpOworCQkJCQltZW1jcHkob3JkZXJbY250XSwgY3AsIGVwLWNwKTsKKwkJCQkJb3JkZXJbY250XVtlcC1jcF0gPSAwOworCQkJCX0KKwkJCQljbnQrKzsKKwkJCX0KKwkJCWlmIChlcCA8IGVuZHApCisJCQkJZXArKzsKKwkJCWNwID0gZXA7CisJCX0KKwkJaWYgKHBhc3MgPT0gMCkgeworCQkJb3JkZXJfY250ID0gY250OworCQkJb3JkZXIgPSB4bWFsbG9jKHNpemVvZigqb3JkZXIpICogY250KTsKKwkJfQorCX0KK30KKworc3RydWN0IHBhaXJfb3JkZXIgeworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwYWlyOworCWludCBvcmlnX29yZGVyOworCWludCBvcmRlcjsKK307CisKK3N0YXRpYyBpbnQgbWF0Y2hfb3JkZXIoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgaTsKKwljaGFyIHBbUEFUSF9NQVhdOworCisJZm9yIChpID0gMDsgaSA8IG9yZGVyX2NudDsgaSsrKSB7CisJCXN0cmNweShwLCBwYXRoKTsKKwkJd2hpbGUgKHBbMF0pIHsKKwkJCWNoYXIgKmNwOworCQkJaWYgKCFmbm1hdGNoKG9yZGVyW2ldLCBwLCAwKSkKKwkJCQlyZXR1cm4gaTsKKwkJCWNwID0gc3RycmNocihwLCAnLycpOworCQkJaWYgKCFjcCkKKwkJCQlicmVhazsKKwkJCSpjcCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIG9yZGVyX2NudDsKK30KKworc3RhdGljIGludCBjb21wYXJlX3BhaXJfb3JkZXIoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCBwYWlyX29yZGVyIGNvbnN0ICphLCAqYjsKKwlhID0gKHN0cnVjdCBwYWlyX29yZGVyIGNvbnN0ICopYV87CisJYiA9IChzdHJ1Y3QgcGFpcl9vcmRlciBjb25zdCAqKWJfOworCWlmIChhLT5vcmRlciAhPSBiLT5vcmRlcikKKwkJcmV0dXJuIGEtPm9yZGVyIC0gYi0+b3JkZXI7CisJcmV0dXJuIGEtPm9yaWdfb3JkZXIgLSBiLT5vcmlnX29yZGVyOworfQorCit2b2lkIGRpZmZjb3JlX29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyZmlsZSkKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlzdHJ1Y3QgcGFpcl9vcmRlciAqbzsKKwlpbnQgaTsKKworCWlmICghcS0+bnIpCisJCXJldHVybjsKKworCW8gPSB4bWFsbG9jKHNpemVvZigqbykgKiBxLT5ucik7CisJcHJlcGFyZV9vcmRlcihvcmRlcmZpbGUpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCW9baV0ucGFpciA9IHEtPnF1ZXVlW2ldOworCQlvW2ldLm9yaWdfb3JkZXIgPSBpOworCQlvW2ldLm9yZGVyID0gbWF0Y2hfb3JkZXIob1tpXS5wYWlyLT50d28tPnBhdGgpOworCX0KKwlxc29ydChvLCBxLT5uciwgc2l6ZW9mKCpvKSwgY29tcGFyZV9wYWlyX29yZGVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJcS0+cXVldWVbaV0gPSBvW2ldLnBhaXI7CisJZnJlZShvKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1waWNrYXhlLmMgYi9kaWZmY29yZS1waWNrYXhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjY2UzMQotLS0gL2Rldi9udWxsCisrKyBiL2RpZmZjb3JlLXBpY2theGUuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworI2luY2x1ZGUgPHJlZ2V4Lmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29udGFpbnMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCSAgICAgY29uc3QgY2hhciAqbmVlZGxlLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCSAgICAgcmVnZXhfdCAqcmVnZXhwKQoreworCXVuc2lnbmVkIGludCBjbnQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHN6OworCWNvbnN0IGNoYXIgKmRhdGE7CisJaWYgKGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMob25lLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlzeiA9IG9uZS0+c2l6ZTsKKwlkYXRhID0gb25lLT5kYXRhOworCWNudCA9IDA7CisKKwlpZiAocmVnZXhwKSB7CisJCXJlZ21hdGNoX3QgcmVnbWF0Y2g7CisJCWludCBmbGFncyA9IDA7CisKKwkJd2hpbGUgKCpkYXRhICYmICFyZWdleGVjKHJlZ2V4cCwgZGF0YSwgMSwgJnJlZ21hdGNoLCBmbGFncykpIHsKKwkJCWZsYWdzIHw9IFJFR19OT1RCT0w7CisJCQlkYXRhICs9IHJlZ21hdGNoLnJtX3NvOworCQkJaWYgKCpkYXRhKSBkYXRhKys7CisJCQljbnQrKzsKKwkJfQorCisJfSBlbHNlIHsgLyogQ2xhc3NpYyBleGFjdCBzdHJpbmcgbWF0Y2ggKi8KKwkJLyogWWVzLCBJJ3ZlIGhlYXJkIG9mIHN0cnN0cigpLCBidXQgdGhlIHRoaW5nIGlzICpkYXRhIG1heQorCQkgKiBub3QgYmUgTlVMIHRlcm1pbmF0ZWQuICBTdWUgbWUuCisJCSAqLworCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCArIGxlbiA8PSBzejsgb2Zmc2V0KyspIHsKKwkJCS8qIHdlIGNvdW50IG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBuZWVkbGUgKi8KKwkJCWlmICghbWVtY21wKG5lZWRsZSwgZGF0YSArIG9mZnNldCwgbGVuKSkgeworCQkJCW9mZnNldCArPSBsZW4gLSAxOworCQkJCWNudCsrOworCQkJfQorCQl9CisJfQorCXJldHVybiBjbnQ7Cit9CisKK3ZvaWQgZGlmZmNvcmVfcGlja2F4ZShjb25zdCBjaGFyICpuZWVkbGUsIGludCBvcHRzKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuKG5lZWRsZSk7CisJaW50IGksIGhhc19jaGFuZ2VzOworCXJlZ2V4X3QgcmVnZXgsICpyZWdleHAgPSBOVUxMOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCW91dHEucXVldWUgPSBOVUxMOworCW91dHEubnIgPSBvdXRxLmFsbG9jID0gMDsKKworCWlmIChvcHRzICYgRElGRl9QSUNLQVhFX1JFR0VYKSB7CisJCWludCBlcnI7CisJCWVyciA9IHJlZ2NvbXAoJnJlZ2V4LCBuZWVkbGUsIFJFR19FWFRFTkRFRCB8IFJFR19ORVdMSU5FKTsKKwkJaWYgKGVycikgeworCQkJLyogVGhlIFBPU0lYLjIgcGVvcGxlIGFyZSBzdXJlbHkgc2ljayAqLworCQkJY2hhciBlcnJidWZbMTAyNF07CisJCQlyZWdlcnJvcihlcnIsICZyZWdleCwgZXJyYnVmLCAxMDI0KTsKKwkJCXJlZ2ZyZWUoJnJlZ2V4KTsKKwkJCWRpZSgiaW52YWxpZCBwaWNrYXhlIHJlZ2V4OiAlcyIsIGVycmJ1Zik7CisJCX0KKwkJcmVnZXhwID0gJnJlZ2V4OworCX0KKworCWlmIChvcHRzICYgRElGRl9QSUNLQVhFX0FMTCkgeworCQkvKiBTaG93aW5nIHRoZSB3aG9sZSBjaGFuZ2VzZXQgaWYgbmVlZGxlIGV4aXN0cyAqLworCQlmb3IgKGkgPSBoYXNfY2hhbmdlcyA9IDA7ICFoYXNfY2hhbmdlcyAmJiBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpIHsKKwkJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJCQljb250aW51ZTsgLyogaWdub3JlIHVubWVyZ2VkICovCisJCQkJLyogY3JlYXRlZCAqLworCQkJCWlmIChjb250YWlucyhwLT50d28sIG5lZWRsZSwgbGVuLCByZWdleHApKQorCQkJCQloYXNfY2hhbmdlcysrOworCQkJfQorCQkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkJaWYgKGNvbnRhaW5zKHAtPm9uZSwgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJCWhhc19jaGFuZ2VzKys7CisJCQl9CisJCQllbHNlIGlmICghZGlmZl91bm1vZGlmaWVkX3BhaXIocCkgJiYKKwkJCQkgY29udGFpbnMocC0+b25lLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSAhPQorCQkJCSBjb250YWlucyhwLT50d28sIG5lZWRsZSwgbGVuLCByZWdleHApKQorCQkJCWhhc19jaGFuZ2VzKys7CisJCX0KKwkJaWYgKGhhc19jaGFuZ2VzKQorCQkJcmV0dXJuOyAvKiBub3QgbXVuZ2UgdGhlIHF1ZXVlICovCisKKwkJLyogb3RoZXJ3aXNlIHdlIHdpbGwgY2xlYXIgdGhlIHdob2xlIHF1ZXVlCisJCSAqIGJ5IGNvcHlpbmcgdGhlIGVtcHR5IG91dHEgYXQgdGhlIGVuZCBvZiB0aGlzCisJCSAqIGZ1bmN0aW9uLCBidXQgZmlyc3QgY2xlYXIgdGhlIGN1cnJlbnQgZW50cmllcworCQkgKiBpbiB0aGUgcXVldWUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJCWRpZmZfZnJlZV9maWxlcGFpcihxLT5xdWV1ZVtpXSk7CisJfQorCWVsc2UgCisJCS8qIFNob3dpbmcgb25seSB0aGUgZmlsZXBhaXJzIHRoYXQgaGFzIHRoZSBuZWVkbGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCQloYXNfY2hhbmdlcyA9IDA7CisJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT5vbmUpKSB7CisJCQkJaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSkKKwkJCQkJOyAvKiBpZ25vcmUgdW5tZXJnZWQgKi8KKwkJCQkvKiBjcmVhdGVkICovCisJCQkJZWxzZSBpZiAoY29udGFpbnMocC0+dHdvLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQkJaGFzX2NoYW5nZXMgPSAxOworCQkJfQorCQkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkJaWYgKGNvbnRhaW5zKHAtPm9uZSwgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJCWhhc19jaGFuZ2VzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFkaWZmX3VubW9kaWZpZWRfcGFpcihwKSAmJgorCQkJCSBjb250YWlucyhwLT5vbmUsIG5lZWRsZSwgbGVuLCByZWdleHApICE9CisJCQkJIGNvbnRhaW5zKHAtPnR3bywgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJaGFzX2NoYW5nZXMgPSAxOworCisJCQlpZiAoaGFzX2NoYW5nZXMpCisJCQkJZGlmZl9xKCZvdXRxLCBwKTsKKwkJCWVsc2UKKwkJCQlkaWZmX2ZyZWVfZmlsZXBhaXIocCk7CisJCX0KKworCWlmIChvcHRzICYgRElGRl9QSUNLQVhFX1JFR0VYKSB7CisJCXJlZ2ZyZWUoJnJlZ2V4KTsKKwl9CisKKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZGlmZmNvcmUtcmVuYW1lLmMgYi9kaWZmY29yZS1yZW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTdlODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUtcmVuYW1lLmMKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisKKy8qIFRhYmxlIG9mIHJlbmFtZS9jb3B5IGRlc3RpbmF0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IGRpZmZfcmVuYW1lX2RzdCB7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bzsKKwlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcGFpcjsKK30gKnJlbmFtZV9kc3Q7CitzdGF0aWMgaW50IHJlbmFtZV9kc3RfbnIsIHJlbmFtZV9kc3RfYWxsb2M7CisKK3N0YXRpYyBzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpsb2NhdGVfcmVuYW1lX2RzdChzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJCQkJIGludCBpbnNlcnRfb2spCit7CisJaW50IGZpcnN0LCBsYXN0OworCisJZmlyc3QgPSAwOworCWxhc3QgPSByZW5hbWVfZHN0X25yOworCXdoaWxlIChsYXN0ID4gZmlyc3QpIHsKKwkJaW50IG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPSAmKHJlbmFtZV9kc3RbbmV4dF0pOworCQlpbnQgY21wID0gc3RyY21wKHR3by0+cGF0aCwgZHN0LT50d28tPnBhdGgpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBkc3Q7CisJCWlmIChjbXAgPCAwKSB7CisJCQlsYXN0ID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZpcnN0ID0gbmV4dCsxOworCX0KKwkvKiBub3QgZm91bmQgKi8KKwlpZiAoIWluc2VydF9vaykKKwkJcmV0dXJuIE5VTEw7CisJLyogaW5zZXJ0IHRvIG1ha2UgaXQgYXQgImZpcnN0IiAqLworCWlmIChyZW5hbWVfZHN0X2FsbG9jIDw9IHJlbmFtZV9kc3RfbnIpIHsKKwkJcmVuYW1lX2RzdF9hbGxvYyA9IGFsbG9jX25yKHJlbmFtZV9kc3RfYWxsb2MpOworCQlyZW5hbWVfZHN0ID0geHJlYWxsb2MocmVuYW1lX2RzdCwKKwkJCQkgICAgICByZW5hbWVfZHN0X2FsbG9jICogc2l6ZW9mKCpyZW5hbWVfZHN0KSk7CisJfQorCXJlbmFtZV9kc3RfbnIrKzsKKwlpZiAoZmlyc3QgPCByZW5hbWVfZHN0X25yKQorCQltZW1tb3ZlKHJlbmFtZV9kc3QgKyBmaXJzdCArIDEsIHJlbmFtZV9kc3QgKyBmaXJzdCwKKwkJCShyZW5hbWVfZHN0X25yIC0gZmlyc3QgLSAxKSAqIHNpemVvZigqcmVuYW1lX2RzdCkpOworCXJlbmFtZV9kc3RbZmlyc3RdLnR3byA9IGFsbG9jX2ZpbGVzcGVjKHR3by0+cGF0aCk7CisJZmlsbF9maWxlc3BlYyhyZW5hbWVfZHN0W2ZpcnN0XS50d28sIHR3by0+c2hhMSwgdHdvLT5tb2RlKTsKKwlyZW5hbWVfZHN0W2ZpcnN0XS5wYWlyID0gTlVMTDsKKwlyZXR1cm4gJihyZW5hbWVfZHN0W2ZpcnN0XSk7Cit9CisKKy8qIFRhYmxlIG9mIHJlbmFtZS9jb3B5IHNyYyBmaWxlcyAqLworc3RhdGljIHN0cnVjdCBkaWZmX3JlbmFtZV9zcmMgeworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmU7CisJdW5zaWduZWQgc2hvcnQgc2NvcmU7IC8qIHRvIHJlbWVtYmVyIHRoZSBicmVhayBzY29yZSAqLworCXVuc2lnbmVkIHNyY19wYXRoX2xlZnQgOiAxOworfSAqcmVuYW1lX3NyYzsKK3N0YXRpYyBpbnQgcmVuYW1lX3NyY19uciwgcmVuYW1lX3NyY19hbGxvYzsKKworc3RhdGljIHN0cnVjdCBkaWZmX3JlbmFtZV9zcmMgKnJlZ2lzdGVyX3JlbmFtZV9zcmMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCQkJCSAgIGludCBzcmNfcGF0aF9sZWZ0LAorCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgc2NvcmUpCit7CisJaW50IGZpcnN0LCBsYXN0OworCisJZmlyc3QgPSAwOworCWxhc3QgPSByZW5hbWVfc3JjX25yOworCXdoaWxlIChsYXN0ID4gZmlyc3QpIHsKKwkJaW50IG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfc3JjICpzcmMgPSAmKHJlbmFtZV9zcmNbbmV4dF0pOworCQlpbnQgY21wID0gc3RyY21wKG9uZS0+cGF0aCwgc3JjLT5vbmUtPnBhdGgpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBzcmM7CisJCWlmIChjbXAgPCAwKSB7CisJCQlsYXN0ID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZpcnN0ID0gbmV4dCsxOworCX0KKworCS8qIGluc2VydCB0byBtYWtlIGl0IGF0ICJmaXJzdCIgKi8KKwlpZiAocmVuYW1lX3NyY19hbGxvYyA8PSByZW5hbWVfc3JjX25yKSB7CisJCXJlbmFtZV9zcmNfYWxsb2MgPSBhbGxvY19ucihyZW5hbWVfc3JjX2FsbG9jKTsKKwkJcmVuYW1lX3NyYyA9IHhyZWFsbG9jKHJlbmFtZV9zcmMsCisJCQkJICAgICAgcmVuYW1lX3NyY19hbGxvYyAqIHNpemVvZigqcmVuYW1lX3NyYykpOworCX0KKwlyZW5hbWVfc3JjX25yKys7CisJaWYgKGZpcnN0IDwgcmVuYW1lX3NyY19ucikKKwkJbWVtbW92ZShyZW5hbWVfc3JjICsgZmlyc3QgKyAxLCByZW5hbWVfc3JjICsgZmlyc3QsCisJCQkocmVuYW1lX3NyY19uciAtIGZpcnN0IC0gMSkgKiBzaXplb2YoKnJlbmFtZV9zcmMpKTsKKwlyZW5hbWVfc3JjW2ZpcnN0XS5vbmUgPSBvbmU7CisJcmVuYW1lX3NyY1tmaXJzdF0uc2NvcmUgPSBzY29yZTsKKwlyZW5hbWVfc3JjW2ZpcnN0XS5zcmNfcGF0aF9sZWZ0ID0gc3JjX3BhdGhfbGVmdDsKKwlyZXR1cm4gJihyZW5hbWVfc3JjW2ZpcnN0XSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfZXhhY3RfbWF0Y2goc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNyYywgc3RydWN0IGRpZmZfZmlsZXNwZWMgKmRzdCkKK3sKKwlpZiAoc3JjLT5zaGExX3ZhbGlkICYmIGRzdC0+c2hhMV92YWxpZCAmJgorCSAgICAhbWVtY21wKHNyYy0+c2hhMSwgZHN0LT5zaGExLCAyMCkpCisJCXJldHVybiAxOworCWlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHNyYywgMSkgfHwgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhkc3QsIDEpKQorCQlyZXR1cm4gMDsKKwlpZiAoc3JjLT5zaXplICE9IGRzdC0+c2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoc3JjLCAwKSB8fCBkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKGRzdCwgMCkpCisJCXJldHVybiAwOworCWlmIChzcmMtPnNpemUgPT0gZHN0LT5zaXplICYmCisJICAgICFtZW1jbXAoc3JjLT5kYXRhLCBkc3QtPmRhdGEsIHNyYy0+c2l6ZSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGlmZl9zY29yZSB7CisJaW50IHNyYzsgLyogaW5kZXggaW4gcmVuYW1lX3NyYyAqLworCWludCBkc3Q7IC8qIGluZGV4IGluIHJlbmFtZV9kc3QgKi8KKwlpbnQgc2NvcmU7Cit9OworCitzdGF0aWMgaW50IGVzdGltYXRlX3NpbWlsYXJpdHkoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNyYywKKwkJCSAgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJICAgICAgIGludCBtaW5pbXVtX3Njb3JlKQoreworCS8qIHNyYyBwb2ludHMgYXQgYSBmaWxlIHRoYXQgZXhpc3RlZCBpbiB0aGUgb3JpZ2luYWwgdHJlZSAob3IKKwkgKiBvcHRpb25hbGx5IGEgZmlsZSBpbiB0aGUgZGVzdGluYXRpb24gdHJlZSkgYW5kIGRzdCBwb2ludHMKKwkgKiBhdCBhIG5ld2x5IGNyZWF0ZWQgZmlsZS4gIFRoZXkgbWF5IGJlIHF1aXRlIHNpbWlsYXIsIGluIHdoaWNoCisJICogY2FzZSB3ZSB3YW50IHRvIHNheSBzcmMgaXMgcmVuYW1lZCB0byBkc3Qgb3Igc3JjIGlzIGNvcGllZCBpbnRvCisJICogZHN0LCBhbmQgdGhlbiBzb21lIGVkaXQgaGFzIGJlZW4gYXBwbGllZCB0byBkc3QuCisJICoKKwkgKiBDb21wYXJlIHRoZW0gYW5kIHJldHVybiBob3cgc2ltaWxhciB0aGV5IGFyZSwgcmVwcmVzZW50aW5nCisJICogdGhlIHNjb3JlIGFzIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCBNQVhfU0NPUkUuCisJICoKKwkgKiBXaGVuIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLCBpdCBpcyBjb25zaWRlcmVkIGEgYmV0dGVyCisJICogbWF0Y2ggdGhhbiBhbnl0aGluZyBlbHNlOyB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QgZXZlbgorCSAqIGNhbGwgaW50byB0aGlzIGZ1bmN0aW9uIGluIHRoYXQgY2FzZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG1heF9zaXplLCBkZWx0YV9zaXplLCBiYXNlX3NpemUsIHNyY19jb3BpZWQsIGxpdGVyYWxfYWRkZWQ7CisJdW5zaWduZWQgbG9uZyBkZWx0YV9saW1pdDsKKwlpbnQgc2NvcmU7CisKKwkvKiBXZSBkZWFsIG9ubHkgd2l0aCByZWd1bGFyIGZpbGVzLiAgU3ltbGluayByZW5hbWVzIGFyZSBoYW5kbGVkCisJICogb25seSB3aGVuIHRoZXkgYXJlIGV4YWN0IG1hdGNoZXMgLS0tIGluIG90aGVyIHdvcmRzLCBubyBlZGl0cworCSAqIGFmdGVyIHJlbmFtaW5nLgorCSAqLworCWlmICghU19JU1JFRyhzcmMtPm1vZGUpIHx8ICFTX0lTUkVHKGRzdC0+bW9kZSkpCisJCXJldHVybiAwOworCisJbWF4X3NpemUgPSAoKHNyYy0+c2l6ZSA+IGRzdC0+c2l6ZSkgPyBzcmMtPnNpemUgOiBkc3QtPnNpemUpOworCWJhc2Vfc2l6ZSA9ICgoc3JjLT5zaXplIDwgZHN0LT5zaXplKSA/IHNyYy0+c2l6ZSA6IGRzdC0+c2l6ZSk7CisJZGVsdGFfc2l6ZSA9IG1heF9zaXplIC0gYmFzZV9zaXplOworCisJLyogV2Ugd291bGQgbm90IGNvbnNpZGVyIGVkaXRzIHRoYXQgY2hhbmdlIHRoZSBmaWxlIHNpemUgc28KKwkgKiBkcmFzdGljYWxseS4gIGRlbHRhX3NpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4KKwkgKiAoTUFYX1NDT1JFLW1pbmltdW1fc2NvcmUpL01BWF9TQ09SRSAqIG1pbihzcmMtPnNpemUsIGRzdC0+c2l6ZSkuCisJICoKKwkgKiBOb3RlIHRoYXQgYmFzZV9zaXplID09IDAgY2FzZSBpcyBoYW5kbGVkIGhlcmUgYWxyZWFkeQorCSAqIGFuZCB0aGUgZmluYWwgc2NvcmUgY29tcHV0YXRpb24gYmVsb3cgd291bGQgbm90IGhhdmUgYQorCSAqIGRpdmlkZS1ieS16ZXJvIGlzc3VlLgorCSAqLworCWlmIChiYXNlX3NpemUgKiAoTUFYX1NDT1JFLW1pbmltdW1fc2NvcmUpIDwgZGVsdGFfc2l6ZSAqIE1BWF9TQ09SRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzcmMsIDApIHx8IGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoZHN0LCAwKSkKKwkJcmV0dXJuIDA7IC8qIGVycm9yIGJ1dCBjYXVnaHQgZG93bnN0cmVhbSAqLworCisKKwlkZWx0YV9saW1pdCA9IGJhc2Vfc2l6ZSAqIChNQVhfU0NPUkUtbWluaW11bV9zY29yZSkgLyBNQVhfU0NPUkU7CisJaWYgKGRpZmZjb3JlX2NvdW50X2NoYW5nZXMoc3JjLT5kYXRhLCBzcmMtPnNpemUsCisJCQkJICAgZHN0LT5kYXRhLCBkc3QtPnNpemUsCisJCQkJICAgJnNyYy0+Y250X2RhdGEsICZkc3QtPmNudF9kYXRhLAorCQkJCSAgIGRlbHRhX2xpbWl0LAorCQkJCSAgICZzcmNfY29waWVkLCAmbGl0ZXJhbF9hZGRlZCkpCisJCXJldHVybiAwOworCisJLyogSG93IHNpbWlsYXIgYXJlIHRoZXk/CisJICogd2hhdCBwZXJjZW50YWdlIG9mIG1hdGVyaWFsIGluIGRzdCBhcmUgZnJvbSBzb3VyY2U/CisJICovCisJaWYgKCFkc3QtPnNpemUpCisJCXNjb3JlID0gMDsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwllbHNlCisJCXNjb3JlID0gc3JjX2NvcGllZCAqIE1BWF9TQ09SRSAvIG1heF9zaXplOworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIHZvaWQgcmVjb3JkX3JlbmFtZV9wYWlyKGludCBkc3RfaW5kZXgsIGludCBzcmNfaW5kZXgsIGludCBzY29yZSkKK3sKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvLCAqc3JjLCAqZHN0OworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcDsKKworCWlmIChyZW5hbWVfZHN0W2RzdF9pbmRleF0ucGFpcikKKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogZHN0IGFscmVhZHkgbWF0Y2hlZC4iKTsKKworCXNyYyA9IHJlbmFtZV9zcmNbc3JjX2luZGV4XS5vbmU7CisJb25lID0gYWxsb2NfZmlsZXNwZWMoc3JjLT5wYXRoKTsKKwlmaWxsX2ZpbGVzcGVjKG9uZSwgc3JjLT5zaGExLCBzcmMtPm1vZGUpOworCisJZHN0ID0gcmVuYW1lX2RzdFtkc3RfaW5kZXhdLnR3bzsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhkc3QtPnBhdGgpOworCWZpbGxfZmlsZXNwZWModHdvLCBkc3QtPnNoYTEsIGRzdC0+bW9kZSk7CisKKwlkcCA9IGRpZmZfcXVldWUoTlVMTCwgb25lLCB0d28pOworCWlmICghc3RyY21wKHNyYy0+cGF0aCwgZHN0LT5wYXRoKSkKKwkJZHAtPnNjb3JlID0gcmVuYW1lX3NyY1tzcmNfaW5kZXhdLnNjb3JlOworCWVsc2UKKwkJZHAtPnNjb3JlID0gc2NvcmU7CisJZHAtPnNvdXJjZV9zdGF5cyA9IHJlbmFtZV9zcmNbc3JjX2luZGV4XS5zcmNfcGF0aF9sZWZ0OworCXJlbmFtZV9kc3RbZHN0X2luZGV4XS5wYWlyID0gZHA7Cit9CisKKy8qCisgKiBXZSBzb3J0IHRoZSByZW5hbWUgc2ltaWxhcml0eSBtYXRyaXggd2l0aCB0aGUgc2NvcmUsIGluIGRlc2NlbmRpbmcKKyAqIG9yZGVyICh0aGUgbW9zdCBzaW1pbGFyIGZpcnN0KS4KKyAqLworc3RhdGljIGludCBzY29yZV9jb21wYXJlKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwljb25zdCBzdHJ1Y3QgZGlmZl9zY29yZSAqYSA9IGFfLCAqYiA9IGJfOworCXJldHVybiBiLT5zY29yZSAtIGEtPnNjb3JlOworfQorCitzdGF0aWMgaW50IGNvbXB1dGVfc3RheXMoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaWYgKHN0cmNtcChvbmUtPnBhdGgsIHAtPnR3by0+cGF0aCkpCisJCQljb250aW51ZTsKKwkJaWYgKERJRkZfUEFJUl9SRU5BTUUocCkpIHsKKwkJCXJldHVybiAwOyAvKiBzb21ldGhpbmcgZWxzZSBpcyByZW5hbWVkIGludG8gdGhpcyAqLworCQl9CisJfQorCXJldHVybiAxOworfQorCit2b2lkIGRpZmZjb3JlX3JlbmFtZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWludCBkZXRlY3RfcmVuYW1lID0gb3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZTsKKwlpbnQgbWluaW11bV9zY29yZSA9IG9wdGlvbnMtPnJlbmFtZV9zY29yZTsKKwlpbnQgcmVuYW1lX2xpbWl0ID0gb3B0aW9ucy0+cmVuYW1lX2xpbWl0OworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCXN0cnVjdCBkaWZmX3Njb3JlICpteDsKKwlpbnQgaSwgaiwgcmVuYW1lX2NvdW50OworCWludCBudW1fY3JlYXRlLCBudW1fc3JjLCBkc3RfY250OworCisJaWYgKCFtaW5pbXVtX3Njb3JlKQorCQltaW5pbXVtX3Njb3JlID0gREVGQVVMVF9SRU5BTUVfU0NPUkU7CisJcmVuYW1lX2NvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpCisJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJCWNvbnRpbnVlOyAvKiB1bm1lcmdlZCAqLworCQkJZWxzZQorCQkJCWxvY2F0ZV9yZW5hbWVfZHN0KHAtPnR3bywgMSk7CisJCWVsc2UgaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSkgeworCQkJLyogSWYgdGhlIHNvdXJjZSBpcyBhIGJyb2tlbiAiZGVsZXRlIiwgYW5kCisJCQkgKiB0aGV5IGRpZCBub3QgcmVhbGx5IHdhbnQgdG8gZ2V0IGJyb2tlbiwKKwkJCSAqIHRoYXQgbWVhbnMgdGhlIHNvdXJjZSBhY3R1YWxseSBzdGF5cy4KKwkJCSAqLworCQkJaW50IHN0YXlzID0gKHAtPmJyb2tlbl9wYWlyICYmICFwLT5zY29yZSk7CisJCQlyZWdpc3Rlcl9yZW5hbWVfc3JjKHAtPm9uZSwgc3RheXMsIHAtPnNjb3JlKTsKKwkJfQorCQllbHNlIGlmIChkZXRlY3RfcmVuYW1lID09IERJRkZfREVURUNUX0NPUFkpCisJCQlyZWdpc3Rlcl9yZW5hbWVfc3JjKHAtPm9uZSwgMSwgcC0+c2NvcmUpOworCX0KKwlpZiAocmVuYW1lX2RzdF9uciA9PSAwIHx8IHJlbmFtZV9zcmNfbnIgPT0gMCB8fAorCSAgICAoMCA8IHJlbmFtZV9saW1pdCAmJiByZW5hbWVfbGltaXQgPCByZW5hbWVfZHN0X25yKSkKKwkJZ290byBjbGVhbnVwOyAvKiBub3RoaW5nIHRvIGRvICovCisKKwkvKiBXZSByZWFsbHkgd2FudCB0byBjdWxsIHRoZSBjYW5kaWRhdGVzIGxpc3QgZWFybHkKKwkgKiB3aXRoIGNoZWFwIHRlc3RzIGluIG9yZGVyIHRvIGF2b2lkIGRvaW5nIGRlbHRhcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVuYW1lX2RzdF9ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28gPSByZW5hbWVfZHN0W2ldLnR3bzsKKwkJZm9yIChqID0gMDsgaiA8IHJlbmFtZV9zcmNfbnI7IGorKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSA9IHJlbmFtZV9zcmNbal0ub25lOworCQkJaWYgKCFpc19leGFjdF9tYXRjaChvbmUsIHR3bykpCisJCQkJY29udGludWU7CisJCQlyZWNvcmRfcmVuYW1lX3BhaXIoaSwgaiwgTUFYX1NDT1JFKTsKKwkJCXJlbmFtZV9jb3VudCsrOworCQkJYnJlYWs7IC8qIHdlIGFyZSBkb25lIHdpdGggdGhpcyBlbnRyeSAqLworCQl9CisJfQorCisJLyogSGF2ZSB3ZSBydW4gb3V0IHRoZSBjcmVhdGVkIGZpbGUgcG9vbD8gIElmIHNvIHdlIGNhbiBhdm9pZAorCSAqIGRvaW5nIHRoZSBkZWx0YSBtYXRyaXggYWx0b2dldGhlci4KKwkgKi8KKwlpZiAocmVuYW1lX2NvdW50ID09IHJlbmFtZV9kc3RfbnIpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChtaW5pbXVtX3Njb3JlID09IE1BWF9TQ09SRSkKKwkJZ290byBjbGVhbnVwOworCisJbnVtX2NyZWF0ZSA9IChyZW5hbWVfZHN0X25yIC0gcmVuYW1lX2NvdW50KTsKKwludW1fc3JjID0gcmVuYW1lX3NyY19ucjsKKwlteCA9IHhtYWxsb2Moc2l6ZW9mKCpteCkgKiBudW1fY3JlYXRlICogbnVtX3NyYyk7CisJZm9yIChkc3RfY250ID0gaSA9IDA7IGkgPCByZW5hbWVfZHN0X25yOyBpKyspIHsKKwkJaW50IGJhc2UgPSBkc3RfY250ICogbnVtX3NyYzsKKwkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3byA9IHJlbmFtZV9kc3RbaV0udHdvOworCQlpZiAocmVuYW1lX2RzdFtpXS5wYWlyKQorCQkJY29udGludWU7IC8qIGRlYWx0IHdpdGggZXhhY3QgbWF0Y2ggYWxyZWFkeS4gKi8KKwkJZm9yIChqID0gMDsgaiA8IHJlbmFtZV9zcmNfbnI7IGorKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSA9IHJlbmFtZV9zcmNbal0ub25lOworCQkJc3RydWN0IGRpZmZfc2NvcmUgKm0gPSAmbXhbYmFzZStqXTsKKwkJCW0tPnNyYyA9IGo7CisJCQltLT5kc3QgPSBpOworCQkJbS0+c2NvcmUgPSBlc3RpbWF0ZV9zaW1pbGFyaXR5KG9uZSwgdHdvLAorCQkJCQkJICAgICAgIG1pbmltdW1fc2NvcmUpOworCQl9CisJCS8qIFdlIGRvIG5vdCBuZWVkIHRoZSB0ZXh0IGFueW1vcmUgKi8KKwkJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEodHdvKTsKKwkJZHN0X2NudCsrOworCX0KKwkvKiBjb3N0IG1hdHJpeCBzb3J0ZWQgYnkgbW9zdCB0byBsZWFzdCBzaW1pbGFyIHBhaXIgKi8KKwlxc29ydChteCwgbnVtX2NyZWF0ZSAqIG51bV9zcmMsIHNpemVvZigqbXgpLCBzY29yZV9jb21wYXJlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NyZWF0ZSAqIG51bV9zcmM7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPSAmcmVuYW1lX2RzdFtteFtpXS5kc3RdOworCQlpZiAoZHN0LT5wYWlyKQorCQkJY29udGludWU7IC8qIGFscmVhZHkgZG9uZSwgZWl0aGVyIGV4YWN0IG9yIGZ1enp5LiAqLworCQlpZiAobXhbaV0uc2NvcmUgPCBtaW5pbXVtX3Njb3JlKQorCQkJYnJlYWs7IC8qIHRoZXJlIGlzIG5vIG1vcmUgdXNhYmxlIHBhaXIuICovCisJCXJlY29yZF9yZW5hbWVfcGFpcihteFtpXS5kc3QsIG14W2ldLnNyYywgbXhbaV0uc2NvcmUpOworCQlyZW5hbWVfY291bnQrKzsKKwl9CisJZnJlZShteCk7CisKKyBjbGVhbnVwOgorCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgZm91bmQgc29tZSByZW5hbWVzIGFuZCBjb3BpZXMgYW5kIHRoZXkKKwkgKiBhcmUgcmVjb3JkZWQgaW4gcmVuYW1lX2RzdC4gIFRoZSBvcmlnaW5hbCBsaXN0IGlzIHN0aWxsIGluICpxLgorCSAqLworCW91dHEucXVldWUgPSBOVUxMOworCW91dHEubnIgPSBvdXRxLmFsbG9jID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcGFpcl90b19mcmVlID0gTlVMTDsKKworCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIERJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkvKgorCQkJICogQ3JlYXRpb24KKwkJCSAqCisJCQkgKiBXZSB3b3VsZCBvdXRwdXQgdGhpcyBjcmVhdGUgcmVjb3JkIGlmIGl0IGhhcworCQkJICogbm90IGJlZW4gdHVybmVkIGludG8gYSByZW5hbWUvY29weSBhbHJlYWR5LgorCQkJICovCisJCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPQorCQkJCWxvY2F0ZV9yZW5hbWVfZHN0KHAtPnR3bywgMCk7CisJCQlpZiAoZHN0ICYmIGRzdC0+cGFpcikgeworCQkJCWRpZmZfcSgmb3V0cSwgZHN0LT5wYWlyKTsKKwkJCQlwYWlyX3RvX2ZyZWUgPSBwOworCQkJfQorCQkJZWxzZQorCQkJCS8qIG5vIG1hdGNoaW5nIHJlbmFtZS9jb3B5IHNvdXJjZSwgc28KKwkJCQkgKiByZWNvcmQgdGhpcyBhcyBhIGNyZWF0aW9uLgorCQkJCSAqLworCQkJCWRpZmZfcSgmb3V0cSwgcCk7CisJCX0KKwkJZWxzZSBpZiAoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkvKgorCQkJICogRGVsZXRpb24KKwkJCSAqCisJCQkgKiBXZSB3b3VsZCBvdXRwdXQgdGhpcyBkZWxldGUgcmVjb3JkIGlmOgorCQkJICoKKwkJCSAqICgxKSB0aGlzIGlzIGEgYnJva2VuIGRlbGV0ZSBhbmQgdGhlIGNvdW50ZXJwYXJ0CisJCQkgKiAgICAgYnJva2VuIGNyZWF0ZSByZW1haW5zIGluIHRoZSBvdXRwdXQ7IG9yCisJCQkgKiAoMikgdGhpcyBpcyBub3QgYSBicm9rZW4gZGVsZXRlLCBhbmQgcmVuYW1lX2RzdAorCQkJICogICAgIGRvZXMgbm90IGhhdmUgYSByZW5hbWUvY29weSB0byBtb3ZlIHAtPm9uZS0+cGF0aAorCQkJICogICAgIG91dCBvZiBleGlzdGVuY2UuCisJCQkgKgorCQkJICogT3RoZXJ3aXNlLCB0aGUgY291bnRlcnBhcnQgYnJva2VuIGNyZWF0ZQorCQkJICogaGFzIGJlZW4gdHVybmVkIGludG8gYSByZW5hbWUtZWRpdDsgb3IKKwkJCSAqIGRlbGV0ZSBkaWQgbm90IGhhdmUgYSBtYXRjaGluZyBjcmVhdGUgdG8KKwkJCSAqIGJlZ2luIHdpdGguCisJCQkgKi8KKwkJCWlmIChESUZGX1BBSVJfQlJPS0VOKHApKSB7CisJCQkJLyogYnJva2VuIGRlbGV0ZSAqLworCQkJCXN0cnVjdCBkaWZmX3JlbmFtZV9kc3QgKmRzdCA9CisJCQkJCWxvY2F0ZV9yZW5hbWVfZHN0KHAtPm9uZSwgMCk7CisJCQkJaWYgKGRzdCAmJiBkc3QtPnBhaXIpCisJCQkJCS8qIGNvdW50ZXJwYXJ0IGlzIG5vdyByZW5hbWUvY29weSAqLworCQkJCQlwYWlyX3RvX2ZyZWUgPSBwOworCQkJfQorCQkJZWxzZSB7CisJCQkJZm9yIChqID0gMDsgaiA8IHJlbmFtZV9kc3RfbnI7IGorKykgeworCQkJCQlpZiAoIXJlbmFtZV9kc3Rbal0ucGFpcikKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoc3RyY21wKHJlbmFtZV9kc3Rbal0ucGFpci0+CisJCQkJCQkgICBvbmUtPnBhdGgsCisJCQkJCQkgICBwLT5vbmUtPnBhdGgpKQorCQkJCQkJY29udGludWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoaiA8IHJlbmFtZV9kc3RfbnIpCisJCQkJCS8qIHRoaXMgcGF0aCByZW1haW5zICovCisJCQkJCXBhaXJfdG9fZnJlZSA9IHA7CisJCQl9CisKKwkJCWlmIChwYWlyX3RvX2ZyZWUpCisJCQkJOworCQkJZWxzZQorCQkJCWRpZmZfcSgmb3V0cSwgcCk7CisJCX0KKwkJZWxzZSBpZiAoIWRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQkJLyogYWxsIHRoZSB1c3VhbCBvbmVzIG5lZWQgdG8gYmUga2VwdCAqLworCQkJZGlmZl9xKCZvdXRxLCBwKTsKKwkJZWxzZQorCQkJLyogbm8gbmVlZCB0byBrZWVwIHVubW9kaWZpZWQgcGFpcnMgKi8KKwkJCXBhaXJfdG9fZnJlZSA9IHA7CisKKwkJaWYgKHBhaXJfdG9fZnJlZSkKKwkJCWRpZmZfZnJlZV9maWxlcGFpcihwYWlyX3RvX2ZyZWUpOworCX0KKwlkaWZmX2RlYnVnX3F1ZXVlKCJkb25lIGNvcHlpbmcgb3JpZ2luYWwiLCAmb3V0cSk7CisKKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7CisJZGlmZl9kZWJ1Z19xdWV1ZSgiZG9uZSBjb2xsYXBzaW5nIiwgcSk7CisKKwkvKiBXZSBuZWVkIHRvIHNlZSB3aGljaCByZW5hbWUgc291cmNlIHJlYWxseSBzdGF5cyBoZXJlOworCSAqIGVhcmxpZXIgd2Ugb25seSBjaGVja2VkIGlmIHRoZSBwYXRoIGlzIGxlZnQgaW4gdGhlIHJlc3VsdCwKKwkgKiBidXQgZXZlbiBpZiBhIHBhdGggcmVtYWlucyBpbiB0aGUgcmVzdWx0LCBpZiB0aGF0IGlzIGNvbWluZworCSAqIGZyb20gY29weWluZyBzb21ldGhpbmcgZWxzZSBvbiB0b3Agb2YgaXQsIHRoZW4gdGhlIG9yaWdpbmFsCisJICogc291cmNlIGlzIGxvc3QgYW5kIGRvZXMgbm90IHN0YXkuCisJICovCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaWYgKERJRkZfUEFJUl9SRU5BTUUocCkgJiYgcC0+c291cmNlX3N0YXlzKSB7CisJCQkvKiBJZiBvbmUgYXBwZWFycyBhcyB0aGUgdGFyZ2V0IG9mIGEgcmVuYW1lLWNvcHksCisJCQkgKiB0aGVuIG1hcmsgcC0+c291cmNlX3N0YXlzID0gMDsgb3RoZXJ3aXNlCisJCQkgKiBsZWF2ZSBpdCBhcyBpcy4KKwkJCSAqLworCQkJcC0+c291cmNlX3N0YXlzID0gY29tcHV0ZV9zdGF5cyhxLCBwLT5vbmUpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJlbmFtZV9kc3RfbnI7IGkrKykgeworCQlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShyZW5hbWVfZHN0W2ldLnR3byk7CisJCWZyZWUocmVuYW1lX2RzdFtpXS50d28pOworCX0KKworCWZyZWUocmVuYW1lX2RzdCk7CisJcmVuYW1lX2RzdCA9IE5VTEw7CisJcmVuYW1lX2RzdF9uciA9IHJlbmFtZV9kc3RfYWxsb2MgPSAwOworCWZyZWUocmVuYW1lX3NyYyk7CisJcmVuYW1lX3NyYyA9IE5VTEw7CisJcmVuYW1lX3NyY19uciA9IHJlbmFtZV9zcmNfYWxsb2MgPSAwOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLmggYi9kaWZmY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzc4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpZm5kZWYgX0RJRkZDT1JFX0hfCisjZGVmaW5lIF9ESUZGQ09SRV9IXworCisvKiBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVybmFsIGJldHdlZW4gZGlmZi5jIGFuZCBpdHMgZGlmZiB0cmFuc2Zvcm1lcnMKKyAqIChlLmcuIGRpZmZjb3JlLXJlbmFtZSwgZGlmZmNvcmUtcGlja2F4ZSkuICBOZXZlciBpbmNsdWRlIHRoaXMgaGVhZGVyCisgKiBpbiBhbnl0aGluZyBlbHNlLgorICovCisKKy8qIFdlIGludGVybmFsbHkgdXNlIHVuc2lnbmVkIHNob3J0IGFzIHRoZSBzY29yZSB2YWx1ZSwKKyAqIGFuZCByZWx5IG9uIGFuIGludCBjYXBhYmxlIHRvIGhvbGQgMzItYml0cy4gIC1CIGNhbiB0YWtlCisgKiAtQm1lcmdlX3Njb3JlL2JyZWFrX3Njb3JlIGZvcm1hdCBhbmQgdGhlIHR3byBzY29yZXMgYXJlCisgKiBwYXNzZWQgYXJvdW5kIGluIG9uZSBpbnQgKGhpZ2ggMTYtYml0IGZvciBtZXJnZSBhbmQgbG93IDE2LWJpdAorICogZm9yIGJyZWFrKS4KKyAqLworI2RlZmluZSBNQVhfU0NPUkUgNjAwMDAuMAorI2RlZmluZSBERUZBVUxUX1JFTkFNRV9TQ09SRSAzMDAwMCAvKiByZW5hbWUvY29weSBzaW1pbGFyaXR5IG1pbmltdW0gKDUwJSkgKi8KKyNkZWZpbmUgREVGQVVMVF9CUkVBS19TQ09SRSAgMzAwMDAgLyogbWluaW11bSBmb3IgYnJlYWsgdG8gaGFwcGVuICg1MCUpICovCisjZGVmaW5lIERFRkFVTFRfTUVSR0VfU0NPUkUgIDM2MDAwIC8qIG1heGltdW0gZm9yIGJyZWFrLW1lcmdlIHRvIGhhcHBlbiA2MCUpICovCisKKyNkZWZpbmUgTUlOSU1VTV9CUkVBS19TSVpFICAgICA0MDAgLyogZG8gbm90IGJyZWFrIGEgZmlsZSBzbWFsbGVyIHRoYW4gdGhpcyAqLworCitzdHJ1Y3QgZGlmZl9maWxlc3BlYyB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICpwYXRoOworCXZvaWQgKmRhdGE7CisJdm9pZCAqY250X2RhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCB4ZnJtX2ZsYWdzOwkJIC8qIGZvciB1c2UgYnkgdGhlIHhmcm0gKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkgLyogZmlsZSBtb2RlICovCisJdW5zaWduZWQgc2hhMV92YWxpZCA6IDE7IC8qIGlmIHRydWUsIHVzZSBzaGExIGFuZCB0cnVzdCBtb2RlOworCQkJCSAgKiBpZiBmYWxzZSwgdXNlIHRoZSBuYW1lIGFuZCByZWFkIGZyb20KKwkJCQkgICogdGhlIGZpbGVzeXN0ZW0uCisJCQkJICAqLworI2RlZmluZSBESUZGX0ZJTEVfVkFMSUQoc3BlYykgKCgoc3BlYyktPm1vZGUpICE9IDApCisJdW5zaWduZWQgc2hvdWxkX2ZyZWUgOiAxOyAvKiBkYXRhIHNob3VsZCBiZSBmcmVlKCknZWQgKi8KKwl1bnNpZ25lZCBzaG91bGRfbXVubWFwIDogMTsgLyogZGF0YSBzaG91bGQgYmUgbXVubWFwKCknZWQgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqYWxsb2NfZmlsZXNwZWMoY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGZpbGxfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLAorCQkJICB1bnNpZ25lZCBzaG9ydCk7CisKK2V4dGVybiBpbnQgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEoc3RydWN0IGRpZmZfZmlsZXNwZWMgKik7CisKK3N0cnVjdCBkaWZmX2ZpbGVwYWlyIHsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d287CisJdW5zaWduZWQgc2hvcnQgaW50IHNjb3JlOworCWNoYXIgc3RhdHVzOyAvKiBNIEMgUiBOIEQgVSAoc2VlIERvY3VtZW50YXRpb24vZGlmZi1mb3JtYXQudHh0KSAqLworCXVuc2lnbmVkIHNvdXJjZV9zdGF5cyA6IDE7IC8qIGFsbCBvZiBSL0MgYXJlIGNvcGllcyAqLworCXVuc2lnbmVkIGJyb2tlbl9wYWlyIDogMTsKK307CisjZGVmaW5lIERJRkZfUEFJUl9VTk1FUkdFRChwKSBcCisJKCFESUZGX0ZJTEVfVkFMSUQoKHApLT5vbmUpICYmICFESUZGX0ZJTEVfVkFMSUQoKHApLT50d28pKQorCisjZGVmaW5lIERJRkZfUEFJUl9SRU5BTUUocCkgKHN0cmNtcCgocCktPm9uZS0+cGF0aCwgKHApLT50d28tPnBhdGgpKQorCisjZGVmaW5lIERJRkZfUEFJUl9CUk9LRU4ocCkgXAorCSggKCFESUZGX0ZJTEVfVkFMSUQoKHApLT5vbmUpICE9ICFESUZGX0ZJTEVfVkFMSUQoKHApLT50d28pKSAmJiBcCisJICAoKHApLT5icm9rZW5fcGFpciAhPSAwKSApCisKKyNkZWZpbmUgRElGRl9QQUlSX1RZUEVfQ0hBTkdFRChwKSBcCisJKChTX0lGTVQgJiAocCktPm9uZS0+bW9kZSkgIT0gKFNfSUZNVCAmIChwKS0+dHdvLT5tb2RlKSkKKworI2RlZmluZSBESUZGX1BBSVJfTU9ERV9DSEFOR0VEKHApICgocCktPm9uZS0+bW9kZSAhPSAocCktPnR3by0+bW9kZSkKKworZXh0ZXJuIHZvaWQgZGlmZl9mcmVlX2ZpbGVwYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICopOworCitleHRlcm4gaW50IGRpZmZfdW5tb2RpZmllZF9wYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICopOworCitzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgeworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICoqcXVldWU7CisJaW50IGFsbG9jOworCWludCBucjsKK307CisKK2V4dGVybiBzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgZGlmZl9xdWV1ZWRfZGlmZjsKK2V4dGVybiBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqZGlmZl9xdWV1ZShzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKiwKKwkJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKiwKKwkJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKik7CitleHRlcm4gdm9pZCBkaWZmX3Eoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICosIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICopOworCitleHRlcm4gdm9pZCBkaWZmY29yZV9wYXRoc3BlYyhjb25zdCBjaGFyICoqcGF0aHNwZWMpOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfYnJlYWsoaW50KTsKK2V4dGVybiB2b2lkIGRpZmZjb3JlX3JlbmFtZShzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfbWVyZ2VfYnJva2VuKHZvaWQpOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfcGlja2F4ZShjb25zdCBjaGFyICpuZWVkbGUsIGludCBvcHRzKTsKK2V4dGVybiB2b2lkIGRpZmZjb3JlX29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyZmlsZSk7CisKKyNkZWZpbmUgRElGRl9ERUJVRyAwCisjaWYgRElGRl9ERUJVRwordm9pZCBkaWZmX2RlYnVnX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICosIGludCwgY29uc3QgY2hhciAqKTsKK3ZvaWQgZGlmZl9kZWJ1Z19maWxlcGFpcihjb25zdCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqLCBpbnQpOwordm9pZCBkaWZmX2RlYnVnX3F1ZXVlKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICopOworI2Vsc2UKKyNkZWZpbmUgZGlmZl9kZWJ1Z19maWxlc3BlYyhhLGIsYykgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgZGlmZl9kZWJ1Z19maWxlcGFpcihhLGIpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGRpZmZfZGVidWdfcXVldWUoYSxiKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKK2V4dGVybiBpbnQgZGlmZmNvcmVfY291bnRfY2hhbmdlcyh2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgc3JjX3NpemUsCisJCQkJICB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgZHN0X3NpemUsCisJCQkJICB2b2lkICoqc3JjX2NvdW50X3AsCisJCQkJICB2b2lkICoqZHN0X2NvdW50X3AsCisJCQkJICB1bnNpZ25lZCBsb25nIGRlbHRhX2xpbWl0LAorCQkJCSAgdW5zaWduZWQgbG9uZyAqc3JjX2NvcGllZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKmxpdGVyYWxfYWRkZWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpci5jIGIvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3OGVjZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpci5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogVGhpcyBoYW5kbGVzIHJlY3Vyc2l2ZSBmaWxlbmFtZSBkZXRlY3Rpb24gd2l0aCBleGNsdWRlCisgKiBmaWxlcywgaW5kZXgga25vd2xlZGdlIGV0Yy4uCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNS0yMDA2CisgKgkJIEp1bmlvIEhhbWFubywgMjAwNS0yMDA2CisgKi8KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpci5oIgorCitpbnQgY29tbW9uX3ByZWZpeChjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqcGF0aCwgKnNsYXNoLCAqbmV4dDsKKwlpbnQgcHJlZml4OworCisJaWYgKCFwYXRoc3BlYykKKwkJcmV0dXJuIDA7CisKKwlwYXRoID0gKnBhdGhzcGVjOworCXNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOworCWlmICghc2xhc2gpCisJCXJldHVybiAwOworCisJcHJlZml4ID0gc2xhc2ggLSBwYXRoICsgMTsKKwl3aGlsZSAoKG5leHQgPSAqKytwYXRoc3BlYykgIT0gTlVMTCkgeworCQlpbnQgbGVuID0gc3RybGVuKG5leHQpOworCQlpZiAobGVuID49IHByZWZpeCAmJiAhbWVtY21wKHBhdGgsIG5leHQsIGxlbikpCisJCQljb250aW51ZTsKKwkJZm9yICg7OykgeworCQkJaWYgKCFsZW4pCisJCQkJcmV0dXJuIDA7CisJCQlpZiAobmV4dFstLWxlbl0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChwYXRoLCBuZXh0LCBsZW4rMSkpCisJCQkJY29udGludWU7CisJCQlwcmVmaXggPSBsZW4gKyAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHByZWZpeDsKK30KKworc3RhdGljIGludCBtYXRjaF9vbmUoY29uc3QgY2hhciAqbWF0Y2gsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCWludCBtYXRjaGxlbjsKKworCS8qIElmIHRoZSBtYXRjaCB3YXMganVzdCB0aGUgcHJlZml4LCB3ZSBtYXRjaGVkICovCisJbWF0Y2hsZW4gPSBzdHJsZW4obWF0Y2gpOworCWlmICghbWF0Y2hsZW4pCisJCXJldHVybiAxOworCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBtYXRjaCB0aGUgbWF0Y2hzdHJpbmcgZXhhY3RseSwKKwkgKiB3ZSBuZWVkIHRvIG1hdGNoIGJ5IGZubWF0Y2gKKwkgKi8KKwlpZiAoc3RybmNtcChtYXRjaCwgbmFtZSwgbWF0Y2hsZW4pKQorCQlyZXR1cm4gIWZubWF0Y2gobWF0Y2gsIG5hbWUsIDApOworCisJLyoKKwkgKiBJZiB3ZSBkaWQgbWF0Y2ggdGhlIHN0cmluZyBleGFjdGx5LCB3ZSBzdGlsbAorCSAqIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaGFwcGVuZWQgb24gYSBwYXRoCisJICogY29tcG9uZW50IGJvdW5kYXJ5IChpZSBlaXRoZXIgdGhlIGxhc3QgY2hhcmFjdGVyCisJICogb2YgdGhlIG1hdGNoIHdhcyAnLycsIG9yIHRoZSBuZXh0IGNoYXJhY3RlciBvZgorCSAqIHRoZSBuYW1lIHdhcyAnLycgb3IgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKwkgKi8KKwlyZXR1cm4JbWF0Y2hbbWF0Y2hsZW4tMV0gPT0gJy8nIHx8CisJCW5hbWVbbWF0Y2hsZW5dID09ICcvJyB8fAorCQkhbmFtZVttYXRjaGxlbl07Cit9CisKK2ludCBtYXRjaF9wYXRoc3BlYyhjb25zdCBjaGFyICoqcGF0aHNwZWMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBpbnQgcHJlZml4LCBjaGFyICpzZWVuKQoreworCWludCByZXR2YWw7CisJY29uc3QgY2hhciAqbWF0Y2g7CisKKwluYW1lICs9IHByZWZpeDsKKwluYW1lbGVuIC09IHByZWZpeDsKKworCWZvciAocmV0dmFsID0gMDsgKG1hdGNoID0gKnBhdGhzcGVjKyspICE9IE5VTEw7IHNlZW4rKykgeworCQlpZiAocmV0dmFsICYgKnNlZW4pCisJCQljb250aW51ZTsKKwkJbWF0Y2ggKz0gcHJlZml4OworCQlpZiAobWF0Y2hfb25lKG1hdGNoLCBuYW1lLCBuYW1lbGVuKSkgeworCQkJcmV0dmFsID0gMTsKKwkJCSpzZWVuID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGFkZF9leGNsdWRlKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqYmFzZSwKKwkJIGludCBiYXNlbGVuLCBzdHJ1Y3QgZXhjbHVkZV9saXN0ICp3aGljaCkKK3sKKwlzdHJ1Y3QgZXhjbHVkZSAqeCA9IHhtYWxsb2Moc2l6ZW9mICgqeCkpOworCisJeC0+cGF0dGVybiA9IHN0cmluZzsKKwl4LT5iYXNlID0gYmFzZTsKKwl4LT5iYXNlbGVuID0gYmFzZWxlbjsKKwlpZiAod2hpY2gtPm5yID09IHdoaWNoLT5hbGxvYykgeworCQl3aGljaC0+YWxsb2MgPSBhbGxvY19ucih3aGljaC0+YWxsb2MpOworCQl3aGljaC0+ZXhjbHVkZXMgPSByZWFsbG9jKHdoaWNoLT5leGNsdWRlcywKKwkJCQkJICB3aGljaC0+YWxsb2MgKiBzaXplb2YoeCkpOworCX0KKwl3aGljaC0+ZXhjbHVkZXNbd2hpY2gtPm5yKytdID0geDsKK30KKworc3RhdGljIGludCBhZGRfZXhjbHVkZXNfZnJvbV9maWxlXzEoY29uc3QgY2hhciAqZm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJhc2UsCisJCQkJICAgIGludCBiYXNlbGVuLAorCQkJCSAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0ICp3aGljaCkKK3sKKwlpbnQgZmQsIGk7CisJbG9uZyBzaXplOworCWNoYXIgKmJ1ZiwgKmVudHJ5OworCisJZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBlcnI7CisJc2l6ZSA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisJaWYgKHNpemUgPCAwKQorCQlnb3RvIGVycjsKKwlsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCWlmIChzaXplID09IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisJYnVmID0geG1hbGxvYyhzaXplKzEpOworCWlmIChyZWFkKGZkLCBidWYsIHNpemUpICE9IHNpemUpCisJCWdvdG8gZXJyOworCWNsb3NlKGZkKTsKKworCWJ1ZltzaXplKytdID0gJ1xuJzsKKwllbnRyeSA9IGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChidWZbaV0gPT0gJ1xuJykgeworCQkJaWYgKGVudHJ5ICE9IGJ1ZiArIGkgJiYgZW50cnlbMF0gIT0gJyMnKSB7CisJCQkJYnVmW2kgLSAoaSAmJiBidWZbaS0xXSA9PSAnXHInKV0gPSAwOworCQkJCWFkZF9leGNsdWRlKGVudHJ5LCBiYXNlLCBiYXNlbGVuLCB3aGljaCk7CisJCQl9CisJCQllbnRyeSA9IGJ1ZiArIGkgKyAxOworCQl9CisJfQorCXJldHVybiAwOworCisgZXJyOgorCWlmICgwIDw9IGZkKQorCQljbG9zZShmZCk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIGFkZF9leGNsdWRlc19mcm9tX2ZpbGUoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqZm5hbWUpCit7CisJaWYgKGFkZF9leGNsdWRlc19mcm9tX2ZpbGVfMShmbmFtZSwgIiIsIDAsCisJCQkJICAgICAmZGlyLT5leGNsdWRlX2xpc3RbRVhDX0ZJTEVdKSA8IDApCisJCWRpZSgiY2Fubm90IHVzZSAlcyBhcyBhbiBleGNsdWRlIGZpbGUiLCBmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcHVzaF9leGNsdWRlX3Blcl9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pCit7CisJY2hhciBleGNsdWRlX2ZpbGVbUEFUSF9NQVhdOworCXN0cnVjdCBleGNsdWRlX2xpc3QgKmVsID0gJmRpci0+ZXhjbHVkZV9saXN0W0VYQ19ESVJTXTsKKwlpbnQgY3VycmVudF9uciA9IGVsLT5ucjsKKworCWlmIChkaXItPmV4Y2x1ZGVfcGVyX2RpcikgeworCQltZW1jcHkoZXhjbHVkZV9maWxlLCBiYXNlLCBiYXNlbGVuKTsKKwkJc3RyY3B5KGV4Y2x1ZGVfZmlsZSArIGJhc2VsZW4sIGRpci0+ZXhjbHVkZV9wZXJfZGlyKTsKKwkJYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZV8xKGV4Y2x1ZGVfZmlsZSwgYmFzZSwgYmFzZWxlbiwgZWwpOworCX0KKwlyZXR1cm4gY3VycmVudF9ucjsKK30KKworc3RhdGljIHZvaWQgcG9wX2V4Y2x1ZGVfcGVyX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBpbnQgc3RrKQoreworCXN0cnVjdCBleGNsdWRlX2xpc3QgKmVsID0gJmRpci0+ZXhjbHVkZV9saXN0W0VYQ19ESVJTXTsKKworCXdoaWxlIChzdGsgPCBlbC0+bnIpCisJCWZyZWUoZWwtPmV4Y2x1ZGVzWy0tZWwtPm5yXSk7Cit9CisKKy8qIFNjYW4gdGhlIGxpc3QgYW5kIGxldCB0aGUgbGFzdCBtYXRjaCBkZXRlcm1pbmVzIHRoZSBmYXRlLgorICogUmV0dXJuIDEgZm9yIGV4Y2x1ZGUsIDAgZm9yIGluY2x1ZGUgYW5kIC0xIGZvciB1bmRlY2lkZWQuCisgKi8KK3N0YXRpYyBpbnQgZXhjbHVkZWRfMShjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJICAgICAgaW50IHBhdGhsZW4sCisJCSAgICAgIHN0cnVjdCBleGNsdWRlX2xpc3QgKmVsKQoreworCWludCBpOworCisJaWYgKGVsLT5ucikgeworCQlmb3IgKGkgPSBlbC0+bnIgLSAxOyAwIDw9IGk7IGktLSkgeworCQkJc3RydWN0IGV4Y2x1ZGUgKnggPSBlbC0+ZXhjbHVkZXNbaV07CisJCQljb25zdCBjaGFyICpleGNsdWRlID0geC0+cGF0dGVybjsKKwkJCWludCB0b19leGNsdWRlID0gMTsKKworCQkJaWYgKCpleGNsdWRlID09ICchJykgeworCQkJCXRvX2V4Y2x1ZGUgPSAwOworCQkJCWV4Y2x1ZGUrKzsKKwkJCX0KKworCQkJaWYgKCFzdHJjaHIoZXhjbHVkZSwgJy8nKSkgeworCQkJCS8qIG1hdGNoIGJhc2VuYW1lICovCisJCQkJY29uc3QgY2hhciAqYmFzZW5hbWUgPSBzdHJyY2hyKHBhdGhuYW1lLCAnLycpOworCQkJCWJhc2VuYW1lID0gKGJhc2VuYW1lKSA/IGJhc2VuYW1lKzEgOiBwYXRobmFtZTsKKwkJCQlpZiAoZm5tYXRjaChleGNsdWRlLCBiYXNlbmFtZSwgMCkgPT0gMCkKKwkJCQkJcmV0dXJuIHRvX2V4Y2x1ZGU7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBtYXRjaCB3aXRoIEZOTV9QQVRITkFNRToKKwkJCQkgKiBleGNsdWRlIGhhcyBiYXNlIChiYXNlbGVuIGxvbmcpIGltcGxpY2l0bHkKKwkJCQkgKiBpbiBmcm9udCBvZiBpdC4KKwkJCQkgKi8KKwkJCQlpbnQgYmFzZWxlbiA9IHgtPmJhc2VsZW47CisJCQkJaWYgKCpleGNsdWRlID09ICcvJykKKwkJCQkJZXhjbHVkZSsrOworCisJCQkJaWYgKHBhdGhsZW4gPCBiYXNlbGVuIHx8CisJCQkJICAgIChiYXNlbGVuICYmIHBhdGhuYW1lW2Jhc2VsZW4tMV0gIT0gJy8nKSB8fAorCQkJCSAgICBzdHJuY21wKHBhdGhuYW1lLCB4LT5iYXNlLCBiYXNlbGVuKSkKKwkJCQkgICAgY29udGludWU7CisKKwkJCQlpZiAoZm5tYXRjaChleGNsdWRlLCBwYXRobmFtZStiYXNlbGVuLAorCQkJCQkgICAgRk5NX1BBVEhOQU1FKSA9PSAwKQorCQkJCQlyZXR1cm4gdG9fZXhjbHVkZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7IC8qIHVuZGVjaWRlZCAqLworfQorCitpbnQgZXhjbHVkZWQoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJaW50IHBhdGhsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworCWludCBzdDsKKworCWZvciAoc3QgPSBFWENfQ01ETDsgc3QgPD0gRVhDX0ZJTEU7IHN0KyspIHsKKwkJc3dpdGNoIChleGNsdWRlZF8xKHBhdGhuYW1lLCBwYXRobGVuLCAmZGlyLT5leGNsdWRlX2xpc3Rbc3RdKSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAxOgorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9uYW1lKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgbGVuKQoreworCXN0cnVjdCBkaXJfZW50cnkgKmVudDsKKworCWlmIChjYWNoZV9uYW1lX3BvcyhwYXRobmFtZSwgbGVuKSA+PSAwKQorCQlyZXR1cm47CisKKwlpZiAoZGlyLT5uciA9PSBkaXItPmFsbG9jKSB7CisJCWludCBhbGxvYyA9IGFsbG9jX25yKGRpci0+YWxsb2MpOworCQlkaXItPmFsbG9jID0gYWxsb2M7CisJCWRpci0+ZW50cmllcyA9IHhyZWFsbG9jKGRpci0+ZW50cmllcywgYWxsb2Mqc2l6ZW9mKGVudCkpOworCX0KKwllbnQgPSB4bWFsbG9jKHNpemVvZigqZW50KSArIGxlbiArIDEpOworCWVudC0+bGVuID0gbGVuOworCW1lbWNweShlbnQtPm5hbWUsIHBhdGhuYW1lLCBsZW4pOworCWVudC0+bmFtZVtsZW5dID0gMDsKKwlkaXItPmVudHJpZXNbZGlyLT5ucisrXSA9IGVudDsKK30KKworc3RhdGljIGludCBkaXJfZXhpc3RzKGNvbnN0IGNoYXIgKmRpcm5hbWUsIGludCBsZW4pCit7CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKGRpcm5hbWUsIGxlbik7CisJaWYgKHBvcyA+PSAwKQorCQlyZXR1cm4gMTsKKwlwb3MgPSAtcG9zLTE7CisJaWYgKHBvcyA+PSBhY3RpdmVfbnIpIC8qIGNhbid0ICovCisJCXJldHVybiAwOworCXJldHVybiAhc3RybmNtcChhY3RpdmVfY2FjaGVbcG9zXS0+bmFtZSwgZGlybmFtZSwgbGVuKTsKK30KKworLyoKKyAqIFJlYWQgYSBkaXJlY3RvcnkgdHJlZS4gV2UgY3VycmVudGx5IGlnbm9yZSBhbnl0aGluZyBidXQKKyAqIGRpcmVjdG9yaWVzLCByZWd1bGFyIGZpbGVzIGFuZCBzeW1saW5rcy4gVGhhdCdzIGJlY2F1c2UgZ2l0CisgKiBkb2Vzbid0IGhhbmRsZSB0aGVtIGF0IGFsbCB5ZXQuIE1heWJlIHRoYXQgd2lsbCBjaGFuZ2Ugc29tZQorICogZGF5LgorICoKKyAqIEFsc28sIHdlIGlnbm9yZSB0aGUgbmFtZSAiLmdpdCIgKGV2ZW4gaWYgaXQgaXMgbm90IGEgZGlyZWN0b3J5KS4KKyAqIFRoYXQgbGlrZWx5IHdpbGwgbm90IGNoYW5nZS4KKyAqLworc3RhdGljIGludCByZWFkX2RpcmVjdG9yeV9yZWN1cnNpdmUoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pCit7CisJRElSICpmZGlyID0gb3BlbmRpcihwYXRoKTsKKwlpbnQgY29udGVudHMgPSAwOworCisJaWYgKGZkaXIpIHsKKwkJaW50IGV4Y2x1ZGVfc3RrOworCQlzdHJ1Y3QgZGlyZW50ICpkZTsKKwkJY2hhciBmdWxsbmFtZVtNQVhQQVRITEVOICsgMV07CisJCW1lbWNweShmdWxsbmFtZSwgYmFzZSwgYmFzZWxlbik7CisKKwkJZXhjbHVkZV9zdGsgPSBwdXNoX2V4Y2x1ZGVfcGVyX2RpcmVjdG9yeShkaXIsIGJhc2UsIGJhc2VsZW4pOworCisJCXdoaWxlICgoZGUgPSByZWFkZGlyKGZkaXIpKSAhPSBOVUxMKSB7CisJCQlpbnQgbGVuOworCisJCQlpZiAoKGRlLT5kX25hbWVbMF0gPT0gJy4nKSAmJgorCQkJICAgIChkZS0+ZF9uYW1lWzFdID09IDAgfHwKKwkJCSAgICAgIXN0cmNtcChkZS0+ZF9uYW1lICsgMSwgIi4iKSB8fAorCQkJICAgICAhc3RyY21wKGRlLT5kX25hbWUgKyAxLCAiZ2l0IikpKQorCQkJCWNvbnRpbnVlOworCQkJbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCQkJbWVtY3B5KGZ1bGxuYW1lICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbGVuKzEpOworCQkJaWYgKGV4Y2x1ZGVkKGRpciwgZnVsbG5hbWUpICE9IGRpci0+c2hvd19pZ25vcmVkKSB7CisJCQkJaWYgKCFkaXItPnNob3dfaWdub3JlZCB8fCBEVFlQRShkZSkgIT0gRFRfRElSKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJc3dpdGNoIChEVFlQRShkZSkpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaW50IHN1YmRpciwgcmV3aW5kX2Jhc2U7CisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBEVF9VTktOT1dOOgorCQkJCWlmIChsc3RhdChmdWxsbmFtZSwgJnN0KSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkgfHwgU19JU0xOSyhzdC5zdF9tb2RlKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSBEVF9ESVI6CisJCQkJbWVtY3B5KGZ1bGxuYW1lICsgYmFzZWxlbiArIGxlbiwgIi8iLCAyKTsKKwkJCQlsZW4rKzsKKwkJCQlyZXdpbmRfYmFzZSA9IGRpci0+bnI7CisJCQkJc3ViZGlyID0gcmVhZF9kaXJlY3RvcnlfcmVjdXJzaXZlKGRpciwgZnVsbG5hbWUsIGZ1bGxuYW1lLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsZW4gKyBsZW4pOworCQkJCWlmIChkaXItPnNob3dfb3RoZXJfZGlyZWN0b3JpZXMgJiYKKwkJCQkgICAgKHN1YmRpciB8fCAhZGlyLT5oaWRlX2VtcHR5X2RpcmVjdG9yaWVzKSAmJgorCQkJCSAgICAhZGlyX2V4aXN0cyhmdWxsbmFtZSwgYmFzZWxlbiArIGxlbikpIHsKKwkJCQkJLy8gUmV3aW5kIHRoZSByZWFkIHN1YmRpcmVjdG9yeQorCQkJCQl3aGlsZSAoZGlyLT5uciA+IHJld2luZF9iYXNlKQorCQkJCQkJZnJlZShkaXItPmVudHJpZXNbLS1kaXItPm5yXSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb250ZW50cyArPSBzdWJkaXI7CisJCQkJY29udGludWU7CisJCQljYXNlIERUX1JFRzoKKwkJCWNhc2UgRFRfTE5LOgorCQkJCWJyZWFrOworCQkJfQorCQkJYWRkX25hbWUoZGlyLCBmdWxsbmFtZSwgYmFzZWxlbiArIGxlbik7CisJCQljb250ZW50cysrOworCQl9CisJCWNsb3NlZGlyKGZkaXIpOworCisJCXBvcF9leGNsdWRlX3Blcl9kaXJlY3RvcnkoZGlyLCBleGNsdWRlX3N0ayk7CisJfQorCisJcmV0dXJuIGNvbnRlbnRzOworfQorCitzdGF0aWMgaW50IGNtcF9uYW1lKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3QgZGlyX2VudHJ5ICplMSA9ICooY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqKilwMTsKKwljb25zdCBzdHJ1Y3QgZGlyX2VudHJ5ICplMiA9ICooY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqKilwMjsKKworCXJldHVybiBjYWNoZV9uYW1lX2NvbXBhcmUoZTEtPm5hbWUsIGUxLT5sZW4sCisJCQkJICBlMi0+bmFtZSwgZTItPmxlbik7Cit9CisKK2ludCByZWFkX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbikKK3sKKwkvKgorCSAqIE1ha2Ugc3VyZSB0byBkbyB0aGUgcGVyLWRpcmVjdG9yeSBleGNsdWRlIGZvciBhbGwgdGhlCisJICogZGlyZWN0b3JpZXMgbGVhZGluZyB1cCB0byBvdXIgYmFzZS4KKwkgKi8KKwlpZiAoYmFzZWxlbikgeworCQlpZiAoZGlyLT5leGNsdWRlX3Blcl9kaXIpIHsKKwkJCWNoYXIgKnAsICpwcCA9IHhtYWxsb2MoYmFzZWxlbisxKTsKKwkJCW1lbWNweShwcCwgYmFzZSwgYmFzZWxlbisxKTsKKwkJCXAgPSBwcDsKKwkJCXdoaWxlICgxKSB7CisJCQkJY2hhciBzYXZlID0gKnA7CisJCQkJKnAgPSAwOworCQkJCXB1c2hfZXhjbHVkZV9wZXJfZGlyZWN0b3J5KGRpciwgcHAsIHAtcHApOworCQkJCSpwKysgPSBzYXZlOworCQkJCWlmICghc2F2ZSkKKwkJCQkJYnJlYWs7CisJCQkJcCA9IHN0cmNocihwLCAnLycpOworCQkJCWlmIChwKQorCQkJCQlwKys7CisJCQkJZWxzZQorCQkJCQlwID0gcHAgKyBiYXNlbGVuOworCQkJfQorCQkJZnJlZShwcCk7CisJCX0KKwl9CisKKwlyZWFkX2RpcmVjdG9yeV9yZWN1cnNpdmUoZGlyLCBwYXRoLCBiYXNlLCBiYXNlbGVuKTsKKwlxc29ydChkaXItPmVudHJpZXMsIGRpci0+bnIsIHNpemVvZihzdHJ1Y3QgZGlyX2VudHJ5ICopLCBjbXBfbmFtZSk7CisJcmV0dXJuIGRpci0+bnI7Cit9CmRpZmYgLS1naXQgYS9kaXIuaCBiL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTFiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXIuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIERJUl9ICisjZGVmaW5lIERJUl9ICisKKy8qCisgKiBXZSBtYWludGFpbiB0aHJlZSBleGNsdWRlIHBhdHRlcm4gbGlzdHM6CisgKiBFWENfQ01ETCBsaXN0cyBwYXR0ZXJucyBleHBsaWNpdGx5IGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgKiBFWENfRElSUyBsaXN0cyBwYXR0ZXJucyBvYnRhaW5lZCBmcm9tIHBlci1kaXJlY3RvcnkgaWdub3JlIGZpbGVzLgorICogRVhDX0ZJTEUgbGlzdHMgcGF0dGVybnMgZnJvbSBmYWxsYmFjayBpZ25vcmUgZmlsZXMuCisgKi8KKyNkZWZpbmUgRVhDX0NNREwgMAorI2RlZmluZSBFWENfRElSUyAxCisjZGVmaW5lIEVYQ19GSUxFIDIKKworCitzdHJ1Y3QgZGlyX2VudHJ5IHsKKwlpbnQgbGVuOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RydWN0IGV4Y2x1ZGVfbGlzdCB7CisJaW50IG5yOworCWludCBhbGxvYzsKKwlzdHJ1Y3QgZXhjbHVkZSB7CisJCWNvbnN0IGNoYXIgKnBhdHRlcm47CisJCWNvbnN0IGNoYXIgKmJhc2U7CisJCWludCBiYXNlbGVuOworCX0gKipleGNsdWRlczsKK307CisKK3N0cnVjdCBkaXJfc3RydWN0IHsKKwlpbnQgbnIsIGFsbG9jOworCXVuc2lnbmVkIGludCBzaG93X2lnbm9yZWQ6MSwKKwkJICAgICBzaG93X290aGVyX2RpcmVjdG9yaWVzOjEsCisJCSAgICAgaGlkZV9lbXB0eV9kaXJlY3RvcmllczoxOworCXN0cnVjdCBkaXJfZW50cnkgKiplbnRyaWVzOworCisJLyogRXhjbHVkZSBpbmZvICovCisJY29uc3QgY2hhciAqZXhjbHVkZV9wZXJfZGlyOworCXN0cnVjdCBleGNsdWRlX2xpc3QgZXhjbHVkZV9saXN0WzNdOworfTsKKworZXh0ZXJuIGludCBjb21tb25fcHJlZml4KGNvbnN0IGNoYXIgKipwYXRoc3BlYyk7CitleHRlcm4gaW50IG1hdGNoX3BhdGhzcGVjKGNvbnN0IGNoYXIgKipwYXRoc3BlYywgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCBwcmVmaXgsIGNoYXIgKnNlZW4pOworCitleHRlcm4gaW50IHJlYWRfZGlyZWN0b3J5KHN0cnVjdCBkaXJfc3RydWN0ICosIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuKTsKK2V4dGVybiBpbnQgZXhjbHVkZWQoc3RydWN0IGRpcl9zdHJ1Y3QgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGFkZF9leGNsdWRlc19mcm9tX2ZpbGUoc3RydWN0IGRpcl9zdHJ1Y3QgKiwgY29uc3QgY2hhciAqZm5hbWUpOworZXh0ZXJuIHZvaWQgYWRkX2V4Y2x1ZGUoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpiYXNlLAorCQkJaW50IGJhc2VsZW4sIHN0cnVjdCBleGNsdWRlX2xpc3QgKndoaWNoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kdW1wLWNhY2hlLXRyZWUuYyBiL2R1bXAtY2FjaGUtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2FmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kdW1wLWNhY2hlLXRyZWUuYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCisKK3N0YXRpYyB2b2lkIGR1bXBfb25lKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGZ4LCBjb25zdCBjaGFyICp4KQoreworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwKQorCQlwcmludGYoIiUtNDBzICVzJXMgKCVkIHN1YnRyZWVzKVxuIiwKKwkJICAgICAgICJpbnZhbGlkIiwgeCwgcGZ4LCBpdC0+c3VidHJlZV9ucik7CisJZWxzZQorCQlwcmludGYoIiVzICVzJXMgKCVkIGVudHJpZXMsICVkIHN1YnRyZWVzKVxuIiwKKwkJICAgICAgIHNoYTFfdG9faGV4KGl0LT5zaGExKSwgeCwgcGZ4LAorCQkgICAgICAgaXQtPmVudHJ5X2NvdW50LCBpdC0+c3VidHJlZV9ucik7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9jYWNoZV90cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJCSAgIHN0cnVjdCBjYWNoZV90cmVlICpyZWYsCisJCQkgICBjb25zdCBjaGFyICpwZngpCit7CisJaW50IGk7CisJaW50IGVycnMgPSAwOworCisJaWYgKCFpdCB8fCAhcmVmKQorCQkvKiBtaXNzaW5nIGluIGVpdGhlciAqLworCQlyZXR1cm4gMDsKKworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwKSB7CisJCWR1bXBfb25lKGl0LCBwZngsICIiKTsKKwkJZHVtcF9vbmUocmVmLCBwZngsICIjKHJlZikgIik7CisJCWlmIChpdC0+c3VidHJlZV9uciAhPSByZWYtPnN1YnRyZWVfbnIpCisJCQllcnJzID0gMTsKKwl9CisJZWxzZSB7CisJCWR1bXBfb25lKGl0LCBwZngsICIiKTsKKwkJaWYgKG1lbWNtcChpdC0+c2hhMSwgcmVmLT5zaGExLCAyMCkgfHwKKwkJICAgIHJlZi0+ZW50cnlfY291bnQgIT0gaXQtPmVudHJ5X2NvdW50IHx8CisJCSAgICByZWYtPnN1YnRyZWVfbnIgIT0gaXQtPnN1YnRyZWVfbnIpIHsKKwkJCWR1bXBfb25lKHJlZiwgcGZ4LCAiIyhyZWYpICIpOworCQkJZXJycyA9IDE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykgeworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd24gPSBpdC0+ZG93bltpXTsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpyZHduOworCisJCXJkd24gPSBjYWNoZV90cmVlX3N1YihyZWYsIGRvd24tPm5hbWUpOworCQlzcHJpbnRmKHBhdGgsICIlcyUuKnMvIiwgcGZ4LCBkb3duLT5uYW1lbGVuLCBkb3duLT5uYW1lKTsKKwkJaWYgKGR1bXBfY2FjaGVfdHJlZShkb3duLT5jYWNoZV90cmVlLCByZHduLT5jYWNoZV90cmVlLCBwYXRoKSkKKwkJCWVycnMgPSAxOworCX0KKwlyZXR1cm4gZXJyczsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJc3RydWN0IGNhY2hlX3RyZWUgKmFub3RoZXIgPSBjYWNoZV90cmVlKCk7CisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgaW5kZXggZmlsZSIpOworCWNhY2hlX3RyZWVfdXBkYXRlKGFub3RoZXIsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yLCAwLCAxKTsKKwlyZXR1cm4gZHVtcF9jYWNoZV90cmVlKGFjdGl2ZV9jYWNoZV90cmVlLCBhbm90aGVyLCAiIik7Cit9CmRpZmYgLS1naXQgYS9lbnRyeS5jIGIvZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM3MjRmCi0tLSAvZGV2L251bGwKKysrIGIvZW50cnkuYwpAQCAtMCwwICsxLDE3NiBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgdm9pZCBjcmVhdGVfZGlyZWN0b3JpZXMoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGNoZWNrb3V0ICpzdGF0ZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgpOworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MobGVuICsgMSk7CisJY29uc3QgY2hhciAqc2xhc2ggPSBwYXRoOworCisJd2hpbGUgKChzbGFzaCA9IHN0cmNocihzbGFzaCsxLCAnLycpKSAhPSBOVUxMKSB7CisJCWxlbiA9IHNsYXNoIC0gcGF0aDsKKwkJbWVtY3B5KGJ1ZiwgcGF0aCwgbGVuKTsKKwkJYnVmW2xlbl0gPSAwOworCQlpZiAobWtkaXIoYnVmLCAwNzc3KSkgeworCQkJaWYgKGVycm5vID09IEVFWElTVCkgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCWlmIChsZW4gPiBzdGF0ZS0+YmFzZV9kaXJfbGVuICYmIHN0YXRlLT5mb3JjZSAmJiAhdW5saW5rKGJ1ZikgJiYgIW1rZGlyKGJ1ZiwgMDc3NykpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghc3RhdChidWYsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCQkJY29udGludWU7IC8qIG9rICovCisJCQl9CisJCQlkaWUoImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGF0ICVzIiwgYnVmKTsKKwkJfQorCX0KKwlmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisJY2hhciAqbmFtZTsKKwkKKwlpZiAoIWRpcikKKwkJZGllKCJjYW5ub3Qgb3BlbmRpciAlcyIsIHBhdGgpOworCXN0cmNweShwYXRoYnVmLCBwYXRoKTsKKwluYW1lID0gcGF0aGJ1ZiArIHN0cmxlbihwYXRoKTsKKwkqbmFtZSsrID0gJy8nOworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmICgoZGUtPmRfbmFtZVswXSA9PSAnLicpICYmCisJCSAgICAoKGRlLT5kX25hbWVbMV0gPT0gMCkgfHwKKwkJICAgICAoKGRlLT5kX25hbWVbMV0gPT0gJy4nKSAmJiBkZS0+ZF9uYW1lWzJdID09IDApKSkKKwkJCWNvbnRpbnVlOworCQlzdHJjcHkobmFtZSwgZGUtPmRfbmFtZSk7CisJCWlmIChsc3RhdChwYXRoYnVmLCAmc3QpKQorCQkJZGllKCJjYW5ub3QgbHN0YXQgJXMiLCBwYXRoYnVmKTsKKwkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQlyZW1vdmVfc3VidHJlZShwYXRoYnVmKTsKKwkJZWxzZSBpZiAodW5saW5rKHBhdGhidWYpKQorCQkJZGllKCJjYW5ub3QgdW5saW5rICVzIiwgcGF0aGJ1Zik7CisJfQorCWNsb3NlZGlyKGRpcik7CisJaWYgKHJtZGlyKHBhdGgpKQorCQlkaWUoImNhbm5vdCBybWRpciAlcyIsIHBhdGgpOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGludCBtb2RlKQoreworCW1vZGUgPSAobW9kZSAmIDAxMDApID8gMDc3NyA6IDA2NjY7CisJcmV0dXJuIG9wZW4ocGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCBtb2RlKTsKK30KKworc3RhdGljIGludCB3cml0ZV9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjaGFyICpwYXRoLCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBpbnQgdG9fdGVtcGZpbGUpCit7CisJaW50IGZkOworCXZvaWQgKm5ldzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJbG9uZyB3cm90ZTsKKwljaGFyIHR5cGVbMjBdOworCisJbmV3ID0gcmVhZF9zaGExX2ZpbGUoY2UtPnNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIW5ldyB8fCBzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkgeworCQlpZiAobmV3KQorCQkJZnJlZShuZXcpOworCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHJlYWQgc2hhMSBmaWxlIG9mICVzICglcykiLAorCQkJcGF0aCwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKwl9CisJc3dpdGNoIChudG9obChjZS0+Y2VfbW9kZSkgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWlmICh0b190ZW1wZmlsZSkgeworCQkJc3RyY3B5KHBhdGgsICIubWVyZ2VfZmlsZV9YWFhYWFgiKTsKKwkJCWZkID0gbWtzdGVtcChwYXRoKTsKKwkJfSBlbHNlCisJCQlmZCA9IGNyZWF0ZV9maWxlKHBhdGgsIG50b2hsKGNlLT5jZV9tb2RlKSk7CisJCWlmIChmZCA8IDApIHsKKwkJCWZyZWUobmV3KTsKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlIGZpbGUgJXMgKCVzKSIsCisJCQkJcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQl3cm90ZSA9IHdyaXRlKGZkLCBuZXcsIHNpemUpOworCQljbG9zZShmZCk7CisJCWZyZWUobmV3KTsKKwkJaWYgKHdyb3RlICE9IHNpemUpCisJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHdyaXRlIGZpbGUgJXMiLCBwYXRoKTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQlpZiAodG9fdGVtcGZpbGUpIHsKKwkJCXN0cmNweShwYXRoLCAiLm1lcmdlX2xpbmtfWFhYWFhYIik7CisJCQlmZCA9IG1rc3RlbXAocGF0aCk7CisJCQlpZiAoZmQgPCAwKSB7CisJCQkJZnJlZShuZXcpOworCQkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlICIKKwkJCQkJCSAiZmlsZSAlcyAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCXdyb3RlID0gd3JpdGUoZmQsIG5ldywgc2l6ZSk7CisJCQljbG9zZShmZCk7CisJCQlmcmVlKG5ldyk7CisJCQlpZiAod3JvdGUgIT0gc2l6ZSkKKwkJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHdyaXRlIGZpbGUgJXMiLAorCQkJCQlwYXRoKTsKKwkJfSBlbHNlIHsKKwkJCXdyb3RlID0gc3ltbGluayhuZXcsIHBhdGgpOworCQkJZnJlZShuZXcpOworCQkJaWYgKHdyb3RlKQorCQkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlICIKKwkJCQkJCSAic3ltbGluayAlcyAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcmVlKG5ldyk7CisJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmtub3duIGZpbGUgbW9kZSBmb3IgJXMiLCBwYXRoKTsKKwl9CisKKwlpZiAoc3RhdGUtPnJlZnJlc2hfY2FjaGUpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWxzdGF0KGNlLT5uYW1lLCAmc3QpOworCQlmaWxsX3N0YXRfY2FjaGVfaW5mbyhjZSwgJnN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja291dF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBjaGFyICp0b3BhdGgpCit7CisJc3RhdGljIGNoYXIgcGF0aFtNQVhQQVRITEVOKzFdOworCXN0cnVjdCBzdGF0IHN0OworCWludCBsZW4gPSBzdGF0ZS0+YmFzZV9kaXJfbGVuOworCisJaWYgKHRvcGF0aCkKKwkJcmV0dXJuIHdyaXRlX2VudHJ5KGNlLCB0b3BhdGgsIHN0YXRlLCAxKTsKKworCW1lbWNweShwYXRoLCBzdGF0ZS0+YmFzZV9kaXIsIGxlbik7CisJc3RyY3B5KHBhdGggKyBsZW4sIGNlLT5uYW1lKTsKKworCWlmICghbHN0YXQocGF0aCwgJnN0KSkgeworCQl1bnNpZ25lZCBjaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCAxKTsKKwkJaWYgKCFjaGFuZ2VkKQorCQkJcmV0dXJuIDA7CisJCWlmICghc3RhdGUtPmZvcmNlKSB7CisJCQlpZiAoIXN0YXRlLT5xdWlldCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1jaGVja291dC1pbmRleDogJXMgYWxyZWFkeSBleGlzdHNcbiIsIHBhdGgpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogV2UgdW5saW5rIHRoZSBvbGQgZmlsZSwgdG8gZ2V0IHRoZSBuZXcgb25lIHdpdGggdGhlCisJCSAqIHJpZ2h0IHBlcm1pc3Npb25zIChpbmNsdWRpbmcgdW1hc2ssIHdoaWNoIGlzIG5hc3R5CisJCSAqIHRvIGVtdWxhdGUgYnkgaGFuZCAtIG11Y2ggZWFzaWVyIHRvIGxldCB0aGUgc3lzdGVtCisJCSAqIGp1c3QgZG8gdGhlIHJpZ2h0IHRoaW5nKQorCQkgKi8KKwkJdW5saW5rKHBhdGgpOworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJaWYgKCFzdGF0ZS0+Zm9yY2UpCisJCQkJcmV0dXJuIGVycm9yKCIlcyBpcyBhIGRpcmVjdG9yeSIsIHBhdGgpOworCQkJcmVtb3ZlX3N1YnRyZWUocGF0aCk7CisJCX0KKwl9IGVsc2UgaWYgKHN0YXRlLT5ub3RfbmV3KQorCQlyZXR1cm4gMDsKKwljcmVhdGVfZGlyZWN0b3JpZXMocGF0aCwgc3RhdGUpOworCXJldHVybiB3cml0ZV9lbnRyeShjZSwgcGF0aCwgc3RhdGUsIDApOworfQorCisKZGlmZiAtLWdpdCBhL2Vudmlyb25tZW50LmMgYi9lbnZpcm9ubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzllYWIKLS0tIC9kZXYvbnVsbAorKysgYi9lbnZpcm9ubWVudC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBXZSBwdXQgYWxsIHRoZSBnaXQgY29uZmlnIHZhcmlhYmxlcyBpbiB0aGlzIHNhbWUgb2JqZWN0CisgKiBmaWxlLCBzbyB0aGF0IHByb2dyYW1zIGNhbiBsaW5rIGFnYWluc3QgdGhlIGNvbmZpZyBwYXJzZXIKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIGxpbmsgYWdhaW5zdCBhbGwgdGhlIHJlc3Qgb2YgZ2l0LgorICoKKyAqIEluIHBhcnRpY3VsYXIsIG5vIG5lZWQgdG8gYnJpbmcgaW4gbGlieiBldGMgdW5sZXNzIG5lZWRlZCwKKyAqIGV2ZW4gaWYgeW91IG1pZ2h0IHdhbnQgdG8ga25vdyB3aGVyZSB0aGUgZ2l0IGRpcmVjdG9yeSBldGMKKyAqIGFyZS4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKK2NoYXIgZ2l0X2RlZmF1bHRfZW1haWxbTUFYX0dJVE5BTUVdOworY2hhciBnaXRfZGVmYXVsdF9uYW1lW01BWF9HSVROQU1FXTsKK2ludCB0cnVzdF9leGVjdXRhYmxlX2JpdCA9IDE7CitpbnQgYXNzdW1lX3VuY2hhbmdlZCA9IDA7CitpbnQgcHJlZmVyX3N5bWxpbmtfcmVmcyA9IDA7CitpbnQgbG9nX2FsbF9yZWZfdXBkYXRlcyA9IDA7CitpbnQgd2Fybl9hbWJpZ3VvdXNfcmVmcyA9IDE7CitpbnQgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiA9IDA7CitjaGFyIGdpdF9jb21taXRfZW5jb2RpbmdbTUFYX0VOQ09ESU5HX0xFTkdUSF0gPSAidXRmLTgiOworaW50IHNoYXJlZF9yZXBvc2l0b3J5ID0gMDsKK2NvbnN0IGNoYXIgKmFwcGx5X2RlZmF1bHRfd2hpdGVzcGFjZSA9IE5VTEw7CisKK3N0YXRpYyBjaGFyICpnaXRfZGlyLCAqZ2l0X29iamVjdF9kaXIsICpnaXRfaW5kZXhfZmlsZSwgKmdpdF9yZWZzX2RpciwKKwkqZ2l0X2dyYWZ0X2ZpbGU7CitzdGF0aWMgdm9pZCBzZXR1cF9naXRfZW52KHZvaWQpCit7CisJZ2l0X2RpciA9IGdldGVudihHSVRfRElSX0VOVklST05NRU5UKTsKKwlpZiAoIWdpdF9kaXIpCisJCWdpdF9kaXIgPSBERUZBVUxUX0dJVF9ESVJfRU5WSVJPTk1FTlQ7CisJZ2l0X29iamVjdF9kaXIgPSBnZXRlbnYoREJfRU5WSVJPTk1FTlQpOworCWlmICghZ2l0X29iamVjdF9kaXIpIHsKKwkJZ2l0X29iamVjdF9kaXIgPSB4bWFsbG9jKHN0cmxlbihnaXRfZGlyKSArIDkpOworCQlzcHJpbnRmKGdpdF9vYmplY3RfZGlyLCAiJXMvb2JqZWN0cyIsIGdpdF9kaXIpOworCX0KKwlnaXRfcmVmc19kaXIgPSB4bWFsbG9jKHN0cmxlbihnaXRfZGlyKSArIDYpOworCXNwcmludGYoZ2l0X3JlZnNfZGlyLCAiJXMvcmVmcyIsIGdpdF9kaXIpOworCWdpdF9pbmRleF9maWxlID0gZ2V0ZW52KElOREVYX0VOVklST05NRU5UKTsKKwlpZiAoIWdpdF9pbmRleF9maWxlKSB7CisJCWdpdF9pbmRleF9maWxlID0geG1hbGxvYyhzdHJsZW4oZ2l0X2RpcikgKyA3KTsKKwkJc3ByaW50ZihnaXRfaW5kZXhfZmlsZSwgIiVzL2luZGV4IiwgZ2l0X2Rpcik7CisJfQorCWdpdF9ncmFmdF9maWxlID0gZ2V0ZW52KEdSQUZUX0VOVklST05NRU5UKTsKKwlpZiAoIWdpdF9ncmFmdF9maWxlKQorCQlnaXRfZ3JhZnRfZmlsZSA9IHN0cmR1cChnaXRfcGF0aCgiaW5mby9ncmFmdHMiKSk7Cit9CisKK2NoYXIgKmdldF9naXRfZGlyKHZvaWQpCit7CisJaWYgKCFnaXRfZGlyKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9kaXI7Cit9CisKK2NoYXIgKmdldF9vYmplY3RfZGlyZWN0b3J5KHZvaWQpCit7CisJaWYgKCFnaXRfb2JqZWN0X2RpcikKKwkJc2V0dXBfZ2l0X2VudigpOworCXJldHVybiBnaXRfb2JqZWN0X2RpcjsKK30KKworY2hhciAqZ2V0X3JlZnNfZGlyZWN0b3J5KHZvaWQpCit7CisJaWYgKCFnaXRfcmVmc19kaXIpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X3JlZnNfZGlyOworfQorCitjaGFyICpnZXRfaW5kZXhfZmlsZSh2b2lkKQoreworCWlmICghZ2l0X2luZGV4X2ZpbGUpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X2luZGV4X2ZpbGU7Cit9CisKK2NoYXIgKmdldF9ncmFmdF9maWxlKHZvaWQpCit7CisJaWYgKCFnaXRfZ3JhZnRfZmlsZSkKKwkJc2V0dXBfZ2l0X2VudigpOworCXJldHVybiBnaXRfZ3JhZnRfZmlsZTsKK30KKworCmRpZmYgLS1naXQgYS9leGVjX2NtZC5jIGIvZXhlY19jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTUzOWQxCi0tLSAvZGV2L251bGwKKysrIGIvZXhlY19jbWQuYwpAQCAtMCwwICsxLDEzMCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNkZWZpbmUgTUFYX0FSR1MJMzIKKworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworc3RhdGljIGNvbnN0IGNoYXIgKmJ1aWx0aW5fZXhlY19wYXRoID0gR0lUX0VYRUNfUEFUSDsKK3N0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X2V4ZWNfcGF0aCA9IE5VTEw7CisKK3ZvaWQgZ2l0X3NldF9leGVjX3BhdGgoY29uc3QgY2hhciAqZXhlY19wYXRoKQoreworCWN1cnJlbnRfZXhlY19wYXRoID0gZXhlY19wYXRoOworfQorCisKKy8qIFJldHVybnMgdGhlIGhpZ2hlc3QtcHJpb3JpdHksIGxvY2F0aW9uIHRvIGxvb2sgZm9yIGdpdCBwcm9ncmFtcy4gKi8KK2NvbnN0IGNoYXIgKmdpdF9leGVjX3BhdGgodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnY7CisKKwlpZiAoY3VycmVudF9leGVjX3BhdGgpCisJCXJldHVybiBjdXJyZW50X2V4ZWNfcGF0aDsKKworCWVudiA9IGdldGVudigiR0lUX0VYRUNfUEFUSCIpOworCWlmIChlbnYgJiYgKmVudikgeworCQlyZXR1cm4gZW52OworCX0KKworCXJldHVybiBidWlsdGluX2V4ZWNfcGF0aDsKK30KKworCitpbnQgZXhlY3ZfZ2l0X2NtZChjb25zdCBjaGFyICoqYXJndikKK3sKKwljaGFyIGdpdF9jb21tYW5kW1BBVEhfTUFYICsgMV07CisJaW50IGk7CisJY29uc3QgY2hhciAqcGF0aHNbXSA9IHsgY3VycmVudF9leGVjX3BhdGgsCisJCQkJZ2V0ZW52KCJHSVRfRVhFQ19QQVRIIiksCisJCQkJYnVpbHRpbl9leGVjX3BhdGggfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhdGhzKTsgKytpKSB7CisJCXNpemVfdCBsZW47CisJCWludCByYzsKKwkJY29uc3QgY2hhciAqZXhlY19kaXIgPSBwYXRoc1tpXTsKKwkJY29uc3QgY2hhciAqdG1wOworCisJCWlmICghZXhlY19kaXIgfHwgISpleGVjX2RpcikgY29udGludWU7CisKKwkJaWYgKCpleGVjX2RpciAhPSAnLycpIHsKKwkJCWlmICghZ2V0Y3dkKGdpdF9jb21tYW5kLCBzaXplb2YoZ2l0X2NvbW1hbmQpKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiBjYW5ub3QgZGV0ZXJtaW5lICIKKwkJCQkJImN1cnJlbnQgZGlyZWN0b3J5OiAlc1xuIiwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9IHN0cmxlbihnaXRfY29tbWFuZCk7CisKKwkJCS8qIFRyaXZpYWwgY2xlYW51cCAqLworCQkJd2hpbGUgKCFzdHJuY21wKGV4ZWNfZGlyLCAiLi8iLCAyKSkgeworCQkJCWV4ZWNfZGlyICs9IDI7CisJCQkJd2hpbGUgKCpleGVjX2RpciA9PSAnLycpCisJCQkJCWV4ZWNfZGlyKys7CisJCQl9CisKKwkJCXJjID0gc25wcmludGYoZ2l0X2NvbW1hbmQgKyBsZW4sCisJCQkJICAgICAgc2l6ZW9mKGdpdF9jb21tYW5kKSAtIGxlbiwgIi8lcyIsCisJCQkJICAgICAgZXhlY19kaXIpOworCQkJaWYgKHJjIDwgMCB8fCByYyA+PSBzaXplb2YoZ2l0X2NvbW1hbmQpIC0gbGVuKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJnaXQ6IGNvbW1hbmQgbmFtZSBnaXZlbiAiCisJCQkJCSJpcyB0b28gbG9uZy5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0cmxlbihleGVjX2RpcikgKyAxID4gc2l6ZW9mKGdpdF9jb21tYW5kKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiBjb21tYW5kIG5hbWUgZ2l2ZW4gIgorCQkJCQkiaXMgdG9vIGxvbmcuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0cmNweShnaXRfY29tbWFuZCwgZXhlY19kaXIpOworCQl9CisKKwkJbGVuID0gc3RybGVuKGdpdF9jb21tYW5kKTsKKwkJcmMgPSBzbnByaW50ZihnaXRfY29tbWFuZCArIGxlbiwgc2l6ZW9mKGdpdF9jb21tYW5kKSAtIGxlbiwKKwkJCSAgICAgICIvZ2l0LSVzIiwgYXJndlswXSk7CisJCWlmIChyYyA8IDAgfHwgcmMgPj0gc2l6ZW9mKGdpdF9jb21tYW5kKSAtIGxlbikgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJImdpdDogY29tbWFuZCBuYW1lIGdpdmVuIGlzIHRvbyBsb25nLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGFyZ3ZbMF0gbXVzdCBiZSB0aGUgZ2l0IGNvbW1hbmQsIGJ1dCB0aGUgYXJndiBhcnJheQorCQkgKiBiZWxvbmdzIHRvIHRoZSBjYWxsZXIsIGFuZCBteSBiZSByZXVzZWQgaW4KKwkJICogc3Vic2VxdWVudCBsb29wIGl0ZXJhdGlvbnMuIFNhdmUgYXJndlswXSBhbmQKKwkJICogcmVzdG9yZSBpdCBvbiBlcnJvci4KKwkJICovCisKKwkJdG1wID0gYXJndlswXTsKKwkJYXJndlswXSA9IGdpdF9jb21tYW5kOworCisJCS8qIGV4ZWN2ZSgpIGNhbiBvbmx5IGV2ZXIgcmV0dXJuIGlmIGl0IGZhaWxzICovCisJCWV4ZWN2ZShnaXRfY29tbWFuZCwgKGNoYXIgKiopYXJndiwgZW52aXJvbik7CisKKwkJYXJndlswXSA9IHRtcDsKKwl9CisJcmV0dXJuIC0xOworCit9CisKKworaW50IGV4ZWNsX2dpdF9jbWQoY29uc3QgY2hhciAqY21kLC4uLikKK3sKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICphcmd2W01BWF9BUkdTICsgMV07CisJY29uc3QgY2hhciAqYXJnOworCXZhX2xpc3QgcGFyYW07CisKKwl2YV9zdGFydChwYXJhbSwgY21kKTsKKwlhcmd2WzBdID0gY21kOworCWFyZ2MgPSAxOworCXdoaWxlIChhcmdjIDwgTUFYX0FSR1MpIHsKKwkJYXJnID0gYXJndlthcmdjKytdID0gdmFfYXJnKHBhcmFtLCBjaGFyICopOworCQlpZiAoIWFyZykKKwkJCWJyZWFrOworCX0KKwl2YV9lbmQocGFyYW0pOworCWlmIChNQVhfQVJHUyA8PSBhcmdjKQorCQlyZXR1cm4gZXJyb3IoInRvbyBtYW55IGFyZ3MgdG8gcnVuICVzIiwgY21kKTsKKworCWFyZ3ZbYXJnY10gPSBOVUxMOworCXJldHVybiBleGVjdl9naXRfY21kKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvZXhlY19jbWQuaCBiL2V4ZWNfY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5NjIxZgotLS0gL2Rldi9udWxsCisrKyBiL2V4ZWNfY21kLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0dJVF9FWEVDX0NNRF9IXworI2RlZmluZSBfX0dJVF9FWEVDX0NNRF9IXworCitleHRlcm4gdm9pZCBnaXRfc2V0X2V4ZWNfcGF0aChjb25zdCBjaGFyICpleGVjX3BhdGgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIGdpdF9leGVjX3BhdGgodm9pZCk7CitleHRlcm4gaW50IGV4ZWN2X2dpdF9jbWQoY29uc3QgY2hhciAqKmFyZ3YpOyAvKiBOVUxMIHRlcm1pbmF0ZWQgKi8KK2V4dGVybiBpbnQgZXhlY2xfZ2l0X2NtZChjb25zdCBjaGFyICpjbWQsIC4uLik7CisKKworI2VuZGlmIC8qIF9fR0lUX0VYRUNfQ01EX0hfICovCmRpZmYgLS1naXQgYS9mZXRjaC1jbG9uZS5jIGIvZmV0Y2gtY2xvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFiM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZmV0Y2gtY2xvbmUuYwpAQCAtMCwwICsxLDIzOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK3N0YXRpYyBpbnQgZmluaXNoX3BhY2soY29uc3QgY2hhciAqcGFja190bXBfbmFtZSwgY29uc3QgY2hhciAqbWUpCit7CisJaW50IHBpcGVfZmRbMl07CisJcGlkX3QgcGlkOworCWNoYXIgaWR4W1BBVEhfTUFYXTsKKwljaGFyIGZpbmFsW1BBVEhfTUFYXTsKKwljaGFyIGhhc2hbNDFdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqY3A7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGlwZShwaXBlX2ZkKSA8IDApCisJCWRpZSgiJXM6IHVuYWJsZSB0byBzZXQgdXAgcGlwZSIsIG1lKTsKKworCXN0cmNweShpZHgsIHBhY2tfdG1wX25hbWUpOyAvKiAiLmdpdC9vYmplY3RzL3BhY2stWFhYWFhYIiAqLworCWNwID0gc3RycmNocihpZHgsICcvJyk7CisJbWVtY3B5KGNwLCAiL3BpZHgiLCA1KTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkKKwkJZGllKCJnaXQtY2xvbmUtcGFjazogdW5hYmxlIHRvIGZvcmsgb2ZmIGdpdC1pbmRleC1wYWNrIik7CisJaWYgKCFwaWQpIHsKKwkJY2xvc2UoMCk7CisJCWR1cDIocGlwZV9mZFsxXSwgMSk7CisJCWNsb3NlKHBpcGVfZmRbMF0pOworCQljbG9zZShwaXBlX2ZkWzFdKTsKKwkJZXhlY2xfZ2l0X2NtZCgiaW5kZXgtcGFjayIsICItbyIsIGlkeCwgcGFja190bXBfbmFtZSwgTlVMTCk7CisJCWVycm9yKCJjYW5ub3QgZXhlYyBnaXQtaW5kZXgtcGFjayA8JXM+IDwlcz4iLAorCQkgICAgICBpZHgsIHBhY2tfdG1wX25hbWUpOworCQlleGl0KDEpOworCX0KKwljbG9zZShwaXBlX2ZkWzFdKTsKKwlpZiAocmVhZChwaXBlX2ZkWzBdLCBoYXNoLCA0MCkgIT0gNDApIHsKKwkJZXJyb3IoIiVzOiB1bmFibGUgdG8gcmVhZCBmcm9tIGdpdC1pbmRleC1wYWNrIiwgbWUpOworCQllcnIgPSAxOworCX0KKwljbG9zZShwaXBlX2ZkWzBdKTsKKworCWZvciAoOzspIHsKKwkJaW50IHN0YXR1cywgY29kZTsKKwkJaW50IHJldHZhbCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKKworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IoIndhaXRwaWQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworCQkJZ290byBlcnJvcl9kaWU7CisJCX0KKwkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKwkJCWludCBzaWcgPSBXVEVSTVNJRyhzdGF0dXMpOworCQkJZXJyb3IoImdpdC1pbmRleC1wYWNrIGRpZWQgb2Ygc2lnbmFsICVkIiwgc2lnKTsKKwkJCWdvdG8gZXJyb3JfZGllOworCQl9CisJCWlmICghV0lGRVhJVEVEKHN0YXR1cykpIHsKKwkJCWVycm9yKCJnaXQtaW5kZXgtcGFjayBkaWVkIG9mIHVubmF0dXJhbCBjYXVzZXMgJWQiLAorCQkJICAgICAgc3RhdHVzKTsKKwkJCWdvdG8gZXJyb3JfZGllOworCQl9CisJCWNvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlpZiAoY29kZSkgeworCQkJZXJyb3IoImdpdC1pbmRleC1wYWNrIGRpZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgY29kZSk7CisJCQlnb3RvIGVycm9yX2RpZTsKKwkJfQorCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9kaWU7CisJCWJyZWFrOworCX0KKwloYXNoWzQwXSA9IDA7CisJaWYgKGdldF9zaGExX2hleChoYXNoLCBzaGExKSkgeworCQllcnJvcigiZ2l0LWluZGV4LXBhY2sgcmVwb3J0ZWQgbm9uc2Vuc2UgJyVzJyIsIGhhc2gpOworCQlnb3RvIGVycm9yX2RpZTsKKwl9CisJLyogTm93IHdlIGhhdmUgcGFjayBpbiBwYWNrX3RtcF9uYW1lW10sIGFuZAorCSAqIGlkeCBpbiBpZHhbXTsgcmVuYW1lIHRoZW0gdG8gdGhlaXIgZmluYWwgbmFtZXMuCisJICovCisJc25wcmludGYoZmluYWwsIHNpemVvZihmaW5hbCksCisJCSAiJXMvcGFjay9wYWNrLSVzLnBhY2siLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBoYXNoKTsKKwltb3ZlX3RlbXBfdG9fZmlsZShwYWNrX3RtcF9uYW1lLCBmaW5hbCk7CisJY2htb2QoZmluYWwsIDA0NDQpOworCXNucHJpbnRmKGZpbmFsLCBzaXplb2YoZmluYWwpLAorCQkgIiVzL3BhY2svcGFjay0lcy5pZHgiLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBoYXNoKTsKKwltb3ZlX3RlbXBfdG9fZmlsZShpZHgsIGZpbmFsKTsKKwljaG1vZChmaW5hbCwgMDQ0NCk7CisJcmV0dXJuIDA7CisKKyBlcnJvcl9kaWU6CisJdW5saW5rKGlkeCk7CisJdW5saW5rKHBhY2tfdG1wX25hbWUpOworCWV4aXQoMSk7Cit9CisKK2ludCByZWNlaXZlX3VucGFja19wYWNrKGludCBmZFsyXSwgY29uc3QgY2hhciAqbWUsIGludCBxdWlldCkKK3sKKwlpbnQgc3RhdHVzOworCXBpZF90IHBpZDsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkKKwkJZGllKCIlczogdW5hYmxlIHRvIGZvcmsgb2ZmIGdpdC11bnBhY2stb2JqZWN0cyIsIG1lKTsKKwlpZiAoIXBpZCkgeworCQlkdXAyKGZkWzBdLCAwKTsKKwkJY2xvc2UoZmRbMF0pOworCQljbG9zZShmZFsxXSk7CisJCWV4ZWNsX2dpdF9jbWQoInVucGFjay1vYmplY3RzIiwgcXVpZXQgPyAiLXEiIDogTlVMTCwgTlVMTCk7CisJCWRpZSgiZ2l0LXVucGFjay1vYmplY3RzIGV4ZWMgZmFpbGVkIik7CisJfQorCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJZGllKCJ3YWl0aW5nIGZvciBnaXQtdW5wYWNrLW9iamVjdHM6ICVzIiwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0KKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKwkJaW50IGNvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlpZiAoY29kZSkKKwkJCWRpZSgiZ2l0LXVucGFjay1vYmplY3RzIGRpZWQgd2l0aCBlcnJvciBjb2RlICVkIiwKKwkJCSAgICBjb2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisJCWludCBzaWcgPSBXVEVSTVNJRyhzdGF0dXMpOworCQlkaWUoImdpdC11bnBhY2stb2JqZWN0cyBkaWVkIG9mIHNpZ25hbCAlZCIsIHNpZyk7CisJfQorCWRpZSgiZ2l0LXVucGFjay1vYmplY3RzIGRpZWQgb2YgdW5uYXR1cmFsIGNhdXNlcyAlZCIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBXZSBhdmVyYWdlIG91dCB0aGUgZG93bmxvYWQgc3BlZWQgb3ZlciB0aGlzIG1hbnkgImV2ZW50cyIsIHdoZXJlCisgKiBhbiBldmVudCBpcyBhIG1pbmltdW0gb2YgYWJvdXQgaGFsZiBhIHNlY29uZC4gVGhhdCB3YXksIHdlIGdldAorICogYSByZWFzb25hYmx5IHN0YWJsZSBudW1iZXIuCisgKi8KKyNkZWZpbmUgTlJfQVZFUkFHRSAoNCkKKworLyoKKyAqIEEgImJpbmFyeSBtc2VjIiBpcyBhIHBvd2VyLW9mLXR3by1tc2VjLCBha2EgMS8xMDI0dGggb2YgYSBzZWNvbmQuCisgKiBLZWVpbmcgdGhlIHRpbWUgaW4gdGhhdCBmb3JtYXQgbWVhbnMgdGhhdCAiYnl0ZXMgLyBtc2VjcyIgbWVhbnMKKyAqIGlzIHRoZSBzYW1lIGFzIGtCL3MgKG1vZHVsbyByb3VuZGluZykuCisgKgorICogMTAwMDUxMiBpcyBhIG1hZ2ljIG51bWJlciAodXNlY3MgaW4gYSBzZWNvbmQsIHJvdW5kZWQgdXAgYnkgaGFsZgorICogb2YgMTAyNCwgdG8gbWFrZSAicm91bmRpbmciIGNvbWUgb3V0IHJpZ2h0IDspCisgKi8KKyNkZWZpbmUgdXNlY190b19iaW5hcnltc2VjKHgpICgoaW50KSh4KSAvICgxMDAwNTEyID4+IDEwKSkKKworaW50IHJlY2VpdmVfa2VlcF9wYWNrKGludCBmZFsyXSwgY29uc3QgY2hhciAqbWUsIGludCBxdWlldCkKK3sKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCBvZmQsIGlmZDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsOworCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBwcmV2X3R2OworCXN0cnVjdCBhdmVyYWdlIHsKKwkJdW5zaWduZWQgbG9uZyBieXRlczsKKwkJdW5zaWduZWQgbG9uZyB0aW1lOworCX0gZG93bmxvYWRbTlJfQVZFUkFHRV0gPSB7IHswLCAwfSwgfTsKKwl1bnNpZ25lZCBsb25nIGF2Z19ieXRlcywgYXZnX3RpbWU7CisJaW50IGlkeCA9IDA7CisKKwlpZmQgPSBmZFswXTsKKwlzbnByaW50Zih0bXBmaWxlLCBzaXplb2YodG1wZmlsZSksCisJCSAiJXMvcGFjay90bXAtWFhYWFhYIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJb2ZkID0gbWtzdGVtcCh0bXBmaWxlKTsKKwlpZiAob2ZkIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIiwgdG1wZmlsZSk7CisKKwlnZXR0aW1lb2ZkYXkoJnByZXZfdHYsIE5VTEwpOworCXRvdGFsID0gMDsKKwlhdmdfYnl0ZXMgPSAwOworCWF2Z190aW1lID0gMDsKKwl3aGlsZSAoMSkgeworCQljaGFyIGJ1Zls4MTkyXTsKKwkJc3NpemVfdCBzeiwgd3N6LCBwb3M7CisJCXN6ID0gcmVhZChpZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlpZiAoc3ogPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoc3ogPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKSB7CisJCQkJZXJyb3IoImVycm9yIHJlYWRpbmcgcGFjayAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbG9zZShvZmQpOworCQkJCXVubGluayh0bXBmaWxlKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzeiA9IDA7CisJCX0KKwkJcG9zID0gMDsKKwkJd2hpbGUgKHBvcyA8IHN6KSB7CisJCQl3c3ogPSB3cml0ZShvZmQsIGJ1ZiArIHBvcywgc3ogLSBwb3MpOworCQkJaWYgKHdzeiA8IDApIHsKKwkJCQllcnJvcigiZXJyb3Igd3JpdGluZyBwYWNrICglcykiLAorCQkJCSAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJY2xvc2Uob2ZkKTsKKwkJCQl1bmxpbmsodG1wZmlsZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcG9zICs9IHdzejsKKwkJfQorCQl0b3RhbCArPSBzejsKKwkJaWYgKCFxdWlldCkgeworCQkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdDsKKwkJCXN0cnVjdCB0aW1ldmFsIHR2OworCQkJdW5zaWduZWQgbG9uZyBkaWZmID0gdG90YWwgLSBsYXN0OworCQkJLyogbm90IHJlYWxseSAibXNlY3MiLCBidXQgYSBwb3dlci1vZi10d28gbWlsbGlzZWMgKDEvMTAyNHRoIG9mIGEgc2VjKSAqLworCQkJdW5zaWduZWQgbG9uZyBtc2VjczsKKworCQkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCQltc2VjcyA9IHR2LnR2X3NlYyAtIHByZXZfdHYudHZfc2VjOworCQkJbXNlY3MgPDw9IDEwOworCQkJbXNlY3MgKz0gdXNlY190b19iaW5hcnltc2VjKHR2LnR2X3VzZWMgLSBwcmV2X3R2LnR2X3VzZWMpOworCisJCQlpZiAobXNlY3MgPiA1MDApIHsKKwkJCQlwcmV2X3R2ID0gdHY7CisJCQkJbGFzdCA9IHRvdGFsOworCisJCQkJLyogVXBkYXRlIGF2ZXJhZ2VzIC4uKi8KKwkJCQlhdmdfYnl0ZXMgKz0gZGlmZjsKKwkJCQlhdmdfdGltZSArPSBtc2VjczsKKwkJCQlhdmdfYnl0ZXMgLT0gZG93bmxvYWRbaWR4XS5ieXRlczsKKwkJCQlhdmdfdGltZSAtPSBkb3dubG9hZFtpZHhdLnRpbWU7CisJCQkJZG93bmxvYWRbaWR4XS5ieXRlcyA9IGRpZmY7CisJCQkJZG93bmxvYWRbaWR4XS50aW1lID0gbXNlY3M7CisJCQkJaWR4Kys7CisJCQkJaWYgKGlkeCA+PSBOUl9BVkVSQUdFKQorCQkJCQlpZHggPSAwOworCisJCQkJZnByaW50ZihzdGRlcnIsICIlNGx1LiUwM2x1TUIgICglbHUga0IvcykgICAgICBcciIsCisJCQkJCXRvdGFsID4+IDIwLAorCQkJCQkxMDAwKigodG90YWwgPj4gMTApICYgMTAyMyk+PjEwLAorCQkJCQlhdmdfYnl0ZXMgLyBhdmdfdGltZSApOworCQkJfQorCQl9CisJfQorCWNsb3NlKG9mZCk7CisJcmV0dXJuIGZpbmlzaF9wYWNrKHRtcGZpbGUsIG1lKTsKK30KZGlmZiAtLWdpdCBhL2ZldGNoLXBhY2suYyBiL2ZldGNoLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFhOTNkCi0tLSAvZGV2L251bGwKKysrIGIvZmV0Y2gtcGFjay5jCkBAIC0wLDAgKzEsNTEyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworc3RhdGljIGludCBrZWVwX3BhY2s7CitzdGF0aWMgaW50IHF1aWV0Oworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBmZXRjaF9hbGw7CitzdGF0aWMgY29uc3QgY2hhciBmZXRjaF9wYWNrX3VzYWdlW10gPQorImdpdC1mZXRjaC1wYWNrIFstLWFsbF0gWy1xXSBbLXZdIFsta10gWy0tdGhpbl0gWy0tZXhlYz11cGxvYWQtcGFja10gW2hvc3Q6XWRpcmVjdG9yeSA8cmVmcz4uLi4iOworc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWMgPSAiZ2l0LXVwbG9hZC1wYWNrIjsKKworI2RlZmluZSBDT01QTEVURQkoMVUgPDwgMCkKKyNkZWZpbmUgQ09NTU9OCQkoMVUgPDwgMSkKKyNkZWZpbmUgQ09NTU9OX1JFRgkoMVUgPDwgMikKKyNkZWZpbmUgU0VFTgkJKDFVIDw8IDMpCisjZGVmaW5lIFBPUFBFRAkJKDFVIDw8IDQpCisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKnJldl9saXN0ID0gTlVMTDsKK3N0YXRpYyBpbnQgbm9uX2NvbW1vbl9yZXZzID0gMCwgbXVsdGlfYWNrID0gMCwgdXNlX3RoaW5fcGFjayA9IDA7CisKK3N0YXRpYyB2b2lkIHJldl9saXN0X3B1c2goc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgbWFyaykKK3sKKwlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIG1hcmspKSB7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IG1hcms7CisKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QucGFyc2VkKSkKKwkJCXBhcnNlX2NvbW1pdChjb21taXQpOworCisJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgJnJldl9saXN0KTsKKworCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIENPTU1PTikpCisJCQlub25fY29tbW9uX3JldnMrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmV2X2xpc3RfaW5zZXJ0X3JlZihjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm8gPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KHNoYTEpLCBwYXRoLCAwKTsKKworCWlmIChvICYmIG8tPnR5cGUgPT0gY29tbWl0X3R5cGUpCisJCXJldl9saXN0X3B1c2goKHN0cnVjdCBjb21taXQgKilvLCBTRUVOKTsKKworCXJldHVybiAwOworfQorCisvKgorICAgVGhpcyBmdW5jdGlvbiBtYXJrcyBhIHJldiBhbmQgaXRzIGFuY2VzdG9ycyBhcyBjb21tb24uCisgICBJbiBzb21lIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgdG8gbWFyayBvbmx5IHRoZSBhbmNlc3RvcnMgKGZvciBleGFtcGxlCisgICB3aGVuIG9ubHkgdGhlIHNlcnZlciBkb2VzIG5vdCB5ZXQga25vdyB0aGF0IHRoZXkgYXJlIGNvbW1vbikuCisqLworCitzdGF0aWMgdm9pZCBtYXJrX2NvbW1vbihzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCWludCBhbmNlc3RvcnNfb25seSwgaW50IGRvbnRfcGFyc2UpCit7CisJaWYgKGNvbW1pdCAhPSBOVUxMICYmICEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKSB7CisJCXN0cnVjdCBvYmplY3QgKm8gPSAoc3RydWN0IG9iamVjdCAqKWNvbW1pdDsKKworCQlpZiAoIWFuY2VzdG9yc19vbmx5KQorCQkJby0+ZmxhZ3MgfD0gQ09NTU9OOworCisJCWlmICghKG8tPmZsYWdzICYgU0VFTikpCisJCQlyZXZfbGlzdF9wdXNoKGNvbW1pdCwgU0VFTik7CisJCWVsc2UgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJCQlpZiAoIWFuY2VzdG9yc19vbmx5ICYmICEoby0+ZmxhZ3MgJiBQT1BQRUQpKQorCQkJCW5vbl9jb21tb25fcmV2cy0tOworCQkJaWYgKCFvLT5wYXJzZWQgJiYgIWRvbnRfcGFyc2UpCisJCQkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisKKwkJCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJCQkJcGFyZW50czsKKwkJCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQpCisJCQkJbWFya19jb21tb24ocGFyZW50cy0+aXRlbSwgMCwgZG9udF9wYXJzZSk7CisJCX0KKwl9Cit9CisKKy8qCisgIEdldCB0aGUgbmV4dCByZXYgdG8gc2VuZCwgaWdub3JpbmcgdGhlIGNvbW1vbi4KKyovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyKiBnZXRfcmV2KHZvaWQpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gTlVMTDsKKworCXdoaWxlIChjb21taXQgPT0gTlVMTCkgeworCQl1bnNpZ25lZCBpbnQgbWFyazsKKwkJc3RydWN0IGNvbW1pdF9saXN0KiBwYXJlbnRzOworCisJCWlmIChyZXZfbGlzdCA9PSBOVUxMIHx8IG5vbl9jb21tb25fcmV2cyA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJY29tbWl0ID0gcmV2X2xpc3QtPml0ZW07CisJCWlmICghKGNvbW1pdC0+b2JqZWN0LnBhcnNlZCkpCisJCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gUE9QUEVEOworCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIENPTU1PTikpCisJCQlub25fY29tbW9uX3JldnMtLTsKKwkKKwkJcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pIHsKKwkJCS8qIGRvIG5vdCBzZW5kICJoYXZlIiwgYW5kIGlnbm9yZSBhbmNlc3RvcnMgKi8KKwkJCWNvbW1pdCA9IE5VTEw7CisJCQltYXJrID0gQ09NTU9OIHwgU0VFTjsKKwkJfSBlbHNlIGlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIENPTU1PTl9SRUYpCisJCQkvKiBzZW5kICJoYXZlIiwgYW5kIGlnbm9yZSBhbmNlc3RvcnMgKi8KKwkJCW1hcmsgPSBDT01NT04gfCBTRUVOOworCQllbHNlCisJCQkvKiBzZW5kICJoYXZlIiwgYWxzbyBmb3IgaXRzIGFuY2VzdG9ycyAqLworCQkJbWFyayA9IFNFRU47CisKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCWlmICghKHBhcmVudHMtPml0ZW0tPm9iamVjdC5mbGFncyAmIFNFRU4pKQorCQkJCXJldl9saXN0X3B1c2gocGFyZW50cy0+aXRlbSwgbWFyayk7CisJCQlpZiAobWFyayAmIENPTU1PTikKKwkJCQltYXJrX2NvbW1vbihwYXJlbnRzLT5pdGVtLCAxLCAwKTsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQl9CisKKwkJcmV2X2xpc3QgPSByZXZfbGlzdC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gY29tbWl0LT5vYmplY3Quc2hhMTsKK30KKworc3RhdGljIGludCBmaW5kX2NvbW1vbihpbnQgZmRbMl0sIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExLAorCQkgICAgICAgc3RydWN0IHJlZiAqcmVmcykKK3sKKwlpbnQgZmV0Y2hpbmc7CisJaW50IGNvdW50ID0gMCwgZmx1c2hlcyA9IDAsIHJldHZhbDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCisJZm9yX2VhY2hfcmVmKHJldl9saXN0X2luc2VydF9yZWYpOworCisJZmV0Y2hpbmcgPSAwOworCWZvciAoIDsgcmVmcyA7IHJlZnMgPSByZWZzLT5uZXh0KSB7CisJCXVuc2lnbmVkIGNoYXIgKnJlbW90ZSA9IHJlZnMtPm9sZF9zaGExOworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJCS8qCisJCSAqIElmIHRoYXQgb2JqZWN0IGlzIGNvbXBsZXRlIChpLmUuIGl0IGlzIGFuIGFuY2VzdG9yIG9mIGEKKwkJICogbG9jYWwgcmVmKSwgd2UgdGVsbCB0aGVtIHdlIGhhdmUgaXQgYnV0IGRvIG5vdCBoYXZlIHRvCisJCSAqIHRlbGwgdGhlbSBhYm91dCBpdHMgYW5jZXN0b3JzLCB3aGljaCB0aGV5IGFscmVhZHkga25vdworCQkgKiBhYm91dC4KKwkJICoKKwkJICogV2UgdXNlIGxvb2t1cF9vYmplY3QgaGVyZSBiZWNhdXNlIHdlIGFyZSBvbmx5CisJCSAqIGludGVyZXN0ZWQgaW4gdGhlIGNhc2Ugd2UgKmtub3cqIHRoZSBvYmplY3QgaXMKKwkJICogcmVhY2hhYmxlIGFuZCB3ZSBoYXZlIGFscmVhZHkgc2Nhbm5lZCBpdC4KKwkJICovCisJCWlmICgoKG8gPSBsb29rdXBfb2JqZWN0KHJlbW90ZSkpICE9IE5VTEwpICYmCisJCQkJKG8tPmZsYWdzICYgQ09NUExFVEUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBhY2tldF93cml0ZShmZFsxXSwgIndhbnQgJXMlcyVzXG4iLCBzaGExX3RvX2hleChyZW1vdGUpLAorCQkJICAgICAobXVsdGlfYWNrID8gIiBtdWx0aV9hY2siIDogIiIpLAorCQkJICAgICAodXNlX3RoaW5fcGFjayA/ICIgdGhpbi1wYWNrIiA6ICIiKSk7CisJCWZldGNoaW5nKys7CisJfQorCXBhY2tldF9mbHVzaChmZFsxXSk7CisJaWYgKCFmZXRjaGluZykKKwkJcmV0dXJuIDE7CisKKwlmbHVzaGVzID0gMDsKKwlyZXR2YWwgPSAtMTsKKwl3aGlsZSAoKHNoYTEgPSBnZXRfcmV2KCkpKSB7CisJCXBhY2tldF93cml0ZShmZFsxXSwgImhhdmUgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJaWYgKHZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgImhhdmUgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJaWYgKCEoMzEgJiArK2NvdW50KSkgeworCQkJaW50IGFjazsKKworCQkJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKwkJCWZsdXNoZXMrKzsKKworCQkJLyoKKwkJCSAqIFdlIGtlZXAgb25lIHdpbmRvdyAiYWhlYWQiIG9mIHRoZSBvdGhlciBzaWRlLCBhbmQKKwkJCSAqIHdpbGwgd2FpdCBmb3IgYW4gQUNLIG9ubHkgb24gdGhlIG5leHQgb25lCisJCQkgKi8KKwkJCWlmIChjb3VudCA9PSAzMikKKwkJCQljb250aW51ZTsKKworCQkJZG8geworCQkJCWFjayA9IGdldF9hY2soZmRbMF0sIHJlc3VsdF9zaGExKTsKKwkJCQlpZiAodmVyYm9zZSAmJiBhY2spCisJCQkJCWZwcmludGYoc3RkZXJyLCAiZ290IGFjayAlZCAlc1xuIiwgYWNrLAorCQkJCQkJCXNoYTFfdG9faGV4KHJlc3VsdF9zaGExKSk7CisJCQkJaWYgKGFjayA9PSAxKSB7CisJCQkJCWZsdXNoZXMgPSAwOworCQkJCQltdWx0aV9hY2sgPSAwOworCQkJCQlyZXR2YWwgPSAwOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfSBlbHNlIGlmIChhY2sgPT0gMikgeworCQkJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPQorCQkJCQkJbG9va3VwX2NvbW1pdChyZXN1bHRfc2hhMSk7CisJCQkJCW1hcmtfY29tbW9uKGNvbW1pdCwgMCwgMSk7CisJCQkJCXJldHZhbCA9IDA7CisJCQkJfQorCQkJfSB3aGlsZSAoYWNrKTsKKwkJCWZsdXNoZXMtLTsKKwkJfQorCX0KK2RvbmU6CisJcGFja2V0X3dyaXRlKGZkWzFdLCAiZG9uZVxuIik7CisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiZG9uZVxuIik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCW11bHRpX2FjayA9IDA7CisJCWZsdXNoZXMrKzsKKwl9CisJd2hpbGUgKGZsdXNoZXMgfHwgbXVsdGlfYWNrKSB7CisJCWludCBhY2sgPSBnZXRfYWNrKGZkWzBdLCByZXN1bHRfc2hhMSk7CisJCWlmIChhY2spIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCWZwcmludGYoc3RkZXJyLCAiZ290IGFjayAoJWQpICVzXG4iLCBhY2ssCisJCQkJCXNoYTFfdG9faGV4KHJlc3VsdF9zaGExKSk7CisJCQlpZiAoYWNrID09IDEpCisJCQkJcmV0dXJuIDA7CisJCQltdWx0aV9hY2sgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJZmx1c2hlcy0tOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpjb21wbGV0ZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgbWFya19jb21wbGV0ZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisKKwl3aGlsZSAobyAmJiBvLT50eXBlID09IHRhZ190eXBlKSB7CisJCXN0cnVjdCB0YWcgKnQgPSAoc3RydWN0IHRhZyAqKSBvOworCQlpZiAoIXQtPnRhZ2dlZCkKKwkJCWJyZWFrOyAvKiBicm9rZW4gcmVwb3NpdG9yeSAqLworCQlvLT5mbGFncyB8PSBDT01QTEVURTsKKwkJbyA9IHBhcnNlX29iamVjdCh0LT50YWdnZWQtPnNoYTEpOworCX0KKwlpZiAobyAmJiBvLT50eXBlID09IGNvbW1pdF90eXBlKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopbzsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gQ09NUExFVEU7CisJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgJmNvbXBsZXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfcmVjZW50X2NvbXBsZXRlX2NvbW1pdHModW5zaWduZWQgbG9uZyBjdXRvZmYpCit7CisJd2hpbGUgKGNvbXBsZXRlICYmIGN1dG9mZiA8PSBjb21wbGV0ZS0+aXRlbS0+ZGF0ZSkgeworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiTWFya2luZyAlcyBhcyBjb21wbGV0ZVxuIiwKKwkJCQlzaGExX3RvX2hleChjb21wbGV0ZS0+aXRlbS0+b2JqZWN0LnNoYTEpKTsKKwkJcG9wX21vc3RfcmVjZW50X2NvbW1pdCgmY29tcGxldGUsIENPTVBMRVRFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9yZWZzKHN0cnVjdCByZWYgKipyZWZzLCBpbnQgbnJfbWF0Y2gsIGNoYXIgKiptYXRjaCkKK3sKKwlzdHJ1Y3QgcmVmICoqcmV0dXJuX3JlZnM7CisJc3RydWN0IHJlZiAqbmV3bGlzdCA9IE5VTEw7CisJc3RydWN0IHJlZiAqKm5ld3RhaWwgPSAmbmV3bGlzdDsKKwlzdHJ1Y3QgcmVmICpyZWYsICpuZXh0OworCXN0cnVjdCByZWYgKmZhc3RhcnJheVszMl07CisKKwlpZiAobnJfbWF0Y2ggJiYgIWZldGNoX2FsbCkgeworCQlpZiAoQVJSQVlfU0laRShmYXN0YXJyYXkpIDwgbnJfbWF0Y2gpCisJCQlyZXR1cm5fcmVmcyA9IHhjYWxsb2MobnJfbWF0Y2gsIHNpemVvZihzdHJ1Y3QgcmVmICopKTsKKwkJZWxzZSB7CisJCQlyZXR1cm5fcmVmcyA9IGZhc3RhcnJheTsKKwkJCW1lbXNldChyZXR1cm5fcmVmcywgMCwgc2l6ZW9mKHN0cnVjdCByZWYgKikgKiBucl9tYXRjaCk7CisJCX0KKwl9CisJZWxzZQorCQlyZXR1cm5fcmVmcyA9IE5VTEw7CisKKwlmb3IgKHJlZiA9ICpyZWZzOyByZWY7IHJlZiA9IG5leHQpIHsKKwkJbmV4dCA9IHJlZi0+bmV4dDsKKwkJaWYgKCFtZW1jbXAocmVmLT5uYW1lLCAicmVmcy8iLCA1KSAmJgorCQkgICAgY2hlY2tfcmVmX2Zvcm1hdChyZWYtPm5hbWUgKyA1KSkKKwkJCTsgLyogdHJhc2ggKi8KKwkJZWxzZSBpZiAoZmV0Y2hfYWxsKSB7CisJCQkqbmV3dGFpbCA9IHJlZjsKKwkJCXJlZi0+bmV4dCA9IE5VTEw7CisJCQluZXd0YWlsID0gJnJlZi0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgeworCQkJaW50IG9yZGVyID0gcGF0aF9tYXRjaChyZWYtPm5hbWUsIG5yX21hdGNoLCBtYXRjaCk7CisJCQlpZiAob3JkZXIpIHsKKwkJCQlyZXR1cm5fcmVmc1tvcmRlci0xXSA9IHJlZjsKKwkJCQljb250aW51ZTsgLyogd2Ugd2lsbCBsaW5rIGl0IGxhdGVyICovCisJCQl9CisJCX0KKwkJZnJlZShyZWYpOworCX0KKworCWlmICghZmV0Y2hfYWxsKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfbWF0Y2g7IGkrKykgeworCQkJcmVmID0gcmV0dXJuX3JlZnNbaV07CisJCQlpZiAocmVmKSB7CisJCQkJKm5ld3RhaWwgPSByZWY7CisJCQkJcmVmLT5uZXh0ID0gTlVMTDsKKwkJCQluZXd0YWlsID0gJnJlZi0+bmV4dDsKKwkJCX0KKwkJfQorCQlpZiAocmV0dXJuX3JlZnMgIT0gZmFzdGFycmF5KQorCQkJZnJlZShyZXR1cm5fcmVmcyk7CisJfQorCSpyZWZzID0gbmV3bGlzdDsKK30KKworc3RhdGljIGludCBldmVyeXRoaW5nX2xvY2FsKHN0cnVjdCByZWYgKipyZWZzLCBpbnQgbnJfbWF0Y2gsIGNoYXIgKiptYXRjaCkKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGN1dG9mZiA9IDA7CisKKwl0cmFja19vYmplY3RfcmVmcyA9IDA7CisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKworCWZvciAocmVmID0gKnJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCXN0cnVjdCBvYmplY3QgKm87CisKKwkJbyA9IHBhcnNlX29iamVjdChyZWYtPm9sZF9zaGExKTsKKwkJaWYgKCFvKQorCQkJY29udGludWU7CisKKwkJLyogV2UgYWxyZWFkeSBoYXZlIGl0IC0tIHdoaWNoIG1heSBtZWFuIHRoYXQgd2Ugd2VyZQorCQkgKiBpbiBzeW5jIHdpdGggdGhlIG90aGVyIHNpZGUgYXQgc29tZSB0aW1lIGFmdGVyCisJCSAqIHRoYXQgKGl0IGlzIE9LIGlmIHdlIGd1ZXNzIHdyb25nIGhlcmUpLgorCQkgKi8KKwkJaWYgKG8tPnR5cGUgPT0gY29tbWl0X3R5cGUpIHsKKwkJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopbzsKKwkJCWlmICghY3V0b2ZmIHx8IGN1dG9mZiA8IGNvbW1pdC0+ZGF0ZSkKKwkJCQljdXRvZmYgPSBjb21taXQtPmRhdGU7CisJCX0KKwl9CisKKwlmb3JfZWFjaF9yZWYobWFya19jb21wbGV0ZSk7CisJaWYgKGN1dG9mZikKKwkJbWFya19yZWNlbnRfY29tcGxldGVfY29tbWl0cyhjdXRvZmYpOworCisJLyoKKwkgKiBNYXJrIGFsbCBjb21wbGV0ZSByZW1vdGUgcmVmcyBhcyBjb21tb24gcmVmcy4KKwkgKiBEb24ndCBtYXJrIHRoZW0gY29tbW9uIHlldDsgdGhlIHNlcnZlciBoYXMgdG8gYmUgdG9sZCBzbyBmaXJzdC4KKwkgKi8KKwlmb3IgKHJlZiA9ICpyZWZzOyByZWY7IHJlZiA9IHJlZi0+bmV4dCkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvID0gZGVyZWZfdGFnKGxvb2t1cF9vYmplY3QocmVmLT5vbGRfc2hhMSksCisJCQkJCSAgICAgTlVMTCwgMCk7CisKKwkJaWYgKCFvIHx8IG8tPnR5cGUgIT0gY29tbWl0X3R5cGUgfHwgIShvLT5mbGFncyAmIENPTVBMRVRFKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG8tPmZsYWdzICYgU0VFTikpIHsKKwkJCXJldl9saXN0X3B1c2goKHN0cnVjdCBjb21taXQgKilvLCBDT01NT05fUkVGIHwgU0VFTik7CisKKwkJCW1hcmtfY29tbW9uKChzdHJ1Y3QgY29tbWl0ICopbywgMSwgMSk7CisJCX0KKwl9CisKKwlmaWx0ZXJfcmVmcyhyZWZzLCBucl9tYXRjaCwgbWF0Y2gpOworCisJZm9yIChyZXR2YWwgPSAxLCByZWYgPSAqcmVmczsgcmVmIDsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlbW90ZSA9IHJlZi0+b2xkX3NoYTE7CisJCXVuc2lnbmVkIGNoYXIgbG9jYWxbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJCW8gPSBsb29rdXBfb2JqZWN0KHJlbW90ZSk7CisJCWlmICghbyB8fCAhKG8tPmZsYWdzICYgQ09NUExFVEUpKSB7CisJCQlyZXR2YWwgPSAwOworCQkJaWYgKCF2ZXJib3NlKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIndhbnQgJXMgKCVzKVxuIiwgc2hhMV90b19oZXgocmVtb3RlKSwKKwkJCQlyZWYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQltZW1jcHkocmVmLT5uZXdfc2hhMSwgbG9jYWwsIDIwKTsKKwkJaWYgKCF2ZXJib3NlKQorCQkJY29udGludWU7CisJCWZwcmludGYoc3RkZXJyLAorCQkJImFscmVhZHkgaGF2ZSAlcyAoJXMpXG4iLCBzaGExX3RvX2hleChyZW1vdGUpLAorCQkJcmVmLT5uYW1lKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBmZXRjaF9wYWNrKGludCBmZFsyXSwgaW50IG5yX21hdGNoLCBjaGFyICoqbWF0Y2gpCit7CisJc3RydWN0IHJlZiAqcmVmOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHN0YXR1czsKKworCWdldF9yZW1vdGVfaGVhZHMoZmRbMF0sICZyZWYsIDAsIE5VTEwsIDApOworCWlmIChzZXJ2ZXJfc3VwcG9ydHMoIm11bHRpX2FjayIpKSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJTZXJ2ZXIgc3VwcG9ydHMgbXVsdGlfYWNrXG4iKTsKKwkJbXVsdGlfYWNrID0gMTsKKwl9CisJaWYgKCFyZWYpIHsKKwkJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKwkJZGllKCJubyBtYXRjaGluZyByZW1vdGUgaGVhZCIpOworCX0KKwlpZiAoZXZlcnl0aGluZ19sb2NhbCgmcmVmLCBucl9tYXRjaCwgbWF0Y2gpKSB7CisJCXBhY2tldF9mbHVzaChmZFsxXSk7CisJCWdvdG8gYWxsX2RvbmU7CisJfQorCWlmIChmaW5kX2NvbW1vbihmZCwgc2hhMSwgcmVmKSA8IDApCisJCWlmICgha2VlcF9wYWNrKQorCQkJLyogV2hlbiBjbG9uaW5nLCBpdCBpcyBub3QgdW51c3VhbCB0byBoYXZlCisJCQkgKiBubyBjb21tb24gY29tbWl0LgorCQkJICovCisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IG5vIGNvbW1vbiBjb21taXRzXG4iKTsKKworCWlmIChrZWVwX3BhY2spCisJCXN0YXR1cyA9IHJlY2VpdmVfa2VlcF9wYWNrKGZkLCAiZ2l0LWZldGNoLXBhY2siLCBxdWlldCk7CisJZWxzZQorCQlzdGF0dXMgPSByZWNlaXZlX3VucGFja19wYWNrKGZkLCAiZ2l0LWZldGNoLXBhY2siLCBxdWlldCk7CisKKwlpZiAoc3RhdHVzKQorCQlkaWUoImdpdC1mZXRjaC1wYWNrOiBmZXRjaCBmYWlsZWQuIik7CisKKyBhbGxfZG9uZToKKwl3aGlsZSAocmVmKSB7CisJCXByaW50ZigiJXMgJXNcbiIsCisJCSAgICAgICBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSwgcmVmLT5uYW1lKTsKKwkJcmVmID0gcmVmLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCByZXQsIG5yX2hlYWRzOworCWNoYXIgKmRlc3QgPSBOVUxMLCAqKmhlYWRzOworCWludCBmZFsyXTsKKwlwaWRfdCBwaWQ7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlucl9oZWFkcyA9IDA7CisJaGVhZHMgPSBOVUxMOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RybmNtcCgiLS1leGVjPSIsIGFyZywgNykpIHsKKwkJCQlleGVjID0gYXJnICsgNzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLXF1aWV0IiwgYXJnKSB8fCAhc3RyY21wKCItcSIsIGFyZykpIHsKKwkJCQlxdWlldCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1rZWVwIiwgYXJnKSB8fCAhc3RyY21wKCItayIsIGFyZykpIHsKKwkJCQlrZWVwX3BhY2sgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tdGhpbiIsIGFyZykpIHsKKwkJCQl1c2VfdGhpbl9wYWNrID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWFsbCIsIGFyZykpIHsKKwkJCQlmZXRjaF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi12IiwgYXJnKSkgeworCQkJCXZlcmJvc2UgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2UoZmV0Y2hfcGFja191c2FnZSk7CisJCX0KKwkJZGVzdCA9IGFyZzsKKwkJaGVhZHMgPSBhcmd2ICsgaSArIDE7CisJCW5yX2hlYWRzID0gYXJnYyAtIGkgLSAxOworCQlicmVhazsKKwl9CisJaWYgKCFkZXN0KQorCQl1c2FnZShmZXRjaF9wYWNrX3VzYWdlKTsKKwlpZiAoa2VlcF9wYWNrKQorCQl1c2VfdGhpbl9wYWNrID0gMDsKKwlwaWQgPSBnaXRfY29ubmVjdChmZCwgZGVzdCwgZXhlYyk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiAxOworCXJldCA9IGZldGNoX3BhY2soZmQsIG5yX2hlYWRzLCBoZWFkcyk7CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKKwlmaW5pc2hfY29ubmVjdChwaWQpOworCisJaWYgKCFyZXQgJiYgbnJfaGVhZHMpIHsKKwkJLyogSWYgdGhlIGhlYWRzIHRvIHB1bGwgd2VyZSBnaXZlbiwgd2Ugc2hvdWxkIGhhdmUKKwkJICogY29uc3VtZWQgYWxsIG9mIHRoZW0gYnkgbWF0Y2hpbmcgdGhlIHJlbW90ZS4KKwkJICogT3RoZXJ3aXNlLCAnZ2l0LWZldGNoIHJlbW90ZSBuby1zdWNoLXJlZicgd291bGQKKwkJICogc2lsZW50bHkgc3VjY2VlZCB3aXRob3V0IGlzc3VpbmcgYW4gZXJyb3IuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnJfaGVhZHM7IGkrKykKKwkJCWlmIChoZWFkc1tpXSAmJiBoZWFkc1tpXVswXSkgeworCQkJCWVycm9yKCJubyBzdWNoIHJlbW90ZSByZWYgJXMiLCBoZWFkc1tpXSk7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmV0Y2guYyBiL2ZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2Yzk5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZldGNoLmMKQEAgLTAsMCArMSwyNjggQEAKKyNpbmNsdWRlICJmZXRjaC5oIgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworY29uc3QgY2hhciAqd3JpdGVfcmVmID0gTlVMTDsKK2NvbnN0IGNoYXIgKndyaXRlX3JlZl9sb2dfZGV0YWlscyA9IE5VTEw7CisKK2ludCBnZXRfdHJlZSA9IDA7CitpbnQgZ2V0X2hpc3RvcnkgPSAwOworaW50IGdldF9hbGwgPSAwOworaW50IGdldF92ZXJib3NlbHkgPSAwOworaW50IGdldF9yZWNvdmVyID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGN1cnJlbnRfY29tbWl0X3NoYTFbMjBdOworCit2b2lkIHB1bGxfc2F5KGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqaGV4KSAKK3sKKwlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsIGZtdCwgaGV4KTsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X21pc3NpbmcoY29uc3QgY2hhciAqd2hhdCwgY29uc3QgdW5zaWduZWQgY2hhciAqbWlzc2luZykKK3sKKwljaGFyIG1pc3NpbmdfaGV4WzQxXTsKKworCXN0cmNweShtaXNzaW5nX2hleCwgc2hhMV90b19oZXgobWlzc2luZykpOzsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIkNhbm5vdCBvYnRhaW4gbmVlZGVkICVzICVzXG53aGlsZSBwcm9jZXNzaW5nIGNvbW1pdCAlcy5cbiIsCisJCXdoYXQsIG1pc3NpbmdfaGV4LCBzaGExX3RvX2hleChjdXJyZW50X2NvbW1pdF9zaGExKSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2VzcyhzdHJ1Y3Qgb2JqZWN0ICpvYmopOworCitzdGF0aWMgaW50IHByb2Nlc3NfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSkKKwkJcmV0dXJuIC0xOworCisJZGVzYy5idWYgPSB0cmVlLT5idWZmZXI7CisJZGVzYy5zaXplID0gdHJlZS0+c2l6ZTsKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBOVUxMOworCisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKSB7CisJCQlzdHJ1Y3QgdHJlZSAqdHJlZSA9IGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpOworCQkJaWYgKHRyZWUpCisJCQkJb2JqID0gJnRyZWUtPm9iamVjdDsKKwkJfQorCQllbHNlIHsKKwkJCXN0cnVjdCBibG9iICpibG9iID0gbG9va3VwX2Jsb2IoZW50cnkuc2hhMSk7CisJCQlpZiAoYmxvYikKKwkJCQlvYmogPSAmYmxvYi0+b2JqZWN0OworCQl9CisJCWlmICghb2JqIHx8IHByb2Nlc3Mob2JqKSkKKwkJCXJldHVybiAtMTsKKwl9CisJZnJlZSh0cmVlLT5idWZmZXIpOworCXRyZWUtPmJ1ZmZlciA9IE5VTEw7CisJdHJlZS0+c2l6ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ09NUExFVEUJKDFVIDw8IDApCisjZGVmaW5lIFNFRU4JCSgxVSA8PCAxKQorI2RlZmluZSBUT19TQ0FOCQkoMVUgPDwgMikKKworc3RhdGljIHN0cnVjdCBjb21taXRfbGlzdCAqY29tcGxldGUgPSBOVUxMOworCitzdGF0aWMgaW50IHByb2Nlc3NfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCXJldHVybiAtMTsKKworCXdoaWxlIChjb21wbGV0ZSAmJiBjb21wbGV0ZS0+aXRlbS0+ZGF0ZSA+PSBjb21taXQtPmRhdGUpIHsKKwkJcG9wX21vc3RfcmVjZW50X2NvbW1pdCgmY29tcGxldGUsIENPTVBMRVRFKTsKKwl9CisKKwlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01QTEVURSkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoY3VycmVudF9jb21taXRfc2hhMSwgY29tbWl0LT5vYmplY3Quc2hhMSwgMjApOworCisJcHVsbF9zYXkoIndhbGsgJXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKworCWlmIChnZXRfdHJlZSkgeworCQlpZiAocHJvY2VzcygmY29tbWl0LT50cmVlLT5vYmplY3QpKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIWdldF9hbGwpCisJCQlnZXRfdHJlZSA9IDA7CisJfQorCWlmIChnZXRfaGlzdG9yeSkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCWZvciAoOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQkJaWYgKHByb2Nlc3MoJnBhcmVudHMtPml0ZW0tPm9iamVjdCkpCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdGFnKHN0cnVjdCB0YWcgKnRhZykKK3sKKwlpZiAocGFyc2VfdGFnKHRhZykpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcHJvY2Vzcyh0YWctPnRhZ2dlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKnByb2Nlc3NfcXVldWUgPSBOVUxMOworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKnByb2Nlc3NfcXVldWVfZW5kID0gJnByb2Nlc3NfcXVldWU7CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqKQoreworCWlmIChvYmotPnR5cGUgPT0gY29tbWl0X3R5cGUpIHsKKwkJaWYgKHByb2Nlc3NfY29tbWl0KChzdHJ1Y3QgY29tbWl0ICopb2JqKSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvYmotPnR5cGUgPT0gdHJlZV90eXBlKSB7CisJCWlmIChwcm9jZXNzX3RyZWUoKHN0cnVjdCB0cmVlICopb2JqKSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvYmotPnR5cGUgPT0gYmxvYl90eXBlKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAob2JqLT50eXBlID09IHRhZ190eXBlKSB7CisJCWlmIChwcm9jZXNzX3RhZygoc3RydWN0IHRhZyAqKW9iaikpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBkZXRlcm1pbmUgcmVxdWlyZW1lbnRzICIKKwkJICAgICAib2YgdHlwZSAlcyBmb3IgJXMiLAorCQkgICAgIG9iai0+dHlwZSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2VzcyhzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm4gMDsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisKKwlpZiAoaGFzX3NoYTFfZmlsZShvYmotPnNoYTEpKSB7CisJCS8qIFdlIGFscmVhZHkgaGF2ZSBpdCwgc28gd2Ugc2hvdWxkIHNjYW4gaXQgbm93LiAqLworCQlvYmotPmZsYWdzIHw9IFRPX1NDQU47CisJfQorCWVsc2UgeworCQlpZiAob2JqLT5mbGFncyAmIENPTVBMRVRFKQorCQkJcmV0dXJuIDA7CisJCXByZWZldGNoKG9iai0+c2hhMSk7CisJfQorCQkKKwlvYmplY3RfbGlzdF9pbnNlcnQob2JqLCBwcm9jZXNzX3F1ZXVlX2VuZCk7CisJcHJvY2Vzc19xdWV1ZV9lbmQgPSAmKCpwcm9jZXNzX3F1ZXVlX2VuZCktPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9vcCh2b2lkKQoreworCXN0cnVjdCBvYmplY3RfbGlzdCAqZWxlbTsKKworCXdoaWxlIChwcm9jZXNzX3F1ZXVlKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IHByb2Nlc3NfcXVldWUtPml0ZW07CisJCWVsZW0gPSBwcm9jZXNzX3F1ZXVlOworCQlwcm9jZXNzX3F1ZXVlID0gZWxlbS0+bmV4dDsKKwkJZnJlZShlbGVtKTsKKwkJaWYgKCFwcm9jZXNzX3F1ZXVlKQorCQkJcHJvY2Vzc19xdWV1ZV9lbmQgPSAmcHJvY2Vzc19xdWV1ZTsKKworCQkvKiBJZiB3ZSBhcmUgbm90IHNjYW5uaW5nIHRoaXMgb2JqZWN0LCB3ZSBwbGFjZWQgaXQgaW4KKwkJICogdGhlIHF1ZXVlIGJlY2F1c2Ugd2UgbmVlZGVkIHRvIGZldGNoIGl0IGZpcnN0LgorCQkgKi8KKwkJaWYgKCEgKG9iai0+ZmxhZ3MgJiBUT19TQ0FOKSkgeworCQkJaWYgKGZldGNoKG9iai0+c2hhMSkpIHsKKwkJCQlyZXBvcnRfbWlzc2luZyhvYmotPnR5cGUKKwkJCQkJICAgICAgID8gb2JqLT50eXBlCisJCQkJCSAgICAgICA6ICJvYmplY3QiLCBvYmotPnNoYTEpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoIW9iai0+dHlwZSkKKwkJCXBhcnNlX29iamVjdChvYmotPnNoYTEpOworCQlpZiAocHJvY2Vzc19vYmplY3Qob2JqKSkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZXJwcmV0X3RhcmdldChjaGFyICp0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKCFnZXRfc2hhMV9oZXgodGFyZ2V0LCBzaGExKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFjaGVja19yZWZfZm9ybWF0KHRhcmdldCkpIHsKKwkJaWYgKCFmZXRjaF9yZWYodGFyZ2V0LCBzaGExKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG1hcmtfY29tcGxldGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJaWYgKGNvbW1pdCkgeworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBDT01QTEVURTsKKwkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmY29tcGxldGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHB1bGwoY2hhciAqdGFyZ2V0KQoreworCXN0cnVjdCByZWZfbG9jayAqbG9jayA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICptc2c7CisJaW50IHJldDsKKworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisJdHJhY2tfb2JqZWN0X3JlZnMgPSAwOworCWlmICh3cml0ZV9yZWYpIHsKKwkJbG9jayA9IGxvY2tfcmVmX3NoYTEod3JpdGVfcmVmLCBOVUxMLCAwKTsKKwkJaWYgKCFsb2NrKSB7CisJCQllcnJvcigiQ2FuJ3QgbG9jayByZWYgJXMiLCB3cml0ZV9yZWYpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKCFnZXRfcmVjb3ZlcikKKwkJZm9yX2VhY2hfcmVmKG1hcmtfY29tcGxldGUpOworCisJaWYgKGludGVycHJldF90YXJnZXQodGFyZ2V0LCBzaGExKSkgeworCQllcnJvcigiQ291bGQgbm90IGludGVycHJldCAlcyBhcyBzb21ldGhpbmcgdG8gcHVsbCIsIHRhcmdldCk7CisJCWlmIChsb2NrKQorCQkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocHJvY2Vzcyhsb29rdXBfdW5rbm93bl9vYmplY3Qoc2hhMSkpKSB7CisJCWlmIChsb2NrKQorCQkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobG9vcCgpKSB7CisJCWlmIChsb2NrKQorCQkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh3cml0ZV9yZWYpIHsKKwkJaWYgKHdyaXRlX3JlZl9sb2dfZGV0YWlscykgeworCQkJbXNnID0geG1hbGxvYyhzdHJsZW4od3JpdGVfcmVmX2xvZ19kZXRhaWxzKSArIDEyKTsKKwkJCXNwcmludGYobXNnLCAiZmV0Y2ggZnJvbSAlcyIsIHdyaXRlX3JlZl9sb2dfZGV0YWlscyk7CisJCX0KKwkJZWxzZQorCQkJbXNnID0gTlVMTDsKKwkJcmV0ID0gd3JpdGVfcmVmX3NoYTEobG9jaywgc2hhMSwgbXNnID8gbXNnIDogImZldGNoICh1bmtub3duKSIpOworCQlpZiAobXNnKQorCQkJZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZldGNoLmggYi9mZXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWJiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9mZXRjaC5oCkBAIC0wLDAgKzEsNTEgQEAKKyNpZm5kZWYgUFVMTF9ICisjZGVmaW5lIFBVTExfSAorCisvKgorICogRmV0Y2ggb2JqZWN0IGdpdmVuIFNIQTEgZnJvbSB0aGUgcmVtb3RlLCBhbmQgc3RvcmUgaXQgbG9jYWxseSB1bmRlcgorICogR0lUX09CSkVDVF9ESVJFQ1RPUlkuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLiAgVG8gYmUKKyAqIHByb3ZpZGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLgorICovCitleHRlcm4gaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKgorICogRmV0Y2ggdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHN0b3JlIGl0IGxvY2FsbHk7IGZldGNoKCkgd2lsbCBiZQorICogY2FsbGVkIGxhdGVyIHRvIGRldGVybWluZSBzdWNjZXNzLiBUbyBiZSBwcm92aWRlZCBieSB0aGUgcGFydGljdWxhcgorICogaW1wbGVtZW50YXRpb24uCisgKi8KK2V4dGVybiB2b2lkIHByZWZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKgorICogRmV0Y2ggcmVmIChyZWxhdGl2ZSB0byAkR0lUX0RJUi9yZWZzKSBmcm9tIHRoZSByZW1vdGUsIGFuZCBzdG9yZQorICogdGhlIDIwLWJ5dGUgU0hBMSBpbiBzaGExLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4gIFRvCisgKiBiZSBwcm92aWRlZCBieSB0aGUgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi4KKyAqLworZXh0ZXJuIGludCBmZXRjaF9yZWYoY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworLyogSWYgc2V0LCB0aGUgcmVmIGZpbGVuYW1lIHRvIHdyaXRlIHRoZSB0YXJnZXQgdmFsdWUgdG8uICovCitleHRlcm4gY29uc3QgY2hhciAqd3JpdGVfcmVmOworCisvKiBJZiBzZXQgYWRkaXRpb25hbCB0ZXh0IHdpbGwgYXBwZWFyIGluIHRoZSByZWYgbG9nLiAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKndyaXRlX3JlZl9sb2dfZGV0YWlsczsKKworLyogU2V0IHRvIGZldGNoIHRoZSB0YXJnZXQgdHJlZS4gKi8KK2V4dGVybiBpbnQgZ2V0X3RyZWU7CisKKy8qIFNldCB0byBmZXRjaCB0aGUgY29tbWl0IGhpc3RvcnkuICovCitleHRlcm4gaW50IGdldF9oaXN0b3J5OworCisvKiBTZXQgdG8gZmV0Y2ggdGhlIHRyZWVzIGluIHRoZSBjb21taXQgaGlzdG9yeS4gKi8KK2V4dGVybiBpbnQgZ2V0X2FsbDsKKworLyogU2V0IHRvIGJlIHZlcmJvc2UgKi8KK2V4dGVybiBpbnQgZ2V0X3ZlcmJvc2VseTsKKworLyogU2V0IHRvIGNoZWNrIG9uIGFsbCByZWFjaGFibGUgb2JqZWN0cy4gKi8KK2V4dGVybiBpbnQgZ2V0X3JlY292ZXI7CisKKy8qIFJlcG9ydCB3aGF0IHdlIGdvdCB1bmRlciBnZXRfdmVyYm9zZWx5ICovCitleHRlcm4gdm9pZCBwdWxsX3NheShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBpbnQgcHVsbChjaGFyICp0YXJnZXQpOworCisjZW5kaWYgLyogUFVMTF9IICovCmRpZmYgLS1naXQgYS9mc2NrLW9iamVjdHMuYyBiL2ZzY2stb2JqZWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzY2UzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mc2NrLW9iamVjdHMuYwpAQCAtMCwwICsxLDU5NyBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorCisjZGVmaW5lIFJFQUNIQUJMRSAweDAwMDEKKyNkZWZpbmUgU0VFTiAgICAgIDB4MDAwMgorCitzdGF0aWMgaW50IHNob3dfcm9vdCA9IDA7CitzdGF0aWMgaW50IHNob3dfdGFncyA9IDA7CitzdGF0aWMgaW50IHNob3dfdW5yZWFjaGFibGUgPSAwOworc3RhdGljIGludCBjaGVja19mdWxsID0gMDsKK3N0YXRpYyBpbnQgY2hlY2tfc3RyaWN0ID0gMDsKK3N0YXRpYyBpbnQga2VlcF9jYWNoZV9vYmplY3RzID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisKKyNpZmRlZiBOT19EX0lOT19JTl9ESVJFTlQKKyNkZWZpbmUgU09SVF9ESVJFTlQgMAorI2RlZmluZSBESVJFTlRfU09SVF9ISU5UKGRlKSAwCisjZWxzZQorI2RlZmluZSBTT1JUX0RJUkVOVCAxCisjZGVmaW5lIERJUkVOVF9TT1JUX0hJTlQoZGUpICgoZGUpLT5kX2lubykKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvYmpyZXBvcnQoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCWZwcmludGYoc3RkZXJyLCAiJXMgaW4gJXMgJXM6ICIsCisJICAgICAgICBzZXZlcml0eSwgb2JqLT50eXBlLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwl2ZnByaW50ZihzdGRlcnIsIGVyciwgcGFyYW1zKTsKKwlmcHV0cygiXG4iLCBzdGRlcnIpOworfQorCitzdGF0aWMgaW50IG9iamVycm9yKHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCW9ianJlcG9ydChvYmosICJlcnJvciIsIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgb2Jqd2FybmluZyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwlvYmpyZXBvcnQob2JqLCAid2FybmluZyIsIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tfY29ubmVjdGl2aXR5KHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBMb29rIHVwIGFsbCB0aGUgcmVxdWlyZW1lbnRzLCB3YXJuIGFib3V0IG1pc3Npbmcgb2JqZWN0cy4uICovCisJZm9yIChpID0gMDsgaSA8IG9ial9hbGxvY3M7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBvYmpzW2ldOworCisJCWlmICghb2JqKQorCQkJY29udGludWU7CisKKwkJaWYgKCFvYmotPnBhcnNlZCkgeworCQkJaWYgKGhhc19zaGExX2ZpbGUob2JqLT5zaGExKSkKKwkJCQk7IC8qIGl0IGlzIGluIHBhY2sgKi8KKwkJCWVsc2UKKwkJCQlwcmludGYoIm1pc3NpbmcgJXMgJXNcbiIsCisJCQkJICAgICAgIG9iai0+dHlwZSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChvYmotPnJlZnMpIHsKKwkJCWNvbnN0IHN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcyA9IG9iai0+cmVmczsKKwkJCXVuc2lnbmVkIGo7CisJCQlmb3IgKGogPSAwOyBqIDwgcmVmcy0+Y291bnQ7IGorKykgeworCQkJCXN0cnVjdCBvYmplY3QgKnJlZiA9IHJlZnMtPnJlZltqXTsKKwkJCQlpZiAocmVmLT5wYXJzZWQgfHwKKwkJCQkgICAgKGhhc19zaGExX2ZpbGUocmVmLT5zaGExKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXByaW50ZigiYnJva2VuIGxpbmsgZnJvbSAlN3MgJXNcbiIsCisJCQkJICAgICAgIG9iai0+dHlwZSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCQkJcHJpbnRmKCIgICAgICAgICAgICAgIHRvICU3cyAlc1xuIiwKKwkJCQkgICAgICAgcmVmLT50eXBlLCBzaGExX3RvX2hleChyZWYtPnNoYTEpKTsKKwkJCX0KKwkJfQorCisJCWlmIChzaG93X3VucmVhY2hhYmxlICYmICEob2JqLT5mbGFncyAmIFJFQUNIQUJMRSkpIHsKKwkJCXByaW50ZigidW5yZWFjaGFibGUgJXMgJXNcbiIsCisJCQkgICAgICAgb2JqLT50eXBlLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFvYmotPnVzZWQpIHsKKwkJCXByaW50ZigiZGFuZ2xpbmcgJXMgJXNcbiIsIG9iai0+dHlwZSwgCisJCQkgICAgICAgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgZW50cmllcyBpbiBhIHRyZWUgYXJlIG9yZGVyZWQgaW4gdGhlIF9wYXRoXyBvcmRlciwKKyAqIHdoaWNoIG1lYW5zIHRoYXQgYSBkaXJlY3RvcnkgZW50cnkgaXMgb3JkZXJlZCBieSBhZGRpbmcKKyAqIGEgc2xhc2ggdG8gdGhlIGVuZCBvZiBpdC4KKyAqCisgKiBTbyBhIGRpcmVjdG9yeSBjYWxsZWQgImEiIGlzIG9yZGVyZWQgX2FmdGVyXyBhIGZpbGUKKyAqIGNhbGxlZCAiYS5jIiwgYmVjYXVzZSAiYS8iIHNvcnRzIGFmdGVyICJhLmMiLgorICovCisjZGVmaW5lIFRSRUVfVU5PUkRFUkVEICgtMSkKKyNkZWZpbmUgVFJFRV9IQVNfRFVQUyAgKC0yKQorCitzdGF0aWMgaW50IHZlcmlmeV9vcmRlcmVkKHVuc2lnbmVkIG1vZGUxLCBjb25zdCBjaGFyICpuYW1lMSwgdW5zaWduZWQgbW9kZTIsIGNvbnN0IGNoYXIgKm5hbWUyKQoreworCWludCBsZW4xID0gc3RybGVuKG5hbWUxKTsKKwlpbnQgbGVuMiA9IHN0cmxlbihuYW1lMik7CisJaW50IGxlbiA9IGxlbjEgPCBsZW4yID8gbGVuMSA6IGxlbjI7CisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisJaW50IGNtcDsKKworCWNtcCA9IG1lbWNtcChuYW1lMSwgbmFtZTIsIGxlbik7CisJaWYgKGNtcCA8IDApCisJCXJldHVybiAwOworCWlmIChjbXAgPiAwKQorCQlyZXR1cm4gVFJFRV9VTk9SREVSRUQ7CisKKwkvKgorCSAqIE9rLCB0aGUgZmlyc3QgPGxlbj4gY2hhcmFjdGVycyBhcmUgdGhlIHNhbWUuCisJICogTm93IHdlIG5lZWQgdG8gb3JkZXIgdGhlIG5leHQgb25lLCBidXQgdHVybgorCSAqIGEgJ1wwJyBpbnRvIGEgJy8nIGZvciBhIGRpcmVjdG9yeSBlbnRyeS4KKwkgKi8KKwljMSA9IG5hbWUxW2xlbl07CisJYzIgPSBuYW1lMltsZW5dOworCWlmICghYzEgJiYgIWMyKQorCQkvKgorCQkgKiBnaXQtd3JpdGUtdHJlZSB1c2VkIHRvIHdyaXRlIG91dCBhIG5vbnNlbnNlIHRyZWUgdGhhdCBoYXMKKwkJICogZW50cmllcyB3aXRoIHRoZSBzYW1lIG5hbWUsIG9uZSBibG9iIGFuZCBvbmUgdHJlZS4gIE1ha2UKKwkJICogc3VyZSB3ZSBkbyBub3QgaGF2ZSBkdXBsaWNhdGUgZW50cmllcy4KKwkJICovCisJCXJldHVybiBUUkVFX0hBU19EVVBTOworCWlmICghYzEgJiYgU19JU0RJUihtb2RlMSkpCisJCWMxID0gJy8nOworCWlmICghYzIgJiYgU19JU0RJUihtb2RlMikpCisJCWMyID0gJy8nOworCXJldHVybiBjMSA8IGMyID8gMCA6IFRSRUVfVU5PUkRFUkVEOworfQorCitzdGF0aWMgaW50IGZzY2tfdHJlZShzdHJ1Y3QgdHJlZSAqaXRlbSkKK3sKKwlpbnQgcmV0dmFsOworCWludCBoYXNfZnVsbF9wYXRoID0gMDsKKwlpbnQgaGFzX3plcm9fcGFkID0gMDsKKwlpbnQgaGFzX2JhZF9tb2RlcyA9IDA7CisJaW50IGhhc19kdXBfZW50cmllcyA9IDA7CisJaW50IG5vdF9wcm9wZXJseV9zb3J0ZWQgPSAwOworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwl1bnNpZ25lZCBvX21vZGU7CisJY29uc3QgY2hhciAqb19uYW1lOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9fc2hhMTsKKworCWRlc2MuYnVmID0gaXRlbS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IGl0ZW0tPnNpemU7CisKKwlvX21vZGUgPSAwOworCW9fbmFtZSA9IE5VTEw7CisJb19zaGExID0gTlVMTDsKKwl3aGlsZSAoZGVzYy5zaXplKSB7CisJCXVuc2lnbmVkIG1vZGU7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7CisKKwkJc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdCgmZGVzYywgJm5hbWUsICZtb2RlKTsKKworCQlpZiAoc3RyY2hyKG5hbWUsICcvJykpCisJCQloYXNfZnVsbF9wYXRoID0gMTsKKwkJaGFzX3plcm9fcGFkIHw9ICooY2hhciAqKWRlc2MuYnVmID09ICcwJzsKKwkJdXBkYXRlX3RyZWVfZW50cnkoJmRlc2MpOworCisJCXN3aXRjaCAobW9kZSkgeworCQkvKgorCQkgKiBTdGFuZGFyZCBtb2Rlcy4uCisJCSAqLworCQljYXNlIFNfSUZSRUcgfCAwNzU1OgorCQljYXNlIFNfSUZSRUcgfCAwNjQ0OgorCQljYXNlIFNfSUZMTks6CisJCWNhc2UgU19JRkRJUjoKKwkJCWJyZWFrOworCQkvKgorCQkgKiBUaGlzIGlzIG5vbnN0YW5kYXJkLCBidXQgd2UgaGFkIGEgZmV3IG9mIHRoZXNlCisJCSAqIGVhcmx5IG9uIHdoZW4gd2UgaG9ub3JlZCB0aGUgZnVsbCBzZXQgb2YgbW9kZQorCQkgKiBiaXRzLi4KKwkJICovCisJCWNhc2UgU19JRlJFRyB8IDA2NjQ6CisJCQlpZiAoIWNoZWNrX3N0cmljdCkKKwkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhhc19iYWRfbW9kZXMgPSAxOworCQl9CisKKwkJaWYgKG9fbmFtZSkgeworCQkJc3dpdGNoICh2ZXJpZnlfb3JkZXJlZChvX21vZGUsIG9fbmFtZSwgbW9kZSwgbmFtZSkpIHsKKwkJCWNhc2UgVFJFRV9VTk9SREVSRUQ6CisJCQkJbm90X3Byb3Blcmx5X3NvcnRlZCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFRSRUVfSEFTX0RVUFM6CisJCQkJaGFzX2R1cF9lbnRyaWVzID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlvX21vZGUgPSBtb2RlOworCQlvX25hbWUgPSBuYW1lOworCQlvX3NoYTEgPSBzaGExOworCX0KKwlmcmVlKGl0ZW0tPmJ1ZmZlcik7CisJaXRlbS0+YnVmZmVyID0gTlVMTDsKKworCXJldHZhbCA9IDA7CisJaWYgKGhhc19mdWxsX3BhdGgpIHsKKwkJb2Jqd2FybmluZygmaXRlbS0+b2JqZWN0LCAiY29udGFpbnMgZnVsbCBwYXRobmFtZXMiKTsKKwl9CisJaWYgKGhhc196ZXJvX3BhZCkgeworCQlvYmp3YXJuaW5nKCZpdGVtLT5vYmplY3QsICJjb250YWlucyB6ZXJvLXBhZGRlZCBmaWxlIG1vZGVzIik7CisJfQorCWlmIChoYXNfYmFkX21vZGVzKSB7CisJCW9iandhcm5pbmcoJml0ZW0tPm9iamVjdCwgImNvbnRhaW5zIGJhZCBmaWxlIG1vZGVzIik7CisJfQorCWlmIChoYXNfZHVwX2VudHJpZXMpIHsKKwkJcmV0dmFsID0gb2JqZXJyb3IoJml0ZW0tPm9iamVjdCwgImNvbnRhaW5zIGR1cGxpY2F0ZSBmaWxlIGVudHJpZXMiKTsKKwl9CisJaWYgKG5vdF9wcm9wZXJseV9zb3J0ZWQpIHsKKwkJcmV0dmFsID0gb2JqZXJyb3IoJml0ZW0tPm9iamVjdCwgIm5vdCBwcm9wZXJseSBzb3J0ZWQiKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBmc2NrX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJY2hhciAqYnVmZmVyID0gY29tbWl0LT5idWZmZXI7CisJdW5zaWduZWQgY2hhciB0cmVlX3NoYTFbMjBdLCBzaGExWzIwXTsKKworCWlmIChtZW1jbXAoYnVmZmVyLCAidHJlZSAiLCA1KSkKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImludmFsaWQgZm9ybWF0IC0gZXhwZWN0ZWQgJ3RyZWUnIGxpbmUiKTsKKwlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZmZlcis1LCB0cmVlX3NoYTEpIHx8IGJ1ZmZlcls0NV0gIT0gJ1xuJykKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImludmFsaWQgJ3RyZWUnIGxpbmUgZm9ybWF0IC0gYmFkIHNoYTEiKTsKKwlidWZmZXIgKz0gNDY7CisJd2hpbGUgKCFtZW1jbXAoYnVmZmVyLCAicGFyZW50ICIsIDcpKSB7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmZmVyKzcsIHNoYTEpIHx8IGJ1ZmZlcls0N10gIT0gJ1xuJykKKwkJCXJldHVybiBvYmplcnJvcigmY29tbWl0LT5vYmplY3QsICJpbnZhbGlkICdwYXJlbnQnIGxpbmUgZm9ybWF0IC0gYmFkIHNoYTEiKTsKKwkJYnVmZmVyICs9IDQ4OworCX0KKwlpZiAobWVtY21wKGJ1ZmZlciwgImF1dGhvciAiLCA3KSkKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImludmFsaWQgZm9ybWF0IC0gZXhwZWN0ZWQgJ2F1dGhvcicgbGluZSIpOworCWZyZWUoY29tbWl0LT5idWZmZXIpOworCWNvbW1pdC0+YnVmZmVyID0gTlVMTDsKKwlpZiAoIWNvbW1pdC0+dHJlZSkKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImNvdWxkIG5vdCBsb2FkIGNvbW1pdCdzIHRyZWUgJXMiLCB0cmVlX3NoYTEpOworCWlmICghY29tbWl0LT5wYXJlbnRzICYmIHNob3dfcm9vdCkKKwkJcHJpbnRmKCJyb290ICVzXG4iLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJaWYgKCFjb21taXQtPmRhdGUpCisJCXByaW50ZigiYmFkIGNvbW1pdCBkYXRlIGluICVzXG4iLCAKKwkJICAgICAgIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2NrX3RhZyhzdHJ1Y3QgdGFnICp0YWcpCit7CisJc3RydWN0IG9iamVjdCAqdGFnZ2VkID0gdGFnLT50YWdnZWQ7CisKKwlpZiAoIXRhZ2dlZCkgeworCQlyZXR1cm4gb2JqZXJyb3IoJnRhZy0+b2JqZWN0LCAiY291bGQgbm90IGxvYWQgdGFnZ2VkIG9iamVjdCIpOworCX0KKwlpZiAoIXNob3dfdGFncykKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoInRhZ2dlZCAlcyAlcyIsIHRhZ2dlZC0+dHlwZSwgc2hhMV90b19oZXgodGFnZ2VkLT5zaGExKSk7CisJcHJpbnRmKCIgKCVzKSBpbiAlc1xuIiwgdGFnLT50YWcsIHNoYTFfdG9faGV4KHRhZy0+b2JqZWN0LnNoYTEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2NrX3NoYTEodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCXJldHVybiBlcnJvcigiJXM6IG9iamVjdCBub3QgZm91bmQiLCBzaGExX3RvX2hleChzaGExKSk7CisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm4gMDsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJaWYgKG9iai0+dHlwZSA9PSBibG9iX3R5cGUpCisJCXJldHVybiAwOworCWlmIChvYmotPnR5cGUgPT0gdHJlZV90eXBlKQorCQlyZXR1cm4gZnNja190cmVlKChzdHJ1Y3QgdHJlZSAqKSBvYmopOworCWlmIChvYmotPnR5cGUgPT0gY29tbWl0X3R5cGUpCisJCXJldHVybiBmc2NrX2NvbW1pdCgoc3RydWN0IGNvbW1pdCAqKSBvYmopOworCWlmIChvYmotPnR5cGUgPT0gdGFnX3R5cGUpCisJCXJldHVybiBmc2NrX3RhZygoc3RydWN0IHRhZyAqKSBvYmopOworCS8qIEJ5IG5vdywgcGFyc2Vfb2JqZWN0KCkgd291bGQndmUgcmV0dXJuZWQgTlVMTCBpbnN0ZWFkLiAqLworCXJldHVybiBvYmplcnJvcihvYmosICJ1bmtub3duIHR5cGUgJyVzJyAoaW50ZXJuYWwgZnNjayBlcnJvcikiLCBvYmotPnR5cGUpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgc29ydGluZyBjaHVuayBzaXplOiBtYWtlIGl0IHJlYXNvbmFibHkKKyAqIGJpZyBzbyB0aGF0IHdlIGNhbiBzb3J0IHdlbGwuLgorICovCisjZGVmaW5lIE1BWF9TSEExX0VOVFJJRVMgKDEwMjQpCisKK3N0cnVjdCBzaGExX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIGlubzsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworfTsKKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBucjsKKwlzdHJ1Y3Qgc2hhMV9lbnRyeSAqZW50cnlbTUFYX1NIQTFfRU5UUklFU107Cit9IHNoYTFfbGlzdDsKKworc3RhdGljIGludCBpbm9fY29tcGFyZShjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJY29uc3Qgc3RydWN0IHNoYTFfZW50cnkgKmEgPSBfYSwgKmIgPSBfYjsKKwl1bnNpZ25lZCBsb25nIGlubzEgPSBhLT5pbm8sIGlubzIgPSBiLT5pbm87CisJcmV0dXJuIGlubzEgPCBpbm8yID8gLTEgOiBpbm8xID4gaW5vMiA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBmc2NrX3NoYTFfbGlzdCh2b2lkKQoreworCWludCBpLCBuciA9IHNoYTFfbGlzdC5ucjsKKworCWlmIChTT1JUX0RJUkVOVCkKKwkJcXNvcnQoc2hhMV9saXN0LmVudHJ5LCBuciwKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBzaGExX2VudHJ5ICopLCBpbm9fY29tcGFyZSk7CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJc3RydWN0IHNoYTFfZW50cnkgKmVudHJ5ID0gc2hhMV9saXN0LmVudHJ5W2ldOworCQl1bnNpZ25lZCBjaGFyICpzaGExID0gZW50cnktPnNoYTE7CisKKwkJc2hhMV9saXN0LmVudHJ5W2ldID0gTlVMTDsKKwkJZnNja19zaGExKHNoYTEpOworCQlmcmVlKGVudHJ5KTsKKwl9CisJc2hhMV9saXN0Lm5yID0gMDsKK30KKworc3RhdGljIHZvaWQgYWRkX3NoYTFfbGlzdCh1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBsb25nIGlubykKK3sKKwlzdHJ1Y3Qgc2hhMV9lbnRyeSAqZW50cnkgPSB4bWFsbG9jKHNpemVvZigqZW50cnkpKTsKKwlpbnQgbnI7CisKKwllbnRyeS0+aW5vID0gaW5vOworCW1lbWNweShlbnRyeS0+c2hhMSwgc2hhMSwgMjApOworCW5yID0gc2hhMV9saXN0Lm5yOworCWlmIChuciA9PSBNQVhfU0hBMV9FTlRSSUVTKSB7CisJCWZzY2tfc2hhMV9saXN0KCk7CisJCW5yID0gMDsKKwl9CisJc2hhMV9saXN0LmVudHJ5W25yXSA9IGVudHJ5OworCXNoYTFfbGlzdC5uciA9ICsrbnI7Cit9CisKK3N0YXRpYyBpbnQgZnNja19kaXIoaW50IGksIGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFkaXIpCisJCXJldHVybiAwOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQljaGFyIG5hbWVbMTAwXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJaW50IGxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKworCQlzd2l0Y2ggKGxlbikgeworCQljYXNlIDI6CisJCQlpZiAoZGUtPmRfbmFtZVsxXSAhPSAnLicpCisJCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmIChkZS0+ZF9uYW1lWzBdICE9ICcuJykKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlIDM4OgorCQkJc3ByaW50ZihuYW1lLCAiJTAyeCIsIGkpOworCQkJbWVtY3B5KG5hbWUrMiwgZGUtPmRfbmFtZSwgbGVuKzEpOworCQkJaWYgKGdldF9zaGExX2hleChuYW1lLCBzaGExKSA8IDApCisJCQkJYnJlYWs7CisJCQlhZGRfc2hhMV9saXN0KHNoYTEsIERJUkVOVF9TT1JUX0hJTlQoZGUpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiYmFkIHNoYTEgZmlsZTogJXMvJXNcbiIsIHBhdGgsIGRlLT5kX25hbWUpOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfcmVmcyA9IDA7CisKK3N0YXRpYyBpbnQgZnNja19oYW5kbGVfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqOworCisJb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikgeworCQlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSkgeworCQkJZGVmYXVsdF9yZWZzKys7CisJCQlyZXR1cm4gMDsgLyogaXQgaXMgaW4gYSBwYWNrICovCisJCX0KKwkJZXJyb3IoIiVzOiBpbnZhbGlkIHNoYTEgcG9pbnRlciAlcyIsIHJlZm5hbWUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJLyogV2UnbGwgY29udGludWUgd2l0aCB0aGUgcmVzdCBkZXNwaXRlIHRoZSBlcnJvci4uICovCisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0X3JlZnMrKzsKKwlvYmotPnVzZWQgPSAxOworCW1hcmtfcmVhY2hhYmxlKG9iaiwgUkVBQ0hBQkxFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RlZmF1bHRfaGVhZHModm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoZnNja19oYW5kbGVfcmVmKTsKKwlpZiAoIWRlZmF1bHRfcmVmcykKKwkJZGllKCJObyBkZWZhdWx0IHJlZmVyZW5jZXMiKTsKK30KKworc3RhdGljIHZvaWQgZnNja19vYmplY3RfZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0YXRpYyBjaGFyIGRpcls0MDk2XTsKKwkJc3ByaW50ZihkaXIsICIlcy8lMDJ4IiwgcGF0aCwgaSk7CisJCWZzY2tfZGlyKGksIGRpcik7CisJfQorCWZzY2tfc2hhMV9saXN0KCk7Cit9CisKK3N0YXRpYyBpbnQgZnNja19oZWFkX2xpbmsodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKmdpdF9IRUFEID0gc3RyZHVwKGdpdF9wYXRoKCJIRUFEIikpOworCWNvbnN0IGNoYXIgKmdpdF9yZWZzX2hlYWRzX21hc3RlciA9IHJlc29sdmVfcmVmKGdpdF9IRUFELCBzaGExLCAxKTsKKwlpbnQgcGZ4bGVuID0gc3RybGVuKGdpdF9IRUFEKSAtIDQ7IC8qIHN0cmlwIC4uLi8uZ2l0LyBwYXJ0ICovCisKKwlpZiAoIWdpdF9yZWZzX2hlYWRzX21hc3RlcikKKwkJcmV0dXJuIGVycm9yKCJIRUFEIGlzIG5vdCBhIHN5bWJvbGljIHJlZiIpOworCWlmIChzdHJuY21wKGdpdF9yZWZzX2hlYWRzX21hc3RlciArIHBmeGxlbiwgInJlZnMvaGVhZHMvIiwgMTEpKQorCQlyZXR1cm4gZXJyb3IoIkhFQUQgcG9pbnRzIHRvIHNvbWV0aGluZyBzdHJhbmdlICglcykiLAorCQkJICAgICBnaXRfcmVmc19oZWFkc19tYXN0ZXIgKyBwZnhsZW4pOworCWlmICghbWVtY21wKG51bGxfc2hhMSwgc2hhMSwgMjApKQorCQlyZXR1cm4gZXJyb3IoIkhFQUQ6IG5vdCBhIHZhbGlkIGdpdCBwb2ludGVyIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNja19jYWNoZV90cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3QoaXQtPnNoYTEpOworCQlpZiAoIW9iaikgeworCQkJZXJyb3IoIiVzOiBpbnZhbGlkIHNoYTEgcG9pbnRlciBpbiBjYWNoZS10cmVlIiwKKwkJCSAgICAgIHNoYTFfdG9faGV4KGl0LT5zaGExKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQltYXJrX3JlYWNoYWJsZShvYmosIFJFQUNIQUJMRSk7CisJCW9iai0+dXNlZCA9IDE7CisJCWlmIChvYmotPnR5cGUgIT0gdHJlZV90eXBlKQorCQkJZXJyIHw9IG9iamVycm9yKG9iaiwgIm5vbi10cmVlIGluIGNhY2hlLXRyZWUiKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspCisJCWVyciB8PSBmc2NrX2NhY2hlX3RyZWUoaXQtPmRvd25baV0tPmNhY2hlX3RyZWUpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgaGVhZHM7CisKKwl0cmFja19vYmplY3RfcmVmcyA9IDE7CisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICghc3RyY21wKGFyZywgIi0tdW5yZWFjaGFibGUiKSkgeworCQkJc2hvd191bnJlYWNoYWJsZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXRhZ3MiKSkgeworCQkJc2hvd190YWdzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tcm9vdCIpKSB7CisJCQlzaG93X3Jvb3QgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZSIpKSB7CisJCQlrZWVwX2NhY2hlX29iamVjdHMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mdWxsIikpIHsKKwkJCWNoZWNrX2Z1bGwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdHJpY3QiKSkgeworCQkJY2hlY2tfc3RyaWN0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqYXJnID09ICctJykKKwkJCXVzYWdlKCJnaXQtZnNjay1vYmplY3RzIFstLXRhZ3NdIFstLXJvb3RdIFtbLS11bnJlYWNoYWJsZV0gWy0tY2FjaGVdIFstLWZ1bGxdIFstLXN0cmljdF0gPGhlYWQtc2hhMT4qXSIpOworCX0KKworCWZzY2tfaGVhZF9saW5rKCk7CisJZnNja19vYmplY3RfZGlyKGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCWlmIChjaGVja19mdWxsKSB7CisJCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICphbHQ7CisJCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCQlwcmVwYXJlX2FsdF9vZGIoKTsKKwkJZm9yIChhbHQgPSBhbHRfb2RiX2xpc3Q7IGFsdDsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCQljaGFyIG5hbWVidWZbUEFUSF9NQVhdOworCQkJaW50IG5hbWVsZW4gPSBhbHQtPm5hbWUgLSBhbHQtPmJhc2U7CisJCQltZW1jcHkobmFtZWJ1ZiwgYWx0LT5iYXNlLCBuYW1lbGVuKTsKKwkJCW5hbWVidWZbbmFtZWxlbiAtIDFdID0gMDsKKwkJCWZzY2tfb2JqZWN0X2RpcihuYW1lYnVmKTsKKwkJfQorCQlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwkJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpCisJCQkvKiB2ZXJpZnkgZ2l2ZXMgZXJyb3IgbWVzc2FnZXMgaXRzZWxmICovCisJCQl2ZXJpZnlfcGFjayhwLCAwKTsKKworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJaW50IG51bSA9IG51bV9wYWNrZWRfb2JqZWN0cyhwKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCQkJbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBpLCBzaGExKTsKKwkJCQlmc2NrX3NoYTEoc2hhMSk7CisJCQl9CisJCX0KKwl9CisKKwloZWFkcyA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOyAKKworCQlpZiAoKmFyZyA9PSAnLScpCisJCQljb250aW51ZTsKKworCQlpZiAoIWdldF9zaGExKGFyZywgaGVhZF9zaGExKSkgeworCQkJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChoZWFkX3NoYTEpOworCisJCQkvKiBFcnJvciBpcyBwcmludGVkIGJ5IGxvb2t1cF9vYmplY3QoKS4gKi8KKwkJCWlmICghb2JqKQorCQkJCWNvbnRpbnVlOworCisJCQlvYmotPnVzZWQgPSAxOworCQkJbWFya19yZWFjaGFibGUob2JqLCBSRUFDSEFCTEUpOworCQkJaGVhZHMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVycm9yKCJpbnZhbGlkIHBhcmFtZXRlcjogZXhwZWN0ZWQgc2hhMSwgZ290ICclcyciLCBhcmcpOworCX0KKworCS8qCisJICogSWYgd2UndmUgbm90IGJlZW4gZ2l2ZW4gYW55IGV4cGxpY2l0IGhlYWQgaW5mb3JtYXRpb24sIGRvIHRoZQorCSAqIGRlZmF1bHQgb25lcyBmcm9tIC5naXQvcmVmcy4gV2UgYWxzbyBjb25zaWRlciB0aGUgaW5kZXggZmlsZQorCSAqIGluIHRoaXMgY2FzZSAoaWUgdGhpcyBpbXBsaWVzIC0tY2FjaGUpLgorCSAqLworCWlmICghaGVhZHMpIHsKKwkJZ2V0X2RlZmF1bHRfaGVhZHMoKTsKKwkJa2VlcF9jYWNoZV9vYmplY3RzID0gMTsKKwl9CisKKwlpZiAoa2VlcF9jYWNoZV9vYmplY3RzKSB7CisJCWludCBpOworCQlyZWFkX2NhY2hlKCk7CisJCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQkJc3RydWN0IGJsb2IgKmJsb2IgPSBsb29rdXBfYmxvYihhY3RpdmVfY2FjaGVbaV0tPnNoYTEpOworCQkJc3RydWN0IG9iamVjdCAqb2JqOworCQkJaWYgKCFibG9iKQorCQkJCWNvbnRpbnVlOworCQkJb2JqID0gJmJsb2ItPm9iamVjdDsKKwkJCW9iai0+dXNlZCA9IDE7CisJCQltYXJrX3JlYWNoYWJsZShvYmosIFJFQUNIQUJMRSk7CisJCX0KKwkJaWYgKGFjdGl2ZV9jYWNoZV90cmVlKQorCQkJZnNja19jYWNoZV90cmVlKGFjdGl2ZV9jYWNoZV90cmVlKTsKKwl9CisKKwljaGVja19jb25uZWN0aXZpdHkoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dlbmVyYXRlLWNtZGxpc3Quc2ggYi9nZW5lcmF0ZS1jbWRsaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjMWVkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5lcmF0ZS1jbWRsaXN0LnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorCitlY2hvICIvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAkMCAqLworc3RydWN0IGNtZG5hbWVfaGVscAoreworICAgIGNoYXIgbmFtZVsxNl07CisgICAgY2hhciBoZWxwWzY0XTsKK307CisKK3N0cnVjdCBjbWRuYW1lX2hlbHAgY29tbW9uX2NtZHNbXSA9IHsiCisKK3NvcnQgPDxcRU9GIHwKK2FkZAorYXBwbHkKK2Jpc2VjdAorYnJhbmNoCitjaGVja291dAorY2hlcnJ5LXBpY2sKK2Nsb25lCitjb21taXQKK2RpZmYKK2ZldGNoCitncmVwCitpbml0LWRiCitsb2cKK21lcmdlCittdgorcHJ1bmUKK3B1bGwKK3B1c2gKK3JlYmFzZQorcmVzZXQKK3JldmVydAorcm0KK3Nob3cKK3Nob3ctYnJhbmNoCitzdGF0dXMKK3RhZwordmVyaWZ5LXRhZworRU9GCit3aGlsZSByZWFkIGNtZAorZG8KKyAgICAgc2VkIC1uICcKKyAgICAgL05BTUUvLC9naXQtJyIkY21kIicvSAorICAgICAkeworICAgICAgICAgICAgeAorICAgICAgICAgICAgcy8uKmdpdC0nIiRjbWQiJyAtIFwoLipcKS8gIHsiJyIkY21kIiciLCAiXDEifSwvCisJICAgIHAKKyAgICAgfScgIkRvY3VtZW50YXRpb24vZ2l0LSRjbWQudHh0IgorZG9uZQorZWNobyAifTsiCmRpZmYgLS1naXQgYS9naXQtYW0uc2ggYi9naXQtYW0uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDIzMmUyNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1hbS5zaApAQCAtMCwwICsxLDQyNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBKdW5pbyBDIEhhbWFubworCitVU0FHRT0nWy0tc2lnbm9mZl0gWy0tZG90ZXN0PTxkaXI+XSBbLS11dGY4XSBbLS1iaW5hcnldIFstLTN3YXldCisgIFstLWludGVyYWN0aXZlXSBbLS13aGl0ZXNwYWNlPTxvcHRpb24+XSA8bWJveD4uLi4KKyAgb3IsIHdoZW4gcmVzdW1pbmcgWy0tc2tpcCB8IC0tcmVzb2x2ZWRdJworLiBnaXQtc2gtc2V0dXAKKworZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwgZXhpdAorCitzdG9wX2hlcmUgKCkgeworICAgIGVjaG8gIiQxIiA+IiRkb3Rlc3QvbmV4dCIKKyAgICBleGl0IDEKK30KKworc3RvcF9oZXJlX3VzZXJfcmVzb2x2ZSAoKSB7CisgICAgaWYgWyAtbiAiJHJlc29sdmVtc2ciIF07IHRoZW4KKwkgICAgZWNobyAiJHJlc29sdmVtc2ciCisJICAgIHN0b3BfaGVyZSAkMQorICAgIGZpCisgICAgY21kbGluZT0kKGJhc2VuYW1lICQwKQorICAgIGlmIHRlc3QgJycgIT0gIiRpbnRlcmFjdGl2ZSIKKyAgICB0aGVuCisgICAgICAgIGNtZGxpbmU9IiRjbWRsaW5lIC1pIgorICAgIGZpCisgICAgaWYgdGVzdCAnJyAhPSAiJHRocmVld2F5IgorICAgIHRoZW4KKyAgICAgICAgY21kbGluZT0iJGNtZGxpbmUgLTMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICcuZG90ZXN0JyAhPSAiJGRvdGVzdCIKKyAgICB0aGVuCisgICAgICAgIGNtZGxpbmU9IiRjbWRsaW5lIC1kPSRkb3Rlc3QiCisgICAgZmkKKyAgICBlY2hvICJXaGVuIHlvdSBoYXZlIHJlc29sdmVkIHRoaXMgcHJvYmxlbSBydW4gXCIkY21kbGluZSAtLXJlc29sdmVkXCIuIgorICAgIGVjaG8gIklmIHlvdSB3b3VsZCBwcmVmZXIgdG8gc2tpcCB0aGlzIHBhdGNoLCBpbnN0ZWFkIHJ1biBcIiRjbWRsaW5lIC0tc2tpcFwiLiIKKworICAgIHN0b3BfaGVyZSAkMQorfQorCitnb19uZXh0ICgpIHsKKwlybSAtZiAiJGRvdGVzdC8kbXNnbnVtIiAiJGRvdGVzdC9tc2ciICIkZG90ZXN0L21zZy1jbGVhbiIgXAorCQkiJGRvdGVzdC9wYXRjaCIgIiRkb3Rlc3QvaW5mbyIKKwllY2hvICIkbmV4dCIgPiIkZG90ZXN0L25leHQiCisJdGhpcz0kbmV4dAorfQorCitmYWxsX2JhY2tfM3dheSAoKSB7CisgICAgT19PQkpFQ1Q9YGNkICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiICYmIHB3ZGAKKworICAgIHJtIC1mciAiJGRvdGVzdCIvcGF0Y2gtbWVyZ2UtKgorICAgIG1rZGlyICIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1kaXIiCisKKyAgICAjIEZpcnN0IHNlZSBpZiB0aGUgcGF0Y2ggcmVjb3JkcyB0aGUgaW5kZXggaW5mbyB0aGF0IHdlIGNhbiB1c2UuCisgICAgaWYgZ2l0LWFwcGx5IC16IC0taW5kZXgtaW5mbyAiJGRvdGVzdC9wYXRjaCIgXAorCT4iJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleC1pbmZvIiAyPi9kZXYvbnVsbCAmJgorCUdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorCWdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvIDwiJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleC1pbmZvIiAmJgorCUdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorCWdpdC13cml0ZS10cmVlID4iJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlKyIgJiYKKwkjIGluZGV4IGhhcyB0aGUgYmFzZSB0cmVlIG5vdy4KKwlHSVRfSU5ERVhfRklMRT0iJGRvdGVzdC9wYXRjaC1tZXJnZS10bXAtaW5kZXgiIFwKKwlnaXQtYXBwbHkgJGJpbmFyeSAtLWNhY2hlZCA8IiRkb3Rlc3QvcGF0Y2giCisgICAgdGhlbgorCWVjaG8gVXNpbmcgaW5kZXggaW5mbyB0byByZWNvbnN0cnVjdCBhIGJhc2UgdHJlZS4uLgorCW12ICIkZG90ZXN0L3BhdGNoLW1lcmdlLWJhc2UrIiAiJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlIgorCW12ICIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgIiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtaW5kZXgiCisgICAgZmkKKworICAgIHRlc3QgLWYgIiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtaW5kZXgiICYmCisgICAgaGlzX3RyZWU9JChHSVRfSU5ERVhfRklMRT0iJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleCIgZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgb3JpZ190cmVlPSQoY2F0ICIkZG90ZXN0L3BhdGNoLW1lcmdlLWJhc2UiKSAmJgorICAgIHJtIC1mciAiJGRvdGVzdCIvcGF0Y2gtbWVyZ2UtKiB8fCBleGl0IDEKKworICAgIGVjaG8gRmFsbGluZyBiYWNrIHRvIHBhdGNoaW5nIGJhc2UgYW5kIDMtd2F5IG1lcmdlLi4uCisKKyAgICAjIFRoaXMgaXMgbm90IHNvIHdyb25nLiAgRGVwZW5kaW5nIG9uIHdoaWNoIGJhc2Ugd2UgcGlja2VkLAorICAgICMgb3JpZ190cmVlIG1heSBiZSB3aWxkbHkgZGlmZmVyZW50IGZyb20gb3VycywgYnV0IGhpc190cmVlCisgICAgIyBoYXMgdGhlIHNhbWUgc2V0IG9mIHdpbGRseSBkaWZmZXJlbnQgY2hhbmdlcyBpbiBwYXJ0cyB0aGUKKyAgICAjIHBhdGNoIGRpZCBub3QgdG91Y2gsIHNvIHJlc29sdmUgZW5kcyB1cCBjYW5jZWxsaW5nIHRoZW0sCisgICAgIyBzYXlpbmcgdGhhdCB3ZSByZXZlcnRlZCBhbGwgdGhvc2UgY2hhbmdlcy4KKworICAgIGdpdC1tZXJnZS1yZXNvbHZlICRvcmlnX3RyZWUgLS0gSEVBRCAkaGlzX3RyZWUgfHwgeworCSAgICBpZiB0ZXN0IC1kICIkR0lUX0RJUi9yci1jYWNoZSIKKwkgICAgdGhlbgorCQlnaXQtcmVyZXJlCisJICAgIGZpCisJICAgIGVjaG8gRmFpbGVkIHRvIG1lcmdlIGluIHRoZSBjaGFuZ2VzLgorCSAgICBleGl0IDEKKyAgICB9Cit9CisKK3ByZWM9NAorZG90ZXN0PS5kb3Rlc3Qgc2lnbj0gdXRmOD0ga2VlcD0gc2tpcD0gaW50ZXJhY3RpdmU9IHJlc29sdmVkPSBiaW5hcnk9IHdzPSByZXNvbHZlbXNnPQorCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1kPSp8LS1kPSp8LS1kbz0qfC0tZG90PSp8LS1kb3RlPSp8LS1kb3Rlcz0qfC0tZG90ZXN0PSopCisJZG90ZXN0PWBleHByICIkMSIgOiAnLVtePV0qPVwoLipcKSdgOyBzaGlmdCA7OworCS1kfC0tZHwtLWRvfC0tZG90fC0tZG90ZXwtLWRvdGVzfC0tZG90ZXN0KQorCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjOyBzaGlmdAorCWRvdGVzdD0iJDEiOyBzaGlmdDs7CisKKwktaXwtLWl8LS1pbnwtLWludHwtLWludGV8LS1pbnRlcnwtLWludGVyYXwtLWludGVyYWN8LS1pbnRlcmFjdHxcCisJLS1pbnRlcmFjdGl8LS1pbnRlcmFjdGl2fC0taW50ZXJhY3RpdmUpCisJaW50ZXJhY3RpdmU9dDsgc2hpZnQgOzsKKworCS1ifC0tYnwtLWJpfC0tYmlufC0tYmluYXwtLWJpbmFyfC0tYmluYXJ5KQorCWJpbmFyeT10OyBzaGlmdCA7OworCisJLTN8LS0zfC0tM3d8LS0zd2F8LS0zd2F5KQorCXRocmVld2F5PXQ7IHNoaWZ0IDs7CisJLXN8LS1zfC0tc2l8LS1zaWd8LS1zaWdufC0tc2lnbm98LS1zaWdub2Z8LS1zaWdub2ZmKQorCXNpZ249dDsgc2hpZnQgOzsKKwktdXwtLXV8LS11dHwtLXV0ZnwtLXV0ZjgpCisJdXRmOD10OyBzaGlmdCA7OworCS1rfC0ta3wtLWtlfC0ta2VlfC0ta2VlcCkKKwlrZWVwPXQ7IHNoaWZ0IDs7CisKKwktcnwtLXJ8LS1yZXwtLXJlc3wtLXJlc298LS1yZXNvbHwtLXJlc29sdnwtLXJlc29sdmV8LS1yZXNvbHZlZCkKKwlyZXNvbHZlZD10OyBzaGlmdCA7OworCisJLS1za3wtLXNraXwtLXNraXApCisJc2tpcD10OyBzaGlmdCA7OworCisJLS13aGl0ZXNwYWNlPSopCisJd3M9JDE7IHNoaWZ0IDs7CisKKwktLXJlc29sdmVtc2c9KikKKwlyZXNvbHZlbXNnPSQoZWNobyAiJDEiIHwgc2VkIC1lICJzL14tLXJlc29sdmVtc2c9Ly8iKTsgc2hpZnQgOzsKKworCS0tKQorCXNoaWZ0OyBicmVhayA7OworCS0qKQorCXVzYWdlIDs7CisJKikKKwlicmVhayA7OworCWVzYWMKK2RvbmUKKworIyBJZiB0aGUgZG90ZXN0IGRpcmVjdG9yeSBleGlzdHMsIGJ1dCB3ZSBoYXZlIGZpbmlzaGVkIGFwcGx5aW5nIGFsbCB0aGUKKyMgcGF0Y2hlcyBpbiB0aGVtLCBjbGVhciBpdCBvdXQuCitpZiB0ZXN0IC1kICIkZG90ZXN0IiAmJgorICAgbGFzdD0kKGNhdCAiJGRvdGVzdC9sYXN0IikgJiYKKyAgIG5leHQ9JChjYXQgIiRkb3Rlc3QvbmV4dCIpICYmCisgICB0ZXN0ICQjICE9IDAgJiYKKyAgIHRlc3QgIiRuZXh0IiAtZ3QgIiRsYXN0IgordGhlbgorICAgcm0gLWZyICIkZG90ZXN0IgorZmkKKworaWYgdGVzdCAtZCAiJGRvdGVzdCIKK3RoZW4KKwl0ZXN0ICIsJCMsIiA9ICIsMCwiIHx8CisJZGllICJwcmV2aW91cyBkb3Rlc3QgZGlyZWN0b3J5ICRkb3Rlc3Qgc3RpbGwgZXhpc3RzIGJ1dCBtYm94IGdpdmVuLiIKKwlyZXN1bWU9eWVzCitlbHNlCisJIyBNYWtlIHN1cmUgd2UgYXJlIG5vdCBnaXZlbiAtLXNraXAgbm9yIC0tcmVzb2x2ZWQKKwl0ZXN0ICIsJHNraXAsJHJlc29sdmVkLCIgPSAsLCwgfHwKKwkJZGllICJSZXNvbHZlIG9wZXJhdGlvbiBub3QgaW4gcHJvZ3Jlc3MsIHdlIGFyZSBub3QgcmVzdW1pbmcuIgorCisJIyBTdGFydCBhZnJlc2guCisJbWtkaXIgLXAgIiRkb3Rlc3QiIHx8IGV4aXQKKworCWdpdC1tYWlsc3BsaXQgLWQiJHByZWMiIC1vIiRkb3Rlc3QiIC1iIC0tICIkQCIgPiAiJGRvdGVzdC9sYXN0IiB8fCAgeworCQlybSAtZnIgIiRkb3Rlc3QiCisJCWV4aXQgMQorCX0KKworCSMgLWIsIC1zLCAtdSwgLWsgYW5kIC0td2hpdGVzcGFjZSBmbGFncyBhcmUga2VwdCBmb3IgdGhlCisJIyByZXN1bWluZyBzZXNzaW9uIGFmdGVyIGEgcGF0Y2ggZmFpbHVyZS4KKwkjIC0zIGFuZCAtaSBjYW4gYW5kIG11c3QgYmUgZ2l2ZW4gd2hlbiByZXN1bWluZy4KKwllY2hvICIkYmluYXJ5IiA+IiRkb3Rlc3QvYmluYXJ5IgorCWVjaG8gIiAkd3MiID4iJGRvdGVzdC93aGl0ZXNwYWNlIgorCWVjaG8gIiRzaWduIiA+IiRkb3Rlc3Qvc2lnbiIKKwllY2hvICIkdXRmOCIgPiIkZG90ZXN0L3V0ZjgiCisJZWNobyAiJGtlZXAiID4iJGRvdGVzdC9rZWVwIgorCWVjaG8gMSA+IiRkb3Rlc3QvbmV4dCIKK2ZpCisKK2Nhc2UgIiRyZXNvbHZlZCIgaW4KKycnKQorCWZpbGVzPSQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCkgfHwgZXhpdAorCWlmIFsgIiRmaWxlcyIgXTsgdGhlbgorCSAgIGVjaG8gIkRpcnR5IGluZGV4OiBjYW5ub3QgYXBwbHkgcGF0Y2hlcyAoZGlydHk6ICRmaWxlcykiID4mMgorCSAgIGV4aXQgMQorCWZpCitlc2FjCisKK2lmIHRlc3QgIiQoY2F0ICIkZG90ZXN0L2JpbmFyeSIpIiA9IHQKK3RoZW4KKwliaW5hcnk9LS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQKK2ZpCitpZiB0ZXN0ICIkKGNhdCAiJGRvdGVzdC91dGY4IikiID0gdAordGhlbgorCXV0Zjg9LXUKK2ZpCitpZiB0ZXN0ICIkKGNhdCAiJGRvdGVzdC9rZWVwIikiID0gdAordGhlbgorCWtlZXA9LWsKK2ZpCit3cz1gY2F0ICIkZG90ZXN0L3doaXRlc3BhY2UiYAoraWYgdGVzdCAiJChjYXQgIiRkb3Rlc3Qvc2lnbiIpIiA9IHQKK3RoZW4KKwlTSUdOT0ZGPWBnaXQtdmFyIEdJVF9DT01NSVRURVJfSURFTlQgfCBzZWQgLWUgJworCQkJcy8+LiovPi8KKwkJCXMvXi9TaWduZWQtb2ZmLWJ5OiAvJworCQlgCitlbHNlCisJU0lHTk9GRj0KK2ZpCisKK2xhc3Q9YGNhdCAiJGRvdGVzdC9sYXN0ImAKK3RoaXM9YGNhdCAiJGRvdGVzdC9uZXh0ImAKK2lmIHRlc3QgIiRza2lwIiA9IHQKK3RoZW4KKwl0aGlzPWBleHByICIkdGhpcyIgKyAxYAorCXJlc3VtZT0KK2ZpCisKK2lmIHRlc3QgIiR0aGlzIiAtZ3QgIiRsYXN0IgordGhlbgorCWVjaG8gTm90aGluZyB0byBkby4KKwlybSAtZnIgIiRkb3Rlc3QiCisJZXhpdAorZmkKKword2hpbGUgdGVzdCAiJHRoaXMiIC1sZSAiJGxhc3QiCitkbworCW1zZ251bT1gcHJpbnRmICIlMCR7cHJlY31kIiAkdGhpc2AKKwluZXh0PWBleHByICIkdGhpcyIgKyAxYAorCXRlc3QgLWYgIiRkb3Rlc3QvJG1zZ251bSIgfHwgeworCQlyZXN1bWU9CisJCWdvX25leHQKKwkJY29udGludWUKKwl9CisKKwkjIElmIHdlIGFyZSBub3QgcmVzdW1pbmcsIHBhcnNlIGFuZCBleHRyYWN0IHRoZSBwYXRjaCBpbmZvcm1hdGlvbgorCSMgaW50byBzZXBhcmF0ZSBmaWxlczoKKwkjICAtIGluZm8gcmVjb3JkcyB0aGUgYXV0aG9yc2hpcCBhbmQgdGl0bGUKKwkjICAtIG1zZyBpcyB0aGUgcmVzdCBvZiBjb21taXQgbG9nIG1lc3NhZ2UKKwkjICAtIHBhdGNoIGlzIHRoZSBwYXRjaCBib2R5LgorCSMKKwkjIFdoZW4gd2UgYXJlIHJlc3VtaW5nLCB0aGVzZSBmaWxlcyBhcmUgZWl0aGVyIGFscmVhZHkgcHJlcGFyZWQKKwkjIGJ5IHRoZSB1c2VyLCBvciB0aGUgdXNlciBjYW4gdGVsbCB1cyB0byBkbyBzbyBieSAtLXJlc29sdmVkIGZsYWcuCisJY2FzZSAiJHJlc3VtZSIgaW4KKwknJykKKwkJZ2l0LW1haWxpbmZvICRrZWVwICR1dGY4ICIkZG90ZXN0L21zZyIgIiRkb3Rlc3QvcGF0Y2giIFwKKwkJCTwiJGRvdGVzdC8kbXNnbnVtIiA+IiRkb3Rlc3QvaW5mbyIgfHwKKwkJCXN0b3BfaGVyZSAkdGhpcworCQlnaXQtc3RyaXBzcGFjZSA8ICIkZG90ZXN0L21zZyIgPiAiJGRvdGVzdC9tc2ctY2xlYW4iCisJCTs7CisJZXNhYworCisJR0lUX0FVVEhPUl9OQU1FPSIkKHNlZCAtbiAnL15BdXRob3IvIHMvQXV0aG9yOiAvL3AnICIkZG90ZXN0L2luZm8iKSIKKwlHSVRfQVVUSE9SX0VNQUlMPSIkKHNlZCAtbiAnL15FbWFpbC8gcy9FbWFpbDogLy9wJyAiJGRvdGVzdC9pbmZvIikiCisJR0lUX0FVVEhPUl9EQVRFPSIkKHNlZCAtbiAnL15EYXRlLyBzL0RhdGU6IC8vcCcgIiRkb3Rlc3QvaW5mbyIpIgorCisJaWYgdGVzdCAteiAiJEdJVF9BVVRIT1JfRU1BSUwiCisJdGhlbgorCQllY2hvICJQYXRjaCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuIgorCQlzdG9wX2hlcmUgJHRoaXMKKwlmaQorCisJZXhwb3J0IEdJVF9BVVRIT1JfTkFNRSBHSVRfQVVUSE9SX0VNQUlMIEdJVF9BVVRIT1JfREFURQorCisJU1VCSkVDVD0iJChzZWQgLW4gJy9eU3ViamVjdC8gcy9TdWJqZWN0OiAvL3AnICIkZG90ZXN0L2luZm8iKSIKKwljYXNlICIka2VlcF9zdWJqZWN0IiBpbiAtaykgIFNVQkpFQ1Q9IltQQVRDSF0gJFNVQkpFQ1QiIDs7IGVzYWMKKworCWNhc2UgIiRyZXN1bWUiIGluCisJJycpCisJICAgIGlmIHRlc3QgJycgIT0gIiRTSUdOT0ZGIgorCSAgICB0aGVuCisJCUxBU1RfU0lHTkVEX09GRl9CWT1gCisJCSAgICBzZWQgLW5lICcvXlNpZ25lZC1vZmYtYnk6IC9wJyBcCisJCSAgICAiJGRvdGVzdC9tc2ctY2xlYW4iIHwKKwkJICAgIHRhaWwgLW4gMQorCQlgCisJCUFERF9TSUdOT0ZGPWAKKwkJICAgIHRlc3QgIiRMQVNUX1NJR05FRF9PRkZfQlkiID0gIiRTSUdOT0ZGIiB8fCB7CisJCSAgICB0ZXN0ICcnID0gIiRMQVNUX1NJR05FRF9PRkZfQlkiICYmIGVjaG8KKwkJICAgIGVjaG8gIiRTSUdOT0ZGIgorCQl9YAorCSAgICBlbHNlCisJCUFERF9TSUdOT0ZGPQorCSAgICBmaQorCSAgICB7CisJCWVjaG8gIiRTVUJKRUNUIgorCQlpZiB0ZXN0IC1zICIkZG90ZXN0L21zZy1jbGVhbiIKKwkJdGhlbgorCQkJZWNobworCQkJY2F0ICIkZG90ZXN0L21zZy1jbGVhbiIKKwkJZmkKKwkJaWYgdGVzdCAnJyAhPSAiJEFERF9TSUdOT0ZGIgorCQl0aGVuCisJCQllY2hvICIkQUREX1NJR05PRkYiCisJCWZpCisJICAgIH0gPiIkZG90ZXN0L2ZpbmFsLWNvbW1pdCIKKwkgICAgOzsKKwkqKQorCQljYXNlICIkcmVzb2x2ZWQkaW50ZXJhY3RpdmUiIGluCisJCXR0KQorCQkJIyBUaGlzIGlzIHVzZWQgb25seSBmb3IgaW50ZXJhY3RpdmUgdmlldyBvcHRpb24uCisJCQlnaXQtZGlmZi1pbmRleCAtcCAtLWNhY2hlZCBIRUFEID4iJGRvdGVzdC9wYXRjaCIKKwkJCTs7CisJCWVzYWMKKwllc2FjCisKKwlyZXN1bWU9CisJaWYgdGVzdCAiJGludGVyYWN0aXZlIiA9IHQKKwl0aGVuCisJICAgIHRlc3QgLXQgMCB8fAorCSAgICBkaWUgImNhbm5vdCBiZSBpbnRlcmFjdGl2ZSB3aXRob3V0IHN0ZGluIGNvbm5lY3RlZCB0byBhIHRlcm1pbmFsLiIKKwkgICAgYWN0aW9uPWFnYWluCisJICAgIHdoaWxlIHRlc3QgIiRhY3Rpb24iID0gYWdhaW4KKwkgICAgZG8KKwkJZWNobyAiQ29tbWl0IEJvZHkgaXM6IgorCQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJY2F0ICIkZG90ZXN0L2ZpbmFsLWNvbW1pdCIKKwkJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCXByaW50ZiAiQXBwbHk/IFt5XWVzL1tuXW8vW2VdZGl0L1t2XWlldyBwYXRjaC9bYV1jY2VwdCBhbGwgIgorCQlyZWFkIHJlcGx5CisJCWNhc2UgIiRyZXBseSIgaW4KKwkJW3lZXSopIGFjdGlvbj15ZXMgOzsKKwkJW2FBXSopIGFjdGlvbj15ZXMgaW50ZXJhY3RpdmU9IDs7CisJCVtuTl0qKSBhY3Rpb249c2tpcCA7OworCQlbZUVdKikgIiR7VklTVUFMOi0ke0VESVRPUjotdml9fSIgIiRkb3Rlc3QvZmluYWwtY29tbWl0IgorCQkgICAgICAgYWN0aW9uPWFnYWluIDs7CisJCVt2Vl0qKSBhY3Rpb249YWdhaW4KKwkJICAgICAgIExFU1M9LVMgJHtQQUdFUjotbGVzc30gIiRkb3Rlc3QvcGF0Y2giIDs7CisJCSopICAgICBhY3Rpb249YWdhaW4gOzsKKwkJZXNhYworCSAgICBkb25lCisJZWxzZQorCSAgICBhY3Rpb249eWVzCisJZmkKKworCWlmIHRlc3QgJGFjdGlvbiA9IHNraXAKKwl0aGVuCisJCWdvX25leHQKKwkJY29udGludWUKKwlmaQorCisJaWYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL2FwcGx5cGF0Y2gtbXNnCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL2FwcGx5cGF0Y2gtbXNnICIkZG90ZXN0L2ZpbmFsLWNvbW1pdCIgfHwKKwkJc3RvcF9oZXJlICR0aGlzCisJZmkKKworCWVjaG8KKwllY2hvICJBcHBseWluZyAnJFNVQkpFQ1QnIgorCWVjaG8KKworCWNhc2UgIiRyZXNvbHZlZCIgaW4KKwknJykKKwkJZ2l0LWFwcGx5ICRiaW5hcnkgLS1pbmRleCAkd3MgIiRkb3Rlc3QvcGF0Y2giCisJCWFwcGx5X3N0YXR1cz0kPworCQk7OworCXQpCisJCSMgUmVzb2x2ZWQgbWVhbnMgdGhlIHVzZXIgZGlkIGFsbCB0aGUgaGFyZCB3b3JrLCBhbmQKKwkJIyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnkgcGF0Y2ggYXBwbGljYXRpb24uICBKdXN0CisJCSMgdHJ1c3Qgd2hhdCB0aGUgdXNlciBoYXMgaW4gdGhlIGluZGV4IGZpbGUgYW5kIHRoZQorCQkjIHdvcmtpbmcgdHJlZS4KKwkJcmVzb2x2ZWQ9CisJCWNoYW5nZWQ9IiQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCkiCisJCWlmIHRlc3QgJycgPSAiJGNoYW5nZWQiCisJCXRoZW4KKwkJCWVjaG8gIk5vIGNoYW5nZXMgLSBkaWQgeW91IGZvcmdldCB1cGRhdGUtaW5kZXg/IgorCQkJc3RvcF9oZXJlX3VzZXJfcmVzb2x2ZSAkdGhpcworCQlmaQorCQl1bm1lcmdlZD0kKGdpdC1scy1maWxlcyAtdSkKKwkJaWYgdGVzdCAtbiAiJHVubWVyZ2VkIgorCQl0aGVuCisJCQllY2hvICJZb3Ugc3RpbGwgaGF2ZSB1bm1lcmdlZCBwYXRocyBpbiB5b3VyIGluZGV4IgorCQkJZWNobyAiZGlkIHlvdSBmb3JnZXQgdXBkYXRlLWluZGV4PyIKKwkJCXN0b3BfaGVyZV91c2VyX3Jlc29sdmUgJHRoaXMKKwkJZmkKKwkJYXBwbHlfc3RhdHVzPTAKKwkJOzsKKwllc2FjCisKKwlpZiB0ZXN0ICRhcHBseV9zdGF0dXMgPSAxICYmIHRlc3QgIiR0aHJlZXdheSIgPSB0CisJdGhlbgorCQlpZiAoZmFsbF9iYWNrXzN3YXkpCisJCXRoZW4KKwkJICAgICMgQXBwbHlpbmcgdGhlIHBhdGNoIHRvIGFuIGVhcmxpZXIgdHJlZSBhbmQgbWVyZ2luZyB0aGUKKwkJICAgICMgcmVzdWx0IG1heSBoYXZlIHByb2R1Y2VkIHRoZSBzYW1lIHRyZWUgYXMgb3Vycy4KKwkJICAgIGNoYW5nZWQ9IiQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCkiCisJCSAgICBpZiB0ZXN0ICcnID0gIiRjaGFuZ2VkIgorCQkgICAgdGhlbgorCQkJICAgIGVjaG8gTm8gY2hhbmdlcyAtLSBQYXRjaCBhbHJlYWR5IGFwcGxpZWQuCisJCQkgICAgZ29fbmV4dAorCQkJICAgIGNvbnRpbnVlCisJCSAgICBmaQorCQkgICAgIyBjbGVhciBhcHBseV9zdGF0dXMgLS0gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgbWVyZ2VkLgorCQkgICAgYXBwbHlfc3RhdHVzPTAKKwkJZmkKKwlmaQorCWlmIHRlc3QgJGFwcGx5X3N0YXR1cyAhPSAwCisJdGhlbgorCQllY2hvIFBhdGNoIGZhaWxlZCBhdCAkbXNnbnVtLgorCQlzdG9wX2hlcmVfdXNlcl9yZXNvbHZlICR0aGlzCisJZmkKKworCWlmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9wcmUtYXBwbHlwYXRjaAorCXRoZW4KKwkJIiRHSVRfRElSIi9ob29rcy9wcmUtYXBwbHlwYXRjaCB8fCBzdG9wX2hlcmUgJHRoaXMKKwlmaQorCisJdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorCWVjaG8gV3JvdGUgdHJlZSAkdHJlZSAmJgorCXBhcmVudD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwljb21taXQ9JChnaXQtY29tbWl0LXRyZWUgJHRyZWUgLXAgJHBhcmVudCA8IiRkb3Rlc3QvZmluYWwtY29tbWl0IikgJiYKKwllY2hvIENvbW1pdHRlZDogJGNvbW1pdCAmJgorCWdpdC11cGRhdGUtcmVmIC1tICJhbTogJFNVQkpFQ1QiIEhFQUQgJGNvbW1pdCAkcGFyZW50IHx8CisJc3RvcF9oZXJlICR0aGlzCisKKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcG9zdC1hcHBseXBhdGNoCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtYXBwbHlwYXRjaAorCWZpCisKKwlnb19uZXh0Citkb25lCisKK3JtIC1mciAiJGRvdGVzdCIKZGlmZiAtLWdpdCBhL2dpdC1hbm5vdGF0ZS5wZXJsIGIvZ2l0LWFubm90YXRlLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTZhN2E0OAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1hbm5vdGF0ZS5wZXJsCkBAIC0wLDAgKzEsNTEyIEBACisjIS91c3IvYmluL3BlcmwKKyMgQ29weXJpZ2h0IDIwMDYsIFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisjCisjIEdQTCB2MiAoU2VlIENPUFlJTkcpCisjCisjIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKyMgYXQgdGhlIGRpc2NyZXRpb24gb2YgTGludXMgVG9ydmFsZHMuCisKK3VzZSB3YXJuaW5nczsKK3VzZSBzdHJpY3Q7Cit1c2UgR2V0b3B0OjpMb25nOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGdtdGltZSk7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoYmFzZW5hbWUgZGlybmFtZSk7CisKK3N1YiB1c2FnZSgpIHsKKwlwcmludCBTVERFUlIgIlVzYWdlOiAke1xiYXNlbmFtZSAkMH0gWy1zXSBbLVMgcmV2cy1maWxlXSBmaWxlIFsgcmV2aXNpb24gXQorCS1sLCAtLWxvbmcKKwkJCVNob3cgbG9uZyByZXYgKERlZmF1bHRzIG9mZikKKwktdCwgLS10aW1lCisJCQlTaG93IHJhdyB0aW1lc3RhbXAgKERlZmF1bHRzIG9mZikKKwktciwgLS1yZW5hbWUKKwkJCUZvbGxvdyByZW5hbWVzIChEZWZhdWx0cyBvbikuCisJLVMsIC0tcmV2LWZpbGUgcmV2cy1maWxlCisJCQlVc2UgcmV2cyBmcm9tIHJldnMtZmlsZSBpbnN0ZWFkIG9mIGNhbGxpbmcgZ2l0LXJldi1saXN0CisJLWgsIC0taGVscAorCQkJVGhpcyBtZXNzYWdlLgorIjsKKworCWV4aXQoMSk7Cit9CisKK291ciAoJGhlbHAsICRsb25ncmV2LCAkcmVuYW1lLCAkcmF3dGltZSwgJHN0YXJ0aW5nX3JldiwgJHJldl9maWxlKSA9ICgwLCAwLCAxKTsKKworbXkgJHJjID0gR2V0T3B0aW9ucygJImxvbmd8bCIgPT4gXCRsb25ncmV2LAorCQkJInRpbWV8dCIgPT4gXCRyYXd0aW1lLAorCQkJImhlbHB8aCIgPT4gXCRoZWxwLAorCQkJInJlbmFtZXxyIiA9PiBcJHJlbmFtZSwKKwkJCSJyZXYtZmlsZXxTPXMiID0+IFwkcmV2X2ZpbGUpOworaWYgKCEkcmMgb3IgJGhlbHAgb3IgIUBBUkdWKSB7CisJdXNhZ2UoKTsKK30KKworbXkgJGZpbGVuYW1lID0gc2hpZnQgQEFSR1Y7CitpZiAoQEFSR1YpIHsKKwkkc3RhcnRpbmdfcmV2ID0gc2hpZnQgQEFSR1Y7Cit9CisKK215IEBzdGFjayA9ICgKKwl7CisJCSdyZXYnID0+IGRlZmluZWQgJHN0YXJ0aW5nX3JldiA/ICRzdGFydGluZ19yZXYgOiAiSEVBRCIsCisJCSdmaWxlbmFtZScgPT4gJGZpbGVuYW1lLAorCX0sCispOworCitvdXIgQGZpbGVsaW5lcyA9ICgpOworCitpZiAoZGVmaW5lZCAkc3RhcnRpbmdfcmV2KSB7CisJQGZpbGVsaW5lcyA9IGdpdF9jYXRfZmlsZSgkc3RhcnRpbmdfcmV2LCAkZmlsZW5hbWUpOworfSBlbHNlIHsKKwlvcGVuKEYsIjwiLCRmaWxlbmFtZSkKKwkJb3IgZGllICJGYWlsZWQgdG8gb3BlbiBmaWxlbmFtZTogJCEiOworCisJd2hpbGUoPEY+KSB7CisJCWNob21wOworCQlwdXNoIEBmaWxlbGluZXMsICRfOworCX0KKwljbG9zZShGKTsKKworfQorCitvdXIgJXJldnM7CitvdXIgQHJldnF1ZXVlOworb3VyICRoZWFkOworCitteSAkcmV2c3Byb2Nlc3NlZCA9IDA7Cit3aGlsZSAobXkgJGJvdW5kID0gcG9wIEBzdGFjaykgeworCW15IEByZXZpc2lvbnMgPSBnaXRfcmV2X2xpc3QoJGJvdW5kLT57J3Jldid9LCAkYm91bmQtPnsnZmlsZW5hbWUnfSk7CisJZm9yZWFjaCBteSAkcmV2aW5zdCAoQHJldmlzaW9ucykgeworCQlteSAoJHJldiwgQHBhcmVudHMpID0gQCRyZXZpbnN0OworCQkkaGVhZCB8fD0gJHJldjsKKworCQlpZiAoIWRlZmluZWQoJHJldikpIHsKKwkJCSRyZXYgPSAiIjsKKwkJfQorCQkkcmV2c3skcmV2fXsnZmlsZW5hbWUnfSA9ICRib3VuZC0+eydmaWxlbmFtZSd9OworCQlpZiAoc2NhbGFyIEBwYXJlbnRzID4gMCkgeworCQkJJHJldnN7JHJldn17J3BhcmVudHMnfSA9IFxAcGFyZW50czsKKwkJCW5leHQ7CisJCX0KKworCQlpZiAoISRyZW5hbWUpIHsKKwkJCW5leHQ7CisJCX0KKworCQlteSAkbmV3Ym91bmQgPSBmaW5kX3BhcmVudF9yZW5hbWVzKCRyZXYsICRib3VuZC0+eydmaWxlbmFtZSd9KTsKKwkJaWYgKCBleGlzdHMgJG5ld2JvdW5kLT57J2ZpbGVuYW1lJ30gJiYgJG5ld2JvdW5kLT57J2ZpbGVuYW1lJ30gbmUgJGJvdW5kLT57J2ZpbGVuYW1lJ30pIHsKKwkJCXB1c2ggQHN0YWNrLCAkbmV3Ym91bmQ7CisJCQkkcmV2c3skcmV2fXsncGFyZW50cyd9ID0gWyRuZXdib3VuZC0+eydyZXYnfV07CisJCX0KKwl9Cit9CitwdXNoIEByZXZxdWV1ZSwgJGhlYWQ7Citpbml0X2NsYWltKCBkZWZpbmVkICRzdGFydGluZ19yZXYgPyAkaGVhZCA6ICdkaXJ0eScpOwordW5sZXNzIChkZWZpbmVkICRzdGFydGluZ19yZXYpIHsKKwlteSAkZGlmZiA9IG9wZW5fcGlwZSgiZ2l0IiwiZGlmZiIsIi1SIiwgIkhFQUQiLCAiLS0iLCRmaWxlbmFtZSkKKwkJb3IgZGllICJGYWlsZWQgdG8gY2FsbCBnaXQgZGlmZiB0byBjaGVjayBmb3IgZGlydHkgc3RhdGU6ICQhIjsKKworCV9naXRfZGlmZl9wYXJzZSgkZGlmZiwgJGhlYWQsICJkaXJ0eSIsICgKKwkJCQknYXV0aG9yJyA9PiBnaXR2YXJfbmFtZSgiR0lUX0FVVEhPUl9JREVOVCIpLAorCQkJCSdhdXRob3JfZGF0ZScgPT4gc3ByaW50ZigiJXMgKzAwMDAiLHRpbWUoKSksCisJCQkJKQorCQkJKTsKKwljbG9zZSgkZGlmZik7Cit9CitoYW5kbGVfcmV2KCk7CisKKworbXkgJGkgPSAwOworZm9yZWFjaCBteSAkbCAoQGZpbGVsaW5lcykgeworCW15ICgkb3V0cHV0LCAkcmV2LCAkY29tbWl0dGVyLCAkZGF0ZSk7CisJaWYgKHJlZiAkbCBlcSAnQVJSQVknKSB7CisJCSgkb3V0cHV0LCAkcmV2LCAkY29tbWl0dGVyLCAkZGF0ZSkgPSBAJGw7CisJCWlmICghJGxvbmdyZXYgJiYgbGVuZ3RoKCRyZXYpID4gOCkgeworCQkJJHJldiA9IHN1YnN0cigkcmV2LDAsOCk7CisJCX0KKwl9IGVsc2UgeworCQkkb3V0cHV0ID0gJGw7CisJCSgkcmV2LCAkY29tbWl0dGVyLCAkZGF0ZSkgPSAoJ3Vua25vd24nLCAndW5rbm93bicsICd1bmtub3duJyk7CisJfQorCisJcHJpbnRmKCIlc1x0KCUxMHNcdCUxMHNcdCVkKSVzXG4iLCAkcmV2LCAkY29tbWl0dGVyLAorCQlmb3JtYXRfZGF0ZSgkZGF0ZSksICsrJGksICRvdXRwdXQpOworfQorCitzdWIgaW5pdF9jbGFpbSB7CisJbXkgKCRyZXYpID0gQF87CisJZm9yIChteSAkaSA9IDA7ICRpIDwgQGZpbGVsaW5lczsgJGkrKykgeworCQkkZmlsZWxpbmVzWyRpXSA9IFsgJGZpbGVsaW5lc1skaV0sICcnLCAnJywgJycsIDFdOworCQkJIyBsaW5lLAorCQkJIyByZXYsCisJCQkjIGF1dGhvciwKKwkJCSMgZGF0ZSwKKwkJCSMgMSA8LS0gYmVsb25ncyB0byB0aGUgb3JpZ2luYWwgZmlsZS4KKwl9CisJJHJldnN7JHJldn17J2xpbmVzJ30gPSBcQGZpbGVsaW5lczsKK30KKworCitzdWIgaGFuZGxlX3JldiB7CisJbXkgJGkgPSAwOworCW15ICVzZWVuOworCXdoaWxlIChteSAkcmV2ID0gc2hpZnQgQHJldnF1ZXVlKSB7CisJCW5leHQgaWYgJHNlZW57JHJldn0rKzsKKworCQlteSAlcmV2aW5mbyA9IGdpdF9jb21taXRfaW5mbygkcmV2KTsKKworCQlmb3JlYWNoIG15ICRwIChAeyRyZXZzeyRyZXZ9eydwYXJlbnRzJ319KSB7CisKKwkJCWdpdF9kaWZmX3BhcnNlKCRwLCAkcmV2LCAlcmV2aW5mbyk7CisJCQlwdXNoIEByZXZxdWV1ZSwgJHA7CisJCX0KKworCisJCWlmIChzY2FsYXIgQHskcmV2c3skcmV2fXtwYXJlbnRzfX0gPT0gMCkgeworCQkJIyBXZSBtdXN0IGJlIGF0IHRoZSBpbml0aWFsIHJldiBoZXJlLCBzbyBjbGFpbSBldmVyeXRoaW5nIHRoYXQgaXMgbGVmdC4KKwkJCWZvciAobXkgJGkgPSAwOyAkaSA8IEB7JHJldnN7JHJldn17bGluZXN9fTsgJGkrKykgeworCQkJCWlmIChyZWYgJHskcmV2c3skcmV2fXtsaW5lc319WyRpXSBlcSAnJyB8fCAkeyRyZXZzeyRyZXZ9e2xpbmVzfX1bJGldWzFdIGVxICcnKSB7CisJCQkJCWNsYWltX2xpbmUoJGksICRyZXYsICRyZXZzeyRyZXZ9e2xpbmVzfSwgJXJldmluZm8pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCitzdWIgZ2l0X3Jldl9saXN0IHsKKwlteSAoJHJldiwgJGZpbGUpID0gQF87CisKKwlteSAkcmV2bGlzdDsKKwlpZiAoJHJldl9maWxlKSB7CisJCW9wZW4oJHJldmxpc3QsICc8JyAuICRyZXZfZmlsZSkKKwkJICAgIG9yIGRpZSAiRmFpbGVkIHRvIG9wZW4gJHJldl9maWxlIDogJCEiOworCX0gZWxzZSB7CisJCSRyZXZsaXN0ID0gb3Blbl9waXBlKCJnaXQtcmV2LWxpc3QiLCItLXBhcmVudHMiLCItLXJlbW92ZS1lbXB0eSIsJHJldiwiLS0iLCRmaWxlKQorCQkJb3IgZGllICJGYWlsZWQgdG8gZXhlYyBnaXQtcmV2LWxpc3Q6ICQhIjsKKwl9CisKKwlteSBAcmV2czsKKwl3aGlsZShteSAkbGluZSA9IDwkcmV2bGlzdD4pIHsKKwkJY2hvbXAgJGxpbmU7CisJCW15ICgkcmV2LCBAcGFyZW50cykgPSBzcGxpdCAvXHMrLywgJGxpbmU7CisJCXB1c2ggQHJldnMsIFsgJHJldiwgQHBhcmVudHMgXTsKKwl9CisJY2xvc2UoJHJldmxpc3QpOworCisJcHJpbnRmKCIwIHJldnMgZm91bmQgZm9yIHJldiAlcyAoJXMpXG4iLCAkcmV2LCAkZmlsZSkgaWYgKEByZXZzID09IDApOworCXJldHVybiBAcmV2czsKK30KKworc3ViIGZpbmRfcGFyZW50X3JlbmFtZXMgeworCW15ICgkcmV2LCAkZmlsZSkgPSBAXzsKKworCW15ICRwYXRjaCA9IG9wZW5fcGlwZSgiZ2l0LWRpZmYtdHJlZSIsICItTTUwIiwgIi1yIiwiLS1uYW1lLXN0YXR1cyIsICIteiIsIiRyZXYiKQorCQlvciBkaWUgIkZhaWxlZCB0byBleGVjIGdpdC1kaWZmOiAkISI7CisKKwlsb2NhbCAkLyA9ICJcMCI7CisJbXkgJWJvdW5kOworCW15ICRqdW5rID0gPCRwYXRjaD47CisJd2hpbGUgKG15ICRjaGFuZ2UgPSA8JHBhdGNoPikgeworCQljaG9tcCAkY2hhbmdlOworCQlteSAkZmlsZW5hbWUgPSA8JHBhdGNoPjsKKwkJaWYgKCFkZWZpbmVkICRmaWxlbmFtZSkgeworCQkJbmV4dDsKKwkJfQorCQljaG9tcCAkZmlsZW5hbWU7CisKKwkJaWYgKCRjaGFuZ2UgPX4gbS9eW0FNRF0kLyApIHsKKwkJCW5leHQ7CisJCX0gZWxzaWYgKCRjaGFuZ2UgPX4gbS9eUi8gKSB7CisJCQlteSAkb2xkZmlsZW5hbWUgPSAkZmlsZW5hbWU7CisJCQkkZmlsZW5hbWUgPSA8JHBhdGNoPjsKKwkJCWNob21wICRmaWxlbmFtZTsKKwkJCWlmICggJGZpbGUgZXEgJGZpbGVuYW1lICkgeworCQkJCW15ICRwYXJlbnQgPSBnaXRfZmluZF9wYXJlbnQoJHJldiwgJG9sZGZpbGVuYW1lKTsKKwkJCQlAYm91bmR7J3JldicsJ2ZpbGVuYW1lJ30gPSAoJHBhcmVudCwgJG9sZGZpbGVuYW1lKTsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJfQorCWNsb3NlKCRwYXRjaCk7CisKKwlyZXR1cm4gXCVib3VuZDsKK30KKworCitzdWIgZ2l0X2ZpbmRfcGFyZW50IHsKKwlteSAoJHJldiwgJGZpbGVuYW1lKSA9IEBfOworCisJbXkgJHJldnBhcmVudCA9IG9wZW5fcGlwZSgiZ2l0LXJldi1saXN0IiwiLS1yZW1vdmUtZW1wdHkiLCAiLS1wYXJlbnRzIiwiLS1tYXgtY291bnQ9MSIsIiRyZXYiLCItLSIsJGZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuIGdpdC1yZXYtbGlzdCB0byBmaW5kIGEgc2luZ2xlIHBhcmVudDogJCEiOworCisJbXkgJHBhcmVudGxpbmUgPSA8JHJldnBhcmVudD47CisJY2hvbXAgJHBhcmVudGxpbmU7CisJbXkgKCRyZXZmb3VuZCwkcGFyZW50KSA9IHNwbGl0IG0vXHMrLywgJHBhcmVudGxpbmU7CisKKwljbG9zZSgkcmV2cGFyZW50KTsKKworCXJldHVybiAkcGFyZW50OworfQorCisKKyMgR2V0IGEgZGlmZiBiZXR3ZWVuIHRoZSBjdXJyZW50IHJldmlzaW9uIGFuZCBhIHBhcmVudC4KKyMgUmVjb3JkIHRoZSBjb21taXQgaW5mb3JtYXRpb24gdGhhdCByZXN1bHRzLgorc3ViIGdpdF9kaWZmX3BhcnNlIHsKKwlteSAoJHBhcmVudCwgJHJldiwgJXJldmluZm8pID0gQF87CisKKwlteSAkZGlmZiA9IG9wZW5fcGlwZSgiZ2l0LWRpZmYtdHJlZSIsIi1NIiwiLXAiLCRyZXYsJHBhcmVudCwiLS0iLAorCQkJJHJldnN7JHJldn17J2ZpbGVuYW1lJ30sICRyZXZzeyRwYXJlbnR9eydmaWxlbmFtZSd9KQorCQlvciBkaWUgIkZhaWxlZCB0byBjYWxsIGdpdC1kaWZmIGZvciBhbm5vdGF0aW9uOiAkISI7CisKKwlfZ2l0X2RpZmZfcGFyc2UoJGRpZmYsICRwYXJlbnQsICRyZXYsICVyZXZpbmZvKTsKKworCWNsb3NlKCRkaWZmKTsKK30KKworc3ViIF9naXRfZGlmZl9wYXJzZSB7CisJbXkgKCRkaWZmLCAkcGFyZW50LCAkcmV2LCAlcmV2aW5mbykgPSBAXzsKKworCW15ICgkcmksICRwaSkgPSAoMCwwKTsKKwlteSAkc2xpbmVzID0gJHJldnN7JHJldn17J2xpbmVzJ307CisJbXkgQHBsaW5lczsKKworCW15ICRnb3RoZWFkZXIgPSAwOworCW15ICgkcmVtc3RhcnQpOworCW15ICgkaHVua19zdGFydCwgJGh1bmtfaW5kZXgpOworCXdoaWxlKDwkZGlmZj4pIHsKKwkJY2hvbXA7CisJCWlmIChtL15AQCAtKFxkKyksKFxkKykgXCsoXGQrKSwoXGQrKS8pIHsKKwkJCSRyZW1zdGFydCA9ICQxOworCQkJIyBBZGp1c3QgZm9yIDAtYmFzZWQgYXJyYXlzCisJCQkkcmVtc3RhcnQtLTsKKwkJCSMgUmVpbml0IGh1bmsgdHJhY2tpbmcuCisJCQkkaHVua19zdGFydCA9ICRyZW1zdGFydDsKKwkJCSRodW5rX2luZGV4ID0gMDsKKwkJCSRnb3RoZWFkZXIgPSAxOworCisJCQlmb3IgKG15ICRpID0gJHJpOyAkaSA8ICRyZW1zdGFydDsgJGkrKykgeworCQkJCSRwbGluZXNbJHBpKytdID0gJHNsaW5lcy0+WyRpXTsKKwkJCQkkcmkrKzsKKwkJCX0KKwkJCW5leHQ7CisJCX0gZWxzaWYgKCEkZ290aGVhZGVyKSB7CisJCQluZXh0OworCQl9CisKKwkJaWYgKG0vXlwrKC4qKSQvKSB7CisJCQlteSAkbGluZSA9ICQxOworCQkJJHBsaW5lc1skcGkrK10gPSBbICRsaW5lLCAnJywgJycsICcnLCAwIF07CisJCQluZXh0OworCisJCX0gZWxzaWYgKG0vXi0oLiopJC8pIHsKKwkJCW15ICRsaW5lID0gJDE7CisJCQlpZiAoZ2V0X2xpbmUoJHNsaW5lcywgJHJpKSBlcSAkbGluZSkgeworCQkJCSMgRm91bmQgYSBtYXRjaCwgY2xhaW0KKwkJCQljbGFpbV9saW5lKCRyaSwgJHJldiwgJHNsaW5lcywgJXJldmluZm8pOworCQkJfSBlbHNlIHsKKwkJCQlkaWUgc3ByaW50ZigiU3luYyBlcnJvcjogJWQvJWRcbnwlc1xufCVzXG4lcyA9PiAlc1xuIiwKKwkJCQkJCSRyaSwgJGh1bmtfc3RhcnQgKyAkaHVua19pbmRleCwKKwkJCQkJCSRsaW5lLAorCQkJCQkJZ2V0X2xpbmUoJHNsaW5lcywgJHJpKSwKKwkJCQkJCSRyZXYsICRwYXJlbnQpOworCQkJfQorCQkJJHJpKys7CisKKwkJfSBlbHNpZiAobS9eXFwvKSB7CisJCQk7CisJCQkjIFNraXAgXE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUuCisJCQkjIEJ1dCB0aGlzIGNhbiBiZSBpbnRlcm5hdGlvbmFsaXplZCwgc28gb25seSBsb29rCisJCQkjIGZvciBhbiBpbml0aWFsIFwKKworCQl9IGVsc2UgeworCQkJaWYgKHN1YnN0cigkXywxKSBuZSBnZXRfbGluZSgkc2xpbmVzLCRyaSkgKSB7CisJCQkJZGllIHNwcmludGYoIkxpbmUgJWQgKCVkKSBkb2VzIG5vdCBtYXRjaDpcbnwlc1xufCVzXG4lcyA9PiAlc1xuIiwKKwkJCQkJCSRodW5rX3N0YXJ0ICsgJGh1bmtfaW5kZXgsICRyaSwKKwkJCQkJCXN1YnN0cigkXywxKSwKKwkJCQkJCWdldF9saW5lKCRzbGluZXMsJHJpKSwKKwkJCQkJCSRyZXYsICRwYXJlbnQpOworCQkJfQorCQkJJHBsaW5lc1skcGkrK10gPSAkc2xpbmVzLT5bJHJpKytdOworCQl9CisJCSRodW5rX2luZGV4Kys7CisJfQorCWZvciAobXkgJGkgPSAkcmk7ICRpIDwgQHskc2xpbmVzfSA7ICRpKyspIHsKKwkJcHVzaCBAcGxpbmVzLCAkc2xpbmVzLT5bJHJpKytdOworCX0KKworCSRyZXZzeyRwYXJlbnR9e2xpbmVzfSA9IFxAcGxpbmVzOworCXJldHVybjsKK30KKworc3ViIGdldF9saW5lIHsKKwlteSAoJGxpbmVzLCAkaW5kZXgpID0gQF87CisKKwlyZXR1cm4gcmVmICRsaW5lcy0+WyRpbmRleF0gbmUgJycgPyAkbGluZXMtPlskaW5kZXhdWzBdIDogJGxpbmVzLT5bJGluZGV4XTsKK30KKworc3ViIGdpdF9jYXRfZmlsZSB7CisJbXkgKCRyZXYsICRmaWxlbmFtZSkgPSBAXzsKKwlyZXR1cm4gKCkgdW5sZXNzIGRlZmluZWQgJHJldiAmJiBkZWZpbmVkICRmaWxlbmFtZTsKKworCW15ICRibG9iID0gZ2l0X2xzX3RyZWUoJHJldiwgJGZpbGVuYW1lKTsKKwlkaWUgIkZhaWxlZCB0byBmaW5kIGEgYmxvYiBmb3IgJGZpbGVuYW1lIGluIHJldiAkcmV2XG4iIGlmICFkZWZpbmVkICRibG9iOworCisJbXkgJGNhdGZpbGUgPSBvcGVuX3BpcGUoImdpdCIsImNhdC1maWxlIiwgImJsb2IiLCAkYmxvYikKKwkJb3IgZGllICJGYWlsZWQgdG8gZ2l0LWNhdC1maWxlIGJsb2IgJGJsb2IgKHJldiAkcmV2LCBmaWxlICRmaWxlbmFtZSk6ICIgLiAkITsKKworCW15IEBsaW5lczsKKwl3aGlsZSg8JGNhdGZpbGU+KSB7CisJCWNob21wOworCQlwdXNoIEBsaW5lcywgJF87CisJfQorCWNsb3NlKCRjYXRmaWxlKTsKKworCXJldHVybiBAbGluZXM7Cit9CisKK3N1YiBnaXRfbHNfdHJlZSB7CisJbXkgKCRyZXYsICRmaWxlbmFtZSkgPSBAXzsKKworCW15ICRsc3RyZWUgPSBvcGVuX3BpcGUoImdpdCIsImxzLXRyZWUiLCRyZXYsJGZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBjYWxsIGdpdCBscy10cmVlOiAkISI7CisKKwlteSAoJG1vZGUsICR0eXBlLCAkYmxvYiwgJHRmaWxlbmFtZSk7CisJd2hpbGUoPCRsc3RyZWU+KSB7CisJCWNob21wOworCQkoJG1vZGUsICR0eXBlLCAkYmxvYiwgJHRmaWxlbmFtZSkgPSBzcGxpdCgvXHMrLywgJF8sIDQpOworCQlsYXN0IGlmICgkdGZpbGVuYW1lIGVxICRmaWxlbmFtZSk7CisJfQorCWNsb3NlKCRsc3RyZWUpOworCisJcmV0dXJuICRibG9iIGlmICgkdGZpbGVuYW1lIGVxICRmaWxlbmFtZSk7CisJZGllICJnaXQtbHMtdHJlZSBmYWlsZWQgdG8gZmluZCBibG9iIGZvciAkZmlsZW5hbWUiOworCit9CisKKworCitzdWIgY2xhaW1fbGluZSB7CisJbXkgKCRmbG9mZnNldCwgJHJldiwgJGxpbmVzLCAlcmV2aW5mbykgPSBAXzsKKwlteSAkb2xpbmUgPSBnZXRfbGluZSgkbGluZXMsICRmbG9mZnNldCk7CisJQHskbGluZXMtPlskZmxvZmZzZXRdfSA9ICggJG9saW5lLCAkcmV2LAorCQkkcmV2aW5mb3snYXV0aG9yJ30sICRyZXZpbmZveydhdXRob3JfZGF0ZSd9ICk7CisJI3ByaW50ZigiQ2xhaW1pbmcgbGluZSAlZCB3aXRoIHJldiAlczogJyVzJ1xuIiwKKwkjCQkkZmxvZmZzZXQsICRyZXYsICRvbGluZSkgaWYgMTsKK30KKworc3ViIGdpdF9jb21taXRfaW5mbyB7CisJbXkgKCRyZXYpID0gQF87CisJbXkgJGNvbW1pdCA9IG9wZW5fcGlwZSgiZ2l0LWNhdC1maWxlIiwgImNvbW1pdCIsICRyZXYpCisJCW9yIGRpZSAiRmFpbGVkIHRvIGNhbGwgZ2l0LWNhdC1maWxlOiAkISI7CisKKwlteSAlaW5mbzsKKwl3aGlsZSg8JGNvbW1pdD4pIHsKKwkJY2hvbXA7CisJCWxhc3QgaWYgKGxlbmd0aCAkXyA9PSAwKTsKKworCQlpZiAobS9eYXV0aG9yICguKikgPCguKik+ICguKikkLykgeworCQkJJGluZm97J2F1dGhvcid9ID0gJDE7CisJCQkkaW5mb3snYXV0aG9yX2VtYWlsJ30gPSAkMjsKKwkJCSRpbmZveydhdXRob3JfZGF0ZSd9ID0gJDM7CisJCX0gZWxzaWYgKG0vXmNvbW1pdHRlciAoLiopIDwoLiopPiAoLiopJC8pIHsKKwkJCSRpbmZveydjb21taXR0ZXInfSA9ICQxOworCQkJJGluZm97J2NvbW1pdHRlcl9lbWFpbCd9ID0gJDI7CisJCQkkaW5mb3snY29tbWl0dGVyX2RhdGUnfSA9ICQzOworCQl9CisJfQorCWNsb3NlKCRjb21taXQpOworCisJcmV0dXJuICVpbmZvOworfQorCitzdWIgZm9ybWF0X2RhdGUgeworCWlmICgkcmF3dGltZSkgeworCQlyZXR1cm4gJF9bMF07CisJfQorCW15ICgkdGltZXN0YW1wLCAkdGltZXpvbmUpID0gc3BsaXQoJyAnLCAkX1swXSk7CisJbXkgJG1pbnV0ZXMgPSBhYnMoJHRpbWV6b25lKTsKKwkkbWludXRlcyA9IGludCgkbWludXRlcyAvIDEwMCkgKiA2MCArICgkbWludXRlcyAlIDEwMCk7CisJaWYgKCR0aW1lem9uZSA8IDApIHsKKwkgICAgJG1pbnV0ZXMgPSAtJG1pbnV0ZXM7CisJfQorCW15ICR0ID0gJHRpbWVzdGFtcCArICRtaW51dGVzICogNjA7CisJcmV0dXJuIHN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyAiIC4gJHRpbWV6b25lLCBnbXRpbWUoJHQpKTsKK30KKworIyBDb3BpZWQgZnJvbSBnaXQtc2VuZC1lbWFpbC5wZXJsIC0gV2UgbmVlZCBhIEdpdC5wbSBtb2R1bGUuLgorc3ViIGdpdHZhciB7CisgICAgbXkgKCR2YXIpID0gQF87CisgICAgbXkgJGZoOworICAgIG15ICRwaWQgPSBvcGVuKCRmaCwgJy18Jyk7CisgICAgZGllICIkISIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKyAgICBpZiAoISRwaWQpIHsKKwlleGVjKCdnaXQtdmFyJywgJHZhcikgb3IgZGllICIkISI7CisgICAgfQorICAgIG15ICgkdmFsKSA9IDwkZmg+OworICAgIGNsb3NlICRmaCBvciBkaWUgIiQhIjsKKyAgICBjaG9tcCgkdmFsKTsKKyAgICByZXR1cm4gJHZhbDsKK30KKworc3ViIGdpdHZhcl9uYW1lIHsKKyAgICBteSAoJG5hbWUpID0gQF87CisgICAgbXkgJHZhbCA9IGdpdHZhcigkbmFtZSk7CisgICAgbXkgQGZpZWxkID0gc3BsaXQoL1xzKy8sICR2YWwpOworICAgIHJldHVybiBqb2luKCcgJywgQGZpZWxkWzAuLi4oQGZpZWxkLTQpXSk7Cit9CisKK3N1YiBvcGVuX3BpcGUgeworCWlmICgkXk8gZXEgJyMjSU5TRVJUX0FDVElWRVNUQVRFX1NUUklOR19IRVJFIyMnKSB7CisJCXJldHVybiBvcGVuX3BpcGVfYWN0aXZlc3RhdGUoQF8pOworCX0gZWxzZSB7CisJCXJldHVybiBvcGVuX3BpcGVfbm9ybWFsKEBfKTsKKwl9Cit9CisKK3N1YiBvcGVuX3BpcGVfYWN0aXZlc3RhdGUgeworCXRpZSAqZmgsICJHaXQ6OkFjdGl2ZVN0YXRlUGlwZSIsIEBfOworCXJldHVybiAqZmg7Cit9CisKK3N1YiBvcGVuX3BpcGVfbm9ybWFsIHsKKwlteSAoQGV4ZWNsaXN0KSA9IEBfOworCisJbXkgJHBpZCA9IG9wZW4gbXkgJGtpZCwgIi18IjsKKwlkZWZpbmVkICRwaWQgb3IgZGllICJDYW5ub3QgZm9yazogJCEiOworCisJdW5sZXNzICgkcGlkKSB7CisJCWV4ZWMgQGV4ZWNsaXN0OworCQlkaWUgIkNhbm5vdCBleGVjIEBleGVjbGlzdDogJCEiOworCX0KKworCXJldHVybiAka2lkOworfQorCitwYWNrYWdlIEdpdDo6QWN0aXZlU3RhdGVQaXBlOwordXNlIHN0cmljdDsKKworc3ViIFRJRUhBTkRMRSB7CisJbXkgKCRjbGFzcywgQHBhcmFtcykgPSBAXzsKKwlteSAkY21kbGluZSA9IGpvaW4gIiAiLCBAcGFyYW1zOworCW15ICBAZGF0YSA9IHF4eyRjbWRsaW5lfTsKKwlibGVzcyB7IGkgPT4gMCwgZGF0YSA9PiBcQGRhdGEgfSwgJGNsYXNzOworfQorCitzdWIgUkVBRExJTkUgeworCW15ICRzZWxmID0gc2hpZnQ7CisJaWYgKCRzZWxmLT57aX0gPj0gc2NhbGFyIEB7JHNlbGYtPntkYXRhfX0pIHsKKwkJcmV0dXJuIHVuZGVmOworCX0KKwlyZXR1cm4gJHNlbGYtPnsnZGF0YSd9LT5bICRzZWxmLT57aX0rKyBdOworfQorCitzdWIgQ0xPU0UgeworCW15ICRzZWxmID0gc2hpZnQ7CisJZGVsZXRlICRzZWxmLT57ZGF0YX07CisJZGVsZXRlICRzZWxmLT57aX07Cit9CisKK3N1YiBFT0YgeworCW15ICRzZWxmID0gc2hpZnQ7CisJcmV0dXJuICgkc2VsZi0+e2l9ID49IHNjYWxhciBAeyRzZWxmLT57ZGF0YX19KTsKK30KZGlmZiAtLWdpdCBhL2dpdC1hcHBseW1ib3guc2ggYi9naXQtYXBwbHltYm94LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1NjlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtYXBwbHltYm94LnNoCkBAIC0wLDAgKzEsMTE2IEBACisjIS9iaW4vc2gKKyMjCisjIyAiZG90ZXN0IiBpcyBteSBzdHVwaWQgbmFtZSBmb3IgbXkgcGF0Y2gtYXBwbGljYXRpb24gc2NyaXB0LCB3aGljaAorIyMgSSBuZXZlciBnb3QgYXJvdW5kIHRvIHJlbmFtaW5nIGFmdGVyIEkgdGVzdGVkIGl0LiBXZSdyZSBub3cgb24gdGhlCisjIyBzZWNvbmQgZ2VuZXJhdGlvbiBvZiBzY3JpcHRzLCBzdGlsbCBjYWxsZWQgImRvdGVzdCIuCisjIworIyMgVXBkYXRlOiBSeWFuIEFuZGVyc29uIGZpbmFsbHkgc2hhbWVkIG1lIGludG8gbmFtaW5nIHRoaXMgImFwcGx5bWJveCIuCisjIworIyMgWW91IGdpdmUgaXQgYSBtYm94LWZvcm1hdCBjb2xsZWN0aW9uIG9mIGVtYWlscywgYW5kIGl0IHdpbGwgdHJ5IHRvCisjIyBhcHBseSB0aGVtIHRvIHRoZSBrZXJuZWwgdXNpbmcgImFwcGx5cGF0Y2giCisjIworIyMgVGhlIHBhdGNoIGFwcGxpY2F0aW9uIG1heSBmYWlsIGluIHRoZSBtaWRkbGUuICBJbiB3aGljaCBjYXNlOgorIyMgKDEpIGxvb2sgYXQgLmRvdGVzdC9wYXRjaCBhbmQgZml4IGl0IHVwIHRvIGFwcGx5CisjIyAoMikgcmUtcnVuIGFwcGx5bWJveCB3aXRoIC1jIC5kb3Rlc3QvbXNnLW51bWJlciBmb3IgdGhlIGN1cnJlbnQgb25lLgorIyMgUGF5IGEgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpZiB5b3UgZG8gdGhpcyBhbmQKKyMjIHVzZSBhIFNpZ25vZmZfZmlsZSwgYmVjYXVzZSBhcHBseXBhdGNoIHdhbnRzIHRvIGFwcGVuZCB0aGUgc2lnbi1vZmYKKyMjIG1lc3NhZ2UgdG8gbXNnLWNsZWFuIGV2ZXJ5IHRpbWUgaXQgaXMgcnVuLgorIyMKKyMjIGdpdC1hbSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgbmV3ZXIgYW5kIGJldHRlciB0b29sIGZvciB0aGlzIGpvYi4KKworVVNBR0U9J1stdV0gWy1rXSBbLXFdIFstbV0gKC1jIC5kb3Rlc3QvPG51bT4gfCBtYm94KSBbc2lnbm9mZl0nCisuIGdpdC1zaC1zZXR1cAorCitnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKK2tlZXBfc3ViamVjdD0gcXVlcnlfYXBwbHk9IGNvbnRpbnVlPSB1dGY4PSByZXN1bWU9dAord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLXUpCXV0Zjg9LXUgOzsKKwktaykJa2VlcF9zdWJqZWN0PS1rIDs7CisJLXEpCXF1ZXJ5X2FwcGx5PXQgOzsKKwktYykJY29udGludWU9IiQyIjsgcmVzdW1lPWY7IHNoaWZ0IDs7CisJLW0pCWZhbGxfYmFja18zd2F5PXQgOzsKKwktKikJdXNhZ2UgOzsKKwkqKQlicmVhayA7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitjYXNlICIkY29udGludWUiIGluCisnJykKKwlybSAtcmYgLmRvdGVzdAorCW1rZGlyIC5kb3Rlc3QKKwludW1fbXNncz0kKGdpdC1tYWlsc3BsaXQgIiQxIiAuZG90ZXN0KSB8fCBleGl0IDEKKwllY2hvICIkbnVtX21zZ3MgcGF0Y2goZXMpIHRvIHByb2Nlc3MuIgorCXNoaWZ0Citlc2FjCisKK2ZpbGVzPSQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCkgfHwgZXhpdAoraWYgWyAiJGZpbGVzIiBdOyB0aGVuCisgICBlY2hvICJEaXJ0eSBpbmRleDogY2Fubm90IGFwcGx5IHBhdGNoZXMgKGRpcnR5OiAkZmlsZXMpIiA+JjIKKyAgIGV4aXQgMQorZmkKKworY2FzZSAiJHF1ZXJ5X2FwcGx5IiBpbgordCkJdG91Y2ggLmRvdGVzdC8ucXVlcnlfYXBwbHkKK2VzYWMKK2Nhc2UgIiRmYWxsX2JhY2tfM3dheSIgaW4KK3QpCTogPi5kb3Rlc3QvLjN3YXkKK2VzYWMKK2Nhc2UgIiRrZWVwX3N1YmplY3QiIGluCistaykJOiA+LmRvdGVzdC8ua2VlcF9zdWJqZWN0Citlc2FjCisKK3NpZ25vZmY9IiQxIgorc2V0IHggLmRvdGVzdC8wKgorc2hpZnQKK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhazs7IGVzYWMKK2RvCisgICAgaT0iJDEiIAorICAgIGNhc2UgIiRyZXN1bWUsJGNvbnRpbnVlIiBpbgorICAgIGYsJGkpCXJlc3VtZT10OzsKKyAgICBmLCopCXNoaWZ0CisJCWNvbnRpbnVlOzsKKyAgICAqKQorCSAgICBnaXQtbWFpbGluZm8gJGtlZXBfc3ViamVjdCAkdXRmOCBcCisJCS5kb3Rlc3QvbXNnIC5kb3Rlc3QvcGF0Y2ggPCRpID4uZG90ZXN0L2luZm8gfHwgZXhpdCAxCisJICAgIGdpdC1zdHJpcHNwYWNlIDwgLmRvdGVzdC9tc2cgPiAuZG90ZXN0L21zZy1jbGVhbgorCSAgICA7OworICAgIGVzYWMKKyAgICB3aGlsZSA6OyAjIGZvciBmaXhpbmcgdXAgYW5kIHJldHJ5CisgICAgZG8KKwlnaXQtYXBwbHlwYXRjaCAuZG90ZXN0L21zZy1jbGVhbiAuZG90ZXN0L3BhdGNoIC5kb3Rlc3QvaW5mbyAiJHNpZ25vZmYiCisJY2FzZSAiJD8iIGluCisJMCkKKwkJIyBSZW1vdmUgdGhlIGNsZWFubHkgYXBwbGllZCBvbmUgdG8gcmVkdWNlIGNsdXR0ZXIuCisJCXJtIC1mIC5kb3Rlc3QvJGkKKwkJOzsKKwkyKQorCQkjIDIgaXMgYSBzcGVjaWFsIGV4aXQgY29kZSBmcm9tIGFwcGx5cGF0Y2ggdG8gaW5kaWNhdGUgdGhhdAorCSAgICAJIyB0aGUgcGF0Y2ggd2Fzbid0IGFwcGxpZWQsIGJ1dCBjb250aW51ZSBhbnl3YXkgCisJCTs7CisJKikKKwkJcmV0PSQ/CisJCWlmIHRlc3QgLWYgLmRvdGVzdC8ucXVlcnlfYXBwbHkKKwkJdGhlbgorCQkJZWNobyA+JjIgIiogUGF0Y2ggZmFpbGVkLiIKKwkJCWVjaG8gPiYyICIqIFlvdSBjb3VsZCBmaXggaXQgdXAgaW4geW91ciBlZGl0b3IgYW5kIgorCQkJZWNobyA+JjIgIiAgcmV0cnkuICBJZiB5b3Ugd2FudCB0byBkbyBzbywgc2F5IHllcyBoZXJlIgorCQkJZWNobyA+JjIgIiAgQUZURVIgZml4aW5nIC5kb3Rlc3QvcGF0Y2ggdXAuIgorCQkJZWNobyA+JjIgLW4gIlJldHJ5IFt5L05dPyAiCisJCQlyZWFkIHllc25vCisJCQljYXNlICIkeWVzbm8iIGluCisJCQlbWXldKikKKwkJCQljb250aW51ZSA7OworCQkgICAgICAgIGVzYWMKKwkJZmkKKwkJZXhpdCAkcmV0CisJZXNhYworCWJyZWFrCisgICAgZG9uZQorICAgIHNoaWZ0Citkb25lCisjIHJldHVybiB0byBwcmlzdGluZQorcm0gLWZyIC5kb3Rlc3QKZGlmZiAtLWdpdCBhL2dpdC1hcHBseXBhdGNoLnNoIGIvZ2l0LWFwcGx5cGF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTRiMDk0NwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1hcHBseXBhdGNoLnNoCkBAIC0wLDAgKzEsMjEyIEBACisjIS9iaW4vc2gKKyMjCisjIyBhcHBseXBhdGNoIHRha2VzIGZvdXIgZmlsZSBhcmd1bWVudHMsIGFuZCB1c2VzIHRob3NlIHRvCisjIyBhcHBseSB0aGUgdW5wYWNrZWQgcGF0Y2ggKHN1cnByaXNlIHN1cnByaXNlKSB0aGF0IHRoZXkKKyMjIHJlcHJlc2VudCB0byB0aGUgY3VycmVudCB0cmVlLgorIyMKKyMjIFRoZSBhcmd1bWVudHMgYXJlOgorIyMJJDEgLSBmaWxlIHdpdGggY29tbWl0IG1lc3NhZ2UKKyMjCSQyIC0gZmlsZSB3aXRoIHRoZSBhY3R1YWwgcGF0Y2gKKyMjCSQzIC0gImluZm8iIGZpbGUgd2l0aCBBdXRob3IsIGVtYWlsIGFuZCBzdWJqZWN0CisjIwkkNCAtIG9wdGlvbmFsIGZpbGUgY29udGFpbmluZyBzaWdub2ZmIHRvIGFkZAorIyMKKworVVNBR0U9Jzxtc2c+IDxwYXRjaD4gPGluZm8+IFs8c2lnbm9mZj5dJworLiBnaXQtc2gtc2V0dXAKKworY2FzZSAiJCMiIGluIDN8NCkgOzsgKikgdXNhZ2UgOzsgZXNhYworCitmaW5hbD0uZG90ZXN0L2ZpbmFsLWNvbW1pdAorIyMKKyMjIElmIHRoaXMgZmlsZSBleGlzdHMsIHdlIGFzayBiZWZvcmUgYXBwbHlpbmcKKyMjCitxdWVyeV9hcHBseT0uZG90ZXN0Ly5xdWVyeV9hcHBseQorCisjIyBXZSBkbyBub3QgbXVuZ2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHRvbyBtdWNoCisjIyBpZiB0aGlzIGZpbGUgZXhpc3RzLgora2VlcF9zdWJqZWN0PS5kb3Rlc3QvLmtlZXBfc3ViamVjdAorCisjIyBXZSBkbyBub3QgYXR0ZW1wdCB0aGUgMy13YXkgbWVyZ2UgZmFsbGJhY2sgdW5sZXNzIHRoaXMgZmlsZSBleGlzdHMuCitmYWxsX2JhY2tfM3dheT0uZG90ZXN0Ly4zd2F5CisKK01TR0ZJTEU9JDEKK1BBVENIRklMRT0kMgorSU5GTz0kMworU0lHTk9GRj0kNAorRURJVD0ke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0KKworZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJChzZWQgLW4gJy9eQXV0aG9yLyBzL0F1dGhvcjogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIkKHNlZCAtbiAnL15FbWFpbC8gcy9FbWFpbDogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBHSVRfQVVUSE9SX0RBVEU9IiQoc2VkIC1uICcvXkRhdGUvIHMvRGF0ZTogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBTVUJKRUNUPSIkKHNlZCAtbiAnL15TdWJqZWN0LyBzL1N1YmplY3Q6IC8vcCcgIiRJTkZPIikiCisKK2lmIHRlc3QgJycgIT0gIiRTSUdOT0ZGIgordGhlbgorCWlmIHRlc3QgLWYgIiRTSUdOT0ZGIgorCXRoZW4KKwkJU0lHTk9GRj1gY2F0ICIkU0lHTk9GRiJgIHx8IGV4aXQKKwllbGlmIGNhc2UgIiRTSUdOT0ZGIiBpbiB5ZXMgfCB0cnVlIHwgbWUgfCBwbGVhc2UpIDogOzsgKikgZmFsc2UgOzsgZXNhYworCXRoZW4KKwkJU0lHTk9GRj1gZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UIHwgc2VkIC1lICcKKwkJCQlzLz4uKi8+LworCQkJCXMvXi9TaWduZWQtb2ZmLWJ5OiAvJworCQlgCisJZWxzZQorCQlTSUdOT0ZGPQorCWZpCisJaWYgdGVzdCAnJyAhPSAiJFNJR05PRkYiCisJdGhlbgorCQlMQVNUX1NJR05FRF9PRkZfQlk9YAorCQkJc2VkIC1uZSAnL15TaWduZWQtb2ZmLWJ5OiAvcCcgIiRNU0dGSUxFIiB8CisJCQl0YWlsIC1uIDEKKwkJYAorCQl0ZXN0ICIkTEFTVF9TSUdORURfT0ZGX0JZIiA9ICIkU0lHTk9GRiIgfHwgeworCQkgICAgdGVzdCAnJyA9ICIkTEFTVF9TSUdORURfT0ZGX0JZIiAmJiBlY2hvCisJCSAgICBlY2hvICIkU0lHTk9GRiIKKwkJfSA+PiIkTVNHRklMRSIKKwlmaQorZmkKKworcGF0Y2hfaGVhZGVyPQordGVzdCAtZiAiJGtlZXBfc3ViamVjdCIgfHwgcGF0Y2hfaGVhZGVyPSdbUEFUQ0hdICcKKworeworCWVjaG8gIiRwYXRjaF9oZWFkZXIkU1VCSkVDVCIKKwlpZiB0ZXN0IC1zICIkTVNHRklMRSIKKwl0aGVuCisJCWVjaG8KKwkJY2F0ICIkTVNHRklMRSIKKwlmaQorfSA+IiRmaW5hbCIKKworaW50ZXJhY3RpdmU9eWVzCit0ZXN0IC1mICIkcXVlcnlfYXBwbHkiIHx8IGludGVyYWN0aXZlPW5vCisKK3doaWxlIFsgIiRpbnRlcmFjdGl2ZSIgPSB5ZXMgXTsgZG8KKwllY2hvICJDb21taXQgQm9keSBpczoiCisJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJY2F0ICIkZmluYWwiCisJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJcHJpbnRmICJBcHBseT8gW3ldZXMvW25dby9bZV1kaXQvW2FdY2NlcHQgYWxsICIKKwlyZWFkIHJlcGx5CisJY2FzZSAiJHJlcGx5IiBpbgorCQl5fFkpIGludGVyYWN0aXZlPW5vOzsKKwkJbnxOKSBleGl0IDI7OwkjIHNwZWNpYWwgdmFsdWUgdG8gdGVsbCBkb3Rlc3QgdG8ga2VlcCBnb2luZworCQllfEUpICIkRURJVCIgIiRmaW5hbCI7OworCQlhfEEpIHJtIC1mICIkcXVlcnlfYXBwbHkiCisJCSAgICAgaW50ZXJhY3RpdmU9bm8gOzsKKwllc2FjCitkb25lCisKK2lmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9hcHBseXBhdGNoLW1zZwordGhlbgorCSIkR0lUX0RJUiIvaG9va3MvYXBwbHlwYXRjaC1tc2cgIiRmaW5hbCIgfHwgZXhpdAorZmkKKworZWNobworZWNobyBBcHBseWluZyAiJyRTVUJKRUNUJyIKK2VjaG8KKworZ2l0LWFwcGx5IC0taW5kZXggIiRQQVRDSEZJTEUiIHx8IHsKKworCSMgZ2l0LWFwcGx5IGV4aXRzIHdpdGggc3RhdHVzIDEgd2hlbiB0aGUgcGF0Y2ggZG9lcyBub3QgYXBwbHksCisJIyBidXQgaXQgZGllKClzIHdpdGggb3RoZXIgZmFpbHVyZXMsIG1vc3Qgbm90YWJseSB1cG9uIGNvcnJ1cHQKKwkjIHBhdGNoLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGVyZSBpcyBubyBwb2ludCB0byB0cnkgYXBwbHlpbmcKKwkjIGl0IHRvIGFub3RoZXIgdHJlZSBhbmQgZG8gMy13YXkgbWVyZ2UuCisJdGVzdCAkPyA9IDEgfHwgZXhpdCAxCisKKwl0ZXN0IC1mICIkZmFsbF9iYWNrXzN3YXkiIHx8IGV4aXQgMQorCisJIyBIZXJlIGlmIHdlIGtub3cgd2hpY2ggcmV2aXNpb24gdGhlIHBhdGNoIGFwcGxpZXMgdG8sCisJIyB3ZSBjcmVhdGUgYSB0ZW1wb3Jhcnkgd29ya2luZyB0cmVlIGFuZCBpbmRleCwgYXBwbHkgdGhlCisJIyBwYXRjaCwgYW5kIGF0dGVtcHQgMy13YXkgbWVyZ2Ugd2l0aCB0aGUgcmVzdWx0aW5nIHRyZWUuCisKKwlPX09CSkVDVD1gY2QgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIgJiYgcHdkYAorCXJtIC1mciAucGF0Y2gtbWVyZ2UtKgorCisJaWYgZ2l0LWFwcGx5IC16IC0taW5kZXgtaW5mbyAiJFBBVENIRklMRSIgXAorCQk+LnBhdGNoLW1lcmdlLWluZGV4LWluZm8gMj4vZGV2L251bGwgJiYKKwkJR0lUX0lOREVYX0ZJTEU9LnBhdGNoLW1lcmdlLXRtcC1pbmRleCBcCisJCWdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvIDwucGF0Y2gtbWVyZ2UtaW5kZXgtaW5mbyAmJgorCQlHSVRfSU5ERVhfRklMRT0ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IFwKKwkJZ2l0LXdyaXRlLXRyZWUgPi5wYXRjaC1tZXJnZS10bXAtYmFzZSAmJgorCQkoCisJCQlta2RpciAucGF0Y2gtbWVyZ2UtdG1wLWRpciAmJgorCQkJY2QgLnBhdGNoLW1lcmdlLXRtcC1kaXIgJiYKKwkJCUdJVF9JTkRFWF9GSUxFPSIuLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IiBcCisJCQlHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJE9fT0JKRUNUIiBcCisJCQlnaXQtYXBwbHkgJGJpbmFyeSAtLWluZGV4CisJCSkgPCIkUEFUQ0hGSUxFIgorCXRoZW4KKwkJZWNobyBVc2luZyBpbmRleCBpbmZvIHRvIHJlY29uc3RydWN0IGEgYmFzZSB0cmVlLi4uCisJCW12IC5wYXRjaC1tZXJnZS10bXAtYmFzZSAucGF0Y2gtbWVyZ2UtYmFzZQorCQltdiAucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IC5wYXRjaC1tZXJnZS1pbmRleAorCWVsc2UKKwkoCisJCU49MTAKKworCQkjIE90aGVyd2lzZSwgdHJ5IG5lYXJieSB0cmVlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHRoZQorCQkjIHBhdGNoLgorCQlnaXQtcmV2LWxpc3QgLS1tYXgtY291bnQ9JE4gSEVBRAorCisJCSMgb3IgaG9waW5nIHRoZSBwYXRjaCBpcyBhZ2FpbnN0IGtub3duIHRhZ3MuLi4KKwkJZ2l0LWxzLXJlbW90ZSAtLXRhZ3MgLgorCSkgfAorCSAgICB3aGlsZSByZWFkIGJhc2UganVuaworCSAgICBkbworCQkjIFRyeSBpdCBpZiB3ZSBoYXZlIGl0IGFzIGEgdHJlZS4KKwkJZ2l0LWNhdC1maWxlIHRyZWUgIiRiYXNlIiA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKKworCQlybSAtZnIgLnBhdGNoLW1lcmdlLXRtcC0qICYmCisJCW1rZGlyIC5wYXRjaC1tZXJnZS10bXAtZGlyIHx8IGJyZWFrCisJCSgKKwkJCWNkIC5wYXRjaC1tZXJnZS10bXAtZGlyICYmCisJCQlHSVRfSU5ERVhfRklMRT0uLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4ICYmCisJCQlHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJE9fT0JKRUNUIiAmJgorCQkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFIEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisJCQlnaXQtcmVhZC10cmVlICIkYmFzZSIgJiYKKwkJCWdpdC1hcHBseSAtLWluZGV4ICYmCisJCQltdiAuLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IC4uLy5wYXRjaC1tZXJnZS1pbmRleCAmJgorCQkJZWNobyAiJGJhc2UiID4uLi8ucGF0Y2gtbWVyZ2UtYmFzZQorCQkpIDwiJFBBVENIRklMRSIgIDI+L2Rldi9udWxsICYmIGJyZWFrCisJICAgIGRvbmUKKwlmaQorCisJdGVzdCAtZiAucGF0Y2gtbWVyZ2UtaW5kZXggJiYKKwloaXNfdHJlZT0kKEdJVF9JTkRFWF9GSUxFPS5wYXRjaC1tZXJnZS1pbmRleCBnaXQtd3JpdGUtdHJlZSkgJiYKKwlvcmlnX3RyZWU9JChjYXQgLnBhdGNoLW1lcmdlLWJhc2UpICYmCisJcm0gLWZyIC5wYXRjaC1tZXJnZS0qIHx8IGV4aXQgMQorCisJZWNobyBGYWxsaW5nIGJhY2sgdG8gcGF0Y2hpbmcgYmFzZSBhbmQgMy13YXkgbWVyZ2UgdXNpbmcgJG9yaWdfdHJlZS4uLgorCisJIyBUaGlzIGlzIG5vdCBzbyB3cm9uZy4gIERlcGVuZGluZyBvbiB3aGljaCBiYXNlIHdlIHBpY2tlZCwKKwkjIG9yaWdfdHJlZSBtYXkgYmUgd2lsZGx5IGRpZmZlcmVudCBmcm9tIG91cnMsIGJ1dCBoaXNfdHJlZQorCSMgaGFzIHRoZSBzYW1lIHNldCBvZiB3aWxkbHkgZGlmZmVyZW50IGNoYW5nZXMgaW4gcGFydHMgdGhlCisJIyBwYXRjaCBkaWQgbm90IHRvdWNoLCBzbyByZXNvbHZlIGVuZHMgdXAgY2FuY2VsbGluZyB0aGVtLAorCSMgc2F5aW5nIHRoYXQgd2UgcmV2ZXJ0ZWQgYWxsIHRob3NlIGNoYW5nZXMuCisKKwlpZiBnaXQtbWVyZ2UtcmVzb2x2ZSAkb3JpZ190cmVlIC0tIEhFQUQgJGhpc190cmVlCisJdGhlbgorCQllY2hvIERvbmUuCisJZWxzZQorCQllY2hvIEZhaWxlZCB0byBtZXJnZSBpbiB0aGUgY2hhbmdlcy4KKwkJZXhpdCAxCisJZmkKK30KKworaWYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3ByZS1hcHBseXBhdGNoCit0aGVuCisJIiRHSVRfRElSIi9ob29rcy9wcmUtYXBwbHlwYXRjaCB8fCBleGl0CitmaQorCit0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpIHx8IGV4aXQgMQorZWNobyBXcm90ZSB0cmVlICR0cmVlCitwYXJlbnQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCitjb21taXQ9JChnaXQtY29tbWl0LXRyZWUgJHRyZWUgLXAgJHBhcmVudCA8IiRmaW5hbCIpIHx8IGV4aXQgMQorZWNobyBDb21taXR0ZWQ6ICRjb21taXQKK2dpdC11cGRhdGUtcmVmIC1tICJhcHBseXBhdGNoOiAkU1VCSkVDVCIgSEVBRCAkY29tbWl0ICRwYXJlbnQgfHwgZXhpdAorCitpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcG9zdC1hcHBseXBhdGNoCit0aGVuCisJIiRHSVRfRElSIi9ob29rcy9wb3N0LWFwcGx5cGF0Y2gKK2ZpCmRpZmYgLS1naXQgYS9naXQtYXJjaGltcG9ydC5wZXJsIGIvZ2l0LWFyY2hpbXBvcnQucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NDBiYzFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWFyY2hpbXBvcnQucGVybApAQCAtMCwwICsxLDEwNjggQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBUaGlzIHRvb2wgaXMgY29weXJpZ2h0IChjKSAyMDA1LCBNYXJ0aW4gTGFuZ2hvZmYuCisjIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHbnUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMKKyMgVGhlIGJhc2ljIGlkZWEgaXMgdG8gd2FsayB0aGUgb3V0cHV0IG9mIHRsYSBhYnJvd3NlLCAKKyMgZmV0Y2ggdGhlIGNoYW5nZXNldHMgYW5kIGFwcGx5IHRoZW0uIAorIworCis9aGVhZDEgSW52b2NhdGlvbgorCisgICAgZ2l0LWFyY2hpbXBvcnQgWyAtaCBdIFsgLXYgXSBbIC1vIF0gWyAtYSBdIFsgLWYgXSBbIC1UIF0gCisgICAgCVsgLUQgZGVwdGhdIFsgLXQgdGVtcGRpciBdIDxhcmNoaXZlPi88YnJhbmNoPiBbIDxhcmNoaXZlPi88YnJhbmNoPiBdCisKK0ltcG9ydHMgYSBwcm9qZWN0IGZyb20gb25lIG9yIG1vcmUgQXJjaCByZXBvc2l0b3JpZXMuIEl0IHdpbGwgZm9sbG93IGJyYW5jaGVzCithbmQgcmVwb3NpdG9yaWVzIHdpdGhpbiB0aGUgbmFtZXNwYWNlcyBkZWZpbmVkIGJ5IHRoZSA8YXJjaGl2ZS9icmFuY2g+CitwYXJhbWV0ZXJzIHN1cHBwbGllZC4gSWYgaXQgY2Fubm90IGZpbmQgdGhlIHJlbW90ZSBicmFuY2ggYSBtZXJnZSBjb21lcyBmcm9tCitpdCB3aWxsIGp1c3QgaW1wb3J0IGl0IGFzIGEgcmVndWxhciBjb21taXQuIElmIGl0IGNhbiBmaW5kIGl0LCBpdCB3aWxsIG1hcmsgaXQgCithcyBhIG1lcmdlIHdoZW5ldmVyIHBvc3NpYmxlLgorCitTZWUgbWFuICgxKSBnaXQtYXJjaGltcG9ydCBmb3IgbW9yZSBkZXRhaWxzLgorCis9aGVhZDEgVE9ETworCisgLSBjcmVhdGUgdGFnIG9iamVjdHMgaW5zdGVhZCBvZiByZWYgdGFncworIC0gYXVkaXQgc2hlbGwtZXNjYXBpbmcgb2YgZmlsZW5hbWVzCisgLSBoaWRlIG91ciBwcml2YXRlIHRhZ3Mgc29tZXdoZXJlIHNtYXJ0ZXIKKyAtIGZpbmQgYSB3YXkgdG8gbWFrZSAiY2F0ICpwYXRjaGVzIHwgcGF0Y2giIHNhZmUgZXZlbiB3aGVuIHBhdGNoZmlsZXMgYXJlIG1pc3NpbmcgbmV3bGluZXMgIAorIC0gc29ydCBhbmQgYXBwbHkgcGF0Y2hlcyBieSBncmFwaGluZyBhbmNlc3RyeSByZWxhdGlvbnMgaW5zdGVhZCBvZiBqdXN0CisgICByZWx5aW5nIGluIGRhdGVzIHN1cHBsaWVkIGluIHRoZSBjaGFuZ2VzZXQgaXRzZWxmLgorICAgdGxhIGFuY2VzdHJ5LWdyYXBoIC1tIGNvdWxkIGJlIGhlbHBmdWwgaGVyZS4uLgorCis9aGVhZDEgRGV2ZWwgdHJpY2tzCisKK0FkZCBwcmludCBpbiBmcm9udCBvZiB0aGUgc2hlbGwgY29tbWFuZHMgaW52b2tlZCB2aWEgYmFja3RpY2tzLiAKKworPWhlYWQxIERldmVsIE5vdGVzCisKK1RoZXJlIGFyZSBzZXZlcmFsIHBsYWNlcyB3aGVyZSBBcmNoIGFuZCBnaXQgdGVybWlub2xvZ3kgYXJlIGludGVybWl4ZWQKK2FuZCBwb3RlbnRpYWxseSBjb25mdXNlZC4KKworVGhlIG5vdGlvbiBvZiBhICJicmFuY2giIGluIGdpdCBpcyBhcHByb3hpbWF0ZWx5IGVxdWl2YWxlbnQgdG8KK2EgImFyY2hpdmUvY2F0ZWdvcnktLWJyYW5jaC0tdmVyc2lvbiIgaW4gQXJjaC4gIEFsc28sIGl0IHNob3VsZCBiZSBub3RlZAordGhhdCB0aGUgIi0tYnJhbmNoIiBwb3J0aW9uIG9mICJhcmNoaXZlL2NhdGVnb3J5LS1icmFuY2gtLXZlcnNpb24iIGlzIHJlYWxseQorb3B0aW9uYWwgaW4gQXJjaCBhbHRob3VnaCBub3QgbWFueSBwZW9wbGUgKG5vciB0b29scyEpIHNlZW0gdG8ga25vdyB0aGlzLgorVGhpcyBtZWFucyB0aGF0ICJhcmNoaXZlL2NhdGVnb3J5LS12ZXJzaW9uIiBpcyBhbHNvIGEgdmFsaWQgImJyYW5jaCIKK2luIGdpdCB0ZXJtcy4KKworV2UgYWx3YXlzIHJlZmVyIHRvIEFyY2ggbmFtZXMgYnkgdGhlaXIgZnVsbHkgcXVhbGlmaWVkIHZhcmlhbnQgKHdoaWNoCittZWFucyB0aGUgImFyY2hpdmUiIG5hbWUgaXMgcHJlZml4ZWQuCisKK0ZvciBwZW9wbGUgdW5mYW1pbGlhciB3aXRoIEFyY2gsIGFuICJhcmNoaXZlIiBpcyB0aGUgdGVybSBmb3IgInJlcG9zaXRvcnkiLAorYW5kIGNhbiBjb250YWluIG11bHRpcGxlLCB1bnJlbGF0ZWQgYnJhbmNoZXMuCisKKz1jdXQKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBkaXIpOwordXNlIEZpbGU6OlBhdGggcXcobWtwYXRoIHJtdHJlZSk7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoYmFzZW5hbWUgZGlybmFtZSk7Cit1c2UgRGF0YTo6RHVtcGVyIHF3LyBEdW1wZXIgLzsKK3VzZSBJUEM6Ok9wZW4yOworCiskU0lHeydQSVBFJ309IklHTk9SRSI7CiskRU5WeydUWid9PSJVVEMiOworCitteSAkZ2l0X2RpciA9ICRFTlZ7IkdJVF9ESVIifSB8fCAiLmdpdCI7CiskRU5WeyJHSVRfRElSIn0gPSAkZ2l0X2RpcjsKK215ICRwdGFnX2RpciA9ICIkZ2l0X2Rpci9hcmNoaW1wb3J0L3RhZ3MiOworCitvdXIoJG9wdF9oLCRvcHRfZiwkb3B0X3YsJG9wdF9ULCRvcHRfdCwkb3B0X0QsJG9wdF9hLCRvcHRfbyk7CisKK3N1YiB1c2FnZSgpIHsKKyAgICBwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogJHtcYmFzZW5hbWUgJDB9ICAgICAjIGZldGNoL3VwZGF0ZSBHSVQgZnJvbSBBcmNoCisgICAgICAgWyAtaCBdIFsgLXYgXSBbIC1vIF0gWyAtYSBdIFsgLWYgXSBbIC1UIF0gWyAtRCBkZXB0aCBdIFsgLXQgdGVtcGRpciBdCisgICAgICAgcmVwb3NpdG9yeS9hcmNoLWJyYW5jaCBbIHJlcG9zaXRvcnkvYXJjaC1icmFuY2hdIC4uLgorRU5ECisgICAgZXhpdCgxKTsKK30KKworZ2V0b3B0cygiZlRodmF0OkQ6Iikgb3IgdXNhZ2UoKTsKK3VzYWdlIGlmICRvcHRfaDsKKworQEFSR1YgPj0gMSBvciB1c2FnZSgpOworIyAkYXJjaF9icmFuY2hlczoKKyMgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBrZXlzOgorIyAgID0xIC0gQXJjaCB2ZXJzaW9uIC8gZ2l0ICdicmFuY2gnIGRldGVjdGVkIHZpYSBhYnJvd3NlIG9uIGEgbGltaXQKKyMgICA+MSAtIEFyY2ggdmVyc2lvbiAvIGdpdCAnYnJhbmNoJyBvZiBhbiBhdXhpbGxpYXJ5IGJyYW5jaCB3ZSd2ZSBtZXJnZWQKK215ICVhcmNoX2JyYW5jaGVzID0gbWFwIHsgJF8gPT4gMSB9IEBBUkdWOworCiskRU5WeydUTVBESVInfSA9ICRvcHRfdCBpZiAkb3B0X3Q7ICMgJEVOVntUTVBESVJ9IHdpbGwgYWZmZWN0IHRlbXBkaXIoKSBjYWxsczoKK215ICR0bXAgPSB0ZW1wZGlyKCdnaXQtYXJjaGltcG9ydC1YWFhYWFgnLCBUTVBESVIgPT4gMSwgQ0xFQU5VUCA9PiAxKTsKKyRvcHRfdiAmJiBwcmludCAiKyBVc2luZyAkdG1wIGFzIHRlbXBvcmFyeSBkaXJlY3RvcnlcbiI7CisKK215ICVyZWFjaGFibGUgPSAoKTsgICAgICAgICAgICAgIyBBcmNoIHJlcG9zaXRvcmllcyB3ZSBjYW4gYWNjZXNzCitteSAldW5yZWFjaGFibGUgPSAoKTsgICAgICAgICAgICMgQXJjaCByZXBvc2l0b3JpZXMgd2UgY2FuJ3QgYWNjZXNzIDo8CitteSBAcHNldHMgID0gKCk7ICAgICAgICAgICAgICAgICMgdGhlIGNvbGxlY3Rpb24KK215ICVwc2V0cyAgPSAoKTsgICAgICAgICAgICAgICAgIyB0aGUgY29sbGVjdGlvbiwgYnkgbmFtZQorbXkgJXN0YXRzICA9ICgJCQkjIFRyYWNrIHdoaWNoIHN0cmF0ZWd5IHdlIHVzZWQgdG8gaW1wb3J0OgorCWdldF90YWcgPT4gMCwgcmVwbGF5ID0+IDAsIGdldF9uZXcgPT4gMCwgZ2V0X2RlbHRhID0+IDAsCisgICAgICAgIHNpbXBsZV9jaGFuZ2VzZXQgPT4gMCwgaW1wb3J0X29yX3RhZyA9PiAwCispOworCitteSAlcnB0YWdzID0gKCk7ICAgICAgICAgICAgICAgICMgbXkgcmV2ZXJzZSBwcml2YXRlIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0byBtYXAgYSBTSEExIHRvIGEgY29tbWl0aWQKK215ICRUTEEgPSAkRU5WeydBUkNIX0NMSUVOVCd9IHx8ICd0bGEnOworCitzdWIgZG9fYWJyb3dzZSB7CisgICAgbXkgJHN0YWdlID0gc2hpZnQ7CisgICAgd2hpbGUgKG15ICgkbGltaXQsICRsZXZlbCkgPSBlYWNoICVhcmNoX2JyYW5jaGVzKSB7CisgICAgICAgIG5leHQgdW5sZXNzICRsZXZlbCA9PSAkc3RhZ2U7CisgICAgICAgIAorCW9wZW4gQUJST1dTRSwgIiRUTEEgYWJyb3dzZSAtZmtEIC0tbWVyZ2VzICRsaW1pdCB8IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGllICJQcm9ibGVtcyB3aXRoIHRsYSBhYnJvd3NlOiAkISI7CisgICAgCisgICAgICAgIG15ICVwcyAgICAgICAgPSAoKTsgICAgICAgICAjIHRoZSBjdXJyZW50IG9uZQorICAgICAgICBteSAkbGFzdHNlZW4gID0gJyc7CisgICAgCisgICAgICAgIHdoaWxlICg8QUJST1dTRT4pIHsKKyAgICAgICAgICAgIGNob21wOworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpcnN0IHJlY29yZCBwYWRkZWQgdyA4IHNwYWNlcworICAgICAgICAgICAgaWYgKHMvXlxzezh9XGIvLykgeworICAgICAgICAgICAgICAgIG15ICgkaWQsICR0eXBlKSA9IHNwbGl0KG0vXHMrLywgJF8sIDIpOworCisgICAgICAgICAgICAgICAgbXkgJWxhc3RfcHM7CisgICAgICAgICAgICAgICAgIyBzdG9yZSB0aGUgcmVjb3JkIHdlIGp1c3QgY2FwdHVyZWQKKyAgICAgICAgICAgICAgICBpZiAoJXBzICYmICFleGlzdHMgJHBzZXRzeyAkcHN7aWR9IH0pIHsKKyAgICAgICAgICAgICAgICAgICAgJWxhc3RfcHMgPSAlcHM7ICMgYnJlYWsgcmVmZXJlbmNlcworICAgICAgICAgICAgICAgICAgICBwdXNoIChAcHNldHMsIFwlbGFzdF9wcyk7CisgICAgICAgICAgICAgICAgICAgICRwc2V0c3sgJGxhc3RfcHN7aWR9IH0gPSBcJWxhc3RfcHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG15ICRicmFuY2ggPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRpZCk7CisgICAgICAgICAgICAgICAgJXBzID0gKCBpZCA9PiAkaWQsIGJyYW5jaCA9PiAkYnJhbmNoICk7CisgICAgICAgICAgICAgICAgaWYgKCVsYXN0X3BzICYmICgkbGFzdF9wc3ticmFuY2h9IGVxICRicmFuY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICRwc3twYXJlbnRfaWR9ID0gJGxhc3RfcHN7aWR9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAkYXJjaF9icmFuY2hlc3skYnJhbmNofSA9IDE7CisgICAgICAgICAgICAgICAgJGxhc3RzZWVuID0gJ2lkJzsKKworICAgICAgICAgICAgICAgICMgZGVhbCB3aXRoIHR5cGVzIChzaG91bGQgd29yayB3aXRoIGJheiBvciB0bGEpOgorICAgICAgICAgICAgICAgIGlmICgkdHlwZSA9fiBtL1woLipjaGFuZ2VzZXRcKS8pIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze3R5cGV9ID0gJ3MnOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCR0eXBlID1+IC9cKC4qaW1wb3J0XCkvKSB7CisgICAgICAgICAgICAgICAgICAgICRwc3t0eXBlfSA9ICdpJzsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkdHlwZSA9fiBtL1wodGFnLio/KFxTK1xAXFMrKS4qP1wpLykgeworICAgICAgICAgICAgICAgICAgICAkcHN7dHlwZX0gPSAndCc7CisgICAgICAgICAgICAgICAgICAgICMgcmVhZCB3aGljaCByZXZpc2lvbiB3ZSd2ZSB0YWdnZWQgd2hlbiB3ZSBwYXJzZSB0aGUgbG9nCisgICAgICAgICAgICAgICAgICAgICRwc3t0YWd9ICA9ICQxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgICAgICB3YXJuICJVbmtub3duIHR5cGUgJHR5cGUiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICRhcmNoX2JyYW5jaGVzeyRicmFuY2h9ID0gMTsKKyAgICAgICAgICAgICAgICAkbGFzdHNlZW4gPSAnaWQnOworICAgICAgICAgICAgfSBlbHNpZiAocy9eXHN7MTB9Ly8pIHsgCisgICAgICAgICAgICAgICAgIyAxMCBsZWFkaW5nIHNwYWNlcyBvciBtb3JlIAorICAgICAgICAgICAgICAgICMgaW5kaWNhdGUgY29tbWl0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBkYXRlCisgICAgICAgICAgICAgICAgaWYgKCRsYXN0c2VlbiBlcSAnaWQnICYmIG0vXihcZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGQpLyl7CisgICAgICAgICAgICAgICAgICAgICRwc3tkYXRlfSAgID0gJDE7CisgICAgICAgICAgICAgICAgICAgICRsYXN0c2VlbiA9ICdkYXRlJzsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkXyBlcSAnbWVyZ2VzIGluOicpIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze21lcmdlc30gPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgJGxhc3RzZWVuID0gJ21lcmdlcyc7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoJGxhc3RzZWVuIGVxICdtZXJnZXMnICYmIHMvXlxzezJ9Ly8pIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGlkID0gJF87CisgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JHBze21lcmdlc319LCAkaWQpOworICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAjIGFnZ3Jlc3NpdmUgYnJhbmNoIGZpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgIGlmICgkb3B0X0QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRicmFuY2ggPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkcmVwbyA9IGV4dHJhY3RfcmVwb25hbWUoJGJyYW5jaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmNoaXZlX3JlYWNoYWJsZSgkcmVwbykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQgJGFyY2hfYnJhbmNoZXN7JGJyYW5jaH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJjaF9icmFuY2hlc3skYnJhbmNofSA9ICRzdGFnZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3YXJuICJtb3JlIG1ldGFkYXRhIGFmdGVyIG1lcmdlcyE/OiAkX1xuIiB1bmxlc3MgL15ccyokLzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoJXBzICYmICFleGlzdHMgJHBzZXRzeyAkcHN7aWR9IH0pIHsKKyAgICAgICAgICAgIG15ICV0ZW1wID0gJXBzOyAgICAgICAgICMgYnJlYWsgcmVmZXJlbmNlcworICAgICAgICAgICAgaWYgKEBwc2V0cyAmJiAkcHNldHNbJCNwc2V0c117YnJhbmNofSBlcSAkcHN7YnJhbmNofSkgeworICAgICAgICAgICAgICAgICR0ZW1we3BhcmVudF9pZH0gPSAkcHNldHNbJCNwc2V0c117aWR9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaCAoQHBzZXRzLCBcJXRlbXApOyAgCisgICAgICAgICAgICAkcHNldHN7ICR0ZW1we2lkfSB9ID0gXCV0ZW1wOworICAgICAgICB9ICAgIAorICAgICAgICAKKyAgICAgICAgY2xvc2UgQUJST1dTRSBvciBkaWUgIiRUTEEgYWJyb3dzZSBmYWlsZWQgb24gJGxpbWl0XG4iOworICAgIH0KK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlbmQgZm9yZWFjaCAkcm9vdAorCitkb19hYnJvd3NlKDEpOworbXkgJGRlcHRoID0gMjsKKyRvcHRfRCB8fD0gMDsKK3doaWxlICgkZGVwdGggPD0gJG9wdF9EKSB7CisgICAgZG9fYWJyb3dzZSgkZGVwdGgpOworICAgICRkZXB0aCsrOworfQorCisjIyBPcmRlciBwYXRjaGVzIGJ5IHRpbWUKKyMgRklYTUUgc2VlIGlmIHdlIGNhbiBmaW5kIGEgbW9yZSBvcHRpbWFsIHdheSB0byBkbyB0aGlzIGJ5IGdyYXBoaW5nCisjIHRoZSBhbmNlc3RyeSBkYXRhIGFuZCB3YWxraW5nIGl0LCB0aGF0IHdheSB3ZSB3b24ndCBoYXZlIHRvIHJlbHkgb24KKyMgY2xpZW50LXN1cHBsaWVkIGRhdGVzCitAcHNldHMgPSBzb3J0IHskYS0+e2RhdGV9LiRiLT57aWR9IGNtcCAkYi0+e2RhdGV9LiRiLT57aWR9fSBAcHNldHM7CisKKyNwcmludCBEdW1wZXIgXEBwc2V0czsKKworIyMKKyMjIFRPRE8gY2xlYW51cCBpcnJlbGV2YW50IHBhdGNoZXMKKyMjICAgICAgYW5kIHB1dCBhbiBpbml0aWFsIGltcG9ydAorIyMgICAgICBvciBhIGZ1bGwgdGFnCitteSAkaW1wb3J0ID0gMDsKK3VubGVzcyAoLWQgJGdpdF9kaXIpIHsgIyBpbml0aWFsIGltcG9ydAorICAgIGlmICgkcHNldHNbMF17dHlwZX0gZXEgJ2knIHx8ICRwc2V0c1swXXt0eXBlfSBlcSAndCcpIHsKKyAgICAgICAgcHJpbnQgIlN0YXJ0aW5nIGltcG9ydCBmcm9tICRwc2V0c1swXXtpZH1cbiI7CisJYGdpdC1pbml0LWRiYDsKKwlkaWUgJCEgaWYgJD87CisJJGltcG9ydCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJOZWVkIHRvIHN0YXJ0IGZyb20gYW4gaW1wb3J0IG9yIGEgdGFnIC0tIGNhbm5vdCB1c2UgJHBzZXRzWzBde2lkfSI7CisgICAgfQorfSBlbHNlIHsgICAgIyBwcm9ncmVzc2luZyBhbiBpbXBvcnQKKyAgICAjIGxvYWQgdGhlIHJwdGFncworICAgIG9wZW5kaXIoRElSLCAkcHRhZ19kaXIpCisJfHwgZGllICJjYW4ndCBvcGVuZGlyOiAkISI7CisgICAgd2hpbGUgKG15ICRmaWxlID0gcmVhZGRpcihESVIpKSB7CisgICAgICAgICMgc2tpcCBub24taW50ZXJlc3RpbmctZmlsZXMKKyAgICAgICAgbmV4dCB1bmxlc3MgLWYgIiRwdGFnX2Rpci8kZmlsZSI7CisgICAKKyAgICAgICAgIyBjb252ZXJ0IGZpcnN0ICctLScgdG8gJy8nIGZyb20gb2xkIGdpdC1hcmNoaW1wb3J0IHRvIHVzZQorICAgICAgICAjIGFzIGFuIGFyY2hpdmVuYW1lL2MtLWItLXYgcHJpdmF0ZSB0YWcKKyAgICAgICAgaWYgKCRmaWxlICF+IG0hLCEpIHsKKyAgICAgICAgICAgIG15ICRvbGRmaWxlID0gJGZpbGU7CisgICAgICAgICAgICAkZmlsZSA9fiBzIS0tISwhOworICAgICAgICAgICAgcHJpbnQgU1RERVJSICJjb252ZXJ0aW5nIG9sZCB0YWcgJG9sZGZpbGUgdG8gJGZpbGVcbiI7CisgICAgICAgICAgICByZW5hbWUoIiRwdGFnX2Rpci8kb2xkZmlsZSIsICIkcHRhZ19kaXIvJGZpbGUiKSBvciBkaWUgJCE7CisgICAgICAgIH0KKwlteSAkc2hhID0gcHRhZygkZmlsZSk7CisJY2hvbXAgJHNoYTsKKwkkcnB0YWdzeyRzaGF9ID0gJGZpbGU7CisgICAgfQorICAgIGNsb3NlZGlyIERJUjsKK30KKworIyBwcm9jZXNzIHBhdGNoc2V0cworIyBleHRyYWN0IHRoZSBBcmNoIHJlcG9zaXRvcnkgbmFtZSAoQXJjaCAiYXJjaGl2ZSIgaW4gQXJjaC1zcGVhaykKK3N1YiBleHRyYWN0X3JlcG9uYW1lIHsKKyAgICBteSAkZnFfY3ZiciA9IHNoaWZ0OyAjIGFyY2hpdmVuYW1lL1tbW1tjYXRlZ29yeV1icmFuY2hddmVyc2lvbl1yZXZpc2lvbl0KKyAgICByZXR1cm4gKHNwbGl0KC9cLy8sICRmcV9jdmJyKSlbMF07Cit9CisgCitzdWIgZXh0cmFjdF92ZXJzaW9ubmFtZSB7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICAkbmFtZSA9fiBzLy0tKD86cGF0Y2h8dmVyc2lvbig/OmZpeCk/fGJhc2UpLVxkKyQvLzsKKyAgICByZXR1cm4gJG5hbWU7Cit9CisKKyMgY29udmVydCBhIGZ1bGx5LXF1YWxpZmllZCByZXZpc2lvbiBvciB2ZXJzaW9uIHRvIGEgdW5pcXVlIGRpcm5hbWU6CisjICAgbm9ybWFscGVyc29uQHloYnQubmV0LTA1L21wZC0tdWNsaW51eC0tMS0tcGF0Y2gtMiAKKyMgYmVjb21lczogbm9ybWFscGVyc29uQHloYnQubmV0LTA1LG1wZC0tdWNsaW51eC0tMQorIworIyB0aGUgZ2l0IG5vdGlvbiBvZiBhIGJyYW5jaCBpcyBjbG9zZXIgdG8KKyMgYXJjaGl2ZS9jYXRlZ29yeS0tYnJhbmNoLS12ZXJzaW9uIHRoYW4gYXJjaGl2ZS9jYXRlZ29yeS0tYnJhbmNoLCBzbyB3ZQorIyB1c2UgdGhpcyB0byBjb252ZXJ0IHRvIGdpdCBicmFuY2ggbmFtZXMuCisjIEFsc28sIGtlZXAgYXJjaGl2ZSBuYW1lcyBidXQgcmVwbGFjZSAnLycgd2l0aCAnLCcgc2luY2UgaXQgd29uJ3QgcmVxdWlyZQorIyBzdWJkaXJlY3RvcmllcywgYW5kIGlzIHNhZmVyIHRoYW4gc3dhcHBpbmcgJy0tJyB3aGljaCBjb3VsZCBjb25mdXNlCisjIHJldmVyc2UtbWFwcGluZyB3aGVuIGRlYWxpbmcgd2l0aCBiYXN0YXJkIGJyYW5jaGVzIHRoYXQKKyMgYXJlIGp1c3QgYXJjaGl2ZS9jYXRlZ29yeS0tdmVyc2lvbiAgKG5vIC0tYnJhbmNoKQorc3ViIHRyZWVfZGlybmFtZSB7CisgICAgbXkgJHJldmlzaW9uID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRyZXZpc2lvbik7CisgICAgJG5hbWUgPX4gcyMvIywjOworICAgIHJldHVybiAkbmFtZTsKK30KKworIyBvbGQgdmVyc2lvbnMgb2YgZ2l0LWFyY2hpbXBvcnQganVzdCB1c2UgdGhlIDxjYXRlZ29yeS0tYnJhbmNoPiBwYXJ0Ogorc3ViIG9sZF9zdHlsZV9icmFuY2huYW1lIHsKKyAgICBteSAkaWQgPSBzaGlmdDsKKyAgICBteSAkcmV0ID0gc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwncGFyc2UtcGFja2FnZS1uYW1lJywnLXAnLCRpZCk7CisgICAgY2hvbXAgJHJldDsKKyAgICByZXR1cm4gJHJldDsKK30KKworKmdpdF9icmFuY2huYW1lID0gJG9wdF9vID8gKm9sZF9zdHlsZV9icmFuY2huYW1lIDogKnRyZWVfZGlybmFtZTsKKworc3ViIHByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGUgeworICAgIG15ICRwcyA9IHNoaWZ0OworICAgIAorICAgICMgc3dpdGNoIHRvIHRoYXQgYnJhbmNoIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGluIHRoYXQgYnJhbmNoOgorICAgIGlmICgtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0JywnLWYnLCRwcy0+e2JyYW5jaH0pID09IDAgb3IgZGllICIkISAkP1xuIjsKKworICAgICAgICMgcmVtb3ZlIGFueSBvbGQgc3R1ZmYgdGhhdCBnb3QgbGVmdG92ZXI6CisgICAgICAgbXkgJHJtID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1scy1maWxlcycsJy0tb3RoZXJzJywnLXonKTsKKyAgICAgICBybXRyZWUoc3BsaXQoL1wwLywkcm0pKSBpZiAkcm07CisgICAgfQorICAgIAorICAgICMgQXBwbHkgdGhlIGltcG9ydC9jaGFuZ2VzZXQvbWVyZ2UgaW50byB0aGUgd29ya2luZyB0cmVlCisgICAgbXkgJGRpciA9IHN5bmNfdG9fcHMoJHBzKTsKKyAgICAjIHJlYWQgdGhlIG5ldyBsb2cgZW50cnk6CisgICAgbXkgQGNvbW1pdGxvZyA9IHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2NhdC1sb2cnLCctZCcsJGRpciwkcHMtPntpZH0pOworICAgIGRpZSAiRXJyb3IgaW4gY2F0LWxvZzogJCEiIGlmICQ/OworICAgIGNob21wIEBjb21taXRsb2c7CisKKyAgICAjIGdyYWIgdmFyaWFibGVzIHdlIHdhbnQgZnJvbSB0aGUgbG9nLCBuZXcgZmllbGRzIGdldCBhZGRlZCB0byAkcHM6CisgICAgIyAoYXV0aG9yLCBkYXRlLCBlbWFpbCwgc3VtbWFyeSwgbWVzc2FnZSBib2R5IC4uLikKKyAgICBwYXJzZWxvZygkcHMsIFxAY29tbWl0bG9nKTsKKworICAgIGlmICgkcHMtPntpZH0gPX4gLy0tYmFzZS0wJC8gJiYgJHBzLT57aWR9IG5lICRwc2V0c1swXXtpZH0pIHsKKyAgICAgICAgIyB0aGlzIHNob3VsZCB3b3JrIHdoZW4gaW1wb3J0aW5nIGNvbnRpbnVhdGlvbnMgCisgICAgICAgIGlmICgkcHMtPnt0YWd9ICYmIChteSAkYnJhbmNocG9pbnQgPSBldmFsIHsgcHRhZygkcHMtPnt0YWd9KSB9KSkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgd2UgYXJlIHN1cHBvc2VkIHRvIGJyYW5jaCBmcm9tCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJy1mJywnLWInLCRwcy0+e2JyYW5jaH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJyYW5jaHBvaW50KSA9PSAwIG9yIGRpZSAiJCEgJD9cbiI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgcmVtb3ZlIGFueSBvbGQgc3R1ZmYgdGhhdCBnb3QgbGVmdG92ZXI6CisgICAgICAgICAgICBteSAkcm0gPSBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LWxzLWZpbGVzJywnLS1vdGhlcnMnLCcteicpOworICAgICAgICAgICAgcm10cmVlKHNwbGl0KC9cMC8sJHJtKSkgaWYgJHJtOworCisgICAgICAgICAgICAjIElmIHdlIHRydXN0IEFyY2ggd2l0aCB0aGUgZmFjdCB0aGF0IHRoaXMgaXMganVzdCAKKyAgICAgICAgICAgICMgYSB0YWcsIGFuZCBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIHN0YXRlIG9mIHRoZSB0cmVlCisgICAgICAgICAgICAjIHRoZW4gd2UganVzdCB0YWcgYW5kIG1vdmUgb24KKyAgICAgICAgICAgIHRhZygkcHMtPntpZH0sICRicmFuY2hwb2ludCk7CisgICAgICAgICAgICBwdGFnKCRwcy0+e2lkfSwgJGJyYW5jaHBvaW50KTsKKyAgICAgICAgICAgIHByaW50ICIgKiBUYWdnZWQgJHBzLT57aWR9IGF0ICRicmFuY2hwb2ludFxuIjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2FybiAiVGFnZ2luZyBmcm9tIHVua25vd24gaWQgdW5zdXBwb3J0ZWRcbiIgaWYgJHBzLT57dGFnfTsKKyAgICAgICAgfQorICAgICAgICAjIGFsbG93IG11bHRpcGxlIGJhc2VzL2ltcG9ydHMgaGVyZSBzaW5jZSBBcmNoIHN1cHBvcnRzIGNoZXJyeS1waWNrcworICAgICAgICAjIGZyb20gdW5yZWxhdGVkIHRyZWVzCisgICAgfSAKKyAgICAKKyAgICAjIHVwZGF0ZSB0aGUgaW5kZXggd2l0aCBhbGwgdGhlIGNoYW5nZXMgd2UgZ290CisgICAgc3lzdGVtKCdnaXQtZGlmZi1maWxlcyAtLW5hbWUtb25seSAteiB8ICcuCisgICAgICAgICAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluJykgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgIHN5c3RlbSgnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC16IHwgJy4KKyAgICAgICAgICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC16IC0tc3RkaW4nKSA9PSAwIG9yIGRpZSAiJCEgJD9cbiI7CisgICAgcmV0dXJuIDE7Cit9CisKKyMgdGhlIG5hdGl2ZSBjaGFuZ2VzZXQgcHJvY2Vzc2luZyBzdHJhdGVneS4gIFRoaXMgaXMgdmVyeSBmYXN0LCBidXQKKyMgZG9lcyBub3QgaGFuZGxlIHBlcm1pc3Npb25zIG9yIGFueSByZW5hbWVzIGludm9sdmluZyBkaXJlY3Rvcmllcworc3ViIHByb2Nlc3NfcGF0Y2hzZXRfZmFzdCB7CisgICAgbXkgJHBzID0gc2hpZnQ7CisgICAgIyAKKyAgICAjIGNyZWF0ZSB0aGUgYnJhbmNoIGlmIG5lZWRlZAorICAgICMKKyAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ2knICYmICEkaW1wb3J0KSB7CisgICAgICAgIGRpZSAiU2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgJ0luaXRpYWwgaW1wb3J0JyBwZXIgR0lUIGltcG9ydDogJHBzLT57aWR9IjsKKyAgICB9CisKKyAgICB1bmxlc3MgKCRpbXBvcnQpIHsgIyBza2lwIGZvciBpbXBvcnQKKyAgICAgICAgaWYgKCAtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICAgICAgIyB3ZSBrbm93IGFib3V0IHRoaXMgYnJhbmNoCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJHBzLT57YnJhbmNofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIG5ldyBicmFuY2ghIHdlIG5lZWQgdG8gdmVyaWZ5IGEgZmV3IHRoaW5ncworICAgICAgICAgICAgZGllICJCcmFuY2ggb24gYSBub24tdGFnISIgdW5sZXNzICRwcy0+e3R5cGV9IGVxICd0JzsKKyAgICAgICAgICAgIG15ICRicmFuY2hwb2ludCA9IHB0YWcoJHBzLT57dGFnfSk7CisgICAgICAgICAgICBkaWUgIlRhZ2dpbmcgZnJvbSB1bmtub3duIGlkIHVuc3VwcG9ydGVkOiAkcHMtPnt0YWd9IiAKKyAgICAgICAgICAgICAgICB1bmxlc3MgJGJyYW5jaHBvaW50OworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgd2UgYXJlIHN1cHBvc2VkIHRvIGJyYW5jaCBmcm9tCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJy1iJywkcHMtPnticmFuY2h9LCRicmFuY2hwb2ludCk7CisKKyAgICAgICAgICAgICMgSWYgd2UgdHJ1c3QgQXJjaCB3aXRoIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBqdXN0IAorICAgICAgICAgICAgIyBhIHRhZywgYW5kIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhlIHRyZWUKKyAgICAgICAgICAgICMgdGhlbiB3ZSBqdXN0IHRhZyBhbmQgbW92ZSBvbgorICAgICAgICAgICAgdGFnKCRwcy0+e2lkfSwgJGJyYW5jaHBvaW50KTsKKyAgICAgICAgICAgIHB0YWcoJHBzLT57aWR9LCAkYnJhbmNocG9pbnQpOworICAgICAgICAgICAgcHJpbnQgIiAqIFRhZ2dlZCAkcHMtPntpZH0gYXQgJGJyYW5jaHBvaW50XG4iOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gCisgICAgICAgIGRpZSAkISBpZiAkPzsKKyAgICB9IAorCisgICAgIworICAgICMgQXBwbHkgdGhlIGltcG9ydC9jaGFuZ2VzZXQvbWVyZ2UgaW50byB0aGUgd29ya2luZyB0cmVlCisgICAgIyAKKyAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ2knIHx8ICRwcy0+e3R5cGV9IGVxICd0JykgeworICAgICAgICBhcHBseV9pbXBvcnQoJHBzKSBvciBkaWUgJCE7CisgICAgICAgICRzdGF0c3tpbXBvcnRfb3JfdGFnfSsrOworICAgICAgICAkaW1wb3J0PTA7CisgICAgfSBlbHNpZiAoJHBzLT57dHlwZX0gZXEgJ3MnKSB7CisgICAgICAgIGFwcGx5X2NzZXQoJHBzKTsKKyAgICAgICAgJHN0YXRze3NpbXBsZV9jaGFuZ2VzZXR9Kys7CisgICAgfQorCisgICAgIworICAgICMgcHJlcGFyZSB1cGRhdGUgZ2l0J3MgaW5kZXgsIGJhc2VkIG9uIHdoYXQgYXJjaCBrbm93cworICAgICMgYWJvdXQgdGhlIHBzZXQsIHJlc29sdmUgcGFyZW50cywgZXRjCisgICAgIworICAgIAorICAgIG15IEBjb21taXRsb2cgPSBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdjYXQtYXJjaGl2ZS1sb2cnLCRwcy0+e2lkfSk7IAorICAgIGRpZSAiRXJyb3IgaW4gY2F0LWFyY2hpdmUtbG9nOiAkISIgaWYgJD87CisgICAgICAgIAorICAgIHBhcnNlbG9nKCRwcyxcQGNvbW1pdGxvZyk7CisKKyAgICAjIGltcG9ydHMgZG9uJ3QgZ2l2ZSB1cyBnb29kIGluZm8KKyAgICAjIG9uIGFkZGVkIGZpbGVzLiBTaGFtZSBvbiB0aGVtCisgICAgaWYgKCRwcy0+e3R5cGV9IGVxICdpJyB8fCAkcHMtPnt0eXBlfSBlcSAndCcpIHsKKyAgICAgICAgc3lzdGVtKCdnaXQtbHMtZmlsZXMgLS1kZWxldGVkIC16IHwgJy4KKyAgICAgICAgICAgICAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluJykgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgICAgICBzeXN0ZW0oJ2dpdC1scy1maWxlcyAtLW90aGVycyAteiB8ICcuCisgICAgICAgICAgICAgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgLXogLS1zdGRpbicpID09IDAgb3IgZGllICIkISAkP1xuIjsKKyAgICB9CisKKyAgICAjIFRPRE86IGhhbmRsZSByZW1vdmVkX2RpcmVjdG9yaWVzIGFuZCByZW5hbWVkX2RpcmVjdG9yaWVzOgorCisgICAgaWYgKG15ICRkZWwgPSAkcHMtPntyZW1vdmVkX2ZpbGVzfSkgeworICAgICAgICB1bmxpbmsgQCRkZWw7CisgICAgICAgIHdoaWxlIChAJGRlbCkgeworICAgICAgICAgICAgbXkgQHNsaWNlID0gc3BsaWNlKEAkZGVsLCAwLCAxMDApOworICAgICAgICAgICAgc3lzdGVtKCdnaXQtdXBkYXRlLWluZGV4JywnLS1yZW1vdmUnLCctLScsQHNsaWNlKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlOiAkISAkP1xuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChteSAkcmVuID0gJHBzLT57cmVuYW1lZF9maWxlc30pIHsgICAgICAgICAgICAgICAgIyByZW5hbWVkCisgICAgICAgIGlmIChAJHJlbiAlIDIpIHsKKyAgICAgICAgICAgIGRpZSAiT2RkIG51bWJlciBvZiBlbnRyaWVzIGluIHJlbmFtZSE/IjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKEAkcmVuKSB7CisgICAgICAgICAgICBteSAkZnJvbSA9IHNoaWZ0IEAkcmVuOworICAgICAgICAgICAgbXkgJHRvICAgPSBzaGlmdCBAJHJlbjsgICAgICAgICAgIAorCisgICAgICAgICAgICB1bmxlc3MgKC1kIGRpcm5hbWUoJHRvKSkgeworICAgICAgICAgICAgICAgIG1rcGF0aChkaXJuYW1lKCR0bykpOyAjIHdpbGwgZGllIG9uIGVycgorICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBwcmludCAibW92aW5nICRmcm9tICR0byI7CisgICAgICAgICAgICByZW5hbWUoJGZyb20sICR0bykgb3IgZGllICJFcnJvciByZW5hbWluZyAnJGZyb20nICckdG8nOiAkIVxuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tcmVtb3ZlJywnLS0nLCRmcm9tKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlOiAkISAkP1xuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tYWRkJywnLS0nLCR0bykgPT0gMCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRXJyb3IgaW4gZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZDogJCEgJD9cbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobXkgJGFkZCA9ICRwcy0+e25ld19maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkYWRkKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRhZGQsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLWFkZCcsJy0tJyxAc2xpY2UpID09IDAgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVycm9yIGluIGdpdC11cGRhdGUtaW5kZXggLS1hZGQ6ICQhICQ/XG4iOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG15ICRtb2QgPSAkcHMtPnttb2RpZmllZF9maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkbW9kKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRtb2QsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLScsQHNsaWNlKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4OiAkISAkP1xuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgIyB3ZSBzdWNjZXNzZnVsbHkgYXBwbGllZCB0aGUgY2hhbmdlc2V0Cit9CisKK2lmICgkb3B0X2YpIHsKKyAgICBwcmludCAiV2lsbCBpbXBvcnQgcGF0Y2hzZXRzIHVzaW5nIHRoZSBmYXN0IHN0cmF0ZWd5XG4iLAorICAgICAgICAgICAgIlJlbmFtZWQgZGlyZWN0b3JpZXMgYW5kIHBlcm1pc3Npb24gY2hhbmdlcyB3aWxsIGJlIG1pc3NlZFxuIjsKKyAgICAqcHJvY2Vzc19wYXRjaHNldCA9ICpwcm9jZXNzX3BhdGNoc2V0X2Zhc3Q7Cit9IGVsc2UgeworICAgIHByaW50ICJVc2luZyB0aGUgZGVmYXVsdCAoYWNjdXJhdGUpIGltcG9ydCBzdHJhdGVneS5cbiIsCisgICAgICAgICAgICAiVGhpbmdzIG1heSBiZSBhIGJpdCBzbG93XG4iOworICAgICpwcm9jZXNzX3BhdGNoc2V0ID0gKnByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGU7Cit9CisgICAgCitmb3JlYWNoIG15ICRwcyAoQHBzZXRzKSB7CisgICAgIyBwcm9jZXNzIHBhdGNoc2V0cworICAgICRwcy0+e2JyYW5jaH0gPSBnaXRfYnJhbmNobmFtZSgkcHMtPntpZH0pOworCisgICAgIworICAgICMgZW5zdXJlIHdlIGhhdmUgYSBjbGVhbiBzdGF0ZSAKKyAgICAjIAorICAgIGlmIChteSAkZGlydHkgPSBgZ2l0LWRpZmYtZmlsZXNgKSB7CisgICAgICAgIGRpZSAiVW5jbGVhbiB0cmVlIHdoZW4gYWJvdXQgdG8gcHJvY2VzcyAkcHMtPntpZH0gIiAuCisgICAgICAgICAgICAiIC0gZGlkIHdlIGZhaWwgdG8gY29tbWl0IGNsZWFubHkgYmVmb3JlP1xuJGRpcnR5IjsKKyAgICB9CisgICAgZGllICQhIGlmICQ/OworICAgIAorICAgICMKKyAgICAjIHNraXAgY29tbWl0cyBhbHJlYWR5IGluIHJlcG8KKyAgICAjCisgICAgaWYgKHB0YWcoJHBzLT57aWR9KSkgeworICAgICAgJG9wdF92ICYmIHByaW50ICIgKiBTa2lwcGluZyBhbHJlYWR5IGltcG9ydGVkOiAkcHMtPntpZH1cbiI7CisgICAgICBuZXh0OworICAgIH0KKworICAgIHByaW50ICIgKiBTdGFydGluZyB0byB3b3JrIG9uICRwcy0+e2lkfVxuIjsKKworICAgIHByb2Nlc3NfcGF0Y2hzZXQoJHBzKSBvciBuZXh0OworCisgICAgIyB3YXJuICJlcnJvcnMgd2hlbiBydW5uaW5nIGdpdC11cGRhdGUtaW5kZXghICQhIjsKKyAgICBteSAkdHJlZSA9IGBnaXQtd3JpdGUtdHJlZWA7CisgICAgZGllICJjYW5ub3Qgd3JpdGUgdHJlZSAkISIgaWYgJD87CisgICAgY2hvbXAgJHRyZWU7CisgICAgCisgICAgIworICAgICMgV2hvJ3MgeW91ciBkYWRkeT8KKyAgICAjCisgICAgbXkgQHBhcjsKKyAgICBpZiAoIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iKSB7CisgICAgICAgIGlmIChvcGVuIEhFQUQsICI8IiwiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICAgICAgbXkgJHAgPSA8SEVBRD47CisgICAgICAgICAgICBjbG9zZSBIRUFEOworICAgICAgICAgICAgY2hvbXAgJHA7CisgICAgICAgICAgICBwdXNoIEBwYXIsICctcCcsICRwOworICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgIGlmICgkcHMtPnt0eXBlfSBlcSAncycpIHsKKyAgICAgICAgICAgICAgICB3YXJuICJDb3VsZCBub3QgZmluZCB0aGUgcmlnaHQgaGVhZCBmb3IgdGhlIGJyYW5jaCAkcHMtPnticmFuY2h9IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoJHBzLT57bWVyZ2VzfSkgeworICAgICAgICBwdXNoIEBwYXIsIGZpbmRfcGFyZW50cygkcHMpOworICAgIH0KKworICAgICMgICAgCisgICAgIyBDb21taXQsIHRhZyBhbmQgY2xlYW4gc3RhdGUKKyAgICAjCisgICAgJEVOVntUWn0gICAgICAgICAgICAgICAgICA9ICdHTVQnOworICAgICRFTlZ7R0lUX0FVVEhPUl9OQU1FfSAgICAgPSAkcHMtPnthdXRob3J9OworICAgICRFTlZ7R0lUX0FVVEhPUl9FTUFJTH0gICAgPSAkcHMtPntlbWFpbH07CisgICAgJEVOVntHSVRfQVVUSE9SX0RBVEV9ICAgICA9ICRwcy0+e2RhdGV9OworICAgICRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSAgPSAkcHMtPnthdXRob3J9OworICAgICRFTlZ7R0lUX0NPTU1JVFRFUl9FTUFJTH0gPSAkcHMtPntlbWFpbH07CisgICAgJEVOVntHSVRfQ09NTUlUVEVSX0RBVEV9ICA9ICRwcy0+e2RhdGV9OworCisgICAgbXkgJHBpZCA9IG9wZW4yKCpSRUFERVIsICpXUklURVIsJ2dpdC1jb21taXQtdHJlZScsJHRyZWUsQHBhcikgCisgICAgICAgIG9yIGRpZSAkITsKKyAgICBwcmludCBXUklURVIgJHBzLT57c3VtbWFyeX0sIlxuIjsKKyAgICBwcmludCBXUklURVIgJHBzLT57bWVzc2FnZX0sIlxuIjsKKyAgICAKKyAgICAjIG1ha2UgaXQgZWFzeSB0byBiYWNrdHJhY2sgYW5kIGZpZ3VyZSBvdXQgd2hpY2ggQXJjaCByZXZpc2lvbiB0aGlzIHdhczoKKyAgICBwcmludCBXUklURVIgJ2dpdC1hcmNoaW1wb3J0LWlkOiAnLCRwcy0+e2lkfSwiXG4iOworICAgIAorICAgIGNsb3NlIFdSSVRFUjsKKyAgICBteSAkY29tbWl0aWQgPSA8UkVBREVSPjsgICAgIyByZWFkCisgICAgY2hvbXAgJGNvbW1pdGlkOworICAgIGNsb3NlIFJFQURFUjsKKyAgICB3YWl0cGlkICRwaWQsMDsgICAgICAgICAgICAgIyBjbG9zZTsKKworICAgIGlmIChsZW5ndGggJGNvbW1pdGlkICE9IDQwKSB7CisgICAgICAgIGRpZSAiU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgY29tbWl0ISAkISAkY29tbWl0aWQiOworICAgIH0KKyAgICAjCisgICAgIyBVcGRhdGUgdGhlIGJyYW5jaAorICAgICMgCisgICAgb3BlbiAgSEVBRCwgIj4iLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iOworICAgIHByaW50IEhFQUQgJGNvbW1pdGlkOworICAgIGNsb3NlIEhFQUQ7CisgICAgc3lzdGVtKCdnaXQtdXBkYXRlLXJlZicsICdIRUFEJywgIiRwcy0+e2JyYW5jaH0iKTsKKworICAgICMgdGFnIGFjY29yZGluZ2x5CisgICAgcHRhZygkcHMtPntpZH0sICRjb21taXRpZCk7ICMgcHJpdmF0ZSB0YWcKKyAgICBpZiAoJG9wdF9UIHx8ICRwcy0+e3R5cGV9IGVxICd0JyB8fCAkcHMtPnt0eXBlfSBlcSAnaScpIHsKKyAgICAgICAgdGFnKCRwcy0+e2lkfSwgJGNvbW1pdGlkKTsKKyAgICB9CisgICAgcHJpbnQgIiAqIENvbW1pdHRlZCAkcHMtPntpZH1cbiI7CisgICAgcHJpbnQgIiAgICsgdHJlZSAgICR0cmVlXG4iOworICAgIHByaW50ICIgICArIGNvbW1pdCAkY29tbWl0aWRcbiI7CisgICAgJG9wdF92ICYmIHByaW50ICIgICArIGNvbW1pdCBkYXRlIGlzICAkcHMtPntkYXRlfSBcbiI7CisgICAgJG9wdF92ICYmIHByaW50ICIgICArIHBhcmVudHM6ICAiLGpvaW4oJyAnLEBwYXIpLCJcbiI7Cit9CisKK2lmICgkb3B0X3YpIHsKKyAgICBmb3JlYWNoIChzb3J0IGtleXMgJXN0YXRzKSB7CisgICAgICAgIHByaW50IiAkXzogJHN0YXRzeyRffVxuIjsKKyAgICB9Cit9CitleGl0IDA7CisKKyMgdXNlZCBieSB0aGUgYWNjdXJhdGUgc3RyYXRlZ3k6CitzdWIgc3luY190b19wcyB7CisgICAgbXkgJHBzID0gc2hpZnQ7CisgICAgbXkgJHRyZWVfZGlyID0gJHRtcC4nLycudHJlZV9kaXJuYW1lKCRwcy0+e2lkfSk7CisgICAgCisgICAgJG9wdF92ICYmIHByaW50ICJzeW5jX3RvX3BzKCRwcy0+e2lkfSkgbWV0aG9kOiAiOworCisgICAgaWYgKC1kICR0cmVlX2RpcikgeworICAgICAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ3QnKSB7CisJICAgICRvcHRfdiAmJiBwcmludCAiZ2V0ICh0YWcpXG4iOworICAgICAgICAgICAgIyBsb29rcyBsaWtlIGEgdGFnLW9ubHkgb3IgKHdvcnNlLCkgYSBtaXhlZCB0YWdzL2NoYW5nZXNldCBicmFuY2gsCisgICAgICAgICAgICAjIGNhbid0IHJlbHkgb24gcmVwbGF5IHRvIHdvcmsgY29ycmVjdGx5IG9uIHRoZXNlCisgICAgICAgICAgICBybXRyZWUoJHRyZWVfZGlyKTsKKyAgICAgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldCcsJy0tbm8tcHJpc3RpbmUnLCRwcy0+e2lkfSwkdHJlZV9kaXIpOworICAgICAgICAgICAgJHN0YXRze2dldF90YWd9Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXkgJHRyZWVfaWQgPSBhcmNoX3RyZWVfaWQoJHRyZWVfZGlyKTsKKyAgICAgICAgICAgICAgICBpZiAoJHBzLT57cGFyZW50X2lkfSAmJiAoJHBzLT57cGFyZW50X2lkfSBlcSAkdHJlZV9pZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgY29tbW9uIGNhc2UgKGhvcGVmdWxseSkKKwkJICAgICRvcHRfdiAmJiBwcmludCAicmVwbGF5XG4iOworICAgICAgICAgICAgICAgICAgICBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdyZXBsYXknLCctZCcsJHRyZWVfZGlyLCRwcy0+e2lkfSk7CisgICAgICAgICAgICAgICAgICAgICRzdGF0c3tyZXBsYXl9Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIG9uZSB0cmVlIGlzIHVzdWFsbHkgZmFzdGVyIHRoYW4gZ2V0dGluZyB0d28gdHJlZXMKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgYXBwbHlpbmcgdGhlIGRlbHRhIC4uLgorICAgICAgICAgICAgICAgICAgICBybXRyZWUoJHRyZWVfZGlyKTsKKwkJICAgICRvcHRfdiAmJiBwcmludCAiYXBwbHktZGVsdGFcbiI7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldCcsJy0tbm8tcHJpc3RpbmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcy0+e2lkfSwkdHJlZV9kaXIpOworICAgICAgICAgICAgICAgICAgICAkc3RhdHN7Z2V0X2RlbHRhfSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICMgbmV3IGJyYW5jaCB3b3JrCisgICAgICAgICRvcHRfdiAmJiBwcmludCAiZ2V0IChuZXcgdHJlZSlcbiI7CisgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldCcsJy0tbm8tcHJpc3RpbmUnLCRwcy0+e2lkfSwkdHJlZV9kaXIpOworICAgICAgICAkc3RhdHN7Z2V0X25ld30rKzsKKyAgICB9CisgICAKKyAgICAjIGFkZGVkIC1JIGZsYWcgdG8gcnN5bmMgc2luY2Ugd2UncmUgZ29pbmcgdG8gZmFzdCEgQUlFRUVFRSEhISEKKyAgICBzeXN0ZW0oJ3JzeW5jJywnLWFJJywnLS1kZWxldGUnLCctLWV4Y2x1ZGUnLCRnaXRfZGlyLAorIyAgICAgICAgICAgICAgICctLWV4Y2x1ZGUnLCcuYXJjaC1pbnZlbnRvcnknLAorICAgICAgICAgICAgICAgICctLWV4Y2x1ZGUnLCcuYXJjaC1pZHMnLCctLWV4Y2x1ZGUnLCd7YXJjaH0nLAorICAgICAgICAgICAgICAgICctLWV4Y2x1ZGUnLCcrKicsJy0tZXhjbHVkZScsJywqJywKKyAgICAgICAgICAgICAgICAiJHRyZWVfZGlyLyIsJy4vJykgPT0gMCBvciBkaWUgIkNhbm5vdCByc3luYyAkdHJlZV9kaXI6ICQhICQ/IjsKKyAgICByZXR1cm4gJHRyZWVfZGlyOworfQorCitzdWIgYXBwbHlfaW1wb3J0IHsKKyAgICBteSAkcHMgPSBzaGlmdDsKKyAgICBteSAkYm5hbWUgPSBnaXRfYnJhbmNobmFtZSgkcHMtPntpZH0pOworCisgICAgbWtwYXRoKCR0bXApOworCisgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLXMnLCctLW5vLXByaXN0aW5lJywkcHMtPntpZH0sIiR0bXAvaW1wb3J0Iik7CisgICAgZGllICJDYW5ub3QgZ2V0IGltcG9ydDogJCEiIGlmICQ/OyAgICAKKyAgICBzeXN0ZW0oJ3JzeW5jJywnLWFJJywnLS1kZWxldGUnLCAnLS1leGNsdWRlJywkZ2l0X2RpciwKKwkJJy0tZXhjbHVkZScsJy5hcmNoLWlkcycsJy0tZXhjbHVkZScsJ3thcmNofScsCisJCSIkdG1wL2ltcG9ydC8iLCAnLi8nKTsKKyAgICBkaWUgIkNhbm5vdCByc3luYyBpbXBvcnQ6JCEiIGlmICQ/OworICAgIAorICAgIHJtdHJlZSgiJHRtcC9pbXBvcnQiKTsKKyAgICBkaWUgIkNhbm5vdCByZW1vdmUgdGVtcGRpcjogJCEiIGlmICQ/OworICAgIAorCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBhcHBseV9jc2V0IHsKKyAgICBteSAkcHMgPSBzaGlmdDsKKworICAgIG1rcGF0aCgkdG1wKTsKKworICAgICMgZ2V0IHRoZSBjaGFuZ2VzZXQKKyAgICBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdnZXQtY2hhbmdlc2V0JywkcHMtPntpZH0sIiR0bXAvY2hhbmdlc2V0Iik7CisgICAgZGllICJDYW5ub3QgZ2V0IGNoYW5nZXNldDogJCEiIGlmICQ/OworICAgIAorICAgICMgYXBwbHkgcGF0Y2hlcworICAgIGlmIChgZmluZCAkdG1wL2NoYW5nZXNldC9wYXRjaGVzIC10eXBlIGYgLW5hbWUgJyoucGF0Y2gnYCkgeworICAgICAgICAjIHRoaXMgY2FuIGJlIHNwZWQgdXAgY29uc2lkZXJhYmx5IGJ5IGRvaW5nCisgICAgICAgICMgICAgKGZpbmQgfCB4YXJncyBjYXQpIHwgcGF0Y2gKKyAgICAgICAgIyBidXQgdGhhdCBjbmEgZ2V0IG11Y2tlZCB1cCBieSBwYXRjaGVzCisgICAgICAgICMgd2l0aCBtaXNzaW5nIHRyYWlsaW5nIG5ld2xpbmVzIG9yIHRoZSBzdGFuZGFyZCAKKyAgICAgICAgIyAnbWlzc2luZyBuZXdsaW5lJyBmbGFnIGluIHRoZSBwYXRjaCAtIHBvc3NpYmx5CisgICAgICAgICMgcHJvZHVjZWQgd2l0aCBhbiBvbGQvYnVnZ3kgZGlmZi4KKyAgICAgICAgIyBzbG93IGFuZCBzYWZlLCB3ZSBpbnZva2UgcGF0Y2ggb25jZSBwZXIgcGF0Y2hmaWxlCisgICAgICAgIGBmaW5kICR0bXAvY2hhbmdlc2V0L3BhdGNoZXMgLXR5cGUgZiAtbmFtZSAnKi5wYXRjaCcgLXByaW50MCB8IGdyZXAgLXp2ICd7YXJjaH0nIHwgeGFyZ3MgLWlGSUxFIC0wIC0tbm8tcnVuLWlmLWVtcHR5IHBhdGNoIC1wMSAtLWZvcndhcmQgLWlGSUxFYDsKKyAgICAgICAgZGllICJQcm9ibGVtIGFwcGx5aW5nIHBhdGNoZXMhICQhIiBpZiAkPzsKKyAgICB9CisKKyAgICAjIGFwcGx5IGNoYW5nZWQgYmluYXJ5IGZpbGVzCisgICAgaWYgKG15IEBtb2RpZmllZCA9IGBmaW5kICR0bXAvY2hhbmdlc2V0L3BhdGNoZXMgLXR5cGUgZiAtbmFtZSAnKi5tb2RpZmllZCdgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJG1vZCAoQG1vZGlmaWVkKSB7CisgICAgICAgICAgICBjaG9tcCAkbW9kOworICAgICAgICAgICAgbXkgJG9yaWcgPSAkbW9kOworICAgICAgICAgICAgJG9yaWcgPX4gcy9cLm1vZGlmaWVkJC8vOyAjIGxhenkKKyAgICAgICAgICAgICRvcmlnID1+IHMhXlxRJHRtcFxFL2NoYW5nZXNldC9wYXRjaGVzLyEhOworICAgICAgICAgICAgI3ByaW50ICJyc3luYyAtcCAnJG1vZCcgJyRvcmlnJyI7CisgICAgICAgICAgICBzeXN0ZW0oJ3JzeW5jJywnLXAnLCRtb2QsIi4vJG9yaWciKTsKKyAgICAgICAgICAgIGRpZSAiUHJvYmxlbSBhcHBseWluZyBiaW5hcnkgY2hhbmdlcyEgJCEiIGlmICQ/OworICAgICAgICB9CisgICAgfQorCisgICAgIyBicmluZyBpbiBuZXcgZmlsZXMKKyAgICBzeXN0ZW0oJ3JzeW5jJywnLWFJJywnLS1leGNsdWRlJywkZ2l0X2RpciwKKyAgICAJCSctLWV4Y2x1ZGUnLCcuYXJjaC1pZHMnLAorCQknLS1leGNsdWRlJywgJ3thcmNofScsCisJCSIkdG1wL2NoYW5nZXNldC9uZXctZmlsZXMtYXJjaGl2ZS8iLCcuLycpOworCisgICAgIyBkZWxldGVkIGZpbGVzIGFyZSBoaW50ZWQgZnJvbSB0aGUgY29tbWl0bG9nIHByb2Nlc3NpbmcKKworICAgIHJtdHJlZSgiJHRtcC9jaGFuZ2VzZXQiKTsKK30KKworCisjID1mb3IgcmVmZXJlbmNlCisjIG5vdGVzOiAqLWZpbGVzLy1kaXJlY3RvcmllcyBrZXlzIGNhbm5vdCBoYXZlIHNwYWNlcywgdGhleSdyZSBhbHdheXMKKyMgcGlrYS1lc2NhcGVkLiAgRXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgbmV3bGluZQorIyBBIGxvZyBlbnRyeSBsb29rcyBsaWtlOgorIyBSZXZpc2lvbjogbW9vZGxlLW9yZy0tbW9vZGxlLS0xLjMuMy0tcGF0Y2gtMTUKKyMgQXJjaGl2ZTogYXJjaC1lZHVmb3JnZUBjYXRhbHlzdC5uZXQubnotLTIwMDQKKyMgQ3JlYXRvcjogUGVubnkgTGVhY2ggPHBlbm55QGNhdGFseXN0Lm5ldC5uej4KKyMgRGF0ZTogV2VkIE1heSAyNSAxNDoxNTozNCBOWlNUIDIwMDUKKyMgU3RhbmRhcmQtZGF0ZTogMjAwNS0wNS0yNSAwMjoxNTozNCBHTVQKKyMgTmV3LWZpbGVzOiBsYW5nL2RlLy5hcmNoLWlkcy9ibG9ja19nbG9zc2FyeV9yYW5kb20ucGhwLmlkCisjICAgICBsYW5nL2RlLy5hcmNoLWlkcy9ibG9ja19odG1sLnBocC5pZAorIyBOZXctZGlyZWN0b3JpZXM6IGxhbmcvZGUvaGVscC9xdWVzdGlvbm5haXJlCisjICAgICBsYW5nL2RlL2hlbHAvcXVlc3Rpb25uYWlyZS8uYXJjaC1pZHMKKyMgUmVuYW1lZC1maWxlczogLmFyY2gtaWRzL2RiX3NlYXJzLnNxbC5pZCBkYi8uYXJjaC1pZHMvZGJfc2VhcnMuc3FsLmlkCisjICAgIGRiX3NlYXJzLnNxbCBkYi9kYl9zZWFycy5zcWwKKyMgUmVtb3ZlZC1maWxlczogbGFuZy9iZS9kb2NzLy5hcmNoLWlkcy9yZWxlYXNlLmh0bWwuaWQKKyMgICAgIGxhbmcvYmUvZG9jcy8uYXJjaC1pZHMvcmVsZWFzZW9sZC5odG1sLmlkCisjIE1vZGlmaWVkLWZpbGVzOiBhZG1pbi9jcm9uLnBocCBhZG1pbi9kZWxldGUucGhwCisjICAgICBhZG1pbi9lZGl0b3IuaHRtbCBiYWNrdXAvbGliLnBocCBiYWNrdXAvcmVzdG9yZS5waHAKKyMgTmV3LXBhdGNoZXM6IGFyY2gtZWR1Zm9yZ2VAY2F0YWx5c3QubmV0Lm56LS0yMDA0L21vb2RsZS1vcmctLW1vb2RsZS0tMS4zLjMtLXBhdGNoLTE1CisjIFN1bW1hcnk6IFVwZGF0aW5nIHRvIGxhdGVzdCBmcm9tIE1PT0RMRV8xNF9TVEFCTEUgKDEuNC41KykKKyMgICBzdW1tYXJ5IGNhbiBiZSBtdWx0aWxpbmUgd2l0aCBhIGxlYWRpbmcgc3BhY2UganVzdCBsaWtlIHRoZSBhYm92ZSBmaWVsZHMKKyMgS2V5d29yZHM6CisjCisjIFVwZGF0aW5nIHlhZGRhIHRhZGRhIHRhZGRhIG1hZGRhCitzdWIgcGFyc2Vsb2cgeworICAgIG15ICgkcHMsICRsb2cpID0gQF87CisgICAgbXkgJGtleSA9IHVuZGVmOworCisgICAgIyBoZWFkZXJzIHdlIHdhbnQgdGhhdCBjb250YWluIGZpbGVuYW1lczoKKyAgICBteSAld2FudF9oZWFkZXJzID0gKAorICAgICAgICBuZXdfZmlsZXMgPT4gMSwKKyAgICAgICAgbW9kaWZpZWRfZmlsZXMgPT4gMSwKKyAgICAgICAgcmVuYW1lZF9maWxlcyA9PiAxLAorICAgICAgICByZW5hbWVkX2RpcmVjdG9yaWVzID0+IDEsCisgICAgICAgIHJlbW92ZWRfZmlsZXMgPT4gMSwKKyAgICAgICAgcmVtb3ZlZF9kaXJlY3RvcmllcyA9PiAxLAorICAgICk7CisgICAgCisgICAgY2hvbXAgKEAkbG9nKTsKKyAgICB3aGlsZSAoJF8gPSBzaGlmdCBAJGxvZykgeworICAgICAgICBpZiAoL15Db250aW51YXRpb24tb2Y6XHMqKC4qKS8pIHsKKyAgICAgICAgICAgICRwcy0+e3RhZ30gPSAkMTsKKyAgICAgICAgICAgICRrZXkgPSB1bmRlZjsKKyAgICAgICAgfSBlbHNpZiAoL15TdW1tYXJ5OlxzKiguKikkLyApIHsKKyAgICAgICAgICAgICMgc3VtbWFyeSBjYW4gYmUgbXVsdGlsaW5lIGFzIGxvbmcgYXMgaXQgaGFzIGEgbGVhZGluZyBzcGFjZQorICAgICAgICAgICAgJHBzLT57c3VtbWFyeX0gPSBbICQxIF07CisgICAgICAgICAgICAka2V5ID0gJ3N1bW1hcnknOworICAgICAgICB9IGVsc2lmICgvXkNyZWF0b3I6ICguKilccyo8KFteXD5dKyk+LykgeworICAgICAgICAgICAgJHBzLT57YXV0aG9yfSA9ICQxOworICAgICAgICAgICAgJHBzLT57ZW1haWx9ID0gJDI7CisgICAgICAgICAgICAka2V5ID0gdW5kZWY7CisgICAgICAgICMgYW55ICotZmlsZXMgb3IgKi1kaXJlY3RvcmllcyBjYW4gYmUgcmVhZCBoZXJlOgorICAgICAgICB9IGVsc2lmICgvXihbQS1aXVthLXpcLV0rKTpccyooLiopJC8pIHsKKyAgICAgICAgICAgIG15ICR2YWwgPSAkMjsKKyAgICAgICAgICAgICRrZXkgPSBsYyAkMTsKKyAgICAgICAgICAgICRrZXkgPX4gdHIvLS9fLzsgIyB0b28gbGF6eSB0byBxdW90ZSA6UAorICAgICAgICAgICAgaWYgKCR3YW50X2hlYWRlcnN7JGtleX0pIHsKKyAgICAgICAgICAgICAgICBwdXNoIEB7JHBzLT57JGtleX19LCBzcGxpdCgvXHMrLywgJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRrZXkgPSB1bmRlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNpZiAoL14kLykgeworICAgICAgICAgICAgbGFzdDsgIyByZW1haW5kZXIgb2YgQCRsb2cgdGhhdCBkaWRuJ3QgZ2V0IHNoaWZ0ZWQgb2ZmIGlzIG1lc3NhZ2UKKyAgICAgICAgfSBlbHNpZiAoJGtleSkgeworICAgICAgICAgICAgaWYgKC9eXHMrKC4qKSQvKSB7CisgICAgICAgICAgICAgICAgaWYgKCRrZXkgZXEgJ3N1bW1hcnknKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskcHMtPnska2V5fX0sICQxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICMgZmlsZXMvZGlyZWN0b3JpZXM6CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskcHMtPnska2V5fX0sIHNwbGl0KC9ccysvLCAkMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAka2V5ID0gdW5kZWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAKKyAgICAjIHBvc3QtcHJvY2Vzc2luZzoKKyAgICAkcHMtPntzdW1tYXJ5fSA9IGpvaW4oIlxuIixAeyRwcy0+e3N1bW1hcnl9fSkuIlxuIjsKKyAgICAkcHMtPnttZXNzYWdlfSA9IGpvaW4oIlxuIixAJGxvZyk7CisgICAgCisgICAgIyBza2lwIEFyY2ggY29udHJvbCBmaWxlcywgdW5lc2NhcGUgcGlrYS1lc2NhcGVkIGZpbGVzCisgICAgZm9yZWFjaCBteSAkayAoa2V5cyAld2FudF9oZWFkZXJzKSB7CisgICAgICAgIG5leHQgdW5sZXNzIChkZWZpbmVkICRwcy0+eyRrfSk7CisgICAgICAgIG15IEB0bXAgPSAoKTsKKyAgICAgICAgZm9yZWFjaCBteSAkdCAoQHskcHMtPnska319KSB7CisgICAgICAgICAgIG5leHQgdW5sZXNzIGxlbmd0aCAoJHQpOworICAgICAgICAgICBuZXh0IGlmICR0ID1+IG0hXHthcmNoXH0vITsKKyAgICAgICAgICAgbmV4dCBpZiAkdCA9fiBtIVwuYXJjaC1pZHMvITsKKyAgICAgICAgICAgIyBzaG91bGQgd2Ugc2tpcCB0aGlzPworICAgICAgICAgICBuZXh0IGlmICR0ID1+IG0hXC5hcmNoLWludmVudG9yeSQhOworICAgICAgICAgICAjIHRsYSBjYXQtYXJjaGl2ZS1sb2cgd2lsbCBnaXZlIHVzIGZpbGVuYW1lcyB3aXRoIHNwYWNlcyBhcyBmaWxlXChzcCluYW1lIC0gd2h5PworICAgICAgICAgICAjIHdlIGNhbiBhc3N1bWUgdGhhdCBhbnkgZmlsZW5hbWUgd2l0aCBcIGluZGljYXRlcyBzb21lIHBpa2EgZXNjYXBpbmcgdGhhdCB3ZSB3YW50IHRvIGdldCByaWQgb2YuCisgICAgICAgICAgIGlmICgkdCA9fiAvXFwvICl7CisgICAgICAgICAgICAgICAkdCA9IChzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdlc2NhcGUnLCctLXVuZXNjYXBlZCcsJHQpKVswXTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwdXNoIEB0bXAsICR0OworICAgICAgICB9CisgICAgICAgICRwcy0+eyRrfSA9IFxAdG1wOworICAgIH0KK30KKworIyB3cml0ZS9yZWFkIGEgdGFnCitzdWIgdGFnIHsKKyAgICBteSAoJHRhZywgJGNvbW1pdCkgPSBAXzsKKyAKKyAgICBpZiAoJG9wdF9vKSB7CisgICAgICAgICR0YWcgPX4gc3wvfC0tfGc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBkb24ndCB1c2Ugc3ViZGlycyBmb3IgdGFncyB5ZXQsIGl0IGNvdWxkIHNjcmV3IHVwIG90aGVyIHBvcmNlbGFpbnMKKyAgICAgICAgJHRhZyA9fiBzfC98LHxnOworICAgIH0KKyAgICAKKyAgICBpZiAoJGNvbW1pdCkgeworICAgICAgICBvcGVuKEMsIj4iLCIkZ2l0X2Rpci9yZWZzL3RhZ3MvJHRhZyIpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnICR0YWc6ICQhXG4iOworICAgICAgICBwcmludCBDICIkY29tbWl0XG4iCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIGNsb3NlKEMpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIHByaW50ICIgKiBDcmVhdGVkIHRhZyAnJHRhZycgb24gJyRjb21taXQnXG4iIGlmICRvcHRfdjsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIyByZWFkCisgICAgICAgIG9wZW4oQywiPCIsIiRnaXRfZGlyL3JlZnMvdGFncy8kdGFnIikKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworICAgICAgICAkY29tbWl0ID0gPEM+OworICAgICAgICBjaG9tcCAkY29tbWl0OworICAgICAgICBkaWUgIkVycm9yIHJlYWRpbmcgdGFnICR0YWc6ICQhXG4iIHVubGVzcyBsZW5ndGggJGNvbW1pdCA9PSA0MDsKKyAgICAgICAgY2xvc2UoQykKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworICAgICAgICByZXR1cm4gJGNvbW1pdDsKKyAgICB9Cit9CisKKyMgd3JpdGUvcmVhZCBhIHByaXZhdGUgdGFnCisjIHJlYWRzIGZhaWwgc29mdGx5IGlmIHRoZSB0YWcgaXNuJ3QgdGhlcmUKK3N1YiBwdGFnIHsKKyAgICBteSAoJHRhZywgJGNvbW1pdCkgPSBAXzsKKworICAgICMgZG9uJ3QgdXNlIHN1YmRpcnMgZm9yIHRhZ3MgeWV0LCBpdCBjb3VsZCBzY3JldyB1cCBvdGhlciBwb3JjZWxhaW5zCisgICAgJHRhZyA9fiBzfC98LHxnOyAKKyAgICAKKyAgICBteSAkdGFnX2ZpbGUgPSAiJHB0YWdfZGlyLyR0YWciOworICAgIG15ICR0YWdfYnJhbmNoX2RpciA9IGRpcm5hbWUoJHRhZ19maWxlKTsKKyAgICBta3BhdGgoJHRhZ19icmFuY2hfZGlyKSB1bmxlc3MgKC1kICR0YWdfYnJhbmNoX2Rpcik7CisKKyAgICBpZiAoJGNvbW1pdCkgeyAgICAgICAgICAgICAgIyB3cml0ZQorICAgICAgICBvcGVuKEMsIj4iLCR0YWdfZmlsZSkKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIHByaW50IEMgIiRjb21taXRcbiIKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHdyaXRlIHRhZyAkdGFnOiAkIVxuIjsKKyAgICAgICAgY2xvc2UoQykKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHdyaXRlIHRhZyAkdGFnOiAkIVxuIjsKKwkkcnB0YWdzeyRjb21taXR9ID0gJHRhZyAKKwkgICAgdW5sZXNzICR0YWcgPX4gbS8tLWJhc2UtMCQvOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAjIHJlYWQKKyAgICAgICAgIyBpZiB0aGUgdGFnIGlzbid0IHRoZXJlLCByZXR1cm4gMAorICAgICAgICB1bmxlc3MgKCAtcyAkdGFnX2ZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG9wZW4oQywiPCIsJHRhZ19maWxlKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgcmVhZCB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgICRjb21taXQgPSA8Qz47CisgICAgICAgIGNob21wICRjb21taXQ7CisgICAgICAgIGRpZSAiRXJyb3IgcmVhZGluZyB0YWcgJHRhZzogJCFcbiIgdW5sZXNzIGxlbmd0aCAkY29tbWl0ID09IDQwOworICAgICAgICBjbG9zZShDKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgcmVhZCB0YWcgJHRhZzogJCFcbiI7CisJdW5sZXNzIChkZWZpbmVkICRycHRhZ3N7JGNvbW1pdH0pIHsKKwkgICAgJHJwdGFnc3skY29tbWl0fSA9ICR0YWc7CisJfQorICAgICAgICByZXR1cm4gJGNvbW1pdDsKKyAgICB9Cit9CisKK3N1YiBmaW5kX3BhcmVudHMgeworICAgICMKKyAgICAjIElkZW50aWZ5IHdoYXQgYnJhbmNoZXMgYXJlIG1lcmdpbmcgaW50byBtZQorICAgICMgYW5kIHdoZXRoZXIgd2UgYXJlIGZ1bGx5IG1lcmdlZAorICAgICMgZ2l0LW1lcmdlLWJhc2UgPGhlYWRzaGE+IDxoZWFkc2hhPiBzaG91bGQgdGVsbAorICAgICMgbWUgd2hhdCB0aGUgYmFzZSBvZiB0aGUgbWVyZ2Ugc2hvdWxkIGJlIAorICAgICMKKyAgICBteSAkcHMgPSBzaGlmdDsKKworICAgIG15ICVicmFuY2hlczsgIyBob2xkcyBhbiBhcnJheXJlZiBwZXIgYnJhbmNoCisgICAgICAgICAgICAgICAgICAjIHRoZSBhcnJheXJlZiBjb250YWlucyBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICMgbWVyZ2VkIHBhdGNoZXMgYmV0d2VlbiB0aGUgYmFzZQorICAgICAgICAgICAgICAgICAgIyBvZiB0aGUgbWVyZ2UgYW5kIHRoZSBjdXJyZW50IGhlYWQKKworICAgIG15IEBwYXJlbnRzOyAgIyBwYXJlbnRzIGZvdW5kIGZvciB0aGlzIGNvbW1pdAorCisgICAgIyBzaW1wbGUgbG9vcCB0byBzcGxpdCB0aGUgbWVyZ2VzCisgICAgIyBwZXIgYnJhbmNoCisgICAgZm9yZWFjaCBteSAkbWVyZ2UgKEB7JHBzLT57bWVyZ2VzfX0pIHsKKwlteSAkYnJhbmNoID0gZ2l0X2JyYW5jaG5hbWUoJG1lcmdlKTsKKwl1bmxlc3MgKGRlZmluZWQgJGJyYW5jaGVzeyRicmFuY2h9ICl7CisJICAgICRicmFuY2hlc3skYnJhbmNofSA9IFtdOworCX0KKwlwdXNoIEB7JGJyYW5jaGVzeyRicmFuY2h9fSwgJG1lcmdlOworICAgIH0KKworICAgICMKKyAgICAjIGZvcmVhY2ggYnJhbmNoIGZpbmQgYSBtZXJnZSBiYXNlIGFuZCB3YWxrIGl0IHRvIHRoZSAKKyAgICAjIGhlYWQgd2hlcmUgd2UgYXJlLCBjb2xsZWN0aW5nIHRoZSBtZXJnZWQgcGF0Y2hzZXRzIHRoYXQKKyAgICAjIEFyY2ggaGFzIHJlY29yZGVkLiBLZWVwIHRoYXQgaW4gQGhhdmUKKyAgICAjIENvbXBhcmUgdGhhdCB3aXRoIHRoZSBjb21taXRzIG9uIHRoZSBvdGhlciBicmFuY2gKKyAgICAjIGJldHdlZW4gbWVyZ2UtYmFzZSBhbmQgdGhlIHRpcCBvZiB0aGUgYnJhbmNoIChAbmVlZCkKKyAgICAjIGFuZCBzZWUgaWYgd2UgaGF2ZSBhIHNlcmllcyBvZiBjb25zZWN1dGl2ZSBwYXRjaGVzCisgICAgIyBzdGFydGluZyBmcm9tIHRoZSBtZXJnZSBiYXNlLiBUaGUgdGlwIG9mIHRoZSBzZXJpZXMKKyAgICAjIG9mIGNvbnNlY3V0aXZlIHBhdGNoZXMgbWVyZ2VkIGlzIG91ciBuZXcgcGFyZW50IGZvciAKKyAgICAjIHRoYXQgYnJhbmNoLgorICAgICMKKyAgICBmb3JlYWNoIG15ICRicmFuY2ggKGtleXMgJWJyYW5jaGVzKSB7CisKKwkjIGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkga25vdyBhYm91dCB0aGUgYnJhbmNoCisJbmV4dCB1bmxlc3MgLWUgIiRnaXRfZGlyL3JlZnMvaGVhZHMvJGJyYW5jaCI7CisKKwlteSAkbWVyZ2ViYXNlID0gYGdpdC1tZXJnZS1iYXNlICRicmFuY2ggJHBzLT57YnJhbmNofWA7CisgCWlmICgkPykgeyAKKyAJICAgICMgRG9uJ3QgZGllIGhlcmUsIEFyY2ggc3VwcG9ydHMgb25lLXdheSBjaGVycnktcGlja2luZworIAkgICAgIyBiZXR3ZWVuIGJyYW5jaGVzIHdpdGggbm8gY29tbW9uIGJhc2UgKG9yIGFueSByZWxhdGlvbnNoaXAKKyAJICAgICMgYXQgYWxsIGJlZm9yZWhhbmQpCisgCSAgICB3YXJuICJDYW5ub3QgZmluZCBtZXJnZSBiYXNlIGZvciAkYnJhbmNoIGFuZCAkcHMtPnticmFuY2h9IjsKKyAJICAgIG5leHQ7CisgCX0KKwljaG9tcCAkbWVyZ2ViYXNlOworCisJIyBub3cgd2FsayB1cCB0byB0aGUgbWVyZ2Vwb2ludCBjb2xsZWN0aW5nIHdoYXQgcGF0Y2hlcyB3ZSBoYXZlCisJbXkgJGJyYW5jaHRpcCA9IGdpdF9yZXZfcGFyc2UoJHBzLT57YnJhbmNofSk7CisJbXkgQGFuY2VzdG9ycyA9IGBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICRicmFuY2h0aXAgXiRtZXJnZWJhc2VgOworCW15ICVoYXZlOyAjIGNvbGxlY3RlZCBtZXJnZXMgdGhpcyBicmFuY2ggaGFzCisJZm9yZWFjaCBteSAkbWVyZ2UgKEB7JHBzLT57bWVyZ2VzfX0pIHsKKwkgICAgJGhhdmV7JG1lcmdlfSA9IDE7CisJfQorCW15ICVhbmNlc3RvcnNoYXZlOworCWZvcmVhY2ggbXkgJHBhciAoQGFuY2VzdG9ycykgeworCSAgICAkcGFyID0gY29tbWl0aWQycHNldCgkcGFyKTsKKwkgICAgaWYgKGRlZmluZWQgJHBhci0+e21lcmdlc30pIHsKKwkJZm9yZWFjaCBteSAkbWVyZ2UgKEB7JHBhci0+e21lcmdlc319KSB7CisJCSAgICAkYW5jZXN0b3JzaGF2ZXskbWVyZ2V9PTE7CisJCX0KKwkgICAgfQorCX0KKwkjIHByaW50ICIrKysrIE1lcmdlcyBpbiAkcHMtPntpZH0gYXJlLi4uLlxuIjsKKwkjIG15IEBoYXZlID0gc29ydCBrZXlzICVoYXZlOwlwcmludCBEdW1wZXIoXEBoYXZlKTsKKworCSMgbWVyZ2Ugd2hhdCB3ZSBoYXZlIHdpdGggd2hhdCBhbmNlc3RvcnMgaGF2ZQorCSVoYXZlID0gKCVoYXZlLCAlYW5jZXN0b3JzaGF2ZSk7CisKKwkjIHNlZSB3aGF0IHRoZSByZW1vdGUgYnJhbmNoIGhhcyAtIHRoZXNlIGFyZSB0aGUgbWVyZ2VzIHdlIAorCSMgd2lsbCB3YW50IHRvIGhhdmUgaW4gYSBjb25zZWN1dGl2ZSBzZXJpZXMgZnJvbSB0aGUgbWVyZ2ViYXNlCisJbXkgJG90aGVyYnJhbmNodGlwID0gZ2l0X3Jldl9wYXJzZSgkYnJhbmNoKTsKKwlteSBAbmVlZHJhdyA9IGBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICRvdGhlcmJyYW5jaHRpcCBeJG1lcmdlYmFzZWA7CisJbXkgQG5lZWQ7CisJZm9yZWFjaCBteSAkbmVlZHBzIChAbmVlZHJhdykgeyAJIyBnZXQgdGhlIHBzZXRzCisJICAgICRuZWVkcHMgPSBjb21taXRpZDJwc2V0KCRuZWVkcHMpOworCSAgICAjIGdpdC1yZXYtbGlzdCB3aWxsIGFsc28KKwkgICAgIyBsaXN0IGNvbW1pdHMgbWVyZ2VkIGluIHZpYSBlYXJsaWVyIAorCSAgICAjIG1lcmdlcy4gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb21taXRzCisJICAgICMgZnJvbSB0aGUgYnJhbmNoIHdlJ3JlIGxvb2tpbmcgYXQKKwkgICAgaWYgKCRicmFuY2ggZXEgJG5lZWRwcy0+e2JyYW5jaH0pIHsKKwkJcHVzaCBAbmVlZCwgJG5lZWRwcy0+e2lkfTsKKwkgICAgfQorCX0KKworCSMgcHJpbnQgIisrKysgTWVyZ2VzIGZyb20gJGJyYW5jaCB3ZSB3YW50IGFyZS4uLi5cbiI7CisJIyBwcmludCBEdW1wZXIoXEBuZWVkKTsKKworCW15ICRuZXdwYXJlbnQ7CisJd2hpbGUgKG15ICRuZWVkZWRfY29tbWl0ID0gcG9wIEBuZWVkKSB7CisJICAgIGlmICgkaGF2ZXskbmVlZGVkX2NvbW1pdH0pIHsKKwkJJG5ld3BhcmVudCA9ICRuZWVkZWRfY29tbWl0OworCSAgICB9IGVsc2UgeworCQlsYXN0OyAjIGJyZWFrIG91dCBvZiB0aGUgd2hpbGUKKwkgICAgfQorCX0KKwlpZiAoJG5ld3BhcmVudCkgeworCSAgICBwdXNoIEBwYXJlbnRzLCAkbmV3cGFyZW50OworCX0KKworCisgICAgfSAjIGVuZCBmb3JlYWNoIGJyYW5jaAorCisgICAgIyBwcnVuZSByZWR1bmRhbnQgcGFyZW50cworICAgIG15ICVwYXJlbnRzOworICAgIGZvcmVhY2ggbXkgJHAgKEBwYXJlbnRzKSB7CisJJHBhcmVudHN7JHB9ID0gMTsKKyAgICB9CisgICAgZm9yZWFjaCBteSAkcCAoQHBhcmVudHMpIHsKKwluZXh0IHVubGVzcyBleGlzdHMgJHBzZXRzeyRwfXttZXJnZXN9OworCW5leHQgdW5sZXNzIHJlZiAgICAkcHNldHN7JHB9e21lcmdlc307CisJbXkgQG1lcmdlcyA9IEB7JHBzZXRzeyRwfXttZXJnZXN9fTsKKwlmb3JlYWNoIG15ICRtZXJnZSAoQG1lcmdlcykgeworCSAgICBpZiAoJHBhcmVudHN7JG1lcmdlfSkgeyAKKwkJZGVsZXRlICRwYXJlbnRzeyRtZXJnZX07CisJICAgIH0KKwl9CisgICAgfQorCisgICAgQHBhcmVudHMgPSAoKTsKKyAgICBmb3JlYWNoIChrZXlzICVwYXJlbnRzKSB7CisgICAgICAgIHB1c2ggQHBhcmVudHMsICctcCcsIHB0YWcoJF8pOworICAgIH0KKyAgICByZXR1cm4gQHBhcmVudHM7Cit9CisKK3N1YiBnaXRfcmV2X3BhcnNlIHsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICR2YWwgID0gYGdpdC1yZXYtcGFyc2UgJG5hbWVgOworICAgIGRpZSAiRXJyb3I6IGdpdC1yZXYtcGFyc2UgJG5hbWUiIGlmICQ/OworICAgIGNob21wICR2YWw7CisgICAgcmV0dXJuICR2YWw7Cit9CisKKyMgcmVzb2x2ZSBhIFNIQTEgdG8gYSBrbm93biBwYXRjaHNldAorc3ViIGNvbW1pdGlkMnBzZXQgeworICAgIG15ICRjb21taXRpZCA9IHNoaWZ0OworICAgIGNob21wICRjb21taXRpZDsKKyAgICBteSAkbmFtZSA9ICRycHRhZ3N7JGNvbW1pdGlkfSAKKwl8fCBkaWUgIkNhbm5vdCBmaW5kIHJldmVyc2UgdGFnIG1hcHBpbmcgZm9yICRjb21taXRpZCI7CisgICAgJG5hbWUgPX4gc3wsfC98OworICAgIG15ICRwcyAgID0gJHBzZXRzeyRuYW1lfSAKKwl8fCAocHJpbnQgRHVtcGVyKHNvcnQga2V5cyAlcHNldHMpKSAmJiBkaWUgIkNhbm5vdCBmaW5kIHBhdGNoc2V0IGZvciAkbmFtZSI7CisgICAgcmV0dXJuICRwczsKK30KKworCisjIGFuIGFsdGVyYXRpdmUgdG8gYGNvbW1hbmRgIHRoYXQgYWxsb3dzIGlucHV0IHRvIGJlIHBhc3NlZCBhcyBhbiBhcnJheQorIyB0byB3b3JrIGFyb3VuZCBzaGVsbCBwcm9ibGVtcyB3aXRoIHdlaXJkIGNoYXJhY3RlcnMgaW4gYXJndW1lbnRzCitzdWIgc2FmZV9waXBlX2NhcHR1cmUgeworICAgIG15IEBvdXRwdXQ7CisgICAgaWYgKG15ICRwaWQgPSBvcGVuIG15ICRjaGlsZCwgJy18JykgeworICAgICAgICBAb3V0cHV0ID0gKDwkY2hpbGQ+KTsKKyAgICAgICAgY2xvc2UgJGNoaWxkIG9yIGRpZSBqb2luKCcgJyxAXykuIjogJCEgJD8iOworICAgIH0gZWxzZSB7CisJZXhlYyhAXykgb3IgZGllICIkISAkPyI7ICMgZXhlYygpIGNhbiBmYWlsIHRoZSBleGVjdXRhYmxlIGNhbid0IGJlIGZvdW5kCisgICAgfQorICAgIHJldHVybiB3YW50YXJyYXkgPyBAb3V0cHV0IDogam9pbignJyxAb3V0cHV0KTsKK30KKworIyBgdGxhIGxvZ3MgLXJmIC1kIDxkaXI+IHwgaGVhZCAtbjFgIG9yIGBiYXogdHJlZS1pZCA8ZGlyPmAKK3N1YiBhcmNoX3RyZWVfaWQgeworICAgIG15ICRkaXIgPSBzaGlmdDsKKyAgICBjaG9tcCggbXkgJHJldCA9IChzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdsb2dzJywnLXJmJywnLWQnLCRkaXIpKVswXSApOworICAgIHJldHVybiAkcmV0OworfQorCitzdWIgYXJjaGl2ZV9yZWFjaGFibGUgeworICAgIG15ICRhcmNoaXZlID0gc2hpZnQ7CisgICAgcmV0dXJuIDEgaWYgJHJlYWNoYWJsZXskYXJjaGl2ZX07CisgICAgcmV0dXJuIDAgaWYgJHVucmVhY2hhYmxleyRhcmNoaXZlfTsKKyAgICAKKyAgICBpZiAoc3lzdGVtICIkVExBIHdoZXJlaXMtYXJjaGl2ZSAkYXJjaGl2ZSA+L2Rldi9udWxsIikgeworICAgICAgICBpZiAoJG9wdF9hICYmIChzeXN0ZW0oJFRMQSwncmVnaXN0ZXItYXJjaGl2ZScsCisgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9taXJyb3JzLnNvdXJjZWNvbnRyb2wubmV0LyRhcmNoaXZlIikgPT0gMCkpIHsKKyAgICAgICAgICAgICRyZWFjaGFibGV7JGFyY2hpdmV9ID0gMTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHByaW50IFNUREVSUiAiQXJjaGl2ZSBpcyB1bnJlYWNoYWJsZTogJGFyY2hpdmVcbiI7CisgICAgICAgICR1bnJlYWNoYWJsZXskYXJjaGl2ZX0gPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAkcmVhY2hhYmxleyRhcmNoaXZlfSA9IDE7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ2l0LWJpc2VjdC5zaCBiL2dpdC1iaXNlY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDNkZjE0MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1iaXNlY3Quc2gKQEAgLTAsMCArMSwyNDggQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nW3N0YXJ0fGJhZHxnb29kfG5leHR8cmVzZXR8dmlzdWFsaXplXScKK0xPTkdfVVNBR0U9J2dpdCBiaXNlY3Qgc3RhcnQgWzxwYXRoc3BlYz5dCXJlc2V0IGJpc2VjdCBzdGF0ZSBhbmQgc3RhcnQgYmlzZWN0aW9uLgorZ2l0IGJpc2VjdCBiYWQgWzxyZXY+XQkJbWFyayA8cmV2PiBhIGtub3duLWJhZCByZXZpc2lvbi4KK2dpdCBiaXNlY3QgZ29vZCBbPHJldj4uLi5dCW1hcmsgPHJldj4uLi4ga25vd24tZ29vZCByZXZpc2lvbnMuCitnaXQgYmlzZWN0IG5leHQJCQlmaW5kIG5leHQgYmlzZWN0aW9uIHRvIHRlc3QgYW5kIGNoZWNrIGl0IG91dC4KK2dpdCBiaXNlY3QgcmVzZXQgWzxicmFuY2g+XQlmaW5pc2ggYmlzZWN0aW9uIHNlYXJjaCBhbmQgZ28gYmFjayB0byBicmFuY2guCitnaXQgYmlzZWN0IHZpc3VhbGl6ZSAgICAgICAgICAgIHNob3cgYmlzZWN0IHN0YXR1cyBpbiBnaXRrLgorZ2l0IGJpc2VjdCByZXBsYXkgPGxvZ2ZpbGU+CXJlcGxheSBiaXNlY3Rpb24gbG9nCitnaXQgYmlzZWN0IGxvZwkJCXNob3cgYmlzZWN0IGxvZy4nCisKKy4gZ2l0LXNoLXNldHVwCisKK3NxKCkgeworCXBlcmwgLWUgJworCQlmb3IgKEBBUkdWKSB7CisJCQlzLydcJycvJ1wnXFxcXFwnXCcnL2c7CisJCQlwcmludCAiICdcJyckXydcJyciOworCQl9CisJCXByaW50ICJcbiI7CisJJyAiJEAiCit9CisKK2Jpc2VjdF9hdXRvc3RhcnQoKSB7CisJdGVzdCAtZCAiJEdJVF9ESVIvcmVmcy9iaXNlY3QiIHx8IHsKKwkJZWNobyA+JjIgJ1lvdSBuZWVkIHRvIHN0YXJ0IGJ5ICJnaXQgYmlzZWN0IHN0YXJ0IicKKwkJaWYgdGVzdCAtdCAwCisJCXRoZW4KKwkJCWVjaG8gPiYyIC1uICdEbyB5b3Ugd2FudCBtZSB0byBkbyBpdCBmb3IgeW91IFtZL25dPyAnCisJCQlyZWFkIHllc25vCisJCQljYXNlICIkeWVzbm8iIGluCisJCQlbTm5dKikKKwkJCQlleGl0IDs7CisJCQllc2FjCisJCQliaXNlY3Rfc3RhcnQKKwkJZWxzZQorCQkJZXhpdCAxCisJCWZpCisJfQorfQorCitiaXNlY3Rfc3RhcnQoKSB7CisJIworCSMgVmVyaWZ5IEhFQUQuIElmIHdlIHdlcmUgYmlzZWN0aW5nIGJlZm9yZSB0aGlzLCByZXNldCB0byB0aGUKKwkjIHRvcC1vZi1saW5lIG1hc3RlciBmaXJzdCEKKwkjCisJaGVhZD0kKEdJVF9ESVI9IiRHSVRfRElSIiBnaXQtc3ltYm9saWMtcmVmIEhFQUQpIHx8CisJZGllICJCYWQgSEVBRCAtIEkgbmVlZCBhIHN5bWJvbGljIHJlZiIKKwljYXNlICIkaGVhZCIgaW4KKwlyZWZzL2hlYWRzL2Jpc2VjdCopCisJCWlmIFsgLXMgIiRHSVRfRElSL2hlYWQtbmFtZSIgXTsgdGhlbgorCQkgICAgYnJhbmNoPWBjYXQgIiRHSVRfRElSL2hlYWQtbmFtZSJgCisJCWVsc2UKKwkJICAgIGJyYW5jaD1tYXN0ZXIKKwkgICAgICAgIGZpCisJCWdpdCBjaGVja291dCAkYnJhbmNoIHx8IGV4aXQKKwkJOzsKKwlyZWZzL2hlYWRzLyopCisJCVsgLXMgIiRHSVRfRElSL2hlYWQtbmFtZSIgXSAmJiBkaWUgIndvbid0IGJpc2VjdCBvbiBzZWVrZWQgdHJlZSIKKwkJZWNobyAiJGhlYWQiIHwgc2VkICdzI15yZWZzL2hlYWRzLyMjJyA+IiRHSVRfRElSL2hlYWQtbmFtZSIKKwkJOzsKKwkqKQorCQlkaWUgIkJhZCBIRUFEIC0gc3RyYW5nZSBzeW1ib2xpYyByZWYiCisJCTs7CisJZXNhYworCisJIworCSMgR2V0IHJpZCBvZiBhbnkgb2xkIGJpc2VjdCBzdGF0ZQorCSMKKwlybSAtZiAiJEdJVF9ESVIvcmVmcy9oZWFkcy9iaXNlY3QiCisJcm0gLXJmICIkR0lUX0RJUi9yZWZzL2Jpc2VjdC8iCisJbWtkaXIgIiRHSVRfRElSL3JlZnMvYmlzZWN0IgorCXsKKwkgICAgcHJpbnRmICJnaXQtYmlzZWN0IHN0YXJ0IgorCSAgICBzcSAiJEAiCisJfSA+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJc3EgIiRAIiA+IiRHSVRfRElSL0JJU0VDVF9OQU1FUyIKK30KKworYmlzZWN0X2JhZCgpIHsKKwliaXNlY3RfYXV0b3N0YXJ0CisJY2FzZSAiJCMiIGluCisJMCkKKwkJcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSA7OworCTEpCisJCXJldj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxIikgOzsKKwkqKQorCQl1c2FnZSA7OworCWVzYWMgfHwgZXhpdAorCWVjaG8gIiRyZXYiID4iJEdJVF9ESVIvcmVmcy9iaXNlY3QvYmFkIgorCWVjaG8gIiMgYmFkOiAiJChnaXQtc2hvdy1icmFuY2ggJHJldikgPj4iJEdJVF9ESVIvQklTRUNUX0xPRyIKKwllY2hvICJnaXQtYmlzZWN0IGJhZCAkcmV2IiA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCWJpc2VjdF9hdXRvX25leHQKK30KKworYmlzZWN0X2dvb2QoKSB7CisJYmlzZWN0X2F1dG9zdGFydAorICAgICAgICBjYXNlICIkIyIgaW4KKwkwKSAgICByZXZzPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSB8fCBleGl0IDs7CisJKikgICAgcmV2cz0kKGdpdC1yZXYtcGFyc2UgLS1yZXZzLW9ubHkgLS1uby1mbGFncyAiJEAiKSAmJgorCQl0ZXN0ICcnICE9ICIkcmV2cyIgfHwgZGllICJCYWQgcmV2IGlucHV0OiAkQCIgOzsKKwllc2FjCisJZm9yIHJldiBpbiAkcmV2cworCWRvCisJCXJldj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRyZXYiKSB8fCBleGl0CisJCWVjaG8gIiRyZXYiID4iJEdJVF9ESVIvcmVmcy9iaXNlY3QvZ29vZC0kcmV2IgorCQllY2hvICIjIGdvb2Q6ICIkKGdpdC1zaG93LWJyYW5jaCAkcmV2KSA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCQllY2hvICJnaXQtYmlzZWN0IGdvb2QgJHJldiIgPj4iJEdJVF9ESVIvQklTRUNUX0xPRyIKKwlkb25lCisJYmlzZWN0X2F1dG9fbmV4dAorfQorCitiaXNlY3RfbmV4dF9jaGVjaygpIHsKKwluZXh0X29rPW5vCisgICAgICAgIHRlc3QgLWYgIiRHSVRfRElSL3JlZnMvYmlzZWN0L2JhZCIgJiYKKwljYXNlICIkKGNkICIkR0lUX0RJUiIgJiYgZWNobyByZWZzL2Jpc2VjdC9nb29kLSopIiBpbgorCXJlZnMvYmlzZWN0L2dvb2QtXCopIDs7CisJKikgbmV4dF9vaz15ZXMgOzsKKwllc2FjCisJY2FzZSAiJG5leHRfb2ssJDEiIGluCisJbm8sKSBmYWxzZSA7OworCW5vLGZhaWwpCisJICAgIGVjaG8gPiYyICdZb3UgbmVlZCB0byBnaXZlIG1lIGF0IGxlYXN0IG9uZSBnb29kIGFuZCBvbmUgYmFkIHJldmlzaW9ucy4nCisJICAgIGV4aXQgMSA7OworCSopCisJICAgIHRydWUgOzsKKwllc2FjCit9CisKK2Jpc2VjdF9hdXRvX25leHQoKSB7CisJYmlzZWN0X25leHRfY2hlY2sgJiYgYmlzZWN0X25leHQgfHwgOgorfQorCitiaXNlY3RfbmV4dCgpIHsKKyAgICAgICAgY2FzZSAiJCMiIGluIDApIDs7ICopIHVzYWdlIDs7IGVzYWMKKwliaXNlY3RfYXV0b3N0YXJ0CisJYmlzZWN0X25leHRfY2hlY2sgZmFpbAorCWJhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9iaXNlY3QvYmFkKSAmJgorCWdvb2Q9JChnaXQtcmV2LXBhcnNlIC0tc3EgLS1yZXZzLW9ubHkgLS1ub3QgXAorCQkkKGNkICIkR0lUX0RJUiIgJiYgbHMgcmVmcy9iaXNlY3QvZ29vZC0qKSkgJiYKKwlyZXY9JChldmFsICJnaXQtcmV2LWxpc3QgLS1iaXNlY3QgJGdvb2QgJGJhZCAtLSAkKGNhdCAkR0lUX0RJUi9CSVNFQ1RfTkFNRVMpIikgfHwgZXhpdAorCWlmIFsgLXogIiRyZXYiIF07IHRoZW4KKwkgICAgZWNobyAiJGJhZCB3YXMgYm90aCBnb29kIGFuZCBiYWQiCisJICAgIGV4aXQgMQorCWZpCisJaWYgWyAiJHJldiIgPSAiJGJhZCIgXTsgdGhlbgorCSAgICBlY2hvICIkcmV2IGlzIGZpcnN0IGJhZCBjb21taXQiCisJICAgIGdpdC1kaWZmLXRyZWUgLS1wcmV0dHkgJHJldgorCSAgICBleGl0IDAKKwlmaQorCW5yPSQoZXZhbCAiZ2l0LXJldi1saXN0ICRyZXYgJGdvb2QgLS0gJChjYXQgJEdJVF9ESVIvQklTRUNUX05BTUVTKSIgfCB3YyAtbCkgfHwgZXhpdAorCWVjaG8gIkJpc2VjdGluZzogJG5yIHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcyIKKwllY2hvICIkcmV2IiA+ICIkR0lUX0RJUi9yZWZzL2hlYWRzL25ldy1iaXNlY3QiCisJZ2l0IGNoZWNrb3V0IG5ldy1iaXNlY3QgfHwgZXhpdAorCW12ICIkR0lUX0RJUi9yZWZzL2hlYWRzL25ldy1iaXNlY3QiICIkR0lUX0RJUi9yZWZzL2hlYWRzL2Jpc2VjdCIgJiYKKwlHSVRfRElSPSIkR0lUX0RJUiIgZ2l0LXN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvYmlzZWN0CisJZ2l0LXNob3ctYnJhbmNoICIkcmV2IgorfQorCitiaXNlY3RfdmlzdWFsaXplKCkgeworCWJpc2VjdF9uZXh0X2NoZWNrIGZhaWwKKwlub3Q9YGNkICIkR0lUX0RJUi9yZWZzIiAmJiBlY2hvIGJpc2VjdC9nb29kLSpgCisJZXZhbCBnaXRrIGJpc2VjdC9iYWQgLS1ub3QgJG5vdCAtLSAkKGNhdCAiJEdJVF9ESVIvQklTRUNUX05BTUVTIikKK30KKworYmlzZWN0X3Jlc2V0KCkgeworCWNhc2UgIiQjIiBpbgorCTApIGlmIFsgLXMgIiRHSVRfRElSL2hlYWQtbmFtZSIgXTsgdGhlbgorCSAgICAgICBicmFuY2g9YGNhdCAiJEdJVF9ESVIvaGVhZC1uYW1lImAKKwkgICBlbHNlCisJICAgICAgIGJyYW5jaD1tYXN0ZXIKKwkgICBmaSA7OworCTEpIHRlc3QgLWYgIiRHSVRfRElSL3JlZnMvaGVhZHMvJDEiIHx8IHsKKwkgICAgICAgZWNobyA+JjIgIiQxIGRvZXMgbm90IHNlZW0gdG8gYmUgYSB2YWxpZCBicmFuY2giCisJICAgICAgIGV4aXQgMQorCSAgIH0KKwkgICBicmFuY2g9IiQxIiA7OworICAgICAgICAqKQorCSAgICB1c2FnZSA7OworCWVzYWMKKwlnaXQgY2hlY2tvdXQgIiRicmFuY2giICYmCisJcm0gLWZyICIkR0lUX0RJUi9yZWZzL2Jpc2VjdCIKKwlybSAtZiAiJEdJVF9ESVIvcmVmcy9oZWFkcy9iaXNlY3QiICIkR0lUX0RJUi9oZWFkLW5hbWUiCisJcm0gLWYgIiRHSVRfRElSL0JJU0VDVF9MT0ciCisJcm0gLWYgIiRHSVRfRElSL0JJU0VDVF9OQU1FUyIKK30KKworYmlzZWN0X3JlcGxheSAoKSB7CisJdGVzdCAtciAiJDEiIHx8IHsKKwkJZWNobyA+JjIgImNhbm5vdCByZWFkICQxIGZvciByZXBsYXlpbmciCisJCWV4aXQgMQorCX0KKwliaXNlY3RfcmVzZXQKKwl3aGlsZSByZWFkIGJpc2VjdCBjb21tYW5kIHJldgorCWRvCisJCXRlc3QgIiRiaXNlY3QiID0gImdpdC1iaXNlY3QiIHx8IGNvbnRpbnVlCisJCWNhc2UgIiRjb21tYW5kIiBpbgorCQlzdGFydCkKKwkJCWNtZD0iYmlzZWN0X3N0YXJ0ICRyZXYiCisJCQlldmFsICIkY21kIgorCQkJOzsKKwkJZ29vZCkKKwkJCWVjaG8gIiRyZXYiID4iJEdJVF9ESVIvcmVmcy9iaXNlY3QvZ29vZC0kcmV2IgorCQkJZWNobyAiIyBnb29kOiAiJChnaXQtc2hvdy1icmFuY2ggJHJldikgPj4iJEdJVF9ESVIvQklTRUNUX0xPRyIKKwkJCWVjaG8gImdpdC1iaXNlY3QgZ29vZCAkcmV2IiA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCQkJOzsKKwkJYmFkKQorCQkJZWNobyAiJHJldiIgPiIkR0lUX0RJUi9yZWZzL2Jpc2VjdC9iYWQiCisJCQllY2hvICIjIGJhZDogIiQoZ2l0LXNob3ctYnJhbmNoICRyZXYpID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJCQllY2hvICJnaXQtYmlzZWN0IGJhZCAkcmV2IiA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCQkJOzsKKwkJKikKKwkJCWVjaG8gPiYyICI/PyB3aGF0IGFyZSB5b3UgdGFsa2luZyBhYm91dD8iCisJCQlleGl0IDEgOzsKKwkJZXNhYworCWRvbmUgPCIkMSIKKwliaXNlY3RfYXV0b19uZXh0Cit9CisKK2Nhc2UgIiQjIiBpbgorMCkKKyAgICB1c2FnZSA7OworKikKKyAgICBjbWQ9IiQxIgorICAgIHNoaWZ0CisgICAgY2FzZSAiJGNtZCIgaW4KKyAgICBzdGFydCkKKyAgICAgICAgYmlzZWN0X3N0YXJ0ICIkQCIgOzsKKyAgICBiYWQpCisgICAgICAgIGJpc2VjdF9iYWQgIiRAIiA7OworICAgIGdvb2QpCisgICAgICAgIGJpc2VjdF9nb29kICIkQCIgOzsKKyAgICBuZXh0KQorICAgICAgICAjIE5vdCBzdXJlIHdlIHdhbnQgIm5leHQiIGF0IHRoZSBVSSBsZXZlbCBhbnltb3JlLgorICAgICAgICBiaXNlY3RfbmV4dCAiJEAiIDs7CisgICAgdmlzdWFsaXplKQorCWJpc2VjdF92aXN1YWxpemUgIiRAIiA7OworICAgIHJlc2V0KQorICAgICAgICBiaXNlY3RfcmVzZXQgIiRAIiA7OworICAgIHJlcGxheSkKKwliaXNlY3RfcmVwbGF5ICIkQCIgOzsKKyAgICBsb2cpCisJY2F0ICIkR0lUX0RJUi9CSVNFQ1RfTE9HIiA7OworICAgICopCisgICAgICAgIHVzYWdlIDs7CisgICAgZXNhYworZXNhYwpkaWZmIC0tZ2l0IGEvZ2l0LWJyYW5jaC5zaCBiL2dpdC1icmFuY2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTA1MDFlYwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1icmFuY2guc2gKQEAgLTAsMCArMSwxMzAgQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nWy1sXSBbKC1kIHwgLUQpIDxicmFuY2huYW1lPl0gfCBbWy1mXSA8YnJhbmNobmFtZT4gWzxzdGFydC1wb2ludD5dXSB8IC1yJworTE9OR19VU0FHRT0nSWYgbm8gYXJndW1lbnRzLCBzaG93IGF2YWlsYWJsZSBicmFuY2hlcyBhbmQgbWFyayBjdXJyZW50IGJyYW5jaCB3aXRoIGEgc3Rhci4KK0lmIG9uZSBhcmd1bWVudCwgY3JlYXRlIGEgbmV3IGJyYW5jaCA8YnJhbmNobmFtZT4gYmFzZWQgb2ZmIG9mIGN1cnJlbnQgSEVBRC4KK0lmIHR3byBhcmd1bWVudHMsIGNyZWF0ZSBhIG5ldyBicmFuY2ggPGJyYW5jaG5hbWU+IGJhc2VkIG9mZiBvZiA8c3RhcnQtcG9pbnQ+LicKKworU1VCRElSRUNUT1JZX09LPSdZZXMnCisuIGdpdC1zaC1zZXR1cAorCitoZWFkcmVmPSQoZ2l0LXN5bWJvbGljLXJlZiBIRUFEIHwgc2VkIC1lICdzfF5yZWZzL2hlYWRzL3x8JykKKworZGVsZXRlX2JyYW5jaCAoKSB7CisgICAgb3B0aW9uPSIkMSIKKyAgICBzaGlmdAorICAgIGZvciBicmFuY2hfbmFtZQorICAgIGRvCisJY2FzZSAiLCRoZWFkcmVmLCIgaW4KKwkiLCRicmFuY2hfbmFtZSwiKQorCSAgICBkaWUgIkNhbm5vdCBkZWxldGUgdGhlIGJyYW5jaCB5b3UgYXJlIG9uLiIgOzsKKwksLCkKKwkgICAgZGllICJXaGF0IGJyYW5jaCBhcmUgeW91IG9uIGFueXdheT8iIDs7CisJZXNhYworCWJyYW5jaD0kKGNhdCAiJEdJVF9ESVIvcmVmcy9oZWFkcy8kYnJhbmNoX25hbWUiKSAmJgorCSAgICBicmFuY2g9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkYnJhbmNoXjAiKSB8fAorCQlkaWUgIlNlcmlvdXNseSwgd2hhdCBicmFuY2ggYXJlIHlvdSB0YWxraW5nIGFib3V0PyIKKwljYXNlICIkb3B0aW9uIiBpbgorCS1EKQorCSAgICA7OworCSopCisJICAgIG1icz0kKGdpdC1tZXJnZS1iYXNlIC1hICIkYnJhbmNoIiBIRUFEIHwgdHIgJ1wwMTInICcgJykKKwkgICAgY2FzZSAiICRtYnMgIiBpbgorCSAgICAqJyAnJGJyYW5jaCcgJyopCisJCSMgdGhlIG1lcmdlIGJhc2Ugb2YgYnJhbmNoIGFuZCBIRUFEIGNvbnRhaW5zIGJyYW5jaCAtLQorCQkjIHdoaWNoIG1lYW5zIHRoYXQgdGhlIEhFQUQgY29udGFpbnMgZXZlcnl0aGluZyBpbiBib3RoLgorCQk7OworCSAgICAqKQorCQllY2hvID4mMiAiVGhlIGJyYW5jaCAnJGJyYW5jaF9uYW1lJyBpcyBub3QgYSBzdHJpY3Qgc3Vic2V0IG9mIHlvdXIgY3VycmVudCBIRUFELgorSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBpdCwgcnVuICdnaXQgYnJhbmNoIC1EICRicmFuY2hfbmFtZScuIgorCQlleGl0IDEKKwkJOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwlybSAtZiAiJEdJVF9ESVIvbG9ncy9yZWZzL2hlYWRzLyRicmFuY2hfbmFtZSIKKwlybSAtZiAiJEdJVF9ESVIvcmVmcy9oZWFkcy8kYnJhbmNoX25hbWUiCisJZWNobyAiRGVsZXRlZCBicmFuY2ggJGJyYW5jaF9uYW1lLiIKKyAgICBkb25lCisgICAgZXhpdCAwCit9CisKK2xzX3JlbW90ZV9icmFuY2hlcyAoKSB7CisgICAgZ2l0LXJldi1wYXJzZSAtLXN5bWJvbGljIC0tYWxsIHwKKyAgICBzZWQgLW5lICdzfF5yZWZzL1wocmVtb3Rlcy9cKXxcMXxwJyB8CisgICAgc29ydAorfQorCitmb3JjZT0KK2NyZWF0ZV9sb2c9Cit3aGlsZSBjYXNlICIkIywkMSIgaW4gMCwqKSBicmVhayA7OyAqLC0qKSA7OyAqKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1kIHwgLUQpCisJCWRlbGV0ZV9icmFuY2ggIiRAIgorCQlleGl0CisJCTs7CisJLXIpCisJCWxzX3JlbW90ZV9icmFuY2hlcworCQlleGl0CisJCTs7CisJLWYpCisJCWZvcmNlPSIkMSIKKwkJOzsKKwktbCkKKwkJY3JlYXRlX2xvZz0ieWVzIgorCQk7OworCS0tKQorCQlzaGlmdAorCQlicmVhaworCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitjYXNlICIkIyIgaW4KKzApCisJZ2l0LXJldi1wYXJzZSAtLXN5bWJvbGljIC0tYnJhbmNoZXMgfAorCXNvcnQgfAorCXdoaWxlIHJlYWQgcmVmCisJZG8KKwkJaWYgdGVzdCAiJGhlYWRyZWYiID0gIiRyZWYiCisJCXRoZW4KKwkJCXBmeD0nKicKKwkJZWxzZQorCQkJcGZ4PScgJworCQlmaQorCQllY2hvICIkcGZ4ICRyZWYiCisJZG9uZQorCWV4aXQgMCA7OworMSkKKwloZWFkPUhFQUQgOzsKKzIpCisJaGVhZD0iJDJeMCIgOzsKK2VzYWMKK2JyYW5jaG5hbWU9IiQxIgorCityZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkaGVhZCIpIHx8IGV4aXQKKworZ2l0LWNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyRicmFuY2huYW1lIiB8fAorCWRpZSAid2UgZG8gbm90IGxpa2UgJyRicmFuY2huYW1lJyBhcyBhIGJyYW5jaCBuYW1lLiIKKworaWYgWyAtZSAiJEdJVF9ESVIvcmVmcy9oZWFkcy8kYnJhbmNobmFtZSIgXQordGhlbgorCWlmIHRlc3QgJycgPSAiJGZvcmNlIgorCXRoZW4KKwkJZGllICIkYnJhbmNobmFtZSBhbHJlYWR5IGV4aXN0cy4iCisJZWxpZiB0ZXN0ICIkYnJhbmNobmFtZSIgPSAiJGhlYWRyZWYiCisJdGhlbgorCQlkaWUgImNhbm5vdCBmb3JjZS11cGRhdGUgdGhlIGN1cnJlbnQgYnJhbmNoLiIKKwlmaQorZmkKK2lmIHRlc3QgIiRjcmVhdGVfbG9nIiA9ICd5ZXMnCit0aGVuCisJbWtkaXIgLXAgJChkaXJuYW1lICIkR0lUX0RJUi9sb2dzL3JlZnMvaGVhZHMvJGJyYW5jaG5hbWUiKQorCXRvdWNoICIkR0lUX0RJUi9sb2dzL3JlZnMvaGVhZHMvJGJyYW5jaG5hbWUiCitmaQorZ2l0IHVwZGF0ZS1yZWYgLW0gImJyYW5jaDogQ3JlYXRlZCBmcm9tICRoZWFkIiAicmVmcy9oZWFkcy8kYnJhbmNobmFtZSIgJHJldgpkaWZmIC0tZ2l0IGEvZ2l0LWNoZWNrb3V0LnNoIGIvZ2l0LWNoZWNrb3V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2NDExN2YKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY2hlY2tvdXQuc2gKQEAgLTAsMCArMSwyMTEgQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nWy1mXSBbLWIgPG5ld19icmFuY2g+XSBbLW1dIFs8YnJhbmNoPl0gWzxwYXRocz4uLi5dJworU1VCRElSRUNUT1JZX09LPVNvbWV0aW1lcworLiBnaXQtc2gtc2V0dXAKKworb2xkPSQoZ2l0LXJldi1wYXJzZSBIRUFEKQorb2xkX25hbWU9SEVBRAorbmV3PQorbmV3X25hbWU9Citmb3JjZT0KK2JyYW5jaD0KK25ld2JyYW5jaD0KK25ld2JyYW5jaF9sb2c9CittZXJnZT0KK3doaWxlIFsgIiQjIiAhPSAiMCIgXTsgZG8KKyAgICBhcmc9IiQxIgorICAgIHNoaWZ0CisgICAgY2FzZSAiJGFyZyIgaW4KKwkiLWIiKQorCQluZXdicmFuY2g9IiQxIgorCQlzaGlmdAorCQlbIC16ICIkbmV3YnJhbmNoIiBdICYmCisJCQlkaWUgImdpdCBjaGVja291dDogLWIgbmVlZHMgYSBicmFuY2ggbmFtZSIKKwkJWyAtZSAiJEdJVF9ESVIvcmVmcy9oZWFkcy8kbmV3YnJhbmNoIiBdICYmCisJCQlkaWUgImdpdCBjaGVja291dDogYnJhbmNoICRuZXdicmFuY2ggYWxyZWFkeSBleGlzdHMiCisJCWdpdC1jaGVjay1yZWYtZm9ybWF0ICJoZWFkcy8kbmV3YnJhbmNoIiB8fAorCQkJZGllICJnaXQgY2hlY2tvdXQ6IHdlIGRvIG5vdCBsaWtlICckbmV3YnJhbmNoJyBhcyBhIGJyYW5jaCBuYW1lLiIKKwkJOzsKKwkiLWwiKQorCQluZXdicmFuY2hfbG9nPTEKKwkJOzsKKwkiLWYiKQorCQlmb3JjZT0xCisJCTs7CisJLW0pCisJCW1lcmdlPTEKKwkJOzsKKwktLSkKKwkJYnJlYWsKKwkJOzsKKwktKikKKwkJdXNhZ2UKKwkJOzsKKwkqKQorCQlpZiByZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkYXJnXjAiIDI+L2Rldi9udWxsKQorCQl0aGVuCisJCQlpZiBbIC16ICIkcmV2IiBdOyB0aGVuCisJCQkJZWNobyAidW5rbm93biBmbGFnICRhcmciCisJCQkJZXhpdCAxCisJCQlmaQorCQkJbmV3PSIkcmV2IgorCQkJbmV3X25hbWU9IiRhcmdeMCIKKwkJCWlmIFsgLWYgIiRHSVRfRElSL3JlZnMvaGVhZHMvJGFyZyIgXTsgdGhlbgorCQkJCWJyYW5jaD0iJGFyZyIKKwkJCWZpCisJCWVsaWYgcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJGFyZ157dHJlZX0iIDI+L2Rldi9udWxsKQorCQl0aGVuCisJCQkjIGNoZWNraW5nIG91dCBzZWxlY3RlZCBwYXRocyBmcm9tIGEgdHJlZS1pc2guCisJCQluZXc9IiRyZXYiCisJCQluZXdfbmFtZT0iJGFyZ157dHJlZX0iCisJCQlicmFuY2g9CisJCWVsc2UKKwkJCW5ldz0KKwkJCW5ld19uYW1lPQorCQkJYnJhbmNoPQorCQkJc2V0IHggIiRhcmciICIkQCIKKwkJCXNoaWZ0CisJCWZpCisJCWJyZWFrCisJCTs7CisgICAgZXNhYworZG9uZQorCisjIFRoZSBiZWhhdmlvdXIgb2YgdGhlIGNvbW1hbmQgd2l0aCBhbmQgd2l0aG91dCBleHBsaWNpdCBwYXRoCisjIHBhcmFtZXRlcnMgaXMgcXVpdGUgZGlmZmVyZW50LgorIworIyBXaXRob3V0IHBhdGhzLCB3ZSBhcmUgY2hlY2tpbmcgb3V0IGV2ZXJ5dGhpbmcgaW4gdGhlIHdvcmsgdHJlZSwKKyMgcG9zc2libHkgc3dpdGNoaW5nIGJyYW5jaGVzLiAgVGhpcyBpcyB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3VyLgorIworIyBXaXRoIHBhdGhzLCB3ZSBhcmUgX25ldmVyXyBzd2l0Y2hpbmcgYnJhbmNoLCBidXQgY2hlY2tpbmcgb3V0CisjIHRoZSBuYW1lZCBwYXRocyBmcm9tIGVpdGhlciBpbmRleCAod2hlbiBubyByZXYgaXMgZ2l2ZW4pLAorIyBvciB0aGUgbmFtZWQgdHJlZS1pc2ggKHdoZW4gcmV2IGlzIGdpdmVuKS4KKworaWYgdGVzdCAiJCMiIC1nZSAxCit0aGVuCisJaGludD0KKwlpZiB0ZXN0ICIkIyIgLWVxIDEKKwl0aGVuCisJCWhpbnQ9IgorRGlkIHlvdSBpbnRlbmQgdG8gY2hlY2tvdXQgJyRAJyB3aGljaCBjYW4gbm90IGJlIHJlc29sdmVkIGFzIGNvbW1pdD8iCisJZmkKKwlpZiB0ZXN0ICcnICE9ICIkbmV3YnJhbmNoJGZvcmNlJG1lcmdlIgorCXRoZW4KKwkJZGllICJnaXQgY2hlY2tvdXQ6IHVwZGF0aW5nIHBhdGhzIGlzIGluY29tcGF0aWJsZSB3aXRoIHN3aXRjaGluZyBicmFuY2hlcy9mb3JjaW5nJGhpbnQiCisJZmkKKwlpZiB0ZXN0ICcnICE9ICIkbmV3IgorCXRoZW4KKwkJIyBmcm9tIGEgc3BlY2lmaWMgdHJlZS1pc2g7IG5vdGUgdGhhdCB0aGlzIGlzIGZvcgorCQkjIHJlc2N1aW5nIHBhdGhzIGFuZCBpcyBuZXZlciBtZWFudCB0byByZW1vdmUgd2hhdAorCQkjIGlzIG5vdCBpbiB0aGUgbmFtZWQgdHJlZS1pc2guCisJCWdpdC1scy10cmVlIC0tZnVsbC1uYW1lIC1yICIkbmV3IiAiJEAiIHwKKwkJZ2l0LXVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8gfHwgZXhpdCAkPworCWZpCisJZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11IC0tICIkQCIKKwlleGl0ICQ/CitlbHNlCisJIyBNYWtlIHN1cmUgd2UgZGlkIG5vdCBmYWxsIGJhY2sgb24gJGFyZ157dHJlZX0gY29kZXBhdGgKKwkjIHNpbmNlIHdlIGFyZSBub3QgY2hlY2tpbmcgb3V0IGZyb20gYW4gYXJiaXRyYXJ5IHRyZWUtaXNoLAorCSMgYnV0IHN3aXRjaGluZyBicmFuY2hlcy4KKwlpZiB0ZXN0ICcnICE9ICIkbmV3IgorCXRoZW4KKwkJZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJG5ld157Y29tbWl0fSIgPi9kZXYvbnVsbCAyPiYxIHx8CisJCWRpZSAiQ2Fubm90IHN3aXRjaCBicmFuY2ggdG8gYSBub24tY29tbWl0LiIKKwlmaQorZmkKKworIyBXZSBhcmUgc3dpdGNoaW5nIGJyYW5jaGVzIGFuZCBjaGVja2luZyBvdXQgdHJlZXMsIHNvCisjIHdlICpORUVEKiB0byBiZSBhdCB0aGUgdG9wbGV2ZWwuCitjZHVwPSQoZ2l0LXJldi1wYXJzZSAtLXNob3ctY2R1cCkKK2lmIHRlc3QgISAteiAiJGNkdXAiCit0aGVuCisJY2QgIiRjZHVwIgorZmkKKworWyAteiAiJG5ldyIgXSAmJiBuZXc9JG9sZCAmJiBuZXdfbmFtZT0iJG9sZF9uYW1lIgorCisjIElmIHdlIGRvbid0IGhhdmUgYW4gb2xkIGJyYW5jaCB0aGF0IHdlJ3JlIHN3aXRjaGluZyB0bywKKyMgYW5kIHdlIGRvbid0IGhhdmUgYSBuZXcgYnJhbmNoIG5hbWUgZm9yIHRoZSB0YXJnZXQgd2UKKyMgYXJlIHN3aXRjaGluZyB0bywgdGhlbiB3ZSdkIGJldHRlciBqdXN0IGJlIGNoZWNraW5nIG91dAorIyB3aGF0IHdlIGFscmVhZHkgaGFkCisKK1sgLXogIiRicmFuY2gkbmV3YnJhbmNoIiBdICYmCisJWyAiJG5ldyIgIT0gIiRvbGQiIF0gJiYKKwlkaWUgImdpdCBjaGVja291dDogdG8gY2hlY2tvdXQgdGhlIHJlcXVlc3RlZCBjb21taXQgeW91IG5lZWQgdG8gc3BlY2lmeSAKKyAgICAgICAgICAgICAgYSBuYW1lIGZvciBhIG5ldyBicmFuY2ggd2hpY2ggaXMgY3JlYXRlZCBhbmQgc3dpdGNoZWQgdG8iCisKK2lmIFsgIiRmb3JjZSIgXQordGhlbgorICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAkbmV3ICYmCisJZ2l0LWNoZWNrb3V0LWluZGV4IC1xIC1mIC11IC1hCitlbHNlCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggPi9kZXYvbnVsbAorICAgIG1lcmdlX2Vycm9yPSQoZ2l0LXJlYWQtdHJlZSAtbSAtdSAkb2xkICRuZXcgMj4mMSkgfHwgKAorCWNhc2UgIiRtZXJnZSIgaW4KKwknJykKKwkJZWNobyA+JjIgIiRtZXJnZV9lcnJvciIKKwkJZXhpdCAxIDs7CisJZXNhYworCisJIyBNYXRjaCB0aGUgaW5kZXggdG8gdGhlIHdvcmtpbmcgdHJlZSwgYW5kIGRvIGEgdGhyZWUtd2F5LgorICAgIAlnaXQgZGlmZi1maWxlcyAtLW5hbWUtb25seSB8IGdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgLS1zdGRpbiAmJgorCXdvcms9YGdpdCB3cml0ZS10cmVlYCAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAkbmV3ICYmCisJZ2l0IGNoZWNrb3V0LWluZGV4IC1mIC11IC1xIC1hICYmCisJZ2l0IHJlYWQtdHJlZSAtbSAtdSAtLWFnZ3Jlc3NpdmUgJG9sZCAkbmV3ICR3b3JrIHx8IGV4aXQKKworCWlmIHJlc3VsdD1gZ2l0IHdyaXRlLXRyZWUgMj4vZGV2L251bGxgCisJdGhlbgorCSAgICBlY2hvID4mMiAiVHJpdmlhbGx5IGF1dG9tZXJnZWQuIgorCWVsc2UKKwkgICAgZ2l0IG1lcmdlLWluZGV4IC1vIGdpdC1tZXJnZS1vbmUtZmlsZSAtYQorCWZpCisKKwkjIERvIG5vdCByZWdpc3RlciB0aGUgY2xlYW5seSBtZXJnZWQgcGF0aHMgaW4gdGhlIGluZGV4IHlldC4KKwkjIHRoaXMgaXMgbm90IGEgcmVhbCBtZXJnZSBiZWZvcmUgY29tbWl0dGluZywgYnV0IGp1c3QgY2FycnlpbmcKKwkjIHRoZSB3b3JraW5nIHRyZWUgY2hhbmdlcyBhbG9uZy4KKwl1bm1lcmdlZD1gZ2l0IGxzLWZpbGVzIC11YAorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAkbmV3CisJY2FzZSAiJHVubWVyZ2VkIiBpbgorCScnKQk7OworCSopCisJCSgKKwkJCXo0MD0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisJCQllY2hvICIkdW5tZXJnZWQiIHwKKwkJCXNlZCAtZSAncy9eWzAtN10qIFswLTlhLWZdKiAvJyIwICR6NDAgLyIKKwkJCWVjaG8gIiR1bm1lcmdlZCIKKwkJKSB8IGdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvCisJCTs7CisJZXNhYworCWV4aXQgMAorICAgICkKKyAgICBzYXZlZF9lcnI9JD8KKyAgICBpZiB0ZXN0ICIkc2F2ZWRfZXJyIiA9IDAKKyAgICB0aGVuCisJdGVzdCAiJG5ldyIgPSAiJG9sZCIgfHwgZ2l0IGRpZmYtaW5kZXggLS1uYW1lLXN0YXR1cyAiJG5ldyIKKyAgICBmaQorICAgIChleGl0ICRzYXZlZF9lcnIpCitmaQorCisjIAorIyBTd2l0Y2ggdGhlIEhFQUQgcG9pbnRlciB0byB0aGUgbmV3IGJyYW5jaCBpZiB3ZQorIyBjaGVja2VkIG91dCBhIGJyYW5jaCBoZWFkLCBhbmQgcmVtb3ZlIGFueSBwb3RlbnRpYWwKKyMgb2xkIE1FUkdFX0hFQUQncyAoc3Vic2VxdWVudCBjb21taXRzIHdpbGwgY2xlYXJseSBub3QKKyMgYmUgYmFzZWQgb24gdGhlbSwgc2luY2Ugd2UgcmUtc2V0IHRoZSBpbmRleCkKKyMKK2lmIFsgIiQ/IiAtZXEgMCBdOyB0aGVuCisJaWYgWyAiJG5ld2JyYW5jaCIgXTsgdGhlbgorCQlpZiBbICIkbmV3YnJhbmNoX2xvZyIgXTsgdGhlbgorCQkJbWtkaXIgLXAgJChkaXJuYW1lICIkR0lUX0RJUi9sb2dzL3JlZnMvaGVhZHMvJG5ld2JyYW5jaCIpCisJCQl0b3VjaCAiJEdJVF9ESVIvbG9ncy9yZWZzL2hlYWRzLyRuZXdicmFuY2giCisJCWZpCisJCWdpdC11cGRhdGUtcmVmIC1tICJjaGVja291dDogQ3JlYXRlZCBmcm9tICRuZXdfbmFtZSIgInJlZnMvaGVhZHMvJG5ld2JyYW5jaCIgJG5ldyB8fCBleGl0CisJCWJyYW5jaD0iJG5ld2JyYW5jaCIKKwlmaQorCVsgIiRicmFuY2giIF0gJiYKKwlHSVRfRElSPSIkR0lUX0RJUiIgZ2l0LXN5bWJvbGljLXJlZiBIRUFEICJyZWZzL2hlYWRzLyRicmFuY2giCisJcm0gLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiCitlbHNlCisJZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LWNoZXJyeS5zaCBiL2dpdC1jaGVycnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjBlODgzMQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jaGVycnkuc2gKQEAgLTAsMCArMSw5NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFuby4KKyMKKworVVNBR0U9J1stdl0gPHVwc3RyZWFtPiBbPGhlYWQ+XSBbPGxpbWl0Pl0nCitMT05HX1VTQUdFPScgICAgICAgICAgICAgX18qX18qX18qX18qX18+IDx1cHN0cmVhbT4KKyAgICAgICAgICAgIC8KKyAgZm9yay1wb2ludAorICAgICAgICAgICAgXF9fK19fK19fK19fK19fK19fK19fK19fPiA8aGVhZD4KKworRWFjaCBjb21taXQgYmV0d2VlbiB0aGUgZm9yay1wb2ludCAob3IgPGxpbWl0PiBpZiBnaXZlbikgYW5kIDxoZWFkPiBpcworZXhhbWluZWQsIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSBjaGFuZ2UgZWFjaCBjb21taXQgYmV0d2VlbiB0aGUKK2ZvcmstcG9pbnQgYW5kIDx1cHN0cmVhbT4gaW50cm9kdWNlcy4gIElmIHRoZSBjaGFuZ2Ugc2VlbXMgdG8gYmUgaW4KK3RoZSB1cHN0cmVhbSwgaXQgaXMgc2hvd24gb24gdGhlIHN0YW5kYXJkIG91dHB1dCB3aXRoIHByZWZpeCAiKyIuCitPdGhlcndpc2UgaXQgaXMgc2hvd24gd2l0aCBwcmVmaXggIi0iLicKKy4gZ2l0LXNoLXNldHVwCisKK2Nhc2UgIiQxIiBpbiAtdikgdmVyYm9zZT10OyBzaGlmdCA7OyBlc2FjIAorCitjYXNlICIkIywkMSIgaW4KKzEsKi4uKikKKyAgICB1cHN0cmVhbT0kKGV4cHIgInokMSIgOiAnelwoLipcKVwuXC4nKSBvdXJzPSQoZXhwciAieiQxIiA6ICcuKlwuXC5cKC4qXCkkJykKKyAgICBzZXQgeCAiJHVwc3RyZWFtIiAiJG91cnMiCisgICAgc2hpZnQgOzsKK2VzYWMKKworY2FzZSAiJCMiIGluCisxKSB1cHN0cmVhbT1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDEiYCAmJgorICAgb3Vycz1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEYCB8fCBleGl0CisgICBsaW1pdD0iJHVwc3RyZWFtIgorICAgOzsKKzIpIHVwc3RyZWFtPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMSJgICYmCisgICBvdXJzPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMiJgIHx8IGV4aXQKKyAgIGxpbWl0PSIkdXBzdHJlYW0iCisgICA7OworMykgdXBzdHJlYW09YGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxImAgJiYKKyAgIG91cnM9YGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQyImAgJiYKKyAgIGxpbWl0PWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMyJgIHx8IGV4aXQKKyAgIDs7CisqKSB1c2FnZSA7OworZXNhYworCisjIE5vdGUgdGhhdCB0aGVzZSBsaXN0IGNvbW1pdHMgaW4gcmV2ZXJzZSBvcmRlcjsKKyMgbm90IHRoYXQgdGhlIG9yZGVyIGluIGludXAgbWF0dGVycy4uLgoraW51cD1gZ2l0LXJldi1saXN0IF4kb3VycyAkdXBzdHJlYW1gICYmCitvdXJzPWBnaXQtcmV2LWxpc3QgJG91cnMgXiRsaW1pdGAgfHwgZXhpdAorCit0bXA9LmNoZXJyeS10bXAkJAorcGF0Y2g9JHRtcC1wYXRjaAorbWtkaXIgJHBhdGNoCit0cmFwICJybSAtcmYgJHRtcC0qIiAwIDEgMiAzIDE1CisKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgorCitmb3IgYyBpbiAkaW51cAorZG8KKwlnaXQtZGlmZi10cmVlIC1wICRjCitkb25lIHwgZ2l0LXBhdGNoLWlkIHwKK3doaWxlIHJlYWQgaWQgbmFtZQorZG8KKwllY2hvICRuYW1lID4+JHBhdGNoLyRpZAorZG9uZQorCitMRj0nCisnCisKK089Citmb3IgYyBpbiAkb3VycworZG8KKwlzZXQgeCBgZ2l0LWRpZmYtdHJlZSAtcCAkYyB8IGdpdC1wYXRjaC1pZGAKKwlpZiB0ZXN0ICIkMiIgIT0gIiIKKwl0aGVuCisJCWlmIHRlc3QgLWYgIiRwYXRjaC8kMiIKKwkJdGhlbgorCQkJc2lnbj0tCisJCWVsc2UKKwkJCXNpZ249KworCQlmaQorCQljYXNlICIkdmVyYm9zZSIgaW4KKwkJdCkKKwkJCWM9JChnaXQtcmV2LWxpc3QgLS1wcmV0dHk9b25lbGluZSAtLW1heC1jb3VudD0xICRjKQorCQllc2FjCisJCWNhc2UgIiRPIiBpbgorCQknJykJTz0iJHNpZ24gJGMiIDs7CisJCSopCU89IiRzaWduICRjJExGJE8iIDs7CisJCWVzYWMKKwlmaQorZG9uZQorY2FzZSAiJE8iIGluCisnJykgOzsKKyopICBlY2hvICIkTyIgOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2dpdC1jbGVhbi5zaCBiL2dpdC1jbGVhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODM0MzIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWNsZWFuLnNoCkBAIC0wLDAgKzEsODkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBQYXZlbCBSb3NraW4KKyMKKworVVNBR0U9IlstZF0gWy1uXSBbLXFdIFsteCB8IC1YXSBbLS1dIDxwYXRocz4uLi4iCitMT05HX1VTQUdFPSdDbGVhbiB1bnRyYWNrZWQgZmlsZXMgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkKKwktZAlyZW1vdmUgZGlyZWN0b3JpZXMgYXMgd2VsbAorCS1uIAlkb24nXCcndCByZW1vdmUgYW55dGhpbmcsIGp1c3Qgc2hvdyB3aGF0IHdvdWxkIGJlIGRvbmUKKwktcQliZSBxdWlldCwgb25seSByZXBvcnQgZXJyb3JzCisJLXgJcmVtb3ZlIGlnbm9yZWQgZmlsZXMgYXMgd2VsbAorCS1YCXJlbW92ZSBvbmx5IGlnbm9yZWQgZmlsZXMKK1doZW4gb3B0aW9uYWwgPHBhdGhzPi4uLiBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUgcGF0aHMKK2FmZmVjdGVkIGFyZSBmdXJ0aGVyIGxpbWl0ZWQgdG8gdGhvc2UgdGhhdCBtYXRjaCB0aGVtLicKK1NVQkRJUkVDVE9SWV9PSz1ZZXMKKy4gZ2l0LXNoLXNldHVwCisKK2lnbm9yZWQ9CitpZ25vcmVkb25seT0KK2NsZWFuZGlyPQorcXVpZXQ9CitybWY9InJtIC1mIC0tIgorcm1yZj0icm0gLXJmIC0tIgorcm1fcmVmdXNlPSJlY2hvIE5vdCByZW1vdmluZyIKK2VjaG8xPSJlY2hvIgorCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktZCkKKwkJY2xlYW5kaXI9MQorCQk7OworCS1uKQorCQlxdWlldD0xCisJCXJtZj0iZWNobyBXb3VsZCByZW1vdmUiCisJCXJtcmY9ImVjaG8gV291bGQgcmVtb3ZlIgorCQlybV9yZWZ1c2U9ImVjaG8gV291bGQgbm90IHJlbW92ZSIKKwkJZWNobzE9IjoiCisJCTs7CisJLXEpCisJCXF1aWV0PTEKKwkJOzsKKwkteCkKKwkJaWdub3JlZD0xCisJCTs7CisJLVgpCisJCWlnbm9yZWRvbmx5PTEKKwkJOzsKKwktLSkKKwkJc2hpZnQKKwkJYnJlYWsKKwkJOzsKKwktKikKKwkJdXNhZ2UKKwkJOzsKKwkqKQorCQlicmVhaworCWVzYWMKKwlzaGlmdAorZG9uZQorCitjYXNlICIkaWdub3JlZCwkaWdub3JlZG9ubHkiIGluCisJMSwxKSB1c2FnZTs7Citlc2FjCisKK2lmIFsgLXogIiRpZ25vcmVkIiBdOyB0aGVuCisJZXhjbD0iLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSIKKwlpZiBbIC1mICIkR0lUX0RJUi9pbmZvL2V4Y2x1ZGUiIF07IHRoZW4KKwkJZXhjbF9pbmZvPSItLWV4Y2x1ZGUtZnJvbT0kR0lUX0RJUi9pbmZvL2V4Y2x1ZGUiCisJZmkKKwlpZiBbICIkaWdub3JlZG9ubHkiIF07IHRoZW4KKwkJZXhjbD0iJGV4Y2wgLS1pZ25vcmVkIgorCWZpCitmaQorCitnaXQtbHMtZmlsZXMgLS1vdGhlcnMgLS1kaXJlY3RvcnkgJGV4Y2wgJHtleGNsX2luZm86KyIkZXhjbF9pbmZvIn0gLS0gIiRAIiB8Cit3aGlsZSByZWFkIC1yIGZpbGU7IGRvCisJaWYgWyAtZCAiJGZpbGUiIC1hICEgLUwgIiRmaWxlIiBdOyB0aGVuCisJCWlmIFsgLXogIiRjbGVhbmRpciIgXTsgdGhlbgorCQkJJHJtX3JlZnVzZSAiJGZpbGUiCisJCQljb250aW51ZQorCQlmaQorCQkkZWNobzEgIlJlbW92aW5nICRmaWxlIgorCQkkcm1yZiAiJGZpbGUiCisJZWxzZQorCQkkZWNobzEgIlJlbW92aW5nICRmaWxlIgorCQkkcm1mICIkZmlsZSIKKwlmaQorZG9uZQpkaWZmIC0tZ2l0IGEvZ2l0LWNsb25lLnNoIGIvZ2l0LWNsb25lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmYTBkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY2xvbmUuc2gKQEAgLTAsMCArMSw0MTggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUsIExpbnVzIFRvcnZhbGRzCisjIENvcHlyaWdodCAoYykgMjAwNSwgSnVuaW8gQyBIYW1hbm8KKyMgCisjIENsb25lIGEgcmVwb3NpdG9yeSBpbnRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IHlldCBleGlzdC4KKworIyBTZWUgZ2l0LXNoLXNldHVwIHdoeS4KK3Vuc2V0IENEUEFUSAorCit1c2FnZSgpIHsKKwllY2hvID4mMiAiVXNhZ2U6ICQwIFstLXRlbXBsYXRlPTx0ZW1wbGF0ZV9kaXJlY3Rvcnk+XSBbLS11c2Utc2VwYXJhdGUtcmVtb3RlXSBbLS1yZWZlcmVuY2UgPHJlZmVyZW5jZS1yZXBvPl0gWy0tYmFyZV0gWy1sIFstc11dIFstcV0gWy11IDx1cGxvYWQtcGFjaz5dIFstLW9yaWdpbiA8bmFtZT5dIFstbl0gPHJlcG8+IFs8ZGlyPl0iCisJZXhpdCAxCit9CisKK2dldF9yZXBvX2Jhc2UoKSB7CisJKGNkICIkMSIgJiYgKGNkIC5naXQgOyBwd2QpKSAyPiAvZGV2L251bGwKK30KKworaWYgWyAtbiAiJEdJVF9TU0xfTk9fVkVSSUZZIiBdOyB0aGVuCisgICAgY3VybF9leHRyYV9hcmdzPSItayIKK2ZpCisKK2h0dHBfZmV0Y2ggKCkgeworCSMgJDEgPSBSZW1vdGUsICQyID0gTG9jYWwKKwljdXJsIC1uc2ZMICRjdXJsX2V4dHJhX2FyZ3MgIiQxIiA+IiQyIgorfQorCitjbG9uZV9kdW1iX2h0dHAgKCkgeworCSMgJDEgLSByZW1vdGUsICQyIC0gbG9jYWwKKwljZCAiJDIiICYmCisJY2xvbmVfdG1wPSIkR0lUX0RJUi9jbG9uZS10bXAiICYmCisJbWtkaXIgLXAgIiRjbG9uZV90bXAiIHx8IGV4aXQgMQorCWh0dHBfZmV0Y2ggIiQxL2luZm8vcmVmcyIgIiRjbG9uZV90bXAvcmVmcyIgfHwgeworCQllY2hvID4mMiAiQ2Fubm90IGdldCByZW1vdGUgcmVwb3NpdG9yeSBpbmZvcm1hdGlvbi4KK1BlcmhhcHMgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyBuZWVkcyB0byBiZSBydW4gdGhlcmU/IgorCQlleGl0IDE7CisJfQorCXdoaWxlIHJlYWQgc2hhMSByZWZuYW1lCisJZG8KKwkJbmFtZT1gZXhwciAieiRyZWZuYW1lIiA6ICd6cmVmcy9cKC4qXCknYCAmJgorCQljYXNlICIkbmFtZSIgaW4KKwkJKl4qKQljb250aW51ZTs7CisJCWVzYWMKKwkJaWYgdGVzdCAtbiAiJHVzZV9zZXBhcmF0ZV9yZW1vdGUiICYmCisJCSAgIGJyYW5jaF9uYW1lPWBleHByICJ6JG5hbWUiIDogJ3poZWFkcy9cKC4qXCknYAorCQl0aGVuCisJCQl0bmFtZT0icmVtb3Rlcy8kb3JpZ2luLyRicmFuY2hfbmFtZSIKKwkJZWxzZQorCQkJdG5hbWU9JG5hbWUKKwkJZmkKKwkJZ2l0LWh0dHAtZmV0Y2ggLXYgLWEgLXcgIiR0bmFtZSIgIiRuYW1lIiAiJDEvIiB8fCBleGl0IDEKKwlkb25lIDwiJGNsb25lX3RtcC9yZWZzIgorCXJtIC1mciAiJGNsb25lX3RtcCIKKwlodHRwX2ZldGNoICIkMS9IRUFEIiAiJEdJVF9ESVIvUkVNT1RFX0hFQUQiIHx8CisJcm0gLWYgIiRHSVRfRElSL1JFTU9URV9IRUFEIgorfQorCisjIFJlYWQgZ2l0LWZldGNoLXBhY2sgLWsgb3V0cHV0IGFuZCBzdG9yZSB0aGUgcmVtb3RlIGJyYW5jaGVzLgorY29weV9yZWZzPScKK3VzZSBGaWxlOjpQYXRoIHF3KG1rcGF0aCk7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoZGlybmFtZSk7CitteSAkZ2l0X2RpciA9ICRBUkdWWzBdOworbXkgJHVzZV9zZXBhcmF0ZV9yZW1vdGUgPSAkQVJHVlsxXTsKK215ICRvcmlnaW4gPSAkQVJHVlsyXTsKKworbXkgJGJyYW5jaF90b3AgPSAoJHVzZV9zZXBhcmF0ZV9yZW1vdGUgPyAicmVtb3Rlcy8kb3JpZ2luIiA6ICJoZWFkcyIpOworbXkgJHRhZ190b3AgPSAidGFncyI7CisKK3N1YiBzdG9yZSB7CisJbXkgKCRzaGExLCAkbmFtZSwgJHRvcCkgPSBAXzsKKwkkbmFtZSA9ICIkZ2l0X2Rpci9yZWZzLyR0b3AvJG5hbWUiOworCW1rcGF0aChkaXJuYW1lKCRuYW1lKSk7CisJb3BlbiBPLCAiPiIsICIkbmFtZSI7CisJcHJpbnQgTyAiJHNoYTFcbiI7CisJY2xvc2UgTzsKK30KKworb3BlbiBGSCwgIjwiLCAiJGdpdF9kaXIvQ0xPTkVfSEVBRCI7Cit3aGlsZSAoPEZIPikgeworCW15ICgkc2hhMSwgJG5hbWUpID0gL14oWzAtOWEtZl17NDB9KVxzKC4qKSQvOworCW5leHQgaWYgKCRuYW1lID1+IC9cXlwxNzMvKTsKKwlpZiAoJG5hbWUgZXEgIkhFQUQiKSB7CisJCW9wZW4gTywgIj4iLCAiJGdpdF9kaXIvUkVNT1RFX0hFQUQiOworCQlwcmludCBPICIkc2hhMVxuIjsKKwkJY2xvc2UgTzsKKwkJbmV4dDsKKwl9CisJaWYgKCRuYW1lID1+IHMvXnJlZnNcL2hlYWRzXC8vLykgeworCQlzdG9yZSgkc2hhMSwgJG5hbWUsICRicmFuY2hfdG9wKTsKKwkJbmV4dDsKKwl9CisJaWYgKCRuYW1lID1+IHMvXnJlZnNcL3RhZ3NcLy8vKSB7CisJCXN0b3JlKCRzaGExLCAkbmFtZSwgJHRhZ190b3ApOworCQluZXh0OworCX0KK30KK2Nsb3NlIEZIOworJworCitxdWlldD0KK2xvY2FsPW5vCit1c2VfbG9jYWw9bm8KK2xvY2FsX3NoYXJlZD1ubwordW5zZXQgdGVtcGxhdGUKK25vX2NoZWNrb3V0PQordXBsb2FkX3BhY2s9CitiYXJlPQorcmVmZXJlbmNlPQorb3JpZ2luPQorb3JpZ2luX292ZXJyaWRlPQordXNlX3NlcGFyYXRlX3JlbW90ZT0KK3doaWxlCisJY2FzZSAiJCMsJDEiIGluCisJMCwqKSBicmVhayA7OworCSosLW58KiwtLW5vfCosLS1uby18KiwtLW5vLWN8KiwtLW5vLWNofCosLS1uby1jaGV8KiwtLW5vLWNoZWN8XAorCSosLS1uby1jaGVja3wqLC0tbm8tY2hlY2tvfCosLS1uby1jaGVja291fCosLS1uby1jaGVja291dCkKKwkgIG5vX2NoZWNrb3V0PXllcyA7OworCSosLS1uYXwqLC0tbmFrfCosLS1uYWtlfCosLS1uYWtlZHxcCisJKiwtYnwqLC0tYnwqLC0tYmF8KiwtLWJhcnwqLC0tYmFyZSkgYmFyZT15ZXMgOzsKKwkqLC1sfCosLS1sfCosLS1sb3wqLC0tbG9jfCosLS1sb2NhfCosLS1sb2NhbCkgdXNlX2xvY2FsPXllcyA7OworICAgICAgICAqLC1zfCosLS1zfCosLS1zaHwqLC0tc2hhfCosLS1zaGFyfCosLS1zaGFyZXwqLC0tc2hhcmVkKSAKKyAgICAgICAgICBsb2NhbF9zaGFyZWQ9eWVzOyB1c2VfbG9jYWw9eWVzIDs7CisJMSwtLXRlbXBsYXRlKSB1c2FnZSA7OworCSosLS10ZW1wbGF0ZSkKKwkJc2hpZnQ7IHRlbXBsYXRlPSItLXRlbXBsYXRlPSQxIiA7OworCSosLS10ZW1wbGF0ZT0qKQorCSAgdGVtcGxhdGU9IiQxIiA7OworCSosLXF8KiwtLXF1aWV0KSBxdWlldD0tcSA7OworCSosLS11c2Utc2VwYXJhdGUtcmVtb3RlKQorCQl1c2Vfc2VwYXJhdGVfcmVtb3RlPXQgOzsKKwkxLC0tcmVmZXJlbmNlKSB1c2FnZSA7OworCSosLS1yZWZlcmVuY2UpCisJCXNoaWZ0OyByZWZlcmVuY2U9IiQxIiA7OworCSosLS1yZWZlcmVuY2U9KikKKwkJcmVmZXJlbmNlPWBleHByICIkMSIgOiAnLS1yZWZlcmVuY2U9XCguKlwpJ2AgOzsKKwkqLC1vfCosLS1vcnwqLC0tb3JpfCosLS1vcmlnfCosLS1vcmlnaXwqLC0tb3JpZ2luKQorCQljYXNlICIkMiIgaW4KKwkJJycpCisJCSAgICB1c2FnZSA7OworCQkqLyopCisJCSAgICBlY2hvID4mMiAiJyQyJyBpcyBub3Qgc3VpdGFibGUgZm9yIGFuIG9yaWdpbiBuYW1lIgorCQkgICAgZXhpdCAxCisJCWVzYWMKKwkJZ2l0LWNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyQyIiB8fCB7CisJCSAgICBlY2hvID4mMiAiJyQyJyBpcyBub3Qgc3VpdGFibGUgZm9yIGEgYnJhbmNoIG5hbWUiCisJCSAgICBleGl0IDEKKwkJfQorCQl0ZXN0IC16ICIkb3JpZ2luX292ZXJyaWRlIiB8fCB7CisJCSAgICBlY2hvID4mMiAiRG8gbm90IGdpdmUgbW9yZSB0aGFuIG9uZSAtLW9yaWdpbiBvcHRpb25zLiIKKwkJICAgIGV4aXQgMQorCQl9CisJCW9yaWdpbl9vdmVycmlkZT15ZXMKKwkJb3JpZ2luPSIkMiI7IHNoaWZ0CisJCTs7CisJMSwtdXwxLC0tdXBsb2FkLXBhY2spIHVzYWdlIDs7CisJKiwtdXwqLC0tdXBsb2FkLXBhY2spCisJCXNoaWZ0CisJCXVwbG9hZF9wYWNrPSItLWV4ZWM9JDEiIDs7CisJKiwtKikgdXNhZ2UgOzsKKwkqKSBicmVhayA7OworCWVzYWMKK2RvCisJc2hpZnQKK2RvbmUKKworcmVwbz0iJDEiCitpZiB0ZXN0IC16ICIkcmVwbyIKK3RoZW4KKyAgICBlY2hvID4mMiAneW91IG11c3Qgc3BlY2lmeSBhIHJlcG9zaXRvcnkgdG8gY2xvbmUuJworICAgIGV4aXQgMQorZmkKKworIyAtLWJhcmUgaW1wbGllcyAtLW5vLWNoZWNrb3V0CitpZiB0ZXN0IHllcyA9ICIkYmFyZSIKK3RoZW4KKwlpZiB0ZXN0IHllcyA9ICIkb3JpZ2luX292ZXJyaWRlIgorCXRoZW4KKwkJZWNobyA+JjIgJy0tYmFyZSBhbmQgLS1vcmlnaW4gJG9yaWdpbiBvcHRpb25zIGFyZSBpbmNvbXBhdGlibGUuJworCQlleGl0IDEKKwlmaQorCWlmIHRlc3QgdCA9ICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIKKwl0aGVuCisJCWVjaG8gPiYyICctLWJhcmUgYW5kIC0tdXNlLXNlcGFyYXRlLXJlbW90ZSBvcHRpb25zIGFyZSBpbmNvbXBhdGlibGUuJworCQlleGl0IDEKKwlmaQorCW5vX2NoZWNrb3V0PXllcworZmkKKworaWYgdGVzdCAteiAiJG9yaWdpbiIKK3RoZW4KKwlvcmlnaW49b3JpZ2luCitmaQorCisjIFR1cm4gdGhlIHNvdXJjZSBpbnRvIGFuIGFic29sdXRlIHBhdGggaWYKKyMgaXQgaXMgbG9jYWwKK2lmIGJhc2U9JChnZXRfcmVwb19iYXNlICIkcmVwbyIpOyB0aGVuCisJcmVwbz0iJGJhc2UiCisJbG9jYWw9eWVzCitmaQorCitkaXI9IiQyIgorIyBUcnkgdXNpbmcgImh1bWFuaXNoIiBwYXJ0IG9mIHNvdXJjZSByZXBvIGlmIHVzZXIgZGlkbid0IHNwZWNpZnkgb25lCitbIC16ICIkZGlyIiBdICYmIGRpcj0kKGVjaG8gIiRyZXBvIiB8IHNlZCAtZSAnc3wvJHx8JyAtZSAnc3w6Ki8qXC5naXQkfHwnIC1lICdzfC4qWy86XXx8ZycpCitbIC1lICIkZGlyIiBdICYmIGVjaG8gIiRkaXIgYWxyZWFkeSBleGlzdHMuIiAmJiB1c2FnZQorbWtkaXIgLXAgIiRkaXIiICYmCitEPSQoY2QgIiRkaXIiICYmIHB3ZCkgJiYKK3RyYXAgJ2Vycj0kPzsgY2QgLi47IHJtIC1yICIkRCI7IGV4aXQgJGVycicgMAorY2FzZSAiJGJhcmUiIGluCit5ZXMpCisJR0lUX0RJUj0iJEQiIDs7CisqKQorCUdJVF9ESVI9IiRELy5naXQiIDs7Citlc2FjICYmIGV4cG9ydCBHSVRfRElSICYmIGdpdC1pbml0LWRiICR7dGVtcGxhdGUrIiR0ZW1wbGF0ZSJ9IHx8IHVzYWdlCisKK2lmIHRlc3QgLW4gIiRyZWZlcmVuY2UiCit0aGVuCisJaWYgdGVzdCAtZCAiJHJlZmVyZW5jZSIKKwl0aGVuCisJCWlmIHRlc3QgLWQgIiRyZWZlcmVuY2UvLmdpdC9vYmplY3RzIgorCQl0aGVuCisJCQlyZWZlcmVuY2U9IiRyZWZlcmVuY2UvLmdpdCIKKwkJZmkKKwkJcmVmZXJlbmNlPSQoY2QgIiRyZWZlcmVuY2UiICYmIHB3ZCkKKwkJZWNobyAiJHJlZmVyZW5jZS9vYmplY3RzIiA+IiRHSVRfRElSL29iamVjdHMvaW5mby9hbHRlcm5hdGVzIgorCQkoY2QgIiRyZWZlcmVuY2UiICYmIHRhciBjZiAtIHJlZnMpIHwKKwkJKGNkICIkR0lUX0RJUi9yZWZzIiAmJgorCQkgbWtkaXIgcmVmZXJlbmNlLXRtcCAmJgorCQkgY2QgcmVmZXJlbmNlLXRtcCAmJgorCQkgdGFyIHhmIC0pCisJZWxzZQorCQllY2hvID4mMiAiJHJlZmVyZW5jZTogbm90IGEgbG9jYWwgZGlyZWN0b3J5LiIgJiYgdXNhZ2UKKwlmaQorZmkKKworcm0gLWYgIiRHSVRfRElSL0NMT05FX0hFQUQiCisKKyMgV2UgZG8gbG9jYWwgbWFnaWMgb25seSB3aGVuIHRoZSB1c2VyIHRlbGxzIHVzIHRvLgorY2FzZSAiJGxvY2FsLCR1c2VfbG9jYWwiIGluCit5ZXMseWVzKQorCSggY2QgIiRyZXBvL29iamVjdHMiICkgfHwgeworCQllY2hvID4mMiAiLWwgZmxhZyBzZWVuIGJ1dCAkcmVwbyBpcyBub3QgbG9jYWwuIgorCQlleGl0IDEKKwl9CisKKwljYXNlICIkbG9jYWxfc2hhcmVkIiBpbgorCW5vKQorCSAgICAjIFNlZSBpZiB3ZSBjYW4gaGFyZGxpbmsgYW5kIGRyb3AgImwiIGlmIG5vdC4KKwkgICAgc2FtcGxlX2ZpbGU9JChjZCAiJHJlcG8iICYmIFwKKwkJCSAgZmluZCBvYmplY3RzIC10eXBlIGYgLXByaW50IHwgc2VkIC1lIDFxKQorCisJICAgICMgb2JqZWN0cyBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBiZSBlbXB0eSBzaW5jZSB3ZSBhcmUgY2xvbmluZyEKKwkgICAgdGVzdCAtZiAiJHJlcG8vJHNhbXBsZV9maWxlIiB8fCBleGl0CisKKwkgICAgbD0KKwkgICAgaWYgbG4gIiRyZXBvLyRzYW1wbGVfZmlsZSIgIiRHSVRfRElSL29iamVjdHMvc2FtcGxlIiAyPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCSAgICBsPWwKKwkgICAgZmkgJiYKKwkgICAgcm0gLWYgIiRHSVRfRElSL29iamVjdHMvc2FtcGxlIiAmJgorCSAgICBjZCAiJHJlcG8iICYmCisJICAgIGZpbmQgb2JqZWN0cyAtZGVwdGggLXByaW50IHwgY3BpbyAtcHVtZCRsICIkR0lUX0RJUi8iIHx8IGV4aXQgMQorCSAgICA7OworCXllcykKKwkgICAgbWtkaXIgLXAgIiRHSVRfRElSL29iamVjdHMvaW5mbyIKKwkgICAgZWNobyAiJHJlcG8vb2JqZWN0cyIgPj4gIiRHSVRfRElSL29iamVjdHMvaW5mby9hbHRlcm5hdGVzIgorCSAgICA7OworCWVzYWMKKwlnaXQtbHMtcmVtb3RlICIkcmVwbyIgPiIkR0lUX0RJUi9DTE9ORV9IRUFEIgorCTs7CisqKQorCWNhc2UgIiRyZXBvIiBpbgorCXJzeW5jOi8vKikKKwkJcnN5bmMgJHF1aWV0IC1hdiAtLWlnbm9yZS1leGlzdGluZyAgXAorCQkJLS1leGNsdWRlIGluZm8gIiRyZXBvL29iamVjdHMvIiAiJEdJVF9ESVIvb2JqZWN0cy8iIHx8CisJCWV4aXQKKwkJIyBMb29rIGF0IG9iamVjdHMvaW5mby9hbHRlcm5hdGVzIGZvciByc3luYyAtLSBodHRwIHdpbGwKKwkJIyBzdXBwb3J0IGl0IG5hdGl2ZWx5IGFuZCBnaXQgbmF0aXZlIG9uZXMgd2lsbCBkbyBpdCBvbiB0aGUKKwkJIyByZW1vdGUgZW5kLiAgTm90IGhhdmluZyB0aGF0IGZpbGUgaXMgbm90IGEgY3JpbWUuCisJCXJzeW5jIC1xICIkcmVwby9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIgXAorCQkJIiRHSVRfRElSL1RNUF9BTFQiIDI+L2Rldi9udWxsIHx8CisJCQlybSAtZiAiJEdJVF9ESVIvVE1QX0FMVCIKKwkJaWYgdGVzdCAtZiAiJEdJVF9ESVIvVE1QX0FMVCIKKwkJdGhlbgorCQkgICAgKCBjZCAiJEQiICYmCisJCSAgICAgIC4gZ2l0LXBhcnNlLXJlbW90ZSAmJgorCQkgICAgICByZXNvbHZlX2FsdGVybmF0ZXMgIiRyZXBvIiA8IiRHSVRfRElSL1RNUF9BTFQiICkgfAorCQkgICAgd2hpbGUgcmVhZCBhbHQKKwkJICAgIGRvCisJCQljYXNlICIkYWx0IiBpbiAnYmFkIGFsdGVybmF0ZTogJyopIGRpZSAiJGFsdCI7OyBlc2FjCisJCQljYXNlICIkcXVpZXQiIGluCisJCQknJykJZWNobyA+JjIgIkdldHRpbmcgYWx0ZXJuYXRlOiAkYWx0IiA7OworCQkJZXNhYworCQkJcnN5bmMgJHF1aWV0IC1hdiAtLWlnbm9yZS1leGlzdGluZyAgXAorCQkJICAgIC0tZXhjbHVkZSBpbmZvICIkYWx0IiAiJEdJVF9ESVIvb2JqZWN0cyIgfHwgZXhpdAorCQkgICAgZG9uZQorCQkgICAgcm0gLWYgIiRHSVRfRElSL1RNUF9BTFQiCisJCWZpCisJCWdpdC1scy1yZW1vdGUgIiRyZXBvIiA+IiRHSVRfRElSL0NMT05FX0hFQUQiCisJCTs7CisJaHR0cDovLyopCisJCWlmIHRlc3QgLXogIkBATk9fQ1VSTEBAIgorCQl0aGVuCisJCQljbG9uZV9kdW1iX2h0dHAgIiRyZXBvIiAiJEQiCisJCWVsc2UKKwkJCWVjaG8gPiYyICJodHRwIHRyYW5zcG9ydCBub3Qgc3VwcG9ydGVkLCByZWJ1aWxkIEdpdCB3aXRoIGN1cmwgc3VwcG9ydCIKKwkJCWV4aXQgMQorCQlmaQorCQk7OworCSopCisJCWNkICIkRCIgJiYgY2FzZSAiJHVwbG9hZF9wYWNrIiBpbgorCQknJykgZ2l0LWZldGNoLXBhY2sgLS1hbGwgLWsgJHF1aWV0ICIkcmVwbyIgOzsKKwkJKikgZ2l0LWZldGNoLXBhY2sgLS1hbGwgLWsgJHF1aWV0ICIkdXBsb2FkX3BhY2siICIkcmVwbyIgOzsKKwkJZXNhYyA+IiRHSVRfRElSL0NMT05FX0hFQUQiIHx8IHsKKwkJCWVjaG8gPiYyICJmZXRjaC1wYWNrIGZyb20gJyRyZXBvJyBmYWlsZWQuIgorCQkJZXhpdCAxCisJCX0KKwkJOzsKKwllc2FjCisJOzsKK2VzYWMKK3Rlc3QgLWQgIiRHSVRfRElSL3JlZnMvcmVmZXJlbmNlLXRtcCIgJiYgcm0gLWZyICIkR0lUX0RJUi9yZWZzL3JlZmVyZW5jZS10bXAiCisKK2lmIHRlc3QgLWYgIiRHSVRfRElSL0NMT05FX0hFQUQiCit0aGVuCisJIyBSZWFkIGdpdC1mZXRjaC1wYWNrIC1rIG91dHB1dCBhbmQgc3RvcmUgdGhlIHJlbW90ZSBicmFuY2hlcy4KKwlwZXJsIC1lICIkY29weV9yZWZzIiAiJEdJVF9ESVIiICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIgIiRvcmlnaW4iCitmaQorCitjZCAiJEQiIHx8IGV4aXQKKworaWYgdGVzdCAteiAiJGJhcmUiICYmIHRlc3QgLWYgIiRHSVRfRElSL1JFTU9URV9IRUFEIgordGhlbgorCSMgRmlndXJlIG91dCB3aGljaCByZW1vdGUgYnJhbmNoIEhFQUQgcG9pbnRzIGF0LgorCWNhc2UgIiR1c2Vfc2VwYXJhdGVfcmVtb3RlIiBpbgorCScnKQlyZW1vdGVfdG9wPXJlZnMvaGVhZHMgOzsKKwkqKQlyZW1vdGVfdG9wPSJyZWZzL3JlbW90ZXMvJG9yaWdpbiIgOzsKKwllc2FjCisKKwloZWFkX3NoYTE9YGNhdCAiJEdJVF9ESVIvUkVNT1RFX0hFQUQiYAorCWNhc2UgIiRoZWFkX3NoYTEiIGluCisJJ3JlZjogcmVmcy8nKikKKwkJIyBVaC1vaCwgdGhlIHJlbW90ZSB0b2xkIHVzIChodHRwIHRyYW5zcG9ydCBkb25lIGFnYWluc3QKKwkJIyBuZXcgc3R5bGUgcmVwb3NpdG9yeSB3aXRoIGEgc3ltcmVmIEhFQUQpLgorCQkjIElkZWFsbHkgd2Ugc2hvdWxkIHNraXAgdGhlIGd1ZXNzd29yayBidXQgZm9yIG5vdworCQkjIG9wdCBmb3IgbWluaW11bSBjaGFuZ2UuCisJCWhlYWRfc2hhMT1gZXhwciAieiRoZWFkX3NoYTEiIDogJ3pyZWY6IHJlZnMvaGVhZHMvXCguKlwpJ2AKKwkJaGVhZF9zaGExPWBjYXQgIiRHSVRfRElSLyRyZW1vdGVfdG9wLyRoZWFkX3NoYTEiYAorCQk7OworCWVzYWMKKworCSMgVGhlIG5hbWUgdW5kZXIgJHJlbW90ZV90b3AgdGhlIHJlbW90ZSBIRUFEIHNlZW1zIHRvIHBvaW50IGF0LgorCWhlYWRfcG9pbnRzX2F0PSQoCisJCSgKKwkJCWVjaG8gIm1hc3RlciIKKwkJCWNkICIkR0lUX0RJUi8kcmVtb3RlX3RvcCIgJiYKKwkJCWZpbmQgLiAtdHlwZSBmIC1wcmludCB8IHNlZCAtZSAncy9eXC5cLy8vJworCQkpIHwgKAorCQlkb25lPWYKKwkJd2hpbGUgcmVhZCBuYW1lCisJCWRvCisJCQl0ZXN0IHQgPSAkZG9uZSAmJiBjb250aW51ZQorCQkJYnJhbmNoX3RpcD1gY2F0ICIkR0lUX0RJUi8kcmVtb3RlX3RvcC8kbmFtZSJgCisJCQlpZiB0ZXN0ICIkaGVhZF9zaGExIiA9ICIkYnJhbmNoX3RpcCIKKwkJCXRoZW4KKwkJCQllY2hvICIkbmFtZSIKKwkJCQlkb25lPXQKKwkJCWZpCisJCWRvbmUKKwkJKQorCSkKKworCSMgV3JpdGUgb3V0IHJlbW90ZXMvJG9yaWdpbiBmaWxlLCBhbmQgdXBkYXRlIG91ciAiJGhlYWRfcG9pbnRzX2F0Ii4KKwljYXNlICIkaGVhZF9wb2ludHNfYXQiIGluCisJPyopCisJCW1rZGlyIC1wICIkR0lUX0RJUi9yZW1vdGVzIiAmJgorCQlnaXQtc3ltYm9saWMtcmVmIEhFQUQgInJlZnMvaGVhZHMvJGhlYWRfcG9pbnRzX2F0IiAmJgorCQljYXNlICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIgaW4KKwkJdCkJb3JpZ2luX3RyYWNrPSIkcmVtb3RlX3RvcC8kaGVhZF9wb2ludHNfYXQiCisJCQlnaXQtdXBkYXRlLXJlZiBIRUFEICIkaGVhZF9zaGExIiA7OworCQkqKQlvcmlnaW5fdHJhY2s9IiRyZW1vdGVfdG9wLyRvcmlnaW4iCisJCQlnaXQtdXBkYXRlLXJlZiAicmVmcy9oZWFkcy8kb3JpZ2luIiAiJGhlYWRfc2hhMSIgOzsKKwkJZXNhYyAmJgorCQllY2hvID4iJEdJVF9ESVIvcmVtb3Rlcy8kb3JpZ2luIiBcCisJCSJVUkw6ICRyZXBvCitQdWxsOiByZWZzL2hlYWRzLyRoZWFkX3BvaW50c19hdDokb3JpZ2luX3RyYWNrIiAmJgorCQkoY2QgIiRHSVRfRElSLyRyZW1vdGVfdG9wIiAmJiBmaW5kIC4gLXR5cGUgZiAtcHJpbnQpIHwKKwkJd2hpbGUgcmVhZCBkb3RzbHJlZgorCQlkbworCQkJbmFtZT1gZXhwciAiJGRvdHNscmVmIiA6ICcuL1woLipcKSdgCisJCQlpZiB0ZXN0ICJ6JGhlYWRfcG9pbnRzX2F0IiA9ICJ6JG5hbWUiCisJCQl0aGVuCisJCQkJY29udGludWUKKwkJCWZpCisJCQlpZiB0ZXN0ICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIgPSAnJyAmJgorCQkJICAgdGVzdCAieiRvcmlnaW4iID0gInokbmFtZSIKKwkJCXRoZW4KKwkJCQljb250aW51ZQorCQkJZmkKKwkJCWVjaG8gIlB1bGw6IHJlZnMvaGVhZHMvJHtuYW1lfTokcmVtb3RlX3RvcC8ke25hbWV9IgorCQlkb25lID4+IiRHSVRfRElSL3JlbW90ZXMvJG9yaWdpbiIgJiYKKwkJY2FzZSAiJHVzZV9zZXBhcmF0ZV9yZW1vdGUiIGluCisJCXQpCisJCQlybSAtZiAicmVmcy9yZW1vdGVzLyRvcmlnaW4vSEVBRCIKKwkJCWdpdC1zeW1ib2xpYy1yZWYgInJlZnMvcmVtb3Rlcy8kb3JpZ2luL0hFQUQiIFwKKwkJCQkicmVmcy9yZW1vdGVzLyRvcmlnaW4vJGhlYWRfcG9pbnRzX2F0IgorCQllc2FjCisJZXNhYworCisJY2FzZSAiJG5vX2NoZWNrb3V0IiBpbgorCScnKQorCQlnaXQtcmVhZC10cmVlIC1tIC11IC12IEhFQUQgSEVBRAorCWVzYWMKK2ZpCitybSAtZiAiJEdJVF9ESVIvQ0xPTkVfSEVBRCIgIiRHSVRfRElSL1JFTU9URV9IRUFEIgorCit0cmFwIC0gMAorCmRpZmYgLS1naXQgYS9naXQtY29tbWl0LnNoIGIvZ2l0LWNvbW1pdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZGQwNGZkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWNvbW1pdC5zaApAQCAtMCwwICsxLDc0MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKworVVNBR0U9J1stYV0gWy1zXSBbLXZdIFstLW5vLXZlcmlmeV0gWy1tIDxtZXNzYWdlPiB8IC1GIDxsb2dmaWxlPiB8ICgtQ3wtYykgPGNvbW1pdD5dIFstdV0gWy0tYW1lbmRdIFstZV0gWy0tYXV0aG9yIDxhdXRob3I+XSBbWy1pIHwgLW9dIDxwYXRoPi4uLl0nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorCitnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgPi9kZXYvbnVsbCAyPiYxIHx8IGluaXRpYWxfY29tbWl0PXQKK2JyYW5jaD0kKEdJVF9ESVI9IiRHSVRfRElSIiBnaXQtc3ltYm9saWMtcmVmIEhFQUQpCisKK2Nhc2UgIiQwIiBpbgorKnN0YXR1cykKKwlzdGF0dXNfb25seT10CisJdW5tZXJnZWRfb2tfaWZfc3RhdHVzPS0tdW5tZXJnZWQgOzsKKypjb21taXQpCisJc3RhdHVzX29ubHk9CisJdW5tZXJnZWRfb2tfaWZfc3RhdHVzPSA7OworZXNhYworCityZWZ1c2VfcGFydGlhbCAoKSB7CisJZWNobyA+JjIgIiQxIgorCWVjaG8gPiYyICJZb3UgbWlnaHQgaGF2ZSBtZWFudCB0byBzYXkgJ2dpdCBjb21taXQgLWkgcGF0aHMuLi4nLCBwZXJoYXBzPyIKKwlleGl0IDEKK30KKworVEhJU19JTkRFWD0iJEdJVF9ESVIvaW5kZXgiCitORVhUX0lOREVYPSIkR0lUX0RJUi9uZXh0LWluZGV4JCQiCitybSAtZiAiJE5FWFRfSU5ERVgiCitzYXZlX2luZGV4ICgpIHsKKwljcCAiJFRISVNfSU5ERVgiICIkTkVYVF9JTkRFWCIKK30KKworcmVwb3J0ICgpIHsKKyAgaGVhZGVyPSIjCisjICQxOgorIyAgICgkMikKKyMKKyIKKyAgdHJhaWxlcj0iIgorICB3aGlsZSByZWFkIHN0YXR1cyBuYW1lIG5ld25hbWUKKyAgZG8KKyAgICBwcmludGYgJyVzJyAiJGhlYWRlciIKKyAgICBoZWFkZXI9IiIKKyAgICB0cmFpbGVyPSIjCisiCisgICAgY2FzZSAiJHN0YXR1cyIgaW4KKyAgICBNICkgZWNobyAiIwltb2RpZmllZDogJG5hbWUiOzsKKyAgICBEKikgZWNobyAiIwlkZWxldGVkOiAgJG5hbWUiOzsKKyAgICBUICkgZWNobyAiIwl0eXBlY2hhbmdlOiAkbmFtZSI7OworICAgIEMqKSBlY2hvICIjCWNvcGllZDogJG5hbWUgLT4gJG5ld25hbWUiOzsKKyAgICBSKikgZWNobyAiIwlyZW5hbWVkOiAkbmFtZSAtPiAkbmV3bmFtZSI7OworICAgIEEqKSBlY2hvICIjCW5ldyBmaWxlOiAkbmFtZSI7OworICAgIFUgKSBlY2hvICIjCXVubWVyZ2VkOiAkbmFtZSI7OworICAgIGVzYWMKKyAgZG9uZQorICBwcmludGYgJyVzJyAiJHRyYWlsZXIiCisgIFsgIiRoZWFkZXIiIF0KK30KKworcnVuX3N0YXR1cyAoKSB7CisgICAgKAorCSMgV2UgYWx3YXlzIHNob3cgc3RhdHVzIGZvciB0aGUgd2hvbGUgdHJlZS4KKwljZCAiJFRPUCIKKworCUlTX0lOSVRJQUw9IiRpbml0aWFsX2NvbW1pdCIKKwlSRUZFUkVOQ0U9SEVBRAorCWNhc2UgIiRhbWVuZCIgaW4KKwl0KQorCQkjIElmIHdlIGFyZSBhbWVuZGluZyB0aGUgaW5pdGlhbCBjb21taXQsIHRoZXJlCisJCSMgaXMgbm8gSEVBRF4xLgorCQlpZiBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJIRUFEXjEiID4vZGV2L251bGwgMj4mMQorCQl0aGVuCisJCQlSRUZFUkVOQ0U9IkhFQUReMSIKKwkJCUlTX0lOSVRJQUw9CisJCWVsc2UKKwkJCUlTX0lOSVRJQUw9dAorCQlmaQorCQk7OworCWVzYWMKKworCSMgSWYgVE1QX0lOREVYIGlzIGRlZmluZWQsIHRoYXQgbWVhbnMgd2UgYXJlIGRvaW5nCisJIyAiLS1vbmx5IiBwYXJ0aWFsIGNvbW1pdCwgYW5kIHRoYXQgaW5kZXggZmlsZSBpcyB1c2VkCisJIyB0byBidWlsZCB0aGUgdHJlZSBmb3IgdGhlIGNvbW1pdC4gIE90aGVyd2lzZSwgaWYKKwkjIE5FWFRfSU5ERVggZXhpc3RzLCB0aGF0IGlzIHRoZSBpbmRleCBmaWxlIHVzZWQgdG8KKwkjIG1ha2UgdGhlIGNvbW1pdC4gIE90aGVyd2lzZSB3ZSBhcmUgdXNpbmcgYXMtaXMgY29tbWl0CisJIyBzbyB0aGUgcmVndWxhciBpbmRleCBmaWxlIGlzIHdoYXQgd2UgdXNlIHRvIGNvbXBhcmUuCisJaWYgdGVzdCAnJyAhPSAiJFRNUF9JTkRFWCIKKwl0aGVuCisJICAgIEdJVF9JTkRFWF9GSUxFPSIkVE1QX0lOREVYIgorCSAgICBleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwllbGlmIHRlc3QgLWYgIiRORVhUX0lOREVYIgorCXRoZW4KKwkgICAgR0lUX0lOREVYX0ZJTEU9IiRORVhUX0lOREVYIgorCSAgICBleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwlmaQorCisJY2FzZSAiJGJyYW5jaCIgaW4KKwlyZWZzL2hlYWRzL21hc3RlcikgOzsKKwkqKSAgZWNobyAiIyBPbiBicmFuY2ggJGJyYW5jaCIgOzsKKwllc2FjCisKKwlpZiB0ZXN0IC16ICIkSVNfSU5JVElBTCIKKwl0aGVuCisJICAgIGdpdC1kaWZmLWluZGV4IC1NIC0tY2FjaGVkIC0tbmFtZS1zdGF0dXMgXAorCQktLWRpZmYtZmlsdGVyPU1EVENSQSAkUkVGRVJFTkNFIHwKKwkgICAgc2VkIC1lICcKKwkJICAgIHMvXFwvXFxcXC9nCisJCSAgICBzLyAvXFwgL2cKKwkgICAgJyB8CisJICAgIHJlcG9ydCAiVXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iICJ3aWxsIGNvbW1pdCIKKwkgICAgY29tbWl0dGFibGU9IiQ/IgorCWVsc2UKKwkgICAgZWNobyAnIworIyBJbml0aWFsIGNvbW1pdAorIycKKwkgICAgZ2l0LWxzLWZpbGVzIHwKKwkgICAgc2VkIC1lICcKKwkJICAgIHMvXFwvXFxcXC9nCisJCSAgICBzLyAvXFwgL2cKKwkJICAgIHMvXi9BIC8KKwkgICAgJyB8CisJICAgIHJlcG9ydCAiVXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iICJ3aWxsIGNvbW1pdCIKKworCSAgICBjb21taXR0YWJsZT0iJD8iCisJZmkKKworCWdpdC1kaWZmLWZpbGVzICAtLW5hbWUtc3RhdHVzIHwKKwlzZWQgLWUgJworCQlzL1xcL1xcXFwvZworCQlzLyAvXFwgL2cKKwknIHwKKwlyZXBvcnQgIkNoYW5nZWQgYnV0IG5vdCB1cGRhdGVkIiBcCisJICAgICJ1c2UgZ2l0LXVwZGF0ZS1pbmRleCB0byBtYXJrIGZvciBjb21taXQiCisKKyAgICAgICAgb3B0aW9uPSIiCisgICAgICAgIGlmIHRlc3QgLXogIiR1bnRyYWNrZWRfZmlsZXMiOyB0aGVuCisgICAgICAgICAgICBvcHRpb249Ii0tZGlyZWN0b3J5IC0tbm8tZW1wdHktZGlyZWN0b3J5IgorICAgICAgICBmaQorCWlmIHRlc3QgLWYgIiRHSVRfRElSL2luZm8vZXhjbHVkZSIKKwl0aGVuCisJICAgIGdpdC1scy1maWxlcyAteiAtLW90aGVycyAkb3B0aW9uIFwKKwkJLS1leGNsdWRlLWZyb209IiRHSVRfRElSL2luZm8vZXhjbHVkZSIgXAorCQktLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlCisJZWxzZQorCSAgICBnaXQtbHMtZmlsZXMgLXogLS1vdGhlcnMgJG9wdGlvbiBcCisJCS0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUKKwlmaSB8CisJcGVybCAtZSAnJC8gPSAiXDAiOworCSAgICBteSAkc2hvd24gPSAwOworCSAgICB3aGlsZSAoPD4pIHsKKwkJY2hvbXA7CisJCXN8XFx8XFxcXHxnOworCQlzfFx0fFxcdHxnOworCQlzfFxufFxcbnxnOworCQlzL14vIwkvOworCQlpZiAoISRzaG93bikgeworCQkgICAgcHJpbnQgIiNcbiMgVW50cmFja2VkIGZpbGVzOlxuIjsKKwkJICAgIHByaW50ICIjICAgKHVzZSBcImdpdCBhZGRcIiB0byBhZGQgdG8gY29tbWl0KVxuIjsKKwkJICAgIHByaW50ICIjXG4iOworCQkgICAgJHNob3duID0gMTsKKwkJfQorCQlwcmludCAiJF9cbiI7CisJICAgIH0KKwknCisKKwlpZiB0ZXN0IC1uICIkdmVyYm9zZSIgLWEgLXogIiRJU19JTklUSUFMIgorCXRoZW4KKwkgICAgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLU0gLXAgLS1kaWZmLWZpbHRlcj1NRFRDUkEgJFJFRkVSRU5DRQorCWZpCisJY2FzZSAiJGNvbW1pdHRhYmxlIiBpbgorCTApCisJCWNhc2UgIiRhbWVuZCIgaW4KKwkJdCkKKwkJCWVjaG8gIiMgTm8gY2hhbmdlcyIgOzsKKwkJKikKKwkJCWVjaG8gIm5vdGhpbmcgdG8gY29tbWl0IiA7OworCQllc2FjCisJCWV4aXQgMSA7OworCWVzYWMKKwlleGl0IDAKKyAgICApCit9CisKK3RyYXAgJworCXRlc3QgLXogIiRUTVBfSU5ERVgiIHx8IHsKKwkJdGVzdCAtZiAiJFRNUF9JTkRFWCIgJiYgcm0gLWYgIiRUTVBfSU5ERVgiCisJfQorCXJtIC1mICIkTkVYVF9JTkRFWCIKKycgMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzaW5nIGFuZCBzYW5pdHkgY2hlY2tpbmcKKworYWxsPQorYWxzbz0KK29ubHk9Citsb2dmaWxlPQordXNlX2NvbW1pdD0KK2FtZW5kPQorbm9fZWRpdD0KK2xvZ19naXZlbj0KK2xvZ19tZXNzYWdlPQordmVyaWZ5PXQKK3ZlcmJvc2U9CitzaWdub2ZmPQorZm9yY2VfYXV0aG9yPQorb25seV9pbmNsdWRlX2Fzc3VtZWQ9Cit1bnRyYWNrZWRfZmlsZXM9Cit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworICBjYXNlICIkMSIgaW4KKyAgLUZ8LS1GfC1mfC0tZnwtLWZpfC0tZmlsfC0tZmlsZSkKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgbm9fZWRpdD10CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIGxvZ2ZpbGU9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1GKnwtZiopCisgICAgICBub19lZGl0PXQKKyAgICAgIGxvZ19naXZlbj10JGxvZ19naXZlbgorICAgICAgbG9nZmlsZT1gZXhwciAiJDEiIDogJy1bRmZdXCguKlwpJ2AKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLUY9KnwtLWY9KnwtLWZpPSp8LS1maWw9KnwtLWZpbGU9KikKKyAgICAgIG5vX2VkaXQ9dAorICAgICAgbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisgICAgICBsb2dmaWxlPWBleHByICIkMSIgOiAnLVtePV0qPVwoLipcKSdgCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLWF8LS1hfC0tYWx8LS1hbGwpCisgICAgICBhbGw9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC0tYXU9KnwtLWF1dD0qfC0tYXV0aD0qfC0tYXV0aG89KnwtLWF1dGhvcj0qKQorICAgICAgZm9yY2VfYXV0aG9yPWBleHByICIkMSIgOiAnLVtePV0qPVwoLipcKSdgCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLS1hdXwtLWF1dHwtLWF1dGh8LS1hdXRob3wtLWF1dGhvcikKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgZm9yY2VfYXV0aG9yPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtZXwtLWV8LS1lZHwtLWVkaXwtLWVkaXQpCisgICAgICBub19lZGl0PQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1pfC0taXwtLWlufC0taW5jfC0taW5jbHwtLWluY2x1fC0taW5jbHVkfC0taW5jbHVkZSkKKyAgICAgIGFsc289dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1vfC0tb3wtLW9ufC0tb25sfC0tb25seSkKKyAgICAgIG9ubHk9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1tfC0tbXwtLW1lfC0tbWVzfC0tbWVzc3wtLW1lc3NhfC0tbWVzc2FnfC0tbWVzc2FnZSkKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisgICAgICBpZiB0ZXN0ICIkbG9nX21lc3NhZ2UiID0gJycKKyAgICAgIHRoZW4KKyAgICAgICAgICBsb2dfbWVzc2FnZT0iJDEiCisgICAgICBlbHNlCisgICAgICAgICAgbG9nX21lc3NhZ2U9IiRsb2dfbWVzc2FnZQorCiskMSIKKyAgICAgIGZpCisgICAgICBub19lZGl0PXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtbSopCisgICAgICBsb2dfZ2l2ZW49bSRsb2dfZ2l2ZW4KKyAgICAgIGlmIHRlc3QgIiRsb2dfbWVzc2FnZSIgPSAnJworICAgICAgdGhlbgorICAgICAgICAgIGxvZ19tZXNzYWdlPWBleHByICIkMSIgOiAnLW1cKC4qXCknYAorICAgICAgZWxzZQorICAgICAgICAgIGxvZ19tZXNzYWdlPSIkbG9nX21lc3NhZ2UKKworYGV4cHIgIiQxIiA6ICctbVwoLipcKSdgIgorICAgICAgZmkKKyAgICAgIG5vX2VkaXQ9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC0tbT0qfC0tbWU9KnwtLW1lcz0qfC0tbWVzcz0qfC0tbWVzc2E9KnwtLW1lc3NhZz0qfC0tbWVzc2FnZT0qKQorICAgICAgbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisgICAgICBpZiB0ZXN0ICIkbG9nX21lc3NhZ2UiID0gJycKKyAgICAgIHRoZW4KKyAgICAgICAgICBsb2dfbWVzc2FnZT1gZXhwciAiJDEiIDogJy1bXj1dKj1cKC4qXCknYAorICAgICAgZWxzZQorICAgICAgICAgIGxvZ19tZXNzYWdlPSIkbG9nX21lc3NhZ2UKKworYGV4cHIgIiQxIiA6ICctW149XSo9XCguKlwpJ2AiCisgICAgICBmaQorICAgICAgbm9fZWRpdD10CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLW58LS1ufC0tbm98LS1uby18LS1uby12fC0tbm8tdmV8LS1uby12ZXJ8LS1uby12ZXJpfC0tbm8tdmVyaWZ8LS1uby12ZXJpZnkpCisgICAgICB2ZXJpZnk9CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLS1hfC0tYW18LS1hbWV8LS1hbWVufC0tYW1lbmQpCisgICAgICBhbWVuZD10CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9SEVBRAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1jKQorICAgICAgY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKyAgICAgIHNoaWZ0CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9IiQxIgorICAgICAgbm9fZWRpdD0KKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLXJlZT0qfC0tcmVlZD0qfC0tcmVlZGk9KnwtLXJlZWRpdD0qfC0tcmVlZGl0LT0qfC0tcmVlZGl0LW09KnxcCisgIC0tcmVlZGl0LW1lPSp8LS1yZWVkaXQtbWVzPSp8LS1yZWVkaXQtbWVzcz0qfC0tcmVlZGl0LW1lc3NhPSp8XAorICAtLXJlZWRpdC1tZXNzYWc9KnwtLXJlZWRpdC1tZXNzYWdlPSopCisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9YGV4cHIgIiQxIiA6ICctW149XSo9XCguKlwpJ2AKKyAgICAgIG5vX2VkaXQ9CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLS1yZWV8LS1yZWVkfC0tcmVlZGl8LS1yZWVkaXR8LS1yZWVkaXQtfC0tcmVlZGl0LW18LS1yZWVkaXQtbWV8XAorICAtLXJlZWRpdC1tZXN8LS1yZWVkaXQtbWVzc3wtLXJlZWRpdC1tZXNzYXwtLXJlZWRpdC1tZXNzYWd8LS1yZWVkaXQtbWVzc2FnZSkKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisgICAgICB1c2VfY29tbWl0PSIkMSIKKyAgICAgIG5vX2VkaXQ9CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLUMpCisgICAgICBjYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworICAgICAgc2hpZnQKKyAgICAgIGxvZ19naXZlbj10JGxvZ19naXZlbgorICAgICAgdXNlX2NvbW1pdD0iJDEiCisgICAgICBub19lZGl0PXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLXJldT0qfC0tcmV1cz0qfC0tcmV1c2U9KnwtLXJldXNlLT0qfC0tcmV1c2UtbT0qfC0tcmV1c2UtbWU9KnxcCisgIC0tcmV1c2UtbWVzPSp8LS1yZXVzZS1tZXNzPSp8LS1yZXVzZS1tZXNzYT0qfC0tcmV1c2UtbWVzc2FnPSp8XAorICAtLXJldXNlLW1lc3NhZ2U9KikKKyAgICAgIGxvZ19naXZlbj10JGxvZ19naXZlbgorICAgICAgdXNlX2NvbW1pdD1gZXhwciAiJDEiIDogJy1bXj1dKj1cKC4qXCknYAorICAgICAgbm9fZWRpdD10CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLS1yZXV8LS1yZXVzfC0tcmV1c2V8LS1yZXVzZS18LS1yZXVzZS1tfC0tcmV1c2UtbWV8LS1yZXVzZS1tZXN8XAorICAtLXJldXNlLW1lc3N8LS1yZXVzZS1tZXNzYXwtLXJldXNlLW1lc3NhZ3wtLXJldXNlLW1lc3NhZ2UpCisgICAgICBjYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworICAgICAgc2hpZnQKKyAgICAgIGxvZ19naXZlbj10JGxvZ19naXZlbgorICAgICAgdXNlX2NvbW1pdD0iJDEiCisgICAgICBub19lZGl0PXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtc3wtLXN8LS1zaXwtLXNpZ3wtLXNpZ258LS1zaWdub3wtLXNpZ25vZnwtLXNpZ25vZmYpCisgICAgICBzaWdub2ZmPXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcmJ8LS12ZXJib3wtLXZlcmJvc3wtLXZlcmJvc2UpCisgICAgICB2ZXJib3NlPXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtdXwtLXV8LS11bnwtLXVudHwtLXVudHJ8LS11bnRyYXwtLXVudHJhY3wtLXVudHJhY2t8LS11bnRyYWNrZXwtLXVudHJhY2tlZHxcCisgIC0tdW50cmFja2VkLXwtLXVudHJhY2tlZC1mfC0tdW50cmFja2VkLWZpfC0tdW50cmFja2VkLWZpbHwtLXVudHJhY2tlZC1maWxlfFwKKyAgLS11bnRyYWNrZWQtZmlsZXMpCisgICAgICB1bnRyYWNrZWRfZmlsZXM9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC0tKQorICAgICAgc2hpZnQKKyAgICAgIGJyZWFrCisgICAgICA7OworICAtKikKKyAgICAgIHVzYWdlCisgICAgICA7OworICAqKQorICAgICAgYnJlYWsKKyAgICAgIDs7CisgIGVzYWMKK2RvbmUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTYW5pdHkgY2hlY2sgb3B0aW9ucworCitjYXNlICIkYW1lbmQsJGluaXRpYWxfY29tbWl0IiBpbgordCx0KQorICBkaWUgIllvdSBkbyBub3QgaGF2ZSBhbnl0aGluZyB0byBhbWVuZC4iIDs7Cit0LCkKKyAgaWYgWyAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgXTsgdGhlbgorICAgIGRpZSAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgLS0gY2Fubm90IGFtZW5kLiIKKyAgZmkgOzsKK2VzYWMKKworY2FzZSAiJGxvZ19naXZlbiIgaW4KK3R0KikKKyAgZGllICJPbmx5IG9uZSBvZiAtYy8tQy8tRiBjYW4gYmUgdXNlZC4iIDs7CisqdG0qfCptdCopCisgIGRpZSAiT3B0aW9uIC1tIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIC1jLy1DLy1GLiIgOzsKK2VzYWMKKworY2FzZSAiJCMsJGFsc28sJG9ubHksJGFtZW5kIiBpbgorKix0LHQsKikKKyAgZGllICJPbmx5IG9uZSBvZiAtLWluY2x1ZGUvLS1vbmx5IGNhbiBiZSB1c2VkLiIgOzsKKzAsdCwsKiB8IDAsLHQsKQorICBkaWUgIk5vIHBhdGhzIHdpdGggLS1pbmNsdWRlLy0tb25seSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIgOzsKKzAsLHQsdCkKKyAgb25seV9pbmNsdWRlX2Fzc3VtZWQ9IiMgQ2xldmVyLi4uIGFtZW5kaW5nIHRoZSBsYXN0IG9uZSB3aXRoIGRpcnR5IGluZGV4LiIgOzsKKzAsLCwqKQorICA7OworKiwsLCopCisgIG9ubHlfaW5jbHVkZV9hc3N1bWVkPSIjIEV4cGxpY2l0IHBhdGhzIHNwZWNpZmllZCB3aXRob3V0IC1pIG5vciAtbzsgYXNzdW1pbmcgLS1vbmx5IHBhdGhzLi4uIgorICBhbHNvPQorICA7OworZXNhYwordW5zZXQgb25seQorY2FzZSAiJGFsbCwkYWxzbywkIyIgaW4KK3QsdCwqKQorCWRpZSAiQ2Fubm90IHVzZSAtYSBhbmQgLWkgYXQgdGhlIHNhbWUgdGltZS4iIDs7Cit0LCxbMS05XSopCisJZGllICJQYXRocyB3aXRoIC1hIGRvZXMgbm90IG1ha2Ugc2Vuc2UuIiA7OworLHQsMCkKKwlkaWUgIk5vIHBhdGhzIHdpdGggLWkgZG9lcyBub3QgbWFrZSBzZW5zZS4iIDs7Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUHJlcGFyZSBpbmRleCB0byBoYXZlIGEgdHJlZSB0byBiZSBjb21taXR0ZWQKKworVE9QPWBnaXQtcmV2LXBhcnNlIC0tc2hvdy1jZHVwYAoraWYgdGVzdCAteiAiJFRPUCIKK3RoZW4KKwlUT1A9Li8KK2ZpCisKK2Nhc2UgIiRhbGwsJGFsc28iIGluCit0LCkKKwlzYXZlX2luZGV4ICYmCisJKAorCQljZCAiJFRPUCIKKwkJR0lUX0lOREVYX0ZJTEU9IiRORVhUX0lOREVYIgorCQlleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwkJZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHkgLXogfAorCQlnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC16IC0tc3RkaW4KKwkpCisJOzsKKyx0KQorCXNhdmVfaW5kZXggJiYKKwlnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIC0tICIkQCIgPi9kZXYvbnVsbCB8fCBleGl0CisKKwlnaXQtZGlmZi1maWxlcyAtLW5hbWUtb25seSAteiAtLSAiJEAiICB8CisJKAorCQljZCAiJFRPUCIKKwkJR0lUX0lOREVYX0ZJTEU9IiRORVhUX0lOREVYIgorCQlleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwkJZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluCisJKQorCTs7CissKQorCWNhc2UgIiQjIiBpbgorCTApCisJICAgIDs7ICMgY29tbWl0IGFzLWlzCisJKikKKwkgICAgaWYgdGVzdCAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIKKwkgICAgdGhlbgorCQlyZWZ1c2VfcGFydGlhbCAiQ2Fubm90IGRvIGEgcGFydGlhbCBjb21taXQgZHVyaW5nIGEgbWVyZ2UuIgorCSAgICBmaQorCSAgICBUTVBfSU5ERVg9IiRHSVRfRElSL3RtcC1pbmRleCQkIgorCSAgICBpZiB0ZXN0IC16ICIkaW5pdGlhbF9jb21taXQiCisJICAgIHRoZW4KKwkJIyBtYWtlIHN1cmUgaW5kZXggaXMgY2xlYW4gYXQgdGhlIHNwZWNpZmllZCBwYXRocywgb3IKKwkJIyB0aGV5IGFyZSBhZGRpdGlvbnMuCisJCWRpcnR5X2luX2luZGV4PWBnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAtLW5hbWUtc3RhdHVzIFwKKwkJCS0tZGlmZi1maWx0ZXI9RE1UVSBIRUFEIC0tICIkQCJgCisJCXRlc3QgLXogIiRkaXJ0eV9pbl9pbmRleCIgfHwKKwkJcmVmdXNlX3BhcnRpYWwgIkRpZmZlcmVudCBpbiBpbmRleCBhbmQgdGhlIGxhc3QgY29tbWl0OgorJGRpcnR5X2luX2luZGV4IgorCSAgICBmaQorCSAgICBjb21taXRfb25seT1gZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAiJEAiYCB8fCBleGl0CisKKwkgICAgIyBCdWlsZCB0aGUgdGVtcG9yYXJ5IGluZGV4IGFuZCB1cGRhdGUgdGhlIHJlYWwgaW5kZXgKKwkgICAgIyB0aGUgc2FtZSB3YXkuCisJICAgIGlmIHRlc3QgLXogIiRpbml0aWFsX2NvbW1pdCIKKwkgICAgdGhlbgorCQljcCAiJFRISVNfSU5ERVgiICIkVE1QX0lOREVYIgorCQlHSVRfSU5ERVhfRklMRT0iJFRNUF9JTkRFWCIgZ2l0LXJlYWQtdHJlZSAtbSBIRUFECisJICAgIGVsc2UKKwkJICAgIHJtIC1mICIkVE1QX0lOREVYIgorCSAgICBmaSB8fCBleGl0CisKKwkgICAgZWNobyAiJGNvbW1pdF9vbmx5IiB8CisJICAgIEdJVF9JTkRFWF9GSUxFPSIkVE1QX0lOREVYIiBcCisJICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLS1zdGRpbiAmJgorCisJICAgIHNhdmVfaW5kZXggJiYKKwkgICAgZWNobyAiJGNvbW1pdF9vbmx5IiB8CisJICAgICgKKwkJR0lUX0lOREVYX0ZJTEU9IiRORVhUX0lOREVYIgorCQlleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwkJZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLXN0ZGluCisJICAgICkgfHwgZXhpdAorCSAgICA7OworCWVzYWMKKwk7OworZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIElmIHdlIGRvIGFzLWlzIGNvbW1pdCwgdGhlIGluZGV4IGZpbGUgd2lsbCBiZSBUSElTX0lOREVYLAorIyBvdGhlcndpc2UgTkVYVF9JTkRFWCBhZnRlciB3ZSBtYWtlIHRoaXMgY29tbWl0LiAgV2UgbGVhdmUKKyMgdGhlIGluZGV4IGFzIGlzIGlmIHdlIGFib3J0LgorCitpZiB0ZXN0IC1mICIkTkVYVF9JTkRFWCIKK3RoZW4KKwlVU0VfSU5ERVg9IiRORVhUX0lOREVYIgorZWxzZQorCVVTRV9JTkRFWD0iJFRISVNfSU5ERVgiCitmaQorCitHSVRfSU5ERVhfRklMRT0iJFVTRV9JTkRFWCIgXAorICAgIGdpdC11cGRhdGUtaW5kZXggLXEgJHVubWVyZ2VkX29rX2lmX3N0YXR1cyAtLXJlZnJlc2ggfHwgZXhpdAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIElmIHRoZSByZXF1ZXN0IGlzIHN0YXR1cywganVzdCBzaG93IGl0IGFuZCBleGl0LgorCitjYXNlICIkMCIgaW4KKypzdGF0dXMpCisJcnVuX3N0YXR1cworCWV4aXQgJD8KK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHcmFiIGNvbW1pdCBtZXNzYWdlLCB3cml0ZSBvdXQgdHJlZSBhbmQgbWFrZSBjb21taXQuCisKK2lmIHRlc3QgdCA9ICIkdmVyaWZ5IiAmJiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcHJlLWNvbW1pdAordGhlbgorCWlmIHRlc3QgIiRUTVBfSU5ERVgiCisJdGhlbgorCQlHSVRfSU5ERVhfRklMRT0iJFRNUF9JTkRFWCIgIiRHSVRfRElSIi9ob29rcy9wcmUtY29tbWl0CisJZWxzZQorCQlHSVRfSU5ERVhfRklMRT0iJFVTRV9JTkRFWCIgIiRHSVRfRElSIi9ob29rcy9wcmUtY29tbWl0CisJZmkgfHwgZXhpdAorZmkKKworaWYgdGVzdCAiJGxvZ19tZXNzYWdlIiAhPSAnJwordGhlbgorCWVjaG8gIiRsb2dfbWVzc2FnZSIKK2VsaWYgdGVzdCAiJGxvZ2ZpbGUiICE9ICIiCit0aGVuCisJaWYgdGVzdCAiJGxvZ2ZpbGUiID0gLQorCXRoZW4KKwkJdGVzdCAtdCAwICYmCisJCWVjaG8gPiYyICIocmVhZGluZyBsb2cgbWVzc2FnZSBmcm9tIHN0YW5kYXJkIGlucHV0KSIKKwkJY2F0CisJZWxzZQorCQljYXQgPCIkbG9nZmlsZSIKKwlmaQorZWxpZiB0ZXN0ICIkdXNlX2NvbW1pdCIgIT0gIiIKK3RoZW4KKwlnaXQtY2F0LWZpbGUgY29tbWl0ICIkdXNlX2NvbW1pdCIgfCBzZWQgLWUgJzEsL14kL2QnCitlbGlmIHRlc3QgLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiICYmIHRlc3QgLWYgIiRHSVRfRElSL01FUkdFX01TRyIKK3RoZW4KKwljYXQgIiRHSVRfRElSL01FUkdFX01TRyIKK2ZpIHwgZ2l0LXN0cmlwc3BhY2UgPiIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKKworY2FzZSAiJHNpZ25vZmYiIGluCit0KQorCXsKKwkJZWNobworCQlnaXQtdmFyIEdJVF9DT01NSVRURVJfSURFTlQgfCBzZWQgLWUgJworCQkJcy8+LiovPi8KKwkJCXMvXi9TaWduZWQtb2ZmLWJ5OiAvCisJCScKKwl9ID4+IiRHSVRfRElSIi9DT01NSVRfRURJVE1TRworCTs7Citlc2FjCisKK2lmIHRlc3QgLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiICYmIHRlc3QgLXogIiRub19lZGl0IjsgdGhlbgorCWVjaG8gIiMiCisJZWNobyAiIyBJdCBsb29rcyBsaWtlIHlvdSBtYXkgYmUgY29tbWl0dGluZyBhIE1FUkdFLiIKKwllY2hvICIjIElmIHRoaXMgaXMgbm90IGNvcnJlY3QsIHBsZWFzZSByZW1vdmUgdGhlIGZpbGUiCisJZWNobyAiIwkkR0lUX0RJUi9NRVJHRV9IRUFEIgorCWVjaG8gIiMgYW5kIHRyeSBhZ2FpbiIKKwllY2hvICIjIgorZmkgPj4iJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHCisKKyMgQXV0aG9yCitpZiB0ZXN0ICcnICE9ICIkZm9yY2VfYXV0aG9yIgordGhlbgorCUdJVF9BVVRIT1JfTkFNRT1gZXhwciAieiRmb3JjZV9hdXRob3IiIDogJ3pcKC4qW14gXVwpICo8LionYCAmJgorCUdJVF9BVVRIT1JfRU1BSUw9YGV4cHIgInokZm9yY2VfYXV0aG9yIiA6ICcuKlwoPC4qXCknYCAmJgorCXRlc3QgJycgIT0gIiRHSVRfQVVUSE9SX05BTUUiICYmCisJdGVzdCAnJyAhPSAiJEdJVF9BVVRIT1JfRU1BSUwiIHx8CisJZGllICJtYWxmb3JtYXR0ZWQgLS1hdXRob3IgcGFyYW1ldGVyIgorCWV4cG9ydCBHSVRfQVVUSE9SX05BTUUgR0lUX0FVVEhPUl9FTUFJTAorZWxpZiB0ZXN0ICcnICE9ICIkdXNlX2NvbW1pdCIKK3RoZW4KKwlwaWNrX2F1dGhvcl9zY3JpcHQ9JworCS9eYXV0aG9yIC97CisJCXMvJ1wnJy8nXCcnXFwnXCdcJycvZworCQloCisJCXMvXmF1dGhvciBcKFtePF0qXCkgPFtePl0qPiAuKiQvXDEvCisJCXMvJ1wnJy8nXCcnXCdcJ1wnJy9nCisJCXMvLiovR0lUX0FVVEhPUl9OQU1FPSdcJycmJ1wnJy9wCisKKwkJZworCQlzL15hdXRob3IgW148XSogPFwoW14+XSpcKT4gLiokL1wxLworCQlzLydcJycvJ1wnJ1wnXCdcJycvZworCQlzLy4qL0dJVF9BVVRIT1JfRU1BSUw9J1wnJyYnXCcnL3AKKworCQlnCisJCXMvXmF1dGhvciBbXjxdKiA8W14+XSo+IFwoLipcKSQvXDEvCisJCXMvJ1wnJy8nXCcnXCdcJ1wnJy9nCisJCXMvLiovR0lUX0FVVEhPUl9EQVRFPSdcJycmJ1wnJy9wCisKKwkJcQorCX0KKwknCisJc2V0X2F1dGhvcl9lbnY9YGdpdC1jYXQtZmlsZSBjb21taXQgIiR1c2VfY29tbWl0IiB8CisJTEFORz1DIExDX0FMTD1DIHNlZCAtbmUgIiRwaWNrX2F1dGhvcl9zY3JpcHQiYAorCWV2YWwgIiRzZXRfYXV0aG9yX2VudiIKKwlleHBvcnQgR0lUX0FVVEhPUl9OQU1FCisJZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFCitmaQorCitQQVJFTlRTPSItcCBIRUFEIgoraWYgdGVzdCAteiAiJGluaXRpYWxfY29tbWl0IgordGhlbgorCWlmIFsgLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiIF07IHRoZW4KKwkJUEFSRU5UUz0iLXAgSEVBRCAiYHNlZCAtZSAncy9eLy1wIC8nICIkR0lUX0RJUi9NRVJHRV9IRUFEImAKKwllbGlmIHRlc3QgLW4gIiRhbWVuZCI7IHRoZW4KKwkJUEFSRU5UUz0kKGdpdC1jYXQtZmlsZSBjb21taXQgSEVBRCB8CisJCQlzZWQgLW4gLWUgJy9eJC9xJyAtZSAncy9ecGFyZW50IC8tcCAvcCcpCisJZmkKKwljdXJyZW50PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQorZWxzZQorCWlmIFsgLXogIiQoZ2l0LWxzLWZpbGVzKSIgXTsgdGhlbgorCQllY2hvID4mMiBOb3RoaW5nIHRvIGNvbW1pdAorCQlleGl0IDEKKwlmaQorCVBBUkVOVFM9IiIKKwljdXJyZW50PQorZmkKKworaWYgdGVzdCAteiAiJG5vX2VkaXQiCit0aGVuCisJeworCQllY2hvICIiCisJCWVjaG8gIiMgUGxlYXNlIGVudGVyIHRoZSBjb21taXQgbWVzc2FnZSBmb3IgeW91ciBjaGFuZ2VzLiIKKwkJZWNobyAiIyAoQ29tbWVudCBsaW5lcyBzdGFydGluZyB3aXRoICcjJyB3aWxsIG5vdCBiZSBpbmNsdWRlZCkiCisJCXRlc3QgLXogIiRvbmx5X2luY2x1ZGVfYXNzdW1lZCIgfHwgZWNobyAiJG9ubHlfaW5jbHVkZV9hc3N1bWVkIgorCQlydW5fc3RhdHVzCisJfSA+PiIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKK2Vsc2UKKwkjIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29tbWl0CisJcnVuX3N0YXR1cyA+L2Rldi9udWxsIAorZmkKK2lmIFsgIiQ/IiAhPSAiMCIgLWEgISAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgLWEgLXogIiRhbWVuZCIgXQordGhlbgorCXJtIC1mICIkR0lUX0RJUi9DT01NSVRfRURJVE1TRyIKKwlydW5fc3RhdHVzCisJZXhpdCAxCitmaQorCitjYXNlICIkbm9fZWRpdCIgaW4KKycnKQorCWNhc2UgIiR7VklTVUFMOi0kRURJVE9SfSwkVEVSTSIgaW4KKwksZHVtYikKKwkJZWNobyA+JjIgIlRlcm1pbmFsIGlzIGR1bWIgYnV0IG5vIFZJU1VBTCBub3IgRURJVE9SIGRlZmluZWQuIgorCQllY2hvID4mMiAiUGxlYXNlIHN1cHBseSB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIHVzaW5nIGVpdGhlciIKKwkJZWNobyA+JjIgIi1tIG9yIC1GIG9wdGlvbi4gIEEgYm9pbGVycGxhdGUgbG9nIG1lc3NhZ2UgaGFzIgorCQllY2hvID4mMiAiYmVlbiBwcmVwYXJlZCBpbiAkR0lUX0RJUi9DT01NSVRfRURJVE1TRyIKKwkJZXhpdCAxCisJCTs7CisJZXNhYworCWdpdC12YXIgR0lUX0FVVEhPUl9JREVOVCA+IC9kZXYvbnVsbCAgfHwgZGllCisJZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4gL2Rldi9udWxsICB8fCBkaWUKKwkke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gIiRHSVRfRElSL0NPTU1JVF9FRElUTVNHIgorCTs7Citlc2FjCisKK2Nhc2UgIiR2ZXJpZnkiIGluCit0KQorCWlmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9jb21taXQtbXNnCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL2NvbW1pdC1tc2cgIiRHSVRfRElSIi9DT01NSVRfRURJVE1TRyB8fCBleGl0CisJZmkKK2VzYWMKKworc2VkIC1lICcKKyAgICAvXmRpZmYgLS1naXQgYVwvLioveworCXMvLy8KKwlxCisgICAgfQorICAgIC9eIy9kCisnICIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cgfAorZ2l0LXN0cmlwc3BhY2UgPiIkR0lUX0RJUiIvQ09NTUlUX01TRworCitpZiBjbnQ9YGdyZXAgLXYgLWkgJ15TaWduZWQtb2ZmLWJ5JyAiJEdJVF9ESVIiL0NPTU1JVF9NU0cgfAorCWdpdC1zdHJpcHNwYWNlIHwKKwl3YyAtbGAgJiYKKyAgIHRlc3QgMCAtbHQgJGNudAordGhlbgorCWlmIHRlc3QgLXogIiRUTVBfSU5ERVgiCisJdGhlbgorCQl0cmVlPSQoR0lUX0lOREVYX0ZJTEU9IiRVU0VfSU5ERVgiIGdpdC13cml0ZS10cmVlKQorCWVsc2UKKwkJdHJlZT0kKEdJVF9JTkRFWF9GSUxFPSIkVE1QX0lOREVYIiBnaXQtd3JpdGUtdHJlZSkgJiYKKwkJcm0gLWYgIiRUTVBfSU5ERVgiCisJZmkgJiYKKwljb21taXQ9JChjYXQgIiRHSVRfRElSIi9DT01NSVRfTVNHIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlICRQQVJFTlRTKSAmJgorCXJsb2dtPSQoc2VkIC1lIDFxICIkR0lUX0RJUiIvQ09NTUlUX01TRykgJiYKKwlnaXQtdXBkYXRlLXJlZiAtbSAiY29tbWl0OiAkcmxvZ20iIEhFQUQgJGNvbW1pdCAkY3VycmVudCAmJgorCXJtIC1mIC0tICIkR0lUX0RJUi9NRVJHRV9IRUFEIiAmJgorCWlmIHRlc3QgLWYgIiRORVhUX0lOREVYIgorCXRoZW4KKwkJbXYgIiRORVhUX0lOREVYIiAiJFRISVNfSU5ERVgiCisJZWxzZQorCQk6IDsjIGhhcHB5CisJZmkKK2Vsc2UKKwllY2hvID4mMiAiKiBubyBjb21taXQgbWVzc2FnZT8gIGFib3J0aW5nIGNvbW1pdC4iCisJZmFsc2UKK2ZpCityZXQ9IiQ/Igorcm0gLWYgIiRHSVRfRElSL0NPTU1JVF9NU0ciICIkR0lUX0RJUi9DT01NSVRfRURJVE1TRyIKK2lmIHRlc3QgLWQgIiRHSVRfRElSL3JyLWNhY2hlIgordGhlbgorCWdpdC1yZXJlcmUKK2ZpCisKK2lmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9wb3N0LWNvbW1pdCAmJiB0ZXN0ICIkcmV0IiA9IDAKK3RoZW4KKwkiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtY29tbWl0CitmaQorZXhpdCAiJHJldCIKZGlmZiAtLWdpdCBhL2dpdC1jb21wYXQtdXRpbC5oIGIvZ2l0LWNvbXBhdC11dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NDNkMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jb21wYXQtdXRpbC5oCkBAIC0wLDAgKzEsMTU5IEBACisjaWZuZGVmIEdJVF9DT01QQVRfVVRJTF9ICisjZGVmaW5lIEdJVF9DT01QQVRfVVRJTF9ICisKKyNpZm5kZWYgRkxFWF9BUlJBWQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDMpCisjZGVmaW5lIEZMRVhfQVJSQVkgMAorI2Vsc2UKKyNkZWZpbmUgRkxFWF9BUlJBWSAvKiBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2Vsc2UKKyNkZWZpbmUgTk9SRVRVUk4KKyNpZm5kZWYgX19hdHRyaWJ1dGVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjZW5kaWYKKyNlbmRpZgorCisvKiBHZW5lcmFsIGhlbHBlciBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKmVycikgTk9SRVRVUk47CitleHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqZXJyLCAuLi4pIE5PUkVUVVJOIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGludCBlcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKKyNpZmRlZiBOT19NTUFQCisKKyNpZm5kZWYgUFJPVF9SRUFECisjZGVmaW5lIFBST1RfUkVBRCAxCisjZGVmaW5lIFBST1RfV1JJVEUgMgorI2RlZmluZSBNQVBfUFJJVkFURSAxCisjZGVmaW5lIE1BUF9GQUlMRUQgKCh2b2lkKiktMSkKKyNlbmRpZgorCisjZGVmaW5lIG1tYXAgZ2l0ZmFrZW1tYXAKKyNkZWZpbmUgbXVubWFwIGdpdGZha2VtdW5tYXAKK2V4dGVybiB2b2lkICpnaXRmYWtlbW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QgLCBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KTsKK2V4dGVybiBpbnQgZ2l0ZmFrZW11bm1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCk7CisKKyNlbHNlIC8qIE5PX01NQVAgKi8KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNlbmRpZiAvKiBOT19NTUFQICovCisKKyNpZmRlZiBOT19TRVRFTlYKKyNkZWZpbmUgc2V0ZW52IGdpdHNldGVudgorZXh0ZXJuIGludCBnaXRzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYKKworI2lmZGVmIE5PX1VOU0VURU5WCisjZGVmaW5lIHVuc2V0ZW52IGdpdHVuc2V0ZW52CitleHRlcm4gdm9pZCBnaXR1bnNldGVudihjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZmRlZiBOT19TVFJDQVNFU1RSCisjZGVmaW5lIHN0cmNhc2VzdHIgZ2l0c3RyY2FzZXN0cgorZXh0ZXJuIGNoYXIgKmdpdHN0cmNhc2VzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSk7CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkICp4bWFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IG1hbGxvYyhzaXplKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gbWFsbG9jKDEpOworCWlmICghcmV0KQorCQlkaWUoIk91dCBvZiBtZW1vcnksIG1hbGxvYyBmYWlsZWQiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnhyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcmV0ID0gcmVhbGxvYyhwdHIsIHNpemUpOworCWlmICghcmV0ICYmICFzaXplKQorCQlyZXQgPSByZWFsbG9jKHB0ciwgMSk7CisJaWYgKCFyZXQpCisJCWRpZSgiT3V0IG9mIG1lbW9yeSwgcmVhbGxvYyBmYWlsZWQiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnhjYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpyZXQgPSBjYWxsb2Mobm1lbWIsIHNpemUpOworCWlmICghcmV0ICYmICghbm1lbWIgfHwgIXNpemUpKQorCQlyZXQgPSBjYWxsb2MoMSwgMSk7CisJaWYgKCFyZXQpCisJCWRpZSgiT3V0IG9mIG1lbW9yeSwgY2FsbG9jIGZhaWxlZCIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IG5yOworCXdoaWxlICgxKSB7CisJCW5yID0gcmVhZChmZCwgYnVmLCBsZW4pOworCQlpZiAoKG5yIDwgMCkgJiYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG5yOworCX0KK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IHh3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IG5yOworCXdoaWxlICgxKSB7CisJCW5yID0gd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKwkJaWYgKChuciA8IDApICYmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpKQorCQkJY29udGludWU7CisJCXJldHVybiBucjsKKwl9Cit9CisKKy8qIFNhbmUgY3R5cGUgLSBubyBsb2NhbGUsIGFuZCB3b3JrcyB3aXRoIHNpZ25lZCBjaGFycyAqLworI3VuZGVmIGlzc3BhY2UKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNhbHBoYQorI3VuZGVmIGlzYWxudW0KKyN1bmRlZiB0b2xvd2VyCisjdW5kZWYgdG91cHBlcgorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2FuZV9jdHlwZVsyNTZdOworI2RlZmluZSBHSVRfU1BBQ0UgMHgwMQorI2RlZmluZSBHSVRfRElHSVQgMHgwMgorI2RlZmluZSBHSVRfQUxQSEEgMHgwNAorI2RlZmluZSBzYW5lX2lzdGVzdCh4LG1hc2spICgoc2FuZV9jdHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgKG1hc2spKSAhPSAwKQorI2RlZmluZSBpc3NwYWNlKHgpIHNhbmVfaXN0ZXN0KHgsR0lUX1NQQUNFKQorI2RlZmluZSBpc2RpZ2l0KHgpIHNhbmVfaXN0ZXN0KHgsR0lUX0RJR0lUKQorI2RlZmluZSBpc2FscGhhKHgpIHNhbmVfaXN0ZXN0KHgsR0lUX0FMUEhBKQorI2RlZmluZSBpc2FsbnVtKHgpIHNhbmVfaXN0ZXN0KHgsR0lUX0FMUEhBIHwgR0lUX0RJR0lUKQorI2RlZmluZSB0b2xvd2VyKHgpIHNhbmVfY2FzZSgodW5zaWduZWQgY2hhcikoeCksIDB4MjApCisjZGVmaW5lIHRvdXBwZXIoeCkgc2FuZV9jYXNlKCh1bnNpZ25lZCBjaGFyKSh4KSwgMCkKKworc3RhdGljIGlubGluZSBpbnQgc2FuZV9jYXNlKGludCB4LCBpbnQgaGlnaCkKK3sKKwlpZiAoc2FuZV9pc3Rlc3QoeCwgR0lUX0FMUEhBKSkKKwkJeCA9ICh4ICYgfjB4MjApIHwgaGlnaDsKKwlyZXR1cm4geDsKK30KKworI2lmbmRlZiBNQVhQQVRITEVOCisjZGVmaW5lIE1BWFBBVEhMRU4gMjU2CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsIGIvZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3MDg4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY3ZzZXhwb3J0Y29tbWl0LnBlcmwKQEAgLTAsMCArMSwyODggQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIEtub3duIGxpbWl0YXRpb25zOgorIyAtIGNhbm5vdCBhZGQgb3IgcmVtb3ZlIGJpbmFyeSBmaWxlcworIyAtIGRvZXMgbm90IHByb3BhZ2F0ZSBwZXJtaXNzaW9ucworIyAtIHRlbGxzICJyZWFkeSBmb3IgY29tbWl0IiBldmVuIHdoZW4gdGhpbmdzIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQKKyMgICAoZWcgYWRkaXRpb24gb2YgYSBiaW5hcnkgZmlsZSkKKwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBkaXIpOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKKwordW5sZXNzICgkRU5We0dJVF9ESVJ9ICYmIC1yICRFTlZ7R0lUX0RJUn0peworICAgIGRpZSAiR0lUX0RJUiBpcyBub3QgZGVmaW5lZCBvciBpcyB1bnJlYWRhYmxlIjsKK30KKworb3VyICgkb3B0X2gsICRvcHRfcCwgJG9wdF92LCAkb3B0X2MsICRvcHRfZiwgJG9wdF9tICk7CisKK2dldG9wdHMoJ2hwdmNmbTonKTsKKworJG9wdF9oICYmIHVzYWdlKCk7CisKK2RpZSAiTmVlZCBhdCBsZWFzdCBvbmUgY29tbWl0IGlkZW50aWZpZXIhIiB1bmxlc3MgQEFSR1Y7CisKKyMgc2V0dXAgYSB0ZW1wZGlyCitvdXIgKCR0bXBkaXIsICR0bXBkaXJuYW1lKSA9IHRlbXBkaXIoJ2dpdC1jdnNhcHBseWNvbW1pdC1YWFhYWFgnLAorCQkJCSAgICAgVE1QRElSID0+IDEsCisJCQkJICAgICBDTEVBTlVQID0+IDEpOworCitwcmludCBEdW1wZXIoQEFSR1YpOworIyByZXNvbHZlIHRhcmdldCBjb21taXQKK215ICRjb21taXQ7CiskY29tbWl0ID0gcG9wIEBBUkdWOworJGNvbW1pdCA9IHNhZmVfcGlwZV9jYXB0dXJlKCdnaXQtcmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgIiRjb21taXReMCIpOworY2hvbXAgJGNvbW1pdDsKK2lmICgkPykgeworICAgIGRpZSAiVGhlIGNvbW1pdCByZWZlcmVuY2UgJGNvbW1pdCBkaWQgbm90IHJlc29sdmUhIjsKK30KKworIyByZXNvbHZlIHdoYXQgcGFyZW50IHdlIHdhbnQKK215ICRwYXJlbnQ7CitpZiAoQEFSR1YpIHsKKyAgICAkcGFyZW50ID0gcG9wIEBBUkdWOworICAgICRwYXJlbnQgPSAgc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1yZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAiJHBhcmVudF4wIik7CisgICAgY2hvbXAgJHBhcmVudDsKKyAgICBpZiAoJD8pIHsKKwlkaWUgIlRoZSBwYXJlbnQgcmVmZXJlbmNlIGRpZCBub3QgcmVzb2x2ZSEiOworICAgIH0KK30KKworIyBmaW5kIHBhcmVudHMgZnJvbSB0aGUgY29tbWl0IGl0c2VsZgorbXkgQGNvbW1pdCAgPSBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LWNhdC1maWxlJywgJ2NvbW1pdCcsICRjb21taXQpOworbXkgQHBhcmVudHM7Citmb3JlYWNoIG15ICRwIChAY29tbWl0KSB7CisgICAgaWYgKCRwID1+IG0vXiQvKSB7ICMgZW5kIG9mIGNvbW1pdCBoZWFkZXJzLCB3ZSdyZSBkb25lCisJbGFzdDsKKyAgICB9CisgICAgaWYgKCRwID1+IG0vXnBhcmVudCAoXHd7NDB9KSQvKSB7ICMgZm91bmQgYSBwYXJlbnQKKwlwdXNoIEBwYXJlbnRzLCAkMTsKKyAgICB9Cit9CisKK2lmICgkcGFyZW50KSB7CisgICAgIyBkb3VibGUgY2hlY2sgdGhhdCBpdCdzIGEgdmFsaWQgcGFyZW50CisgICAgZm9yZWFjaCBteSAkcCAoQHBhcmVudHMpIHsKKwlteSAkZm91bmQ7CisJaWYgKCRwIGVxICRwYXJlbnQpIHsKKwkgICAgJGZvdW5kID0gMTsKKwkgICAgbGFzdDsKKwl9OyAjIGZvdW5kIGl0CisJZGllICJEaWQgbm90IGZpbmQgJHBhcmVudCBpbiB0aGUgcGFyZW50cyBmb3IgdGhpcyBjb21taXQhIjsKKyAgICB9Cit9IGVsc2UgeyAjIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgZnJvbSB0aGUgY21kbGluZS4uLgorICAgIGlmIChAcGFyZW50cyA9PSAxKSB7ICMgaXQncyBzYWZlIHRvIGdldCBpdCBmcm9tIHRoZSBjb21taXQKKwkkcGFyZW50ID0gJHBhcmVudHNbMF07CisgICAgfSBlbHNlIHsgIyBvciBwZXJoYXBzIG5vdCEKKwlkaWUgIlRoaXMgY29tbWl0IGhhcyBtb3JlIHRoYW4gb25lIHBhcmVudCAtLSBwbGVhc2UgbmFtZSB0aGUgcGFyZW50IHlvdSB3YW50IHRvIHVzZSBleHBsaWNpdGx5IjsKKyAgICB9Cit9CisKKyRvcHRfdiAmJiBwcmludCAiQXBwbHlpbmcgdG8gQ1ZTIGNvbW1pdCAkY29tbWl0IGZyb20gcGFyZW50ICRwYXJlbnRcbiI7CisKKyMgZ3JhYiB0aGUgY29tbWl0IG1lc3NhZ2UKK29wZW4oTVNHLCAiPi5tc2ciKSBvciBkaWUgIkNhbm5vdCBvcGVuIC5tc2cgZm9yIHdyaXRpbmciOworcHJpbnQgTVNHICRvcHRfbTsKK2Nsb3NlIE1TRzsKKworYGdpdC1jYXQtZmlsZSBjb21taXQgJGNvbW1pdCB8IHNlZCAtZSAnMSwvXlwkL2QnID4+IC5tc2dgOworJD8gJiYgZGllICJFcnJvciBleHRyYWN0aW5nIHRoZSBjb21taXQgbWVzc2FnZSI7CisKK215IChAYWZpbGVzLCBAZGZpbGVzLCBAbWZpbGVzLCBAZGlycyk7CitteSBAZmlsZXMgPSBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LWRpZmYtdHJlZScsICctcicsICRwYXJlbnQsICRjb21taXQpOworI3ByaW50IEBmaWxlczsKKyQ/ICYmIGRpZSAiRXJyb3IgaW4gZ2l0LWRpZmYtdHJlZSI7Citmb3JlYWNoIG15ICRmIChAZmlsZXMpIHsKKyAgICBjaG9tcCAkZjsKKyAgICBteSBAZmllbGRzID0gc3BsaXQobSFccyshLCAkZik7CisgICAgaWYgKCRmaWVsZHNbNF0gZXEgJ0EnKSB7CisgICAgICAgIG15ICRwYXRoID0gJGZpZWxkc1s1XTsKKwlwdXNoIEBhZmlsZXMsICRwYXRoOworICAgICAgICAjIGFkZCBhbnkgbmVlZGVkIHBhcmVudCBkaXJlY3RvcmllcworCSRwYXRoID0gZGlybmFtZSAkcGF0aDsKKwl3aGlsZSAoIS1kICRwYXRoIGFuZCAhIGdyZXAgeyAkXyBlcSAkcGF0aCB9IEBkaXJzKSB7CisJICAgIHVuc2hpZnQgQGRpcnMsICRwYXRoOworCSAgICAkcGF0aCA9IGRpcm5hbWUgJHBhdGg7CisJfQorICAgIH0KKyAgICBpZiAoJGZpZWxkc1s0XSBlcSAnTScpIHsKKwlwdXNoIEBtZmlsZXMsICRmaWVsZHNbNV07CisgICAgfQorICAgIGlmICgkZmllbGRzWzRdIGVxICdSJykgeworCXB1c2ggQGRmaWxlcywgJGZpZWxkc1s1XTsKKyAgICB9Cit9Ciskb3B0X3YgJiYgcHJpbnQgIlRoZSBjb21taXQgYWZmZWN0czpcbiAiOworJG9wdF92ICYmIHByaW50IGpvaW4gKCJcbiAiLCBAYWZpbGVzLEBtZmlsZXMsQGRmaWxlcykgLiAiXG5cbiI7Cit1bmRlZiBAZmlsZXM7ICMgZG9uJ3QgbmVlZCBpdCBhbnltb3JlCisKKyMgY2hlY2sgdGhhdCB0aGUgZmlsZXMgYXJlIGNsZWFuIGFuZCB1cCB0byBkYXRlIGFjY29yZGluZyB0byBjdnMKK215ICRkaXJ0eTsKK2ZvcmVhY2ggbXkgJGQgKEBkaXJzKSB7CisgICAgaWYgKC1lICRkKSB7CisJJGRpcnR5ID0gMTsKKwl3YXJuICIkZCBleGlzdHMgYW5kIGlzIG5vdCBhIGRpcmVjdG9yeSFcbiI7CisgICAgfQorfQorZm9yZWFjaCBteSAkZiAoQGFmaWxlcykgeworICAgICMgVGhpcyBzaG91bGQgcmV0dXJuIG9ubHkgb25lIHZhbHVlCisgICAgbXkgQHN0YXR1cyA9IGdyZXAobS9eRmlsZS8sICBzYWZlX3BpcGVfY2FwdHVyZSgnY3ZzJywgJy1xJywgJ3N0YXR1cycgLCRmKSk7CisgICAgaWYgKEBzdGF0dXMgPiAxKSB7IHdhcm4gJ1N0cmFuZ2UhIGN2cyBzdGF0dXMgcmV0dXJuZWQgbW9yZSB0aGFuIG9uZSBsaW5lPyd9OworICAgIGlmICgtZCBkaXJuYW1lICRmIGFuZCAkc3RhdHVzWzBdICF+IG0vU3RhdHVzOiBVbmtub3duJC8KKwlhbmQgJHN0YXR1c1swXSAhfiBtL15GaWxlOiBubyBmaWxlIC8pIHsKKyAJJGRpcnR5ID0gMTsKKwl3YXJuICJGaWxlICRmIGlzIGFscmVhZHkga25vd24gaW4geW91ciBDVlMgY2hlY2tvdXQgLS0gcGVyaGFwcyBpdCBoYXMgYmVlbiBhZGRlZCBieSBhbm90aGVyIHVzZXIuIE9yIHRoaXMgbWF5IGluZGljYXRlIHRoYXQgaXQgZXhpc3RzIG9uIGEgZGlmZmVyZW50IGJyYW5jaC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIC1mIHRvIGZvcmNlIHRoZSBtZXJnZS5cbiI7CisJd2FybiAiU3RhdHVzIHdhczogJHN0YXR1c1xuIjsKKyAgICB9Cit9Citmb3JlYWNoIG15ICRmIChAbWZpbGVzLCBAZGZpbGVzKSB7CisgICAgIyBUT0RPOndlIG5lZWQgdG8gaGFuZGxlIHJlbW92ZWQgaW4gY3ZzCisgICAgbXkgQHN0YXR1cyA9IGdyZXAobS9eRmlsZS8sICBzYWZlX3BpcGVfY2FwdHVyZSgnY3ZzJywgJy1xJywgJ3N0YXR1cycgLCRmKSk7CisgICAgaWYgKEBzdGF0dXMgPiAxKSB7IHdhcm4gJ1N0cmFuZ2UhIGN2cyBzdGF0dXMgcmV0dXJuZWQgbW9yZSB0aGFuIG9uZSBsaW5lPyd9OworICAgIHVubGVzcyAoJHN0YXR1c1swXSA9fiBtL1N0YXR1czogVXAtdG8tZGF0ZSQvKSB7CisJJGRpcnR5ID0gMTsKKwl3YXJuICJGaWxlICRmIG5vdCB1cCB0byBkYXRlIGluIHlvdXIgQ1ZTIGNoZWNrb3V0IVxuIjsKKyAgICB9Cit9CitpZiAoJGRpcnR5KSB7CisgICAgaWYgKCRvcHRfZikgewl3YXJuICJUaGUgdHJlZSBpcyBub3QgY2xlYW4gLS0gZm9yY2VkIG1lcmdlXG4iOworCSRkaXJ0eSA9IDA7CisgICAgfSBlbHNlIHsKKwlkaWUgIkV4aXRpbmc6IHlvdXIgQ1ZTIHRyZWUgaXMgbm90IGNsZWFuIGZvciB0aGlzIG1lcmdlLiI7CisgICAgfQorfQorCisjIyMKKyMjIyBOT1RFOiBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIGRpZSgpIHBhc3QgdGhpcyBwb2ludAorIyMjICAgICAgIHlvdSBNVVNUIGNhbGwgY2xlYW51cGN2cyhAZmlsZXMpIGJlZm9yZSBkaWUoKQorIyMjCisKKworcHJpbnQgIkNyZWF0aW5nIG5ldyBkaXJlY3Rvcmllc1xuIjsKK2ZvcmVhY2ggbXkgJGQgKEBkaXJzKSB7CisgICAgdW5sZXNzIChta2RpciAkZCkgeworICAgICAgICB3YXJuICJDb3VsZCBub3QgbWtkaXIgJGQ6ICQhIjsKKwkkZGlydHkgPSAxOworICAgIH0KKyAgICBgY3ZzIGFkZCAkZGA7CisgICAgaWYgKCQ/KSB7CisJJGRpcnR5ID0gMTsKKwl3YXJuICJGYWlsZWQgdG8gY3ZzIGFkZCBkaXJlY3RvcnkgJGQgLS0geW91IG1heSBuZWVkIHRvIGRvIGl0IG1hbnVhbGx5IjsKKyAgICB9Cit9CisKK3ByaW50ICInUGF0Y2hpbmcnIGJpbmFyeSBmaWxlc1xuIjsKKworbXkgQGJmaWxlcyA9IGdyZXAobS9eQmluYXJ5Lywgc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1kaWZmLXRyZWUnLCAnLXAnLCAkcGFyZW50LCAkY29tbWl0KSk7CitAYmZpbGVzID0gbWFwIHsgY2hvbXAgfSBAYmZpbGVzOworZm9yZWFjaCBteSAkZiAoQGJmaWxlcykgeworICAgICMgY2hlY2sgdGhhdCB0aGUgZmlsZSBpbiBjdnMgbWF0Y2hlcyB0aGUgIm9sZCIgZmlsZQorICAgICMgZXh0cmFjdCB0aGUgZmlsZSB0byAkdG1wZGlyIGFuZCBjb21wYXJyZSB3aXRoIGNtcAorICAgIG15ICR0cmVlID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1yZXYtcGFyc2UnLCAiJHBhcmVudF57dHJlZX0iKTsKKyAgICBjaG9tcCAkdHJlZTsKKyAgICBteSAkYmxvYiA9IGBnaXQtbHMtdHJlZSAkdHJlZSAiJGYiIHwgY3V0IC1mIDEgfCBjdXQgLWQgJyAnIC1mIDNgOworICAgIGNob21wICRibG9iOworICAgIGBnaXQtY2F0LWZpbGUgYmxvYiAkYmxvYiA+ICR0bXBkaXIvYmxvYmA7CisgICAgaWYgKHN5c3RlbSgnY21wJywgJy1zJywgJGYsICIkdG1wZGlyL2Jsb2IiKSkgeworCXdhcm4gIkJpbmFyeSBmaWxlICRmIGluIENWUyBkb2VzIG5vdCBtYXRjaCBwYXJlbnQuXG4iOworCSRkaXJ0eSA9IDE7CisJbmV4dDsKKyAgICB9CisKKyAgICAjIHJlcGxhY2Ugd2l0aCB0aGUgbmV3IGZpbGUKKyAgICAgYGdpdC1jYXQtZmlsZSBibG9iICRibG9iID4gJGZgOworCisgICAgIyBUT0RPOiBzb21ldGhpbmcgc21hcnQgd2l0aCBmaWxlIG1vZGVzCisKK30KK2lmICgkZGlydHkpIHsKKyAgICBjbGVhbnVwY3ZzKEBmaWxlcyk7CisgICAgZGllICJFeGl0aW5nOiBCaW5hcnkgZmlsZXMgaW4gQ1ZTIGRvIG5vdCBtYXRjaCBwYXJlbnQiOworfQorCisjIyBhcHBseSBub24tYmluYXJ5IGNoYW5nZXMKK215ICRmdXp6ID0gJG9wdF9wID8gMCA6IDI7CisKK3ByaW50ICJQYXRjaGluZyBub24tYmluYXJ5IGZpbGVzXG4iOworcHJpbnQgYChnaXQtZGlmZi10cmVlIC1wICRwYXJlbnQgLXAgJGNvbW1pdCB8IHBhdGNoIC1wMSAtRiAkZnV6eiApIDI+JjFgOworCitteSAkZGlydHlwYXRjaCA9IDA7CitpZiAoKCQ/ID4+IDgpID09IDIpIHsKKyAgICBjbGVhbnVwY3ZzKEBmaWxlcyk7CisgICAgZGllICJFeGl0aW5nOiBQYXRjaCByZXBvcnRlZCBzZXJpb3VzIHRyb3VibGUgLS0geW91IHdpbGwgaGF2ZSB0byBhcHBseSB0aGlzIHBhdGNoIG1hbnVhbGx5IjsKK30gZWxzaWYgKCgkPyA+PiA4KSA9PSAxKSB7ICMgc29tZSBodW5rcyBmYWlsZWQgdG8gYXBwbHkKKyAgICAkZGlydHlwYXRjaCA9IDE7Cit9CisKK2ZvcmVhY2ggbXkgJGYgKEBhZmlsZXMpIHsKKyAgICBzeXN0ZW0oJ2N2cycsICdhZGQnLCAkZik7CisgICAgaWYgKCQ/KSB7CisJJGRpcnR5ID0gMTsKKwl3YXJuICJGYWlsZWQgdG8gY3ZzIGFkZCAkZiAtLSB5b3UgbWF5IG5lZWQgdG8gZG8gaXQgbWFudWFsbHkiOworICAgIH0KK30KKworZm9yZWFjaCBteSAkZiAoQGRmaWxlcykgeworICAgIHN5c3RlbSgnY3ZzJywgJ3JtJywgJy1mJywgJGYpOworICAgIGlmICgkPykgeworCSRkaXJ0eSA9IDE7CisJd2FybiAiRmFpbGVkIHRvIGN2cyBybSAtZiAkZiAtLSB5b3UgbWF5IG5lZWQgdG8gZG8gaXQgbWFudWFsbHkiOworICAgIH0KK30KKworcHJpbnQgIkNvbW1pdCB0byBDVlNcbiI7CitteSAkY29tbWl0ZmlsZXMgPSBqb2luKCcgJywgQGFmaWxlcywgQG1maWxlcywgQGRmaWxlcyk7CitteSAkY21kID0gImN2cyBjb21taXQgLUYgLm1zZyAkY29tbWl0ZmlsZXMiOworCitpZiAoJGRpcnR5cGF0Y2gpIHsKKyAgICBwcmludCAiTk9URTogT25lIG9yIG1vcmUgaHVua3MgZmFpbGVkIHRvIGFwcGx5IGNsZWFubHkuXG4iOworICAgIHByaW50ICJSZXNvbHZlIHRoZSBjb25mbGljdHMgYW5kIHRoZW4gY29tbWl0IHVzaW5nOlxuIjsKKyAgICBwcmludCAiXG4gICAgJGNtZFxuXG4iOworICAgIGV4aXQoMSk7Cit9CisKKworaWYgKCRvcHRfYykgeworICAgIHByaW50ICJBdXRvY29tbWl0XG4gICRjbWRcbiI7CisgICAgcHJpbnQgc2FmZV9waXBlX2NhcHR1cmUoJ2N2cycsICdjb21taXQnLCAnLUYnLCAnLm1zZycsIEBhZmlsZXMsIEBtZmlsZXMsIEBkZmlsZXMpOworICAgIGlmICgkPykgeworCWNsZWFudXBjdnMoQGZpbGVzKTsKKwlkaWUgIkV4aXRpbmc6IFRoZSBjb21taXQgZGlkIG5vdCBzdWNjZWVkIjsKKyAgICB9CisgICAgcHJpbnQgIkNvbW1pdHRlZCBzdWNjZXNzZnVsbHkgdG8gQ1ZTXG4iOworfSBlbHNlIHsKKyAgICBwcmludCAiUmVhZHkgZm9yIHlvdSB0byBjb21taXQsIGp1c3QgcnVuOlxuXG4gICAkY21kXG4iOworfQorc3ViIHVzYWdlIHsKKwlwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogR0lUX0RJUj0vcGF0aC90by8uZ2l0ICR7XGJhc2VuYW1lICQwfSBbLWhdIFstcF0gWy12XSBbLWNdIFstZl0gWy1tIG1zZ3ByZWZpeF0gWyBwYXJlbnQgXSBjb21taXQKK0VORAorCWV4aXQoMSk7Cit9CisKKyMgZW5zdXJlIGN2cyBpcyBjbGVhbiBiZWZvcmUgd2UgZGllCitzdWIgY2xlYW51cGN2cyB7CisgICAgbXkgQGZpbGVzID0gQF87CisgICAgZm9yZWFjaCBteSAkZiAoQGZpbGVzKSB7CisJc3lzdGVtKCdjdnMnLCAnLXEnLCAndXBkYXRlJywgJy1DJywgJGYpOworCWlmICgkPykgeworCSAgICB3YXJuICJXYXJuaW5nISBGYWlsZWQgdG8gY2xlYW51cCBzdGF0ZSBvZiAkZlxuIjsKKwl9CisgICAgfQorfQorCisjIEFuIGFsdGVyYXRpdmUgdG8gYGNvbW1hbmRgIHRoYXQgYWxsb3dzIGlucHV0IHRvIGJlIHBhc3NlZCBhcyBhbiBhcnJheQorIyB0byB3b3JrIGFyb3VuZCBzaGVsbCBwcm9ibGVtcyB3aXRoIHdlaXJkIGNoYXJhY3RlcnMgaW4gYXJndW1lbnRzCisjIGlmIHRoZSBleGVjIHJldHVybnMgbm9uLXplcm8gd2UgZGllCitzdWIgc2FmZV9waXBlX2NhcHR1cmUgeworICAgIG15IEBvdXRwdXQ7CisgICAgaWYgKG15ICRwaWQgPSBvcGVuIG15ICRjaGlsZCwgJy18JykgeworCUBvdXRwdXQgPSAoPCRjaGlsZD4pOworCWNsb3NlICRjaGlsZCBvciBkaWUgam9pbignICcsQF8pLiI6ICQhICQ/IjsKKyAgICB9IGVsc2UgeworCWV4ZWMoQF8pIG9yIGRpZSAiJCEgJD8iOyAjIGV4ZWMoKSBjYW4gZmFpbCB0aGUgZXhlY3V0YWJsZSBjYW4ndCBiZSBmb3VuZAorICAgIH0KKyAgICByZXR1cm4gd2FudGFycmF5ID8gQG91dHB1dCA6IGpvaW4oJycsQG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9naXQtY3ZzaW1wb3J0LnBlcmwgYi9naXQtY3ZzaW1wb3J0LnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzZmNjI0NgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jdnNpbXBvcnQucGVybApAQCAtMCwwICsxLDg4MCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgVGhpcyB0b29sIGlzIGNvcHlyaWdodCAoYykgMjAwNSwgTWF0dGhpYXMgVXJsaWNocy4KKyMgSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdudSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIworIyBUaGUgYmFzaWMgaWRlYSBpcyB0byBhZ2dyZWdhdGUgQ1ZTIGNoZWNrLWlucyBpbnRvIHJlbGF0ZWQgY2hhbmdlcy4KKyMgRm9ydHVuYXRlbHksICJjdnNwcyIgZG9lcyB0aGF0IGZvciB1czsgYWxsIHdlIGhhdmUgdG8gZG8gaXMgdG8gcGFyc2UKKyMgaXRzIG91dHB1dC4KKyMKKyMgQ2hlY2tpbmcgb3V0IHRoZSBmaWxlcyBpcyBkb25lIGJ5IGEgc2luZ2xlIGxvbmctcnVubmluZyBDVlMgY29ubmVjdGlvbgorIyAvIHNlcnZlciBwcm9jZXNzLgorIworIyBUaGUgaGVhZCByZXZpc2lvbiBpcyBvbiBicmFuY2ggIm9yaWdpbiIgYnkgZGVmYXVsdC4KKyMgWW91IGNhbiBjaGFuZ2UgdGhhdCB3aXRoIHRoZSAnLW8nIG9wdGlvbi4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUpOwordXNlIEZpbGU6OlBhdGggcXcobWtwYXRoKTsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKK3VzZSBUaW1lOjpMb2NhbDsKK3VzZSBJTzo6U29ja2V0OwordXNlIElPOjpQaXBlOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGR1cDIgRU5PRU5UKTsKK3VzZSBJUEM6Ok9wZW4yOworCiskU0lHeydQSVBFJ309IklHTk9SRSI7CiskRU5WeydUWid9PSJVVEMiOworCitvdXIoJG9wdF9oLCRvcHRfbywkb3B0X3YsJG9wdF9rLCRvcHRfdSwkb3B0X2QsJG9wdF9wLCRvcHRfQywkb3B0X3osJG9wdF9pLCRvcHRfUCwgJG9wdF9zLCRvcHRfbSwkb3B0X00sJG9wdF9BLCRvcHRfUywkb3B0X0wpOworbXkgKCVjb252X2F1dGhvcl9uYW1lLCAlY29udl9hdXRob3JfZW1haWwpOworCitzdWIgdXNhZ2UoKSB7CisJcHJpbnQgU1RERVJSIDw8RU5EOworVXNhZ2U6ICR7XGJhc2VuYW1lICQwfSAgICAgIyBmZXRjaC91cGRhdGUgR0lUIGZyb20gQ1ZTCisgICAgICAgWy1vIGJyYW5jaC1mb3ItSEVBRF0gWy1oXSBbLXZdIFstZCBDVlNST09UXSBbLUEgYXV0aG9yLWNvbnYtZmlsZV0KKyAgICAgICBbLXAgb3B0cy1mb3ItY3ZzcHNdIFstQyBHSVRfcmVwb3NpdG9yeV0gWy16IGZ1enpdIFstaV0gWy1rXSBbLXVdCisgICAgICAgWy1zIHN1YnN0XSBbLW1dIFstTSByZWdleF0gWy1TIHJlZ2V4XSBbQ1ZTX21vZHVsZV0KK0VORAorCWV4aXQoMSk7Cit9CisKK3N1YiByZWFkX2F1dGhvcl9pbmZvKCQpIHsKKwlteSAoJGZpbGUpID0gQF87CisJbXkgJHVzZXI7CisJb3BlbiBteSAkZiwgJzwnLCAiJGZpbGUiIG9yIGRpZSgiRmFpbGVkIHRvIG9wZW4gJGZpbGU6ICQhXG4iKTsKKworCXdoaWxlICg8JGY+KSB7CisJCSMgRXhwZWN0ZWQgZm9ybWF0IGlzIHRoaXM6CisJCSMgICBleG9uPUFuZHJlYXMgRXJpY3Nzb24gPGFlQG9wNS5zZT4KKwkJaWYgKG0vXihcUys/KVxzKj1ccyooLis/KVxzKjwoLispPlxzKiQvKSB7CisJCQkkdXNlciA9ICQxOworCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJDI7CisJCQkkY29udl9hdXRob3JfZW1haWx7JHVzZXJ9ID0gJDM7CisJCX0KKwkJIyBIb3dldmVyLCB3ZSBhbHNvIHJlYWQgZnJvbSBDVlNST09UL3VzZXJzIGZvcm1hdAorCQkjIHRvIGVhc2UgbWlncmF0aW9uLgorCQllbHNpZiAoL14oXHcrKTooWyciXT8pKC4rPylcMlxzKiQvKSB7CisJCQlteSAkbWFwcGVkOworCQkJKCR1c2VyLCAkbWFwcGVkKSA9ICgkMSwgJDMpOworCQkJaWYgKCRtYXBwZWQgPX4gL15ccyooLio/KVxzKjwoLiopPlxzKiQvKSB7CisJCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJDE7CisJCQkJJGNvbnZfYXV0aG9yX2VtYWlseyR1c2VyfSA9ICQyOworCQkJfQorCQkJZWxzaWYgKCRtYXBwZWQgPX4gL148PyguKik+PyQvKSB7CisJCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJHVzZXI7CisJCQkJJGNvbnZfYXV0aG9yX2VtYWlseyR1c2VyfSA9ICQxOworCQkJfQorCQl9CisJCSMgTkVFRFNXT1JLOiBNYXliZSB3YXJuIG9uIHVucmVjb2duaXplZCBsaW5lcz8KKwl9CisJY2xvc2UgKCRmKTsKK30KKworc3ViIHdyaXRlX2F1dGhvcl9pbmZvKCQpIHsKKwlteSAoJGZpbGUpID0gQF87CisJb3BlbiBteSAkZiwgJz4nLCAkZmlsZSBvcgorCSAgZGllKCJGYWlsZWQgdG8gb3BlbiAkZmlsZSBmb3Igd3JpdGluZzogJCEiKTsKKworCWZvcmVhY2ggKGtleXMgJWNvbnZfYXV0aG9yX25hbWUpIHsKKwkJcHJpbnQgJGYgIiRfPSRjb252X2F1dGhvcl9uYW1leyRffSA8JGNvbnZfYXV0aG9yX2VtYWlseyRffT5cbiI7CisJfQorCWNsb3NlICgkZik7Cit9CisKK2dldG9wdHMoImhpdm1rdW86ZDpwOkM6ejpzOk06UDpBOlM6TDoiKSBvciB1c2FnZSgpOwordXNhZ2UgaWYgJG9wdF9oOworCitAQVJHViA8PSAxIG9yIHVzYWdlKCk7CisKK2lmKCRvcHRfZCkgeworCSRFTlZ7IkNWU1JPT1QifSA9ICRvcHRfZDsKK30gZWxzaWYoLWYgJ0NWUy9Sb290JykgeworCW9wZW4gbXkgJGYsICc8JywgJ0NWUy9Sb290JyBvciBkaWUgJ0ZhaWxlZCB0byBvcGVuIENWUy9Sb290JzsKKwkkb3B0X2QgPSA8JGY+OworCWNob21wICRvcHRfZDsKKwljbG9zZSAkZjsKKwkkRU5WeyJDVlNST09UIn0gPSAkb3B0X2Q7Cit9IGVsc2lmKCRFTlZ7IkNWU1JPT1QifSkgeworCSRvcHRfZCA9ICRFTlZ7IkNWU1JPT1QifTsKK30gZWxzZSB7CisJZGllICJDVlNST09UIG5lZWRzIHRvIGJlIHNldCI7Cit9Ciskb3B0X28gfHw9ICJvcmlnaW4iOworJG9wdF9zIHx8PSAiLSI7CitteSAkZ2l0X3RyZWUgPSAkb3B0X0M7CiskZ2l0X3RyZWUgfHw9ICIuIjsKKworbXkgJGN2c190cmVlOworaWYgKCQjQVJHViA9PSAwKSB7CisJJGN2c190cmVlID0gJEFSR1ZbMF07Cit9IGVsc2lmICgtZiAnQ1ZTL1JlcG9zaXRvcnknKSB7CisJb3BlbiBteSAkZiwgJzwnLCAnQ1ZTL1JlcG9zaXRvcnknIG9yIAorCSAgICBkaWUgJ0ZhaWxlZCB0byBvcGVuIENWUy9SZXBvc2l0b3J5JzsKKwkkY3ZzX3RyZWUgPSA8JGY+OworCWNob21wICRjdnNfdHJlZTsKKwljbG9zZSAkZjsKK30gZWxzZSB7CisJdXNhZ2UoKTsKK30KKworb3VyIEBtZXJnZXJ4ID0gKCk7CitpZiAoJG9wdF9tKSB7CisJQG1lcmdlcnggPSAoIHFyL1xXKD86ZnJvbXxvZnxtZXJnZXxtZXJnaW5nfG1lcmdlZCkgKFx3KykvaSApOworfQoraWYgKCRvcHRfTSkgeworCXB1c2ggKEBtZXJnZXJ4LCBxci8kb3B0X00vKTsKK30KKworc2VsZWN0KFNUREVSUik7ICR8PTE7IHNlbGVjdChTVERPVVQpOworCisKK3BhY2thZ2UgQ1ZTY29ubjsKKyMgQmFzaWMgQ1ZTIGRpYWxvZy4KKyMgV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGNvbm5lY3RpbmcgYW5kIGRvd25sb2FkaW5nLCBzbyAuLi4KKwordXNlIEZpbGU6OlNwZWM7Cit1c2UgRmlsZTo6VGVtcCBxdyh0ZW1wZmlsZSk7Cit1c2UgUE9TSVggcXcoc3RyZnRpbWUgZHVwMik7CisKK3N1YiBuZXcgeworCW15KCR3aGF0LCRyZXBvLCRzdWJkaXIpID0gQF87CisJJHdoYXQ9cmVmKCR3aGF0KSBpZiByZWYoJHdoYXQpOworCisJbXkgJHNlbGYgPSB7fTsKKwkkc2VsZi0+eydidWZmZXInfSA9ICIiOworCWJsZXNzKCRzZWxmLCR3aGF0KTsKKworCSRyZXBvID1+IHMjLyskIyM7CisJJHNlbGYtPnsnZnVsbHJlcCd9ID0gJHJlcG87CisJJHNlbGYtPmNvbm4oKTsKKworCSRzZWxmLT57J3N1YmRpcid9ID0gJHN1YmRpcjsKKwkkc2VsZi0+eydsaW5lcyd9ID0gdW5kZWY7CisKKwlyZXR1cm4gJHNlbGY7Cit9CisKK3N1YiBjb25uIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCW15ICRyZXBvID0gJHNlbGYtPnsnZnVsbHJlcCd9OworCWlmKCRyZXBvID1+IHMvXjpwc2VydmVyOig/OiguKj8pKD86OiguKj8pKT9AKT8oW146XC9dKikoPzo6KFxkKikpPy8vKSB7CisJCW15KCR1c2VyLCRwYXNzLCRzZXJ2LCRwb3J0KSA9ICgkMSwkMiwkMywkNCk7CisJCSR1c2VyPSJhbm9ueW1vdXMiIHVubGVzcyBkZWZpbmVkICR1c2VyOworCQlteSAkcnIyID0gIi0iOworCQl1bmxlc3MoJHBvcnQpIHsKKwkJCSRycjIgPSAiOnBzZXJ2ZXI6JHVzZXJcQCRzZXJ2OiRyZXBvIjsKKwkJCSRwb3J0PTI0MDE7CisJCX0KKwkJbXkgJHJyID0gIjpwc2VydmVyOiR1c2VyXEAkc2VydjokcG9ydCRyZXBvIjsKKworCQl1bmxlc3MoJHBhc3MpIHsKKwkJCW9wZW4oSCwkRU5WeydIT01FJ30uIi8uY3ZzcGFzcyIpIGFuZCBkbyB7CisJCQkJIyA6cHNlcnZlcjpjdnNAbWVhLnRtdC50ZWxlLmZpOi9jdnNyb290L3ptYWlsZXIgQWg8WgorCQkJCXdoaWxlKDxIPikgeworCQkJCQljaG9tcDsKKwkJCQkJcy9eXC9cZCtccysvLzsKKwkJCQkJbXkgKCR3LCRwKSA9IHNwbGl0KC9ccy8sJF8sMik7CisJCQkJCWlmKCR3IGVxICRyciBvciAkdyBlcSAkcnIyKSB7CisJCQkJCQkkcGFzcyA9ICRwOworCQkJCQkJbGFzdDsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCX0KKwkJJHBhc3M9IkEiIHVubGVzcyAkcGFzczsKKworCQlteSAkcyA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVySG9zdCA9PiAkc2VydiwgUGVlclBvcnQgPT4gJHBvcnQpOworCQlkaWUgIlNvY2tldCB0byAkc2VydjogJCFcbiIgdW5sZXNzIGRlZmluZWQgJHM7CisJCSRzLT53cml0ZSgiQkVHSU4gQVVUSCBSRVFVRVNUXG4kcmVwb1xuJHVzZXJcbiRwYXNzXG5FTkQgQVVUSCBSRVFVRVNUXG4iKQorCQkJb3IgZGllICJXcml0ZSB0byAkc2VydjogJCFcbiI7CisJCSRzLT5mbHVzaCgpOworCisJCW15ICRyZXAgPSA8JHM+OworCisJCWlmKCRyZXAgbmUgIkkgTE9WRSBZT1VcbiIpIHsKKwkJCSRyZXA9Ijx1bmtub3duPiIgdW5sZXNzICRyZXA7CisJCQlkaWUgIkF1dGhSZXBseTogJHJlcFxuIjsKKwkJfQorCQkkc2VsZi0+eydzb2NrZXRvJ30gPSAkczsKKwkJJHNlbGYtPnsnc29ja2V0aSd9ID0gJHM7CisJfSBlbHNlIHsgIyBsb2NhbCBvciBleHQ6IEZvcmsgb2ZmIG91ciBvd24gY3ZzIHNlcnZlci4KKwkJbXkgJHByID0gSU86OlBpcGUtPm5ldygpOworCQlteSAkcHcgPSBJTzo6UGlwZS0+bmV3KCk7CisJCW15ICRwaWQgPSBmb3JrKCk7CisJCWRpZSAiRm9yazogJCFcbiIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJbXkgJGN2cyA9ICdjdnMnOworCQkkY3ZzID0gJEVOVntDVlNfU0VSVkVSfSBpZiBleGlzdHMgJEVOVntDVlNfU0VSVkVSfTsKKwkJbXkgJHJzaCA9ICdyc2gnOworCQkkcnNoID0gJEVOVntDVlNfUlNIfSBpZiBleGlzdHMgJEVOVntDVlNfUlNIfTsKKworCQlteSBAY3ZzID0gKCRjdnMsICdzZXJ2ZXInKTsKKwkJbXkgKCRsb2NhbCwgJHVzZXIsICRob3N0KTsKKwkJJGxvY2FsID0gJHJlcG8gPX4gcy86bG9jYWw6Ly87CisJCWlmICghJGxvY2FsKSB7CisJCSAgICAkcmVwbyA9fiBzLzpleHQ6Ly87CisJCSAgICAkbG9jYWwgPSAhKCRyZXBvID1+IHMvXig/OihbXlxAOl0rKVxAKT8oW146XSspOi8vKTsKKwkJICAgICgkdXNlciwgJGhvc3QpID0gKCQxLCAkMik7CisJCX0KKwkJaWYgKCEkbG9jYWwpIHsKKwkJICAgIGlmICgkdXNlcikgeworCQkJdW5zaGlmdCBAY3ZzLCAkcnNoLCAnLWwnLCAkdXNlciwgJGhvc3Q7CisJCSAgICB9IGVsc2UgeworCQkJdW5zaGlmdCBAY3ZzLCAkcnNoLCAkaG9zdDsKKwkJICAgIH0KKwkJfQorCisJCXVubGVzcygkcGlkKSB7CisJCQkkcHItPndyaXRlcigpOworCQkJJHB3LT5yZWFkZXIoKTsKKwkJCWR1cDIoJHB3LT5maWxlbm8oKSwwKTsKKwkJCWR1cDIoJHByLT5maWxlbm8oKSwxKTsKKwkJCSRwci0+Y2xvc2UoKTsKKwkJCSRwdy0+Y2xvc2UoKTsKKwkJCWV4ZWMoQGN2cyk7CisJCX0KKwkJJHB3LT53cml0ZXIoKTsKKwkJJHByLT5yZWFkZXIoKTsKKwkJJHNlbGYtPnsnc29ja2V0byd9ID0gJHB3OworCQkkc2VsZi0+eydzb2NrZXRpJ30gPSAkcHI7CisJfQorCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlJvb3QgJHJlcG9cbiIpOworCisJIyBUcmlhbCBhbmQgZXJyb3Igc2F5cyB0aGF0IHRoaXMgcHJvYmFibHkgaXMgdGhlIG1pbmltdW0gc2V0CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vZGUgTSBNYmluYXJ5IEUgQ2hlY2tlZC1pbiBDcmVhdGVkIFVwZGF0ZWQgTWVyZ2VkIFJlbW92ZWRcbiIpOworCisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgidmFsaWQtcmVxdWVzdHNcbiIpOworCSRzZWxmLT57J3NvY2tldG8nfS0+Zmx1c2goKTsKKworCWNob21wKG15ICRyZXA9JHNlbGYtPnJlYWRsaW5lKCkpOworCWlmKCRyZXAgIX4gcy9eVmFsaWQtcmVxdWVzdHNccyovLykgeworCQkkcmVwPSI8dW5rbm93bj4iIHVubGVzcyAkcmVwOworCQlkaWUgIkV4cGVjdGVkIFZhbGlkLXJlcXVlc3RzIGZyb20gc2VydmVyLCBidXQgZ290OiAkcmVwXG4iOworCX0KKwljaG9tcChteSAkcmVzPSRzZWxmLT5yZWFkbGluZSgpKTsKKwlkaWUgInZhbGlkUmVwbHk6ICRyZXNcbiIgaWYgJHJlcyBuZSAib2siOworCisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVXNlVW5jaGFuZ2VkXG4iKSBpZiAkcmVwID1+IC9cYlVzZVVuY2hhbmdlZFxiLzsKKwkkc2VsZi0+eydyZXBvJ30gPSAkcmVwbzsKK30KKworc3ViIHJlYWRsaW5lIHsKKwlteSgkc2VsZikgPSBAXzsKKwlyZXR1cm4gJHNlbGYtPnsnc29ja2V0aSd9LT5nZXRsaW5lKCk7Cit9CisKK3N1YiBfZmlsZSB7CisJIyBSZXF1ZXN0IGEgZmlsZSB3aXRoIGEgZ2l2ZW4gcmV2aXNpb24uCisJIyBUcmlhbCBhbmQgZXJyb3Igc2F5cyB0aGlzIGlzIGEgZ29vZCB3YXkgdG8gZG8gaXQuIDotLworCW15KCRzZWxmLCRmbiwkcmV2KSA9IEBfOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC1OXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgLVBcbiIpIG9yIHJldHVybiB1bmRlZjsKKwkjIC1razogTGludXMnIHZlcnNpb24gZG9lc24ndCB1c2UgaXQgLSBkZWZhdWx0cyB0byBvZmYKKwlpZiAoJG9wdF9rKSB7CisJICAgICRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC1ra1xuIikgb3IgcmV0dXJuIHVuZGVmOworCX0KKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJBcmd1bWVudCAtclxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50ICRyZXZcbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJBcmd1bWVudCAtLVxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50ICRzZWxmLT57J3N1YmRpcid9LyRmblxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkRpcmVjdG9yeSAuXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiJHNlbGYtPnsncmVwbyd9XG4iKSBvciByZXR1cm4gdW5kZWY7CisJIyAkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJTdGlja3kgVDEuMFxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoImNvXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT5mbHVzaCgpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydsaW5lcyd9ID0gMDsKKwlyZXR1cm4gMTsKK30KK3N1YiBfbGluZSB7CisJIyBSZWFkIGEgbGluZSBmcm9tIHRoZSBzZXJ2ZXIuCisJIyAuLi4gZXhjZXB0IHRoYXQgJ2xpbmUnIG1heSBiZSBhbiBlbnRpcmUgZmlsZS4gOy0pCisJbXkoJHNlbGYsICRmaCkgPSBAXzsKKwlkaWUgIk5vdCBpbiBsaW5lcyIgdW5sZXNzIGRlZmluZWQgJHNlbGYtPnsnbGluZXMnfTsKKworCW15ICRsaW5lOworCW15ICRyZXM9MDsKKwl3aGlsZShkZWZpbmVkKCRsaW5lID0gJHNlbGYtPnJlYWRsaW5lKCkpKSB7CisJCSMgTSBVIGdudXBnLWN2cy1yZXAvQVVUSE9SUworCQkjIFVwZGF0ZWQgZ251cGctY3ZzLXJlcC8KKwkJIyAvZGF0ZW4vc3JjL3JzeW5jL2dudXBnLWN2cy1yZXAvQVVUSE9SUworCQkjIC9BVVRIT1JTLzEuMS8vL1QxLjEKKwkJIyB1PXJ3LGc9cncsbz1ydworCQkjIDAKKwkJIyBvaworCisJCWlmKCRsaW5lID1+IHMvXig/OkNyZWF0ZWR8VXBkYXRlZCkgLy8pIHsKKwkJCSRsaW5lID0gJHNlbGYtPnJlYWRsaW5lKCk7ICMgcGF0aAorCQkJJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgIyBFbnRyaWVzIGxpbmUKKwkJCW15ICRtb2RlID0gJHNlbGYtPnJlYWRsaW5lKCk7IGNob21wICRtb2RlOworCQkJJHNlbGYtPnsnbW9kZSd9ID0gJG1vZGU7CisJCQlkZWZpbmVkIChteSAkY250ID0gJHNlbGYtPnJlYWRsaW5lKCkpCisJCQkJb3IgZGllICJFT0YgZnJvbSBzZXJ2ZXIgYWZ0ZXIgJ0NoYW5nZWQnXG4iOworCQkJY2hvbXAgJGNudDsKKwkJCWRpZSAiRHVoOiBGaWxlc2l6ZSAkY250IiBpZiAkY250ICF+IC9eXGQrJC87CisJCQkkbGluZT0iIjsKKwkJCSRyZXMgPSAkc2VsZi0+X2ZldGNoZmlsZSgkZmgsICRjbnQpOworCQl9IGVsc2lmKCRsaW5lID1+IHMvXiAvLykgeworCQkJcHJpbnQgJGZoICRsaW5lOworCQkJJHJlcyArPSBsZW5ndGgoJGxpbmUpOworCQl9IGVsc2lmKCRsaW5lID1+IC9eTVxiLykgeworCQkJIyBvdXRwdXQsIGRvIG5vdGhpbmcKKwkJfSBlbHNpZigkbGluZSA9fiAvXk1iaW5hcnlcYi8pIHsKKwkJCW15ICRjbnQ7CisJCQlkaWUgIkVPRiBmcm9tIHNlcnZlciBhZnRlciAnTWJpbmFyeSciIHVubGVzcyBkZWZpbmVkICgkY250ID0gJHNlbGYtPnJlYWRsaW5lKCkpOworCQkJY2hvbXAgJGNudDsKKwkJCWRpZSAiRHVoOiBNYmluYXJ5ICRjbnQiIGlmICRjbnQgIX4gL15cZCskLyBvciAkY250PDE7CisJCQkkbGluZT0iIjsKKwkJCSRyZXMgKz0gJHNlbGYtPl9mZXRjaGZpbGUoJGZoLCAkY250KTsKKwkJfSBlbHNlIHsKKwkJCWNob21wICRsaW5lOworCQkJaWYoJGxpbmUgZXEgIm9rIikgeworCQkJCSMgcHJpbnQgU1RERVJSICJTOiBvayAoIi5sZW5ndGgoJHJlcykuIilcbiI7CisJCQkJcmV0dXJuICRyZXM7CisJCQl9IGVsc2lmKCRsaW5lID1+IHMvXkUgLy8pIHsKKwkJCQkjIHByaW50IFNUREVSUiAiUzogJGxpbmVcbiI7CisJCQl9IGVsc2lmKCRsaW5lID1+IC9eKFJlbW92ZS1lbnRyeXxSZW1vdmVkKSAvaSkgeworCQkJCSRsaW5lID0gJHNlbGYtPnJlYWRsaW5lKCk7ICMgZmlsZW5hbWUKKwkJCQkkbGluZSA9ICRzZWxmLT5yZWFkbGluZSgpOyAjIE9LCisJCQkJY2hvbXAgJGxpbmU7CisJCQkJZGllICJVbmtub3duOiAkbGluZSIgaWYgJGxpbmUgbmUgIm9rIjsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UgeworCQkJCWRpZSAiVW5rbm93bjogJGxpbmVcbiI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHVuZGVmOworfQorc3ViIGZpbGUgeworCW15KCRzZWxmLCRmbiwkcmV2KSA9IEBfOworCW15ICRyZXM7CisKKwlteSAoJGZoLCAkbmFtZSkgPSB0ZW1wZmlsZSgnZ2l0Y3ZzLlhYWFhYWCcsIAorCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLCBVTkxJTksgPT4gMSk7CisKKwkkc2VsZi0+X2ZpbGUoJGZuLCRyZXYpIGFuZCAkcmVzID0gJHNlbGYtPl9saW5lKCRmaCk7CisKKwlpZiAoIWRlZmluZWQgJHJlcykgeworCSAgICBwcmludCBTVERFUlIgIlNlcnZlciBoYXMgZ29uZSBhd2F5IHdoaWxlIGZldGNoaW5nICRmbiAkcmV2LCByZXRyeWluZy4uLlxuIjsKKwkgICAgdHJ1bmNhdGUgJGZoLCAwOworCSAgICAkc2VsZi0+Y29ubigpOworCSAgICAkc2VsZi0+X2ZpbGUoJGZuLCRyZXYpIG9yIGRpZSAiTm8gZmlsZSBjb21tYW5kIHNlbmQiOworCSAgICAkcmVzID0gJHNlbGYtPl9saW5lKCRmaCk7CisJICAgIGRpZSAiUmV0cnkgZmFpbGVkIiB1bmxlc3MgZGVmaW5lZCAkcmVzOworCX0KKwljbG9zZSAoJGZoKTsKKworCXJldHVybiAoJG5hbWUsICRyZXMpOworfQorc3ViIF9mZXRjaGZpbGUgeworCW15ICgkc2VsZiwgJGZoLCAkY250KSA9IEBfOworCW15ICRyZXMgPSAwOworCW15ICRidWZzaXplID0gMTAyNCAqIDEwMjQ7CisJd2hpbGUoJGNudCkgeworCSAgICBpZiAoJGJ1ZnNpemUgPiAkY250KSB7CisJCSRidWZzaXplID0gJGNudDsKKwkgICAgfQorCSAgICBteSAkYnVmOworCSAgICBteSAkbnVtID0gJHNlbGYtPnsnc29ja2V0aSd9LT5yZWFkKCRidWYsJGJ1ZnNpemUpOworCSAgICBkaWUgIlNlcnZlcjogRmlsZXNpemUgJGNudDogJG51bTogJCFcbiIgaWYgbm90IGRlZmluZWQgJG51bSBvciAkbnVtPD0wOworCSAgICBwcmludCAkZmggJGJ1ZjsKKwkgICAgJHJlcyArPSAkbnVtOworCSAgICAkY250IC09ICRudW07CisJfQorCXJldHVybiAkcmVzOworfQorCisKK3BhY2thZ2UgbWFpbjsKKworbXkgJGN2cyA9IENWU2Nvbm4tPm5ldygkb3B0X2QsICRjdnNfdHJlZSk7CisKKworc3ViIHBkYXRlKCQpIHsKKwlteSgkZCkgPSBAXzsKKwltIyhcZHsyLDR9KS8oXGRcZCkvKFxkXGQpXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/IworCQlvciBkaWUgIlVucGFyc2VhYmxlIGRhdGU6ICRkXG4iOworCW15ICR5PSQxOyAkeS09MTkwMCBpZiAkeT4xOTAwOworCXJldHVybiB0aW1lZ20oJDZ8fDAsJDUsJDQsJDMsJDItMSwkeSk7Cit9CisKK3N1YiBwbW9kZSgkKSB7CisJbXkoJG1vZGUpID0gQF87CisJbXkgJG0gPSAwOworCW15ICRtbSA9IDA7CisJbXkgJHVtID0gMDsKKwlmb3IgbXkgJHgoc3BsaXQoLy8sJG1vZGUpKSB7CisJCWlmKCR4IGVxICIsIikgeworCQkJJG0gfD0gJG1tJiR1bTsKKwkJCSRtbSA9IDA7CisJCQkkdW0gPSAwOworCQl9IGVsc2lmKCR4IGVxICJ1IikgeyAkdW0gfD0gMDcwMDsKKwkJfSBlbHNpZigkeCBlcSAiZyIpIHsgJHVtIHw9IDAwNzA7CisJCX0gZWxzaWYoJHggZXEgIm8iKSB7ICR1bSB8PSAwMDA3OworCQl9IGVsc2lmKCR4IGVxICJyIikgeyAkbW0gfD0gMDQ0NDsKKwkJfSBlbHNpZigkeCBlcSAidyIpIHsgJG1tIHw9IDAyMjI7CisJCX0gZWxzaWYoJHggZXEgIngiKSB7ICRtbSB8PSAwMTExOworCQl9IGVsc2lmKCR4IGVxICI9IikgeyAjIGRvIG5vdGhpbmcKKwkJfSBlbHNlIHsgZGllICJVbmtub3duIG1vZGU6ICRtb2RlXG4iOworCQl9CisJfQorCSRtIHw9ICRtbSYkdW07CisJcmV0dXJuICRtOworfQorCitzdWIgZ2V0d2QoKSB7CisJbXkgJHB3ZCA9IGBwd2RgOworCWNob21wICRwd2Q7CisJcmV0dXJuICRwd2Q7Cit9CisKK3N1YiBpc19zaGExIHsKKwlteSAkcyA9IHNoaWZ0OworCXJldHVybiAkcyA9fiAvXlthLWYwLTldezQwfSQvOworfQorCitzdWIgZ2V0X2hlYWRyZWYgKCQkKSB7CisgICAgbXkgJG5hbWUgICAgPSBzaGlmdDsKKyAgICBteSAkZ2l0X2RpciA9IHNoaWZ0OyAKKyAgICAKKyAgICBteSAkZiA9ICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRuYW1lIjsKKyAgICBpZihvcGVuKG15ICRmaCwgJGYpKSB7CisJICAgIGNob21wKG15ICRyID0gPCRmaD4pOworCSAgICBpc19zaGExKCRyKSBvciBkaWUgIkNhbm5vdCBnZXQgaGVhZCBpZCBmb3IgJG5hbWUgKCRyKTogJCEiOworCSAgICByZXR1cm4gJHI7CisgICAgfQorICAgIGRpZSAidW5hYmxlIHRvIG9wZW4gJGY6ICQhIiB1bmxlc3MgJCEgPT0gUE9TSVg6OkVOT0VOVDsKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKKy1kICRnaXRfdHJlZQorCW9yIG1rZGlyKCRnaXRfdHJlZSwwNzc3KQorCW9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSAkZ2l0X3RyZWU6ICQhIjsKK2NoZGlyKCRnaXRfdHJlZSk7CisKK215ICRsYXN0X2JyYW5jaCA9ICIiOworbXkgJG9yaWdfYnJhbmNoID0gIiI7CitteSAlYnJhbmNoX2RhdGU7CitteSAkdGlwX2F0X3N0YXJ0ID0gdW5kZWY7CisKK215ICRnaXRfZGlyID0gJEVOVnsiR0lUX0RJUiJ9IHx8ICIuZ2l0IjsKKyRnaXRfZGlyID0gZ2V0d2QoKS4iLyIuJGdpdF9kaXIgdW5sZXNzICRnaXRfZGlyID1+IG0jXi8jOworJEVOVnsiR0lUX0RJUiJ9ID0gJGdpdF9kaXI7CitteSAkb3JpZ19naXRfaW5kZXg7Ciskb3JpZ19naXRfaW5kZXggPSAkRU5We0dJVF9JTkRFWF9GSUxFfSBpZiBleGlzdHMgJEVOVntHSVRfSU5ERVhfRklMRX07CitteSAoJGdpdF9paCwgJGdpdF9pbmRleCkgPSB0ZW1wZmlsZSgnZ2l0WFhYWFhYJywgU1VGRklYID0+ICcuaWR4JywKKwkJCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpKTsKK2Nsb3NlICgkZ2l0X2loKTsKKyRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGdpdF9pbmRleDsKK3VubGVzcygtZCAkZ2l0X2RpcikgeworCXN5c3RlbSgiZ2l0LWluaXQtZGIiKTsKKwlkaWUgIkNhbm5vdCBpbml0IHRoZSBHSVQgZGIgYXQgJGdpdF90cmVlOiAkP1xuIiBpZiAkPzsKKwlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiKTsKKwlkaWUgIkNhbm5vdCBpbml0IGFuIGVtcHR5IHRyZWU6ICQ/XG4iIGlmICQ/OworCisJJGxhc3RfYnJhbmNoID0gJG9wdF9vOworCSRvcmlnX2JyYW5jaCA9ICIiOworfSBlbHNlIHsKKwktZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kb3B0X28iCisJCW9yIGRpZSAiQnJhbmNoICckb3B0X28nIGRvZXMgbm90IGV4aXN0LlxuIi4KKwkJICAgICAgICJFaXRoZXIgdXNlIHRoZSBjb3JyZWN0ICctbyBicmFuY2gnIG9wdGlvbixcbiIuCisJCSAgICAgICAib3IgaW1wb3J0IHRvIGEgbmV3IHJlcG9zaXRvcnkuXG4iOworCisJb3BlbihGLCAiZ2l0LXN5bWJvbGljLXJlZiBIRUFEIHwiKSBvcgorCQlkaWUgIkNhbm5vdCBydW4gZ2l0LXN5bWJvbGljLXJlZjogJCFcbiI7CisJY2hvbXAgKCRsYXN0X2JyYW5jaCA9IDxGPik7CisJJGxhc3RfYnJhbmNoID0gYmFzZW5hbWUoJGxhc3RfYnJhbmNoKTsKKwljbG9zZShGKTsKKwl1bmxlc3MoJGxhc3RfYnJhbmNoKSB7CisJCXdhcm4gIkNhbm5vdCByZWFkIHRoZSBsYXN0IGJyYW5jaCBuYW1lOiAkISAtLSBhc3N1bWluZyAnbWFzdGVyJ1xuIjsKKwkJJGxhc3RfYnJhbmNoID0gIm1hc3RlciI7CisJfQorCSRvcmlnX2JyYW5jaCA9ICRsYXN0X2JyYW5jaDsKKwkkdGlwX2F0X3N0YXJ0ID0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGA7CisKKwkjIHBvcHVsYXRlIGluZGV4CisJc3lzdGVtKCdnaXQtcmVhZC10cmVlJywgJGxhc3RfYnJhbmNoKTsKKwlkaWUgInJlYWQtdHJlZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCisJIyBHZXQgdGhlIGxhc3QgaW1wb3J0IHRpbWVzdGFtcHMKKwlvcGVuZGlyKEQsIiRnaXRfZGlyL3JlZnMvaGVhZHMiKTsKKwl3aGlsZShkZWZpbmVkKG15ICRoZWFkID0gcmVhZGRpcihEKSkpIHsKKwkJbmV4dCBpZiAkaGVhZCA9fiAvXlwuLzsKKwkJb3BlbihGLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRoZWFkIikKKwkJCW9yIGRpZSAiQmFkIGhlYWQgYnJhbmNoOiAkaGVhZDogJCFcbiI7CisJCWNob21wKG15ICRmdGFnID0gPEY+KTsKKwkJY2xvc2UoRik7CisJCW9wZW4oRiwiZ2l0LWNhdC1maWxlIGNvbW1pdCAkZnRhZyB8Iik7CisJCXdoaWxlKDxGPikgeworCQkJbmV4dCB1bmxlc3MgL15hdXRob3Jccy4qXHMoXGQrKVxzWy0rXVxkezR9JC87CisJCQkkYnJhbmNoX2RhdGV7JGhlYWR9ID0gJDE7CisJCQlsYXN0OworCQl9CisJCWNsb3NlKEYpOworCX0KKwljbG9zZWRpcihEKTsKK30KKworLWQgJGdpdF9kaXIKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgZ2l0IHN1YmRpciAoJGdpdF9kaXIpLlxuIjsKKworIyBub3cgd2UgcmVhZCAoYW5kIHBvc3NpYmx5IHNhdmUpIGF1dGhvci1pbmZvIGFzIHdlbGwKKy1mICIkZ2l0X2Rpci9jdnMtYXV0aG9ycyIgYW5kCisgIHJlYWRfYXV0aG9yX2luZm8oIiRnaXRfZGlyL2N2cy1hdXRob3JzIik7CitpZiAoJG9wdF9BKSB7CisJcmVhZF9hdXRob3JfaW5mbygkb3B0X0EpOworCXdyaXRlX2F1dGhvcl9pbmZvKCIkZ2l0X2Rpci9jdnMtYXV0aG9ycyIpOworfQorCitteSAkcGlkID0gb3BlbihDVlMsIi18Iik7CitkaWUgIkNhbm5vdCBmb3JrOiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkcGlkOwordW5sZXNzKCRwaWQpIHsKKwlteSBAb3B0OworCUBvcHQgPSBzcGxpdCgvLC8sJG9wdF9wKSBpZiBkZWZpbmVkICRvcHRfcDsKKwl1bnNoaWZ0IEBvcHQsICcteicsICRvcHRfeiBpZiBkZWZpbmVkICRvcHRfejsKKwl1bnNoaWZ0IEBvcHQsICctcScgICAgICAgICB1bmxlc3MgZGVmaW5lZCAkb3B0X3Y7CisJdW5sZXNzIChkZWZpbmVkKCRvcHRfcCkgJiYgJG9wdF9wID1+IG0vLS1uby1jdnMtZGlyZWN0LykgeworCQlwdXNoIEBvcHQsICctLWN2cy1kaXJlY3QnOworCX0KKwlpZiAoJG9wdF9QKSB7CisJICAgIGV4ZWMoImNhdCIsICRvcHRfUCk7CisJfSBlbHNlIHsKKwkgICAgZXhlYygiY3ZzcHMiLCItLW5vcmMiLEBvcHQsIi11IiwiLUEiLCctLXJvb3QnLCRvcHRfZCwkY3ZzX3RyZWUpOworCSAgICBkaWUgIkNvdWxkIG5vdCBzdGFydCBjdnNwczogJCFcbiI7CisJfQorfQorCisKKyMjIGN2c3BzIG91dHB1dDoKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNQYXRjaFNldCAzMTQKKyNEYXRlOiAxOTk5LzA5LzE4IDEzOjAzOjU5CisjQXV0aG9yOiB3a29jaAorI0JyYW5jaDogU1RBQkxFLUJSQU5DSC0xLTAKKyNBbmNlc3RvciBicmFuY2g6IEhFQUQKKyNUYWc6IChub25lKQorI0xvZzoKKyMgICAgU2VlIENoYW5nZUxvZzogU2F0IFNlcCAxOCAxMzowMzoyOCBDRVNUIDE5OTkgIFdlcm5lciBLb2NoCisjTWVtYmVyczoKKyMJUkVBRE1FOjEuNTctPjEuNTcuMi4xCisjCVZFUlNJT046MS45Ni0+MS45Ni4yLjEKKyMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgJHN0YXRlID0gMDsKKworc3ViIHVwZGF0ZV9pbmRleCAoXEBcQCkgeworCW15ICRvbGQgPSBzaGlmdDsKKwlteSAkbmV3ID0gc2hpZnQ7CisJb3BlbihteSAkZmgsICd8LScsIHF3KGdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvKSkKKwkJb3IgZGllICJ1bmFibGUgdG8gb3BlbiBnaXQtdXBkYXRlLWluZGV4OiAkISI7CisJcHJpbnQgJGZoCisJCShtYXAgeyAiMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXHQkX1wwIiB9CisJCQlAJG9sZCksCisJCShtYXAgeyAnMTAwJyAuIHNwcmludGYoJyVvJywgJF8tPlswXSkgLiAiICRfLT5bMV1cdCRfLT5bMl1cMCIgfQorCQkJQCRuZXcpCisJCW9yIGRpZSAidW5hYmxlIHRvIHdyaXRlIHRvIGdpdC11cGRhdGUtaW5kZXg6ICQhIjsKKwljbG9zZSAkZmgKKwkJb3IgZGllICJ1bmFibGUgdG8gd3JpdGUgdG8gZ2l0LXVwZGF0ZS1pbmRleDogJCEiOworCSQ/IGFuZCBkaWUgImdpdC11cGRhdGUtaW5kZXggcmVwb3J0ZWQgZXJyb3I6ICQ/IjsKK30KKworc3ViIHdyaXRlX3RyZWUgKCkgeworCW9wZW4obXkgJGZoLCAnLXwnLCBxdyhnaXQtd3JpdGUtdHJlZSkpCisJCW9yIGRpZSAidW5hYmxlIHRvIG9wZW4gZ2l0LXdyaXRlLXRyZWU6ICQhIjsKKwljaG9tcChteSAkdHJlZSA9IDwkZmg+KTsKKwlpc19zaGExKCR0cmVlKQorCQlvciBkaWUgIkNhbm5vdCBnZXQgdHJlZSBpZCAoJHRyZWUpOiAkISI7CisJY2xvc2UoJGZoKQorCQlvciBkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LXdyaXRlLXRyZWU6ICQ/XG4iOworCXByaW50ICJUcmVlIElEICR0cmVlXG4iIGlmICRvcHRfdjsKKwlyZXR1cm4gJHRyZWU7Cit9CisKK215KCRwYXRjaHNldCwkZGF0ZSwkYXV0aG9yX25hbWUsJGF1dGhvcl9lbWFpbCwkYnJhbmNoLCRhbmNlc3RvciwkdGFnLCRsb2dtc2cpOworbXkoQG9sZCxAbmV3LEBza2lwcGVkKTsKK3N1YiBjb21taXQgeworCXVwZGF0ZV9pbmRleChAb2xkLCBAbmV3KTsKKwlAb2xkID0gQG5ldyA9ICgpOworCW15ICR0cmVlID0gd3JpdGVfdHJlZSgpOworCW15ICRwYXJlbnQgPSBnZXRfaGVhZHJlZigkbGFzdF9icmFuY2gsICRnaXRfZGlyKTsKKwlwcmludCAiUGFyZW50IElEICIgLiAoJHBhcmVudCA/ICRwYXJlbnQgOiAiKGVtcHR5KSIpIC4gIlxuIiBpZiAkb3B0X3Y7CisKKwlteSBAY29tbWl0X2FyZ3M7CisJcHVzaCBAY29tbWl0X2FyZ3MsICgiLXAiLCAkcGFyZW50KSBpZiAkcGFyZW50OworCisJIyBsb29zZSBkZXRlY3Rpb24gb2YgbWVyZ2VzCisJIyBiYXNlZCBvbiB0aGUgY29tbWl0IG1zZworCWZvcmVhY2ggbXkgJHJ4IChAbWVyZ2VyeCkgeworCQluZXh0IHVubGVzcyAkbG9nbXNnID1+ICRyeCAmJiAkMTsKKwkJbXkgJG1wYXJlbnQgPSAkMSBlcSAnSEVBRCcgPyAkb3B0X28gOiAkMTsKKwkJaWYobXkgJHNoYTEgPSBnZXRfaGVhZHJlZigkbXBhcmVudCwgJGdpdF9kaXIpKSB7CisJCQlwdXNoIEBjb21taXRfYXJncywgJy1wJywgJG1wYXJlbnQ7CisJCQlwcmludCAiTWVyZ2UgcGFyZW50IGJyYW5jaDogJG1wYXJlbnRcbiIgaWYgJG9wdF92OworCQl9CisJfQorCisJbXkgJGNvbW1pdF9kYXRlID0gc3RyZnRpbWUoIiswMDAwICVZLSVtLSVkICVIOiVNOiVTIixnbXRpbWUoJGRhdGUpKTsKKwkkRU5We0dJVF9BVVRIT1JfTkFNRX0gPSAkYXV0aG9yX25hbWU7CisJJEVOVntHSVRfQVVUSE9SX0VNQUlMfSA9ICRhdXRob3JfZW1haWw7CisJJEVOVntHSVRfQVVUSE9SX0RBVEV9ID0gJGNvbW1pdF9kYXRlOworCSRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSA9ICRhdXRob3JfbmFtZTsKKwkkRU5We0dJVF9DT01NSVRURVJfRU1BSUx9ID0gJGF1dGhvcl9lbWFpbDsKKwkkRU5We0dJVF9DT01NSVRURVJfREFURX0gPSAkY29tbWl0X2RhdGU7CisJbXkgJHBpZCA9IG9wZW4yKG15ICRjb21taXRfcmVhZCwgbXkgJGNvbW1pdF93cml0ZSwKKwkJJ2dpdC1jb21taXQtdHJlZScsICR0cmVlLCBAY29tbWl0X2FyZ3MpOworCisJIyBjb21wYXRpYmlsaXR5IHdpdGggZ2l0MmN2cworCXN1YnN0cigkbG9nbXNnLDMyNzY3KSA9ICIiIGlmIGxlbmd0aCgkbG9nbXNnKSA+IDMyNzY3OworCSRsb2dtc2cgPX4gcy9bXHNcbl0rXHovLzsKKworCWlmIChAc2tpcHBlZCkgeworCSAgICAkbG9nbXNnIC49ICJcblxuXG5TS0lQUEVEOlxuXHQiOworCSAgICAkbG9nbXNnIC49IGpvaW4oIlxuXHQiLCBAc2tpcHBlZCkgLiAiXG4iOworCSAgICBAc2tpcHBlZCA9ICgpOworCX0KKworCXByaW50KCRjb21taXRfd3JpdGUgIiRsb2dtc2dcbiIpICYmIGNsb3NlKCRjb21taXRfd3JpdGUpCisJCW9yIGRpZSAiRXJyb3Igd3JpdGluZyB0byBnaXQtY29tbWl0LXRyZWU6ICQhXG4iOworCisJcHJpbnQgIkNvbW1pdHRlZCBwYXRjaCAkcGF0Y2hzZXQgKCRicmFuY2ggJGNvbW1pdF9kYXRlKVxuIiBpZiAkb3B0X3Y7CisJY2hvbXAobXkgJGNpZCA9IDwkY29tbWl0X3JlYWQ+KTsKKwlpc19zaGExKCRjaWQpIG9yIGRpZSAiQ2Fubm90IGdldCBjb21taXQgaWQgKCRjaWQpOiAkIVxuIjsKKwlwcmludCAiQ29tbWl0IElEICRjaWRcbiIgaWYgJG9wdF92OworCWNsb3NlKCRjb21taXRfcmVhZCk7CisKKwl3YWl0cGlkKCRwaWQsMCk7CisJZGllICJFcnJvciBydW5uaW5nIGdpdC1jb21taXQtdHJlZTogJD9cbiIgaWYgJD87CisKKwlzeXN0ZW0oImdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvJGJyYW5jaCAkY2lkIikgPT0gMAorCQlvciBkaWUgIkNhbm5vdCB3cml0ZSBicmFuY2ggJGJyYW5jaCBmb3IgdXBkYXRlOiAkIVxuIjsKKworCWlmKCR0YWcpIHsKKwkJbXkoJGluLCAkb3V0KSA9ICgnJywnJyk7CisJICAgICAgICBteSgkeHRhZykgPSAkdGFnOworCQkkeHRhZyA9fiBzL1xzK1wqXCouKiQvLzsgIyBSZW1vdmUgc3R1ZmYgbGlrZSAqKiBJTlZBTElEICoqIGFuZCAqKiBGVU5LWSAqKgorCQkkeHRhZyA9fiB0ci9fL1wuLyBpZiAoICRvcHRfdSApOworCQkkeHRhZyA9fiBzL1tcL10vJG9wdF9zL2c7CisJCQorCQlteSAkcGlkID0gb3BlbjIoJGluLCAkb3V0LCAnZ2l0LW1rdGFnJyk7CisJCXByaW50ICRvdXQgIm9iamVjdCAkY2lkXG4iLgorCQkgICAgInR5cGUgY29tbWl0XG4iLgorCQkgICAgInRhZyAkeHRhZ1xuIi4KKwkJICAgICJ0YWdnZXIgJGF1dGhvcl9uYW1lIDwkYXV0aG9yX2VtYWlsPlxuIgorCQkgICAgb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyBvYmplY3QgJHh0YWc6ICQhXG4iOworCQljbG9zZSgkb3V0KQorCQkgICAgb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyBvYmplY3QgJHh0YWc6ICQhXG4iOworCisJCW15ICR0YWdvYmogPSA8JGluPjsKKwkJY2hvbXAgJHRhZ29iajsKKworCQlpZiAoICFjbG9zZSgkaW4pIG9yIHdhaXRwaWQoJHBpZCwgMCkgIT0gJHBpZCBvcgorCQkgICAgICQ/ICE9IDAgb3IgJHRhZ29iaiAhfiAvXlswMTIzNDU2Nzg5YWJjZGVmXXs0MH0kLyApIHsKKwkJICAgIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgb2JqZWN0ICR4dGFnOiAkIVxuIjsKKwkgICAgICAgIH0KKwkJCisKKwkJb3BlbihDLCI+JGdpdF9kaXIvcmVmcy90YWdzLyR4dGFnIikKKwkJCW9yIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgJHh0YWc6ICQhXG4iOworCQlwcmludCBDICIkdGFnb2JqXG4iCisJCQlvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHh0YWc6ICQhXG4iOworCQljbG9zZShDKQorCQkJb3IgZGllICJDYW5ub3Qgd3JpdGUgdGFnICR4dGFnOiAkIVxuIjsKKworCQlwcmludCAiQ3JlYXRlZCB0YWcgJyR4dGFnJyBvbiAnJGJyYW5jaCdcbiIgaWYgJG9wdF92OworCX0KK307CisKK215ICRjb21taXRjb3VudCA9IDE7Cit3aGlsZSg8Q1ZTPikgeworCWNob21wOworCWlmKCRzdGF0ZSA9PSAwIGFuZCAvXi0rJC8pIHsKKwkJJHN0YXRlID0gMTsKKwl9IGVsc2lmKCRzdGF0ZSA9PSAwKSB7CisJCSRzdGF0ZSA9IDE7CisJCXJlZG87CisJfSBlbHNpZigoJHN0YXRlPT0wIG9yICRzdGF0ZT09MSkgYW5kIHMvXlBhdGNoU2V0XHMrLy8pIHsKKwkJJHBhdGNoc2V0ID0gMCskXzsKKwkJJHN0YXRlPTI7CisJfSBlbHNpZigkc3RhdGUgPT0gMiBhbmQgcy9eRGF0ZTpccysvLykgeworCQkkZGF0ZSA9IHBkYXRlKCRfKTsKKwkJdW5sZXNzKCRkYXRlKSB7CisJCQlwcmludCBTVERFUlIgIkNvdWxkIG5vdCBwYXJzZSBkYXRlOiAkX1xuIjsKKwkJCSRzdGF0ZT0wOworCQkJbmV4dDsKKwkJfQorCQkkc3RhdGU9MzsKKwl9IGVsc2lmKCRzdGF0ZSA9PSAzIGFuZCBzL15BdXRob3I6XHMrLy8pIHsKKwkJcy9ccyskLy87CisJCWlmICgvXiguKj8pXHMrPCguKik+LykgeworCQkgICAgKCRhdXRob3JfbmFtZSwgJGF1dGhvcl9lbWFpbCkgPSAoJDEsICQyKTsKKwkJfSBlbHNpZiAoJGNvbnZfYXV0aG9yX25hbWV7JF99KSB7CisJCQkkYXV0aG9yX25hbWUgPSAkY29udl9hdXRob3JfbmFtZXskX307CisJCQkkYXV0aG9yX2VtYWlsID0gJGNvbnZfYXV0aG9yX2VtYWlseyRffTsKKwkJfSBlbHNlIHsKKwkJICAgICRhdXRob3JfbmFtZSA9ICRhdXRob3JfZW1haWwgPSAkXzsKKwkJfQorCQkkc3RhdGUgPSA0OworCX0gZWxzaWYoJHN0YXRlID09IDQgYW5kIHMvXkJyYW5jaDpccysvLykgeworCQlzL1xzKyQvLzsKKwkJcy9bXC9dLyRvcHRfcy9nOworCQkkYnJhbmNoID0gJF87CisJCSRzdGF0ZSA9IDU7CisJfSBlbHNpZigkc3RhdGUgPT0gNSBhbmQgcy9eQW5jZXN0b3IgYnJhbmNoOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQkkYW5jZXN0b3IgPSAkXzsKKwkJJGFuY2VzdG9yID0gJG9wdF9vIGlmICRhbmNlc3RvciBlcSAiSEVBRCI7CisJCSRzdGF0ZSA9IDY7CisJfSBlbHNpZigkc3RhdGUgPT0gNSkgeworCQkkYW5jZXN0b3IgPSB1bmRlZjsKKwkJJHN0YXRlID0gNjsKKwkJcmVkbzsKKwl9IGVsc2lmKCRzdGF0ZSA9PSA2IGFuZCBzL15UYWc6XHMrLy8pIHsKKwkJcy9ccyskLy87CisJCWlmKCRfIGVxICIobm9uZSkiKSB7CisJCQkkdGFnID0gdW5kZWY7CisJCX0gZWxzZSB7CisJCQkkdGFnID0gJF87CisJCX0KKwkJJHN0YXRlID0gNzsKKwl9IGVsc2lmKCRzdGF0ZSA9PSA3IGFuZCAvXkxvZzovKSB7CisJCSRsb2dtc2cgPSAiIjsKKwkJJHN0YXRlID0gODsKKwl9IGVsc2lmKCRzdGF0ZSA9PSA4IGFuZCAvXk1lbWJlcnM6LykgeworCQkkYnJhbmNoID0gJG9wdF9vIGlmICRicmFuY2ggZXEgIkhFQUQiOworCQlpZihkZWZpbmVkICRicmFuY2hfZGF0ZXskYnJhbmNofSBhbmQgJGJyYW5jaF9kYXRleyRicmFuY2h9ID49ICRkYXRlKSB7CisJCQkjIHNraXAKKwkJCXByaW50ICJza2lwIHBhdGNoc2V0ICRwYXRjaHNldDogJGRhdGUgYmVmb3JlICRicmFuY2hfZGF0ZXskYnJhbmNofVxuIiBpZiAkb3B0X3Y7CisJCQkkc3RhdGUgPSAxMTsKKwkJCW5leHQ7CisJCX0KKwkJaWYoJGFuY2VzdG9yKSB7CisJCQlpZigtZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kYnJhbmNoIikgeworCQkJCXByaW50IFNUREVSUiAiQnJhbmNoICRicmFuY2ggYWxyZWFkeSBleGlzdHMhXG4iOworCQkJCSRzdGF0ZT0xMTsKKwkJCQluZXh0OworCQkJfQorCQkJdW5sZXNzKG9wZW4oSCwiJGdpdF9kaXIvcmVmcy9oZWFkcy8kYW5jZXN0b3IiKSkgeworCQkJCXByaW50IFNUREVSUiAiQnJhbmNoICRhbmNlc3RvciBkb2VzIG5vdCBleGlzdCFcbiI7CisJCQkJJHN0YXRlPTExOworCQkJCW5leHQ7CisJCQl9CisJCQljaG9tcChteSAkaWQgPSA8SD4pOworCQkJY2xvc2UoSCk7CisJCQl1bmxlc3Mob3BlbihILCI+ICRnaXRfZGlyL3JlZnMvaGVhZHMvJGJyYW5jaCIpKSB7CisJCQkJcHJpbnQgU1RERVJSICJDb3VsZCBub3QgY3JlYXRlIGJyYW5jaCAkYnJhbmNoOiAkIVxuIjsKKwkJCQkkc3RhdGU9MTE7CisJCQkJbmV4dDsKKwkJCX0KKwkJCXByaW50IEggIiRpZFxuIgorCQkJCW9yIGRpZSAiQ291bGQgbm90IHdyaXRlIGJyYW5jaCAkYnJhbmNoOiAkISI7CisJCQljbG9zZShIKQorCQkJCW9yIGRpZSAiQ291bGQgbm90IHdyaXRlIGJyYW5jaCAkYnJhbmNoOiAkISI7CisJCX0KKwkJaWYoKCRhbmNlc3RvciB8fCAkYnJhbmNoKSBuZSAkbGFzdF9icmFuY2gpIHsKKwkJCXByaW50ICJTd2l0Y2hpbmcgZnJvbSAkbGFzdF9icmFuY2ggdG8gJGJyYW5jaFxuIiBpZiAkb3B0X3Y7CisJCQlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiLCAkYnJhbmNoKTsKKwkJCWRpZSAicmVhZC10cmVlIGZhaWxlZDogJD9cbiIgaWYgJD87CisJCX0KKwkJJGxhc3RfYnJhbmNoID0gJGJyYW5jaCBpZiAkYnJhbmNoIG5lICRsYXN0X2JyYW5jaDsKKwkJJHN0YXRlID0gOTsKKwl9IGVsc2lmKCRzdGF0ZSA9PSA4KSB7CisJCSRsb2dtc2cgLj0gIiRfXG4iOworCX0gZWxzaWYoJHN0YXRlID09IDkgYW5kIC9eXHMrKC4rPyk6KElOSVRJQUx8XGQrKD86XC5cZCspKyktPihcZCsoPzpcLlxkKykrKVxzKiQvKSB7CisjCVZFUlNJT046MS45Ni0+MS45Ni4yLjEKKwkJbXkgJGluaXQgPSAoJDIgZXEgIklOSVRJQUwiKTsKKwkJbXkgJGZuID0gJDE7CisJCW15ICRyZXYgPSAkMzsKKwkJJGZuID1+IHMjXi8rIyM7CisJCWlmICgkb3B0X1MgJiYgJGZuID1+IG0vJG9wdF9TLykgeworCQkgICAgcHJpbnQgIlNLSVBQSU5HICRmbiB2ICRyZXZcbiI7CisJCSAgICBwdXNoKEBza2lwcGVkLCAkZm4pOworCQkgICAgbmV4dDsKKwkJfQorCQlwcmludCAiRmV0Y2hpbmcgJGZuICAgdiAkcmV2XG4iIGlmICRvcHRfdjsKKwkJbXkgKCR0bXBuYW1lLCAkc2l6ZSkgPSAkY3ZzLT5maWxlKCRmbiwkcmV2KTsKKwkJaWYoJHNpemUgPT0gLTEpIHsKKwkJCXB1c2goQG9sZCwkZm4pOworCQkJcHJpbnQgIkRyb3AgJGZuXG4iIGlmICRvcHRfdjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICIiLigkaW5pdCA/ICJOZXciIDogIlVwZGF0ZSIpLiIgJGZuOiAkc2l6ZSBieXRlc1xuIiBpZiAkb3B0X3Y7CisJCQlteSAkcGlkID0gb3BlbihteSAkRiwgJy18Jyk7CisJCQlkaWUgJCEgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJCWlmICghJHBpZCkgeworCQkJICAgIGV4ZWMoImdpdC1oYXNoLW9iamVjdCIsICItdyIsICR0bXBuYW1lKQorCQkJCW9yIGRpZSAiQ2Fubm90IGNyZWF0ZSBvYmplY3Q6ICQhXG4iOworCQkJfQorCQkJbXkgJHNoYSA9IDwkRj47CisJCQljaG9tcCAkc2hhOworCQkJY2xvc2UgJEY7CisJCQlteSAkbW9kZSA9IHBtb2RlKCRjdnMtPnsnbW9kZSd9KTsKKwkJCXB1c2goQG5ldyxbJG1vZGUsICRzaGEsICRmbl0pOyAjIG1heSBiZSByZXN1cnJlY3RlZCEKKwkJfQorCQl1bmxpbmsoJHRtcG5hbWUpOworCX0gZWxzaWYoJHN0YXRlID09IDkgYW5kIC9eXHMrKC4rPyk6XGQrKD86XC5cZCspKy0+KFxkKyg/OlwuXGQrKSspXChERUFEXClccyokLykgeworCQlteSAkZm4gPSAkMTsKKwkJJGZuID1+IHMjXi8rIyM7CisJCXB1c2goQG9sZCwkZm4pOworCQlwcmludCAiRGVsZXRlICRmblxuIiBpZiAkb3B0X3Y7CisJfSBlbHNpZigkc3RhdGUgPT0gOSBhbmQgL15ccyokLykgeworCQkkc3RhdGUgPSAxMDsKKwl9IGVsc2lmKCgkc3RhdGUgPT0gOSBvciAkc3RhdGUgPT0gMTApIGFuZCAvXi0rJC8pIHsKKwkJJGNvbW1pdGNvdW50Kys7CisJCWlmICgkb3B0X0wgJiYgJGNvbW1pdGNvdW50ID4gJG9wdF9MKSB7CisJCQlsYXN0OworCQl9CisJCWNvbW1pdCgpOworCQlpZiAoKCRjb21taXRjb3VudCAmIDEwMjMpID09IDApIHsKKwkJCXN5c3RlbSgiZ2l0IHJlcGFjayAtYSAtZCIpOworCQl9CisJCSRzdGF0ZSA9IDE7CisJfSBlbHNpZigkc3RhdGUgPT0gMTEgYW5kIC9eLSskLykgeworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYoL14tKyQvKSB7ICMgZW5kIG9mIHVua25vd24tbGluZSBwcm9jZXNzaW5nCisJCSRzdGF0ZSA9IDE7CisJfSBlbHNpZigkc3RhdGUgIT0gMTEpIHsgIyBpZ25vcmUgc3R1ZmYgd2hlbiBza2lwcGluZworCQlwcmludCAiKiBVTktOT1dOIExJTkUgKiAkX1xuIjsKKwl9Cit9Citjb21taXQoKSBpZiAkYnJhbmNoIGFuZCAkc3RhdGUgIT0gMTE7CisKK3VubGluaygkZ2l0X2luZGV4KTsKKworaWYgKGRlZmluZWQgJG9yaWdfZ2l0X2luZGV4KSB7CisJJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkb3JpZ19naXRfaW5kZXg7Cit9IGVsc2UgeworCWRlbGV0ZSAkRU5We0dJVF9JTkRFWF9GSUxFfTsKK30KKworIyBOb3cgc3dpdGNoIGJhY2sgdG8gdGhlIGJyYW5jaCB3ZSB3ZXJlIGluIGJlZm9yZSBhbGwgb2YgdGhpcyBoYXBwZW5lZAoraWYoJG9yaWdfYnJhbmNoKSB7CisJcHJpbnQgIkRPTkUuXG4iIGlmICRvcHRfdjsKKwlpZiAoJG9wdF9pKSB7CisJCWV4aXQgMDsKKwl9CisJbXkgJHRpcF9hdF9lbmQgPSBgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEYDsKKwlpZiAoJHRpcF9hdF9zdGFydCBuZSAkdGlwX2F0X2VuZCkgeworCQlmb3IgKCR0aXBfYXRfc3RhcnQsICR0aXBfYXRfZW5kKSB7IGNob21wOyB9CisJCXByaW50ICJGZXRjaGVkIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLlxuIiBpZiAkb3B0X3Y7CisJCXN5c3RlbShxdyhnaXQtcmVhZC10cmVlIC11IC1tKSwKKwkJICAgICAgICR0aXBfYXRfc3RhcnQsICR0aXBfYXRfZW5kKTsKKwkJZGllICJGYXN0LWZvcndhcmQgdXBkYXRlIGZhaWxlZDogJD9cbiIgaWYgJD87CisJfQorCWVsc2UgeworCQlzeXN0ZW0ocXcoZ2l0LW1lcmdlIGN2c2ltcG9ydCBIRUFEKSwgInJlZnMvaGVhZHMvJG9wdF9vIik7CisJCWRpZSAiQ291bGQgbm90IG1lcmdlICRvcHRfbyBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiIgaWYgJD87CisJfQorfSBlbHNlIHsKKwkkb3JpZ19icmFuY2ggPSAibWFzdGVyIjsKKwlwcmludCAiRE9ORTsgY3JlYXRpbmcgJG9yaWdfYnJhbmNoIGJyYW5jaFxuIiBpZiAkb3B0X3Y7CisJc3lzdGVtKCJnaXQtdXBkYXRlLXJlZiIsICJyZWZzL2hlYWRzL21hc3RlciIsICJyZWZzL2hlYWRzLyRvcHRfbyIpCisJCXVubGVzcyAtZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiOworCXN5c3RlbSgnZ2l0LXVwZGF0ZS1yZWYnLCAnSEVBRCcsICIkb3JpZ19icmFuY2giKTsKKwl1bmxlc3MgKCRvcHRfaSkgeworCQlzeXN0ZW0oJ2dpdCBjaGVja291dCcpOworCQlkaWUgImNoZWNrb3V0IGZhaWxlZDogJD9cbiIgaWYgJD87CisJfQorfQpkaWZmIC0tZ2l0IGEvZ2l0LWN2c3NlcnZlci5wZXJsIGIvZ2l0LWN2c3NlcnZlci5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjY2NhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY3Zzc2VydmVyLnBlcmwKQEAgLTAsMCArMSwyNjkyIEBACisjIS91c3IvYmluL3BlcmwKKworIyMjIworIyMjIyBUaGlzIGFwcGxpY2F0aW9uIGlzIGEgQ1ZTIGVtdWxhdGlvbiBsYXllciBmb3IgZ2l0LgorIyMjIyBJdCBpcyBpbnRlbmRlZCBmb3IgY2xpZW50cyB0byBjb25uZWN0IG92ZXIgU1NILgorIyMjIyBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyMjIyMKKyMjIyMgQ29weXJpZ2h0IFRoZSBPcGVuIFVuaXZlcnNpdHkgVUsgLSAyMDA2LgorIyMjIworIyMjIyBBdXRob3JzOiBNYXJ0eW4gU21pdGggICAgPG1hcnR5bkBjYXRhbHlzdC5uZXQubno+CisjIyMjICAgICAgICAgIE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4KKyMjIyMKKyMjIyMKKyMjIyMgUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIyMjIworIyMjIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmNudGw7Cit1c2UgRmlsZTo6VGVtcCBxdy90ZW1wZGlyIHRlbXBmaWxlLzsKK3VzZSBGaWxlOjpCYXNlbmFtZTsKKworbXkgJGxvZyA9IEdJVENWUzo6bG9nLT5uZXcoKTsKK215ICRjZmc7CisKK215ICREQVRFX0xJU1QgPSB7CisgICAgSmFuID0+ICIwMSIsCisgICAgRmViID0+ICIwMiIsCisgICAgTWFyID0+ICIwMyIsCisgICAgQXByID0+ICIwNCIsCisgICAgTWF5ID0+ICIwNSIsCisgICAgSnVuID0+ICIwNiIsCisgICAgSnVsID0+ICIwNyIsCisgICAgQXVnID0+ICIwOCIsCisgICAgU2VwID0+ICIwOSIsCisgICAgT2N0ID0+ICIxMCIsCisgICAgTm92ID0+ICIxMSIsCisgICAgRGVjID0+ICIxMiIsCit9OworCisjIEVuYWJsZSBhdXRvZmx1c2ggZm9yIFNURE9VVCAob3RoZXJ3aXNlIHRoZSB3aG9sZSB0aGluZyBmYWxscyBhcGFydCkKKyR8ID0gMTsKKworIyMjIyBEZWZpbml0aW9uIGFuZCBtYXBwaW5ncyBvZiBmdW5jdGlvbnMgIyMjIworCitteSAkbWV0aG9kcyA9IHsKKyAgICAnUm9vdCcgICAgICAgICAgICA9PiBcJnJlcV9Sb290LAorICAgICdWYWxpZC1yZXNwb25zZXMnID0+IFwmcmVxX1ZhbGlkcmVzcG9uc2VzLAorICAgICd2YWxpZC1yZXF1ZXN0cycgID0+IFwmcmVxX3ZhbGlkcmVxdWVzdHMsCisgICAgJ0RpcmVjdG9yeScgICAgICAgPT4gXCZyZXFfRGlyZWN0b3J5LAorICAgICdFbnRyeScgICAgICAgICAgID0+IFwmcmVxX0VudHJ5LAorICAgICdNb2RpZmllZCcgICAgICAgID0+IFwmcmVxX01vZGlmaWVkLAorICAgICdVbmNoYW5nZWQnICAgICAgID0+IFwmcmVxX1VuY2hhbmdlZCwKKyAgICAnUXVlc3Rpb25hYmxlJyAgICA9PiBcJnJlcV9RdWVzdGlvbmFibGUsCisgICAgJ0FyZ3VtZW50JyAgICAgICAgPT4gXCZyZXFfQXJndW1lbnQsCisgICAgJ0FyZ3VtZW50eCcgICAgICAgPT4gXCZyZXFfQXJndW1lbnQsCisgICAgJ2V4cGFuZC1tb2R1bGVzJyAgPT4gXCZyZXFfZXhwYW5kbW9kdWxlcywKKyAgICAnYWRkJyAgICAgICAgICAgICA9PiBcJnJlcV9hZGQsCisgICAgJ3JlbW92ZScgICAgICAgICAgPT4gXCZyZXFfcmVtb3ZlLAorICAgICdjbycgICAgICAgICAgICAgID0+IFwmcmVxX2NvLAorICAgICd1cGRhdGUnICAgICAgICAgID0+IFwmcmVxX3VwZGF0ZSwKKyAgICAnY2knICAgICAgICAgICAgICA9PiBcJnJlcV9jaSwKKyAgICAnZGlmZicgICAgICAgICAgICA9PiBcJnJlcV9kaWZmLAorICAgICdsb2cnICAgICAgICAgICAgID0+IFwmcmVxX2xvZywKKyAgICAncmxvZycgICAgICAgICAgICA9PiBcJnJlcV9sb2csCisgICAgJ3RhZycgICAgICAgICAgICAgPT4gXCZyZXFfQ0FUQ0hBTEwsCisgICAgJ3N0YXR1cycgICAgICAgICAgPT4gXCZyZXFfc3RhdHVzLAorICAgICdhZG1pbicgICAgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorICAgICdoaXN0b3J5JyAgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorICAgICd3YXRjaGVycycgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorICAgICdlZGl0b3JzJyAgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorICAgICdhbm5vdGF0ZScgICAgICAgID0+IFwmcmVxX2Fubm90YXRlLAorICAgICdHbG9iYWxfb3B0aW9uJyAgID0+IFwmcmVxX0dsb2JhbG9wdGlvbiwKKyAgICAjJ2Fubm90YXRlJyAgICAgICAgPT4gXCZyZXFfQ0FUQ0hBTEwsCit9OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyAkc3RhdGUgaG9sZHMgYWxsIHRoZSBiaXRzIG9mIGluZm9ybWF0aW9uIHRoZSBjbGllbnRzIHNlbmRzIHVzIHRoYXQgY291bGQKKyMgcG90ZW50aWFsbHkgYmUgdXNlZnVsIHdoZW4gaXQgY29tZXMgdG8gYWN0dWFsbHkgX2RvaW5nXyBzb21ldGhpbmcuCitteSAkc3RhdGUgPSB7fTsKKyRsb2ctPmluZm8oIi0tLS0tLS0tLS0tLS0tLSBTVEFSVElORyAtLS0tLS0tLS0tLS0tLS0tLSIpOworCitteSAkVEVNUF9ESVIgPSB0ZW1wZGlyKCBDTEVBTlVQID0+IDEgKTsKKyRsb2ctPmRlYnVnKCJUZW1wb3JhcnkgZGlyZWN0b3J5IGlzICckVEVNUF9ESVInIik7CisKKyMgaWYgd2UgYXJlIGNhbGxlZCB3aXRoIGEgcHNlcnZlciBhcmd1bWVudCwKKyMgZGVhbCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiBjYXQgYmVmb3JlIGVudGVyaW5nIHRoZQorIyBtYWluIGxvb3AKK2lmIChAQVJHViAmJiAkQVJHVlswXSBlcSAncHNlcnZlcicpIHsKKyAgICBteSAkbGluZSA9IDxTVERJTj47IGNob21wICRsaW5lOworICAgIHVubGVzcyggJGxpbmUgZXEgJ0JFR0lOIEFVVEggUkVRVUVTVCcpIHsKKyAgICAgICBkaWUgIkUgRG8gbm90IHVuZGVyc3RhbmQgJGxpbmUgLSBleHBlY3RpbmcgQkVHSU4gQVVUSCBSRVFVRVNUXG4iOworICAgIH0KKyAgICAkbGluZSA9IDxTVERJTj47IGNob21wICRsaW5lOworICAgIHJlcV9Sb290KCdyb290JywgJGxpbmUpICMgcmV1c2UgUm9vdAorICAgICAgIG9yIGRpZSAiRSBJbnZhbGlkIHJvb3QgJGxpbmUgXG4iOworICAgICRsaW5lID0gPFNURElOPjsgY2hvbXAgJGxpbmU7CisgICAgdW5sZXNzICgkbGluZSBlcSAnYW5vbnltb3VzJykgeworICAgICAgIHByaW50ICJFIE9ubHkgYW5vbnltb3VzIHVzZXIgYWxsb3dlZCB2aWEgcHNlcnZlclxuIjsKKyAgICAgICBwcmludCAiSSBIQVRFIFlPVVxuIjsKKyAgICB9CisgICAgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsgICAgIyB2YWxpZGF0ZSB0aGUgcGFzc3dvcmQ/CisgICAgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsKKyAgICB1bmxlc3MgKCRsaW5lIGVxICdFTkQgQVVUSCBSRVFVRVNUJykgeworICAgICAgIGRpZSAiRSBEbyBub3QgdW5kZXJzdGFuZCAkbGluZSAtLSBleHBlY3RpbmcgRU5EIEFVVEggUkVRVUVTVFxuIjsKKyAgICB9CisgICAgcHJpbnQgIkkgTE9WRSBZT1VcbiI7CisgICAgIyBhbmQgbm93IGJhY2sgdG8gb3VyIHJlZ3VsYXIgcHJvZ3JhbW1lLi4uCit9CisKKyMgS2VlcCBnb2luZyB1bnRpbCB0aGUgY2xpZW50IGNsb3NlcyB0aGUgY29ubmVjdGlvbgord2hpbGUgKDxTVERJTj4pCit7CisgICAgY2hvbXA7CisKKyAgICAjIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBzZWVuIHRoaXMgbWV0aG9kLCBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbi4KKyAgICBpZiAoIC9eKFtcdy1dKykoPzpccysoLiopKT8kLyBhbmQgZGVmaW5lZCgkbWV0aG9kcy0+eyQxfSkgKQorICAgIHsKKyAgICAgICAgIyB1c2UgdGhlICRtZXRob2RzIGhhc2ggdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgc3ViIGZvciB0aGlzIGNvbW1hbmQKKyAgICAgICAgIyRsb2ctPmluZm8oIk1ldGhvZCA6ICQxIik7CisgICAgICAgICZ7JG1ldGhvZHMtPnskMX19KCQxLCQyKTsKKyAgICB9IGVsc2UgeworICAgICAgICAjIGxvZyBmYXRhbCBiZWNhdXNlIHdlIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbi4gSWYgdGhpcyBoYXBwZW5zCisgICAgICAgICMgd2UncmUgZmFpcmx5IHNjcmV3ZWQgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBjbGllbnQgaXMgZXhwZWN0aW5nCisgICAgICAgICMgYSByZXNwb25zZS4gSWYgaXQgaXMsIHRoZSBjbGllbnQgd2lsbCBoYW5nLCB3ZSdsbCBoYW5nLCBhbmQgdGhlIHdob2xlCisgICAgICAgICMgdGhpbmcgd2lsbCBiZSBjdXN0YXJkLgorICAgICAgICAkbG9nLT5mYXRhbCgiRG9uJ3QgdW5kZXJzdGFuZCBjb21tYW5kICRfXG4iKTsKKyAgICAgICAgZGllKCJVbmtub3duIGNvbW1hbmQgJF8iKTsKKyAgICB9Cit9CisKKyRsb2ctPmRlYnVnKCJQcm9jZXNzaW5nIHRpbWUgOiB1c2VyPSIgLiAodGltZXMpWzBdIC4gIiBzeXN0ZW09IiAuICh0aW1lcylbMV0pOworJGxvZy0+aW5mbygiLS0tLS0tLS0tLS0tLS0tIEZJTklTSCAtLS0tLS0tLS0tLS0tLS0tLSIpOworCisjIE1hZ2ljIGNhdGNoYWxsIG1ldGhvZC4KKyMgICAgVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBoYW5kbGUgYWxsIGNvbW1hbmRzIHdlIGhhdmVuJ3QgeWV0CisjICAgIGltcGxlbWVudGVkLiBJdCBzaW1wbHkgc2VuZHMgYSB3YXJuaW5nIHRvIHRoZSBsb2cgZmlsZSBpbmRpY2F0aW5nIGEKKyMgICAgY29tbWFuZCB0aGF0IGhhc24ndCBiZWVuIGltcGxlbWVudGVkIGhhcyBiZWVuIGludm9rZWQuCitzdWIgcmVxX0NBVENIQUxMCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisgICAgJGxvZy0+d2FybigiVW5oYW5kbGVkIGNvbW1hbmQgOiByZXFfJGNtZCA6ICRkYXRhIik7Cit9CisKKworIyBSb290IHBhdGhuYW1lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRlbGwgdGhlIHNlcnZlciB3aGljaCBDVlNST09UIHRvIHVzZS4gTm90ZSB0aGF0CisjICAgICBwYXRobmFtZSBpcyBhIGxvY2FsIGRpcmVjdG9yeSBhbmQgbm90IGEgZnVsbHkgcXVhbGlmaWVkIENWU1JPT1QgdmFyaWFibGUuCisjICAgICBwYXRobmFtZSBtdXN0IGFscmVhZHkgZXhpc3Q7IGlmIGNyZWF0aW5nIGEgbmV3IHJvb3QsIHVzZSB0aGUgaW5pdAorIyAgICAgcmVxdWVzdCwgbm90IFJvb3QuIHBhdGhuYW1lIGRvZXMgbm90IGluY2x1ZGUgdGhlIGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXIsCisjICAgICBob3cgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIsIGV0Yy47IGJ5IHRoZSB0aW1lIHRoZSBDVlMgcHJvdG9jb2wgaXMgaW4gdXNlLAorIyAgICAgY29ubmVjdGlvbiwgYXV0aGVudGljYXRpb24sIGV0Yy4sIGFyZSBhbHJlYWR5IHRha2VuIGNhcmUgb2YuIFRoZSBSb290CisjICAgICByZXF1ZXN0IG11c3QgYmUgc2VudCBvbmx5IG9uY2UsIGFuZCBpdCBtdXN0IGJlIHNlbnQgYmVmb3JlIGFueSByZXF1ZXN0cworIyAgICAgb3RoZXIgdGhhbiBWYWxpZC1yZXNwb25zZXMsIHZhbGlkLXJlcXVlc3RzLCBVc2VVbmNoYW5nZWQsIFNldCBvciBpbml0Lgorc3ViIHJlcV9Sb290Cit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisgICAgJGxvZy0+ZGVidWcoInJlcV9Sb290IDogJGRhdGEiKTsKKworICAgICRzdGF0ZS0+e0NWU1JPT1R9ID0gJGRhdGE7CisKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyI7CisgICAgdW5sZXNzICgtZCAkRU5We0dJVF9ESVJ9ICYmIC1lICRFTlZ7R0lUX0RJUn0uJ0hFQUQnKSB7CisgICAgICAgcHJpbnQgIkUgJEVOVntHSVRfRElSfSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgdmFsaWQgR0lUIHJlcG9zaXRvcnlcbiI7CisgICAgICAgIHByaW50ICJFIFxuIjsKKyAgICAgICAgcHJpbnQgImVycm9yIDEgJEVOVntHSVRfRElSfSBpcyBub3QgYSB2YWxpZCByZXBvc2l0b3J5XG4iOworICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG15IEBnaXR2YXJzID0gYGdpdC1yZXBvLWNvbmZpZyAtbGA7CisgICAgaWYgKCQ/KSB7CisgICAgICAgcHJpbnQgIkUgcHJvYmxlbXMgZXhlY3V0aW5nIGdpdC1yZXBvLWNvbmZpZyBvbiB0aGUgc2VydmVyIC0tIHRoaXMgaXMgbm90IGEgZ2l0IHJlcG9zaXRvcnkgb3IgdGhlIFBBVEggaXMgbm90IHNldCBjb3JyZWN0bHkuXG4iOworICAgICAgICBwcmludCAiRSBcbiI7CisgICAgICAgIHByaW50ICJlcnJvciAxIC0gcHJvYmxlbSBleGVjdXRpbmcgZ2l0LXJlcG8tY29uZmlnXG4iOworICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGdpdHZhcnMgKQorICAgIHsKKyAgICAgICAgbmV4dCB1bmxlc3MgKCAkbGluZSA9fiAvXiguKj8pXC4oLio/KT0oLiopJC8gKTsKKyAgICAgICAgJGNmZy0+eyQxfXskMn0gPSAkMzsKKyAgICB9CisKKyAgICB1bmxlc3MgKCBkZWZpbmVkICggJGNmZy0+e2dpdGN2c317ZW5hYmxlZH0gKSBhbmQgJGNmZy0+e2dpdGN2c317ZW5hYmxlZH0gPX4gL15ccyooMXx0cnVlfHllcylccyokL2kgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgR0lUQ1ZTIGVtdWxhdGlvbiBuZWVkcyB0byBiZSBlbmFibGVkIG9uIHRoaXMgcmVwb1xuIjsKKyAgICAgICAgcHJpbnQgIkUgdGhlIHJlcG8gY29uZmlnIGZpbGUgbmVlZHMgYSBbZ2l0Y3ZzXSBzZWN0aW9uIGFkZGVkLCBhbmQgdGhlIHBhcmFtZXRlciAnZW5hYmxlZCcgc2V0IHRvIDFcbiI7CisgICAgICAgIHByaW50ICJFIFxuIjsKKyAgICAgICAgcHJpbnQgImVycm9yIDEgR0lUQ1ZTIGVtdWxhdGlvbiBkaXNhYmxlZFxuIjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCBkZWZpbmVkICggJGNmZy0+e2dpdGN2c317bG9nZmlsZX0gKSApCisgICAgeworICAgICAgICAkbG9nLT5zZXRmaWxlKCRjZmctPntnaXRjdnN9e2xvZ2ZpbGV9KTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbG9nLT5ub2ZpbGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworIyBHbG9iYWxfb3B0aW9uIG9wdGlvbiBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBUcmFuc21pdCBvbmUgb2YgdGhlIGdsb2JhbCBvcHRpb25zIGAtcScsIGAtUScsCisjICAgICBgLWwnLCBgLXQnLCBgLXInLCBvciBgLW4nLiBvcHRpb24gbXVzdCBiZSBvbmUgb2YgdGhvc2Ugc3RyaW5ncywgbm8KKyMgICAgIHZhcmlhdGlvbnMgKHN1Y2ggYXMgY29tYmluaW5nIG9mIG9wdGlvbnMpIGFyZSBhbGxvd2VkLiBGb3IgZ3JhY2VmdWwKKyMgICAgIGhhbmRsaW5nIG9mIHZhbGlkLXJlcXVlc3RzLCBpdCBpcyBwcm9iYWJseSBiZXR0ZXIgdG8gbWFrZSBuZXcgZ2xvYmFsCisjICAgICBvcHRpb25zIHNlcGFyYXRlIHJlcXVlc3RzLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gYWRkIHRoZW0gdG8gdGhpcworIyAgICAgcmVxdWVzdC4KK3N1YiByZXFfR2xvYmFsb3B0aW9uCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisgICAgJGxvZy0+ZGVidWcoInJlcV9HbG9iYWxvcHRpb24gOiAkZGF0YSIpOworICAgICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9eyRkYXRhfSA9IDE7Cit9CisKKyMgVmFsaWQtcmVzcG9uc2VzIHJlcXVlc3QtbGlzdCBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBUZWxsIHRoZSBzZXJ2ZXIgd2hhdCByZXNwb25zZXMgdGhlIGNsaWVudCB3aWxsCisjICAgICBhY2NlcHQuIHJlcXVlc3QtbGlzdCBpcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHRva2Vucy4KK3N1YiByZXFfVmFsaWRyZXNwb25zZXMKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKyAgICAkbG9nLT5kZWJ1ZygicmVxX1ZhbGlkcmVzcG9uc2VzIDogJGRhdGEiKTsKKworICAgICMgVE9ETyA6IHJlLWVuYWJsZSB0aGlzLCBjdXJyZW50bHkgaXQncyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bAorICAgICMkc3RhdGUtPnt2YWxpZHJlc3BvbnNlc30gPSBbIHNwbGl0IC9ccysvLCAkZGF0YSBdOworfQorCisjIHZhbGlkLXJlcXVlc3RzIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogeWVzLiBBc2sgdGhlIHNlcnZlciB0byBzZW5kIGJhY2sgYSBWYWxpZC1yZXF1ZXN0cworIyAgICAgcmVzcG9uc2UuCitzdWIgcmVxX3ZhbGlkcmVxdWVzdHMKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfdmFsaWRyZXF1ZXN0cyIpOworCisgICAgJGxvZy0+ZGVidWcoIlNFTkQgOiBWYWxpZC1yZXF1ZXN0cyAiIC4gam9pbigiICIsa2V5cyAlJG1ldGhvZHMpKTsKKyAgICAkbG9nLT5kZWJ1ZygiU0VORCA6IG9rIik7CisKKyAgICBwcmludCAiVmFsaWQtcmVxdWVzdHMgIiAuIGpvaW4oIiAiLGtleXMgJSRtZXRob2RzKSAuICJcbiI7CisgICAgcHJpbnQgIm9rXG4iOworfQorCisjIERpcmVjdG9yeSBsb2NhbC1kaXJlY3RvcnkgXG4KKyMgICAgIEFkZGl0aW9uYWwgZGF0YTogcmVwb3NpdG9yeSBcbi4gUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBUZWxsIHRoZSBzZXJ2ZXIKKyMgICAgIHdoYXQgZGlyZWN0b3J5IHRvIHVzZS4gVGhlIHJlcG9zaXRvcnkgc2hvdWxkIGJlIGEgZGlyZWN0b3J5IG5hbWUgZnJvbSBhCisjICAgICBwcmV2aW91cyBzZXJ2ZXIgcmVzcG9uc2UuIE5vdGUgdGhhdCB0aGlzIGJvdGggZ2l2ZXMgYSBkZWZhdWx0IGZvciBFbnRyeQorIyAgICAgYW5kIE1vZGlmaWVkIGFuZCBhbHNvIGZvciBjaSBhbmQgdGhlIG90aGVyIGNvbW1hbmRzOyBub3JtYWwgdXNhZ2UgaXMgdG8KKyMgICAgIHNlbmQgRGlyZWN0b3J5IGZvciBlYWNoIGRpcmVjdG9yeSBpbiB3aGljaCB0aGVyZSB3aWxsIGJlIGFuIEVudHJ5IG9yCisjICAgICBNb2RpZmllZCwgYW5kIHRoZW4gYSBmaW5hbCBEaXJlY3RvcnkgZm9yIHRoZSBvcmlnaW5hbCBkaXJlY3RvcnksIHRoZW4gdGhlCisjICAgICBjb21tYW5kLiBUaGUgbG9jYWwtZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgYXQgd2hpY2ggdGhlCisjICAgICBjb21tYW5kIGlzIG9jY3VycmluZyAoaS5lLiB0aGUgbGFzdCBEaXJlY3Rvcnkgd2hpY2ggaXMgc2VudCBiZWZvcmUgdGhlCisjICAgICBjb21tYW5kKTsgdG8gaW5kaWNhdGUgdGhhdCB0b3AgbGV2ZWwsIGAuJyBzaG91bGQgYmUgc2VudCBmb3IKKyMgICAgIGxvY2FsLWRpcmVjdG9yeS4KK3N1YiByZXFfRGlyZWN0b3J5Cit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBteSAkcmVwb3NpdG9yeSA9IDxTVERJTj47CisgICAgY2hvbXAgJHJlcG9zaXRvcnk7CisKKworICAgICRzdGF0ZS0+e2xvY2FsZGlyfSA9ICRkYXRhOworICAgICRzdGF0ZS0+e3JlcG9zaXRvcnl9ID0gJHJlcG9zaXRvcnk7CisgICAgJHN0YXRlLT57cGF0aH0gPSAkcmVwb3NpdG9yeTsKKyAgICAkc3RhdGUtPntwYXRofSA9fiBzL14kc3RhdGUtPntDVlNST09UfVwvLy87CisgICAgJHN0YXRlLT57bW9kdWxlfSA9ICQxIGlmICgkc3RhdGUtPntwYXRofSA9fiBzL14oLio/KShcL3wkKS8vKTsKKyAgICAkc3RhdGUtPntwYXRofSAuPSAiLyIgaWYgKCAkc3RhdGUtPntwYXRofSA9fiAvXFMvICk7CisKKyAgICAkc3RhdGUtPntkaXJlY3Rvcnl9ID0gJHN0YXRlLT57bG9jYWxkaXJ9OworICAgICRzdGF0ZS0+e2RpcmVjdG9yeX0gPSAiIiBpZiAoICRzdGF0ZS0+e2RpcmVjdG9yeX0gZXEgIi4iICk7CisgICAgJHN0YXRlLT57ZGlyZWN0b3J5fSAuPSAiLyIgaWYgKCAkc3RhdGUtPntkaXJlY3Rvcnl9ID1+IC9cUy8gKTsKKworICAgIGlmICggbm90IGRlZmluZWQoJHN0YXRlLT57cHJlcGVuZGRpcn0pIGFuZCAkc3RhdGUtPntsb2NhbGRpcn0gZXEgIi4iIGFuZCAkc3RhdGUtPntwYXRofSA9fiAvXFMvICkKKyAgICB7CisgICAgICAgICRsb2ctPmluZm8oIlNldHRpbmcgcHJlcGVuZCB0byAnJHN0YXRlLT57cGF0aH0nIik7CisgICAgICAgICRzdGF0ZS0+e3ByZXBlbmRkaXJ9ID0gJHN0YXRlLT57cGF0aH07CisgICAgICAgIGZvcmVhY2ggbXkgJGVudHJ5ICgga2V5cyAleyRzdGF0ZS0+e2VudHJpZXN9fSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e3ByZXBlbmRkaXJ9IC4gJGVudHJ5fSA9ICRzdGF0ZS0+e2VudHJpZXN9eyRlbnRyeX07CisgICAgICAgICAgICBkZWxldGUgJHN0YXRlLT57ZW50cmllc317JGVudHJ5fTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e3ByZXBlbmRkaXJ9ICkgKQorICAgIHsKKyAgICAgICAgJGxvZy0+ZGVidWcoIlByZXBlbmRpbmcgJyRzdGF0ZS0+e3ByZXBlbmRkaXJ9JyB0byBzdGF0ZXxkaXJlY3RvcnkiKTsKKyAgICAgICAgJHN0YXRlLT57ZGlyZWN0b3J5fSA9ICRzdGF0ZS0+e3ByZXBlbmRkaXJ9IC4gJHN0YXRlLT57ZGlyZWN0b3J5fQorICAgIH0KKyAgICAkbG9nLT5kZWJ1ZygicmVxX0RpcmVjdG9yeSA6IGxvY2FsZGlyPSRkYXRhIHJlcG9zaXRvcnk9JHJlcG9zaXRvcnkgcGF0aD0kc3RhdGUtPntwYXRofSBkaXJlY3Rvcnk9JHN0YXRlLT57ZGlyZWN0b3J5fSBtb2R1bGU9JHN0YXRlLT57bW9kdWxlfSIpOworfQorCisjIEVudHJ5IGVudHJ5LWxpbmUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVGVsbCB0aGUgc2VydmVyIHdoYXQgdmVyc2lvbiBvZiBhIGZpbGUgaXMgb24gdGhlCisjICAgICBsb2NhbCBtYWNoaW5lLiBUaGUgbmFtZSBpbiBlbnRyeS1saW5lIGlzIGEgbmFtZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5CisjICAgICBtb3N0IHJlY2VudGx5IHNwZWNpZmllZCB3aXRoIERpcmVjdG9yeS4gSWYgdGhlIHVzZXIgaXMgb3BlcmF0aW5nIG9uIG9ubHkKKyMgICAgIHNvbWUgZmlsZXMgaW4gYSBkaXJlY3RvcnksIEVudHJ5IHJlcXVlc3RzIGZvciBvbmx5IHRob3NlIGZpbGVzIG5lZWQgYmUKKyMgICAgIGluY2x1ZGVkLiBJZiBhbiBFbnRyeSByZXF1ZXN0IGlzIHNlbnQgd2l0aG91dCBNb2RpZmllZCwgSXMtbW9kaWZpZWQsIG9yCisjICAgICBVbmNoYW5nZWQsIGl0IG1lYW5zIHRoZSBmaWxlIGlzIGxvc3QgKGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JraW5nCisjICAgICBkaXJlY3RvcnkpLiBJZiBib3RoIEVudHJ5IGFuZCBvbmUgb2YgTW9kaWZpZWQsIElzLW1vZGlmaWVkLCBvciBVbmNoYW5nZWQKKyMgICAgIGFyZSBzZW50IGZvciB0aGUgc2FtZSBmaWxlLCBFbnRyeSBtdXN0IGJlIHNlbnQgZmlyc3QuIEZvciBhIGdpdmVuIGZpbGUsCisjICAgICBvbmUgY2FuIHNlbmQgTW9kaWZpZWQsIElzLW1vZGlmaWVkLCBvciBVbmNoYW5nZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uZQorIyAgICAgb2YgdGhlc2UgdGhyZWUuCitzdWIgcmVxX0VudHJ5Cit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAjJGxvZy0+ZGVidWcoInJlcV9FbnRyeSA6ICRkYXRhIik7CisKKyAgICBteSBAZGF0YSA9IHNwbGl0KC9cLy8sICRkYXRhKTsKKworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGFbMV19ID0geworICAgICAgICByZXZpc2lvbiAgICA9PiAkZGF0YVsyXSwKKyAgICAgICAgY29uZmxpY3QgICAgPT4gJGRhdGFbM10sCisgICAgICAgIG9wdGlvbnMgICAgID0+ICRkYXRhWzRdLAorICAgICAgICB0YWdfb3JfZGF0ZSA9PiAkZGF0YVs1XSwKKyAgICB9OworCisgICAgJGxvZy0+aW5mbygiUmVjZWl2ZWQgZW50cnkgbGluZSAnJGRhdGEnID0+ICciIC4gJHN0YXRlLT57ZGlyZWN0b3J5fSAuICRkYXRhWzFdIC4gIiciKTsKK30KKworIyBRdWVzdGlvbmFibGUgZmlsZW5hbWUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gQWRkaXRpb25hbCBkYXRhOiBuby4gVGVsbCB0aGUgc2VydmVyIHRvIGNoZWNrCisjICAgICB3aGV0aGVyIGZpbGVuYW1lIHNob3VsZCBiZSBpZ25vcmVkLCBhbmQgaWYgbm90LCBuZXh0IHRpbWUgdGhlIHNlcnZlcgorIyAgICAgc2VuZHMgcmVzcG9uc2VzLCBzZW5kIChpbiBhIE0gcmVzcG9uc2UpIGA/JyBmb2xsb3dlZCBieSB0aGUgZGlyZWN0b3J5IGFuZAorIyAgICAgZmlsZW5hbWUuIGZpbGVuYW1lIG11c3Qgbm90IGNvbnRhaW4gYC8nOyBpdCBuZWVkcyB0byBiZSBhIGZpbGUgaW4gdGhlCisjICAgICBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIG1vc3QgcmVjZW50IERpcmVjdG9yeSByZXF1ZXN0Lgorc3ViIHJlcV9RdWVzdGlvbmFibGUKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfUXVlc3Rpb25hYmxlIDogJGRhdGEiKTsKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXtxdWVzdGlvbmFibGV9ID0gMTsKK30KKworIyBhZGQgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEFkZCBhIGZpbGUgb3IgZGlyZWN0b3J5LiBUaGlzIHVzZXMgYW55IHByZXZpb3VzCisjICAgICBBcmd1bWVudCwgRGlyZWN0b3J5LCBFbnRyeSwgb3IgTW9kaWZpZWQgcmVxdWVzdHMsIGlmIHRoZXkgaGF2ZSBiZWVuIHNlbnQuCisjICAgICBUaGUgbGFzdCBEaXJlY3Rvcnkgc2VudCBzcGVjaWZpZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGF0IHRoZSB0aW1lIG9mCisjICAgICB0aGUgb3BlcmF0aW9uLiBUbyBhZGQgYSBkaXJlY3RvcnksIHNlbmQgdGhlIGRpcmVjdG9yeSB0byBiZSBhZGRlZCB1c2luZworIyAgICAgRGlyZWN0b3J5IGFuZCBBcmd1bWVudCByZXF1ZXN0cy4KK3N1YiByZXFfYWRkCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiYWRkIik7CisKKyAgICBteSAkYWRkY291bnQgPSAwOworCisgICAgZm9yZWFjaCBteSAkZmlsZW5hbWUgKCBAeyRzdGF0ZS0+e2FyZ3N9fSApCisgICAgeworICAgICAgICAkZmlsZW5hbWUgPSBmaWxlY2xlYW51cCgkZmlsZW5hbWUpOworCisgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIGFkZDogbm90aGluZyBrbm93biBhYm91dCBgJGZpbGVuYW1lJ1xuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKyAgICAgICAgIyBUT0RPIDogY2hlY2sgd2UncmUgbm90IHNxdWFzaGluZyBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IGAkZmlsZW5hbWUnIGhhcyBhbHJlYWR5IGJlZW4gZW50ZXJlZFxuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lLCAxKTsKKworICAgICAgICBwcmludCAiRSBjdnMgYWRkOiBzY2hlZHVsaW5nIGZpbGUgYCRmaWxlbmFtZScgZm9yIGFkZGl0aW9uXG4iOworCisgICAgICAgIHByaW50ICJDaGVja2VkLWluICRkaXJwYXJ0XG4iOworICAgICAgICBwcmludCAiJGZpbGVuYW1lXG4iOworICAgICAgICBwcmludCAiLyRmaWxlcGFydC8wLy8vXG4iOworCisgICAgICAgICRhZGRjb3VudCsrOworICAgIH0KKworICAgIGlmICggJGFkZGNvdW50ID09IDEgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgY3ZzIGFkZDogdXNlIGBjdnMgY29tbWl0JyB0byBhZGQgdGhpcyBmaWxlIHBlcm1hbmVudGx5XG4iOworICAgIH0KKyAgICBlbHNpZiAoICRhZGRjb3VudCA+IDEgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgY3ZzIGFkZDogdXNlIGBjdnMgY29tbWl0JyB0byBhZGQgdGhlc2UgZmlsZXMgcGVybWFuZW50bHlcbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCisjIHJlbW92ZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IHllcy4gUmVtb3ZlIGEgZmlsZS4gVGhpcyB1c2VzIGFueSBwcmV2aW91cyBBcmd1bWVudCwKKyMgICAgIERpcmVjdG9yeSwgRW50cnksIG9yIE1vZGlmaWVkIHJlcXVlc3RzLCBpZiB0aGV5IGhhdmUgYmVlbiBzZW50LiBUaGUgbGFzdAorIyAgICAgRGlyZWN0b3J5IHNlbnQgc3BlY2lmaWVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhdCB0aGUgdGltZSBvZiB0aGUKKyMgICAgIG9wZXJhdGlvbi4gTm90ZSB0aGF0IHRoaXMgcmVxdWVzdCBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnl0aGluZyB0byB0aGUKKyMgICAgIHJlcG9zaXRvcnk7IHRoZSBvbmx5IGVmZmVjdCBvZiBhIHN1Y2Nlc3NmdWwgcmVtb3ZlIHJlcXVlc3QgaXMgdG8gc3VwcGx5CisjICAgICB0aGUgY2xpZW50IHdpdGggYSBuZXcgZW50cmllcyBsaW5lIGNvbnRhaW5pbmcgYC0nIHRvIGluZGljYXRlIGEgcmVtb3ZlZAorIyAgICAgZmlsZS4gSW4gZmFjdCwgdGhlIGNsaWVudCBwcm9iYWJseSBjb3VsZCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIHdpdGhvdXQKKyMgICAgIGNvbnRhY3RpbmcgdGhlIHNlcnZlciwgYWx0aG91Z2ggdXNpbmcgcmVtb3ZlIG1heSBjYXVzZSB0aGUgc2VydmVyIHRvCisjICAgICBwZXJmb3JtIGEgZmV3IG1vcmUgY2hlY2tzLiBUaGUgY2xpZW50IHNlbmRzIGEgc3Vic2VxdWVudCBjaSByZXF1ZXN0IHRvCisjICAgICBhY3R1YWxseSByZWNvcmQgdGhlIHJlbW92YWwgaW4gdGhlIHJlcG9zaXRvcnkuCitzdWIgcmVxX3JlbW92ZQoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoInJlbW92ZSIpOworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMkbG9nLT5kZWJ1ZygiYWRkIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgIG15ICRybWNvdW50ID0gMDsKKworICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0gKSBvciBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IGZpbGUgYCRmaWxlbmFtZScgc3RpbGwgaW4gd29ya2luZyBkaXJlY3RvcnlcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworICAgICAgICBteSAkd3JldiA9IHJldnBhcnNlKCRmaWxlbmFtZSk7CisKKyAgICAgICAgdW5sZXNzICggZGVmaW5lZCAoICR3cmV2ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiBub3RoaW5nIGtub3duIGFib3V0IGAkZmlsZW5hbWUnXG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZGVmaW5lZCgkd3JldikgYW5kICR3cmV2IDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IGZpbGUgYCRmaWxlbmFtZScgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIHJlbW92YWxcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgdW5sZXNzICggJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0gKQorICAgICAgICB7CisgICAgICAgICAgICAjIFRPRE8gOiBub3Qgc3VyZSBpZiB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZSBpcyBxdWl0ZSBjb3JyZWN0LgorICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogVXAgdG8gZGF0ZSBjaGVjayBmYWlsZWQgZm9yIGAkZmlsZW5hbWUnXG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisKKyAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSwgMSk7CisKKyAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogc2NoZWR1bGluZyBgJGZpbGVuYW1lJyBmb3IgcmVtb3ZhbFxuIjsKKworICAgICAgICBwcmludCAiQ2hlY2tlZC1pbiAkZGlycGFydFxuIjsKKyAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIi8kZmlsZXBhcnQvLTEuJHdyZXYvLy9cbiI7CisKKyAgICAgICAgJHJtY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoICRybWNvdW50ID09IDEgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogdXNlIGBjdnMgY29tbWl0JyB0byByZW1vdmUgdGhpcyBmaWxlIHBlcm1hbmVudGx5XG4iOworICAgIH0KKyAgICBlbHNpZiAoICRybWNvdW50ID4gMSApCisgICAgeworICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiB1c2UgYGN2cyBjb21taXQnIHRvIHJlbW92ZSB0aGVzZSBmaWxlcyBwZXJtYW5lbnRseVxuIjsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKKyMgTW9kaWZpZWQgZmlsZW5hbWUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gQWRkaXRpb25hbCBkYXRhOiBtb2RlLCBcbiwgZmlsZSB0cmFuc21pc3Npb24uIFNlbmQKKyMgICAgIHRoZSBzZXJ2ZXIgYSBjb3B5IG9mIG9uZSBsb2NhbGx5IG1vZGlmaWVkIGZpbGUuIGZpbGVuYW1lIGlzIGEgZmlsZSB3aXRoaW4KKyMgICAgIHRoZSBtb3N0IHJlY2VudCBkaXJlY3Rvcnkgc2VudCB3aXRoIERpcmVjdG9yeTsgaXQgbXVzdCBub3QgY29udGFpbiBgLycuCisjICAgICBJZiB0aGUgdXNlciBpcyBvcGVyYXRpbmcgb24gb25seSBzb21lIGZpbGVzIGluIGEgZGlyZWN0b3J5LCBvbmx5IHRob3NlCisjICAgICBmaWxlcyBuZWVkIHRvIGJlIGluY2x1ZGVkLiBUaGlzIGNhbiBhbHNvIGJlIHNlbnQgd2l0aG91dCBFbnRyeSwgaWYgdGhlcmUKKyMgICAgIGlzIG5vIGVudHJ5IGZvciB0aGUgZmlsZS4KK3N1YiByZXFfTW9kaWZpZWQKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIG15ICRtb2RlID0gPFNURElOPjsKKyAgICBjaG9tcCAkbW9kZTsKKyAgICBteSAkc2l6ZSA9IDxTVERJTj47CisgICAgY2hvbXAgJHNpemU7CisKKyAgICAjIEdyYWIgY29uZmlnIGluZm9ybWF0aW9uCisgICAgbXkgJGJsb2Nrc2l6ZSA9IDgxOTI7CisgICAgbXkgJGJ5dGVzbGVmdCA9ICRzaXplOworICAgIG15ICR0bXA7CisKKyAgICAjIEdldCBhIGZpbGVoYW5kbGUvbmFtZSB0byB3cml0ZSBpdCB0bworICAgIG15ICggJGZoLCAkZmlsZW5hbWUgKSA9IHRlbXBmaWxlKCBESVIgPT4gJFRFTVBfRElSICk7CisKKyAgICAjIExvb3Agb3ZlciBmaWxlIGRhdGEgd3JpdGluZyBvdXQgdG8gdGVtcG9yYXJ5IGZpbGUuCisgICAgd2hpbGUgKCAkYnl0ZXNsZWZ0ICkKKyAgICB7CisgICAgICAgICRibG9ja3NpemUgPSAkYnl0ZXNsZWZ0IGlmICggJGJ5dGVzbGVmdCA8ICRibG9ja3NpemUgKTsKKyAgICAgICAgcmVhZCBTVERJTiwgJHRtcCwgJGJsb2Nrc2l6ZTsKKyAgICAgICAgcHJpbnQgJGZoICR0bXA7CisgICAgICAgICRieXRlc2xlZnQgLT0gJGJsb2Nrc2l6ZTsKKyAgICB9CisKKyAgICBjbG9zZSAkZmg7CisKKyAgICAjIEVuc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBzZW5zaWJsZSBmb3IgdGhlIGZpbGUgbW9kZQorICAgIGlmICggJG1vZGUgPX4gL3U9KFx3KykvICkKKyAgICB7CisgICAgICAgICRtb2RlID0gJDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG1vZGUgPSAicnciOworICAgIH0KKworICAgICMgU2F2ZSB0aGUgZmlsZSBkYXRhIGluICRzdGF0ZQorICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e21vZGlmaWVkX2ZpbGVuYW1lfSA9ICRmaWxlbmFtZTsKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXttb2RpZmllZF9tb2RlfSA9ICRtb2RlOworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e21vZGlmaWVkX2hhc2h9ID0gYGdpdC1oYXNoLW9iamVjdCAkZmlsZW5hbWVgOworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e21vZGlmaWVkX2hhc2h9ID1+IHMvXHMuKiQvL3M7CisKKyAgICAjJGxvZy0+ZGVidWcoInJlcV9Nb2RpZmllZCA6IGZpbGU9JGRhdGEgbW9kZT0kbW9kZSBzaXplPSRzaXplIik7Cit9CisKKyMgVW5jaGFuZ2VkIGZpbGVuYW1lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRlbGwgdGhlIHNlcnZlciB0aGF0IGZpbGVuYW1lIGhhcyBub3QgYmVlbgorIyAgICAgbW9kaWZpZWQgaW4gdGhlIGNoZWNrZWQgb3V0IGRpcmVjdG9yeS4gVGhlIGZpbGVuYW1lIGlzIGEgZmlsZSB3aXRoaW4gdGhlCisjICAgICBtb3N0IHJlY2VudCBkaXJlY3Rvcnkgc2VudCB3aXRoIERpcmVjdG9yeTsgaXQgbXVzdCBub3QgY29udGFpbiBgLycuCitzdWIgcmVxX1VuY2hhbmdlZAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17dW5jaGFuZ2VkfSA9IDE7CisKKyAgICAjJGxvZy0+ZGVidWcoInJlcV9VbmNoYW5nZWQgOiAkZGF0YSIpOworfQorCisjIEFyZ3VtZW50IHRleHQgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gU2F2ZSBhcmd1bWVudCBmb3IgdXNlIGluIGEgc3Vic2VxdWVudCBjb21tYW5kLgorIyAgICAgQXJndW1lbnRzIGFjY3VtdWxhdGUgdW50aWwgYW4gYXJndW1lbnQtdXNpbmcgY29tbWFuZCBpcyBnaXZlbiwgYXQgd2hpY2gKKyMgICAgIHBvaW50IHRoZXkgYXJlIGZvcmdvdHRlbi4KKyMgQXJndW1lbnR4IHRleHQgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gQXBwZW5kIFxuIGZvbGxvd2VkIGJ5IHRleHQgdG8gdGhlIGN1cnJlbnQgYXJndW1lbnQKKyMgICAgIGJlaW5nIHNhdmVkLgorc3ViIHJlcV9Bcmd1bWVudAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgIyBUT0RPIDogIE5vdCBxdWl0ZSBzdXJlIGhvdyBBcmd1bWVudCBhbmQgQXJndW1lbnR4IGRpZmZlciwgYnV0IEkgYXNzdW1lCisgICAgIyBpdCdzIGZvciBtdWx0aS1saW5lIGFyZ3VtZW50cyAuLi4gc29tZWhvdyAuLi4KKworICAgICRsb2ctPmRlYnVnKCIkY21kIDogJGRhdGEiKTsKKworICAgIHB1c2ggQHskc3RhdGUtPnthcmd1bWVudHN9fSwgJGRhdGE7Cit9CisKKyMgZXhwYW5kLW1vZHVsZXMgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEV4cGFuZCB0aGUgbW9kdWxlcyB3aGljaCBhcmUgc3BlY2lmaWVkIGluIHRoZQorIyAgICAgYXJndW1lbnRzLiBSZXR1cm5zIHRoZSBkYXRhIGluIE1vZHVsZS1leHBhbnNpb24gcmVzcG9uc2VzLiBOb3RlIHRoYXQgdGhlCisjICAgICBzZXJ2ZXIgY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgY2hlY2tvdXQgb3IgZXhwb3J0LCBub3QgcnRhZyBvciByZGlmZjsgdGhlCisjICAgICBsYXR0ZXIgZG8gbm90IGFjY2VzcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIHRodXMgaGF2ZSBubyBuZWVkIHRvCisjICAgICBleHBhbmQgbW9kdWxlcyBvbiB0aGUgY2xpZW50IHNpZGUuIEV4cGFuZCBtYXkgbm90IGJlIHRoZSBiZXN0IHdvcmQgZm9yCisjICAgICB3aGF0IHRoaXMgcmVxdWVzdCBkb2VzLiBJdCBkb2VzIG5vdCBuZWNlc3NhcmlseSB0ZWxsIHlvdSBhbGwgdGhlIGZpbGVzCisjICAgICBjb250YWluZWQgaW4gYSBtb2R1bGUsIGZvciBleGFtcGxlLiBCYXNpY2FsbHkgaXQgaXMgYSB3YXkgb2YgdGVsbGluZyB5b3UKKyMgICAgIHdoaWNoIHdvcmtpbmcgZGlyZWN0b3JpZXMgdGhlIHNlcnZlciBuZWVkcyB0byBrbm93IGFib3V0IGluIG9yZGVyIHRvCisjICAgICBoYW5kbGUgYSBjaGVja291dCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZXMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoYXQgdGhlCisjICAgICBzZXJ2ZXIgaGFzIGEgbW9kdWxlIGRlZmluZWQgYnkKKyMgICBhbGlhc21vZHVsZSAtYSAxZGlyCisjICAgICBUaGF0IGlzLCBvbmUgY2FuIGNoZWNrIG91dCBhbGlhc21vZHVsZSBhbmQgaXQgd2lsbCB0YWtlIDFkaXIgaW4gdGhlCisjICAgICByZXBvc2l0b3J5IGFuZCBjaGVjayBpdCBvdXQgdG8gMWRpciBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkuIE5vdyBzdXBwb3NlCisjICAgICB0aGUgY2xpZW50IGFscmVhZHkgaGFzIHRoaXMgbW9kdWxlIGNoZWNrZWQgb3V0IGFuZCBpcyBwbGFubmluZyBvbiB1c2luZworIyAgICAgdGhlIGNvIHJlcXVlc3QgdG8gdXBkYXRlIGl0LiBXaXRob3V0IHVzaW5nIGV4cGFuZC1tb2R1bGVzLCB0aGUgY2xpZW50CisjICAgICB3b3VsZCBoYXZlIHR3byBiYWQgY2hvaWNlczogaXQgY291bGQgZWl0aGVyIHNlbmQgaW5mb3JtYXRpb24gYWJvdXQgYWxsCisjICAgICB3b3JraW5nIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgd2hpY2ggY291bGQgYmUKKyMgICAgIHVubmVjZXNzYXJpbHkgc2xvdywgb3IgaXQgY291bGQgYmUgaWdub3JhbnQgb2YgdGhlIGZhY3QgdGhhdCBhbGlhc21vZHVsZQorIyAgICAgc3RhbmRzIGZvciAxZGlyLCBhbmQgbmVnbGVjdCB0byBzZW5kIGluZm9ybWF0aW9uIGZvciAxZGlyLCB3aGljaCB3b3VsZAorIyAgICAgbGVhZCB0byBpbmNvcnJlY3Qgb3BlcmF0aW9uLiBXaXRoIGV4cGFuZC1tb2R1bGVzLCB0aGUgY2xpZW50IHdvdWxkIGZpcnN0CisjICAgICBhc2sgZm9yIHRoZSBtb2R1bGUgdG8gYmUgZXhwYW5kZWQ6CitzdWIgcmVxX2V4cGFuZG1vZHVsZXMKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCk7CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX2V4cGFuZG1vZHVsZXMgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSApOworCisgICAgdW5sZXNzICggcmVmICRzdGF0ZS0+e2FyZ3VtZW50c30gZXEgIkFSUkFZIiApCisgICAgeworICAgICAgICBwcmludCAib2tcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3JlYWNoIG15ICRtb2R1bGUgKCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319ICkKKyAgICB7CisgICAgICAgICRsb2ctPmRlYnVnKCJTRU5EIDogTW9kdWxlLWV4cGFuc2lvbiAkbW9kdWxlIik7CisgICAgICAgIHByaW50ICJNb2R1bGUtZXhwYW5zaW9uICRtb2R1bGVcbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworICAgIHN0YXRlY2xlYW51cCgpOworfQorCisjIGNvIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogeWVzLiBHZXQgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4gVGhpcyB1c2VzIGFueQorIyAgICAgcHJldmlvdXMgQXJndW1lbnQsIERpcmVjdG9yeSwgRW50cnksIG9yIE1vZGlmaWVkIHJlcXVlc3RzLCBpZiB0aGV5IGhhdmUKKyMgICAgIGJlZW4gc2VudC4gQXJndW1lbnRzIHRvIHRoaXMgY29tbWFuZCBhcmUgbW9kdWxlIG5hbWVzOyB0aGUgY2xpZW50IGNhbm5vdAorIyAgICAga25vdyB3aGF0IGRpcmVjdG9yaWVzIHRoZXkgY29ycmVzcG9uZCB0byBleGNlcHQgYnkgKDEpIGp1c3Qgc2VuZGluZyB0aGUKKyMgICAgIGNvIHJlcXVlc3QsIGFuZCB0aGVuIHNlZWluZyB3aGF0IGRpcmVjdG9yeSBuYW1lcyB0aGUgc2VydmVyIHNlbmRzIGJhY2sgaW4KKyMgICAgIGl0cyByZXNwb25zZXMsIGFuZCAoMikgdGhlIGV4cGFuZC1tb2R1bGVzIHJlcXVlc3QuCitzdWIgcmVxX2NvCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiY28iKTsKKworICAgIG15ICRtb2R1bGUgPSAkc3RhdGUtPnthcmdzfVswXTsKKyAgICBteSAkY2hlY2tvdXRfcGF0aCA9ICRtb2R1bGU7CisKKyAgICAjIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQgZGlyZWN0b3J5IGlmIHdlJ3JlIGdpdmVuIGl0CisgICAgJGNoZWNrb3V0X3BhdGggPSAkc3RhdGUtPntvcHR9e2R9IGlmICggZXhpc3RzICggJHN0YXRlLT57b3B0fXtkfSApICk7CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX2NvIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkgKTsKKworICAgICRsb2ctPmluZm8oIkNoZWNraW5nIG91dCBtb2R1bGUgJyRtb2R1bGUnICgkc3RhdGUtPntDVlNST09UfSkgdG8gJyRjaGVja291dF9wYXRoJyIpOworCisgICAgJEVOVntHSVRfRElSfSA9ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8iOworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRtb2R1bGUsICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICRjaGVja291dF9wYXRoID1+IHN8LyR8fDsgIyBnZXQgcmlkIG9mIHRyYWlsaW5nIHNsYXNoZXMKKworICAgICMgRWNsaXBzZSBzZWVtcyB0byBuZWVkIHRoZSBDbGVhci1zdGlja3kgY29tbWFuZAorICAgICMgdG8gcHJlcGFyZSB0aGUgJ0VudHJpZXMnIGZpbGUgZm9yIHRoZSBuZXcgZGlyZWN0b3J5LgorICAgIHByaW50ICJDbGVhci1zdGlja3kgJGNoZWNrb3V0X3BhdGgvXG4iOworICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlL1xuIjsKKyAgICBwcmludCAiQ2xlYXItc3RhdGljLWRpcmVjdG9yeSAkY2hlY2tvdXRfcGF0aC9cbiI7CisgICAgcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRtb2R1bGUvXG4iOworICAgIHByaW50ICJDbGVhci1zdGlja3kgJGNoZWNrb3V0X3BhdGgvXG4iOyAjIHllcywgdHdpY2UKKyAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS9cbiI7CisgICAgcHJpbnQgIlRlbXBsYXRlICRjaGVja291dF9wYXRoL1xuIjsKKyAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS9cbiI7CisgICAgcHJpbnQgIjBcbiI7CisKKyAgICAjIGluc3RydWN0IHRoZSBjbGllbnQgdGhhdCB3ZSdyZSBjaGVja2luZyBvdXQgdG8gJGNoZWNrb3V0X3BhdGgKKyAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nICRjaGVja291dF9wYXRoXG4iOworCisgICAgbXkgJXNlZW5kaXJzID0gKCk7CisgICAgbXkgJGxhc3RkaXIgPScnOworCisgICAgIyByZWN1cnNpdmUKKyAgICBzdWIgcHJlcGRpciB7CisgICAgICAgbXkgKCRkaXIsICRyZXBvZGlyLCAkcmVtb3RlZGlyLCAkc2VlbmRpcnMpID0gQF87CisgICAgICAgbXkgJHBhcmVudCA9IGRpcm5hbWUoJGRpcik7CisgICAgICAgJGRpciAgICAgICA9fiBzfC8rJHx8OworICAgICAgICRyZXBvZGlyICAgPX4gc3wvKyR8fDsKKyAgICAgICAkcmVtb3RlZGlyID1+IHN8LyskfHw7CisgICAgICAgJHBhcmVudCAgICA9fiBzfC8rJHx8OworICAgICAgICRsb2ctPmRlYnVnKCJhbm5vdW5jZWRpciAkZGlyLCAkcmVwb2RpciwgJHJlbW90ZWRpciIgKTsKKworICAgICAgIGlmICgkcGFyZW50IGVxICcuJyB8fCAkcGFyZW50IGVxICcuLycpIHsKKyAgICAgICAgICAgJHBhcmVudCA9ICcnOworICAgICAgIH0KKyAgICAgICAjIHJlY3Vyc2UgdG8gYW5ub3VuY2UgdW5zZWVuIHBhcmVudHMgZmlyc3QKKyAgICAgICBpZiAobGVuZ3RoKCRwYXJlbnQpICYmICFleGlzdHMoJHNlZW5kaXJzLT57JHBhcmVudH0pKSB7CisgICAgICAgICAgIHByZXBkaXIoJHBhcmVudCwgJHJlcG9kaXIsICRyZW1vdGVkaXIsICRzZWVuZGlycyk7CisgICAgICAgfQorICAgICAgICMgQW5ub3VuY2UgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IGF0IHRoZSBwYXJlbnQgbGV2ZWwKKyAgICAgICBpZiAoJHBhcmVudCkgeworICAgICAgICAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nICRyZW1vdGVkaXIvJHBhcmVudFxuIjsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nICRyZW1vdGVkaXJcbiI7CisgICAgICAgfQorICAgICAgIHByaW50ICJDbGVhci1zdGlja3kgJHJlbW90ZWRpci8kcGFyZW50L1xuIjsKKyAgICAgICBwcmludCAiJHJlcG9kaXIvJHBhcmVudC9cbiI7CisKKyAgICAgICBwcmludCAiQ2xlYXItc3RhdGljLWRpcmVjdG9yeSAkcmVtb3RlZGlyLyRkaXIvXG4iOworICAgICAgIHByaW50ICIkcmVwb2Rpci8kZGlyL1xuIjsKKyAgICAgICBwcmludCAiQ2xlYXItc3RpY2t5ICRyZW1vdGVkaXIvJHBhcmVudC9cbiI7ICMgeWVzLCB0d2ljZQorICAgICAgIHByaW50ICIkcmVwb2Rpci8kcGFyZW50L1xuIjsKKyAgICAgICBwcmludCAiVGVtcGxhdGUgJHJlbW90ZWRpci8kZGlyL1xuIjsKKyAgICAgICBwcmludCAiJHJlcG9kaXIvJGRpci9cbiI7CisgICAgICAgcHJpbnQgIjBcbiI7CisKKyAgICAgICAkc2VlbmRpcnMtPnskZGlyfSA9IDE7CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkZ2l0ICggQHskdXBkYXRlci0+Z2V0aGVhZH0gKQorICAgIHsKKyAgICAgICAgIyBEb24ndCB3YW50IHRvIGNoZWNrIG91dCBkZWxldGVkIGZpbGVzCisgICAgICAgIG5leHQgaWYgKCAkZ2l0LT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiApOworCisgICAgICAgICggJGdpdC0+e25hbWV9LCAkZ2l0LT57ZGlyfSApID0gZmlsZW5hbWVzcGxpdCgkZ2l0LT57bmFtZX0pOworCisgICAgICAgaWYgKGxlbmd0aCgkZ2l0LT57ZGlyfSkgJiYgJGdpdC0+e2Rpcn0gbmUgJy4vJworICAgICAgICAgICAmJiAkZ2l0LT57ZGlyfSBuZSAkbGFzdGRpciApIHsKKyAgICAgICAgICAgdW5sZXNzIChleGlzdHMoJHNlZW5kaXJzeyRnaXQtPntkaXJ9fSkpIHsKKyAgICAgICAgICAgICAgIHByZXBkaXIoJGdpdC0+e2Rpcn0sICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlLyIsCisgICAgICAgICAgICAgICAgICAgICAgICRjaGVja291dF9wYXRoLCBcJXNlZW5kaXJzKTsKKyAgICAgICAgICAgICAgICRsYXN0ZGlyID0gJGdpdC0+e2Rpcn07CisgICAgICAgICAgICAgICAkc2VlbmRpcnN7JGdpdC0+e2Rpcn19ID0gMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwcmludCAiRSBjdnMgY2hlY2tvdXQ6IFVwZGF0aW5nIC8kY2hlY2tvdXRfcGF0aC8kZ2l0LT57ZGlyfVxuIjsKKyAgICAgICB9CisKKyAgICAgICAgIyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGlzIGZpbGUKKyAgICAgICAgcHJpbnQgIk1vZC10aW1lICRnaXQtPnttb2RpZmllZH1cbiI7CisKKyAgICAgICAgIyBwcmludCBzb21lIGluZm9ybWF0aW9uIHRvIHRoZSBjbGllbnQKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJGdpdC0+e2Rpcn0gKSBhbmQgJGdpdC0+e2Rpcn0gbmUgIi4vIiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIFUgJGNoZWNrb3V0X3BhdGgvJGdpdC0+e2Rpcn0kZ2l0LT57bmFtZX1cbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiTSBVICRjaGVja291dF9wYXRoLyRnaXQtPntuYW1lfVxuIjsKKyAgICAgICAgfQorCisgICAgICAgIyBpbnN0cnVjdCBjbGllbnQgd2UncmUgc2VuZGluZyBhIGZpbGUgdG8gcHV0IGluIHRoaXMgcGF0aAorICAgICAgIHByaW50ICJDcmVhdGVkICRjaGVja291dF9wYXRoLyIgLiAoIGRlZmluZWQgKCAkZ2l0LT57ZGlyfSApIGFuZCAkZ2l0LT57ZGlyfSBuZSAiLi8iID8gJGdpdC0+e2Rpcn0gLiAiLyIgOiAiIiApIC4gIlxuIjsKKworICAgICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlLyIgLiAoIGRlZmluZWQgKCAkZ2l0LT57ZGlyfSApIGFuZCAkZ2l0LT57ZGlyfSBuZSAiLi8iID8gJGdpdC0+e2Rpcn0gLiAiLyIgOiAiIiApIC4gIiRnaXQtPntuYW1lfVxuIjsKKworICAgICAgICAjIHRoaXMgaXMgYW4gImVudHJpZXMiIGxpbmUKKyAgICAgICAgcHJpbnQgIi8kZ2l0LT57bmFtZX0vMS4kZ2l0LT57cmV2aXNpb259Ly8vXG4iOworICAgICAgICAjIHBlcm1pc3Npb25zCisgICAgICAgIHByaW50ICJ1PSRnaXQtPnttb2RlfSxnPSRnaXQtPnttb2RlfSxvPSRnaXQtPnttb2RlfVxuIjsKKworICAgICAgICAjIHRyYW5zbWl0IGZpbGUKKyAgICAgICAgdHJhbnNtaXRmaWxlKCRnaXQtPntmaWxlaGFzaH0pOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKKworICAgIHN0YXRlY2xlYW51cCgpOworfQorCisjIHVwZGF0ZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IHllcy4gQWN0dWFsbHkgZG8gYSBjdnMgdXBkYXRlIGNvbW1hbmQuIFRoaXMgdXNlcyBhbnkKKyMgICAgIHByZXZpb3VzIEFyZ3VtZW50LCBEaXJlY3RvcnksIEVudHJ5LCBvciBNb2RpZmllZCByZXF1ZXN0cywgaWYgdGhleSBoYXZlCisjICAgICBiZWVuIHNlbnQuIFRoZSBsYXN0IERpcmVjdG9yeSBzZW50IHNwZWNpZmllcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYXQgdGhlCisjICAgICB0aW1lIG9mIHRoZSBvcGVyYXRpb24uIFRoZSAtSSBvcHRpb24gaXMgbm90IHVzZWQtLWZpbGVzIHdoaWNoIHRoZSBjbGllbnQKKyMgICAgIGNhbiBkZWNpZGUgd2hldGhlciB0byBpZ25vcmUgYXJlIG5vdCBtZW50aW9uZWQgYW5kIHRoZSBjbGllbnQgc2VuZHMgdGhlCisjICAgICBRdWVzdGlvbmFibGUgcmVxdWVzdCBmb3Igb3RoZXJzLgorc3ViIHJlcV91cGRhdGUKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfdXBkYXRlIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworCisgICAgYXJnc3BsaXQoInVwZGF0ZSIpOworCisgICAgIworICAgICMgSXQgbWF5IGp1c3QgYmUgYSBjbGllbnQgZXhwbG9yaW5nIHRoZSBhdmFpbGFibGUgaGVhZHMvbW9kdWxlcworICAgICMgaW4gdGhhdCBjYXNlLCBsaXN0IHRoZW0gYXMgdG9wIGxldmVsIGRpcmVjdG9yaWVzIGFuZCBsZWF2ZSBpdAorICAgICMgYXQgdGhhdC4gRWNsaXBzZSB1c2VzIHRoaXMgdGVjaG5pcXVlIHRvIG9mZmVyIHlvdSBhIGxpc3Qgb2YKKyAgICAjIHByb2plY3RzIChoZWFkcyBpbiB0aGlzIGNhc2UpIHRvIGNoZWNrb3V0LgorICAgICMKKyAgICBpZiAoJHN0YXRlLT57bW9kdWxlfSBlcSAnJykgeworICAgICAgICBwcmludCAiRSBjdnMgdXBkYXRlOiBVcGRhdGluZyAuXG4iOworCW9wZW5kaXIgSEVBRFMsICRzdGF0ZS0+e0NWU1JPT1R9IC4gJy9yZWZzL2hlYWRzJzsKKwl3aGlsZSAobXkgJGhlYWQgPSByZWFkZGlyKEhFQURTKSkgeworCSAgICBpZiAoLWYgJHN0YXRlLT57Q1ZTUk9PVH0gLiAnL3JlZnMvaGVhZHMvJyAuICRoZWFkKSB7CisJICAgICAgICBwcmludCAiRSBjdnMgdXBkYXRlOiBOZXcgZGlyZWN0b3J5IGAkaGVhZCdcbiI7CisJICAgIH0KKwl9CisJY2xvc2VkaXIgSEVBRFM7CisJcHJpbnQgIm9rXG4iOworCXJldHVybiAxOworICAgIH0KKworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworCisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgYXJnc2Zyb21kaXIoJHVwZGF0ZXIpOworCisgICAgIyRsb2ctPmRlYnVnKCJ1cGRhdGUgc3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgJGxvZy0+ZGVidWcoIlByb2Nlc3NpbmcgZmlsZSAkZmlsZW5hbWUiKTsKKworICAgICAgICAjIGlmIHdlIGhhdmUgYSAtQyB3ZSBzaG91bGQgcHJldGVuZCB3ZSBuZXZlciBzYXcgbW9kaWZpZWQgc3R1ZmYKKyAgICAgICAgaWYgKCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e0N9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofTsKKyAgICAgICAgICAgIGRlbGV0ZSAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfTsKKyAgICAgICAgICAgICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBteSAkbWV0YTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCRzdGF0ZS0+e29wdH17cn0pIGFuZCAkc3RhdGUtPntvcHR9e3J9ID1+IC9eMVwuKFxkKykvICkKKyAgICAgICAgeworICAgICAgICAgICAgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICQxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIG5leHQgdW5sZXNzICggJG1ldGEtPntyZXZpc2lvbn0gKTsKKworICAgICAgICBteSAkb2xkbWV0YSA9ICRtZXRhOworCisgICAgICAgIG15ICR3cmV2ID0gcmV2cGFyc2UoJGZpbGVuYW1lKTsKKworICAgICAgICAjIElmIHRoZSB3b3JraW5nIGNvcHkgaXMgYW4gb2xkIHJldmlzaW9uLCBsZXRzIGdldCB0aGF0IHZlcnNpb24gdG9vIGZvciBjb21wYXJpc29uLgorICAgICAgICBpZiAoIGRlZmluZWQoJHdyZXYpIGFuZCAkd3JldiAhPSAkbWV0YS0+e3JldmlzaW9ufSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRvbGRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkd3Jldik7CisgICAgICAgIH0KKworICAgICAgICAjJGxvZy0+ZGVidWcoIlRhcmdldCByZXZpc2lvbiBpcyAkbWV0YS0+e3JldmlzaW9ufSwgY3VycmVudCB3b3JraW5nIHJldmlzaW9uIGlzICR3cmV2Iik7CisKKyAgICAgICAgIyBGaWxlcyBhcmUgdXAgdG8gZGF0ZSBpZiB0aGUgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiwKKyAgICAgICAgIyBhbmQgdGhlIHdvcmtpbmcgY29weSBpcyB1bm1vZGlmaWVkIF9hbmRfIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgLUMKKyAgICAgICAgbmV4dCBpZiAoIGRlZmluZWQgKCAkd3JldiApCisgICAgICAgICAgICAgICAgICBhbmQgZGVmaW5lZCgkbWV0YS0+e3JldmlzaW9ufSkKKyAgICAgICAgICAgICAgICAgIGFuZCAkd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufQorICAgICAgICAgICAgICAgICAgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfQorICAgICAgICAgICAgICAgICAgYW5kIG5vdCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e0N9ICkgKTsKKworICAgICAgICAjIElmIHRoZSB3b3JraW5nIGNvcHkgYW5kIHJlcG8gY29weSBoYXZlIHRoZSBzYW1lIHJldmlzaW9uLAorICAgICAgICAjIGJ1dCB0aGUgd29ya2luZyBjb3B5IGlzIG1vZGlmaWVkLCB0ZWxsIHRoZSBjbGllbnQgaXQncyBtb2RpZmllZAorICAgICAgICBpZiAoIGRlZmluZWQgKCAkd3JldiApCisgICAgICAgICAgICAgYW5kIGRlZmluZWQoJG1ldGEtPntyZXZpc2lvbn0pCisgICAgICAgICAgICAgYW5kICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259CisgICAgICAgICAgICAgYW5kIG5vdCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e0N9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJUZWxsIHRoZSBjbGllbnQgdGhlIGZpbGUgaXMgbW9kaWZpZWQiKTsKKyAgICAgICAgICAgIHByaW50ICJNVCB0ZXh0IFVcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgZm5hbWUgJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgcHJpbnQgIk1UIG5ld2xpbmVcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAkbWV0YS0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgKQorICAgICAgICB7CisgICAgICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lLDEpOworCisgICAgICAgICAgICAkbG9nLT5pbmZvKCJSZW1vdmluZyAnJGZpbGVuYW1lJyBmcm9tIHdvcmtpbmcgY29weSAobm8gbG9uZ2VyIGluIHRoZSByZXBvKSIpOworCisgICAgICAgICAgICBwcmludCAiRSBjdnMgdXBkYXRlOiBgJGZpbGVuYW1lJyBpcyBubyBsb25nZXIgaW4gdGhlIHJlcG9zaXRvcnlcbiI7CisgICAgICAgICAgICAjIERvbid0IHdhbnQgdG8gYWN0dWFsbHkgX0RPXyB0aGUgdXBkYXRlIGlmIC1uIHNwZWNpZmllZAorICAgICAgICAgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkgeworCQlwcmludCAiUmVtb3ZlZCAkZGlycGFydFxuIjsKKwkJcHJpbnQgIiRmaWxlcGFydFxuIjsKKwkgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2lmICggbm90IGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9ICkKKwkJb3IgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSBlcSAkb2xkbWV0YS0+e2ZpbGVoYXNofSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIlVwZGF0aW5nICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICAjIG5vcm1hbCB1cGRhdGUsIGp1c3Qgc2VuZCB0aGUgbmV3IHJldmlzaW9uIChlaXRoZXIgVT1VcGRhdGUsIG9yIEE9QWRkLCBvciBSPVJlbW92ZSkKKyAgICAgICAgICAgIHByaW50ICJNVCArdXBkYXRlZFxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCB0ZXh0IFVcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgZm5hbWUgJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgcHJpbnQgIk1UIG5ld2xpbmVcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgLXVwZGF0ZWRcbiI7CisKKyAgICAgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsMSk7CisKKwkgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKwkgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKwkgICAgeworCQlpZiAoIGRlZmluZWQgKCAkd3JldiApICkKKwkJeworCQkgICAgIyBpbnN0cnVjdCBjbGllbnQgd2UncmUgc2VuZGluZyBhIGZpbGUgdG8gcHV0IGluIHRoaXMgcGF0aCBhcyBhIHJlcGxhY2VtZW50CisJCSAgICBwcmludCAiVXBkYXRlLWV4aXN0aW5nICRkaXJwYXJ0XG4iOworCQkgICAgJGxvZy0+ZGVidWcoIlVwZGF0aW5nIGV4aXN0aW5nIGZpbGUgJ1VwZGF0ZS1leGlzdGluZyAkZGlycGFydCciKTsKKwkJfSBlbHNlIHsKKwkJICAgICMgaW5zdHJ1Y3QgY2xpZW50IHdlJ3JlIHNlbmRpbmcgYSBmaWxlIHRvIHB1dCBpbiB0aGlzIHBhdGggYXMgYSBuZXcgZmlsZQorCQkgICAgcHJpbnQgIkNsZWFyLXN0YXRpYy1kaXJlY3RvcnkgJGRpcnBhcnRcbiI7CisJCSAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZGlycGFydFxuIjsKKwkJICAgIHByaW50ICJDbGVhci1zdGlja3kgJGRpcnBhcnRcbiI7CisJCSAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZGlycGFydFxuIjsKKworCQkgICAgJGxvZy0+ZGVidWcoIkNyZWF0aW5nIG5ldyBmaWxlICdDcmVhdGVkICRkaXJwYXJ0JyIpOworCQkgICAgcHJpbnQgIkNyZWF0ZWQgJGRpcnBhcnRcbiI7CisJCX0KKwkJcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lXG4iOworCisJCSMgdGhpcyBpcyBhbiAiZW50cmllcyIgbGluZQorCQkkbG9nLT5kZWJ1ZygiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8vIik7CisJCXByaW50ICIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLy9cbiI7CisKKwkJIyBwZXJtaXNzaW9ucworCQkkbG9nLT5kZWJ1ZygiU0VORCA6IHU9JG1ldGEtPnttb2RlfSxnPSRtZXRhLT57bW9kZX0sbz0kbWV0YS0+e21vZGV9Iik7CisJCXByaW50ICJ1PSRtZXRhLT57bW9kZX0sZz0kbWV0YS0+e21vZGV9LG89JG1ldGEtPnttb2RlfVxuIjsKKworCQkjIHRyYW5zbWl0IGZpbGUKKwkJdHJhbnNtaXRmaWxlKCRtZXRhLT57ZmlsZWhhc2h9KTsKKwkgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGxvZy0+aW5mbygiVXBkYXRpbmcgJyRmaWxlbmFtZSciKTsKKyAgICAgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkbWV0YS0+e25hbWV9LDEpOworCisgICAgICAgICAgICBteSAkZGlyID0gdGVtcGRpciggRElSID0+ICRURU1QX0RJUiwgQ0xFQU5VUCA9PiAxICkgLiAiLyI7CisKKyAgICAgICAgICAgIGNoZGlyICRkaXI7CisgICAgICAgICAgICBteSAkZmlsZV9sb2NhbCA9ICRmaWxlcGFydCAuICIubWluZSI7CisgICAgICAgICAgICBzeXN0ZW0oImxuIiwiLXMiLCRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9LCAkZmlsZV9sb2NhbCk7CisgICAgICAgICAgICBteSAkZmlsZV9vbGQgPSAkZmlsZXBhcnQgLiAiLiIgLiAkb2xkbWV0YS0+e3JldmlzaW9ufTsKKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkb2xkbWV0YS0+e2ZpbGVoYXNofSwgJGZpbGVfb2xkKTsKKyAgICAgICAgICAgIG15ICRmaWxlX25ldyA9ICRmaWxlcGFydCAuICIuIiAuICRtZXRhLT57cmV2aXNpb259OworICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRtZXRhLT57ZmlsZWhhc2h9LCAkZmlsZV9uZXcpOworCisgICAgICAgICAgICAjIHdlIG5lZWQgdG8gbWVyZ2Ugd2l0aCB0aGUgbG9jYWwgY2hhbmdlcyAoIE09c3VjY2Vzc2Z1bCBtZXJnZSwgQz1jb25mbGljdCBtZXJnZSApCisgICAgICAgICAgICAkbG9nLT5pbmZvKCJNZXJnaW5nICRmaWxlX2xvY2FsLCAkZmlsZV9vbGQsICRmaWxlX25ldyIpOworCisgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiVGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgbWVyZ2UgaXMgJGRpciIpOworCisgICAgICAgICAgICBteSAkcmV0dXJuID0gc3lzdGVtKCJtZXJnZSIsICRmaWxlX2xvY2FsLCAkZmlsZV9vbGQsICRmaWxlX25ldyk7CisgICAgICAgICAgICAkcmV0dXJuID4+PSA4OworCisgICAgICAgICAgICBpZiAoICRyZXR1cm4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJGxvZy0+aW5mbygiTWVyZ2VkIHN1Y2Nlc3NmdWxseSIpOworICAgICAgICAgICAgICAgIHByaW50ICJNIE0gJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCJVcGRhdGUtZXhpc3RpbmcgJGRpcnBhcnQiKTsKKworICAgICAgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBhY3R1YWxseSBfRE9fIHRoZSB1cGRhdGUgaWYgLW4gc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJVcGRhdGUtZXhpc3RpbmcgJGRpcnBhcnRcbiI7CisgICAgICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRmaWxlbmFtZSIpOworICAgICAgICAgICAgICAgICAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLy8iKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIi8kZmlsZXBhcnQvMS4kbWV0YS0+e3JldmlzaW9ufS8vL1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRyZXR1cm4gPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJGxvZy0+aW5mbygiTWVyZ2VkIHdpdGggY29uZmxpY3RzIik7CisgICAgICAgICAgICAgICAgcHJpbnQgIk0gQyAkZmlsZW5hbWVcbiI7CisKKyAgICAgICAgICAgICAgICAjIERvbid0IHdhbnQgdG8gYWN0dWFsbHkgX0RPXyB0aGUgdXBkYXRlIGlmIC1uIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludCAiVXBkYXRlLWV4aXN0aW5nICRkaXJwYXJ0XG4iOworICAgICAgICAgICAgICAgICAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vKy8vXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkbG9nLT53YXJuKCJNZXJnZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjIERvbid0IHdhbnQgdG8gYWN0dWFsbHkgX0RPXyB0aGUgdXBkYXRlIGlmIC1uIHNwZWNpZmllZAorICAgICAgICAgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIHBlcm1pc3Npb25zCisgICAgICAgICAgICAgICAgJGxvZy0+ZGVidWcoIlNFTkQgOiB1PSRtZXRhLT57bW9kZX0sZz0kbWV0YS0+e21vZGV9LG89JG1ldGEtPnttb2RlfSIpOworICAgICAgICAgICAgICAgIHByaW50ICJ1PSRtZXRhLT57bW9kZX0sZz0kbWV0YS0+e21vZGV9LG89JG1ldGEtPnttb2RlfVxuIjsKKworICAgICAgICAgICAgICAgICMgdHJhbnNtaXQgZmlsZSwgZm9ybWF0IGlzIHNpbmdsZSBpbnRlZ2VyIG9uIGEgbGluZSBieSBpdHNlbGYgKGZpbGUKKyAgICAgICAgICAgICAgICAjIHNpemUpIGZvbGxvd2VkIGJ5IHRoZSBmaWxlIGNvbnRlbnRzCisgICAgICAgICAgICAgICAgIyBUT0RPIDogd2Ugc2hvdWxkIGNvcHkgZmlsZXMgaW4gYmxvY2tzCisgICAgICAgICAgICAgICAgbXkgJGRhdGEgPSBgY2F0ICRmaWxlX2xvY2FsYDsKKyAgICAgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiRmlsZSBzaXplIDogIiAuIGxlbmd0aCgkZGF0YSkpOworICAgICAgICAgICAgICAgIHByaW50IGxlbmd0aCgkZGF0YSkgLiAiXG4iOworICAgICAgICAgICAgICAgIHByaW50ICRkYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGRpciAiLyI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworc3ViIHJlcV9jaQoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoImNpIik7CisKKyAgICAjJGxvZy0+ZGVidWcoIlN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgICRsb2ctPmluZm8oInJlcV9jaSA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKworICAgIGlmICggQEFSR1YgJiYgJEFSR1ZbMF0gZXEgJ3BzZXJ2ZXInKQorICAgIHsKKyAgICAgICAgcHJpbnQgImVycm9yIDEgcHNlcnZlciBhY2Nlc3MgY2Fubm90IGNvbW1pdFxuIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKyAgICBpZiAoIC1lICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi9pbmRleCIgKQorICAgIHsKKyAgICAgICAgJGxvZy0+d2FybigiZmlsZSAnaW5kZXgnIGFscmVhZHkgZXhpc3RzIGluIHRoZSBnaXQgcmVwb3NpdG9yeSIpOworICAgICAgICBwcmludCAiZXJyb3IgMSBJbmRleCBhbHJlYWR5IGV4aXN0cyBpbiBnaXQgcmVwb1xuIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKyAgICBteSAkbG9ja2ZpbGUgPSAiJHN0YXRlLT57Q1ZTUk9PVH0vcmVmcy9oZWFkcy8kc3RhdGUtPnttb2R1bGV9LmxvY2siOworICAgIHVubGVzcyAoIHN5c29wZW4oTE9DS0ZJTEUsJGxvY2tmaWxlLE9fRVhDTHxPX0NSRUFUfE9fV1JPTkxZKSApCisgICAgeworICAgICAgICAkbG9nLT53YXJuKCJsb2NrZmlsZSAnJGxvY2tmaWxlJyBhbHJlYWR5IGV4aXN0cywgcGxlYXNlIHRyeSBhZ2FpbiIpOworICAgICAgICBwcmludCAiZXJyb3IgMSBMb2NrIGZpbGUgJyRsb2NrZmlsZScgYWxyZWFkeSBleGlzdHMsIHBsZWFzZSB0cnkgYWdhaW5cbiI7CisgICAgICAgIGV4aXQ7CisgICAgfQorCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyICggRElSID0+ICRURU1QX0RJUiApOworICAgIG15ICggdW5kZWYsICRmaWxlX2luZGV4ICkgPSB0ZW1wZmlsZSAoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICRsb2ctPmluZm8oIkxvY2sgc3VjY2Vzc2Z1bCwgYmFzaW5nIGNvbW1pdCBvbiAnJHRtcGRpcicsIGluZGV4IGZpbGUgaXMgJyRmaWxlX2luZGV4JyIpOworCisgICAgJEVOVntHSVRfRElSfSA9ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8iOworICAgICRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGZpbGVfaW5kZXg7CisKKyAgICBjaGRpciAkdG1wZGlyOworCisgICAgIyBwb3B1bGF0ZSB0aGUgdGVtcG9yYXJ5IGluZGV4IGJhc2VkCisgICAgc3lzdGVtKCJnaXQtcmVhZC10cmVlIiwgJHN0YXRlLT57bW9kdWxlfSk7CisgICAgdW5sZXNzICgkPyA9PSAwKQorICAgIHsKKwlkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LXJlYWQtdHJlZSAkc3RhdGUtPnttb2R1bGV9ICRmaWxlX2luZGV4ICQhIjsKKyAgICB9CisgICAgJGxvZy0+aW5mbygiQ3JlYXRlZCBpbmRleCAnJGZpbGVfaW5kZXgnIHdpdGggZm9yIGhlYWQgJHN0YXRlLT57bW9kdWxlfSAtIGV4aXQgc3RhdHVzICQ/Iik7CisKKworICAgIG15IEBjb21taXR0ZWRmaWxlcyA9ICgpOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgIG15ICRjb21taXR0ZWRmaWxlID0gJGZpbGVuYW1lOworICAgICAgICAkZmlsZW5hbWUgPSBmaWxlY2xlYW51cCgkZmlsZW5hbWUpOworCisgICAgICAgIG5leHQgdW5sZXNzICggZXhpc3RzICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9IG9yIG5vdCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0gKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUpOworCisgICAgICAgICMgZG8gYSBjaGVja291dCBvZiB0aGUgZmlsZSBpZiBpdCBwYXJ0IG9mIHRoaXMgdHJlZQorICAgICAgICBpZiAoJHdyZXYpIHsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0LWluZGV4JywgJy1mJywgJy11JywgJGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHVubGVzcyAoJD8gPT0gMCkgeworICAgICAgICAgICAgICAgIGRpZSAiRXJyb3IgcnVubmluZyBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgJGZpbGVuYW1lIDogJCEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXkgJGFkZGZsYWcgPSAwOworICAgICAgICBteSAkcm1mbGFnID0gMDsKKyAgICAgICAgJHJtZmxhZyA9IDEgaWYgKCBkZWZpbmVkKCR3cmV2KSBhbmQgJHdyZXYgPCAwICk7CisgICAgICAgICRhZGRmbGFnID0gMSB1bmxlc3MgKCAtZSAkZmlsZW5hbWUgKTsKKworICAgICAgICAjIERvIHVwIHRvIGRhdGUgY2hlY2tpbmcKKyAgICAgICAgdW5sZXNzICggJGFkZGZsYWcgb3IgJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0gb3IgKCAkcm1mbGFnIGFuZCAtJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICMgZmFpbCBldmVyeXRoaW5nIGlmIGFuIHVwIHRvIGRhdGUgY2hlY2sgZmFpbHMKKyAgICAgICAgICAgIHByaW50ICJlcnJvciAxIFVwIHRvIGRhdGUgY2hlY2sgZmFpbGVkIGZvciAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICBjbG9zZSBMT0NLRklMRTsKKyAgICAgICAgICAgIHVubGluaygkbG9ja2ZpbGUpOworICAgICAgICAgICAgY2hkaXIgIi8iOworICAgICAgICAgICAgZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1c2ggQGNvbW1pdHRlZGZpbGVzLCAkY29tbWl0dGVkZmlsZTsKKyAgICAgICAgJGxvZy0+aW5mbygiQ29tbWl0dGluZyAkZmlsZW5hbWUiKTsKKworICAgICAgICBzeXN0ZW0oIm1rZGlyIiwiLXAiLCRkaXJwYXJ0KSB1bmxlc3MgKCAtZCAkZGlycGFydCApOworCisgICAgICAgIHVubGVzcyAoICRybWZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5kZWJ1ZygicmVuYW1lICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICRmaWxlbmFtZSIpOworICAgICAgICAgICAgcmVuYW1lICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9LCRmaWxlbmFtZTsKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgbW9kZXMgdG8gcmVtb3ZlCisgICAgICAgICAgICBteSAkaW52bW9kZSA9ICIiOworICAgICAgICAgICAgZm9yZWFjaCAoIHF3IChyIHcgeCkgKSB7ICRpbnZtb2RlIC49ICRfIHVubGVzcyAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfbW9kZX0gPX4gLyRfLyApOyB9CisKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJjaG1vZCB1KyIgLiAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX21vZGV9IC4gIi0iIC4gJGludm1vZGUgLiAiICRmaWxlbmFtZSIpOworICAgICAgICAgICAgc3lzdGVtKCJjaG1vZCIsInUrIiAuICAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX21vZGV9IC4gIi0iIC4gJGludm1vZGUsICRmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICRybWZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJSZW1vdmluZyBmaWxlICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICB1bmxpbmsoJGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHN5c3RlbSgiZ2l0LXVwZGF0ZS1pbmRleCIsICItLXJlbW92ZSIsICRmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkYWRkZmxhZyApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIkFkZGluZyBmaWxlICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICBzeXN0ZW0oImdpdC11cGRhdGUtaW5kZXgiLCAiLS1hZGQiLCAkZmlsZW5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGxvZy0+aW5mbygiVXBkYXRpbmcgZmlsZSAnJGZpbGVuYW1lJyIpOworICAgICAgICAgICAgc3lzdGVtKCJnaXQtdXBkYXRlLWluZGV4IiwgJGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVubGVzcyAoIHNjYWxhcihAY29tbWl0dGVkZmlsZXMpID4gMCApCisgICAgeworICAgICAgICBwcmludCAiRSBObyBmaWxlcyB0byBjb21taXRcbiI7CisgICAgICAgIHByaW50ICJva1xuIjsKKyAgICAgICAgY2xvc2UgTE9DS0ZJTEU7CisgICAgICAgIHVubGluaygkbG9ja2ZpbGUpOworICAgICAgICBjaGRpciAiLyI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBteSAkdHJlZWhhc2ggPSBgZ2l0LXdyaXRlLXRyZWVgOworICAgIG15ICRwYXJlbnRoYXNoID0gYGNhdCAkRU5We0dJVF9ESVJ9cmVmcy9oZWFkcy8kc3RhdGUtPnttb2R1bGV9YDsKKyAgICBjaG9tcCAkdHJlZWhhc2g7CisgICAgY2hvbXAgJHBhcmVudGhhc2g7CisKKyAgICAkbG9nLT5kZWJ1ZygiVHJlZWhhc2ggOiAkdHJlZWhhc2gsIFBhcmVudGhhc2ggOiAkcGFyZW50aGFzaCIpOworCisgICAgIyB3cml0ZSBvdXIgY29tbWl0IG1lc3NhZ2Ugb3V0IGlmIHdlIGhhdmUgb25lIC4uLgorICAgIG15ICggJG1zZ19maCwgJG1zZ19maWxlbmFtZSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIgKTsKKyAgICBwcmludCAkbXNnX2ZoICRzdGF0ZS0+e29wdH17bX07IyBpZiAoIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17bX0gKSApOworICAgIHByaW50ICRtc2dfZmggIlxuXG52aWEgZ2l0LUNWUyBlbXVsYXRvclxuIjsKKyAgICBjbG9zZSAkbXNnX2ZoOworCisgICAgbXkgJGNvbW1pdGhhc2ggPSBgZ2l0LWNvbW1pdC10cmVlICR0cmVlaGFzaCAtcCAkcGFyZW50aGFzaCA8ICRtc2dfZmlsZW5hbWVgOworICAgICRsb2ctPmluZm8oIkNvbW1pdCBoYXNoIDogJGNvbW1pdGhhc2giKTsKKworICAgIHVubGVzcyAoICRjb21taXRoYXNoID1+IC9bYS16QS1aMC05XXs0MH0vICkKKyAgICB7CisgICAgICAgICRsb2ctPndhcm4oIkNvbW1pdCBmYWlsZWQgKEludmFsaWQgY29tbWl0IGhhc2gpIik7CisgICAgICAgIHByaW50ICJlcnJvciAxIENvbW1pdCBmYWlsZWQgKHVua25vd24gcmVhc29uKVxuIjsKKyAgICAgICAgY2xvc2UgTE9DS0ZJTEU7CisgICAgICAgIHVubGluaygkbG9ja2ZpbGUpOworICAgICAgICBjaGRpciAiLyI7CisgICAgICAgIGV4aXQ7CisgICAgfQorCisgICAgb3BlbiBGSUxFLCAiPiIsICIkRU5We0dJVF9ESVJ9cmVmcy9oZWFkcy8kc3RhdGUtPnttb2R1bGV9IjsKKyAgICBwcmludCBGSUxFICRjb21taXRoYXNoOworICAgIGNsb3NlIEZJTEU7CisKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQGNvbW1pdHRlZGZpbGVzICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsIDEpOworCisgICAgICAgICRsb2ctPmRlYnVnKCJDaGVja2VkLWluICRkaXJwYXJ0IDogJGZpbGVuYW1lIik7CisKKyAgICAgICAgaWYgKCAkbWV0YS0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiUmVtb3ZlLWVudHJ5ICRkaXJwYXJ0XG4iOworICAgICAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ICJDaGVja2VkLWluICRkaXJwYXJ0XG4iOworICAgICAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLy9cbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbG9zZSBMT0NLRklMRTsKKyAgICB1bmxpbmsoJGxvY2tmaWxlKTsKKyAgICBjaGRpciAiLyI7CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKK3N1YiByZXFfc3RhdHVzCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgic3RhdHVzIik7CisKKyAgICAkbG9nLT5pbmZvKCJyZXFfc3RhdHVzIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworICAgICMkbG9nLT5kZWJ1Zygic3RhdHVzIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAjIGlmIG5vIGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIHdvcmsgb3V0IHdoYXQgZmlsZXMgd2Ugc2hvdWxkIGJlIHByb3ZpZGluZyBzdGF0dXMgb24gLi4uCisgICAgYXJnc2Zyb21kaXIoJHVwZGF0ZXIpOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworICAgICAgICBteSAkb2xkbWV0YSA9ICRtZXRhOworCisgICAgICAgIG15ICR3cmV2ID0gcmV2cGFyc2UoJGZpbGVuYW1lKTsKKworICAgICAgICAjIElmIHRoZSB3b3JraW5nIGNvcHkgaXMgYW4gb2xkIHJldmlzaW9uLCBsZXRzIGdldCB0aGF0IHZlcnNpb24gdG9vIGZvciBjb21wYXJpc29uLgorICAgICAgICBpZiAoIGRlZmluZWQoJHdyZXYpIGFuZCAkd3JldiAhPSAkbWV0YS0+e3JldmlzaW9ufSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRvbGRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkd3Jldik7CisgICAgICAgIH0KKworICAgICAgICAjIFRPRE8gOiBBbGwgcG9zc2libGUgc3RhdHVzZXMgYXJlbid0IHlldCBpbXBsZW1lbnRlZAorICAgICAgICBteSAkc3RhdHVzOworICAgICAgICAjIEZpbGVzIGFyZSB1cCB0byBkYXRlIGlmIHRoZSB3b3JraW5nIGNvcHkgYW5kIHJlcG8gY29weSBoYXZlIHRoZSBzYW1lIHJldmlzaW9uLCBhbmQgdGhlIHdvcmtpbmcgY29weSBpcyB1bm1vZGlmaWVkCisgICAgICAgICRzdGF0dXMgPSAiVXAtdG8tZGF0ZSIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCgkbWV0YS0+e3JldmlzaW9ufSkgYW5kICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0gYW5kICggbm90IGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSApIG9yICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17Y29uZmxpY3R9ICF+IC9eXCs9LyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgKCBkZWZpbmVkKCRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0pIGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9IGVxICRtZXRhLT57ZmlsZWhhc2h9ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICMgTmVlZCBjaGVja291dCBpZiB0aGUgd29ya2luZyBjb3B5IGhhcyBhbiBvbGRlciByZXZpc2lvbiB0aGFuIHRoZSByZXBvIGNvcHksIGFuZCB0aGUgd29ya2luZyBjb3B5IGlzIHVubW9kaWZpZWQKKyAgICAgICAgJHN0YXR1cyB8fD0gIk5lZWRzIENoZWNrb3V0IiBpZiAoIGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSBhbmQgJG1ldGEtPntyZXZpc2lvbn0gPiAkd3JldgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSkgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG9sZG1ldGEtPntmaWxlaGFzaH0gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAjIE5lZWQgY2hlY2tvdXQgaWYgaXQgZXhpc3RzIGluIHRoZSByZXBvIGJ1dCBkb2Vzbid0IGhhdmUgYSB3b3JraW5nIGNvcHkKKyAgICAgICAgJHN0YXR1cyB8fD0gIk5lZWRzIENoZWNrb3V0IiBpZiAoIG5vdCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgKTsKKworICAgICAgICAjIExvY2FsbHkgbW9kaWZpZWQgaWYgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiBidXQgdGhlcmUgYXJlIGxvY2FsIGNoYW5nZXMKKyAgICAgICAgJHN0YXR1cyB8fD0gIkxvY2FsbHkgTW9kaWZpZWQiIGlmICggZGVmaW5lZCAoICR3cmV2ICkgYW5kIGRlZmluZWQoJG1ldGEtPntyZXZpc2lvbn0pIGFuZCAkd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufSBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX0gKTsKKworICAgICAgICAjIE5lZWRzIE1lcmdlIGlmIHdvcmtpbmcgY29weSByZXZpc2lvbiBpcyBsZXNzIHRoYW4gcmVwbyBjb3B5IGFuZCB0aGVyZSBhcmUgbG9jYWwgY2hhbmdlcworICAgICAgICAkc3RhdHVzIHx8PSAiTmVlZHMgTWVyZ2UiIGlmICggZGVmaW5lZCAoICR3cmV2ICkgYW5kIGRlZmluZWQgKCAkbWV0YS0+e3JldmlzaW9ufSApIGFuZCAkbWV0YS0+e3JldmlzaW9ufSA+ICR3cmV2IGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApOworCisgICAgICAgICRzdGF0dXMgfHw9ICJMb2NhbGx5IEFkZGVkIiBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSApIGFuZCBub3QgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgKTsKKyAgICAgICAgJHN0YXR1cyB8fD0gIkxvY2FsbHkgUmVtb3ZlZCIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgYW5kIC0kd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufSApOworICAgICAgICAkc3RhdHVzIHx8PSAiVW5yZXNvbHZlZCBDb25mbGljdCIgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gKSBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gPX4gL15cKz0vICk7CisgICAgICAgICRzdGF0dXMgfHw9ICJGaWxlIGhhZCBjb25mbGljdHMgb24gbWVyZ2UiIGlmICggMCApOworCisgICAgICAgICRzdGF0dXMgfHw9ICJVbmtub3duIjsKKworICAgICAgICBwcmludCAiTSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICAgICAgICBwcmludCAiTSBGaWxlOiAkZmlsZW5hbWVcdFN0YXR1czogJHN0YXR1c1xuIjsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIFdvcmtpbmcgcmV2aXNpb246XHQiIC4gJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0gLiAiXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnQgIk0gV29ya2luZyByZXZpc2lvbjpcdE5vIGVudHJ5IGZvciAkZmlsZW5hbWVcbiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIFJlcG9zaXRvcnkgcmV2aXNpb246XHQxLiIgLiAkbWV0YS0+e3JldmlzaW9ufSAuICJcdCRzdGF0ZS0+e3JlcG9zaXRvcnl9LyRmaWxlbmFtZSx2XG4iOworICAgICAgICAgICAgcHJpbnQgIk0gU3RpY2t5IFRhZzpcdFx0KG5vbmUpXG4iOworICAgICAgICAgICAgcHJpbnQgIk0gU3RpY2t5IERhdGU6XHRcdChub25lKVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNIFN0aWNreSBPcHRpb25zOlx0XHQobm9uZSlcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiTSBSZXBvc2l0b3J5IHJldmlzaW9uOlx0Tm8gcmV2aXNpb24gY29udHJvbCBmaWxlXG4iOworICAgICAgICB9CisgICAgICAgIHByaW50ICJNXG4iOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworc3ViIHJlcV9kaWZmCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiZGlmZiIpOworCisgICAgJGxvZy0+ZGVidWcoInJlcV9kaWZmIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworICAgICMkbG9nLT5kZWJ1Zygic3RhdHVzIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgIG15ICgkcmV2aXNpb24xLCAkcmV2aXNpb24yKTsKKyAgICBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntvcHR9e3J9ICkgYW5kIHJlZiAkc3RhdGUtPntvcHR9e3J9IGVxICJBUlJBWSIgKQorICAgIHsKKyAgICAgICAgJHJldmlzaW9uMSA9ICRzdGF0ZS0+e29wdH17cn1bMF07CisgICAgICAgICRyZXZpc2lvbjIgPSAkc3RhdGUtPntvcHR9e3J9WzFdOworICAgIH0gZWxzZSB7CisgICAgICAgICRyZXZpc2lvbjEgPSAkc3RhdGUtPntvcHR9e3J9OworICAgIH0KKworICAgICRyZXZpc2lvbjEgPX4gcy9eMVwuLy8gaWYgKCBkZWZpbmVkICggJHJldmlzaW9uMSApICk7CisgICAgJHJldmlzaW9uMiA9fiBzL14xXC4vLyBpZiAoIGRlZmluZWQgKCAkcmV2aXNpb24yICkgKTsKKworICAgICRsb2ctPmRlYnVnKCJEaWZmaW5nIHJldmlzaW9ucyAiIC4gKCBkZWZpbmVkKCRyZXZpc2lvbjEpID8gJHJldmlzaW9uMSA6ICJbTlVMTF0iICkgLiAiIGFuZCAiIC4gKCBkZWZpbmVkKCRyZXZpc2lvbjIpID8gJHJldmlzaW9uMiA6ICJbTlVMTF0iICkgKTsKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAjIGlmIG5vIGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIHdvcmsgb3V0IHdoYXQgZmlsZXMgd2Ugc2hvdWxkIGJlIHByb3ZpZGluZyBzdGF0dXMgb24gLi4uCisgICAgYXJnc2Zyb21kaXIoJHVwZGF0ZXIpOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgKCAkZmgsICRmaWxlMSwgJGZpbGUyLCAkbWV0YTEsICRtZXRhMiwgJGZpbGVkaWZmICk7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgICMgV2UgbmVlZCBfc29tZXRoaW5nXyB0byBkaWZmIGFnYWluc3QKKyAgICAgICAgbmV4dCB1bmxlc3MgKCBkZWZpbmVkICggJHdyZXYgKSApOworCisgICAgICAgICMgaWYgd2UgaGF2ZSBhIC1yIHN3aXRjaCwgdXNlIGl0CisgICAgICAgIGlmICggZGVmaW5lZCAoICRyZXZpc2lvbjEgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICggdW5kZWYsICRmaWxlMSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICAgICAgICAgJG1ldGExID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkcmV2aXNpb24xKTsKKyAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTEgKSBhbmQgJG1ldGExLT57ZmlsZWhhc2h9IG5lICJkZWxldGVkIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgRmlsZSAkZmlsZW5hbWUgYXQgcmV2aXNpb24gMS4kcmV2aXNpb24xIGRvZXNuJ3QgZXhpc3RcbiI7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YTEtPntmaWxlaGFzaH0sICRmaWxlMSk7CisgICAgICAgIH0KKyAgICAgICAgIyBvdGhlcndpc2Ugd2UganVzdCB1c2UgdGhlIHdvcmtpbmcgY29weSByZXZpc2lvbgorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICggdW5kZWYsICRmaWxlMSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICAgICAgICAgJG1ldGExID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkd3Jldik7CisgICAgICAgICAgICB0cmFuc21pdGZpbGUoJG1ldGExLT57ZmlsZWhhc2h9LCAkZmlsZTEpOworICAgICAgICB9CisKKyAgICAgICAgIyBpZiB3ZSBoYXZlIGEgc2Vjb25kIC1yIHN3aXRjaCwgdXNlIGl0IHRvbworICAgICAgICBpZiAoIGRlZmluZWQgKCAkcmV2aXNpb24yICkgKQorICAgICAgICB7CisgICAgICAgICAgICAoIHVuZGVmLCAkZmlsZTIgKSA9IHRlbXBmaWxlKCBESVIgPT4gJFRFTVBfRElSLCBPUEVOID0+IDAgKTsKKyAgICAgICAgICAgICRtZXRhMiA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJHJldmlzaW9uMik7CisKKyAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTIgKSBhbmQgJG1ldGEyLT57ZmlsZWhhc2h9IG5lICJkZWxldGVkIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgRmlsZSAkZmlsZW5hbWUgYXQgcmV2aXNpb24gMS4kcmV2aXNpb24yIGRvZXNuJ3QgZXhpc3RcbiI7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRtZXRhMi0+e2ZpbGVoYXNofSwgJGZpbGUyKTsKKyAgICAgICAgfQorICAgICAgICAjIG90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgd29ya2luZyBjb3B5CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgJGZpbGUyID0gJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX07CisgICAgICAgIH0KKworICAgICAgICAjIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiAtciwgYW5kIHdlIGRvbid0IGhhdmUgYSAkZmlsZTIgeWV0LCBsZXRzIGdldCBvbmUKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHJldmlzaW9uMSApIGFuZCBub3QgZGVmaW5lZCAoICRmaWxlMiApICkKKyAgICAgICAgeworICAgICAgICAgICAgKCB1bmRlZiwgJGZpbGUyICkgPSB0ZW1wZmlsZSggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgICAgICAgICAkbWV0YTIgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICR3cmV2KTsKKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YTItPntmaWxlaGFzaH0sICRmaWxlMik7CisgICAgICAgIH0KKworICAgICAgICAjIFdlIG5lZWQgdG8gaGF2ZSByZXRyaWV2ZWQgc29tZXRoaW5nIHVzZWZ1bAorICAgICAgICBuZXh0IHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTEgKSApOworCisgICAgICAgICMgRmlsZXMgdG8gZGF0ZSBpZiB0aGUgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiwgYW5kIHRoZSB3b3JraW5nIGNvcHkgaXMgdW5tb2RpZmllZAorICAgICAgICBuZXh0IGlmICggbm90IGRlZmluZWQgKCAkbWV0YTIgKSBhbmQgJHdyZXYgPT0gJG1ldGExLT57cmV2aXNpb259CisgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAoICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9IGFuZCAoIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gKSBvciAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSAhfiAvXlwrPS8gKSApCisgICAgICAgICAgICAgICAgICAgICBvciAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSkgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG1ldGExLT57ZmlsZWhhc2h9ICkgKQorICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAjIEFwcGFyZW50bHkgd2Ugb25seSBzaG93IGRpZmZzIGZvciBsb2NhbGx5IG1vZGlmaWVkIGZpbGVzCisgICAgICAgIG5leHQgdW5sZXNzICggZGVmaW5lZCgkbWV0YTIpIG9yIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApICk7CisKKyAgICAgICAgcHJpbnQgIk0gSW5kZXg6ICRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIk0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICAgICAgcHJpbnQgIk0gUkNTIGZpbGU6ICRzdGF0ZS0+e0NWU1JPT1R9LyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lLHZcbiI7CisgICAgICAgIHByaW50ICJNIHJldHJpZXZpbmcgcmV2aXNpb24gMS4kbWV0YTEtPntyZXZpc2lvbn1cbiIgaWYgKCBkZWZpbmVkICggJG1ldGExICkgKTsKKyAgICAgICAgcHJpbnQgIk0gcmV0cmlldmluZyByZXZpc2lvbiAxLiRtZXRhMi0+e3JldmlzaW9ufVxuIiBpZiAoIGRlZmluZWQgKCAkbWV0YTIgKSApOworICAgICAgICBwcmludCAiTSBkaWZmICI7CisgICAgICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMgJXskc3RhdGUtPntvcHR9fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcmVmICRzdGF0ZS0+e29wdH17JG9wdH0gZXEgIkFSUkFZIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKCBAeyRzdGF0ZS0+e29wdH17JG9wdH19ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICItJG9wdCAkdmFsdWUgIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ICItJG9wdCAiOworICAgICAgICAgICAgICAgIHByaW50ICIkc3RhdGUtPntvcHR9eyRvcHR9ICIgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57b3B0fXskb3B0fSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKworICAgICAgICAkbG9nLT5pbmZvKCJEaWZmaW5nICRmaWxlbmFtZSAtciAkbWV0YTEtPntyZXZpc2lvbn0gLXIgIiAuICggJG1ldGEyLT57cmV2aXNpb259IG9yICJ3b3JraW5nY29weSIgKSk7CisKKyAgICAgICAgKCAkZmgsICRmaWxlZGlmZiApID0gdGVtcGZpbGUgKCBESVIgPT4gJFRFTVBfRElSICk7CisKKyAgICAgICAgaWYgKCBleGlzdHMgJHN0YXRlLT57b3B0fXt1fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5c3RlbSgiZGlmZiAtdSAtTCAnJGZpbGVuYW1lIHJldmlzaW9uIDEuJG1ldGExLT57cmV2aXNpb259JyAtTCAnJGZpbGVuYW1lICIgLiAoIGRlZmluZWQoJG1ldGEyLT57cmV2aXNpb259KSA/ICJyZXZpc2lvbiAxLiRtZXRhMi0+e3JldmlzaW9ufSIgOiAid29ya2luZyBjb3B5IiApIC4gIicgJGZpbGUxICRmaWxlMiA+ICRmaWxlZGlmZiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3lzdGVtKCJkaWZmICRmaWxlMSAkZmlsZTIgPiAkZmlsZWRpZmYiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICggPCRmaD4gKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiTSAkXyI7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgJGZoOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworc3ViIHJlcV9sb2cKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJsb2ciKTsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfbG9nIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworICAgICMkbG9nLT5kZWJ1ZygibG9nIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgIG15ICggJG1pbnJldiwgJG1heHJldiApOworICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e29wdH17cn0gKSBhbmQgJHN0YXRlLT57b3B0fXtyfSA9fiAvKFtcZC5dKyk/KDo6PykoW1xkLl0rKT8vICkKKyAgICB7CisgICAgICAgIG15ICRjb250cm9sID0gJDI7CisgICAgICAgICRtaW5yZXYgPSAkMTsKKyAgICAgICAgJG1heHJldiA9ICQzOworICAgICAgICAkbWlucmV2ID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRtaW5yZXYgKSApOworICAgICAgICAkbWF4cmV2ID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRtYXhyZXYgKSApOworICAgICAgICAkbWlucmV2KysgaWYgKCBkZWZpbmVkKCRtaW5yZXYpIGFuZCAkY29udHJvbCBlcSAiOjoiICk7CisgICAgfQorCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgaWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gd29yayBvdXQgd2hhdCBmaWxlcyB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIHN0YXR1cyBvbiAuLi4KKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkaGVhZG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICRyZXZpc2lvbnMgPSAkdXBkYXRlci0+Z2V0bG9nKCRmaWxlbmFtZSk7CisgICAgICAgIG15ICR0b3RhbHJldmlzaW9ucyA9IHNjYWxhcihAJHJldmlzaW9ucyk7CisKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJG1pbnJldiApICkKKyAgICAgICAgeworICAgICAgICAgICAgJGxvZy0+ZGVidWcoIlJlbW92aW5nIHJldmlzaW9ucyBsZXNzIHRoYW4gJG1pbnJldiIpOworICAgICAgICAgICAgd2hpbGUgKCBzY2FsYXIoQCRyZXZpc2lvbnMpID4gMCBhbmQgJHJldmlzaW9ucy0+Wy0xXXtyZXZpc2lvbn0gPCAkbWlucmV2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3AgQCRyZXZpc2lvbnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBkZWZpbmVkICggJG1heHJldiApICkKKyAgICAgICAgeworICAgICAgICAgICAgJGxvZy0+ZGVidWcoIlJlbW92aW5nIHJldmlzaW9ucyBncmVhdGVyIHRoYW4gJG1heHJldiIpOworICAgICAgICAgICAgd2hpbGUgKCBzY2FsYXIoQCRyZXZpc2lvbnMpID4gMCBhbmQgJHJldmlzaW9ucy0+WzBde3JldmlzaW9ufSA+ICRtYXhyZXYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoaWZ0IEAkcmV2aXNpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmV4dCB1bmxlc3MgKCBzY2FsYXIoQCRyZXZpc2lvbnMpICk7CisKKyAgICAgICAgcHJpbnQgIk0gXG4iOworICAgICAgICBwcmludCAiTSBSQ1MgZmlsZTogJHN0YXRlLT57Q1ZTUk9PVH0vJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWUsdlxuIjsKKyAgICAgICAgcHJpbnQgIk0gV29ya2luZyBmaWxlOiAkZmlsZW5hbWVcbiI7CisgICAgICAgIHByaW50ICJNIGhlYWQ6IDEuJGhlYWRtZXRhLT57cmV2aXNpb259XG4iOworICAgICAgICBwcmludCAiTSBicmFuY2g6XG4iOworICAgICAgICBwcmludCAiTSBsb2Nrczogc3RyaWN0XG4iOworICAgICAgICBwcmludCAiTSBhY2Nlc3MgbGlzdDpcbiI7CisgICAgICAgIHByaW50ICJNIHN5bWJvbGljIG5hbWVzOlxuIjsKKyAgICAgICAgcHJpbnQgIk0ga2V5d29yZCBzdWJzdGl0dXRpb246IGt2XG4iOworICAgICAgICBwcmludCAiTSB0b3RhbCByZXZpc2lvbnM6ICR0b3RhbHJldmlzaW9ucztcdHNlbGVjdGVkIHJldmlzaW9uczogIiAuIHNjYWxhcihAJHJldmlzaW9ucykgLiAiXG4iOworICAgICAgICBwcmludCAiTSBkZXNjcmlwdGlvbjpcbiI7CisKKyAgICAgICAgZm9yZWFjaCBteSAkcmV2aXNpb24gKCBAJHJldmlzaW9ucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICAgICAgICBwcmludCAiTSByZXZpc2lvbiAxLiRyZXZpc2lvbi0+e3JldmlzaW9ufVxuIjsKKyAgICAgICAgICAgICMgcmVmb3JtYXQgdGhlIGRhdGUgZm9yIGxvZyBvdXRwdXQKKyAgICAgICAgICAgICRyZXZpc2lvbi0+e21vZGlmaWVkfSA9IHNwcmludGYoJyUwNGQvJTAyZC8lMDJkICVzJywgJDMsICREQVRFX0xJU1QtPnskMn0sICQxLCAkNCApIGlmICggJHJldmlzaW9uLT57bW9kaWZpZWR9ID1+IC8oXGQrKVxzKyhcdyspXHMrKFxkKylccysoXFMrKS8gYW5kIGRlZmluZWQoJERBVEVfTElTVC0+eyQyfSkgKTsKKyAgICAgICAgICAgICRyZXZpc2lvbi0+e2F1dGhvcn0gPX4gcy9ccysuKi8vOworICAgICAgICAgICAgJHJldmlzaW9uLT57YXV0aG9yfSA9fiBzL14oLns4fSkuKi8kMS87CisgICAgICAgICAgICBwcmludCAiTSBkYXRlOiAkcmV2aXNpb24tPnttb2RpZmllZH07ICBhdXRob3I6ICRyZXZpc2lvbi0+e2F1dGhvcn07ICBzdGF0ZTogIiAuICggJHJldmlzaW9uLT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiA/ICJkZWFkIiA6ICJFeHAiICkgLiAiOyAgbGluZXM6ICsyIC0zXG4iOworICAgICAgICAgICAgbXkgJGNvbW1pdG1lc3NhZ2UgPSAkdXBkYXRlci0+Y29tbWl0bWVzc2FnZSgkcmV2aXNpb24tPntjb21taXRoYXNofSk7CisgICAgICAgICAgICAkY29tbWl0bWVzc2FnZSA9fiBzL14vTSAvbWc7CisgICAgICAgICAgICBwcmludCAkY29tbWl0bWVzc2FnZSAuICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIk0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX2Fubm90YXRlCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiYW5ub3RhdGUiKTsKKworICAgICRsb2ctPmluZm8oInJlcV9hbm5vdGF0ZSA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKyAgICAjJGxvZy0+ZGVidWcoInN0YXR1cyBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGF0IGZpbGVzIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgYW5ub3RhdGUgb24gLi4uCisgICAgYXJnc2Zyb21kaXIoJHVwZGF0ZXIpOworCisgICAgIyB3ZSdsbCBuZWVkIGEgdGVtcG9yYXJ5IGNoZWNrb3V0IGRpcgorICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyICggRElSID0+ICRURU1QX0RJUiApOworICAgIG15ICggdW5kZWYsICRmaWxlX2luZGV4ICkgPSB0ZW1wZmlsZSAoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICRsb2ctPmluZm8oIlRlbXAgY2hlY2tvdXRkaXIgY3JlYXRpb24gc3VjY2Vzc2Z1bCwgYmFzaW5nIGFubm90YXRlIHNlc3Npb24gd29yayBvbiAnJHRtcGRpcicsIGluZGV4IGZpbGUgaXMgJyRmaWxlX2luZGV4JyIpOworCisgICAgJEVOVntHSVRfRElSfSA9ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8iOworICAgICRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGZpbGVfaW5kZXg7CisKKyAgICBjaGRpciAkdG1wZGlyOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworCisgICAgICAgIG5leHQgdW5sZXNzICggJG1ldGEtPntyZXZpc2lvbn0gKTsKKworCSMgZ2V0IGFsbCB0aGUgY29tbWl0cyB0aGF0IHRoaXMgZmlsZSB3YXMgaW4KKwkjIGluIGRlbnNlIGZvcm1hdCAtLSBha2Egc2tpcCBkZWFkIHJldmlzaW9ucworICAgICAgICBteSAkcmV2aXNpb25zICAgPSAkdXBkYXRlci0+Z2V0aGlzdG9yeWRlbnNlKCRmaWxlbmFtZSk7CisJbXkgJGxhc3RzZWVuaW4gID0gJHJldmlzaW9ucy0+WzBdWzJdOworCisJIyBwb3B1bGF0ZSB0aGUgdGVtcG9yYXJ5IGluZGV4IGJhc2VkIG9uIHRoZSBsYXRlc3QgY29tbWl0IHdlcmUgd2Ugc2F3CisJIyB0aGUgZmlsZSAtLSBidXQgZG8gaXQgY2hlYXBseSB3aXRob3V0IGNoZWNraW5nIG91dCBhbnkgZmlsZXMKKwkjIFRPRE86IGlmIHdlIGdvdCBhIHJldmlzaW9uIGZyb20gdGhlIGNsaWVudCwgdXNlIHRoYXQgaW5zdGVhZAorCSMgdG8gbG9vayB1cCB0aGUgY29tbWl0aGFzaCBpbiBzcWxpdGUgKHN0aWxsIGdvb2QgdG8gZGVmYXVsdCB0bworCSMgdGhlIGN1cnJlbnQgaGVhZCBhcyB3ZSBkbyBub3cpCisJc3lzdGVtKCJnaXQtcmVhZC10cmVlIiwgJGxhc3RzZWVuaW4pOworCXVubGVzcyAoJD8gPT0gMCkKKwl7CisJICAgIGRpZSAiRXJyb3IgcnVubmluZyBnaXQtcmVhZC10cmVlICRsYXN0c2VlbmluICRmaWxlX2luZGV4ICQhIjsKKwl9CisJJGxvZy0+aW5mbygiQ3JlYXRlZCBpbmRleCAnJGZpbGVfaW5kZXgnIHdpdGggY29tbWl0ICRsYXN0c2VlbmluIC0gZXhpdCBzdGF0dXMgJD8iKTsKKworICAgICAgICAjIGRvIGEgY2hlY2tvdXQgb2YgdGhlIGZpbGUKKyAgICAgICAgc3lzdGVtKCdnaXQtY2hlY2tvdXQtaW5kZXgnLCAnLWYnLCAnLXUnLCAkZmlsZW5hbWUpOworICAgICAgICB1bmxlc3MgKCQ/ID09IDApIHsKKyAgICAgICAgICAgIGRpZSAiRXJyb3IgcnVubmluZyBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgJGZpbGVuYW1lIDogJCEiOworICAgICAgICB9CisKKyAgICAgICAgJGxvZy0+aW5mbygiQW5ub3RhdGUgJGZpbGVuYW1lIik7CisKKyAgICAgICAgIyBQcmVwYXJlIGEgZmlsZSB3aXRoIHRoZSBjb21taXRzIGZyb20gdGhlIGxpbmVhcml6ZWQKKyAgICAgICAgIyBoaXN0b3J5IHRoYXQgYW5ub3RhdGUgc2hvdWxkIGtub3cgYWJvdXQuIFRoaXMgcHJldmVudHMKKyAgICAgICAgIyBnaXQtanNhbm5vdGF0ZSB0ZWxsaW5nIHVzIGFib3V0IGNvbW1pdHMgd2UgYXJlIGhpZGluZworICAgICAgICAjIGZyb20gdGhlIGNsaWVudC4KKworICAgICAgICBvcGVuKEFOTk9UQVRFSElOVFMsICI+JHRtcGRpci8uYW5ub3RhdGVfaGludHMiKSBvciBkaWUgIkVycm9yIG9wZW5pbmcgPiAkdG1wZGlyLy5hbm5vdGF0ZV9oaW50cyAkISI7CisgICAgICAgIGZvciAobXkgJGk9MDsgJGkgPCBAJHJldmlzaW9uczsgJGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgQU5OT1RBVEVISU5UUyAkcmV2aXNpb25zLT5bJGldWzJdOworICAgICAgICAgICAgaWYgKCRpKzEgPCBAJHJldmlzaW9ucykgeyAjIGhhdmUgd2UgZ290IGEgcGFyZW50PworICAgICAgICAgICAgICAgIHByaW50IEFOTk9UQVRFSElOVFMgJyAnIC4gJHJldmlzaW9ucy0+WyRpKzFdWzJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnQgQU5OT1RBVEVISU5UUyAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnQgQU5OT1RBVEVISU5UUyAiXG4iOworICAgICAgICBjbG9zZSBBTk5PVEFURUhJTlRTOworCisgICAgICAgIG15ICRhbm5vdGF0ZWNtZCA9ICdnaXQtYW5ub3RhdGUnOworICAgICAgICBvcGVuKEFOTk9UQVRFLCAiLXwiLCAkYW5ub3RhdGVjbWQsICctbCcsICctUycsICIkdG1wZGlyLy5hbm5vdGF0ZV9oaW50cyIsICRmaWxlbmFtZSkKKwkgICAgb3IgZGllICJFcnJvciBpbnZva2luZyAkYW5ub3RhdGVjbWQgLWwgLVMgJHRtcGRpci8uYW5ub3RhdGVfaGludHMgJGZpbGVuYW1lIDogJCEiOworICAgICAgICBteSAkbWV0YWRhdGEgPSB7fTsKKyAgICAgICAgcHJpbnQgIkUgQW5ub3RhdGlvbnMgZm9yICRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIkUgKioqKioqKioqKioqKioqXG4iOworICAgICAgICB3aGlsZSAoIDxBTk5PVEFURT4gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobS9eKFthLXpBLVowLTldezQwfSlcdFwoW15cKV0qXCkoLiopJC9pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG15ICRjb21taXRoYXNoID0gJDE7CisgICAgICAgICAgICAgICAgbXkgJGRhdGEgPSAkMjsKKyAgICAgICAgICAgICAgICB1bmxlc3MgKCBkZWZpbmVkICggJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9ICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9ID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkY29tbWl0aGFzaCk7CisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofXthdXRob3J9ID1+IHMvXHMrLiovLzsKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e2F1dGhvcn0gPX4gcy9eKC57OH0pLiovJDEvOworICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17bW9kaWZpZWR9ID0gc3ByaW50ZigiJTAyZC0lcy0lMDJkIiwgJDEsICQyLCAkMykgaWYgKCAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17bW9kaWZpZWR9ID1+IC9eKFxkKylccyhcdyspXHNcZFxkKFxkXGQpLyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIk0gMS4lLTVkICAgICAgKCUtOHMgJTEwcyk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17cmV2aXNpb259LAorICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17YXV0aG9yfSwKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e21vZGlmaWVkfSwKKyAgICAgICAgICAgICAgICAgICAgJGRhdGEKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbG9nLT53YXJuKCJFcnJvciBpbiBhbm5vdGF0ZSBvdXRwdXQhIExJTkU6ICRfIik7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgQW5ub3RhdGUgZXJyb3IgXG4iOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgQU5OT1RBVEU7CisgICAgfQorCisgICAgIyBkb25lOyBnZXQgb3V0IG9mIHRoZSB0ZW1wZGlyCisgICAgY2hkaXIgIi8iOworCisgICAgcHJpbnQgIm9rXG4iOworCit9CisKKyMgVGhpcyBtZXRob2QgdGFrZXMgdGhlIHN0YXRlLT57YXJndW1lbnRzfSBhcnJheSBhbmQgcHJvZHVjZXMgdHdvIG5ldyBhcnJheXMuCisjIFRoZSBmaXJzdCBpcyAkc3RhdGUtPnthcmdzfSB3aGljaCBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgJy0tJyBhcmd1bWVudCwgYW5kCisjIHRoZSBzZWNvbmQgaXMgJHN0YXRlLT57ZmlsZXN9IHdoaWNoIGlzIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQuCitzdWIgYXJnc3BsaXQKK3sKKyAgICByZXR1cm4gdW5sZXNzKCBkZWZpbmVkKCRzdGF0ZS0+e2FyZ3VtZW50c30pIGFuZCByZWYgJHN0YXRlLT57YXJndW1lbnRzfSBlcSAiQVJSQVkiICk7CisKKyAgICBteSAkdHlwZSA9IHNoaWZ0OworCisgICAgJHN0YXRlLT57YXJnc30gPSBbXTsKKyAgICAkc3RhdGUtPntmaWxlc30gPSBbXTsKKyAgICAkc3RhdGUtPntvcHR9ID0ge307CisKKyAgICBpZiAoIGRlZmluZWQoJHR5cGUpICkKKyAgICB7CisgICAgICAgIG15ICRvcHQgPSB7fTsKKyAgICAgICAgJG9wdCA9IHsgQSA9PiAwLCBOID0+IDAsIFAgPT4gMCwgUiA9PiAwLCBjID0+IDAsIGYgPT4gMCwgbCA9PiAwLCBuID0+IDAsIHAgPT4gMCwgcyA9PiAwLCByID0+IDEsIEQgPT4gMSwgZCA9PiAxLCBrID0+IDEsIGogPT4gMSwgfSBpZiAoICR0eXBlIGVxICJjbyIgKTsKKyAgICAgICAgJG9wdCA9IHsgdiA9PiAwLCBsID0+IDAsIFIgPT4gMCB9IGlmICggJHR5cGUgZXEgInN0YXR1cyIgKTsKKyAgICAgICAgJG9wdCA9IHsgQSA9PiAwLCBQID0+IDAsIEMgPT4gMCwgZCA9PiAwLCBmID0+IDAsIGwgPT4gMCwgUiA9PiAwLCBwID0+IDAsIGsgPT4gMSwgciA9PiAxLCBEID0+IDEsIGogPT4gMSwgSSA9PiAxLCBXID0+IDEgfSBpZiAoICR0eXBlIGVxICJ1cGRhdGUiICk7CisgICAgICAgICRvcHQgPSB7IGwgPT4gMCwgUiA9PiAwLCBrID0+IDEsIEQgPT4gMSwgRCA9PiAxLCByID0+IDIgfSBpZiAoICR0eXBlIGVxICJkaWZmIiApOworICAgICAgICAkb3B0ID0geyBjID0+IDAsIFIgPT4gMCwgbCA9PiAwLCBmID0+IDAsIEYgPT4gMSwgbSA9PiAxLCByID0+IDEgfSBpZiAoICR0eXBlIGVxICJjaSIgKTsKKyAgICAgICAgJG9wdCA9IHsgayA9PiAxLCBtID0+IDEgfSBpZiAoICR0eXBlIGVxICJhZGQiICk7CisgICAgICAgICRvcHQgPSB7IGYgPT4gMCwgbCA9PiAwLCBSID0+IDAgfSBpZiAoICR0eXBlIGVxICJyZW1vdmUiICk7CisgICAgICAgICRvcHQgPSB7IGwgPT4gMCwgYiA9PiAwLCBoID0+IDAsIFIgPT4gMCwgdCA9PiAwLCBOID0+IDAsIFMgPT4gMCwgciA9PiAxLCBkID0+IDEsIHMgPT4gMSwgdyA9PiAxIH0gaWYgKCAkdHlwZSBlcSAibG9nIiApOworCisKKyAgICAgICAgd2hpbGUgKCBzY2FsYXIgKCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319ICkgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbXkgJGFyZyA9IHNoaWZ0IEB7JHN0YXRlLT57YXJndW1lbnRzfX07CisKKyAgICAgICAgICAgIG5leHQgaWYgKCAkYXJnIGVxICItLSIgKTsKKyAgICAgICAgICAgIG5leHQgdW5sZXNzICggJGFyZyA9fiAvXFMvICk7CisKKyAgICAgICAgICAgICMgaWYgdGhlIGFyZ3VtZW50IGxvb2tzIGxpa2UgYSBzd2l0Y2gKKyAgICAgICAgICAgIGlmICggJGFyZyA9fiAvXi0oXHcpKC4qKS8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgaWYgaXQncyBhIHN3aXRjaCB0aGF0IHRha2VzIGFuIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgaWYgKCAkb3B0LT57JDF9ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMgSWYgdGhpcyBzd2l0Y2ggaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAoICRvcHQtPnskMX0gPiAxIGFuZCBleGlzdHMgKCAkc3RhdGUtPntvcHR9eyQxfSApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlLT57b3B0fXskMX0gPSBbICRzdGF0ZS0+e29wdH17JDF9IF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbmd0aCgkMikgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57b3B0fXskMX19LCQyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57b3B0fXskMX19LCBzaGlmdCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGVyZSdzIGV4dHJhIGRhdGEgaW4gdGhlIGFyZywgdXNlIHRoYXQgYXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgc3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbmd0aCgkMikgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUtPntvcHR9eyQxfSA9ICQyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUtPntvcHR9eyQxfSA9IHNoaWZ0IEB7JHN0YXRlLT57YXJndW1lbnRzfX07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkc3RhdGUtPntvcHR9eyQxfSA9IHVuZGVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJnc319LCAkYXJnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG15ICRtb2RlID0gMDsKKworICAgICAgICBmb3JlYWNoIG15ICR2YWx1ZSAoIEB7JHN0YXRlLT57YXJndW1lbnRzfX0gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSBlcSAiLS0iICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkbW9kZSsrOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJnc319LCAkdmFsdWUgaWYgKCAkbW9kZSA9PSAwICk7CisgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57ZmlsZXN9fSwgJHZhbHVlIGlmICggJG1vZGUgPT0gMSApOworICAgICAgICB9CisgICAgfQorfQorCisjIFRoaXMgbWV0aG9kIHVzZXMgJHN0YXRlLT57ZGlyZWN0b3J5fSB0byBwb3B1bGF0ZSAkc3RhdGUtPnthcmdzfSB3aXRoIGEgbGlzdCBvZiBmaWxlbmFtZXMKK3N1YiBhcmdzZnJvbWRpcgoreworICAgIG15ICR1cGRhdGVyID0gc2hpZnQ7CisKKyAgICAkc3RhdGUtPnthcmdzfSA9IFtdIGlmICggc2NhbGFyKEB7JHN0YXRlLT57YXJnc319KSA9PSAxIGFuZCAkc3RhdGUtPnthcmdzfVswXSBlcSAiLiIgKTsKKworICAgIHJldHVybiBpZiAoIHNjYWxhciAoIEB7JHN0YXRlLT57YXJnc319ICkgPiAxICk7CisKKyAgICBpZiAoIHNjYWxhcihAeyRzdGF0ZS0+e2FyZ3N9fSkgPT0gMSApCisgICAgeworICAgICAgICBteSAkYXJnID0gJHN0YXRlLT57YXJnc31bMF07CisgICAgICAgICRhcmcgLj0gJHN0YXRlLT57cHJlcGVuZGRpcn0gaWYgKCBkZWZpbmVkICggJHN0YXRlLT57cHJlcGVuZGRpcn0gKSApOworCisgICAgICAgICRsb2ctPmluZm8oIk9ubHkgb25lIGFyZyBzcGVjaWZpZWQsIGNoZWNraW5nIGZvciBkaXJlY3RvcnkgZXhwYW5zaW9uIG9uICckYXJnJyIpOworCisgICAgICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBAeyR1cGRhdGVyLT5nZXRoZWFkfSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgaWYgKCAkZmlsZS0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgYW5kIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGUtPntuYW1lfX0gKSApOworICAgICAgICAgICAgbmV4dCB1bmxlc3MgKCAkZmlsZS0+e25hbWV9ID1+IC9eJGFyZ1wvLyBvciAkZmlsZS0+e25hbWV9IGVxICRhcmcgICk7CisgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJnc319LCAkZmlsZS0+e25hbWV9OworICAgICAgICB9CisKKyAgICAgICAgc2hpZnQgQHskc3RhdGUtPnthcmdzfX0gaWYgKCBzY2FsYXIoQHskc3RhdGUtPnthcmdzfX0pID4gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgICRsb2ctPmluZm8oIk9ubHkgb25lIGFyZyBzcGVjaWZpZWQsIHBvcHVsYXRpbmcgZmlsZSBsaXN0IGF1dG9tYXRpY2FsbHkiKTsKKworICAgICAgICAkc3RhdGUtPnthcmdzfSA9IFtdOworCisgICAgICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBAeyR1cGRhdGVyLT5nZXRoZWFkfSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgaWYgKCAkZmlsZS0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgYW5kIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGUtPntuYW1lfX0gKSApOworICAgICAgICAgICAgbmV4dCB1bmxlc3MgKCAkZmlsZS0+e25hbWV9ID1+IHMvXiRzdGF0ZS0+e3ByZXBlbmRkaXJ9Ly8gKTsKKyAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPnthcmdzfX0sICRmaWxlLT57bmFtZX07CisgICAgICAgIH0KKyAgICB9Cit9CisKKyMgVGhpcyBtZXRob2QgY2xlYW5zIHVwIHRoZSAkc3RhdGUgdmFyaWFibGUgYWZ0ZXIgYSBjb21tYW5kIHRoYXQgdXNlcyBhcmd1bWVudHMgaGFzIHJ1bgorc3ViIHN0YXRlY2xlYW51cAoreworICAgICRzdGF0ZS0+e2ZpbGVzfSA9IFtdOworICAgICRzdGF0ZS0+e2FyZ3N9ID0gW107CisgICAgJHN0YXRlLT57YXJndW1lbnRzfSA9IFtdOworICAgICRzdGF0ZS0+e2VudHJpZXN9ID0ge307Cit9CisKK3N1YiByZXZwYXJzZQoreworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSApICk7CisKKyAgICByZXR1cm4gJDEgaWYgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSA9fiAvXjFcLihcZCspLyApOworICAgIHJldHVybiAtJDEgaWYgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSA9fiAvXi0xXC4oXGQrKS8gKTsKKworICAgIHJldHVybiB1bmRlZjsKK30KKworIyBUaGlzIG1ldGhvZCB0YWtlcyBhIGZpbGUgaGFzaCBhbmQgZG9lcyBhIENWUyAiZmlsZSB0cmFuc2ZlciIgd2hpY2ggdHJhbnNtaXRzIHRoZQorIyBzaXplIG9mIHRoZSBmaWxlLCBhbmQgdGhlbiB0aGUgZmlsZSBjb250ZW50cy4KKyMgSWYgYSBzZWNvbmQgYXJndW1lbnQgJHRhcmdldGZpbGUgaXMgZ2l2ZW4sIHRoZSBmaWxlIGlzIGluc3RlYWQgd3JpdHRlbiBvdXQgdG8KKyMgYSBmaWxlIGJ5IHRoZSBuYW1lIG9mICR0YXJnZXRmaWxlCitzdWIgdHJhbnNtaXRmaWxlCit7CisgICAgbXkgJGZpbGVoYXNoID0gc2hpZnQ7CisgICAgbXkgJHRhcmdldGZpbGUgPSBzaGlmdDsKKworICAgIGlmICggZGVmaW5lZCAoICRmaWxlaGFzaCApIGFuZCAkZmlsZWhhc2ggZXEgImRlbGV0ZWQiICkKKyAgICB7CisgICAgICAgICRsb2ctPndhcm4oImZpbGVoYXNoIGlzICdkZWxldGVkJyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGllICJOZWVkIGZpbGVoYXNoIiB1bmxlc3MgKCBkZWZpbmVkICggJGZpbGVoYXNoICkgYW5kICRmaWxlaGFzaCA9fiAvXlthLXpBLVowLTldezQwfSQvICk7CisKKyAgICBteSAkdHlwZSA9IGBnaXQtY2F0LWZpbGUgLXQgJGZpbGVoYXNoYDsKKyAgICBjaG9tcCAkdHlwZTsKKworICAgIGRpZSAoICJJbnZhbGlkIHR5cGUgJyR0eXBlJyAoZXhwZWN0ZWQgJ2Jsb2InKSIgKSB1bmxlc3MgKCBkZWZpbmVkICggJHR5cGUgKSBhbmQgJHR5cGUgZXEgImJsb2IiICk7CisKKyAgICBteSAkc2l6ZSA9IGBnaXQtY2F0LWZpbGUgLXMgJGZpbGVoYXNoYDsKKyAgICBjaG9tcCAkc2l6ZTsKKworICAgICRsb2ctPmRlYnVnKCJ0cmFuc21pdGZpbGUoJGZpbGVoYXNoKSBzaXplPSRzaXplLCB0eXBlPSR0eXBlIik7CisKKyAgICBpZiAoIG9wZW4gbXkgJGZoLCAnLXwnLCAiZ2l0LWNhdC1maWxlIiwgImJsb2IiLCAkZmlsZWhhc2ggKQorICAgIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHRhcmdldGZpbGUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wZW4gTkVXRklMRSwgIj4iLCAkdGFyZ2V0ZmlsZSBvciBkaWUoIkNvdWxkbid0IG9wZW4gJyR0YXJnZXRmaWxlJyBmb3Igd3JpdGluZyA6ICQhIik7CisgICAgICAgICAgICBwcmludCBORVdGSUxFICRfIHdoaWxlICggPCRmaD4gKTsKKyAgICAgICAgICAgIGNsb3NlIE5FV0ZJTEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiJHNpemVcbiI7CisgICAgICAgICAgICBwcmludCB3aGlsZSAoIDwkZmg+ICk7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgJGZoIG9yIGRpZSAoIkNvdWxkbid0IGNsb3NlIGZpbGVoYW5kbGUgZm9yIHRyYW5zbWl0ZmlsZSgpIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllKCJDb3VsZG4ndCBleGVjdXRlIGdpdC1jYXQtZmlsZSIpOworICAgIH0KK30KKworIyBUaGlzIG1ldGhvZCB0YWtlcyBhIGZpbGUgbmFtZSwgYW5kIHJldHVybnMgKCAkZGlycGFydCwgJGZpbGVwYXJ0ICkgd2hpY2gKKyMgcmVmZXJzIHRvIHRoZSBkaXJlY3RvcnkgcG9ydGlvbiBhbmQgdGhlIGZpbGUgcG9ydGlvbiBvZiB0aGUgZmlsZW5hbWUKKyMgcmVzcGVjdGl2ZWx5CitzdWIgZmlsZW5hbWVzcGxpdAoreworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworICAgIG15ICRmaXhmb3Jsb2NhbGRpciA9IHNoaWZ0OworCisgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSAoICRmaWxlbmFtZSwgIi4iICk7CisgICAgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSAoICQyLCAkMSApIGlmICggJGZpbGVuYW1lID1+IC8oLiopXC8oLiopLyApOworICAgICRkaXJwYXJ0IC49ICIvIjsKKworICAgIGlmICggJGZpeGZvcmxvY2FsZGlyICkKKyAgICB7CisgICAgICAgICRkaXJwYXJ0ID1+IHMvXiRzdGF0ZS0+e3ByZXBlbmRkaXJ9Ly87CisgICAgfQorCisgICAgcmV0dXJuICggJGZpbGVwYXJ0LCAkZGlycGFydCApOworfQorCitzdWIgZmlsZWNsZWFudXAKK3sKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmRlZiB1bmxlc3MoZGVmaW5lZCgkZmlsZW5hbWUpKTsKKyAgICBpZiAoICRmaWxlbmFtZSA9fiAvXlwvLyApCisgICAgeworICAgICAgICBwcmludCAiRSBhYnNvbHV0ZSBmaWxlbmFtZXMgJyRmaWxlbmFtZScgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXJcbiI7CisgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICB9CisKKyAgICAkZmlsZW5hbWUgPX4gcy9eXC5cLy8vZzsKKyAgICAkZmlsZW5hbWUgPSAkc3RhdGUtPntwcmVwZW5kZGlyfSAuICRmaWxlbmFtZTsKKyAgICByZXR1cm4gJGZpbGVuYW1lOworfQorCitwYWNrYWdlIEdJVENWUzo6bG9nOworCisjIyMjCisjIyMjIENvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKyMjIyMKKyMjIyMgQXV0aG9yczogTWFydHluIFNtaXRoICAgIDxtYXJ0eW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIyAgICAgICAgICBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisjIyMjCisjIyMjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKKz1oZWFkMSBOQU1FCisKK0dJVENWUzo6bG9nCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyB2ZXJ5IGNydWRlIGxvZ2dpbmcgd2l0aCBhIHNpbWlsYXIgaW50ZXJmYWNlIHRvCitMb2c6OkxvZzRwZXJsCisKKz1oZWFkMSBNRVRIT0RTCisKKz1jdXQKKworPWhlYWQyIG5ldworCitDcmVhdGVzIGEgbmV3IGxvZyBvYmplY3QsIG9wdGlvbmFsbHkgeW91IGNhbiBzcGVjaWZ5IGEgZmlsZW5hbWUgaGVyZSB0bworaW5kaWNhdGUgdGhlIGZpbGUgdG8gbG9nIHRvLiBJZiBubyBsb2cgZmlsZSBpcyBzcGVjaWZpZWQsIHlvdSBjYW4gc3BlY2lmeSBvbmUKK2xhdGVyIHdpdGggbWV0aG9kIHNldGZpbGUsIG9yIGluZGljYXRlIHlvdSBubyBsb25nZXIgd2FudCBsb2dnaW5nIHdpdGggbWV0aG9kCitub2ZpbGUuCisKK1VudGlsIG9uZSBvZiB0aGVzZSBtZXRob2RzIGlzIGNhbGxlZCwgYWxsIGxvZyBjYWxscyB3aWxsIGJ1ZmZlciBtZXNzYWdlcyByZWFkeQordG8gd3JpdGUgb3V0LgorCis9Y3V0CitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiA9IHt9OworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKworICAgIGlmICggZGVmaW5lZCAoICRmaWxlbmFtZSApICkKKyAgICB7CisgICAgICAgIG9wZW4gJHNlbGYtPntmaH0sICI+PiIsICRmaWxlbmFtZSBvciBkaWUoIkNvdWxkbid0IG9wZW4gJyRmaWxlbmFtZScgZm9yIHdyaXRpbmcgOiAkISIpOworICAgIH0KKworICAgIHJldHVybiAkc2VsZjsKK30KKworPWhlYWQyIHNldGZpbGUKKworVGhpcyBtZXRob2RzIHRha2VzIGEgZmlsZW5hbWUsIGFuZCBhdHRlbXB0cyB0byBvcGVuIHRoYXQgZmlsZSBhcyB0aGUgbG9nIGZpbGUuCitJZiBzdWNjZXNzZnVsLCBhbGwgYnVmZmVyZWQgZGF0YSBpcyB3cml0dGVuIG91dCB0byB0aGUgZmlsZSwgYW5kIGFueSBmdXJ0aGVyCitsb2dnaW5nIGlzIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIGZpbGUuCisKKz1jdXQKK3N1YiBzZXRmaWxlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIGlmICggZGVmaW5lZCAoICRmaWxlbmFtZSApICkKKyAgICB7CisgICAgICAgIG9wZW4gJHNlbGYtPntmaH0sICI+PiIsICRmaWxlbmFtZSBvciBkaWUoIkNvdWxkbid0IG9wZW4gJyRmaWxlbmFtZScgZm9yIHdyaXRpbmcgOiAkISIpOworICAgIH0KKworICAgIHJldHVybiB1bmxlc3MgKCBkZWZpbmVkICggJHNlbGYtPntidWZmZXJ9ICkgYW5kIHJlZiAkc2VsZi0+e2J1ZmZlcn0gZXEgIkFSUkFZIiApOworCisgICAgd2hpbGUgKCBteSAkbGluZSA9IHNoaWZ0IEB7JHNlbGYtPntidWZmZXJ9fSApCisgICAgeworICAgICAgICBwcmludCB7JHNlbGYtPntmaH19ICRsaW5lOworICAgIH0KK30KKworPWhlYWQyIG5vZmlsZQorCitUaGlzIG1ldGhvZCBpbmRpY2F0ZXMgbm8gbG9nZ2luZyBpcyBnb2luZyB0byBiZSB1c2VkLiBJdCBmbHVzaGVzIGFueSBlbnRyaWVzIGluCit0aGUgaW50ZXJuYWwgYnVmZmVyLCBhbmQgc2V0cyBhIGZsYWcgdG8gZW5zdXJlIG5vIGZ1cnRoZXIgZGF0YSBpcyBwdXQgdGhlcmUuCisKKz1jdXQKK3N1YiBub2ZpbGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntub2xvZ30gPSAxOworCisgICAgcmV0dXJuIHVubGVzcyAoIGRlZmluZWQgKCAkc2VsZi0+e2J1ZmZlcn0gKSBhbmQgcmVmICRzZWxmLT57YnVmZmVyfSBlcSAiQVJSQVkiICk7CisKKyAgICAkc2VsZi0+e2J1ZmZlcn0gPSBbXTsKK30KKworPWhlYWQyIF9sb2dvcGVuCisKK0ludGVybmFsIG1ldGhvZC4gUmV0dXJucyB0cnVlIGlmIHRoZSBsb2cgZmlsZSBpcyBvcGVuLCBmYWxzZSBvdGhlcndpc2UuCisKKz1jdXQKK3N1YiBfbG9nb3BlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gMSBpZiAoIGRlZmluZWQgKCAkc2VsZi0+e2ZofSApIGFuZCByZWYgJHNlbGYtPntmaH0gZXEgIkdMT0IiICk7CisgICAgcmV0dXJuIDA7Cit9CisKKz1oZWFkMiBkZWJ1ZyBpbmZvIHdhcm4gZmF0YWwKKworVGhlc2UgZm91ciBtZXRob2RzIGFyZSB3cmFwcGVycyB0byBfbG9nLiBUaGV5IHByb3ZpZGUgdGhlIGFjdHVhbCBpbnRlcmZhY2UgZm9yCitsb2dnaW5nIGRhdGEuCisKKz1jdXQKK3N1YiBkZWJ1ZyB7IG15ICRzZWxmID0gc2hpZnQ7ICRzZWxmLT5fbG9nKCJkZWJ1ZyIsIEBfKTsgfQorc3ViIGluZm8gIHsgbXkgJHNlbGYgPSBzaGlmdDsgJHNlbGYtPl9sb2coImluZm8iICwgQF8pOyB9CitzdWIgd2FybiAgeyBteSAkc2VsZiA9IHNoaWZ0OyAkc2VsZi0+X2xvZygid2FybiIgLCBAXyk7IH0KK3N1YiBmYXRhbCB7IG15ICRzZWxmID0gc2hpZnQ7ICRzZWxmLT5fbG9nKCJmYXRhbCIsIEBfKTsgfQorCis9aGVhZDIgX2xvZworCitUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCBjYWxsZWQgYnkgdGhlIGxvZ2dpbmcgZnVuY3Rpb25zLiBJdCBnZW5lcmF0ZXMgYQordGltZXN0YW1wIGFuZCBwdXNoZXMgdGhlIGxvZ2dlZCBsaW5lIGVpdGhlciB0byBmaWxlLCBvciBpbnRlcm5hbCBidWZmZXIuCisKKz1jdXQKK3N1YiBfbG9nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbGV2ZWwgPSBzaGlmdDsKKworICAgIHJldHVybiBpZiAoICRzZWxmLT57bm9sb2d9ICk7CisKKyAgICBteSBAdGltZSA9IGxvY2FsdGltZTsKKyAgICBteSAkdGltZXN0cmluZyA9IHNwcmludGYoIiU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgOiAlLTVzIiwKKyAgICAgICAgJHRpbWVbNV0gKyAxOTAwLAorICAgICAgICAkdGltZVs0XSArIDEsCisgICAgICAgICR0aW1lWzNdLAorICAgICAgICAkdGltZVsyXSwKKyAgICAgICAgJHRpbWVbMV0sCisgICAgICAgICR0aW1lWzBdLAorICAgICAgICB1YyAkbGV2ZWwsCisgICAgKTsKKworICAgIGlmICggJHNlbGYtPl9sb2dvcGVuICkKKyAgICB7CisgICAgICAgIHByaW50IHskc2VsZi0+e2ZofX0gJHRpbWVzdHJpbmcgLiAiIC0gIiAuIGpvaW4oIiAiLEBfKSAuICJcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaCBAeyRzZWxmLT57YnVmZmVyfX0sICR0aW1lc3RyaW5nIC4gIiAtICIgLiBqb2luKCIgIixAXykgLiAiXG4iOworICAgIH0KK30KKworPWhlYWQyIERFU1RST1kKKworVGhpcyBtZXRob2Qgc2ltcGx5IGNsb3NlcyB0aGUgZmlsZSBoYW5kbGUgaWYgb25lIGlzIG9wZW4KKworPWN1dAorc3ViIERFU1RST1kKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCAkc2VsZi0+X2xvZ29wZW4gKQorICAgIHsKKyAgICAgICAgY2xvc2UgJHNlbGYtPntmaH07CisgICAgfQorfQorCitwYWNrYWdlIEdJVENWUzo6dXBkYXRlcjsKKworIyMjIworIyMjIyBDb3B5cmlnaHQgVGhlIE9wZW4gVW5pdmVyc2l0eSBVSyAtIDIwMDYuCisjIyMjCisjIyMjIEF1dGhvcnM6IE1hcnR5biBTbWl0aCAgICA8bWFydHluQGNhdGFseXN0Lm5ldC5uej4KKyMjIyMgICAgICAgICAgTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIworIyMjIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIERCSTsKKworPWhlYWQxIE1FVEhPRFMKKworPWN1dAorCis9aGVhZDIgbmV3CisKKz1jdXQKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkY29uZmlnID0gc2hpZnQ7CisgICAgbXkgJG1vZHVsZSA9IHNoaWZ0OworICAgIG15ICRsb2cgPSBzaGlmdDsKKworICAgIGRpZSAiTmVlZCB0byBzcGVjaWZ5IGEgZ2l0IHJlcG9zaXRvcnkiIHVubGVzcyAoIGRlZmluZWQoJGNvbmZpZykgYW5kIC1kICRjb25maWcgKTsKKyAgICBkaWUgIk5lZWQgdG8gc3BlY2lmeSBhIG1vZHVsZSIgdW5sZXNzICggZGVmaW5lZCgkbW9kdWxlKSApOworCisgICAgJGNsYXNzID0gcmVmKCRjbGFzcykgfHwgJGNsYXNzOworCisgICAgbXkgJHNlbGYgPSB7fTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisKKyAgICAkc2VsZi0+e2RiZGlyfSA9ICRjb25maWcgLiAiLyI7CisgICAgZGllICJEYXRhYmFzZSBkaXIgJyRzZWxmLT57ZGJkaXJ9JyBpc24ndCBhIGRpcmVjdG9yeSIgdW5sZXNzICggZGVmaW5lZCgkc2VsZi0+e2RiZGlyfSkgYW5kIC1kICRzZWxmLT57ZGJkaXJ9ICk7CisKKyAgICAkc2VsZi0+e21vZHVsZX0gPSAkbW9kdWxlOworICAgICRzZWxmLT57ZmlsZX0gPSAkc2VsZi0+e2RiZGlyfSAuICIvZ2l0Y3ZzLiRtb2R1bGUuc3FsaXRlIjsKKworICAgICRzZWxmLT57Z2l0X3BhdGh9ID0gJGNvbmZpZyAuICIvIjsKKworICAgICRzZWxmLT57bG9nfSA9ICRsb2c7CisKKyAgICBkaWUgIkdpdCByZXBvICckc2VsZi0+e2dpdF9wYXRofScgZG9lc24ndCBleGlzdCIgdW5sZXNzICggLWQgJHNlbGYtPntnaXRfcGF0aH0gKTsKKworICAgICRzZWxmLT57ZGJofSA9IERCSS0+Y29ubmVjdCgiZGJpOlNRTGl0ZTpkYm5hbWU9IiAuICRzZWxmLT57ZmlsZX0sIiIsIiIpOworCisgICAgJHNlbGYtPnt0YWJsZXN9ID0ge307CisgICAgZm9yZWFjaCBteSAkdGFibGUgKCAkc2VsZi0+e2RiaH0tPnRhYmxlcyApCisgICAgeworICAgICAgICAkdGFibGUgPX4gcy9eIi8vOworICAgICAgICAkdGFibGUgPX4gcy8iJC8vOworICAgICAgICAkc2VsZi0+e3RhYmxlc317JHRhYmxlfSA9IDE7CisgICAgfQorCisgICAgIyBDb25zdHJ1Y3QgdGhlIHJldmlzaW9uIHRhYmxlIGlmIHJlcXVpcmVkCisgICAgdW5sZXNzICggJHNlbGYtPnt0YWJsZXN9e3JldmlzaW9ufSApCisgICAgeworICAgICAgICAkc2VsZi0+e2RiaH0tPmRvKCIKKyAgICAgICAgICAgIENSRUFURSBUQUJMRSByZXZpc2lvbiAoCisgICAgICAgICAgICAgICAgbmFtZSAgICAgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIHJldmlzaW9uICAgSU5URUdFUiBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBmaWxlaGFzaCAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgY29tbWl0aGFzaCBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGF1dGhvciAgICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBtb2RpZmllZCAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgbW9kZSAgICAgICBURVhUIE5PVCBOVUxMCisgICAgICAgICAgICApCisgICAgICAgICIpOworICAgIH0KKworICAgICMgQ29uc3RydWN0IHRoZSByZXZpc2lvbiB0YWJsZSBpZiByZXF1aXJlZAorICAgIHVubGVzcyAoICRzZWxmLT57dGFibGVzfXtoZWFkfSApCisgICAgeworICAgICAgICAkc2VsZi0+e2RiaH0tPmRvKCIKKyAgICAgICAgICAgIENSRUFURSBUQUJMRSBoZWFkICgKKyAgICAgICAgICAgICAgICBuYW1lICAgICAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgcmV2aXNpb24gICBJTlRFR0VSIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGZpbGVoYXNoICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBjb21taXRoYXNoIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgYXV0aG9yICAgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIG1vZGlmaWVkICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBtb2RlICAgICAgIFRFWFQgTk9UIE5VTEwKKyAgICAgICAgICAgICkKKyAgICAgICAgIik7CisgICAgfQorCisgICAgIyBDb25zdHJ1Y3QgdGhlIHByb3BlcnRpZXMgdGFibGUgaWYgcmVxdWlyZWQKKyAgICB1bmxlc3MgKCAkc2VsZi0+e3RhYmxlc317cHJvcGVydGllc30gKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntkYmh9LT5kbygiCisgICAgICAgICAgICBDUkVBVEUgVEFCTEUgcHJvcGVydGllcyAoCisgICAgICAgICAgICAgICAga2V5ICAgICAgICBURVhUIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAorICAgICAgICAgICAgICAgIHZhbHVlICAgICAgVEVYVAorICAgICAgICAgICAgKQorICAgICAgICAiKTsKKyAgICB9CisKKyAgICAjIENvbnN0cnVjdCB0aGUgY29tbWl0bXNncyB0YWJsZSBpZiByZXF1aXJlZAorICAgIHVubGVzcyAoICRzZWxmLT57dGFibGVzfXtjb21taXRtc2dzfSApCisgICAgeworICAgICAgICAkc2VsZi0+e2RiaH0tPmRvKCIKKyAgICAgICAgICAgIENSRUFURSBUQUJMRSBjb21taXRtc2dzICgKKyAgICAgICAgICAgICAgICBrZXkgICAgICAgIFRFWFQgTk9UIE5VTEwgUFJJTUFSWSBLRVksCisgICAgICAgICAgICAgICAgdmFsdWUgICAgICBURVhUCisgICAgICAgICAgICApCisgICAgICAgICIpOworICAgIH0KKworICAgIHJldHVybiAkc2VsZjsKK30KKworPWhlYWQyIHVwZGF0ZQorCis9Y3V0CitzdWIgdXBkYXRlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgZmlyc3QgbGV0cyBnZXQgdGhlIGNvbW1pdCBsaXN0CisgICAgJEVOVntHSVRfRElSfSA9ICRzZWxmLT57Z2l0X3BhdGh9OworCisgICAgIyBwcmVwYXJlIGRhdGFiYXNlIHF1ZXJpZXMKKyAgICBteSAkZGJfaW5zZXJ0X3JldiA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIklOU0VSVCBJTlRPIHJldmlzaW9uIChuYW1lLCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2gsIG1vZGlmaWVkLCBhdXRob3IsIG1vZGUpIFZBTFVFUyAoPyw/LD8sPyw/LD8sPykiLHt9LDEpOworICAgIG15ICRkYl9pbnNlcnRfbWVyZ2Vsb2cgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyBjb21taXRtc2dzIChrZXksIHZhbHVlKSBWQUxVRVMgKD8sPykiLHt9LDEpOworICAgIG15ICRkYl9kZWxldGVfaGVhZCA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIkRFTEVURSBGUk9NIGhlYWQiLHt9LDEpOworICAgIG15ICRkYl9pbnNlcnRfaGVhZCA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIklOU0VSVCBJTlRPIGhlYWQgKG5hbWUsIHJldmlzaW9uLCBmaWxlaGFzaCwgY29tbWl0aGFzaCwgbW9kaWZpZWQsIGF1dGhvciwgbW9kZSkgVkFMVUVTICg/LD8sPyw/LD8sPyw/KSIse30sMSk7CisKKyAgICBteSAkY29tbWl0aW5mbyA9IGBnaXQtY2F0LWZpbGUgY29tbWl0ICRzZWxmLT57bW9kdWxlfSAyPiYxYDsKKyAgICB1bmxlc3MgKCAkY29tbWl0aW5mbyA9fiAvdHJlZVxzK1thLXpBLVowLTldezQwfS8gKQorICAgIHsKKyAgICAgICAgZGllKCJJbnZhbGlkIG1vZHVsZSAnJHNlbGYtPnttb2R1bGV9JyIpOworICAgIH0KKworCisgICAgbXkgJGdpdF9sb2c7CisgICAgbXkgJGxhc3Rjb21taXQgPSAkc2VsZi0+X2dldF9wcm9wKCJsYXN0X2NvbW1pdCIpOworCisgICAgIyBTdGFydCBleGNsdXNpdmUgbG9jayBoZXJlLi4uCisgICAgJHNlbGYtPntkYmh9LT5iZWdpbl93b3JrKCkgb3IgZGllICJDYW5ub3QgbG9jayBkYXRhYmFzZSBmb3IgQkVHSU4iOworCisgICAgIyBUT0RPOiBsb2cgcHJvY2Vzc2luZyBpcyBtZW1vcnkgYm91bmQKKyAgICAjIGlmIHdlIGNhbiBwYXJzZSBpbnRvIGEgMm5kIGZpbGUgdGhhdCBpcyBpbiByZXZlcnNlIG9yZGVyCisgICAgIyB3ZSBjYW4gcHJvYmFibHkgZG8gc29tZXRoaW5nIHJlYWxseSBlZmZpY2llbnQKKyAgICBteSBAZ2l0X2xvZ19wYXJhbXMgPSAoJy0tcHJldHR5JywgJy0tcGFyZW50cycsICctLXRvcG8tb3JkZXInKTsKKworICAgIGlmIChkZWZpbmVkICRsYXN0Y29tbWl0KSB7CisgICAgICAgIHB1c2ggQGdpdF9sb2dfcGFyYW1zLCAiJGxhc3Rjb21taXQuLiRzZWxmLT57bW9kdWxlfSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaCBAZ2l0X2xvZ19wYXJhbXMsICRzZWxmLT57bW9kdWxlfTsKKyAgICB9CisgICAgIyBnaXQtcmV2LWxpc3QgaXMgdGhlIGJhY2tlbmQgLyBwbHVtYmluZyB2ZXJzaW9uIG9mIGdpdC1sb2cKKyAgICBvcGVuKEdJVExPRywgJy18JywgJ2dpdC1yZXYtbGlzdCcsIEBnaXRfbG9nX3BhcmFtcykgb3IgZGllICJDYW5ub3QgY2FsbCBnaXQtcmV2LWxpc3Q6ICQhIjsKKworICAgIG15IEBjb21taXRzOworCisgICAgbXkgJWNvbW1pdCA9ICgpOworCisgICAgd2hpbGUgKCA8R0lUTE9HPiApCisgICAgeworICAgICAgICBjaG9tcDsKKyAgICAgICAgaWYgKG0vXmNvbW1pdFxzKyguKikkLykgeworICAgICAgICAgICAgIyBvbiBeY29tbWl0IGxpbmVzIHB1dCB0aGUganVzdCBzZWVuIGNvbW1pdCBpbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICMgYW5kIHByaW1lIHRoaW5ncyBmb3IgdGhlIG5leHQgb25lCisgICAgICAgICAgICBpZiAoa2V5cyAlY29tbWl0KSB7CisgICAgICAgICAgICAgICAgbXkgJWNvcHkgPSAlY29tbWl0OworICAgICAgICAgICAgICAgIHVuc2hpZnQgQGNvbW1pdHMsIFwlY29weTsKKyAgICAgICAgICAgICAgICAlY29tbWl0ID0gKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBteSBAcGFyZW50cyA9IHNwbGl0KG0vXHMrLywgJDEpOworICAgICAgICAgICAgJGNvbW1pdHtoYXNofSA9IHNoaWZ0IEBwYXJlbnRzOworICAgICAgICAgICAgJGNvbW1pdHtwYXJlbnRzfSA9IFxAcGFyZW50czsKKyAgICAgICAgfSBlbHNpZiAobS9eKFx3Kz8pOlxzKyguKikkLyAmJiAhZXhpc3RzKCRjb21taXR7bWVzc2FnZX0pKSB7CisgICAgICAgICAgICAjIG9uIHJmYzgyMi1saWtlIGxpbmVzIHNlZW4gYmVmb3JlIHdlIHNlZSBhbnkgbWVzc2FnZSwKKyAgICAgICAgICAgICMgbG93ZXJjYXNlIHRoZSBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSBoYXNoIGFzIGtleS12YWx1ZQorICAgICAgICAgICAgJGNvbW1pdHtsYygkMSl9ID0gJDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIG1lc3NhZ2UgbGluZXMgLSBza2lwIGluaXRpYWwgZW1wdHkgbGluZQorICAgICAgICAgICAgIyBhbmQgdHJpbSB3aGl0ZXNwYWNlCisgICAgICAgICAgICBpZiAoIWV4aXN0cygkY29tbWl0e21lc3NhZ2V9KSAmJiBtL15ccyokLykgeworICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0IHRvIG1hcmsgdGhlIGVuZCBvZiBoZWFkZXJzCisgICAgICAgICAgICAgICAgJGNvbW1pdHttZXNzYWdlfSA9ICcnOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzL15ccysvLzsgcy9ccyskLy87ICMgdHJpbSB3cworICAgICAgICAgICAgJGNvbW1pdHttZXNzYWdlfSAuPSAkXyAuICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2UgR0lUTE9HOworCisgICAgdW5zaGlmdCBAY29tbWl0cywgXCVjb21taXQgaWYgKCBrZXlzICVjb21taXQgKTsKKworICAgICMgTm93IGFsbCB0aGUgY29tbWl0cyBhcmUgaW4gdGhlIEBjb21taXRzIGJ1Y2tldAorICAgICMgb3JkZXJlZCBieSB0aW1lIERFU0MuIGZvciBlYWNoIGNvbW1pdCB0aGF0IG5lZWRzIHByb2Nlc3NpbmcsCisgICAgIyBkZXRlcm1pbmUgd2hldGhlciBpdCdzIGZvbGxvd2luZyB0aGUgbGFzdCBoZWFkIHdlJ3ZlIHNlZW4gb3IgaWYKKyAgICAjIGl0J3Mgb24gaXRzIG93biBicmFuY2gsIGdyYWIgYSBmaWxlIGxpc3QsIGFuZCBhZGQgd2hhdGV2ZXIncyBjaGFuZ2VkCisgICAgIyBOT1RFOiAkbGFzdGNvbW1pdCByZWZlcnMgdG8gdGhlIGxhc3QgY29tbWl0IGZyb20gcHJldmlvdXMgcnVuCisgICAgIyAgICAgICAkbGFzdHBpY2tlZCBpcyB0aGUgbGFzdCBjb21taXQgd2UgcGlja2VkIGluIHRoaXMgcnVuCisgICAgbXkgJGxhc3RwaWNrZWQ7CisgICAgbXkgJGhlYWQgPSB7fTsKKyAgICBpZiAoZGVmaW5lZCAkbGFzdGNvbW1pdCkgeworICAgICAgICAkbGFzdHBpY2tlZCA9ICRsYXN0Y29tbWl0OworICAgIH0KKworICAgIG15ICRjb21taXR0b3RhbCA9IHNjYWxhcihAY29tbWl0cyk7CisgICAgbXkgJGNvbW1pdGNvdW50ID0gMDsKKworICAgICMgTG9hZCB0aGUgaGVhZCB0YWJsZSBpbnRvICRoZWFkIChmb3IgY2FjaGVkIGxvb2t1cHMgZHVyaW5nIHRoZSB1cGRhdGUgcHJvY2VzcykKKyAgICBmb3JlYWNoIG15ICRmaWxlICggQHskc2VsZi0+Z2V0aGVhZCgpfSApCisgICAgeworICAgICAgICAkaGVhZC0+eyRmaWxlLT57bmFtZX19ID0gJGZpbGU7CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkY29tbWl0ICggQGNvbW1pdHMgKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntsb2d9LT5kZWJ1ZygiR0lUQ1ZTOjp1cGRhdGVyIC0gUHJvY2Vzc2luZyBjb21taXQgJGNvbW1pdC0+e2hhc2h9ICgiIC4gKCsrJGNvbW1pdGNvdW50KSAuICIgb2YgJGNvbW1pdHRvdGFsKSIpOworICAgICAgICBpZiAoZGVmaW5lZCAkbGFzdHBpY2tlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkbGFzdHBpY2tlZCwgQHskY29tbWl0LT57cGFyZW50c319KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIHNraXAsIHdlJ2xsIHNlZSB0aGlzIGRlbHRhCisgICAgICAgICAgICAgICAgIyBhcyBwYXJ0IG9mIGEgbWVyZ2UgbGF0ZXIKKyAgICAgICAgICAgICAgICAjIHdhcm4gInNraXBwaW5nIG9mZi10cmFjayAgJGNvbW1pdC0+e2hhc2h9XG4iOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9IGVsc2lmIChAeyRjb21taXQtPntwYXJlbnRzfX0gPiAxKSB7CisgICAgICAgICAgICAgICAgIyBpdCBpcyBhIG1lcmdlIGNvbW1pdCwgZm9yIGVhY2ggcGFyZW50IHRoYXQgaXMKKyAgICAgICAgICAgICAgICAjIG5vdCAkbGFzdHBpY2tlZCwgc2VlIGlmIHdlIGNhbiBnZXQgYSBsb2cKKyAgICAgICAgICAgICAgICAjIGZyb20gdGhlIG1lcmdlLWJhc2UgdG8gdGhhdCBwYXJlbnQgdG8gcHV0IGl0CisgICAgICAgICAgICAgICAgIyBpbiB0aGUgbWVzc2FnZSBhcyBhIG1lcmdlIHN1bW1hcnkuCisgICAgICAgICAgICAgICAgbXkgQHBhcmVudHMgPSBAeyRjb21taXQtPntwYXJlbnRzfX07CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcGFyZW50IChAcGFyZW50cykgeworICAgICAgICAgICAgICAgICAgICAjIGdpdC1tZXJnZS1iYXNlIGNhbiBwb3RlbnRpYWxseSAoYnV0IHJhcmVseSkgdGhyb3cKKyAgICAgICAgICAgICAgICAgICAgIyBzZXZlcmFsIGNhbmRpZGF0ZSBtZXJnZSBiYXNlcy4gbGV0J3MgYXNzdW1lCisgICAgICAgICAgICAgICAgICAgICMgdGhhdCB0aGUgZmlyc3Qgb25lIGlzIHRoZSBiZXN0IG9uZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJlbnQgZXEgJGxhc3RwaWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3BlbiBteSAkcCwgJ2dpdC1tZXJnZS1iYXNlICcuICRsYXN0cGlja2VkIC4gJyAnCisgICAgICAgICAgICAgICAgICAgIC4gJHBhcmVudCAuICd8JzsKKyAgICAgICAgICAgICAgICAgICAgbXkgQG91dHB1dCA9ICg8JHA+KTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UgJHA7CisgICAgICAgICAgICAgICAgICAgIG15ICRiYXNlID0gam9pbignJywgQG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGNob21wICRiYXNlOworICAgICAgICAgICAgICAgICAgICBpZiAoJGJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15IEBtZXJnZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50ICJ3YW50IHRvIGxvZyBiZXR3ZWVuICAkYmFzZSAkcGFyZW50IFxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oR0lUTE9HLCAnLXwnLCAnZ2l0LWxvZycsICIkYmFzZS4uJHBhcmVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBjYWxsIGdpdC1sb2c6ICQhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRtZXJnZWRoYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDxHSVRMT0c+KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRtZXJnZWRoYXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtL15jb21taXRccysoLispJC8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXJnZWRoYXNoID0gJDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBncmFiIHRoZSBmaXJzdCBsaW5lIHRoYXQgbG9va3Mgbm9uLXJmYzgyMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFrYSBoYXMgY29udGVudCBhZnRlciBsZWFkaW5nIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtL15ccysoXFMuKikkLykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHRpdGxlID0gJDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGl0bGUgPSBzdWJzdHIoJHRpdGxlLDAsMTAwKTsgIyB0cnVuY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGlmdCBAbWVyZ2VkLCAiJG1lcmdlZGhhc2ggJHRpdGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmICRtZXJnZWRoYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgR0lUTE9HOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBtZXJnZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWl0LT57bWVyZ2Vtc2d9ID0gJGNvbW1pdC0+e21lc3NhZ2V9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21taXQtPnttZXJnZW1zZ30gLj0gIlxuU3VtbWFyeSBvZiBtZXJnZWQgY29tbWl0czpcblxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRzdW1tYXJ5IChAbWVyZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21taXQtPnttZXJnZW1zZ30gLj0gIlx0JHN1bW1hcnlcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21taXQtPnttZXJnZW1zZ30gLj0gIlxuXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbnQgIk1lc3NhZ2UgZm9yICRjb21taXQtPntoYXNofSBcbiRjb21taXQtPnttZXJnZW1zZ30iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBjb252ZXJ0IHRoZSBkYXRlIHRvIENWUy1oYXBweSBmb3JtYXQKKyAgICAgICAgJGNvbW1pdC0+e2RhdGV9ID0gIiQyICQxICQ0ICQzICQ1IiBpZiAoICRjb21taXQtPntkYXRlfSA9fiAvXlx3K1xzKyhcdyspXHMrKFxkKylccysoXGQrOlxkKzpcZCspXHMrKFxkKylccysoWystXVxkKykkLyApOworCisgICAgICAgIGlmICggZGVmaW5lZCAoICRsYXN0cGlja2VkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkZmlsZXBpcGUgPSBvcGVuKEZJTEVMSVNULCAnLXwnLCAnZ2l0LWRpZmYtdHJlZScsICctcicsICRsYXN0cGlja2VkLCAkY29tbWl0LT57aGFzaH0pIG9yIGRpZSgiQ2Fubm90IGNhbGwgZ2l0LWRpZmYtdHJlZSA6ICQhIik7CisgICAgICAgICAgICB3aGlsZSAoIDxGSUxFTElTVD4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVubGVzcyAoIC9eOlxkezZ9XHMrXGR7M30oXGQpXGR7Mn1ccytbYS16QS1aMC05XXs0MH1ccysoW2EtekEtWjAtOV17NDB9KVxzKyhcdylccysoLiopJC9vICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZSgiQ291bGRuJ3QgcHJvY2VzcyBnaXQtZGlmZi10cmVlIGxpbmUgOiAkXyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgJGxvZy0+ZGVidWcoIkZpbGUgbW9kZT0kMSwgaGFzaD0kMiwgY2hhbmdlPSQzLCBuYW1lPSQ0Iik7CisKKyAgICAgICAgICAgICAgICBteSAkZ2l0X3Blcm1zID0gIiI7CisgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyAuPSAiciIgaWYgKCAkMSAmIDQgKTsKKyAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ3IiBpZiAoICQxICYgMiApOworICAgICAgICAgICAgICAgICRnaXRfcGVybXMgLj0gIngiIGlmICggJDEgJiAxICk7CisgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyA9ICJydyIgaWYgKCAkZ2l0X3Blcm1zIGVxICIiICk7CisKKyAgICAgICAgICAgICAgICBpZiAoICQzIGVxICJEIiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjJGxvZy0+ZGVidWcoIkRFTEVURSAgICQ0Iik7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JDR9ID0geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PiAkNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRoZWFkLT57JDR9e3JldmlzaW9ufSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAiZGVsZXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21taXRoYXNoID0+ICRjb21taXQtPntoYXNofSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0+ICRjb21taXQtPntkYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvciA9PiAkY29tbWl0LT57YXV0aG9yfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT4gJGdpdF9wZXJtcywKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgJGRiX2luc2VydF9yZXYtPmV4ZWN1dGUoJDQsICRoZWFkLT57JDR9e3JldmlzaW9ufSwgJDIsICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGdpdF9wZXJtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJDMgZXEgIk0iICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMkbG9nLT5kZWJ1ZygiTU9ESUZJRUQgJDQiKTsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskNH0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0+ICQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24gPT4gJGhlYWQtPnskNH17cmV2aXNpb259ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoID0+ICQyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0aGFzaCA9PiAkY29tbWl0LT57aGFzaH0sCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9PiAkY29tbWl0LT57ZGF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3IgPT4gJGNvbW1pdC0+e2F1dGhvcn0sCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0+ICRnaXRfcGVybXMsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICRkYl9pbnNlcnRfcmV2LT5leGVjdXRlKCQ0LCAkaGVhZC0+eyQ0fXtyZXZpc2lvbn0sICQyLCAkY29tbWl0LT57aGFzaH0sICRjb21taXQtPntkYXRlfSwgJGNvbW1pdC0+e2F1dGhvcn0sICRnaXRfcGVybXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICQzIGVxICJBIiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjJGxvZy0+ZGVidWcoIkFEREVEICAgICQ0Iik7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JDR9ID0geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PiAkNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAkZGJfaW5zZXJ0X3Jldi0+ZXhlY3V0ZSgkNCwgJGhlYWQtPnskNH17cmV2aXNpb259LCAkMiwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkZ2l0X3Blcm1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvZy0+d2FybigiVU5LTk9XTiBGSUxFIENIQU5HRSBtb2RlPSQxLCBoYXNoPSQyLCBjaGFuZ2U9JDMsIG5hbWU9JDQiKTsKKyAgICAgICAgICAgICAgICAgICAgZGllOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3NlIEZJTEVMSVNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyB0aGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGZpbGVzIHJlbW92ZWQgZnJvbSB0aGUgcmVwbworICAgICAgICAgICAgbXkgJHNlZW5fZmlsZXMgPSB7fTsKKworICAgICAgICAgICAgbXkgJGZpbGVwaXBlID0gb3BlbihGSUxFTElTVCwgJy18JywgJ2dpdC1scy10cmVlJywgJy1yJywgJGNvbW1pdC0+e2hhc2h9KSBvciBkaWUoIkNhbm5vdCBjYWxsIGdpdC1scy10cmVlIDogJCEiKTsKKyAgICAgICAgICAgIHdoaWxlICggPEZJTEVMSVNUPiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5sZXNzICggL14oXGQrKVxzKyhcdyspXHMrKFthLXpBLVowLTldKylccysoLiopJC9vICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZSgiQ291bGRuJ3QgcHJvY2VzcyBnaXQtbHMtdHJlZSBsaW5lIDogJF8iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteSAoICRnaXRfcGVybXMsICRnaXRfdHlwZSwgJGdpdF9oYXNoLCAkZ2l0X2ZpbGVuYW1lICkgPSAoICQxLCAkMiwgJDMsICQ0ICk7CisKKyAgICAgICAgICAgICAgICAkc2Vlbl9maWxlcy0+eyRnaXRfZmlsZW5hbWV9ID0gMTsKKworICAgICAgICAgICAgICAgIG15ICggJG9sZGhhc2gsICRvbGRyZXZpc2lvbiwgJG9sZG1vZGUgKSA9ICgKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZ2l0X2ZpbGVuYW1lfXtmaWxlaGFzaH0sCisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGdpdF9maWxlbmFtZX17cmV2aXNpb259LAorICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRnaXRfZmlsZW5hbWV9e21vZGV9CisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGlmICggJGdpdF9wZXJtcyA9fiAvXlxkXGRcZChcZClcZFxkL28gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyA9ICIiOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJyIiBpZiAoICQxICYgNCApOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ3IiBpZiAoICQxICYgMiApOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ4IiBpZiAoICQxICYgMSApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRnaXRfcGVybXMgPSAicnciOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgdW5sZXNzIHRoZSBmaWxlIGV4aXN0cyB3aXRoIHRoZSBzYW1lIGhhc2gsIHdlIG5lZWQgdG8gdXBkYXRlIGl0IC4uLgorICAgICAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQoJG9sZGhhc2gpIGFuZCAkb2xkaGFzaCBlcSAkZ2l0X2hhc2ggYW5kIGRlZmluZWQoJG9sZG1vZGUpIGFuZCAkb2xkbW9kZSBlcSAkZ2l0X3Blcm1zICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG15ICRuZXdyZXZpc2lvbiA9ICggJG9sZHJldmlzaW9uIG9yIDAgKSArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZ2l0X2ZpbGVuYW1lfSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT4gJGdpdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRuZXdyZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoID0+ICRnaXRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgICAgICAgICAgJGRiX2luc2VydF9yZXYtPmV4ZWN1dGUoJGdpdF9maWxlbmFtZSwgJG5ld3JldmlzaW9uLCAkZ2l0X2hhc2gsICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGdpdF9wZXJtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2UgRklMRUxJU1Q7CisKKyAgICAgICAgICAgICMgRGV0ZWN0IGRlbGV0ZWQgZmlsZXMKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBrZXlzICUkaGVhZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5sZXNzICggZXhpc3RzICRzZWVuX2ZpbGVzLT57JGZpbGV9IG9yICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17cmV2aXNpb259Kys7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSA9ICJkZWxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17Y29tbWl0aGFzaH0gPSAkY29tbWl0LT57aGFzaH07CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e21vZGlmaWVkfSA9ICRjb21taXQtPntkYXRlfTsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17YXV0aG9yfSA9ICRjb21taXQtPnthdXRob3J9OworCisgICAgICAgICAgICAgICAgICAgICRkYl9pbnNlcnRfcmV2LT5leGVjdXRlKCRmaWxlLCAkaGVhZC0+eyRmaWxlfXtyZXZpc2lvbn0sICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkaGVhZC0+eyRmaWxlfXttb2RlfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBFTkQgOiAiRGV0ZWN0IGRlbGV0ZWQgZmlsZXMiCisgICAgICAgIH0KKworCisgICAgICAgIGlmIChleGlzdHMgJGNvbW1pdC0+e21lcmdlbXNnfSkKKyAgICAgICAgeworICAgICAgICAgICAgJGRiX2luc2VydF9tZXJnZWxvZy0+ZXhlY3V0ZSgkY29tbWl0LT57aGFzaH0sICRjb21taXQtPnttZXJnZW1zZ30pOworICAgICAgICB9CisKKyAgICAgICAgJGxhc3RwaWNrZWQgPSAkY29tbWl0LT57aGFzaH07CisKKyAgICAgICAgJHNlbGYtPl9zZXRfcHJvcCgibGFzdF9jb21taXQiLCAkY29tbWl0LT57aGFzaH0pOworICAgIH0KKworICAgICRkYl9kZWxldGVfaGVhZC0+ZXhlY3V0ZSgpOworICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBrZXlzICUkaGVhZCApCisgICAgeworICAgICAgICAkZGJfaW5zZXJ0X2hlYWQtPmV4ZWN1dGUoCisgICAgICAgICAgICAkZmlsZSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e3JldmlzaW9ufSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2NvbW1pdGhhc2h9LAorICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17bW9kaWZpZWR9LAorICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17YXV0aG9yfSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e21vZGV9LAorICAgICAgICApOworICAgIH0KKyAgICAjIGludmFsaWRhdGUgdGhlIGdldGhlYWQgY2FjaGUKKyAgICAkc2VsZi0+e2dldGhlYWRfY2FjaGV9ID0gdW5kZWY7CisKKworICAgICMgRW5kaW5nIGV4Y2x1c2l2ZSBsb2NrIGhlcmUKKyAgICAkc2VsZi0+e2RiaH0tPmNvbW1pdCgpIG9yIGRpZSAiRmFpbGVkIHRvIGNvbW1pdCBjaGFuZ2VzIHRvIFNRTGl0ZSI7Cit9CisKK3N1YiBfaGVhZHJldgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgZmlsZWhhc2gsIHJldmlzaW9uLCBtb2RlIEZST00gaGVhZCBXSEVSRSBuYW1lPT8iLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkZmlsZW5hbWUpOworICAgIG15ICggJGhhc2gsICRyZXZpc2lvbiwgJG1vZGUgKSA9ICRkYl9xdWVyeS0+ZmV0Y2hyb3dfYXJyYXk7CisKKyAgICByZXR1cm4gKCAkaGFzaCwgJHJldmlzaW9uLCAkbW9kZSApOworfQorCitzdWIgX2dldF9wcm9wCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAka2V5ID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgdmFsdWUgRlJPTSBwcm9wZXJ0aWVzIFdIRVJFIGtleT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGtleSk7CisgICAgbXkgKCAkdmFsdWUgKSA9ICRkYl9xdWVyeS0+ZmV0Y2hyb3dfYXJyYXk7CisKKyAgICByZXR1cm4gJHZhbHVlOworfQorCitzdWIgX3NldF9wcm9wCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAka2V5ID0gc2hpZnQ7CisgICAgbXkgJHZhbHVlID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJVUERBVEUgcHJvcGVydGllcyBTRVQgdmFsdWU9PyBXSEVSRSBrZXk9PyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCR2YWx1ZSwgJGtleSk7CisKKyAgICB1bmxlc3MgKCAkZGJfcXVlcnktPnJvd3MgKQorICAgIHsKKyAgICAgICAgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiSU5TRVJUIElOVE8gcHJvcGVydGllcyAoa2V5LCB2YWx1ZSkgVkFMVUVTICg/LD8pIix7fSwxKTsKKyAgICAgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRrZXksICR2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuICR2YWx1ZTsKK30KKworPWhlYWQyIGdldGhlYWQKKworPWN1dAorCitzdWIgZ2V0aGVhZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntnZXRoZWFkX2NhY2hlfSBpZiAoIGRlZmluZWQgKCAkc2VsZi0+e2dldGhlYWRfY2FjaGV9ICkgKTsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCBuYW1lLCBmaWxlaGFzaCwgbW9kZSwgcmV2aXNpb24sIG1vZGlmaWVkLCBjb21taXRoYXNoLCBhdXRob3IgRlJPTSBoZWFkIE9SREVSIEJZIG5hbWUgQVNDIix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoKTsKKworICAgIG15ICR0cmVlID0gW107CisgICAgd2hpbGUgKCBteSAkZmlsZSA9ICRkYl9xdWVyeS0+ZmV0Y2hyb3dfaGFzaHJlZiApCisgICAgeworICAgICAgICBwdXNoIEAkdHJlZSwgJGZpbGU7CisgICAgfQorCisgICAgJHNlbGYtPntnZXRoZWFkX2NhY2hlfSA9ICR0cmVlOworCisgICAgcmV0dXJuICR0cmVlOworfQorCis9aGVhZDIgZ2V0bG9nCisKKz1jdXQKKworc3ViIGdldGxvZworeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgbmFtZSwgZmlsZWhhc2gsIGF1dGhvciwgbW9kZSwgcmV2aXNpb24sIG1vZGlmaWVkLCBjb21taXRoYXNoIEZST00gcmV2aXNpb24gV0hFUkUgbmFtZT0/IE9SREVSIEJZIHJldmlzaW9uIERFU0MiLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkZmlsZW5hbWUpOworCisgICAgbXkgJHRyZWUgPSBbXTsKKyAgICB3aGlsZSAoIG15ICRmaWxlID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19oYXNocmVmICkKKyAgICB7CisgICAgICAgIHB1c2ggQCR0cmVlLCAkZmlsZTsKKyAgICB9CisKKyAgICByZXR1cm4gJHRyZWU7Cit9CisKKz1oZWFkMiBnZXRtZXRhCisKK1RoaXMgZnVuY3Rpb24gdGFrZXMgYSBmaWxlbmFtZSAod2l0aCBwYXRoKSBhcmd1bWVudCBhbmQgcmV0dXJucyBhIGhhc2hyZWYgb2YKK21ldGFkYXRhIGZvciB0aGF0IGZpbGUuCisKKz1jdXQKKworc3ViIGdldG1ldGEKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworCisgICAgbXkgJGRiX3F1ZXJ5OworICAgIGlmICggZGVmaW5lZCgkcmV2aXNpb24pIGFuZCAkcmV2aXNpb24gPX4gL15cZCskLyApCisgICAgeworICAgICAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgKiBGUk9NIHJldmlzaW9uIFdIRVJFIG5hbWU9PyBBTkQgcmV2aXNpb249PyIse30sMSk7CisgICAgICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkZmlsZW5hbWUsICRyZXZpc2lvbik7CisgICAgfQorICAgIGVsc2lmICggZGVmaW5lZCgkcmV2aXNpb24pIGFuZCAkcmV2aXNpb24gPX4gL15bYS16QS1aMC05XXs0MH0kLyApCisgICAgeworICAgICAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgKiBGUk9NIHJldmlzaW9uIFdIRVJFIG5hbWU9PyBBTkQgY29tbWl0aGFzaD0/Iix7fSwxKTsKKyAgICAgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSwgJHJldmlzaW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgKiBGUk9NIGhlYWQgV0hFUkUgbmFtZT0/Iix7fSwxKTsKKyAgICAgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuICRkYl9xdWVyeS0+ZmV0Y2hyb3dfaGFzaHJlZjsKK30KKworPWhlYWQyIGNvbW1pdG1lc3NhZ2UKKwordGhpcyBmdW5jdGlvbiB0YWtlcyBhIGNvbW1pdGhhc2ggYW5kIHJldHVybnMgdGhlIGNvbW1pdCBtZXNzYWdlIGZvciB0aGF0IGNvbW1pdAorCis9Y3V0CitzdWIgY29tbWl0bWVzc2FnZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGNvbW1pdGhhc2ggPSBzaGlmdDsKKworICAgIGRpZSgiTmVlZCBjb21taXRoYXNoIikgdW5sZXNzICggZGVmaW5lZCgkY29tbWl0aGFzaCkgYW5kICRjb21taXRoYXNoID1+IC9eW2EtekEtWjAtOV17NDB9JC8gKTsKKworICAgIG15ICRkYl9xdWVyeTsKKyAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgdmFsdWUgRlJPTSBjb21taXRtc2dzIFdIRVJFIGtleT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGNvbW1pdGhhc2gpOworCisgICAgbXkgKCAkbWVzc2FnZSApID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19hcnJheTsKKworICAgIGlmICggZGVmaW5lZCAoICRtZXNzYWdlICkgKQorICAgIHsKKyAgICAgICAgJG1lc3NhZ2UgLj0gIiAiIGlmICggJG1lc3NhZ2UgPX4gL1xuJC8gKTsKKyAgICAgICAgcmV0dXJuICRtZXNzYWdlOworICAgIH0KKworICAgIG15IEBsaW5lcyA9IHNhZmVfcGlwZV9jYXB0dXJlKCJnaXQtY2F0LWZpbGUiLCAiY29tbWl0IiwgJGNvbW1pdGhhc2gpOworICAgIHNoaWZ0IEBsaW5lcyB3aGlsZSAoICRsaW5lc1swXSA9fiAvXFMvICk7CisgICAgJG1lc3NhZ2UgPSBqb2luKCIiLEBsaW5lcyk7CisgICAgJG1lc3NhZ2UgLj0gIiAiIGlmICggJG1lc3NhZ2UgPX4gL1xuJC8gKTsKKyAgICByZXR1cm4gJG1lc3NhZ2U7Cit9CisKKz1oZWFkMiBnZXRoaXN0b3J5CisKK1RoaXMgZnVuY3Rpb24gdGFrZXMgYSBmaWxlbmFtZSAod2l0aCBwYXRoKSBhcmd1bWVudCBhbmQgcmV0dXJucyBhbiBhcnJheW9mYXJyYXlzCitjb250YWluaW5nIHJldmlzaW9uLGZpbGVoYXNoLGNvbW1pdGhhc2ggb3JkZXJlZCBieSByZXZpc2lvbiBkZXNjZW5kaW5nCisKKz1jdXQKK3N1YiBnZXRoaXN0b3J5Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeTsKKyAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgcmV2aXNpb24sIGZpbGVoYXNoLCBjb21taXRoYXNoIEZST00gcmV2aXNpb24gV0hFUkUgbmFtZT0/IE9SREVSIEJZIHJldmlzaW9uIERFU0MiLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkZmlsZW5hbWUpOworCisgICAgcmV0dXJuICRkYl9xdWVyeS0+ZmV0Y2hhbGxfYXJyYXlyZWY7Cit9CisKKz1oZWFkMiBnZXRoaXN0b3J5ZGVuc2UKKworVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZpbGVuYW1lICh3aXRoIHBhdGgpIGFyZ3VtZW50IGFuZCByZXR1cm5zIGFuIGFycmF5b2ZhcnJheXMKK2NvbnRhaW5pbmcgcmV2aXNpb24sZmlsZWhhc2gsY29tbWl0aGFzaCBvcmRlcmVkIGJ5IHJldmlzaW9uIGRlc2NlbmRpbmcuCisKK1RoaXMgdmVyc2lvbiBvZiBnZXRoaXN0b3J5IHNraXBzIGRlbGV0ZWQgZW50cmllcyAtLSBzbyBpdCBpcyB1c2VmdWwgZm9yIGFubm90YXRlLgorVGhlICdkZW5zZScgcGFydCBpcyBhIHJlZmVyZW5jZSB0byBhICctLWRlbnNlJyBvcHRpb24gYXZhaWxhYmxlIGZvciBnaXQtcmV2LWxpc3QKK2FuZCBvdGhlciBnaXQgdG9vbHMgdGhhdCBkZXBlbmQgb24gaXQuCisKKz1jdXQKK3N1YiBnZXRoaXN0b3J5ZGVuc2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJGRiX3F1ZXJ5OworICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2ggRlJPTSByZXZpc2lvbiBXSEVSRSBuYW1lPT8gQU5EIGZpbGVoYXNoIT0nZGVsZXRlZCcgT1JERVIgQlkgcmV2aXNpb24gREVTQyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisKKyAgICByZXR1cm4gJGRiX3F1ZXJ5LT5mZXRjaGFsbF9hcnJheXJlZjsKK30KKworPWhlYWQyIGluX2FycmF5KCkKKworZnJvbSBBcnJheTo6UEFUIC0gbWltaWNzIHRoZSBpbl9hcnJheSgpIGZ1bmN0aW9uCitmb3VuZCBpbiBQSFAuIFl1Y2sgYnV0IHdvcmtzIGZvciBzbWFsbCBhcnJheXMuCisKKz1jdXQKK3N1YiBpbl9hcnJheQoreworICAgIG15ICgkY2hlY2ssIEBhcnJheSkgPSBAXzsKKyAgICBteSAkcmV0dmFsID0gMDsKKyAgICBmb3JlYWNoIG15ICR0ZXN0IChAYXJyYXkpeworICAgICAgICBpZigkY2hlY2sgZXEgJHRlc3QpeworICAgICAgICAgICAgJHJldHZhbCA9ICAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkcmV0dmFsOworfQorCis9aGVhZDIgc2FmZV9waXBlX2NhcHR1cmUKKworYW4gYWx0ZXJuYXRpdmUgdG8gYGNvbW1hbmRgIHRoYXQgYWxsb3dzIGlucHV0IHRvIGJlIHBhc3NlZCBhcyBhbiBhcnJheQordG8gd29yayBhcm91bmQgc2hlbGwgcHJvYmxlbXMgd2l0aCB3ZWlyZCBjaGFyYWN0ZXJzIGluIGFyZ3VtZW50cworCis9Y3V0CitzdWIgc2FmZV9waXBlX2NhcHR1cmUgeworCisgICAgbXkgQG91dHB1dDsKKworICAgIGlmIChteSAkcGlkID0gb3BlbiBteSAkY2hpbGQsICctfCcpIHsKKyAgICAgICAgQG91dHB1dCA9ICg8JGNoaWxkPik7CisgICAgICAgIGNsb3NlICRjaGlsZCBvciBkaWUgam9pbignICcsQF8pLiI6ICQhICQ/IjsKKyAgICB9IGVsc2UgeworICAgICAgICBleGVjKEBfKSBvciBkaWUgIiQhICQ/IjsgIyBleGVjKCkgY2FuIGZhaWwgdGhlIGV4ZWN1dGFibGUgY2FuJ3QgYmUgZm91bmQKKyAgICB9CisgICAgcmV0dXJuIHdhbnRhcnJheSA/IEBvdXRwdXQgOiBqb2luKCcnLEBvdXRwdXQpOworfQorCisKKzE7CmRpZmYgLS1naXQgYS9naXQtZmV0Y2guc2ggYi9naXQtZmV0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg4MThmOAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1mZXRjaC5zaApAQCAtMCwwICsxLDQyOSBAQAorIyEvYmluL3NoCisjCisKK1VTQUdFPSc8ZmV0Y2gtb3B0aW9ucz4gPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLicKKy4gZ2l0LXNoLXNldHVwCisuIGdpdC1wYXJzZS1yZW1vdGUKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgorCitMRj0nCisnCitJRlM9IiRMRiIKKworbm9fdGFncz0KK3RhZ3M9CithcHBlbmQ9Citmb3JjZT0KK3ZlcmJvc2U9Cit1cGRhdGVfaGVhZF9vaz0KK2V4ZWM9Cit1cGxvYWRfcGFjaz0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1hfC0tYXwtLWFwfC0tYXBwfC0tYXBwZXwtLWFwcGVufC0tYXBwZW5kKQorCQlhcHBlbmQ9dAorCQk7OworCS0tdXBsfC0tdXBsb3wtLXVwbG9hfC0tdXBsb2FkfC0tdXBsb2FkLXwtLXVwbG9hZC1wfFwKKwktLXVwbG9hZC1wYXwtLXVwbG9hZC1wYWN8LS11cGxvYWQtcGFjaykKKwkJc2hpZnQKKwkJZXhlYz0iLS1leGVjPSQxIiAKKwkJdXBsb2FkX3BhY2s9Ii11ICQxIgorCQk7OworCS1mfC0tZnwtLWZvfC0tZm9yfC0tZm9yY3wtLWZvcmNlKQorCQlmb3JjZT10CisJCTs7CisJLXR8LS10fC0tdGF8LS10YWd8LS10YWdzKQorCQl0YWdzPXQKKwkJOzsKKwktbnwtLW58LS1ub3wtLW5vLXwtLW5vLXR8LS1uby10YXwtLW5vLXRhZ3wtLW5vLXRhZ3MpCisJCW5vX3RhZ3M9dAorCQk7OworCS11fC0tdXwtLXVwfC0tdXBkfC0tdXBkYXwtLXVwZGF0fC0tdXBkYXRlfC0tdXBkYXRlLXwtLXVwZGF0ZS1ofFwKKwktLXVwZGF0ZS1oZXwtLXVwZGF0ZS1oZWF8LS11cGRhdGUtaGVhZHwtLXVwZGF0ZS1oZWFkLXxcCisJLS11cGRhdGUtaGVhZC1vfC0tdXBkYXRlLWhlYWQtb2spCisJCXVwZGF0ZV9oZWFkX29rPXQKKwkJOzsKKwktdnwtLXZlcmJvc2UpCisJCXZlcmJvc2U9WWVzCisJCTs7CisJLWt8LS1rfC0ta2V8LS1rZWV8LS1rZWVwKQorCQlrZWVwPS0ta2VlcAorCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWJyZWFrCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK2Nhc2UgIiQjIiBpbgorMCkKKwl0ZXN0IC1mICIkR0lUX0RJUi9icmFuY2hlcy9vcmlnaW4iIHx8CisJCXRlc3QgLWYgIiRHSVRfRElSL3JlbW90ZXMvb3JpZ2luIiB8fAorCQkJZGllICJXaGVyZSBkbyB5b3Ugd2FudCB0byBmZXRjaCBmcm9tIHRvZGF5PyIKKwlzZXQgb3JpZ2luIDs7Citlc2FjCisKK3JlbW90ZV9uaWNrPSIkMSIKK3JlbW90ZT0kKGdldF9yZW1vdGVfdXJsICIkQCIpCityZWZzPQorcnJlZj0KK3JzeW5jX3NsdXJwZWRfb2JqZWN0cz0KKworaWYgdGVzdCAiIiA9ICIkYXBwZW5kIgordGhlbgorCTogPiIkR0lUX0RJUi9GRVRDSF9IRUFEIgorZmkKKworYXBwZW5kX2ZldGNoX2hlYWQgKCkgeworICAgIGhlYWRfPSIkMSIKKyAgICByZW1vdGVfPSIkMiIKKyAgICByZW1vdGVfbmFtZV89IiQzIgorICAgIHJlbW90ZV9uaWNrXz0iJDQiCisgICAgbG9jYWxfbmFtZV89IiQ1IgorICAgIGNhc2UgIiQ2IiBpbgorICAgIHQpIG5vdF9mb3JfbWVyZ2VfPSdub3QtZm9yLW1lcmdlJyA7OworICAgICcnKSBub3RfZm9yX21lcmdlXz0gOzsKKyAgICBlc2FjCisKKyAgICAjIHJlbW90ZS1uaWNrIGlzIHRoZSBVUkwgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSAob3IgYSBzaG9ydGhhbmQpCisgICAgIyByZW1vdGUtbmFtZSBpcyB0aGUgJEdJVF9ESVIgcmVsYXRpdmUgcmVmcy8gcGF0aCB3ZSBjb21wdXRlZAorICAgICMgZm9yIHRoaXMgcmVmc3BlYy4KKworICAgICMgdGhlICRub3RlXyB2YXJpYWJsZSB3aWxsIGJlIGZlZCB0byBnaXQtZm10LW1lcmdlLW1zZyBmb3IgZnVydGhlcgorICAgICMgcHJvY2Vzc2luZy4KKyAgICBjYXNlICIkcmVtb3RlX25hbWVfIiBpbgorICAgIEhFQUQpCisJbm90ZV89IDs7CisgICAgcmVmcy9oZWFkcy8qKQorCW5vdGVfPSIkKGV4cHIgIiRyZW1vdGVfbmFtZV8iIDogJ3JlZnMvaGVhZHMvXCguKlwpJykiCisJbm90ZV89ImJyYW5jaCAnJG5vdGVfJyBvZiAiIDs7CisgICAgcmVmcy90YWdzLyopCisJbm90ZV89IiQoZXhwciAiJHJlbW90ZV9uYW1lXyIgOiAncmVmcy90YWdzL1woLipcKScpIgorCW5vdGVfPSJ0YWcgJyRub3RlXycgb2YgIiA7OworICAgIHJlZnMvcmVtb3Rlcy8qKQorCW5vdGVfPSIkKGV4cHIgIiRyZW1vdGVfbmFtZV8iIDogJ3JlZnMvcmVtb3Rlcy9cKC4qXCknKSIKKwlub3RlXz0icmVtb3RlIGJyYW5jaCAnJG5vdGVfJyBvZiAiIDs7CisgICAgKikKKwlub3RlXz0iJHJlbW90ZV9uYW1lIG9mICIgOzsKKyAgICBlc2FjCisgICAgcmVtb3RlXzFfPSQoZXhwciAieiRyZW1vdGVfIiA6ICd6XCguKlwpXC5naXQvKiQnKSAmJgorCXJlbW90ZV89IiRyZW1vdGVfMV8iCisgICAgbm90ZV89IiRub3RlXyRyZW1vdGVfIgorCisgICAgIyAyLjYuMTEtdHJlZSB0YWcgd291bGQgbm90IGJlIGhhcHB5IHRvIGJlIGZlZCB0byByZXNvbHZlLgorICAgIGlmIGdpdC1jYXQtZmlsZSBjb21taXQgIiRoZWFkXyIgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbgorCWhlYWRjXz0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRoZWFkX14wIikgfHwgZXhpdAorCWVjaG8gIiRoZWFkY18JJG5vdF9mb3JfbWVyZ2VfCSRub3RlXyIgPj4iJEdJVF9ESVIvRkVUQ0hfSEVBRCIKKwlbICIkdmVyYm9zZSIgXSAmJiBlY2hvID4mMiAiKiBjb21taXR0aXNoOiAkaGVhZF8iCisJWyAiJHZlcmJvc2UiIF0gJiYgZWNobyA+JjIgIiAgJG5vdGVfIgorICAgIGVsc2UKKwllY2hvICIkaGVhZF8Jbm90LWZvci1tZXJnZQkkbm90ZV8iID4+IiRHSVRfRElSL0ZFVENIX0hFQUQiCisJWyAiJHZlcmJvc2UiIF0gJiYgZWNobyA+JjIgIiogbm9uLWNvbW1pdDogJGhlYWRfIgorCVsgIiR2ZXJib3NlIiBdICYmIGVjaG8gPiYyICIgICRub3RlXyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsb2NhbF9uYW1lXyIgIT0gIiIKKyAgICB0aGVuCisJIyBXZSBhcmUgc3RvcmluZyB0aGUgaGVhZCBsb2NhbGx5LiAgTWFrZSBzdXJlIHRoYXQgaXQgaXMKKwkjIGEgZmFzdCBmb3J3YXJkIChha2EgInJldmVyc2UgcHVzaCIpLgorCWZhc3RfZm9yd2FyZF9sb2NhbCAiJGxvY2FsX25hbWVfIiAiJGhlYWRfIiAiJG5vdGVfIgorICAgIGZpCit9CisKK2Zhc3RfZm9yd2FyZF9sb2NhbCAoKSB7CisgICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJEdJVF9ESVIvJDEiKSIKKyAgICBjYXNlICIkMSIgaW4KKyAgICByZWZzL3RhZ3MvKikKKwkjIFRhZ3MgbmVlZCBub3QgYmUgcG9pbnRpbmcgYXQgY29tbWl0cyBzbyB0aGVyZQorCSMgaXMgbm8gd2F5IHRvIGd1YXJhbnRlZSAiZmFzdC1mb3J3YXJkIiBhbnl3YXkuCisJaWYgdGVzdCAtZiAiJEdJVF9ESVIvJDEiCisJdGhlbgorCQlpZiBub3dfPSQoY2F0ICIkR0lUX0RJUi8kMSIpICYmIHRlc3QgIiRub3dfIiA9ICIkMiIKKwkJdGhlbgorCQkJWyAiJHZlcmJvc2UiIF0gJiYgZWNobyA+JjIgIiogJDE6IHNhbWUgYXMgJDMiCisJCWVsc2UKKwkJCWVjaG8gPiYyICIqICQxOiB1cGRhdGluZyB3aXRoICQzIgorCQlmaQorCWVsc2UKKwkJZWNobyA+JjIgIiogJDE6IHN0b3JpbmcgJDMiCisJZmkKKwlnaXQtdXBkYXRlLXJlZiAiJDEiICIkMiIKKwk7OworCisgICAgcmVmcy9oZWFkcy8qIHwgcmVmcy9yZW1vdGVzLyopCisJIyAkMSBpcyB0aGUgcmVmIGJlaW5nIHVwZGF0ZWQuCisJIyAkMiBpcyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcmVmLgorCWxvY2FsPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDFeMCIgMj4vZGV2L251bGwpCisJaWYgdGVzdCAiJGxvY2FsIgorCXRoZW4KKwkgICAgIyBSZXF1aXJlIGZhc3QtZm9yd2FyZC4KKwkgICAgbWI9JChnaXQtbWVyZ2UtYmFzZSAiJGxvY2FsIiAiJDIiKSAmJgorCSAgICBjYXNlICIkMiwkbWIiIGluCisJICAgICRsb2NhbCwqKQorCSAgICAgICAgaWYgdGVzdCAtbiAiJHZlcmJvc2UiCisJCXRoZW4KKwkJCWVjaG8gPiYyICIqICQxOiBzYW1lIGFzICQzIgorCQlmaQorCQk7OworCSAgICAqLCRsb2NhbCkKKwkJZWNobyA+JjIgIiogJDE6IGZhc3QgZm9yd2FyZCB0byAkMyIKKwkJZWNobyA+JjIgIiAgZnJvbSAkbG9jYWwgdG8gJDIiCisJCWdpdC11cGRhdGUtcmVmICIkMSIgIiQyIiAiJGxvY2FsIgorCQk7OworCSAgICAqKQorCQlmYWxzZQorCQk7OworCSAgICBlc2FjIHx8IHsKKwkJZWNobyA+JjIgIiogJDE6IGRvZXMgbm90IGZhc3QgZm9yd2FyZCB0byAkMzsiCisJCWNhc2UgIiwkZm9yY2UsJHNpbmdsZV9mb3JjZSwiIGluCisJCSosdCwqKQorCQkJZWNobyA+JjIgIiAgZm9yY2luZyB1cGRhdGUuIgorCQkJZ2l0LXVwZGF0ZS1yZWYgIiQxIiAiJDIiICIkbG9jYWwiCisJCQk7OworCQkqKQorCQkJZWNobyA+JjIgIiAgbm90IHVwZGF0aW5nLiIKKwkJCWV4aXQgMQorCQkJOzsKKwkJZXNhYworCSAgICB9CisJZWxzZQorCSAgICBlY2hvID4mMiAiKiAkMTogc3RvcmluZyAkMyIKKwkgICAgZ2l0LXVwZGF0ZS1yZWYgIiQxIiAiJDIiCisJZmkKKwk7OworICAgIGVzYWMKK30KKworY2FzZSAiJHVwZGF0ZV9oZWFkX29rIiBpbgorJycpCisJb3JpZ19oZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsKQorCTs7Citlc2FjCisKKyMgSWYgLS10YWdzIChhbmQgbGF0ZXIgLS1oZWFkcyBvciAtLWFsbCkgaXMgc3BlY2lmaWVkLCB0aGVuIHdlIGFyZQorIyBub3QgdGFsa2luZyBhYm91dCBkZWZhdWx0cyBzdG9yZWQgaW4gUHVsbDogbGluZSBvZiByZW1vdGVzIG9yCisjIGJyYW5jaGVzIGZpbGUsIGFuZCBqdXN0IGZldGNoIHRob3NlIGFuZCByZWZzcGVjcyBleHBsaWNpdGx5IGdpdmVuLgorIyBPdGhlcndpc2Ugd2UgZG8gd2hhdCB3ZSBhbHdheXMgZGlkLgorCityZWZsaXN0PSQoZ2V0X3JlbW90ZV9yZWZzX2Zvcl9mZXRjaCAiJEAiKQoraWYgdGVzdCAiJHRhZ3MiCit0aGVuCisJdGFnbGlzdD1gSUZTPSIJIiAmJgorCQkgIGdpdC1scy1yZW1vdGUgJHVwbG9hZF9wYWNrIC0tdGFncyAiJHJlbW90ZSIgfAorCSAgICAgICAgICB3aGlsZSByZWFkIHNoYTEgbmFtZQorCQkgIGRvCisJCQljYXNlICIkbmFtZSIgaW4KKwkJCSpeKikgY29udGludWUgOzsKKwkJCWVzYWMKKwkJICAJaWYgZ2l0LWNoZWNrLXJlZi1mb3JtYXQgIiRuYW1lIgorCQkJdGhlbgorCQkJICAgIGVjaG8gIi4ke25hbWV9OiR7bmFtZX0iCisJCQllbHNlCisJCQkgICAgZWNobyA+JjIgIndhcm5pbmc6IHRhZyAke25hbWV9IGlnbm9yZWQiCisJCQlmaQorCQkgIGRvbmVgCisJaWYgdGVzdCAiJCMiIC1ndCAxCisJdGhlbgorCQkjIHJlbW90ZSBVUkwgcGx1cyBleHBsaWNpdCByZWZzcGVjczsgd2UgbmVlZCB0byBtZXJnZSB0aGVtLgorCQlyZWZsaXN0PSIkcmVmbGlzdCRMRiR0YWdsaXN0IgorCWVsc2UKKwkJIyBObyBleHBsaWNpdCByZWZzcGVjczsgZmV0Y2ggdGFncyBvbmx5LgorCQlyZWZsaXN0PSR0YWdsaXN0CisJZmkKK2ZpCisKK2ZldGNoX21haW4gKCkgeworICByZWZsaXN0PSIkMSIKKyAgcmVmcz0KKworICBmb3IgcmVmIGluICRyZWZsaXN0CisgIGRvCisgICAgICByZWZzPSIkcmVmcyRMRiRyZWYiCisKKyAgICAgICMgVGhlc2UgYXJlIHJlbGF0aXZlIHBhdGggZnJvbSAkR0lUX0RJUiwgdHlwaWNhbGx5IHN0YXJ0aW5nIGF0IHJlZnMvCisgICAgICAjIGJ1dCBtYXkgYmUgSEVBRAorICAgICAgaWYgZXhwciAieiRyZWYiIDogJ3pcLicgPi9kZXYvbnVsbAorICAgICAgdGhlbgorCSAgbm90X2Zvcl9tZXJnZT10CisJICByZWY9JChleHByICJ6JHJlZiIgOiAnelwuXCguKlwpJykKKyAgICAgIGVsc2UKKwkgIG5vdF9mb3JfbWVyZ2U9CisgICAgICBmaQorICAgICAgaWYgZXhwciAieiRyZWYiIDogJ3orJyA+L2Rldi9udWxsCisgICAgICB0aGVuCisJICBzaW5nbGVfZm9yY2U9dAorCSAgcmVmPSQoZXhwciAieiRyZWYiIDogJ3orXCguKlwpJykKKyAgICAgIGVsc2UKKwkgIHNpbmdsZV9mb3JjZT0KKyAgICAgIGZpCisgICAgICByZW1vdGVfbmFtZT0kKGV4cHIgInokcmVmIiA6ICd6XChbXjpdKlwpOicpCisgICAgICBsb2NhbF9uYW1lPSQoZXhwciAieiRyZWYiIDogJ3pbXjpdKjpcKC4qXCknKQorCisgICAgICBycmVmPSIkcnJlZiRMRiRyZW1vdGVfbmFtZSIKKworICAgICAgIyBUaGVyZSBhcmUgdHJhbnNwb3J0cyB0aGF0IGNhbiBmZXRjaCBvbmx5IG9uZSBoZWFkIGF0IGEgdGltZS4uLgorICAgICAgY2FzZSAiJHJlbW90ZSIgaW4KKyAgICAgIGh0dHA6Ly8qIHwgaHR0cHM6Ly8qKQorCSAgaWYgWyAtbiAiJEdJVF9TU0xfTk9fVkVSSUZZIiBdOyB0aGVuCisJICAgICAgY3VybF9leHRyYV9hcmdzPSItayIKKwkgIGZpCisJICBtYXhfZGVwdGg9NQorCSAgZGVwdGg9MAorCSAgaGVhZD0icmVmOiAkcmVtb3RlX25hbWUiCisJICB3aGlsZSAoZXhwciAieiRoZWFkIiA6ICJ6cmVmOiIgJiYgZXhwciAkZGVwdGggXDwgJG1heF9kZXB0aCkgPi9kZXYvbnVsbAorCSAgZG8KKwkgICAgcmVtb3RlX25hbWVfcXVvdGVkPSQocGVybCAtZSAnCisJICAgICAgbXkgJHUgPSAkQVJHVlswXTsKKyAgICAgICAgICAgICAgJHUgPX4gcy9ecmVmOlxzKi8vOworCSAgICAgICR1ID1+IHN7KFteLWEtekEtWjAtOS8uXSl9e3NwcmludGYiJSUlMDJ4IixvcmQoJDEpfWVnOworCSAgICAgIHByaW50ICIkdSI7CisJICAnICIkaGVhZCIpCisJICAgIGhlYWQ9JChjdXJsIC1uc2ZMICRjdXJsX2V4dHJhX2FyZ3MgIiRyZW1vdGUvJHJlbW90ZV9uYW1lX3F1b3RlZCIpCisJICAgIGRlcHRoPSQoIGV4cHIgXCggJGRlcHRoICsgMSBcKSApCisJICBkb25lCisJICBleHByICJ6JGhlYWQiIDogInokX3g0MFwkIiA+L2Rldi9udWxsIHx8CisJICAgICAgZGllICJGYWlsZWQgdG8gZmV0Y2ggJHJlbW90ZV9uYW1lIGZyb20gJHJlbW90ZSIKKwkgIGVjaG8gPiYyIEZldGNoaW5nICIkcmVtb3RlX25hbWUgZnJvbSAkcmVtb3RlIiB1c2luZyBodHRwCisJICBnaXQtaHR0cC1mZXRjaCAtdiAtYSAiJGhlYWQiICIkcmVtb3RlLyIgfHwgZXhpdAorCSAgOzsKKyAgICAgIHJzeW5jOi8vKikKKwkgIFRNUF9IRUFEPSIkR0lUX0RJUi9UTVBfSEVBRCIKKwkgIHJzeW5jIC1MIC1xICIkcmVtb3RlLyRyZW1vdGVfbmFtZSIgIiRUTVBfSEVBRCIgfHwgZXhpdCAxCisJICBoZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBUTVBfSEVBRCkKKwkgIHJtIC1mICIkVE1QX0hFQUQiCisJICB0ZXN0ICIkcnN5bmNfc2x1cnBlZF9vYmplY3RzIiB8fCB7CisJICAgICAgcnN5bmMgLWF2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAiJHJlbW90ZS9vYmplY3RzLyIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWS8iIHx8IGV4aXQKKworCSAgICAgICMgTG9vayBhdCBvYmplY3RzL2luZm8vYWx0ZXJuYXRlcyBmb3IgcnN5bmMgLS0gaHR0cCB3aWxsCisJICAgICAgIyBzdXBwb3J0IGl0IG5hdGl2ZWx5IGFuZCBnaXQgbmF0aXZlIG9uZXMgd2lsbCBkbyBpdCBvbgorCSAgICAgICMgdGhlIHJlbW90ZSBlbmQuICBOb3QgaGF2aW5nIHRoYXQgZmlsZSBpcyBub3QgYSBjcmltZS4KKwkgICAgICByc3luYyAtcSAiJHJlbW90ZS9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIgXAorCQkgICIkR0lUX0RJUi9UTVBfQUxUIiAyPi9kZXYvbnVsbCB8fAorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGlmIHRlc3QgLWYgIiRHSVRfRElSL1RNUF9BTFQiCisJICAgICAgdGhlbgorCQkgIHJlc29sdmVfYWx0ZXJuYXRlcyAiJHJlbW90ZSIgPCIkR0lUX0RJUi9UTVBfQUxUIiB8CisJCSAgd2hpbGUgcmVhZCBhbHQKKwkJICBkbworCQkgICAgICBjYXNlICIkYWx0IiBpbiAnYmFkIGFsdGVybmF0ZTogJyopIGRpZSAiJGFsdCI7OyBlc2FjCisJCSAgICAgIGVjaG8gPiYyICJHZXR0aW5nIGFsdGVybmF0ZTogJGFsdCIKKwkJICAgICAgcnN5bmMgLWF2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAgICAgIiRhbHQiICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkvIiB8fCBleGl0CisJCSAgZG9uZQorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGZpCisJICAgICAgcnN5bmNfc2x1cnBlZF9vYmplY3RzPXQKKwkgIH0KKwkgIDs7CisgICAgICAqKQorCSAgIyBXZSB3aWxsIGRvIGdpdCBuYXRpdmUgdHJhbnNwb3J0IHdpdGgganVzdCBvbmUgY2FsbCBsYXRlci4KKwkgIGNvbnRpbnVlIDs7CisgICAgICBlc2FjCisKKyAgICAgIGFwcGVuZF9mZXRjaF9oZWFkICIkaGVhZCIgIiRyZW1vdGUiIFwKKwkgICIkcmVtb3RlX25hbWUiICIkcmVtb3RlX25pY2siICIkbG9jYWxfbmFtZSIgIiRub3RfZm9yX21lcmdlIgorCisgIGRvbmUKKworICBjYXNlICIkcmVtb3RlIiBpbgorICBodHRwOi8vKiB8IGh0dHBzOi8vKiB8IHJzeW5jOi8vKiApCisgICAgICA7OyAjIHdlIGFyZSBhbHJlYWR5IGRvbmUuCisgICopCisgICAgKCA6IHN1YnNoZWxsIGJlY2F1c2Ugd2UgbXVjayB3aXRoIElGUworICAgICAgSUZTPSIgCSRMRiIKKyAgICAgICgKKwkgIGdpdC1mZXRjaC1wYWNrICRleGVjICRrZWVwIC0tdGhpbiAiJHJlbW90ZSIgJHJyZWYgfHwgZWNobyBmYWlsZWQgIiRyZW1vdGUiCisgICAgICApIHwKKyAgICAgIHdoaWxlIHJlYWQgc2hhMSByZW1vdGVfbmFtZQorICAgICAgZG8KKwkgIGNhc2UgIiRzaGExIiBpbgorCSAgZmFpbGVkKQorCQkgIGVjaG8gPiYyICJGZXRjaCBmYWlsdXJlOiAkcmVtb3RlIgorCQkgIGV4aXQgMSA7OworCSAgZXNhYworCSAgZm91bmQ9CisJICBzaW5nbGVfZm9yY2U9CisJICBmb3IgcmVmIGluICRyZWZzCisJICBkbworCSAgICAgIGNhc2UgIiRyZWYiIGluCisJICAgICAgKyRyZW1vdGVfbmFtZToqKQorCQkgIHNpbmdsZV9mb3JjZT10CisJCSAgbm90X2Zvcl9tZXJnZT0KKwkJICBmb3VuZD0iJHJlZiIKKwkJICBicmVhayA7OworCSAgICAgIC4rJHJlbW90ZV9uYW1lOiopCisJCSAgc2luZ2xlX2ZvcmNlPXQKKwkJICBub3RfZm9yX21lcmdlPXQKKwkJICBmb3VuZD0iJHJlZiIKKwkJICBicmVhayA7OworCSAgICAgIC4kcmVtb3RlX25hbWU6KikKKwkJICBub3RfZm9yX21lcmdlPXQKKwkJICBmb3VuZD0iJHJlZiIKKwkJICBicmVhayA7OworCSAgICAgICRyZW1vdGVfbmFtZToqKQorCQkgIG5vdF9mb3JfbWVyZ2U9CisJCSAgZm91bmQ9IiRyZWYiCisJCSAgYnJlYWsgOzsKKwkgICAgICBlc2FjCisJICBkb25lCisJICBsb2NhbF9uYW1lPSQoZXhwciAieiRmb3VuZCIgOiAnelteOl0qOlwoLipcKScpCisJICBhcHBlbmRfZmV0Y2hfaGVhZCAiJHNoYTEiICIkcmVtb3RlIiBcCisJCSAgIiRyZW1vdGVfbmFtZSIgIiRyZW1vdGVfbmljayIgIiRsb2NhbF9uYW1lIiAiJG5vdF9mb3JfbWVyZ2UiCisgICAgICBkb25lCisgICAgKSB8fCBleGl0IDs7CisgIGVzYWMKKworfQorCitmZXRjaF9tYWluICIkcmVmbGlzdCIKKworIyBhdXRvbWF0ZWQgdGFnIGZvbGxvd2luZworY2FzZSAiJG5vX3RhZ3MkdGFncyIgaW4KKycnKQorCWNhc2UgIiRyZWZsaXN0IiBpbgorCSo6cmVmcy8qKQorCQkjIGVmZmVjdGl2ZSBvbmx5IHdoZW4gd2UgYXJlIGZvbGxvd2luZyByZW1vdGUgYnJhbmNoCisJCSMgdXNpbmcgbG9jYWwgdHJhY2tpbmcgYnJhbmNoLgorCQl0YWdsaXN0PSQoSUZTPSIgIiAmJgorCQlnaXQtbHMtcmVtb3RlICR1cGxvYWRfcGFjayAtLXRhZ3MgIiRyZW1vdGUiIHwKKwkJc2VkIC1uZSAnc3xeXChbMC05YS1mXSpcKVsgCV1cKHJlZnMvdGFncy8uKlwpXnt9JHxcMSBcMnxwJyB8CisJCXdoaWxlIHJlYWQgc2hhMSBuYW1lCisJCWRvCisJCQl0ZXN0IC1mICIkR0lUX0RJUi8kbmFtZSIgJiYgY29udGludWUKKwkJCWdpdC1jaGVjay1yZWYtZm9ybWF0ICIkbmFtZSIgfHwgeworCQkJCWVjaG8gPiYyICJ3YXJuaW5nOiB0YWcgJHtuYW1lfSBpZ25vcmVkIgorCQkJCWNvbnRpbnVlCisJCQl9CisJCQlnaXQtY2F0LWZpbGUgLXQgIiRzaGExIiA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKKwkJCWVjaG8gPiYyICJBdXRvLWZvbGxvd2luZyAkbmFtZSIKKwkJCWVjaG8gIi4ke25hbWV9OiR7bmFtZX0iCisJCWRvbmUpCisJZXNhYworCWNhc2UgIiR0YWdsaXN0IiBpbgorCScnKSA7OworCT8qKQorCQlmZXRjaF9tYWluICIkdGFnbGlzdCIgOzsKKwllc2FjCitlc2FjCisKKyMgSWYgdGhlIG9yaWdpbmFsIGhlYWQgd2FzIGVtcHR5IChpLmUuIG5vICJtYXN0ZXIiIHlldCksIG9yCisjIGlmIHdlIHdlcmUgdG9sZCBub3QgdG8gd29ycnksIHdlIGRvIG5vdCBoYXZlIHRvIGNoZWNrLgorY2FzZSAiLCR1cGRhdGVfaGVhZF9vaywkb3JpZ19oZWFkLCIgaW4KKyosLCB8IHQsKiApCisJOzsKKyopCisJY3Vycl9oZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsKQorCWlmIHRlc3QgIiRjdXJyX2hlYWQiICE9ICIkb3JpZ19oZWFkIgorCXRoZW4KKwkgICAgCWdpdC11cGRhdGUtcmVmIEhFQUQgIiRvcmlnX2hlYWQiCisJCWRpZSAiQ2Fubm90IGZldGNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiIKKwlmaQorCTs7Citlc2FjCmRpZmYgLS1naXQgYS9naXQtZm10LW1lcmdlLW1zZy5wZXJsIGIvZ2l0LWZtdC1tZXJnZS1tc2cucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTg2ZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWZtdC1tZXJnZS1tc2cucGVybApAQCAtMCwwICsxLDE3MyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworIyBSZWFkIC5naXQvRkVUQ0hfSEVBRCBhbmQgbWFrZSBhIGh1bWFuIHJlYWRhYmxlIG1lcmdlIG1lc3NhZ2UKKyMgYnkgZ3JvdXBpbmcgYnJhbmNoZXMgYW5kIHRhZ3MgdG9nZXRoZXIgdG8gZm9ybSBhIHNpbmdsZSBsaW5lLgorCit1c2Ugc3RyaWN0OworCitteSBAc3JjOworbXkgJXNyYzsKK3N1YiBhbmRqb2luIHsKKwlteSAoJGxhYmVsLCAkbGFiZWxzLCAkc3R1ZmYpID0gQF87CisJbXkgJGwgPSBzY2FsYXIgQCRzdHVmZjsKKwlteSAkbSA9ICcnOworCWlmICgkbCA9PSAwKSB7CisJCXJldHVybiAoKTsKKwl9CisJaWYgKCRsID09IDEpIHsKKwkJJG0gPSAiJGxhYmVsJHN0dWZmLT5bMF0iOworCX0KKwllbHNlIHsKKwkJJG0gPSAoIiRsYWJlbHMiIC4KKwkJICAgICAgam9pbiAoJywgJywgQHskc3R1ZmZ9WzAuLiRsLTJdKSAuCisJCSAgICAgICIgYW5kICRzdHVmZi0+Wy0xXSIpOworCX0KKwlyZXR1cm4gKCRtKTsKK30KKworc3ViIHJlcG9jb25maWcgeworCW15ICgkdmFsKSA9IHF4e2dpdC1yZXBvLWNvbmZpZyAtLWdldCBtZXJnZS5zdW1tYXJ5fTsKKwlyZXR1cm4gJHZhbDsKK30KKworc3ViIGN1cnJlbnRfYnJhbmNoIHsKKwlteSAoJGJyYSkgPSBxeHtnaXQtc3ltYm9saWMtcmVmIEhFQUR9OworCWNob21wKCRicmEpOworCSRicmEgPX4gc3xecmVmcy9oZWFkcy98fDsKKwlpZiAoJGJyYSBuZSAnbWFzdGVyJykgeworCQkkYnJhID0gIiBpbnRvICRicmEiOworCX0gZWxzZSB7CisJCSRicmEgPSAiIjsKKwl9CisJcmV0dXJuICRicmE7Cit9CisKK3N1YiBzaG9ydGxvZyB7CisJbXkgKCR0aXApID0gQF87CisJbXkgQHJlc3VsdDsKKwlmb3JlYWNoICggcXh7Z2l0LWxvZyAtLW5vLW1lcmdlcyAtLXRvcG8tb3JkZXIgLS1wcmV0dHk9b25lbGluZSAkdGlwIF5IRUFEfSApIHsKKwkJcy9eWzAtOWEtZl17NDB9XHMrLy87CisJCXB1c2ggQHJlc3VsdCwgJF87CisJfQorCWRpZSAiZ2l0LWxvZyBmYWlsZWRcbiIgaWYgJD87CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKK215IEBvcmlnaW4gPSAoKTsKK3doaWxlICg8PikgeworCW15ICgkYm5hbWUsICR0bmFtZSwgJGduYW1lLCAkc3JjLCAkc2hhMSwgJG9yaWdpbik7CisJY2hvbXA7CisJcy9eKFswLTlhLWZdKikJLy87CisJJHNoYTEgPSAkMTsKKwluZXh0IGlmICgvXm5vdC1mb3ItbWVyZ2UvKTsKKwlzL14JLy87CisJaWYgKHMvIG9mICguKikkLy8pIHsKKwkJJHNyYyA9ICQxOworCX0gZWxzZSB7CisJCSMgUHVsbGluZyBIRUFECisJCSRzcmMgPSAkXzsKKwkJJF8gPSAnSEVBRCc7CisJfQorCWlmICghIGV4aXN0cyAkc3JjeyRzcmN9KSB7CisJCXB1c2ggQHNyYywgJHNyYzsKKwkJJHNyY3skc3JjfSA9IHsKKwkJCUJSQU5DSCA9PiBbXSwKKwkJCVRBRyA9PiBbXSwKKwkJCVJfQlJBTkNIID0+IFtdLAorCQkJR0VORVJJQyA9PiBbXSwKKwkJCSMgJjEgPT0gaGFzIEhFQUQuCisJCQkjICYyID09IGhhcyBvdGhlcnMuCisJCQlIRUFEX1NUQVRVUyA9PiAwLAorCQl9OworCX0KKwlpZiAoL15icmFuY2ggKC4qKSQvKSB7CisJCSRvcmlnaW4gPSAkMTsKKwkJcHVzaCBAeyRzcmN7JHNyY317QlJBTkNIfX0sICQxOworCQkkc3JjeyRzcmN9e0hFQURfU1RBVFVTfSB8PSAyOworCX0KKwllbHNpZiAoL150YWcgKC4qKSQvKSB7CisJCSRvcmlnaW4gPSAkXzsKKwkJcHVzaCBAeyRzcmN7JHNyY317VEFHfX0sICQxOworCQkkc3JjeyRzcmN9e0hFQURfU1RBVFVTfSB8PSAyOworCX0KKwllbHNpZiAoL15yZW1vdGUgYnJhbmNoICguKikkLykgeworCQkkb3JpZ2luID0gJDE7CisJCXB1c2ggQHskc3JjeyRzcmN9e1JfQlJBTkNIfX0sICQxOworCQkkc3JjeyRzcmN9e0hFQURfU1RBVFVTfSB8PSAyOworCX0KKwllbHNpZiAoL15IRUFEJC8pIHsKKwkJJG9yaWdpbiA9ICRzcmM7CisJCSRzcmN7JHNyY317SEVBRF9TVEFUVVN9IHw9IDE7CisJfQorCWVsc2UgeworCQlwdXNoIEB7JHNyY3skc3JjfXtHRU5FUklDfX0sICRfOworCQkkc3JjeyRzcmN9e0hFQURfU1RBVFVTfSB8PSAyOworCQkkb3JpZ2luID0gJHNyYzsKKwl9CisJaWYgKCRzcmMgZXEgJy4nIHx8ICRzcmMgZXEgJG9yaWdpbikgeworCQkkb3JpZ2luID1+IHMvXicoLiopJyQvJDEvOworCQlwdXNoIEBvcmlnaW4sIFskc2hhMSwgIiRvcmlnaW4iXTsKKwl9CisJZWxzZSB7CisJCXB1c2ggQG9yaWdpbiwgWyRzaGExLCAiJG9yaWdpbiBvZiAkc3JjIl07CisJfQorfQorCitteSBAbXNnOworZm9yIG15ICRzcmMgKEBzcmMpIHsKKwlpZiAoJHNyY3skc3JjfXtIRUFEX1NUQVRVU30gPT0gMSkgeworCQkjIE9ubHkgSEVBRCBpcyBmZXRjaGVkLCBub3RoaW5nIGVsc2UuCisJCXB1c2ggQG1zZywgJHNyYzsKKwkJbmV4dDsKKwl9CisJbXkgQHRoaXM7CisJaWYgKCRzcmN7JHNyY317SEVBRF9TVEFUVVN9ID09IDMpIHsKKwkJIyBIRUFEIGlzIGZldGNoZWQgYW1vbmcgb3RoZXJzLgorCQlwdXNoIEB0aGlzLCBhbmRqb2luKCcnLCAnJywgWydIRUFEJ10pOworCX0KKwlwdXNoIEB0aGlzLCBhbmRqb2luKCJicmFuY2ggIiwgImJyYW5jaGVzICIsCisJCQkgICAkc3JjeyRzcmN9e0JSQU5DSH0pOworCXB1c2ggQHRoaXMsIGFuZGpvaW4oInJlbW90ZSBicmFuY2ggIiwgInJlbW90ZSBicmFuY2hlcyAiLAorCQkJICAgJHNyY3skc3JjfXtSX0JSQU5DSH0pOworCXB1c2ggQHRoaXMsIGFuZGpvaW4oInRhZyAiLCAidGFncyAiLAorCQkJICAgJHNyY3skc3JjfXtUQUd9KTsKKwlwdXNoIEB0aGlzLCBhbmRqb2luKCJjb21taXQgIiwgImNvbW1pdHMgIiwKKwkJCSAgICAkc3JjeyRzcmN9e0dFTkVSSUN9KTsKKwlteSAkdGhpcyA9IGpvaW4oJywgJywgQHRoaXMpOworCWlmICgkc3JjIG5lICcuJykgeworCQkkdGhpcyAuPSAiIG9mICRzcmMiOworCX0KKwlwdXNoIEBtc2csICR0aGlzOworfQorCitteSAkaW50byA9IGN1cnJlbnRfYnJhbmNoKCk7CisKK3ByaW50ICJNZXJnZSAiLCBqb2luKCI7ICIsIEBtc2cpLCAkaW50bywgIlxuIjsKKworaWYgKCFyZXBvY29uZmlnKSB7CisJZXhpdCgwKTsKK30KKworIyBXZSBsaW1pdCB0aGUgbWVyZ2UgbWVzc2FnZSB0byB0aGUgbGF0c3QgMjAgb3Igc28gcGVyIGVhY2ggYnJhbmNoLgorbXkgJGxpbWl0ID0gMjA7CisKK2ZvciAoQG9yaWdpbikgeworCW15ICgkc2hhMSwgJG5hbWUpID0gQCRfOworCW15IEBsb2cgPSBzaG9ydGxvZygkc2hhMSk7CisJaWYgKCRsaW1pdCArIDEgPD0gQGxvZykgeworCQlwcmludCAiXG4qICRuYW1lOiAoIiAuIHNjYWxhcihAbG9nKSAuICIgY29tbWl0cylcbiI7CisJfQorCWVsc2UgeworCQlwcmludCAiXG4qICRuYW1lOlxuIjsKKwl9CisJbXkgJGNudCA9IDA7CisJZm9yIG15ICRsb2cgKEBsb2cpIHsKKwkJaWYgKCRsaW1pdCA8ICsrJGNudCkgeworCQkJcHJpbnQgIiAgLi4uXG4iOworCQkJbGFzdDsKKwkJfQorCQlwcmludCAiICAkbG9nIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9naXQtbG9zdC1mb3VuZC5zaCBiL2dpdC1sb3N0LWZvdW5kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhNmQ1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbG9zdC1mb3VuZC5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKworVVNBR0U9JycKK1NVQkRJUkVDVE9SWV9PSz0nWWVzJworLiBnaXQtc2gtc2V0dXAKKworaWYgWyAiJCMiICE9ICIwIiBdCit0aGVuCisgICAgdXNhZ2UKK2ZpCisKK2xhZj0iJEdJVF9ESVIvbG9zdC1mb3VuZCIKK3JtIC1mciAiJGxhZiIgJiYgbWtkaXIgLXAgIiRsYWYvY29tbWl0IiAiJGxhZi9vdGhlciIgfHwgZXhpdAorCitnaXQgZnNjay1vYmplY3RzIHwKK3doaWxlIHJlYWQgZGFuZ2xpbmcgdHlwZSBzaGExCitkbworCWNhc2UgIiRkYW5nbGluZyIgaW4KKwlkYW5nbGluZykKKwkJaWYgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJHNoYTFeMCIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorCQl0aGVuCisJCQlkaXI9IiRsYWYvY29tbWl0IgorCQkJZ2l0LXNob3ctYnJhbmNoICIkc2hhMSIKKwkJZWxzZQorCQkJZGlyPSIkbGFmL290aGVyIgorCQlmaQorCQllY2hvICIkc2hhMSIgPiIkZGlyLyRzaGExIgorCQk7OworCWVzYWMKK2RvbmUKZGlmZiAtLWdpdCBhL2dpdC1scy1yZW1vdGUuc2ggYi9naXQtbHMtcmVtb3RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmZGNhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbHMtcmVtb3RlLnNoCkBAIC0wLDAgKzEsMTI4IEBACisjIS9iaW4vc2gKKyMKKwordXNhZ2UgKCkgeworICAgIGVjaG8gPiYyICJ1c2FnZTogJDAgWy0taGVhZHNdIFstLXRhZ3NdIFstdXwtLXVwbG9hZC1wYWNrIDx1cGxvYWQtcGFjaz5dIgorICAgIGVjaG8gPiYyICIgICAgICAgICAgPHJlcG9zaXRvcnk+IDxyZWZzPi4uLiIKKyAgICBleGl0IDE7Cit9CisKK2RpZSAoKSB7CisgICAgZWNobyA+JjIgIiQqIgorICAgIGV4aXQgMQorfQorCitleGVjPQord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrOzsgZXNhYworZG8KKyAgY2FzZSAiJDEiIGluCisgIC1ofC0taHwtLWhlfC0taGVhfC0taGVhZHwtLWhlYWRzKQorICBoZWFkcz1oZWFkczsgc2hpZnQgOzsKKyAgLXR8LS10fC0tdGF8LS10YWd8LS10YWdzKQorICB0YWdzPXRhZ3M7IHNoaWZ0IDs7CisgIC11fC0tdXwtLXVwfC0tdXBsfC0tdXBsb2F8LS11cGxvYWR8LS11cGxvYWQtfC0tdXBsb2FkLXB8LS11cGxvYWQtcGF8XAorICAtLXVwbG9hZC1wYWN8LS11cGxvYWQtcGFjaykKKwlzaGlmdAorCWV4ZWM9Ii0tZXhlYz0kMSIKKwlzaGlmdDs7CisgIC0tKQorICBzaGlmdDsgYnJlYWsgOzsKKyAgLSopCisgIHVzYWdlIDs7CisgICopCisgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAiJCMiIGluIDApIHVzYWdlIDs7IGVzYWMKKworY2FzZSAiLCRoZWFkcywkdGFncywiIGluCissLCwpIGhlYWRzPWhlYWRzIHRhZ3M9dGFncyBvdGhlcj1vdGhlciA7OworZXNhYworCisuIGdpdC1wYXJzZS1yZW1vdGUKK3BlZWtfcmVwbz0iJChnZXRfcmVtb3RlX3VybCAiJEAiKSIKK3NoaWZ0CisKK3RtcD0ubHMtcmVtb3RlLSQkCit0cmFwICJybSAtZnIgJHRtcC0qIiAwIDEgMiAzIDE1Cit0bXBkaXI9JHRtcC1kCisKK2Nhc2UgIiRwZWVrX3JlcG8iIGluCitodHRwOi8vKiB8IGh0dHBzOi8vKiApCisgICAgICAgIGlmIFsgLW4gIiRHSVRfU1NMX05PX1ZFUklGWSIgXTsgdGhlbgorICAgICAgICAgICAgY3VybF9leHRyYV9hcmdzPSItayIKKyAgICAgICAgZmkKKwljdXJsIC1uc2YgJGN1cmxfZXh0cmFfYXJncyAtLWhlYWRlciAiUHJhZ21hOiBuby1jYWNoZSIgIiRwZWVrX3JlcG8vaW5mby9yZWZzIiB8fAorCQllY2hvICJmYWlsZWQJc2x1cnBpbmciCisJOzsKKworcnN5bmM6Ly8qICkKKwlta2RpciAkdG1wZGlyICYmCisJcnN5bmMgLXJscSAiJHBlZWtfcmVwby9IRUFEIiAkdG1wZGlyICYmCisJcnN5bmMgLXJxICIkcGVla19yZXBvL3JlZnMiICR0bXBkaXIgfHwgeworCQllY2hvICJmYWlsZWQJc2x1cnBpbmciCisJCWV4aXQKKwl9CisJaGVhZD0kKGNhdCAiJHRtcGRpci9IRUFEIikgJiYKKwljYXNlICIkaGVhZCIgaW4KKwlyZWY6JyAnKikKKwkJaGVhZD0kKGV4cHIgInokaGVhZCIgOiAnenJlZjogXCguKlwpJykgJiYKKwkJaGVhZD0kKGNhdCAiJHRtcGRpci8kaGVhZCIpIHx8IGV4aXQKKwllc2FjICYmCisJZWNobyAiJGhlYWQJSEVBRCIKKwkoY2QgJHRtcGRpciAmJiBmaW5kIHJlZnMgLXR5cGUgZikgfAorCXdoaWxlIHJlYWQgcGF0aAorCWRvCisJCWNhdCAiJHRtcGRpci8kcGF0aCIgfCB0ciAtZCAnXDAxMicKKwkJZWNobyAiCSRwYXRoIgorCWRvbmUgJiYKKwlybSAtZnIgJHRtcGRpcgorCTs7CisKKyogKQorCWdpdC1wZWVrLXJlbW90ZSAkZXhlYyAiJHBlZWtfcmVwbyIgfHwKKwkJZWNobyAiZmFpbGVkCXNsdXJwaW5nIgorCTs7Citlc2FjIHwKK3NvcnQgLXQgJwknIC1rIDIgfAord2hpbGUgcmVhZCBzaGExIHBhdGgKK2RvCisJY2FzZSAiJHNoYTEiIGluCisJZmFpbGVkKQorCQlkaWUgIkZhaWxlZCB0byBmaW5kIHJlbW90ZSByZWZzIgorCWVzYWMKKwljYXNlICIkcGF0aCIgaW4KKwlyZWZzL2hlYWRzLyopCisJCWdyb3VwPWhlYWRzIDs7CisJcmVmcy90YWdzLyopCisJCWdyb3VwPXRhZ3MgOzsKKwkqKQorCQlncm91cD1vdGhlciA7OworCWVzYWMKKwljYXNlICIsJGhlYWRzLCR0YWdzLCRvdGhlciwiIGluCisJKiwkZ3JvdXAsKikKKwkJOzsKKwkqKQorCQljb250aW51ZTs7CisJZXNhYworCWNhc2UgIiQjIiBpbgorCTApCisJCW1hdGNoPXllcyA7OworCSopCisJCW1hdGNoPW5vCisJCWZvciBwYXQKKwkJZG8KKwkJCWNhc2UgIi8kcGF0aCIgaW4KKwkJCSovJHBhdCApCisJCQkJbWF0Y2g9eWVzCisJCQkJYnJlYWsgOzsKKwkJCWVzYWMKKwkJZG9uZQorCWVzYWMKKwljYXNlICIkbWF0Y2giIGluCisJbm8pCisJCWNvbnRpbnVlIDs7CisJZXNhYworCWVjaG8gIiRzaGExCSRwYXRoIgorZG9uZQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLW9jdG9wdXMuc2ggYi9naXQtbWVyZ2Utb2N0b3B1cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjNmNDczCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLW9jdG9wdXMuc2gKQEAgLTAsMCArMSwxMTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgUmVzb2x2ZSB0d28gb3IgbW9yZSB0cmVlcy4KKyMKKworTEY9JworJworCitkaWUgKCkgeworICAgIGVjaG8gPiYyICIkKiIKKyAgICBleGl0IDEKK30KKworIyBUaGUgZmlyc3QgcGFyYW1ldGVycyB1cCB0byAtLSBhcmUgbWVyZ2UgYmFzZXM7IHRoZSByZXN0IGFyZSBoZWFkcy4KK2Jhc2VzPSBoZWFkPSByZW1vdGVzPSBzZXBfc2Vlbj0KK2ZvciBhcmcKK2RvCisJY2FzZSAiLCRzZXBfc2VlbiwkaGVhZCwkYXJnLCIgaW4KKwkqLC0tLCkKKwkJc2VwX3NlZW49eWVzCisJCTs7CisJLHllcywsKikKKwkJaGVhZD0kYXJnCisJCTs7CisJLHllcywqKQorCQlyZW1vdGVzPSIkcmVtb3RlcyRhcmcgIgorCQk7OworCSopCisJCWJhc2VzPSIkYmFzZXMkYXJnICIKKwkJOzsKKwllc2FjCitkb25lCisKKyMgUmVqZWN0IGlmIHRoaXMgaXMgbm90IGFuIE9jdG9wdXMgLS0gcmVzb2x2ZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorY2FzZSAiJHJlbW90ZXMiIGluCis/KicgJz8qKQorCTs7CisqKQorCWV4aXQgMiA7OworZXNhYworCisjIE1SQyBpcyB0aGUgY3VycmVudCAibWVyZ2UgcmVmZXJlbmNlIGNvbW1pdCIKKyMgTVJUIGlzIHRoZSBjdXJyZW50ICJtZXJnZSByZXN1bHQgdHJlZSIKKworTVJDPSRoZWFkIE1TRz0gUEFSRU5UPSItcCAkaGVhZCIKK01SVD0kKGdpdC13cml0ZS10cmVlKQorQ05UPTEgOyMgY291bnRpbmcgb3VyIGhlYWQKK05PTl9GRl9NRVJHRT0wCitPQ1RPUFVTX0ZBSUxVUkU9MAorZm9yIFNIQTEgaW4gJHJlbW90ZXMKK2RvCisJY2FzZSAiJE9DVE9QVVNfRkFJTFVSRSIgaW4KKwkxKQorCQkjIFdlIGFsbG93IG9ubHkgbGFzdCBvbmUgdG8gaGF2ZSBhIGhhbmQtcmVzb2x2YWJsZQorCQkjIGNvbmZsaWN0cy4gIExhc3Qgcm91bmQgZmFpbGVkIGFuZCB3ZSBzdGlsbCBoYWQKKwkJIyBhIGhlYWQgdG8gbWVyZ2UuCisJCWVjaG8gIkF1dG9tYXRlZCBtZXJnZSBkaWQgbm90IHdvcmsuIgorCQllY2hvICJTaG91bGQgbm90IGJlIGRvaW5nIGFuIE9jdG9wdXMuIgorCQlleGl0IDIKKwllc2FjCisKKwljb21tb249JChnaXQtbWVyZ2UtYmFzZSAtLWFsbCAkTVJDICRTSEExKSB8fAorCQlkaWUgIlVuYWJsZSB0byBmaW5kIGNvbW1vbiBjb21taXQgd2l0aCAkU0hBMSIKKworCWNhc2UgIiRMRiRjb21tb24kTEYiIGluCisJKiIkTEYkU0hBMSRMRiIqKQorCQllY2hvICJBbHJlYWR5IHVwLXRvLWRhdGUgd2l0aCAkU0hBMSIKKwkJY29udGludWUKKwkJOzsKKwllc2FjCisKKwlDTlQ9YGV4cHIgJENOVCArIDFgCisJUEFSRU5UPSIkUEFSRU5UIC1wICRTSEExIgorCisJaWYgdGVzdCAiJGNvbW1vbiwkTk9OX0ZGX01FUkdFIiA9ICIkTVJDLDAiCisJdGhlbgorCQkjIFRoZSBmaXJzdCBoZWFkIGJlaW5nIG1lcmdlZCB3YXMgYSBmYXN0LWZvcndhcmQuCisJCSMgQWR2YW5jZSBNUkMgdG8gdGhlIGhlYWQgYmVpbmcgbWVyZ2VkLCBhbmQgdXNlIHRoYXQKKwkJIyB0cmVlIGFzIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IG9mIHRoZSBtZXJnZS4KKwkJIyBXZSBzdGlsbCBuZWVkIHRvIGNvdW50IHRoaXMgYXMgcGFydCBvZiB0aGUgcGFyZW50IHNldC4KKworCQllY2hvICJGYXN0IGZvcndhcmRpbmcgdG86ICRTSEExIgorCQlnaXQtcmVhZC10cmVlIC11IC1tICRoZWFkICRTSEExIHx8IGV4aXQKKwkJTVJDPSRTSEExIE1SVD0kKGdpdC13cml0ZS10cmVlKQorCQljb250aW51ZQorCWZpCisKKwlOT05fRkZfTUVSR0U9MQorCisJZWNobyAiVHJ5aW5nIHNpbXBsZSBtZXJnZSB3aXRoICRTSEExIgorCWdpdC1yZWFkLXRyZWUgLXUgLW0gLS1hZ2dyZXNzaXZlICAkY29tbW9uICRNUlQgJFNIQTEgfHwgZXhpdCAyCisJbmV4dD0kKGdpdC13cml0ZS10cmVlIDI+L2Rldi9udWxsKQorCWlmIHRlc3QgJD8gLW5lIDAKKwl0aGVuCisJCWVjaG8gIlNpbXBsZSBtZXJnZSBkaWQgbm90IHdvcmssIHRyeWluZyBhdXRvbWF0aWMgbWVyZ2UuIgorCQlnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hIHx8CisJCU9DVE9QVVNfRkFJTFVSRT0xCisJCW5leHQ9JChnaXQtd3JpdGUtdHJlZSAyPi9kZXYvbnVsbCkKKwlmaQorCisJIyBXZSBoYXZlIG1lcmdlZCB0aGUgb3RoZXIgYnJhbmNoIHN1Y2Nlc3NmdWxseS4gIElkZWFsbHkKKwkjIHdlIGNvdWxkIGltcGxlbWVudCBPUidlZCBoZWFkcyBpbiBtZXJnZS1iYXNlLCBhbmQga2VlcAorCSMgYSBsaXN0IG9mIGNvbW1pdHMgd2UgaGF2ZSBtZXJnZWQgc28gZmFyIGluIE1SQyB0byBmZWVkCisJIyB0aGVtIHRvIG1lcmdlLWJhc2UsIGJ1dCB3ZSBhcHByb3hpbWF0ZSBpdCBieSBrZWVwIHVzaW5nCisJIyB0aGUgY3VycmVudCBNUkMuICBXZSB1c2VkIHRvIHVwZGF0ZSBpdCB0byAkY29tbW9uLCB3aGljaAorCSMgd2FzIGluY29ycmVjdGx5IGRvaW5nIEFORCdlZCBtZXJnZS1iYXNlIGhlcmUsIHdoaWNoIHdhcworCSMgdW5uZWVkZWQuCisKKwlNUlQ9JG5leHQKK2RvbmUKKworZXhpdCAiJE9DVE9QVVNfRkFJTFVSRSIKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS1vbmUtZmlsZS5zaCBiL2dpdC1tZXJnZS1vbmUtZmlsZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjE5NDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLW9uZS1maWxlLnNoCkBAIC0wLDAgKzEsMTIwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSBMaW51cyBUb3J2YWxkcywgMjAwNQorIworIyBUaGlzIGlzIHRoZSBnaXQgcGVyLWZpbGUgbWVyZ2Ugc2NyaXB0LCBjYWxsZWQgd2l0aAorIworIyAgICQxIC0gb3JpZ2luYWwgZmlsZSBTSEExIChvciBlbXB0eSkKKyMgICAkMiAtIGZpbGUgaW4gYnJhbmNoMSBTSEExIChvciBlbXB0eSkKKyMgICAkMyAtIGZpbGUgaW4gYnJhbmNoMiBTSEExIChvciBlbXB0eSkKKyMgICAkNCAtIHBhdGhuYW1lIGluIHJlcG9zaXRvcnkKKyMgICAkNSAtIG9yaWduYWwgZmlsZSBtb2RlIChvciBlbXB0eSkKKyMgICAkNiAtIGZpbGUgaW4gYnJhbmNoMSBtb2RlIChvciBlbXB0eSkKKyMgICAkNyAtIGZpbGUgaW4gYnJhbmNoMiBtb2RlIChvciBlbXB0eSkKKyMKKyMgSGFuZGxlIHNvbWUgdHJpdmlhbCBjYXNlcy4uIFRoZSBfcmVhbGx5XyB0cml2aWFsIGNhc2VzIGhhdmUKKyMgYmVlbiBoYW5kbGVkIGFscmVhZHkgYnkgZ2l0LXJlYWQtdHJlZSwgYnV0IHRoYXQgb25lIGRvZXNuJ3QKKyMgZG8gYW55IG1lcmdlcyB0aGF0IG1pZ2h0IGNoYW5nZSB0aGUgdHJlZSBsYXlvdXQuCisKK2Nhc2UgIiR7MTotLn0kezI6LS59JHszOi0ufSIgaW4KKyMKKyMgRGVsZXRlZCBpbiBib3RoIG9yIGRlbGV0ZWQgaW4gb25lIGFuZCB1bmNoYW5nZWQgaW4gdGhlIG90aGVyCisjCisiJDEuLiIgfCAiJDEuJDEiIHwgIiQxJDEuIikKKwlpZiBbICIkMiIgXTsgdGhlbgorCQllY2hvICJSZW1vdmluZyAkNCIKKwlmaQorCWlmIHRlc3QgLWYgIiQ0IjsgdGhlbgorCQlybSAtZiAtLSAiJDQiICYmCisJCXJtZGlyIC1wICIkKGV4cHIgInokNCIgOiAnelwoLipcKS8nKSIgMj4vZGV2L251bGwgfHwgOgorCWZpICYmCisJCWV4ZWMgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLSAiJDQiCisJOzsKKworIworIyBBZGRlZCBpbiBvbmUuCisjCisiLiQyLiIgfCAiLi4kMyIgKQorCWVjaG8gIkFkZGluZyAkNCIKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tY2FjaGVpbmZvICIkNiQ3IiAiJDIkMyIgIiQ0IiAmJgorCQlleGVjIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtLSAiJDQiCisJOzsKKworIworIyBBZGRlZCBpbiBib3RoLCBpZGVudGljYWxseSAoY2hlY2sgZm9yIHNhbWUgcGVybWlzc2lvbnMpLgorIworIi4kMyQyIikKKwlpZiBbICIkNiIgIT0gIiQ3IiBdOyB0aGVuCisJCWVjaG8gIkVSUk9SOiBGaWxlICQ0IGFkZGVkIGlkZW50aWNhbGx5IGluIGJvdGggYnJhbmNoZXMsIgorCQllY2hvICJFUlJPUjogYnV0IHBlcm1pc3Npb25zIGNvbmZsaWN0ICQ2LT4kNy4iCisJCWV4aXQgMQorCWZpCisJZWNobyAiQWRkaW5nICQ0IgorCWdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1jYWNoZWluZm8gIiQ2IiAiJDIiICIkNCIgJiYKKwkJZXhlYyBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLS0gIiQ0IgorCTs7CisKKyMKKyMgTW9kaWZpZWQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LgorIworIiQxJDIkMyIgfCAiLiQyJDMiKQorCisJY2FzZSAiLCQ2LCQ3LCIgaW4KKwkqLDEyMDAwMCwqKQorCQllY2hvICJFUlJPUjogJDQ6IE5vdCBtZXJnaW5nIHN5bWJvbGljIGxpbmsgY2hhbmdlcy4iCisJCWV4aXQgMQorCQk7OworCWVzYWMKKworCXNyYzI9YGdpdC11bnBhY2stZmlsZSAkM2AKKwljYXNlICIkMSIgaW4KKwknJykKKwkJZWNobyAiQWRkZWQgJDQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LiIKKwkJIyBUaGlzIGV4dHJhY3RzIE9VUiBmaWxlIGluICRvcmlnLCBhbmQgdXNlcyBnaXQtYXBwbHkgdG8KKwkJIyByZW1vdmUgbGluZXMgdGhhdCBhcmUgdW5pcXVlIHRvIG91cnMuCisJCW9yaWc9YGdpdC11bnBhY2stZmlsZSAkMmAKKwkJc3owPWB3YyAtYyA8IiRvcmlnImAKKwkJZGlmZiAtdSAtTGEvJG9yaWcgLUxiLyRvcmlnICRvcmlnICRzcmMyIHwgZ2l0LWFwcGx5IC0tbm8tYWRkIAorCQlzejE9YHdjIC1jIDwiJG9yaWciYAorCisJCSMgSWYgd2UgZG8gbm90IGhhdmUgZW5vdWdoIGNvbW1vbiBtYXRlcmlhbCwgaXQgaXMgbm90CisJCSMgd29ydGggdHJ5aW5nIHR3by1maWxlIG1lcmdlIHVzaW5nIGNvbW1vbiBzdWJzZWN0aW9ucy4KKwkJZXhwciAiJHN6MCIgXDwgIiRzejEiIFwqIDIgPi9kZXYvbnVsbCB8fCA6ID4kb3JpZworCQk7OworCSopCisJCWVjaG8gIkF1dG8tbWVyZ2luZyAkNCIKKwkJb3JpZz1gZ2l0LXVucGFjay1maWxlICQxYAorCQk7OworCWVzYWMKKworCSMgQmUgY2FyZWZ1bCBmb3IgZnVubnkgZmlsZW5hbWUgc3VjaCBhcyAiLUwiIGluICIkNCIsIHdoaWNoCisJIyB3b3VsZCBjb25mdXNlICJtZXJnZSIgZ3JlYXRseS4KKwlzcmMxPWBnaXQtdW5wYWNrLWZpbGUgJDJgCisJbWVyZ2UgIiRzcmMxIiAiJG9yaWciICIkc3JjMiIKKwlyZXQ9JD8KKworCSMgQ3JlYXRlIHRoZSB3b3JraW5nIHRyZWUgZmlsZSwgdXNpbmcgIm91ciB0cmVlIiB2ZXJzaW9uIGZyb20gdGhlCisJIyBpbmRleCwgYW5kIHRoZW4gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisJZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tc3RhZ2U9MiAtLSAiJDQiICYmIGNhdCAiJHNyYzEiID4iJDQiCisJcm0gLWYgLS0gIiRvcmlnIiAiJHNyYzEiICIkc3JjMiIKKworCWlmIFsgIiQ2IiAhPSAiJDciIF07IHRoZW4KKwkJZWNobyAiRVJST1I6IFBlcm1pc3Npb25zIGNvbmZsaWN0OiAkNS0+JDYsJDcuIgorCQlyZXQ9MQorCWZpCisJaWYgWyAiJDEiID0gJycgXTsgdGhlbgorCQlyZXQ9MQorCWZpCisKKwlpZiBbICRyZXQgLW5lIDAgXTsgdGhlbgorCQllY2hvICJFUlJPUjogTWVyZ2UgY29uZmxpY3QgaW4gJDQiCisJCWV4aXQgMQorCWZpCisJZXhlYyBnaXQtdXBkYXRlLWluZGV4IC0tICIkNCIKKwk7OworCisqKQorCWVjaG8gIkVSUk9SOiAkNDogTm90IGhhbmRsaW5nIGNhc2UgJDEgLT4gJDIgLT4gJDMiCisJOzsKK2VzYWMKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLW91cnMuc2ggYi9naXQtbWVyZ2Utb3Vycy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZjNkMDUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLW91cnMuc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworIyBQcmV0ZW5kIHdlIHJlc29sdmVkIHRoZSBoZWFkcywgYnV0IGRlY2xhcmUgb3VyIHRyZWUgdHJ1bXBzIGV2ZXJ5Ym9keSBlbHNlLgorIworCisjIFdlIG5lZWQgdG8gZXhpdCB3aXRoIDIgaWYgdGhlIGluZGV4IGRvZXMgbm90IG1hdGNoIG91ciBIRUFEIHRyZWUsCisjIGJlY2F1c2UgdGhlIGN1cnJlbnQgaW5kZXggaXMgd2hhdCB3ZSB3aWxsIGJlIGNvbW1pdHRpbmcgYXMgdGhlCisjIG1lcmdlIHJlc3VsdC4KKwordGVzdCAiJChnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAtLW5hbWUtc3RhdHVzIEhFQUQpIiA9ICIiIHx8IGV4aXQgMgorCitleGl0IDAKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS1yZWN1cnNpdmUucHkgYi9naXQtbWVyZ2UtcmVjdXJzaXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlOGEzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbWVyZ2UtcmVjdXJzaXZlLnB5CkBAIC0wLDAgKzEsOTQ0IEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZHJpayBLdWl2aW5lbgorIworCitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJycnQEBHSVRfUFlUSE9OX1BBVEhAQCcnJykKKworaW1wb3J0IG1hdGgsIHJhbmRvbSwgb3MsIHJlLCBzaWduYWwsIHRlbXBmaWxlLCBzdGF0LCBlcnJubywgdHJhY2ViYWNrCitmcm9tIGhlYXBxIGltcG9ydCBoZWFwcHVzaCwgaGVhcHBvcAorZnJvbSBzZXRzIGltcG9ydCBTZXQKKworZnJvbSBnaXRNZXJnZUNvbW1vbiBpbXBvcnQgKgorCitvdXRwdXRJbmRlbnQgPSAwCitkZWYgb3V0cHV0KCphcmdzKToKKyAgICBzeXMuc3Rkb3V0LndyaXRlKCcgICcqb3V0cHV0SW5kZW50KQorICAgIHByaW50TGlzdChhcmdzKQorCitvcmlnaW5hbEluZGV4RmlsZSA9IG9zLmVudmlyb24uZ2V0KCdHSVRfSU5ERVhfRklMRScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb24uZ2V0KCdHSVRfRElSJywgJy5naXQnKSArICcvaW5kZXgnKQordGVtcG9yYXJ5SW5kZXhGaWxlID0gb3MuZW52aXJvbi5nZXQoJ0dJVF9ESVInLCAnLmdpdCcpICsgXAorICAgICAgICAgICAgICAgICAgICAgJy9tZXJnZS1yZWN1cnNpdmUtdG1wLWluZGV4JworZGVmIHNldHVwSW5kZXgodGVtcG9yYXJ5KToKKyAgICB0cnk6CisgICAgICAgIG9zLnVubGluayh0ZW1wb3JhcnlJbmRleEZpbGUpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBpZiB0ZW1wb3Jhcnk6CisgICAgICAgIG5ld0luZGV4ID0gdGVtcG9yYXJ5SW5kZXhGaWxlCisgICAgZWxzZToKKyAgICAgICAgbmV3SW5kZXggPSBvcmlnaW5hbEluZGV4RmlsZQorICAgIG9zLmVudmlyb25bJ0dJVF9JTkRFWF9GSUxFJ10gPSBuZXdJbmRleAorCisjIFRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUgd2hpY2ggaXMgdXNlZCBpbiBhIG51bWJlciBvZiBwbGFjZXMgYnV0CisjIG9ubHkgd3JpdHRlbiB0byBpbiB0aGUgJ21lcmdlJyBmdW5jdGlvbi4KKworIyBjYWNoZU9ubHkgPT0gVHJ1ZSAgPT4gRG9uJ3QgbGVhdmUgYW55IG5vbi1zdGFnZSAwIGVudHJpZXMgaW4gdGhlIGNhY2hlIGFuZAorIyAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgdXBkYXRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyMgICAgICAgICAgICAgIEZhbHNlID0+IExlYXZlIHVubWVyZ2VkIGVudHJpZXMgaW4gdGhlIGNhY2hlIGFuZCB1cGRhdGUKKyMgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKworY2FjaGVPbmx5ID0gRmFsc2UKKworIyBUaGUgZW50cnkgcG9pbnQgdG8gdGhlIG1lcmdlIGNvZGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBtZXJnZShoMSwgaDIsIGJyYW5jaDFOYW1lLCBicmFuY2gyTmFtZSwgZ3JhcGgsIGNhbGxEZXB0aD0wLCBhbmNlc3Rvcj1Ob25lKToKKyAgICAnJydNZXJnZSB0aGUgY29tbWl0cyBoMSBhbmQgaDIsIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpcnR1YWwKKyAgICBjb21taXQgb2JqZWN0IGFuZCBhIGZsYWcgaW5kaWNhdGluZyB0aGUgY2xlYW5lc3Mgb2YgdGhlIG1lcmdlLicnJworICAgIGFzc2VydChpc2luc3RhbmNlKGgxLCBDb21taXQpIGFuZCBpc2luc3RhbmNlKGgyLCBDb21taXQpKQorCisgICAgZ2xvYmFsIG91dHB1dEluZGVudAorCisgICAgb3V0cHV0KCdNZXJnaW5nOicpCisgICAgb3V0cHV0KGgxKQorICAgIG91dHB1dChoMikKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKworICAgIGlmIGFuY2VzdG9yOgorICAgICAgICBjYSA9IFthbmNlc3Rvcl0KKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShncmFwaCwgR3JhcGgpKQorICAgICAgICBjYSA9IGdldENvbW1vbkFuY2VzdG9ycyhncmFwaCwgaDEsIGgyKQorICAgIG91dHB1dCgnZm91bmQnLCBsZW4oY2EpLCAnY29tbW9uIGFuY2VzdG9yKHMpOicpCisgICAgZm9yIHggaW4gY2E6CisgICAgICAgIG91dHB1dCh4KQorICAgIHN5cy5zdGRvdXQuZmx1c2goKQorCisgICAgbWVyZ2VkQ0EgPSBjYVswXQorICAgIGZvciBoIGluIGNhWzE6XToKKyAgICAgICAgb3V0cHV0SW5kZW50ID0gY2FsbERlcHRoKzEKKyAgICAgICAgW21lcmdlZENBLCBkdW1teV0gPSBtZXJnZShtZXJnZWRDQSwgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGVtcG9yYXJ5IG1lcmdlIGJyYW5jaCAxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGVtcG9yYXJ5IG1lcmdlIGJyYW5jaCAyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaCwgY2FsbERlcHRoKzEpCisgICAgICAgIG91dHB1dEluZGVudCA9IGNhbGxEZXB0aAorICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShtZXJnZWRDQSwgQ29tbWl0KSkKKworICAgIGdsb2JhbCBjYWNoZU9ubHkKKyAgICBpZiBjYWxsRGVwdGggPT0gMDoKKyAgICAgICAgc2V0dXBJbmRleChGYWxzZSkKKyAgICAgICAgY2FjaGVPbmx5ID0gRmFsc2UKKyAgICBlbHNlOgorICAgICAgICBzZXR1cEluZGV4KFRydWUpCisgICAgICAgIHJ1blByb2dyYW0oWydnaXQtcmVhZC10cmVlJywgaDEudHJlZSgpXSkKKyAgICAgICAgY2FjaGVPbmx5ID0gVHJ1ZQorCisgICAgW3NoYVJlcywgY2xlYW5dID0gbWVyZ2VUcmVlcyhoMS50cmVlKCksIGgyLnRyZWUoKSwgbWVyZ2VkQ0EudHJlZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoMU5hbWUsIGJyYW5jaDJOYW1lKQorCisgICAgaWYgZ3JhcGggYW5kIChjbGVhbiBvciBjYWNoZU9ubHkpOgorICAgICAgICByZXMgPSBDb21taXQoTm9uZSwgW2gxLCBoMl0sIHRyZWU9c2hhUmVzKQorICAgICAgICBncmFwaC5hZGROb2RlKHJlcykKKyAgICBlbHNlOgorICAgICAgICByZXMgPSBOb25lCisKKyAgICByZXR1cm4gW3JlcywgY2xlYW5dCisKK2dldEZpbGVzUkUgPSByZS5jb21waWxlKHInXihbMC03XSspIChcUyspIChbMC05YS1mXXs0MH0pXHQoLiopJCcsIHJlLlMpCitkZWYgZ2V0RmlsZXNBbmREaXJzKHRyZWUpOgorICAgIGZpbGVzID0gU2V0KCkKKyAgICBkaXJzID0gU2V0KCkKKyAgICBvdXQgPSBydW5Qcm9ncmFtKFsnZ2l0LWxzLXRyZWUnLCAnLXInLCAnLXonLCAnLXQnLCB0cmVlXSkKKyAgICBmb3IgbCBpbiBvdXQuc3BsaXQoJ1wwJyk6CisgICAgICAgIG0gPSBnZXRGaWxlc1JFLm1hdGNoKGwpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBpZiBtLmdyb3VwKDIpID09ICd0cmVlJzoKKyAgICAgICAgICAgICAgICBkaXJzLmFkZChtLmdyb3VwKDQpKQorICAgICAgICAgICAgZWxpZiBtLmdyb3VwKDIpID09ICdibG9iJzoKKyAgICAgICAgICAgICAgICBmaWxlcy5hZGQobS5ncm91cCg0KSkKKworICAgIHJldHVybiBbZmlsZXMsIGRpcnNdCisKKyMgVGhvc2UgdHdvIGdsb2JhbCB2YXJpYWJsZXMgYXJlIHVzZWQgaW4gYSBudW1iZXIgb2YgcGxhY2VzIGJ1dCBvbmx5CisjIHdyaXR0ZW4gdG8gaW4gJ21lcmdlVHJlZXMnIGFuZCAndW5pcXVlUGF0aCcuIFRoZXkga2VlcCB0cmFjayBvZgorIyBldmVyeSBmaWxlIGFuZCBkaXJlY3RvcnkgaW4gdGhlIHR3byBicmFuY2hlcyB0aGF0IGFyZSBhYm91dCB0byBiZQorIyBtZXJnZWQuCitjdXJyZW50RmlsZVNldCA9IE5vbmUKK2N1cnJlbnREaXJlY3RvcnlTZXQgPSBOb25lCisKK2RlZiBtZXJnZVRyZWVzKGhlYWQsIG1lcmdlLCBjb21tb24sIGJyYW5jaDFOYW1lLCBicmFuY2gyTmFtZSk6CisgICAgJycnTWVyZ2UgdGhlIHRyZWVzICdoZWFkJyBhbmQgJ21lcmdlJyB3aXRoIHRoZSBjb21tb24gYW5jZXN0b3IKKyAgICAnY29tbW9uJy4gVGhlIG5hbWUgb2YgdGhlIGhlYWQgYnJhbmNoIGlzICdicmFuY2gxTmFtZScgYW5kIHRoZSBuYW1lIG9mCisgICAgdGhlIG1lcmdlIGJyYW5jaCBpcyAnYnJhbmNoMk5hbWUnLiBSZXR1cm4gYSB0dXBsZSAodHJlZSwgY2xlYW5NZXJnZSkKKyAgICB3aGVyZSB0cmVlIGlzIHRoZSByZXN1bHRpbmcgdHJlZSBhbmQgY2xlYW5NZXJnZSBpcyBUcnVlIGlmZiB0aGUKKyAgICBtZXJnZSB3YXMgY2xlYW4uJycnCisgICAgCisgICAgYXNzZXJ0KGlzU2hhKGhlYWQpIGFuZCBpc1NoYShtZXJnZSkgYW5kIGlzU2hhKGNvbW1vbikpCisKKyAgICBpZiBjb21tb24gPT0gbWVyZ2U6CisgICAgICAgIG91dHB1dCgnQWxyZWFkeSB1cHRvZGF0ZSEnKQorICAgICAgICByZXR1cm4gW2hlYWQsIFRydWVdCisKKyAgICBpZiBjYWNoZU9ubHk6CisgICAgICAgIHVwZGF0ZUFyZyA9ICctaScKKyAgICBlbHNlOgorICAgICAgICB1cGRhdGVBcmcgPSAnLXUnCisKKyAgICBbb3V0LCBjb2RlXSA9IHJ1blByb2dyYW0oWydnaXQtcmVhZC10cmVlJywgdXBkYXRlQXJnLCAnLW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24sIGhlYWQsIG1lcmdlXSwgcmV0dXJuQ29kZSA9IFRydWUpCisgICAgaWYgY29kZSAhPSAwOgorICAgICAgICBkaWUoJ2dpdC1yZWFkLXRyZWU6Jywgb3V0KQorCisgICAgW3RyZWUsIGNvZGVdID0gcnVuUHJvZ3JhbSgnZ2l0LXdyaXRlLXRyZWUnLCByZXR1cm5Db2RlPVRydWUpCisgICAgdHJlZSA9IHRyZWUucnN0cmlwKCkKKyAgICBpZiBjb2RlICE9IDA6CisgICAgICAgIGdsb2JhbCBjdXJyZW50RmlsZVNldCwgY3VycmVudERpcmVjdG9yeVNldAorICAgICAgICBbY3VycmVudEZpbGVTZXQsIGN1cnJlbnREaXJlY3RvcnlTZXRdID0gZ2V0RmlsZXNBbmREaXJzKGhlYWQpCisgICAgICAgIFtmaWxlc00sIGRpcnNNXSA9IGdldEZpbGVzQW5kRGlycyhtZXJnZSkKKyAgICAgICAgY3VycmVudEZpbGVTZXQudW5pb25fdXBkYXRlKGZpbGVzTSkKKyAgICAgICAgY3VycmVudERpcmVjdG9yeVNldC51bmlvbl91cGRhdGUoZGlyc00pCisKKyAgICAgICAgZW50cmllcyA9IHVubWVyZ2VkQ2FjaGVFbnRyaWVzKCkKKyAgICAgICAgcmVuYW1lc0hlYWQgPSAgZ2V0UmVuYW1lcyhoZWFkLCBjb21tb24sIGhlYWQsIG1lcmdlLCBlbnRyaWVzKQorICAgICAgICByZW5hbWVzTWVyZ2UgPSBnZXRSZW5hbWVzKG1lcmdlLCBjb21tb24sIGhlYWQsIG1lcmdlLCBlbnRyaWVzKQorCisgICAgICAgIGNsZWFuTWVyZ2UgPSBwcm9jZXNzUmVuYW1lcyhyZW5hbWVzSGVhZCwgcmVuYW1lc01lcmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoMU5hbWUsIGJyYW5jaDJOYW1lKQorICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LnByb2Nlc3NlZDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IHByb2Nlc3NFbnRyeShlbnRyeSwgYnJhbmNoMU5hbWUsIGJyYW5jaDJOYW1lKToKKyAgICAgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgY2xlYW5NZXJnZSBvciBjYWNoZU9ubHk6CisgICAgICAgICAgICB0cmVlID0gcnVuUHJvZ3JhbSgnZ2l0LXdyaXRlLXRyZWUnKS5yc3RyaXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJlZSA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBjbGVhbk1lcmdlID0gVHJ1ZQorCisgICAgcmV0dXJuIFt0cmVlLCBjbGVhbk1lcmdlXQorCisjIExvdyBsZXZlbCBmaWxlIG1lcmdpbmcsIHVwZGF0ZSBhbmQgcmVtb3ZhbAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIG1lcmdlRmlsZShvUGF0aCwgb1NoYSwgb01vZGUsIGFQYXRoLCBhU2hhLCBhTW9kZSwgYlBhdGgsIGJTaGEsIGJNb2RlLAorICAgICAgICAgICAgICBicmFuY2gxTmFtZSwgYnJhbmNoMk5hbWUpOgorCisgICAgbWVyZ2UgPSBGYWxzZQorICAgIGNsZWFuID0gVHJ1ZQorCisgICAgaWYgc3RhdC5TX0lGTVQoYU1vZGUpICE9IHN0YXQuU19JRk1UKGJNb2RlKToKKyAgICAgICAgY2xlYW4gPSBGYWxzZQorICAgICAgICBpZiBzdGF0LlNfSVNSRUcoYU1vZGUpOgorICAgICAgICAgICAgbW9kZSA9IGFNb2RlCisgICAgICAgICAgICBzaGEgPSBhU2hhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlID0gYk1vZGUKKyAgICAgICAgICAgIHNoYSA9IGJTaGEKKyAgICBlbHNlOgorICAgICAgICBpZiBhU2hhICE9IG9TaGEgYW5kIGJTaGEgIT0gb1NoYToKKyAgICAgICAgICAgIG1lcmdlID0gVHJ1ZQorCisgICAgICAgIGlmIGFNb2RlID09IG9Nb2RlOgorICAgICAgICAgICAgbW9kZSA9IGJNb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlID0gYU1vZGUKKworICAgICAgICBpZiBhU2hhID09IG9TaGE6CisgICAgICAgICAgICBzaGEgPSBiU2hhCisgICAgICAgIGVsaWYgYlNoYSA9PSBvU2hhOgorICAgICAgICAgICAgc2hhID0gYVNoYQorICAgICAgICBlbGlmIHN0YXQuU19JU1JFRyhhTW9kZSk6CisgICAgICAgICAgICBhc3NlcnQoc3RhdC5TX0lTUkVHKGJNb2RlKSkKKworICAgICAgICAgICAgb3JpZyA9IHJ1blByb2dyYW0oWydnaXQtdW5wYWNrLWZpbGUnLCBvU2hhXSkucnN0cmlwKCkKKyAgICAgICAgICAgIHNyYzEgPSBydW5Qcm9ncmFtKFsnZ2l0LXVucGFjay1maWxlJywgYVNoYV0pLnJzdHJpcCgpCisgICAgICAgICAgICBzcmMyID0gcnVuUHJvZ3JhbShbJ2dpdC11bnBhY2stZmlsZScsIGJTaGFdKS5yc3RyaXAoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIFtvdXQsIGNvZGVdID0gcnVuUHJvZ3JhbShbJ21lcmdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctTCcsIGJyYW5jaDFOYW1lICsgJy8nICsgYVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLUwnLCAnb3JpZy8nICsgb1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLUwnLCBicmFuY2gyTmFtZSArICcvJyArIGJQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgb3JpZywgc3JjMl0sIHJldHVybkNvZGU9VHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBQcm9ncmFtRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBlCisgICAgICAgICAgICAgICAgZGllKCJGYWlsZWQgdG8gZXhlY3V0ZSAnbWVyZ2UnLiBtZXJnZSgxKSBpcyB1c2VkIGFzIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICJmaWxlLWxldmVsIG1lcmdlIHRvb2wuIElzICdtZXJnZScgaW4geW91ciBwYXRoPyIpCisKKyAgICAgICAgICAgIHNoYSA9IHJ1blByb2dyYW0oWydnaXQtaGFzaC1vYmplY3QnLCAnLXQnLCAnYmxvYicsICctdycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxXSkucnN0cmlwKCkKKworICAgICAgICAgICAgb3MudW5saW5rKG9yaWcpCisgICAgICAgICAgICBvcy51bmxpbmsoc3JjMSkKKyAgICAgICAgICAgIG9zLnVubGluayhzcmMyKQorCisgICAgICAgICAgICBjbGVhbiA9IChjb2RlID09IDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQoc3RhdC5TX0lTTE5LKGFNb2RlKSBhbmQgc3RhdC5TX0lTTE5LKGJNb2RlKSkKKyAgICAgICAgICAgIHNoYSA9IGFTaGEKKworICAgICAgICAgICAgaWYgYVNoYSAhPSBiU2hhOgorICAgICAgICAgICAgICAgIGNsZWFuID0gRmFsc2UKKworICAgIHJldHVybiBbc2hhLCBtb2RlLCBjbGVhbiwgbWVyZ2VdCisKK2RlZiB1cGRhdGVGaWxlKGNsZWFuLCBzaGEsIG1vZGUsIHBhdGgpOgorICAgIHVwZGF0ZUNhY2hlID0gY2FjaGVPbmx5IG9yIGNsZWFuCisgICAgdXBkYXRlV2QgPSBub3QgY2FjaGVPbmx5CisKKyAgICByZXR1cm4gdXBkYXRlRmlsZUV4dChzaGEsIG1vZGUsIHBhdGgsIHVwZGF0ZUNhY2hlLCB1cGRhdGVXZCkKKworZGVmIHVwZGF0ZUZpbGVFeHQoc2hhLCBtb2RlLCBwYXRoLCB1cGRhdGVDYWNoZSwgdXBkYXRlV2QpOgorICAgIGlmIGNhY2hlT25seToKKyAgICAgICAgdXBkYXRlV2QgPSBGYWxzZQorCisgICAgaWYgdXBkYXRlV2Q6CisgICAgICAgIHBhdGhDb21wb25lbnRzID0gcGF0aC5zcGxpdCgnLycpCisgICAgICAgIGZvciB4IGluIHhyYW5nZSgxLCBsZW4ocGF0aENvbXBvbmVudHMpKToKKyAgICAgICAgICAgIHAgPSAnLycuam9pbihwYXRoQ29tcG9uZW50c1swOnhdKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3JlYXRlRGlyID0gbm90IHN0YXQuU19JU0RJUihvcy5sc3RhdChwKS5zdF9tb2RlKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgY3JlYXRlRGlyID0gVHJ1ZQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBjcmVhdGVEaXI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5ta2RpcihwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBkaWUoIkNvdWxkbid0IGNyZWF0ZSBkaXJlY3RvcnkiLCBwLCBlLnN0cmVycm9yKQorCisgICAgICAgIHByb2cgPSBbJ2dpdC1jYXQtZmlsZScsICdibG9iJywgc2hhXQorICAgICAgICBpZiBzdGF0LlNfSVNSRUcobW9kZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBpZiBtb2RlICYgMDEwMDoKKyAgICAgICAgICAgICAgICBtb2RlID0gMDc3NworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb2RlID0gMDY2NgorICAgICAgICAgICAgZmQgPSBvcy5vcGVuKHBhdGgsIG9zLk9fV1JPTkxZIHwgb3MuT19UUlVOQyB8IG9zLk9fQ1JFQVQsIG1vZGUpCisgICAgICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3Blbihwcm9nLCBzdGRvdXQ9ZmQpCisgICAgICAgICAgICBwcm9jLndhaXQoKQorICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIGVsaWYgc3RhdC5TX0lTTE5LKG1vZGUpOgorICAgICAgICAgICAgbGlua1RhcmdldCA9IHJ1blByb2dyYW0ocHJvZykKKyAgICAgICAgICAgIG9zLnN5bWxpbmsobGlua1RhcmdldCwgcGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydChGYWxzZSkKKworICAgIGlmIHVwZGF0ZVdkIGFuZCB1cGRhdGVDYWNoZToKKyAgICAgICAgcnVuUHJvZ3JhbShbJ2dpdC11cGRhdGUtaW5kZXgnLCAnLS1hZGQnLCAnLS0nLCBwYXRoXSkKKyAgICBlbGlmIHVwZGF0ZUNhY2hlOgorICAgICAgICBydW5Qcm9ncmFtKFsnZ2l0LXVwZGF0ZS1pbmRleCcsICctLWFkZCcsICctLWNhY2hlaW5mbycsCisgICAgICAgICAgICAgICAgICAgICcwJW8nICUgbW9kZSwgc2hhLCBwYXRoXSkKKworZGVmIHNldEluZGV4U3RhZ2VzKHBhdGgsCisgICAgICAgICAgICAgICAgICAgb1NIQTEsIG9Nb2RlLAorICAgICAgICAgICAgICAgICAgIGFTSEExLCBhTW9kZSwKKyAgICAgICAgICAgICAgICAgICBiU0hBMSwgYk1vZGUsCisgICAgICAgICAgICAgICAgICAgY2xlYXI9VHJ1ZSk6CisgICAgaXN0cmluZyA9IFtdCisgICAgaWYgY2xlYXI6CisgICAgICAgIGlzdHJpbmcuYXBwZW5kKCIwICIgKyAoIjAiICogNDApICsgIlx0IiArIHBhdGggKyAiXDAiKQorICAgIGlmIG9Nb2RlOgorICAgICAgICBpc3RyaW5nLmFwcGVuZCgiJW8gJXMgJWRcdCVzXDAiICUgKG9Nb2RlLCBvU0hBMSwgMSwgcGF0aCkpCisgICAgaWYgYU1vZGU6CisgICAgICAgIGlzdHJpbmcuYXBwZW5kKCIlbyAlcyAlZFx0JXNcMCIgJSAoYU1vZGUsIGFTSEExLCAyLCBwYXRoKSkKKyAgICBpZiBiTW9kZToKKyAgICAgICAgaXN0cmluZy5hcHBlbmQoIiVvICVzICVkXHQlc1wwIiAlIChiTW9kZSwgYlNIQTEsIDMsIHBhdGgpKQorCisgICAgcnVuUHJvZ3JhbShbJ2dpdC11cGRhdGUtaW5kZXgnLCAnLXonLCAnLS1pbmRleC1pbmZvJ10sCisgICAgICAgICAgICAgICBpbnB1dD0iIi5qb2luKGlzdHJpbmcpKQorCitkZWYgcmVtb3ZlRmlsZShjbGVhbiwgcGF0aCk6CisgICAgdXBkYXRlQ2FjaGUgPSBjYWNoZU9ubHkgb3IgY2xlYW4KKyAgICB1cGRhdGVXZCA9IG5vdCBjYWNoZU9ubHkKKworICAgIGlmIHVwZGF0ZUNhY2hlOgorICAgICAgICBydW5Qcm9ncmFtKFsnZ2l0LXVwZGF0ZS1pbmRleCcsICctLWZvcmNlLXJlbW92ZScsICctLScsIHBhdGhdKQorCisgICAgaWYgdXBkYXRlV2Q6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UIGFuZCBlLmVycm5vICE9IGVycm5vLkVJU0RJUjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmVkaXJzKG9zLnBhdGguZGlybmFtZShwYXRoKSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKK2RlZiB1bmlxdWVQYXRoKHBhdGgsIGJyYW5jaCk6CisgICAgZGVmIGZpbGVFeGlzdHMocGF0aCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmxzdGF0KHBhdGgpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgYnJhbmNoID0gYnJhbmNoLnJlcGxhY2UoJy8nLCAnXycpCisgICAgbmV3UGF0aCA9IHBhdGggKyAnficgKyBicmFuY2gKKyAgICBzdWZmaXggPSAwCisgICAgd2hpbGUgbmV3UGF0aCBpbiBjdXJyZW50RmlsZVNldCBvciBcCisgICAgICAgICAgbmV3UGF0aCBpbiBjdXJyZW50RGlyZWN0b3J5U2V0ICBvciBcCisgICAgICAgICAgZmlsZUV4aXN0cyhuZXdQYXRoKToKKyAgICAgICAgc3VmZml4ICs9IDEKKyAgICAgICAgbmV3UGF0aCA9IHBhdGggKyAnficgKyBicmFuY2ggKyAnXycgKyBzdHIoc3VmZml4KQorICAgIGN1cnJlbnRGaWxlU2V0LmFkZChuZXdQYXRoKQorICAgIHJldHVybiBuZXdQYXRoCisKKyMgQ2FjaGUgZW50cnkgbWFuYWdlbWVudAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIENhY2hlRW50cnk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICBjbGFzcyBTdGFnZToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNoYTEgPSBOb25lCisgICAgICAgICAgICAgICAgc2VsZi5tb2RlID0gTm9uZQorCisgICAgICAgICAgICAjIFVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm1vZGUgIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbSA9ICcwJW8nICUgc2VsZi5tb2RlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbSA9ICdOb25lJworCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zaGExOgorICAgICAgICAgICAgICAgICAgICBzaGExID0gc2VsZi5zaGExCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2hhMSA9ICdOb25lJworICAgICAgICAgICAgICAgIHJldHVybiAnc2hhMTogJyArIHNoYTEgKyAnIG1vZGU6ICcgKyBtCisgICAgICAgIAorICAgICAgICBzZWxmLnN0YWdlcyA9IFtTdGFnZSgpLCBTdGFnZSgpLCBTdGFnZSgpLCBTdGFnZSgpXQorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYucHJvY2Vzc2VkID0gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ3BhdGg6ICcgKyBzZWxmLnBhdGggKyAnIHN0YWdlczogJyArIHJlcHIoW3N0cih4KSBmb3IgeCBpbiBzZWxmLnN0YWdlc10pCisKK2NsYXNzIENhY2hlRW50cnlDb250YWluZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmVudHJpZXMgPSB7fQorCisgICAgZGVmIGFkZChzZWxmLCBlbnRyeSk6CisgICAgICAgIHNlbGYuZW50cmllc1tlbnRyeS5wYXRoXSA9IGVudHJ5CisKKyAgICBkZWYgZ2V0KHNlbGYsIHBhdGgpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnRyaWVzLmdldChwYXRoKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnRyaWVzLml0ZXJ2YWx1ZXMoKQorICAgIAordW5tZXJnZWRSRSA9IHJlLmNvbXBpbGUocideKFswLTddKykgKFswLTlhLWZdezQwfSkgKFsxLTNdKVx0KC4qKSQnLCByZS5TKQorZGVmIHVubWVyZ2VkQ2FjaGVFbnRyaWVzKCk6CisgICAgJycnQ3JlYXRlIGEgZGljdGlvbmFyeSBtYXBwaW5nIGZpbGUgbmFtZXMgdG8gQ2FjaGVFbnRyeQorICAgIG9iamVjdHMuIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5zIG9uZSBlbnRyeSBmb3IgZXZlcnkgcGF0aCB3aXRoIGEKKyAgICBub24temVybyBzdGFnZSBlbnRyeS4nJycKKworICAgIGxpbmVzID0gcnVuUHJvZ3JhbShbJ2dpdC1scy1maWxlcycsICcteicsICctLXVubWVyZ2VkJ10pLnNwbGl0KCdcMCcpCisgICAgbGluZXMucG9wKCkKKworICAgIHJlcyA9IENhY2hlRW50cnlDb250YWluZXIoKQorICAgIGZvciBsIGluIGxpbmVzOgorICAgICAgICBtID0gdW5tZXJnZWRSRS5tYXRjaChsKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgbW9kZSA9IGludChtLmdyb3VwKDEpLCA4KQorICAgICAgICAgICAgc2hhMSA9IG0uZ3JvdXAoMikKKyAgICAgICAgICAgIHN0YWdlID0gaW50KG0uZ3JvdXAoMykpCisgICAgICAgICAgICBwYXRoID0gbS5ncm91cCg0KQorCisgICAgICAgICAgICBlID0gcmVzLmdldChwYXRoKQorICAgICAgICAgICAgaWYgbm90IGU6CisgICAgICAgICAgICAgICAgZSA9IENhY2hlRW50cnkocGF0aCkKKyAgICAgICAgICAgICAgICByZXMuYWRkKGUpCisKKyAgICAgICAgICAgIGUuc3RhZ2VzW3N0YWdlXS5tb2RlID0gbW9kZQorICAgICAgICAgICAgZS5zdGFnZXNbc3RhZ2VdLnNoYTEgPSBzaGExCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaWUoJ0Vycm9yOiBNZXJnZSBwcm9ncmFtIGZhaWxlZDogVW5leHBlY3RlZCBvdXRwdXQgZnJvbScsCisgICAgICAgICAgICAgICAgJ2dpdC1scy1maWxlczonLCBsKQorICAgIHJldHVybiByZXMKKworbHNUcmVlUkUgPSByZS5jb21waWxlKHInXihbMC03XSspIChcUyspIChbMC05YS1mXXs0MH0pXHQoLiopXG4kJywgcmUuUykKK2RlZiBnZXRDYWNoZUVudHJ5KHBhdGgsIG9yaWdUcmVlLCBhVHJlZSwgYlRyZWUpOgorICAgICcnJ1JldHVybnMgYSBDYWNoZUVudHJ5IG9iamVjdCB3aGljaCBkb2Vzbid0IGhhdmUgdG8gY29ycmVzcG9uZCB0bworICAgIGEgcmVhbCBjYWNoZSBlbnRyeSBpbiBHaXQncyBpbmRleC4nJycKKyAgICAKKyAgICBkZWYgcGFyc2Uob3V0KToKKyAgICAgICAgaWYgb3V0ID09ICcnOgorICAgICAgICAgICAgcmV0dXJuIFtOb25lLCBOb25lXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbSA9IGxzVHJlZVJFLm1hdGNoKG91dCkKKyAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgIGRpZSgnVW5leHBlY3RlZCBvdXRwdXQgZnJvbSBnaXQtbHMtdHJlZTonLCBvdXQpCisgICAgICAgICAgICBlbGlmIG0uZ3JvdXAoMikgPT0gJ2Jsb2InOgorICAgICAgICAgICAgICAgIHJldHVybiBbbS5ncm91cCgzKSwgaW50KG0uZ3JvdXAoMSksIDgpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gW05vbmUsIE5vbmVdCisKKyAgICByZXMgPSBDYWNoZUVudHJ5KHBhdGgpCisKKyAgICBbb1NoYSwgb01vZGVdID0gcGFyc2UocnVuUHJvZ3JhbShbJ2dpdC1scy10cmVlJywgb3JpZ1RyZWUsICctLScsIHBhdGhdKSkKKyAgICBbYVNoYSwgYU1vZGVdID0gcGFyc2UocnVuUHJvZ3JhbShbJ2dpdC1scy10cmVlJywgYVRyZWUsICctLScsIHBhdGhdKSkKKyAgICBbYlNoYSwgYk1vZGVdID0gcGFyc2UocnVuUHJvZ3JhbShbJ2dpdC1scy10cmVlJywgYlRyZWUsICctLScsIHBhdGhdKSkKKworICAgIHJlcy5zdGFnZXNbMV0uc2hhMSA9IG9TaGEKKyAgICByZXMuc3RhZ2VzWzFdLm1vZGUgPSBvTW9kZQorICAgIHJlcy5zdGFnZXNbMl0uc2hhMSA9IGFTaGEKKyAgICByZXMuc3RhZ2VzWzJdLm1vZGUgPSBhTW9kZQorICAgIHJlcy5zdGFnZXNbM10uc2hhMSA9IGJTaGEKKyAgICByZXMuc3RhZ2VzWzNdLm1vZGUgPSBiTW9kZQorCisgICAgcmV0dXJuIHJlcworCisjIFJlbmFtZSBkZXRlY3Rpb24gYW5kIGhhbmRsaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFJlbmFtZUVudHJ5OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzcmMsIHNyY1NoYSwgc3JjTW9kZSwgc3JjQ2FjaGVFbnRyeSwKKyAgICAgICAgICAgICAgICAgZHN0LCBkc3RTaGEsIGRzdE1vZGUsIGRzdENhY2hlRW50cnksCisgICAgICAgICAgICAgICAgIHNjb3JlKToKKyAgICAgICAgc2VsZi5zcmNOYW1lID0gc3JjCisgICAgICAgIHNlbGYuc3JjU2hhID0gc3JjU2hhCisgICAgICAgIHNlbGYuc3JjTW9kZSA9IHNyY01vZGUKKyAgICAgICAgc2VsZi5zcmNDYWNoZUVudHJ5ID0gc3JjQ2FjaGVFbnRyeQorICAgICAgICBzZWxmLmRzdE5hbWUgPSBkc3QKKyAgICAgICAgc2VsZi5kc3RTaGEgPSBkc3RTaGEKKyAgICAgICAgc2VsZi5kc3RNb2RlID0gZHN0TW9kZQorICAgICAgICBzZWxmLmRzdENhY2hlRW50cnkgPSBkc3RDYWNoZUVudHJ5CisgICAgICAgIHNlbGYuc2NvcmUgPSBzY29yZQorCisgICAgICAgIHNlbGYucHJvY2Vzc2VkID0gRmFsc2UKKworY2xhc3MgUmVuYW1lRW50cnlDb250YWluZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmVudHJpZXNTcmMgPSB7fQorICAgICAgICBzZWxmLmVudHJpZXNEc3QgPSB7fQorCisgICAgZGVmIGFkZChzZWxmLCBlbnRyeSk6CisgICAgICAgIHNlbGYuZW50cmllc1NyY1tlbnRyeS5zcmNOYW1lXSA9IGVudHJ5CisgICAgICAgIHNlbGYuZW50cmllc0RzdFtlbnRyeS5kc3ROYW1lXSA9IGVudHJ5CisKKyAgICBkZWYgZ2V0U3JjKHNlbGYsIHBhdGgpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnRyaWVzU3JjLmdldChwYXRoKQorCisgICAgZGVmIGdldERzdChzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZW50cmllc0RzdC5nZXQocGF0aCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZW50cmllc1NyYy5pdGVydmFsdWVzKCkKKworcGFyc2VEaWZmUmVuYW1lc1JFID0gcmUuY29tcGlsZSgnXjooWzAtN10rKSAoWzAtN10rKSAoWzAtOWEtZl17NDB9KSAoWzAtOWEtZl17NDB9KSBSKFswLTldKikkJykKK2RlZiBnZXRSZW5hbWVzKHRyZWUsIG9UcmVlLCBhVHJlZSwgYlRyZWUsIGNhY2hlRW50cmllcyk6CisgICAgJycnR2V0IGluZm9ybWF0aW9uIG9mIGFsbCByZW5hbWVzIHdoaWNoIG9jY3VyZWQgYmV0d2VlbiAnb1RyZWUnIGFuZAorICAgICd0cmVlJy4gV2UgbmVlZCB0aGUgdGhyZWUgdHJlZXMgaW4gdGhlIG1lcmdlICgnb1RyZWUnLCAnYVRyZWUnIGFuZAorICAgICdiVHJlZScpIHRvIGJlIGFibGUgdG8gYXNzb2NpYXRlIHRoZSBjb3JyZWN0IGNhY2hlIGVudHJpZXMgd2l0aAorICAgIHRoZSByZW5hbWUgaW5mb3JtYXRpb24uICd0cmVlJyBpcyBhbHdheXMgZXF1YWwgdG8gZWl0aGVyIGFUcmVlIG9yIGJUcmVlLicnJworCisgICAgYXNzZXJ0KHRyZWUgPT0gYVRyZWUgb3IgdHJlZSA9PSBiVHJlZSkKKyAgICBpbnAgPSBydW5Qcm9ncmFtKFsnZ2l0LWRpZmYtdHJlZScsICctTScsICctLWRpZmYtZmlsdGVyPVInLCAnLXInLAorICAgICAgICAgICAgICAgICAgICAgICcteicsIG9UcmVlLCB0cmVlXSkKKworICAgIHJldCA9IFJlbmFtZUVudHJ5Q29udGFpbmVyKCkKKyAgICB0cnk6CisgICAgICAgIHJlY3MgPSBpbnAuc3BsaXQoIlwwIikKKyAgICAgICAgcmVjcy5wb3AoKSAjIHJlbW92ZSBsYXN0IGVudHJ5ICh3aGljaCBpcyAnJykKKyAgICAgICAgaXQgPSByZWNzLl9faXRlcl9fKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHJlYyA9IGl0Lm5leHQoKQorICAgICAgICAgICAgbSA9IHBhcnNlRGlmZlJlbmFtZXNSRS5tYXRjaChyZWMpCisKKyAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgIGRpZSgnVW5leHBlY3RlZCBvdXRwdXQgZnJvbSBnaXQtZGlmZi10cmVlOicsIHJlYykKKworICAgICAgICAgICAgc3JjTW9kZSA9IGludChtLmdyb3VwKDEpLCA4KQorICAgICAgICAgICAgZHN0TW9kZSA9IGludChtLmdyb3VwKDIpLCA4KQorICAgICAgICAgICAgc3JjU2hhID0gbS5ncm91cCgzKQorICAgICAgICAgICAgZHN0U2hhID0gbS5ncm91cCg0KQorICAgICAgICAgICAgc2NvcmUgPSBtLmdyb3VwKDUpCisgICAgICAgICAgICBzcmMgPSBpdC5uZXh0KCkKKyAgICAgICAgICAgIGRzdCA9IGl0Lm5leHQoKQorCisgICAgICAgICAgICBzcmNDYWNoZUVudHJ5ID0gY2FjaGVFbnRyaWVzLmdldChzcmMpCisgICAgICAgICAgICBpZiBub3Qgc3JjQ2FjaGVFbnRyeToKKyAgICAgICAgICAgICAgICBzcmNDYWNoZUVudHJ5ID0gZ2V0Q2FjaGVFbnRyeShzcmMsIG9UcmVlLCBhVHJlZSwgYlRyZWUpCisgICAgICAgICAgICAgICAgY2FjaGVFbnRyaWVzLmFkZChzcmNDYWNoZUVudHJ5KQorCisgICAgICAgICAgICBkc3RDYWNoZUVudHJ5ID0gY2FjaGVFbnRyaWVzLmdldChkc3QpCisgICAgICAgICAgICBpZiBub3QgZHN0Q2FjaGVFbnRyeToKKyAgICAgICAgICAgICAgICBkc3RDYWNoZUVudHJ5ID0gZ2V0Q2FjaGVFbnRyeShkc3QsIG9UcmVlLCBhVHJlZSwgYlRyZWUpCisgICAgICAgICAgICAgICAgY2FjaGVFbnRyaWVzLmFkZChkc3RDYWNoZUVudHJ5KQorCisgICAgICAgICAgICByZXQuYWRkKFJlbmFtZUVudHJ5KHNyYywgc3JjU2hhLCBzcmNNb2RlLCBzcmNDYWNoZUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdFNoYSwgZHN0TW9kZSwgZHN0Q2FjaGVFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUpKQorICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHJldAorCitkZWYgZm10UmVuYW1lKHNyYywgZHN0KToKKyAgICBzcmNQYXRoID0gc3JjLnNwbGl0KCcvJykKKyAgICBkc3RQYXRoID0gZHN0LnNwbGl0KCcvJykKKyAgICBwYXRoID0gW10KKyAgICBlbmRJbmRleCA9IG1pbihsZW4oc3JjUGF0aCksIGxlbihkc3RQYXRoKSkgLSAxCisgICAgZm9yIHggaW4gcmFuZ2UoMCwgZW5kSW5kZXgpOgorICAgICAgICBpZiBzcmNQYXRoW3hdID09IGRzdFBhdGhbeF06CisgICAgICAgICAgICBwYXRoLmFwcGVuZChzcmNQYXRoW3hdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5kSW5kZXggPSB4CisgICAgICAgICAgICBicmVhaworCisgICAgaWYgbGVuKHBhdGgpID4gMDoKKyAgICAgICAgcmV0dXJuICcvJy5qb2luKHBhdGgpICsgXAorICAgICAgICAgICAgICAgJy97JyArICcvJy5qb2luKHNyY1BhdGhbZW5kSW5kZXg6XSkgKyAnID0+ICcgKyBcCisgICAgICAgICAgICAgICAnLycuam9pbihkc3RQYXRoW2VuZEluZGV4Ol0pICsgJ30nCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHNyYyArICcgPT4gJyArIGRzdAorCitkZWYgcHJvY2Vzc1JlbmFtZXMocmVuYW1lc0EsIHJlbmFtZXNCLCBicmFuY2hOYW1lQSwgYnJhbmNoTmFtZUIpOgorICAgIHNyY05hbWVzID0gU2V0KCkKKyAgICBmb3IgeCBpbiByZW5hbWVzQToKKyAgICAgICAgc3JjTmFtZXMuYWRkKHguc3JjTmFtZSkKKyAgICBmb3IgeCBpbiByZW5hbWVzQjoKKyAgICAgICAgc3JjTmFtZXMuYWRkKHguc3JjTmFtZSkKKworICAgIGNsZWFuTWVyZ2UgPSBUcnVlCisgICAgZm9yIHBhdGggaW4gc3JjTmFtZXM6CisgICAgICAgIGlmIHJlbmFtZXNBLmdldFNyYyhwYXRoKToKKyAgICAgICAgICAgIHJlbmFtZXMxID0gcmVuYW1lc0EKKyAgICAgICAgICAgIHJlbmFtZXMyID0gcmVuYW1lc0IKKyAgICAgICAgICAgIGJyYW5jaE5hbWUxID0gYnJhbmNoTmFtZUEKKyAgICAgICAgICAgIGJyYW5jaE5hbWUyID0gYnJhbmNoTmFtZUIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlbmFtZXMxID0gcmVuYW1lc0IKKyAgICAgICAgICAgIHJlbmFtZXMyID0gcmVuYW1lc0EKKyAgICAgICAgICAgIGJyYW5jaE5hbWUxID0gYnJhbmNoTmFtZUIKKyAgICAgICAgICAgIGJyYW5jaE5hbWUyID0gYnJhbmNoTmFtZUEKKyAgICAgICAgCisgICAgICAgIHJlbjEgPSByZW5hbWVzMS5nZXRTcmMocGF0aCkKKyAgICAgICAgcmVuMiA9IHJlbmFtZXMyLmdldFNyYyhwYXRoKQorCisgICAgICAgIHJlbjEuZHN0Q2FjaGVFbnRyeS5wcm9jZXNzZWQgPSBUcnVlCisgICAgICAgIHJlbjEuc3JjQ2FjaGVFbnRyeS5wcm9jZXNzZWQgPSBUcnVlCisKKyAgICAgICAgaWYgcmVuMS5wcm9jZXNzZWQ6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHJlbjEucHJvY2Vzc2VkID0gVHJ1ZQorCisgICAgICAgIGlmIHJlbjI6CisgICAgICAgICAgICAjIFJlbmFtZWQgaW4gMSBhbmQgcmVuYW1lZCBpbiAyCisgICAgICAgICAgICBhc3NlcnQocmVuMS5zcmNOYW1lID09IHJlbjIuc3JjTmFtZSkKKyAgICAgICAgICAgIHJlbjIuZHN0Q2FjaGVFbnRyeS5wcm9jZXNzZWQgPSBUcnVlCisgICAgICAgICAgICByZW4yLnByb2Nlc3NlZCA9IFRydWUKKworICAgICAgICAgICAgaWYgcmVuMS5kc3ROYW1lICE9IHJlbjIuZHN0TmFtZToKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChyZW5hbWUvcmVuYW1lKTogUmVuYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgZm10UmVuYW1lKHBhdGgsIHJlbjEuZHN0TmFtZSksICdpbiBicmFuY2gnLCBicmFuY2hOYW1lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmFtZScsIGZtdFJlbmFtZShwYXRoLCByZW4yLmRzdE5hbWUpLCAnaW4nLAorICAgICAgICAgICAgICAgICAgICAgICBicmFuY2hOYW1lMikKKyAgICAgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKworICAgICAgICAgICAgICAgIGlmIHJlbjEuZHN0TmFtZSBpbiBjdXJyZW50RGlyZWN0b3J5U2V0OgorICAgICAgICAgICAgICAgICAgICBkc3ROYW1lMSA9IHVuaXF1ZVBhdGgocmVuMS5kc3ROYW1lLCBicmFuY2hOYW1lMSkKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KHJlbjEuZHN0TmFtZSwgJ2lzIGEgZGlyZWN0b3J5IGluJywgYnJhbmNoTmFtZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkaW5nIGFzJywgZHN0TmFtZTEsICdpbnN0ZWFkLicpCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUZpbGUoRmFsc2UsIHJlbjEuZHN0TmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkc3ROYW1lMSA9IHJlbjEuZHN0TmFtZQorCisgICAgICAgICAgICAgICAgaWYgcmVuMi5kc3ROYW1lIGluIGN1cnJlbnREaXJlY3RvcnlTZXQ6CisgICAgICAgICAgICAgICAgICAgIGRzdE5hbWUyID0gdW5pcXVlUGF0aChyZW4yLmRzdE5hbWUsIGJyYW5jaE5hbWUyKQorICAgICAgICAgICAgICAgICAgICBvdXRwdXQocmVuMi5kc3ROYW1lLCAnaXMgYSBkaXJlY3RvcnkgaW4nLCBicmFuY2hOYW1lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRpbmcgYXMnLCBkc3ROYW1lMiwgJ2luc3RlYWQuJykKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRmlsZShGYWxzZSwgcmVuMi5kc3ROYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRzdE5hbWUyID0gcmVuMi5kc3ROYW1lCisgICAgICAgICAgICAgICAgc2V0SW5kZXhTdGFnZXMoZHN0TmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW4xLmRzdFNoYSwgcmVuMS5kc3RNb2RlLAorCQkJICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgICAgICAgICAgc2V0SW5kZXhTdGFnZXMoZHN0TmFtZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbjIuZHN0U2hhLCByZW4yLmRzdE1vZGUpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVtb3ZlRmlsZShUcnVlLCByZW4xLnNyY05hbWUpCisKKyAgICAgICAgICAgICAgICBbcmVzU2hhLCByZXNNb2RlLCBjbGVhbiwgbWVyZ2VdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlRmlsZShyZW4xLnNyY05hbWUsIHJlbjEuc3JjU2hhLCByZW4xLnNyY01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbjEuZHN0TmFtZSwgcmVuMS5kc3RTaGEsIHJlbjEuZHN0TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuMi5kc3ROYW1lLCByZW4yLmRzdFNoYSwgcmVuMi5kc3RNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2hOYW1lMSwgYnJhbmNoTmFtZTIpCisKKyAgICAgICAgICAgICAgICBpZiBtZXJnZSBvciBub3QgY2xlYW46CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCgnUmVuYW1pbmcnLCBmbXRSZW5hbWUocGF0aCwgcmVuMS5kc3ROYW1lKSkKKworICAgICAgICAgICAgICAgIGlmIG1lcmdlOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQoJ0F1dG8tbWVyZ2luZycsIHJlbjEuZHN0TmFtZSkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBjbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAoY29udGVudCk6IG1lcmdlIGNvbmZsaWN0IGluJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbjEuZHN0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNhY2hlT25seToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEluZGV4U3RhZ2VzKHJlbjEuZHN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbjEuc3JjU2hhLCByZW4xLnNyY01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW4xLmRzdFNoYSwgcmVuMS5kc3RNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuMi5kc3RTaGEsIHJlbjIuZHN0TW9kZSkKKworICAgICAgICAgICAgICAgIHVwZGF0ZUZpbGUoY2xlYW4sIHJlc1NoYSwgcmVzTW9kZSwgcmVuMS5kc3ROYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVtb3ZlRmlsZShUcnVlLCByZW4xLnNyY05hbWUpCisKKyAgICAgICAgICAgICMgUmVuYW1lZCBpbiAxLCBtYXliZSBjaGFuZ2VkIGluIDIKKyAgICAgICAgICAgIGlmIHJlbmFtZXNBID09IHJlbmFtZXMxOgorICAgICAgICAgICAgICAgIHN0YWdlID0gMworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFnZSA9IDIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNyY1NoYU90aGVyQnJhbmNoICA9IHJlbjEuc3JjQ2FjaGVFbnRyeS5zdGFnZXNbc3RhZ2VdLnNoYTEKKyAgICAgICAgICAgIHNyY01vZGVPdGhlckJyYW5jaCA9IHJlbjEuc3JjQ2FjaGVFbnRyeS5zdGFnZXNbc3RhZ2VdLm1vZGUKKworICAgICAgICAgICAgZHN0U2hhT3RoZXJCcmFuY2ggID0gcmVuMS5kc3RDYWNoZUVudHJ5LnN0YWdlc1tzdGFnZV0uc2hhMQorICAgICAgICAgICAgZHN0TW9kZU90aGVyQnJhbmNoID0gcmVuMS5kc3RDYWNoZUVudHJ5LnN0YWdlc1tzdGFnZV0ubW9kZQorCisgICAgICAgICAgICB0cnlNZXJnZSA9IEZhbHNlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHJlbjEuZHN0TmFtZSBpbiBjdXJyZW50RGlyZWN0b3J5U2V0OgorICAgICAgICAgICAgICAgIG5ld1BhdGggPSB1bmlxdWVQYXRoKHJlbjEuZHN0TmFtZSwgYnJhbmNoTmFtZTEpCisgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAocmVuYW1lL2RpcmVjdG9yeSk6IFJlbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgIGZtdFJlbmFtZShyZW4xLnNyY05hbWUsIHJlbjEuZHN0TmFtZSksICdpbicsIGJyYW5jaE5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0b3J5JywgcmVuMS5kc3ROYW1lLCAnYWRkZWQgaW4nLCBicmFuY2hOYW1lMikKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ1JlbmFtaW5nJywgcmVuMS5zcmNOYW1lLCAndG8nLCBuZXdQYXRoLCAnaW5zdGVhZCcpCisgICAgICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgcmVtb3ZlRmlsZShGYWxzZSwgcmVuMS5kc3ROYW1lKQorICAgICAgICAgICAgICAgIHVwZGF0ZUZpbGUoRmFsc2UsIHJlbjEuZHN0U2hhLCByZW4xLmRzdE1vZGUsIG5ld1BhdGgpCisgICAgICAgICAgICBlbGlmIHNyY1NoYU90aGVyQnJhbmNoID09IE5vbmU6CisgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAocmVuYW1lL2RlbGV0ZSk6IFJlbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgIGZtdFJlbmFtZShyZW4xLnNyY05hbWUsIHJlbjEuZHN0TmFtZSksICdpbicsCisgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaE5hbWUxLCAnYW5kIGRlbGV0ZWQgaW4nLCBicmFuY2hOYW1lMikKKyAgICAgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCByZW4xLmRzdFNoYSwgcmVuMS5kc3RNb2RlLCByZW4xLmRzdE5hbWUpCisgICAgICAgICAgICBlbGlmIGRzdFNoYU90aGVyQnJhbmNoOgorICAgICAgICAgICAgICAgIG5ld1BhdGggPSB1bmlxdWVQYXRoKHJlbjEuZHN0TmFtZSwgYnJhbmNoTmFtZTIpCisgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAocmVuYW1lL2FkZCk6IFJlbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgIGZtdFJlbmFtZShyZW4xLnNyY05hbWUsIHJlbjEuZHN0TmFtZSksICdpbicsCisgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaE5hbWUxICsgJy4nLCByZW4xLmRzdE5hbWUsICdhZGRlZCBpbicsIGJyYW5jaE5hbWUyKQorICAgICAgICAgICAgICAgIG91dHB1dCgnQWRkaW5nIGFzJywgbmV3UGF0aCwgJ2luc3RlYWQnKQorICAgICAgICAgICAgICAgIHVwZGF0ZUZpbGUoRmFsc2UsIGRzdFNoYU90aGVyQnJhbmNoLCBkc3RNb2RlT3RoZXJCcmFuY2gsIG5ld1BhdGgpCisgICAgICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgdHJ5TWVyZ2UgPSBUcnVlCisgICAgICAgICAgICBlbGlmIHJlbmFtZXMyLmdldERzdChyZW4xLmRzdE5hbWUpOgorICAgICAgICAgICAgICAgIGRzdDIgPSByZW5hbWVzMi5nZXREc3QocmVuMS5kc3ROYW1lKQorICAgICAgICAgICAgICAgIG5ld1BhdGgxID0gdW5pcXVlUGF0aChyZW4xLmRzdE5hbWUsIGJyYW5jaE5hbWUxKQorICAgICAgICAgICAgICAgIG5ld1BhdGgyID0gdW5pcXVlUGF0aChkc3QyLmRzdE5hbWUsIGJyYW5jaE5hbWUyKQorICAgICAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1QgKHJlbmFtZS9yZW5hbWUpOiBSZW5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICBmbXRSZW5hbWUocmVuMS5zcmNOYW1lLCByZW4xLmRzdE5hbWUpLCAnaW4nLAorICAgICAgICAgICAgICAgICAgICAgICBicmFuY2hOYW1lMSsnLiBSZW5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICBmbXRSZW5hbWUoZHN0Mi5zcmNOYW1lLCBkc3QyLmRzdE5hbWUpLCAnaW4nLCBicmFuY2hOYW1lMikKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ1JlbmFtaW5nJywgcmVuMS5zcmNOYW1lLCAndG8nLCBuZXdQYXRoMSwgJ2FuZCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRzdDIuc3JjTmFtZSwgJ3RvJywgbmV3UGF0aDIsICdpbnN0ZWFkJykKKyAgICAgICAgICAgICAgICByZW1vdmVGaWxlKEZhbHNlLCByZW4xLmRzdE5hbWUpCisgICAgICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgcmVuMS5kc3RTaGEsIHJlbjEuZHN0TW9kZSwgbmV3UGF0aDEpCisgICAgICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgZHN0Mi5kc3RTaGEsIGRzdDIuZHN0TW9kZSwgbmV3UGF0aDIpCisgICAgICAgICAgICAgICAgZHN0Mi5wcm9jZXNzZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeU1lcmdlID0gVHJ1ZQorCisgICAgICAgICAgICBpZiB0cnlNZXJnZToKKworICAgICAgICAgICAgICAgIG9OYW1lLCBvU0hBMSwgb01vZGUgPSByZW4xLnNyY05hbWUsIHJlbjEuc3JjU2hhLCByZW4xLnNyY01vZGUKKyAgICAgICAgICAgICAgICBhTmFtZSwgYk5hbWUgPSByZW4xLmRzdE5hbWUsIHJlbjEuc3JjTmFtZQorICAgICAgICAgICAgICAgIGFTSEExLCBiU0hBMSA9IHJlbjEuZHN0U2hhLCBzcmNTaGFPdGhlckJyYW5jaAorICAgICAgICAgICAgICAgIGFNb2RlLCBiTW9kZSA9IHJlbjEuZHN0TW9kZSwgc3JjTW9kZU90aGVyQnJhbmNoCisgICAgICAgICAgICAgICAgYUJyYW5jaCwgYkJyYW5jaCA9IGJyYW5jaE5hbWUxLCBicmFuY2hOYW1lMgorCisgICAgICAgICAgICAgICAgaWYgcmVuYW1lc0EgIT0gcmVuYW1lczE6CisgICAgICAgICAgICAgICAgICAgIGFOYW1lLCBiTmFtZSA9IGJOYW1lLCBhTmFtZQorICAgICAgICAgICAgICAgICAgICBhU0hBMSwgYlNIQTEgPSBiU0hBMSwgYVNIQTEKKyAgICAgICAgICAgICAgICAgICAgYU1vZGUsIGJNb2RlID0gYk1vZGUsIGFNb2RlCisgICAgICAgICAgICAgICAgICAgIGFCcmFuY2gsIGJCcmFuY2ggPSBiQnJhbmNoLCBhQnJhbmNoCisKKyAgICAgICAgICAgICAgICBbcmVzU2hhLCByZXNNb2RlLCBjbGVhbiwgbWVyZ2VdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlRmlsZShvTmFtZSwgb1NIQTEsIG9Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTmFtZSwgYVNIQTEsIGFNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmFtZSwgYlNIQTEsIGJNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQnJhbmNoLCBiQnJhbmNoKTsKKworICAgICAgICAgICAgICAgIGlmIG1lcmdlIG9yIG5vdCBjbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCdSZW5hbWluZycsIGZtdFJlbmFtZShyZW4xLnNyY05hbWUsIHJlbjEuZHN0TmFtZSkpCisKKyAgICAgICAgICAgICAgICBpZiBtZXJnZToKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCdBdXRvLW1lcmdpbmcnLCByZW4xLmRzdE5hbWUpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xlYW46CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1QgKHJlbmFtZS9tb2RpZnkpOiBNZXJnZSBjb25mbGljdCBpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZW4xLmRzdE5hbWUpCisgICAgICAgICAgICAgICAgICAgIGNsZWFuTWVyZ2UgPSBGYWxzZQorCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjYWNoZU9ubHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbmRleFN0YWdlcyhyZW4xLmRzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvU0hBMSwgb01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU0hBMSwgYU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU0hBMSwgYk1vZGUpCisKKyAgICAgICAgICAgICAgICB1cGRhdGVGaWxlKGNsZWFuLCByZXNTaGEsIHJlc01vZGUsIHJlbjEuZHN0TmFtZSkKKworICAgIHJldHVybiBjbGVhbk1lcmdlCisKKyMgUGVyIGVudHJ5IG1lcmdlIGZ1bmN0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgcHJvY2Vzc0VudHJ5KGVudHJ5LCBicmFuY2gxTmFtZSwgYnJhbmNoMk5hbWUpOgorICAgICcnJ01lcmdlIG9uZSBjYWNoZSBlbnRyeS4nJycKKworICAgIGRlYnVnKCdwcm9jZXNzaW5nJywgZW50cnkucGF0aCwgJ2NsZWFuIGNhY2hlOicsIGNhY2hlT25seSkKKworICAgIGNsZWFuTWVyZ2UgPSBUcnVlCisKKyAgICBwYXRoID0gZW50cnkucGF0aAorICAgIG9TaGEgPSBlbnRyeS5zdGFnZXNbMV0uc2hhMQorICAgIG9Nb2RlID0gZW50cnkuc3RhZ2VzWzFdLm1vZGUKKyAgICBhU2hhID0gZW50cnkuc3RhZ2VzWzJdLnNoYTEKKyAgICBhTW9kZSA9IGVudHJ5LnN0YWdlc1syXS5tb2RlCisgICAgYlNoYSA9IGVudHJ5LnN0YWdlc1szXS5zaGExCisgICAgYk1vZGUgPSBlbnRyeS5zdGFnZXNbM10ubW9kZQorCisgICAgYXNzZXJ0KG9TaGEgPT0gTm9uZSBvciBpc1NoYShvU2hhKSkKKyAgICBhc3NlcnQoYVNoYSA9PSBOb25lIG9yIGlzU2hhKGFTaGEpKQorICAgIGFzc2VydChiU2hhID09IE5vbmUgb3IgaXNTaGEoYlNoYSkpCisKKyAgICBhc3NlcnQob01vZGUgPT0gTm9uZSBvciB0eXBlKG9Nb2RlKSBpcyBpbnQpCisgICAgYXNzZXJ0KGFNb2RlID09IE5vbmUgb3IgdHlwZShhTW9kZSkgaXMgaW50KQorICAgIGFzc2VydChiTW9kZSA9PSBOb25lIG9yIHR5cGUoYk1vZGUpIGlzIGludCkKKworICAgIGlmIChvU2hhIGFuZCAobm90IGFTaGEgb3Igbm90IGJTaGEpKToKKyAgICAjCisgICAgIyBDYXNlIEE6IERlbGV0ZWQgaW4gb25lCisgICAgIworICAgICAgICBpZiAobm90IGFTaGEgICAgIGFuZCBub3QgYlNoYSkgb3IgXAorICAgICAgICAgICAoYVNoYSA9PSBvU2hhIGFuZCBub3QgYlNoYSkgb3IgXAorICAgICAgICAgICAobm90IGFTaGEgICAgIGFuZCBiU2hhID09IG9TaGEpOgorICAgICMgRGVsZXRlZCBpbiBib3RoIG9yIGRlbGV0ZWQgaW4gb25lIGFuZCB1bmNoYW5nZWQgaW4gdGhlIG90aGVyCisgICAgICAgICAgICBpZiBhU2hhOgorICAgICAgICAgICAgICAgIG91dHB1dCgnUmVtb3ZpbmcnLCBwYXRoKQorICAgICAgICAgICAgcmVtb3ZlRmlsZShUcnVlLCBwYXRoKQorICAgICAgICBlbHNlOgorICAgICMgRGVsZXRlZCBpbiBvbmUgYW5kIGNoYW5nZWQgaW4gdGhlIG90aGVyCisgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgIGlmIG5vdCBhU2hhOgorICAgICAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1QgKGRlbGV0ZS9tb2RpZnkpOicsIHBhdGgsICdkZWxldGVkIGluJywKKyAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoMU5hbWUsICdhbmQgbW9kaWZpZWQgaW4nLCBicmFuY2gyTmFtZSArICcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcnNpb24nLCBicmFuY2gyTmFtZSwgJ29mJywgcGF0aCwgJ2xlZnQgaW4gdHJlZS4nKQorICAgICAgICAgICAgICAgIG1vZGUgPSBiTW9kZQorICAgICAgICAgICAgICAgIHNoYSA9IGJTaGEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAobW9kaWZ5L2RlbGV0ZSk6JywgcGF0aCwgJ2RlbGV0ZWQgaW4nLAorICAgICAgICAgICAgICAgICAgICAgICBicmFuY2gyTmFtZSwgJ2FuZCBtb2RpZmllZCBpbicsIGJyYW5jaDFOYW1lICsgJy4nLAorICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbicsIGJyYW5jaDFOYW1lLCAnb2YnLCBwYXRoLCAnbGVmdCBpbiB0cmVlLicpCisgICAgICAgICAgICAgICAgbW9kZSA9IGFNb2RlCisgICAgICAgICAgICAgICAgc2hhID0gYVNoYQorCisgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCBzaGEsIG1vZGUsIHBhdGgpCisKKyAgICBlbGlmIChub3Qgb1NoYSBhbmQgYVNoYSAgICAgYW5kIG5vdCBiU2hhKSBvciBcCisgICAgICAgICAobm90IG9TaGEgYW5kIG5vdCBhU2hhIGFuZCBiU2hhKToKKyAgICAjCisgICAgIyBDYXNlIEI6IEFkZGVkIGluIG9uZS4KKyAgICAjCisgICAgICAgIGlmIGFTaGE6CisgICAgICAgICAgICBhZGRCcmFuY2ggPSBicmFuY2gxTmFtZQorICAgICAgICAgICAgb3RoZXJCcmFuY2ggPSBicmFuY2gyTmFtZQorICAgICAgICAgICAgbW9kZSA9IGFNb2RlCisgICAgICAgICAgICBzaGEgPSBhU2hhCisgICAgICAgICAgICBjb25mID0gJ2ZpbGUvZGlyZWN0b3J5JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWRkQnJhbmNoID0gYnJhbmNoMk5hbWUKKyAgICAgICAgICAgIG90aGVyQnJhbmNoID0gYnJhbmNoMU5hbWUKKyAgICAgICAgICAgIG1vZGUgPSBiTW9kZQorICAgICAgICAgICAgc2hhID0gYlNoYQorICAgICAgICAgICAgY29uZiA9ICdkaXJlY3RvcnkvZmlsZScKKyAgICAKKyAgICAgICAgaWYgcGF0aCBpbiBjdXJyZW50RGlyZWN0b3J5U2V0OgorICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisgICAgICAgICAgICBuZXdQYXRoID0gdW5pcXVlUGF0aChwYXRoLCBhZGRCcmFuY2gpCisgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUICgnICsgY29uZiArICcpOicsCisgICAgICAgICAgICAgICAgICAgJ1RoZXJlIGlzIGEgZGlyZWN0b3J5IHdpdGggbmFtZScsIHBhdGgsICdpbicsCisgICAgICAgICAgICAgICAgICAgb3RoZXJCcmFuY2ggKyAnLiBBZGRpbmcnLCBwYXRoLCAnYXMnLCBuZXdQYXRoKQorCisgICAgICAgICAgICByZW1vdmVGaWxlKEZhbHNlLCBwYXRoKQorICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgc2hhLCBtb2RlLCBuZXdQYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0cHV0KCdBZGRpbmcnLCBwYXRoKQorICAgICAgICAgICAgdXBkYXRlRmlsZShUcnVlLCBzaGEsIG1vZGUsIHBhdGgpCisgICAgCisgICAgZWxpZiBub3Qgb1NoYSBhbmQgYVNoYSBhbmQgYlNoYToKKyAgICAjCisgICAgIyBDYXNlIEM6IEFkZGVkIGluIGJvdGggKGNoZWNrIGZvciBzYW1lIHBlcm1pc3Npb25zKS4KKyAgICAjCisgICAgICAgIGlmIGFTaGEgPT0gYlNoYToKKyAgICAgICAgICAgIGlmIGFNb2RlICE9IGJNb2RlOgorICAgICAgICAgICAgICAgIGNsZWFuTWVyZ2UgPSBGYWxzZQorICAgICAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1Q6IEZpbGUnLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQgaWRlbnRpY2FsbHkgaW4gYm90aCBicmFuY2hlcywgYnV0IHBlcm1pc3Npb25zJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZsaWN0JywgJzAlbycgJSBhTW9kZSwgJy0+JywgJzAlbycgJSBiTW9kZSkKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUOiBhZGRpbmcgd2l0aCBwZXJtaXNzaW9uOicsICcwJW8nICUgYU1vZGUpCisKKyAgICAgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCBhU2hhLCBhTW9kZSwgcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGlzIGNhc2UgaXMgaGFuZGxlZCBieSBnaXQtcmVhZC10cmVlCisgICAgICAgICAgICAgICAgYXNzZXJ0KEZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisgICAgICAgICAgICBuZXdQYXRoMSA9IHVuaXF1ZVBhdGgocGF0aCwgYnJhbmNoMU5hbWUpCisgICAgICAgICAgICBuZXdQYXRoMiA9IHVuaXF1ZVBhdGgocGF0aCwgYnJhbmNoMk5hbWUpCisgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChhZGQvYWRkKTogRmlsZScsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgJ2FkZGVkIG5vbi1pZGVudGljYWxseSBpbiBib3RoIGJyYW5jaGVzLiBBZGRpbmcgYXMnLAorICAgICAgICAgICAgICAgICAgIG5ld1BhdGgxLCAnYW5kJywgbmV3UGF0aDIsICdpbnN0ZWFkLicpCisgICAgICAgICAgICByZW1vdmVGaWxlKEZhbHNlLCBwYXRoKQorICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgYVNoYSwgYU1vZGUsIG5ld1BhdGgxKQorICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgYlNoYSwgYk1vZGUsIG5ld1BhdGgyKQorCisgICAgZWxpZiBvU2hhIGFuZCBhU2hhIGFuZCBiU2hhOgorICAgICMKKyAgICAjIGNhc2UgRDogTW9kaWZpZWQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LgorICAgICMKKyAgICAgICAgb3V0cHV0KCdBdXRvLW1lcmdpbmcnLCBwYXRoKQorICAgICAgICBbc2hhLCBtb2RlLCBjbGVhbiwgZHVtbXldID0gXAorICAgICAgICAgICAgICBtZXJnZUZpbGUocGF0aCwgb1NoYSwgb01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBhU2hhLCBhTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGJTaGEsIGJNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoMU5hbWUsIGJyYW5jaDJOYW1lKQorICAgICAgICBpZiBjbGVhbjoKKyAgICAgICAgICAgIHVwZGF0ZUZpbGUoVHJ1ZSwgc2hhLCBtb2RlLCBwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChjb250ZW50KTogTWVyZ2UgY29uZmxpY3QgaW4nLCBwYXRoKQorCisgICAgICAgICAgICBpZiBjYWNoZU9ubHk6CisgICAgICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgc2hhLCBtb2RlLCBwYXRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1cGRhdGVGaWxlRXh0KHNoYSwgbW9kZSwgcGF0aCwgdXBkYXRlQ2FjaGU9RmFsc2UsIHVwZGF0ZVdkPVRydWUpCisgICAgZWxzZToKKyAgICAgICAgZGllKCJFUlJPUjogRmF0YWwgbWVyZ2UgZmFpbHVyZSwgc2hvdWxkbid0IGhhcHBlbi4iKQorCisgICAgcmV0dXJuIGNsZWFuTWVyZ2UKKworZGVmIHVzYWdlKCk6CisgICAgZGllKCdVc2FnZTonLCBzeXMuYXJndlswXSwgJyA8YmFzZT4uLi4gLS0gPGhlYWQ+IDxyZW1vdGU+Li4nKQorCisjIG1haW4gZW50cnkgcG9pbnQgYXMgbWVyZ2Ugc3RyYXRlZ3kgbW9kdWxlCisjIFRoZSBmaXJzdCBwYXJhbWV0ZXJzIHVwIHRvIC0tIGFyZSBtZXJnZSBiYXNlcywgYW5kIHRoZSByZXN0IGFyZSBoZWFkcy4KKworaWYgbGVuKHN5cy5hcmd2KSA8IDQ6CisgICAgdXNhZ2UoKQorCitiYXNlcyA9IFtdCitmb3IgbmV4dEFyZyBpbiB4cmFuZ2UoMSwgbGVuKHN5cy5hcmd2KSk6CisgICAgaWYgc3lzLmFyZ3ZbbmV4dEFyZ10gPT0gJy0tJzoKKyAgICAgICAgaWYgbGVuKHN5cy5hcmd2KSAhPSBuZXh0QXJnICsgMzoKKyAgICAgICAgICAgIGRpZSgnTm90IGhhbmRsaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gdHdvIGhlYWRzIG1lcmdlLicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGgxID0gZmlyc3RCcmFuY2ggPSBzeXMuYXJndltuZXh0QXJnICsgMV0KKyAgICAgICAgICAgIGgyID0gc2Vjb25kQnJhbmNoID0gc3lzLmFyZ3ZbbmV4dEFyZyArIDJdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgdXNhZ2UoKQorICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIGJhc2VzLmFwcGVuZChzeXMuYXJndltuZXh0QXJnXSkKKworcHJpbnQgJ01lcmdpbmcnLCBoMSwgJ3dpdGgnLCBoMgorCit0cnk6CisgICAgaDEgPSBydW5Qcm9ncmFtKFsnZ2l0LXJldi1wYXJzZScsICctLXZlcmlmeScsIGgxICsgJ14wJ10pLnJzdHJpcCgpCisgICAgaDIgPSBydW5Qcm9ncmFtKFsnZ2l0LXJldi1wYXJzZScsICctLXZlcmlmeScsIGgyICsgJ14wJ10pLnJzdHJpcCgpCisKKyAgICBpZiBsZW4oYmFzZXMpID09IDE6CisgICAgICAgIGJhc2UgPSBydW5Qcm9ncmFtKFsnZ2l0LXJldi1wYXJzZScsICctLXZlcmlmeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlc1swXSArICdeMCddKS5yc3RyaXAoKQorICAgICAgICBhbmNlc3RvciA9IENvbW1pdChiYXNlLCBOb25lKQorICAgICAgICBbZHVtbXksIGNsZWFuXSA9IG1lcmdlKENvbW1pdChoMSwgTm9uZSksIENvbW1pdChoMiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCcmFuY2gsIHNlY29uZEJyYW5jaCwgTm9uZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcikKKyAgICBlbHNlOgorICAgICAgICBncmFwaCA9IGJ1aWxkR3JhcGgoW2gxLCBoMl0pCisgICAgICAgIFtkdW1teSwgY2xlYW5dID0gbWVyZ2UoZ3JhcGguc2hhTWFwW2gxXSwgZ3JhcGguc2hhTWFwW2gyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJyYW5jaCwgc2Vjb25kQnJhbmNoLCBncmFwaCkKKworICAgIHByaW50ICcnCitleGNlcHQ6CisgICAgaWYgaXNpbnN0YW5jZShzeXMuZXhjX2luZm8oKVsxXSwgU3lzdGVtRXhpdCk6CisgICAgICAgIHJhaXNlCisgICAgZWxzZToKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhOb25lLCBzeXMuc3RkZXJyKQorICAgICAgICBzeXMuZXhpdCgyKQorCitpZiBjbGVhbjoKKyAgICBzeXMuZXhpdCgwKQorZWxzZToKKyAgICBzeXMuZXhpdCgxKQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLXJlc29sdmUuc2ggYi9naXQtbWVyZ2UtcmVzb2x2ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYThlZjIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLXJlc29sdmUuc2gKQEAgLTAsMCArMSw1NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgUmVzb2x2ZSB0d28gdHJlZXMsIHVzaW5nIGVuaGFuY2QgbXVsdGktYmFzZSByZWFkLXRyZWUuCisKKyMgVGhlIGZpcnN0IHBhcmFtZXRlcnMgdXAgdG8gLS0gYXJlIG1lcmdlIGJhc2VzOyB0aGUgcmVzdCBhcmUgaGVhZHMuCitiYXNlcz0gaGVhZD0gcmVtb3Rlcz0gc2VwX3NlZW49Citmb3IgYXJnCitkbworCWNhc2UgIiwkc2VwX3NlZW4sJGhlYWQsJGFyZywiIGluCisJKiwtLSwpCisJCXNlcF9zZWVuPXllcworCQk7OworCSx5ZXMsLCopCisJCWhlYWQ9JGFyZworCQk7OworCSx5ZXMsKikKKwkJcmVtb3Rlcz0iJHJlbW90ZXMkYXJnICIKKwkJOzsKKwkqKQorCQliYXNlcz0iJGJhc2VzJGFyZyAiCisJCTs7CisJZXNhYworZG9uZQorCisjIEdpdmUgdXAgaWYgd2UgYXJlIGdpdmVuIG1vcmUgdGhhbiB0d28gcmVtb3RlcyAtLSBub3QgaGFuZGxpbmcgb2N0b3B1cy4KK2Nhc2UgIiRyZW1vdGVzIiBpbgorPyonICc/KikKKwlleGl0IDIgOzsKK2VzYWMKKworIyBHaXZlIHVwIGlmIHRoaXMgaXMgYSBiYXNlbGVzcyBtZXJnZS4KK2lmIHRlc3QgJycgPSAiJGJhc2VzIgordGhlbgorCWV4aXQgMgorZmkKKworZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggMj4vZGV2L251bGwKK2dpdC1yZWFkLXRyZWUgLXUgLW0gLS1hZ2dyZXNzaXZlICRiYXNlcyAkaGVhZCAkcmVtb3RlcyB8fCBleGl0IDIKK2VjaG8gIlRyeWluZyBzaW1wbGUgbWVyZ2UuIgoraWYgcmVzdWx0X3RyZWU9JChnaXQtd3JpdGUtdHJlZSAgMj4vZGV2L251bGwpCit0aGVuCisJZXhpdCAwCitlbHNlCisJZWNobyAiU2ltcGxlIG1lcmdlIGZhaWxlZCwgdHJ5aW5nIEF1dG9tYXRpYyBtZXJnZS4iCisJaWYgZ2l0LW1lcmdlLWluZGV4IC1vIGdpdC1tZXJnZS1vbmUtZmlsZSAtYQorCXRoZW4KKwkJZXhpdCAwCisJZWxzZQorCQlleGl0IDEKKwlmaQorZmkKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS1zdHVwaWQuc2ggYi9naXQtbWVyZ2Utc3R1cGlkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmYWVjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbWVyZ2Utc3R1cGlkLnNoCkBAIC0wLDAgKzEsODAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyMKKyMgUmVzb2x2ZSB0d28gdHJlZXMsICdzdHVwaWQgbWVyZ2UnLgorCisjIFRoZSBmaXJzdCBwYXJhbWV0ZXJzIHVwIHRvIC0tIGFyZSBtZXJnZSBiYXNlczsgdGhlIHJlc3QgYXJlIGhlYWRzLgorYmFzZXM9IGhlYWQ9IHJlbW90ZXM9IHNlcF9zZWVuPQorZm9yIGFyZworZG8KKwljYXNlICIsJHNlcF9zZWVuLCRoZWFkLCRhcmcsIiBpbgorCSosLS0sKQorCQlzZXBfc2Vlbj15ZXMKKwkJOzsKKwkseWVzLCwqKQorCQloZWFkPSRhcmcKKwkJOzsKKwkseWVzLCopCisJCXJlbW90ZXM9IiRyZW1vdGVzJGFyZyAiCisJCTs7CisJKikKKwkJYmFzZXM9IiRiYXNlcyRhcmcgIgorCQk7OworCWVzYWMKK2RvbmUKKworIyBHaXZlIHVwIGlmIHdlIGFyZSBnaXZlbiBtb3JlIHRoYW4gdHdvIHJlbW90ZXMgLS0gbm90IGhhbmRsaW5nIG9jdG9wdXMuCitjYXNlICIkcmVtb3RlcyIgaW4KKz8qJyAnPyopCisJZXhpdCAyIDs7Citlc2FjCisKKyMgRmluZCBhbiBvcHRpbXVtIG1lcmdlIGJhc2UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY2FuZGlkYXRlcy4KK2Nhc2UgIiRiYXNlcyIgaW4KKz8qJyAnPyopCisJZWNobyAiVHJ5aW5nIHRvIGZpbmQgdGhlIG9wdGltdW0gbWVyZ2UgYmFzZS4iCisJRz0udG1wLWluZGV4JCQKKwliZXN0PQorCWJlc3RfY250PS0xCisJZm9yIGMgaW4gJGJhc2VzCisJZG8KKwkJcm0gLWYgJEcKKwkJR0lUX0lOREVYX0ZJTEU9JEcgZ2l0LXJlYWQtdHJlZSAtbSAkYyAkaGVhZCAkcmVtb3RlcyBcCisJCQkgMj4vZGV2L251bGwgfHwJY29udGludWUKKwkJIyBDb3VudCB0aGUgcGF0aHMgdGhhdCBhcmUgdW5tZXJnZWQuCisJCWNudD1gR0lUX0lOREVYX0ZJTEU9JEcgZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQgfCB3YyAtbGAKKwkJaWYgdGVzdCAkYmVzdF9jbnQgLWxlIDAgLW8gJGNudCAtbGUgJGJlc3RfY250CisJCXRoZW4KKwkJCWJlc3Q9JGMKKwkJCWJlc3RfY250PSRjbnQKKwkJCWlmIHRlc3QgIiRiZXN0X2NudCIgLWVxIDAKKwkJCXRoZW4KKwkJCQkjIENhbm5vdCBkbyBhbnkgYmV0dGVyIHRoYW4gYWxsIHRyaXZpYWwgbWVyZ2UuCisJCQkJYnJlYWsKKwkJCWZpCisJCWZpCisJZG9uZQorCXJtIC1mICRHCisJY29tbW9uPSIkYmVzdCIKKwk7OworKikKKwljb21tb249IiRiYXNlcyIKKwk7OworZXNhYworCitnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0LXJlYWQtdHJlZSAtdSAtbSAkY29tbW9uICRoZWFkICRyZW1vdGVzIHx8IGV4aXQgMgorZWNobyAiVHJ5aW5nIHNpbXBsZSBtZXJnZS4iCitpZiByZXN1bHRfdHJlZT0kKGdpdC13cml0ZS10cmVlICAyPi9kZXYvbnVsbCkKK3RoZW4KKwlleGl0IDAKK2Vsc2UKKwllY2hvICJTaW1wbGUgbWVyZ2UgZmFpbGVkLCB0cnlpbmcgQXV0b21hdGljIG1lcmdlLiIKKwlpZiBnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hCisJdGhlbgorCQlleGl0IDAKKwllbHNlCisJCWV4aXQgMQorCWZpCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLnNoIGIvZ2l0LW1lcmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmMWYyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbWVyZ2Uuc2gKQEAgLTAsMCArMSwzMzggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKworCitVU0FHRT0nWy1uXSBbLS1uby1jb21taXRdIFstcyA8c3RyYXRlZ3k+XS4uLiA8bWVyZ2UtbWVzc2FnZT4gPGhlYWQ+IDxyZW1vdGU+KycKKy4gZ2l0LXNoLXNldHVwCisKK0xGPScKKycKKworYWxsX3N0cmF0ZWdpZXM9J3JlY3Vyc2l2ZSBvY3RvcHVzIHJlc29sdmUgc3R1cGlkIG91cnMnCitkZWZhdWx0X3R3b2hlYWRfc3RyYXRlZ2llcz0ncmVjdXJzaXZlJworZGVmYXVsdF9vY3RvcHVzX3N0cmF0ZWdpZXM9J29jdG9wdXMnCitub190cml2aWFsX21lcmdlX3N0cmF0ZWdpZXM9J291cnMnCit1c2Vfc3RyYXRlZ2llcz0KKworaW5kZXhfbWVyZ2U9dAoraWYgdGVzdCAiQEBOT19QWVRIT05AQCI7IHRoZW4KKwlhbGxfc3RyYXRlZ2llcz0ncmVzb2x2ZSBvY3RvcHVzIHN0dXBpZCBvdXJzJworCWRlZmF1bHRfdHdvaGVhZF9zdHJhdGVnaWVzPSdyZXNvbHZlJworZmkKKworZHJvcHNhdmUoKSB7CisJcm0gLWYgLS0gIiRHSVRfRElSL01FUkdFX0hFQUQiICIkR0lUX0RJUi9NRVJHRV9NU0ciIFwKKwkJICIkR0lUX0RJUi9NRVJHRV9TQVZFIiB8fCBleGl0IDEKK30KKworc2F2ZXN0YXRlKCkgeworCSMgU3Rhc2ggYXdheSBhbnkgbG9jYWwgbW9kaWZpY2F0aW9ucy4KKwlnaXQtZGlmZi1pbmRleCAteiAtLW5hbWUtb25seSAkaGVhZCB8CisJY3BpbyAtMCAtbyA+IiRHSVRfRElSL01FUkdFX1NBVkUiCit9CisKK3Jlc3RvcmVzdGF0ZSgpIHsKKyAgICAgICAgaWYgdGVzdCAtZiAiJEdJVF9ESVIvTUVSR0VfU0FWRSIKKwl0aGVuCisJCWdpdCByZXNldCAtLWhhcmQgJGhlYWQKKwkJY3BpbyAtaXV2IDwiJEdJVF9ESVIvTUVSR0VfU0FWRSIKKwkJZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggPi9kZXYvbnVsbAorCWZpCit9CisKK2ZpbmlzaCAoKSB7CisJdGVzdCAnJyA9ICIkMiIgfHwgZWNobyAiJDIiCisJY2FzZSAiJG1lcmdlX21zZyIgaW4KKwknJykKKwkJZWNobyAiTm8gbWVyZ2UgbWVzc2FnZSAtLSBub3QgdXBkYXRpbmcgSEVBRCIKKwkJOzsKKwkqKQorCQlnaXQtdXBkYXRlLXJlZiBIRUFEICIkMSIgIiRoZWFkIiB8fCBleGl0IDEKKwkJOzsKKwllc2FjCisKKwljYXNlICIkbm9fc3VtbWFyeSIgaW4KKwknJykKKwkJZ2l0LWRpZmYtdHJlZSAtcCAtLXN0YXQgLS1zdW1tYXJ5IC1NICIkaGVhZCIgIiQxIgorCQk7OworCWVzYWMKK30KKword2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLW58LS1ufC0tbm98LS1uby18LS1uby1zfC0tbm8tc3V8LS1uby1zdW18LS1uby1zdW1tfFwKKwkJLS1uby1zdW1tYXwtLW5vLXN1bW1hcnwtLW5vLXN1bW1hcnkpCisJCW5vX3N1bW1hcnk9dCA7OworCS0tbm8tY3wtLW5vLWNvfC0tbm8tY29tfC0tbm8tY29tbXwtLW5vLWNvbW1pfC0tbm8tY29tbWl0KQorCQlub19jb21taXQ9dCA7OworCS1zPSp8LS1zPSp8LS1zdD0qfC0tc3RyPSp8LS1zdHJhPSp8LS1zdHJhdD0qfC0tc3RyYXRlPSp8XAorCQktLXN0cmF0ZWc9KnwtLXN0cmF0ZWd5PSp8XAorCS1zfC0tc3wtLXN0fC0tc3RyfC0tc3RyYXwtLXN0cmF0fC0tc3RyYXRlfC0tc3RyYXRlZ3wtLXN0cmF0ZWd5KQorCQljYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCQlzdHJhdGVneT1gZXhwciAiJDEiIDogJy1bXj1dKj1cKC4qXCknYCA7OworCQkxLCopCisJCQl1c2FnZSA7OworCQkqKQorCQkJc3RyYXRlZ3k9IiQyIgorCQkJc2hpZnQgOzsKKwkJZXNhYworCQljYXNlICIgJGFsbF9zdHJhdGVnaWVzICIgaW4KKwkJKiIgJHN0cmF0ZWd5ICIqKQorCQkJdXNlX3N0cmF0ZWdpZXM9IiR1c2Vfc3RyYXRlZ2llcyRzdHJhdGVneSAiIDs7CisJCSopCisJCQlkaWUgImF2YWlsYWJsZSBzdHJhdGVnaWVzIGFyZTogJGFsbF9zdHJhdGVnaWVzIiA7OworCQllc2FjCisJCTs7CisJLSopCXVzYWdlIDs7CisJKikJYnJlYWsgOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworbWVyZ2VfbXNnPSIkMSIKK3NoaWZ0CitoZWFkX2FyZz0iJDEiCitoZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDEiXjApIHx8IHVzYWdlCitzaGlmdAorCisjIEFsbCB0aGUgcmVzdCBhcmUgcmVtb3RlIGhlYWRzCit0ZXN0ICIkIyIgPSAwICYmIHVzYWdlIDsjIHdlIG5lZWQgYXQgbGVhc3Qgb25lIHJlbW90ZSBoZWFkLgorCityZW1vdGVoZWFkcz0KK2ZvciByZW1vdGUKK2RvCisJcmVtb3RlaGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRyZW1vdGUiXjApIHx8CisJICAgIGRpZSAiJHJlbW90ZSAtIG5vdCBzb21ldGhpbmcgd2UgY2FuIG1lcmdlIgorCXJlbW90ZWhlYWRzPSIke3JlbW90ZWhlYWRzfSRyZW1vdGVoZWFkICIKK2RvbmUKK3NldCB4ICRyZW1vdGVoZWFkcyA7IHNoaWZ0CisKK2Nhc2UgIiR1c2Vfc3RyYXRlZ2llcyIgaW4KKycnKQorCWNhc2UgIiQjIiBpbgorCTEpCisJCXVzZV9zdHJhdGVnaWVzPSIkZGVmYXVsdF90d29oZWFkX3N0cmF0ZWdpZXMiIDs7CisJKikKKwkJdXNlX3N0cmF0ZWdpZXM9IiRkZWZhdWx0X29jdG9wdXNfc3RyYXRlZ2llcyIgOzsKKwllc2FjCisJOzsKK2VzYWMKKworZm9yIHMgaW4gJHVzZV9zdHJhdGVnaWVzCitkbworCWNhc2UgIiAkcyAiIGluCisJKiIgJG5vX3RyaXZpYWxfbWVyZ2Vfc3RyYXRlZ2llcyAiKikKKwkJaW5kZXhfbWVyZ2U9ZgorCQlicmVhaworCQk7OworCWVzYWMKK2RvbmUKKworY2FzZSAiJCMiIGluCisxKQorCWNvbW1vbj0kKGdpdC1tZXJnZS1iYXNlIC0tYWxsICRoZWFkICIkQCIpCisJOzsKKyopCisJY29tbW9uPSQoZ2l0LXNob3ctYnJhbmNoIC0tbWVyZ2UtYmFzZSAkaGVhZCAiJEAiKQorCTs7Citlc2FjCitlY2hvICIkaGVhZCIgPiIkR0lUX0RJUi9PUklHX0hFQUQiCisKK2Nhc2UgIiRpbmRleF9tZXJnZSwkIywkY29tbW9uLCRub19jb21taXQiIGluCitmLCopCisJIyBXZSd2ZSBiZWVuIHRvbGQgbm90IHRvIHRyeSBhbnl0aGluZyBjbGV2ZXIuICBTa2lwIHRvIHJlYWwgbWVyZ2UuCisJOzsKKz8sKiwnJywqKQorCSMgTm8gY29tbW9uIGFuY2VzdG9ycyBmb3VuZC4gV2UgbmVlZCBhIHJlYWwgbWVyZ2UuCisJOzsKKz8sMSwiJDEiLCopCisJIyBJZiBoZWFkIGNhbiByZWFjaCBhbGwgdGhlIG1lcmdlIHRoZW4gd2UgYXJlIHVwIHRvIGRhdGUuCisJIyBidXQgZmlyc3QgdGhlIG1vc3QgY29tbW9uIGNhc2Ugb2YgbWVyZ2luZyBvbmUgcmVtb3RlLgorCWVjaG8gIkFscmVhZHkgdXAtdG8tZGF0ZS4iCisJZHJvcHNhdmUKKwlleGl0IDAKKwk7OworPywxLCIkaGVhZCIsKikKKwkjIEFnYWluIHRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIG1lcmdpbmcgb25lIHJlbW90ZS4KKwllY2hvICJVcGRhdGluZyBmcm9tICRoZWFkIHRvICQxIgorCWdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCisJbmV3X2hlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMV4wIikgJiYKKwlnaXQtcmVhZC10cmVlIC11IC12IC1tICRoZWFkICIkbmV3X2hlYWQiICYmCisJZmluaXNoICIkbmV3X2hlYWQiICJGYXN0IGZvcndhcmQiCisJZHJvcHNhdmUKKwlleGl0IDAKKwk7OworPywxLD8qIiRMRiI/KiwqKQorCSMgV2UgYXJlIG5vdCBkb2luZyBvY3RvcHVzIGFuZCBub3QgZmFzdCBmb3J3YXJkLiAgTmVlZCBhCisJIyByZWFsIG1lcmdlLgorCTs7Cis/LDEsKiwpCisJIyBXZSBhcmUgbm90IGRvaW5nIG9jdG9wdXMsIG5vdCBmYXN0IGZvcndhcmQsIGFuZCBoYXZlIG9ubHkKKwkjIG9uZSBjb21tb24uICBTZWUgaWYgaXQgaXMgcmVhbGx5IHRyaXZpYWwuCisJZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwgZXhpdAorCisJZWNobyAiVHJ5aW5nIHJlYWxseSB0cml2aWFsIGluLWluZGV4IG1lcmdlLi4uIgorCWdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCisJaWYgZ2l0LXJlYWQtdHJlZSAtLXRyaXZpYWwgLW0gLXUgLXYgJGNvbW1vbiAkaGVhZCAiJDEiICYmCisJICAgcmVzdWx0X3RyZWU9JChnaXQtd3JpdGUtdHJlZSkKKwl0aGVuCisJICAgIGVjaG8gIldvbmRlcmZ1bC4iCisJICAgIHJlc3VsdF9jb21taXQ9JCgKKwkgICAgICAgIGVjaG8gIiRtZXJnZV9tc2ciIHwKKwkgICAgICAgIGdpdC1jb21taXQtdHJlZSAkcmVzdWx0X3RyZWUgLXAgSEVBRCAtcCAiJDEiCisJICAgICkgfHwgZXhpdAorCSAgICBmaW5pc2ggIiRyZXN1bHRfY29tbWl0IiAiSW4taW5kZXggbWVyZ2UiCisJICAgIGRyb3BzYXZlCisJICAgIGV4aXQgMAorCWZpCisJZWNobyAiTm9wZS4iCisJOzsKKyopCisJIyBBbiBvY3RvcHVzLiAgSWYgd2UgY2FuIHJlYWNoIGFsbCB0aGUgcmVtb3RlIHdlIGFyZSB1cCB0byBkYXRlLgorCXVwX3RvX2RhdGU9dAorCWZvciByZW1vdGUKKwlkbworCQljb21tb25fb25lPSQoZ2l0LW1lcmdlLWJhc2UgLS1hbGwgJGhlYWQgJHJlbW90ZSkKKwkJaWYgdGVzdCAiJGNvbW1vbl9vbmUiICE9ICIkcmVtb3RlIgorCQl0aGVuCisJCQl1cF90b19kYXRlPWYKKwkJCWJyZWFrCisJCWZpCisJZG9uZQorCWlmIHRlc3QgIiR1cF90b19kYXRlIiA9IHQKKwl0aGVuCisJCWVjaG8gIkFscmVhZHkgdXAtdG8tZGF0ZS4gWWVlYWghIgorCQlkcm9wc2F2ZQorCQlleGl0IDAKKwlmaQorCTs7Citlc2FjCisKKyMgV2UgYXJlIGdvaW5nIHRvIG1ha2UgYSBuZXcgY29tbWl0LgorZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwgZXhpdAorCisjIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgYSByZWFsIG1lcmdlLiAgTm8gbWF0dGVyIHdoYXQgc3RyYXRlZ3kKKyMgd2UgdXNlLCBpdCB3b3VsZCBvcGVyYXRlIG9uIHRoZSBpbmRleCwgcG9zc2libHkgYWZmZWN0aW5nIHRoZQorIyB3b3JraW5nIHRyZWUsIGFuZCB3aGVuIHJlc29sdmVkIGNsZWFubHksIGhhdmUgdGhlIGRlc2lyZWQgdHJlZQorIyBpbiB0aGUgaW5kZXggLS0gdGhpcyBtZWFucyB0aGF0IHRoZSBpbmRleCBtdXN0IGJlIGluIHN5bmMgd2l0aAorIyB0aGUgJGhlYWQgY29tbWl0LiAgVGhlIHN0cmF0ZWdpZXMgYXJlIHJlc3BvbnNpYmxlIHRvIGVuc3VyZSB0aGlzLgorCitjYXNlICIkdXNlX3N0cmF0ZWdpZXMiIGluCis/KicgJz8qKQorICAgICMgU3Rhc2ggYXdheSB0aGUgbG9jYWwgY2hhbmdlcyBzbyB0aGF0IHdlIGNhbiB0cnkgbW9yZSB0aGFuIG9uZS4KKyAgICBzYXZlc3RhdGUKKyAgICBzaW5nbGVfc3RyYXRlZ3k9bm8KKyAgICA7OworKikKKyAgICBybSAtZiAiJEdJVF9ESVIvTUVSR0VfU0FWRSIKKyAgICBzaW5nbGVfc3RyYXRlZ3k9eWVzCisgICAgOzsKK2VzYWMKKworcmVzdWx0X3RyZWU9IGJlc3RfY250PS0xIGJlc3Rfc3RyYXRlZ3k9IHd0X3N0cmF0ZWd5PQorbWVyZ2Vfd2FzX29rPQorZm9yIHN0cmF0ZWd5IGluICR1c2Vfc3RyYXRlZ2llcworZG8KKyAgICB0ZXN0ICIkd3Rfc3RyYXRlZ3kiID0gJycgfHwgeworCWVjaG8gIlJld2luZGluZyB0aGUgdHJlZSB0byBwcmlzdGluZS4uLiIKKwlyZXN0b3Jlc3RhdGUKKyAgICB9CisgICAgY2FzZSAiJHNpbmdsZV9zdHJhdGVneSIgaW4KKyAgICBubykKKwllY2hvICJUcnlpbmcgbWVyZ2Ugc3RyYXRlZ3kgJHN0cmF0ZWd5Li4uIgorCTs7CisgICAgZXNhYworCisgICAgIyBSZW1lbWJlciB3aGljaCBzdHJhdGVneSBsZWZ0IHRoZSBzdGF0ZSBpbiB0aGUgd29ya2luZyB0cmVlCisgICAgd3Rfc3RyYXRlZ3k9JHN0cmF0ZWd5CisKKyAgICBnaXQtbWVyZ2UtJHN0cmF0ZWd5ICRjb21tb24gLS0gIiRoZWFkX2FyZyIgIiRAIgorICAgIGV4aXQ9JD8KKyAgICBpZiB0ZXN0ICIkbm9fY29tbWl0IiA9IHQgJiYgdGVzdCAiJGV4aXQiID0gMAorICAgIHRoZW4KKyAgICAgICAgbWVyZ2Vfd2FzX29rPXQKKwlleGl0PTEgOyMgcHJldGVuZCBpdCBsZWZ0IGNvbmZsaWN0cy4KKyAgICBmaQorCisgICAgdGVzdCAiJGV4aXQiID0gMCB8fCB7CisKKwkjIFRoZSBiYWNrZW5kIGV4aXRzIHdpdGggMSB3aGVuIGNvbmZsaWN0cyBhcmUgbGVmdCB0byBiZSByZXNvbHZlZCwKKwkjIHdpdGggMiB3aGVuIGl0IGRvZXMgbm90IGhhbmRsZSB0aGUgZ2l2ZW4gbWVyZ2UgYXQgYWxsLgorCisJaWYgdGVzdCAiJGV4aXQiIC1lcSAxCisJdGhlbgorCSAgICBjbnQ9YHsKKwkJZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHkKKwkJZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQKKwkgICAgfSB8IHdjIC1sYAorCSAgICBpZiB0ZXN0ICRiZXN0X2NudCAtbGUgMCAtbyAkY250IC1sZSAkYmVzdF9jbnQKKwkgICAgdGhlbgorCQliZXN0X3N0cmF0ZWd5PSRzdHJhdGVneQorCQliZXN0X2NudD0kY250CisJICAgIGZpCisJZmkKKwljb250aW51ZQorICAgIH0KKworICAgICMgQXV0b21lcmdlIHN1Y2NlZWRlZC4KKyAgICByZXN1bHRfdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJiBicmVhaworZG9uZQorCisjIElmIHdlIGhhdmUgYSByZXN1bHRpbmcgdHJlZSwgdGhhdCBtZWFucyB0aGUgc3RyYXRlZ3kgbW9kdWxlCisjIGF1dG8gcmVzb2x2ZWQgdGhlIG1lcmdlIGNsZWFubHkuCitpZiB0ZXN0ICcnICE9ICIkcmVzdWx0X3RyZWUiCit0aGVuCisgICAgcGFyZW50cz0kKGdpdC1zaG93LWJyYW5jaCAtLWluZGVwZW5kZW50ICIkaGVhZCIgIiRAIiB8IHNlZCAtZSAncy9eLy1wIC8nKQorICAgIHJlc3VsdF9jb21taXQ9JChlY2hvICIkbWVyZ2VfbXNnIiB8IGdpdC1jb21taXQtdHJlZSAkcmVzdWx0X3RyZWUgJHBhcmVudHMpIHx8IGV4aXQKKyAgICBmaW5pc2ggIiRyZXN1bHRfY29tbWl0IiAiTWVyZ2UgJHJlc3VsdF9jb21taXQsIG1hZGUgYnkgJHd0X3N0cmF0ZWd5LiIKKyAgICBkcm9wc2F2ZQorICAgIGV4aXQgMAorZmkKKworIyBQaWNrIHRoZSByZXN1bHQgZnJvbSB0aGUgYmVzdCBzdHJhdGVneSBhbmQgaGF2ZSB0aGUgdXNlciBmaXggaXQgdXAuCitjYXNlICIkYmVzdF9zdHJhdGVneSIgaW4KKycnKQorCXJlc3RvcmVzdGF0ZQorCWVjaG8gPiYyICJObyBtZXJnZSBzdHJhdGVneSBoYW5kbGVkIHRoZSBtZXJnZS4iCisJZXhpdCAyCisJOzsKKyIkd3Rfc3RyYXRlZ3kiKQorCSMgV2UgYWxyZWFkeSBoYXZlIGl0cyByZXN1bHQgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKwk7OworKikKKwllY2hvICJSZXdpbmRpbmcgdGhlIHRyZWUgdG8gcHJpc3RpbmUuLi4iCisJcmVzdG9yZXN0YXRlCisJZWNobyAiVXNpbmcgdGhlICRiZXN0X3N0cmF0ZWd5IHRvIHByZXBhcmUgcmVzb2x2aW5nIGJ5IGhhbmQuIgorCWdpdC1tZXJnZS0kYmVzdF9zdHJhdGVneSAkY29tbW9uIC0tICIkaGVhZF9hcmciICIkQCIKKwk7OworZXNhYworZm9yIHJlbW90ZQorZG8KKwllY2hvICRyZW1vdGUKK2RvbmUgPiIkR0lUX0RJUi9NRVJHRV9IRUFEIgorZWNobyAiJG1lcmdlX21zZyIgPiIkR0lUX0RJUi9NRVJHRV9NU0ciCisKK2lmIHRlc3QgIiRtZXJnZV93YXNfb2siID0gdAordGhlbgorCWVjaG8gPiYyIFwKKwkiQXV0b21hdGljIG1lcmdlIHdlbnQgd2VsbDsgc3RvcHBlZCBiZWZvcmUgY29tbWl0dGluZyBhcyByZXF1ZXN0ZWQiCisJZXhpdCAwCitlbHNlCisJeworCSAgICBlY2hvICcKK0NvbmZsaWN0czoKKycKKwkJZ2l0IGxzLWZpbGVzIC0tdW5tZXJnZWQgfAorCQlzZWQgLWUgJ3MvXlteCV0qCS8JLycgfAorCQl1bmlxCisJfSA+PiIkR0lUX0RJUi9NRVJHRV9NU0ciCisJaWYgdGVzdCAtZCAiJEdJVF9ESVIvcnItY2FjaGUiCisJdGhlbgorCQlnaXQtcmVyZXJlCisJZmkKKwlkaWUgIkF1dG9tYXRpYyBtZXJnZSBmYWlsZWQ7IGZpeCBjb25mbGljdHMgYW5kIHRoZW4gY29tbWl0IHRoZSByZXN1bHQuIgorZmkKZGlmZiAtLWdpdCBhL2dpdC1tdi5wZXJsIGIvZ2l0LW12LnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzVhYThmZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tdi5wZXJsCkBAIC0wLDAgKzEsMjUwIEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgQ29weXJpZ2h0IDIwMDUsIFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisjICAgICAgICAgICAgICAgICBKb3NlZiBXZWlkZW5kb3JmZXIgPEpvc2VmLldlaWRlbmRvcmZlckBnbXguZGU+CisjCisjIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKyMgYXQgdGhlIGRpc2NyZXRpb24gb2YgTGludXMgVG9ydmFsZHMuCisKKwordXNlIHdhcm5pbmdzOwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6OlN0ZDsKKworc3ViIHVzYWdlKCkgeworCXByaW50IDw8RU9UOworJDAgWy1mXSBbLW5dIDxzb3VyY2U+IDxkZXN0aW5hdGlvbj4KKyQwIFstZl0gWy1uXSBbLWtdIDxzb3VyY2U+IC4uLiA8ZGVzdGluYXRpb24gZGlyZWN0b3J5PgorRU9UCisJZXhpdCgxKTsKK30KKworb3VyICgkb3B0X24sICRvcHRfZiwgJG9wdF9oLCAkb3B0X2ssICRvcHRfdik7CitnZXRvcHRzKCJobmZrdiIpIHx8IHVzYWdlOwordXNhZ2UoKSBpZiAkb3B0X2g7CitAQVJHViA+PSAxIG9yIHVzYWdlOworCitteSAkR0lUX0RJUiA9IGBnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpcmA7CitleGl0IDEgaWYgJD87ICMgcmV2LXBhcnNlIHdvdWxkIGhhdmUgZ2l2ZW4gIm5vdCBhIGdpdCBkaXIiIG1lc3NhZ2UuCitjaG9tcCgkR0lUX0RJUik7CisKK215IChAc3JjQXJncywgQGRzdEFyZ3MsIEBzcmNzLCBAZHN0cyk7CitteSAoJHNyYywgJGRzdCwgJGJhc2UsICRkc3REaXIpOworCisjIHJlbW92ZSBhbnkgdHJhaWxpbmcgc2xhc2ggaW4gYXJndW1lbnRzCitmb3IgKEBBUkdWKSB7IHMvXC8qJC8vOyB9CisKK215ICRhcmdDb3VudCA9IHNjYWxhciBAQVJHVjsKK2lmICgtZCAkQVJHVlskYXJnQ291bnQtMV0pIHsKKwkkZHN0RGlyID0gJEFSR1ZbJGFyZ0NvdW50LTFdOworCUBzcmNBcmdzID0gQEFSR1ZbMC4uJGFyZ0NvdW50LTJdOworCisJZm9yZWFjaCAkc3JjIChAc3JjQXJncykgeworCQkkYmFzZSA9ICRzcmM7CisJCSRiYXNlID1+IHMvXi4qXC8vLzsKKwkJJGRzdCA9ICIkZHN0RGlyLyIuICRiYXNlOworCQlwdXNoIEBkc3RBcmdzLCAkZHN0OworCX0KK30KK2Vsc2UgeworICAgIGlmICgkYXJnQ291bnQgPCAyKSB7CisJcHJpbnQgIkVycm9yOiBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHNcbiI7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKCRhcmdDb3VudCA+IDIpIHsKKwlwcmludCAiRXJyb3I6IG1vdmluZyB0byBkaXJlY3RvcnkgJyIKKwkgICAgLiAkQVJHVlskYXJnQ291bnQtMV0KKwkgICAgLiAiJyBub3QgcG9zc2libGU7IG5vdCBleGlzdGluZ1xuIjsKKwlleGl0KDEpOworICAgIH0KKyAgICBAc3JjQXJncyA9ICgkQVJHVlswXSk7CisgICAgQGRzdEFyZ3MgPSAoJEFSR1ZbMV0pOworICAgICRkc3REaXIgPSAiIjsKK30KKworbXkgJHN1YmRpcl9wcmVmaXggPSBgZ2l0IHJldi1wYXJzZSAtLXNob3ctcHJlZml4YDsKK2Nob21wKCRzdWJkaXJfcHJlZml4KTsKKworIyBydW4gaW4gZ2l0IGJhc2UgZGlyZWN0b3J5LCBzbyB0aGF0IGdpdC1scy1maWxlcyBsaXN0cyBhbGwgcmV2aXNpb25lZCBmaWxlcworY2hkaXIgIiRHSVRfRElSLy4uIjsKKworIyBub3JtYWxpemUgcGF0aHMsIG5lZWRlZCB0byBjb21wYXJlIGFnYWluc3QgdmVyc2lvbmVkIGZpbGVzIGFuZCB1cGRhdGUtaW5kZXgKKyMgYWxzbywgdGhpcyBpcyBuaWNlciB0byBlbmQtdXNlcnMgYnkgZG9pbmcgIi4vL2EvLi9iLy4vLy4vYyIgPT0+ICJhL2IvYyIKK2ZvciAoQHNyY0FyZ3MsIEBkc3RBcmdzKSB7CisgICAgIyBwcmVwZW5kIGdpdCBwcmVmaXggYXMgd2UgcnVuIGZyb20gYmFzZSBkaXJlY3RvcnkKKyAgICAkXyA9ICRzdWJkaXJfcHJlZml4LiRfOworICAgIHN8XlwuL3x8OworICAgIHN8L1wuL3wvfCB3aGlsZSAobXwvXC4vfCk7CisgICAgc3wvLyt8L3xnOworICAgICMgQWxzbyAiYS9iLy4uL2MiID09PiAiYS9jIgorICAgIDEgd2hpbGUgKHMsKF58LylbXi9dKy9cLlwuLywkMSwpOworfQorCitteSAoQGFsbGZpbGVzLEBzcmNmaWxlcyxAZHN0ZmlsZXMpOworbXkgJHNhZmVzcmM7CitteSAoJW92ZXJ3cml0dGVuLCAlc3JjRm9yRHN0KTsKKworJC8gPSAiXDAiOworb3BlbihGLCAnZ2l0LWxzLWZpbGVzIC16IHwnKQorICAgICAgICBvciBkaWUgIkZhaWxlZCB0byBvcGVuIHBpcGUgZnJvbSBnaXQtbHMtZmlsZXM6ICIgLiAkITsKKworQGFsbGZpbGVzID0gbWFwIHsgY2hvbXA7ICRfOyB9IDxGPjsKK2Nsb3NlKEYpOworCisKK215ICgkaSwgJGJhZCk7Cit3aGlsZShzY2FsYXIgQHNyY0FyZ3MgPiAwKSB7CisgICAgJHNyYyA9IHNoaWZ0IEBzcmNBcmdzOworICAgICRkc3QgPSBzaGlmdCBAZHN0QXJnczsKKyAgICAkYmFkID0gIiI7CisKKyAgICBmb3IgKCRzcmMsICRkc3QpIHsKKwkjIEJlIG5pY2VyIHRvIGVuZC11c2VycyBieSBkb2luZyAiLi8vYS8uL2IvLi8vLi9jIiA9PT4gImEvYi9jIgorCXN8XlwuL3x8OworCXN8L1wuL3wvfCB3aGlsZSAobXwvXC4vfCk7CisJc3wvLyt8L3xnOworCSMgQWxzbyAiYS9iLy4uL2MiID09PiAiYS9jIgorCTEgd2hpbGUgKHMsKF58LylbXi9dKy9cLlwuLywkMSwpOworICAgIH0KKworICAgIGlmICgkb3B0X3YpIHsKKwlwcmludCAiQ2hlY2tpbmcgcmVuYW1lIG9mICckc3JjJyB0byAnJGRzdCdcbiI7CisgICAgfQorCisgICAgdW5sZXNzICgtZiAkc3JjIHx8IC1sICRzcmMgfHwgLWQgJHNyYykgeworCSRiYWQgPSAiYmFkIHNvdXJjZSAnJHNyYyciOworICAgIH0KKworICAgICRzYWZlc3JjID0gcXVvdGVtZXRhKCRzcmMpOworICAgIEBzcmNmaWxlcyA9IGdyZXAgL14kc2FmZXNyYyhcL3wkKS8sIEBhbGxmaWxlczsKKworICAgICRvdmVyd3JpdHRlbnskZHN0fSA9IDA7CisgICAgaWYgKCgkYmFkIGVxICIiKSAmJiAtZSAkZHN0KSB7CisJJGJhZCA9ICJkZXN0aW5hdGlvbiAnJGRzdCcgYWxyZWFkeSBleGlzdHMiOworCWlmICgkb3B0X2YpIHsKKwkgICAgIyBvbmx5IGZpbGVzIGNhbiBvdmVyd3JpdGUgZWFjaCBvdGhlcjogY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCisJICAgIGlmICgtZiAkZHN0ICYmIChzY2FsYXIgQHNyY2ZpbGVzID09IDEpKSB7CisJCXByaW50ICJXYXJuaW5nOiAkYmFkOyB3aWxsIG92ZXJ3cml0ZSFcbiI7CisJCSRiYWQgPSAiIjsKKwkJJG92ZXJ3cml0dGVueyRkc3R9ID0gMTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJJGJhZCA9ICJDYW4gbm90IG92ZXJ3cml0ZSAnJHNyYycgd2l0aCAnJGRzdCciOworCSAgICB9CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAoKCRiYWQgZXEgIiIpICYmICgkZHN0ID1+IC9eJHNhZmVzcmNcLy8pKSB7CisJJGJhZCA9ICJjYW4gbm90IG1vdmUgZGlyZWN0b3J5ICckc3JjJyBpbnRvIGl0c2VsZiI7CisgICAgfQorCisgICAgaWYgKCRiYWQgZXEgIiIpIHsKKyAgICAgICAgaWYgKHNjYWxhciBAc3JjZmlsZXMgPT0gMCkgeworCSAgICAkYmFkID0gIickc3JjJyBub3QgdW5kZXIgdmVyc2lvbiBjb250cm9sIjsKKwl9CisgICAgfQorCisgICAgaWYgKCRiYWQgZXEgIiIpIHsKKyAgICAgICBpZiAoZGVmaW5lZCAkc3JjRm9yRHN0eyRkc3R9KSB7CisgICAgICAgICAgICRiYWQgPSAiY2FuIG5vdCBtb3ZlICckc3JjJyB0byAnJGRzdCc7IGFscmVhZHkgdGFyZ2V0IG9mICI7CisgICAgICAgICAgICRiYWQgLj0gIiciLiRzcmNGb3JEc3R7JGRzdH0uIiciOworICAgICAgIH0KKyAgICAgICBlbHNlIHsKKyAgICAgICAgICAgJHNyY0ZvckRzdHskZHN0fSA9ICRzcmM7CisgICAgICAgfQorICAgIH0KKworICAgIGlmICgkYmFkIG5lICIiKSB7CisJaWYgKCRvcHRfaykgeworCSAgICBwcmludCAiV2FybmluZzogJGJhZDsgc2tpcHBpbmdcbiI7CisJICAgIG5leHQ7CisJfQorCXByaW50ICJFcnJvcjogJGJhZFxuIjsKKwlleGl0KDEpOworICAgIH0KKyAgICBwdXNoIEBzcmNzLCAkc3JjOworICAgIHB1c2ggQGRzdHMsICRkc3Q7Cit9CisKKyMgRmluYWwgcGFzczogcmVuYW1lL21vdmUKK215IChAZGVsZXRlZGZpbGVzLEBhZGRlZGZpbGVzLEBjaGFuZ2VkZmlsZXMpOworJGJhZCA9ICIiOword2hpbGUoc2NhbGFyIEBzcmNzID4gMCkgeworICAgICRzcmMgPSBzaGlmdCBAc3JjczsKKyAgICAkZHN0ID0gc2hpZnQgQGRzdHM7CisKKyAgICBpZiAoJG9wdF9uIHx8ICRvcHRfdikgeyBwcmludCAiUmVuYW1pbmcgJHNyYyB0byAkZHN0XG4iOyB9CisgICAgaWYgKCEkb3B0X24pIHsKKwlpZiAoIXJlbmFtZSgkc3JjLCRkc3QpKSB7CisJICAgICRiYWQgPSAicmVuYW1pbmcgJyRzcmMnIGZhaWxlZDogJCEiOworCSAgICBpZiAoJG9wdF9rKSB7CisJCXByaW50ICJXYXJuaW5nOiBza2lwcGVkOiAkYmFkXG4iOworCQkkYmFkID0gIiI7CisJCW5leHQ7CisJICAgIH0KKwkgICAgbGFzdDsKKwl9CisgICAgfQorCisgICAgJHNhZmVzcmMgPSBxdW90ZW1ldGEoJHNyYyk7CisgICAgQHNyY2ZpbGVzID0gZ3JlcCAvXiRzYWZlc3JjKFwvfCQpLywgQGFsbGZpbGVzOworICAgIEBkc3RmaWxlcyA9IEBzcmNmaWxlczsKKyAgICBzL14kc2FmZXNyYyhcL3wkKS8kZHN0JDEvIGZvciBAZHN0ZmlsZXM7CisKKyAgICBwdXNoIEBkZWxldGVkZmlsZXMsIEBzcmNmaWxlczsKKyAgICBpZiAoc2NhbGFyIEBzcmNmaWxlcyA9PSAxKSB7CisJIyAkZHN0IGNhbiBiZSBhIGRpcmVjdG9yeSB3aXRoIDEgZmlsZSBpbnNpZGUKKwlpZiAoJG92ZXJ3cml0dGVueyRkc3R9ID09MSkgeworCSAgICBwdXNoIEBjaGFuZ2VkZmlsZXMsICRkc3RmaWxlc1swXTsKKworCX0gZWxzZSB7CisJICAgIHB1c2ggQGFkZGVkZmlsZXMsICRkc3RmaWxlc1swXTsKKwl9CisgICAgfQorICAgIGVsc2UgeworCXB1c2ggQGFkZGVkZmlsZXMsIEBkc3RmaWxlczsKKyAgICB9Cit9CisKK2lmICgkb3B0X24pIHsKKyAgICBpZiAoQGNoYW5nZWRmaWxlcykgeworCXByaW50ICJDaGFuZ2VkICA6ICIuIGpvaW4oIiwgIiwgQGNoYW5nZWRmaWxlcykgLiJcbiI7CisgICAgfQorICAgIGlmIChAYWRkZWRmaWxlcykgeworCXByaW50ICJBZGRpbmcgICA6ICIuIGpvaW4oIiwgIiwgQGFkZGVkZmlsZXMpIC4iXG4iOworICAgIH0KKyAgICBpZiAoQGRlbGV0ZWRmaWxlcykgeworCXByaW50ICJEZWxldGluZyA6ICIuIGpvaW4oIiwgIiwgQGRlbGV0ZWRmaWxlcykgLiJcbiI7CisgICAgfQorfQorZWxzZSB7CisgICAgaWYgKEBjaGFuZ2VkZmlsZXMpIHsKKwlvcGVuKEgsICJ8IGdpdC11cGRhdGUtaW5kZXggLXogLS1zdGRpbiIpCisJCW9yIGRpZSAiZ2l0LXVwZGF0ZS1pbmRleCBmYWlsZWQgdG8gdXBkYXRlIGNoYW5nZWQgZmlsZXMgd2l0aCBjb2RlICQhXG4iOworCWZvcmVhY2ggbXkgJGZpbGVOYW1lIChAY2hhbmdlZGZpbGVzKSB7CisJCXByaW50IEggIiRmaWxlTmFtZVwwIjsKKwl9CisJY2xvc2UoSCk7CisgICAgfQorICAgIGlmIChAYWRkZWRmaWxlcykgeworCW9wZW4oSCwgInwgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAteiAtLXN0ZGluIikKKwkJb3IgZGllICJnaXQtdXBkYXRlLWluZGV4IGZhaWxlZCB0byBhZGQgbmV3IG5hbWVzIHdpdGggY29kZSAkIVxuIjsKKwlmb3JlYWNoIG15ICRmaWxlTmFtZSAoQGFkZGVkZmlsZXMpIHsKKwkJcHJpbnQgSCAiJGZpbGVOYW1lXDAiOworCX0KKwljbG9zZShIKTsKKyAgICB9CisgICAgaWYgKEBkZWxldGVkZmlsZXMpIHsKKwlvcGVuKEgsICJ8IGdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLXogLS1zdGRpbiIpCisJCW9yIGRpZSAiZ2l0LXVwZGF0ZS1pbmRleCBmYWlsZWQgdG8gcmVtb3ZlIG9sZCBuYW1lcyB3aXRoIGNvZGUgJCFcbiI7CisJZm9yZWFjaCBteSAkZmlsZU5hbWUgKEBkZWxldGVkZmlsZXMpIHsKKwkJcHJpbnQgSCAiJGZpbGVOYW1lXDAiOworCX0KKwljbG9zZShIKTsKKyAgICB9Cit9CisKK2lmICgkYmFkIG5lICIiKSB7CisgICAgcHJpbnQgIkVycm9yOiAkYmFkXG4iOworICAgIGV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9naXQtcDRpbXBvcnQucHkgYi9naXQtcDRpbXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxNzJhYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1wNGltcG9ydC5weQpAQCAtMCwwICsxLDM1NyBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMKKyMgVGhpcyB0b29sIGlzIGNvcHlyaWdodCAoYykgMjAwNiwgU2VhbiBFc3RhYnJvb2tzLgorIyBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgR251IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisjCisjIEltcG9ydCBQZXJmb3JjZSBicmFuY2hlcyBpbnRvIEdpdCByZXBvc2l0b3JpZXMuCisjIENoZWNraW5nIG91dCB0aGUgZmlsZXMgaXMgZG9uZSBieSBjYWxsaW5nIHRoZSBzdGFuZGFyZCBwNAorIyBjbGllbnQgd2hpY2ggeW91IG11c3QgaGF2ZSBwcm9wZXJseSBjb25maWd1cmVkIHlvdXJzZWxmCisjCisKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgZ2V0b3B0CisKK2Zyb20gc2lnbmFsIGltcG9ydCBzaWduYWwsIFwKKyAgIFNJR1BJUEUsIFNJR0lOVCwgU0lHX0RGTCwgXAorICAgZGVmYXVsdF9pbnRfaGFuZGxlcgorCitzaWduYWwoU0lHUElQRSwgU0lHX0RGTCkKK3MgPSBzaWduYWwoU0lHSU5ULCBTSUdfREZMKQoraWYgcyAhPSBkZWZhdWx0X2ludF9oYW5kbGVyOgorICAgc2lnbmFsKFNJR0lOVCwgcykKKworCitkZWYgZGllKG1zZywgKmFyZ3MpOgorICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgIG1zZyA9ICIlcyAlcyIgJSAobXNnLCBhKQorICAgIHByaW50ICJnaXQtcDRpbXBvcnQgZmF0YWwgZXJyb3I6IiwgbXNnCisgICAgc3lzLmV4aXQoMSkKKworZGVmIHVzYWdlKCk6CisgICAgcHJpbnQgIlVTQUdFOiBnaXQtcDRpbXBvcnQgWy1xfC12XSAgWy0tYXV0aG9ycz08ZmlsZT5dICBbLXQgPHRpbWV6b25lPl0gIFsvL3A0cmVwby9wYXRoIDxicmFuY2g+XSIKKyAgICBzeXMuZXhpdCgxKQorCit2ZXJib3NpdHkgPSAxCitsb2dmaWxlID0gIi9kZXYvbnVsbCIKK2lnbm9yZV93YXJuaW5ncyA9IEZhbHNlCitzdGl0Y2ggPSAwCisKK2RlZiByZXBvcnQobGV2ZWwsIG1zZywgKmFyZ3MpOgorICAgIGdsb2JhbCB2ZXJib3NpdHkKKyAgICBnbG9iYWwgbG9nZmlsZQorICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgIG1zZyA9ICIlcyAlcyIgJSAobXNnLCBhKQorICAgIGZkID0gb3Blbihsb2dmaWxlLCAiYSIpCisgICAgZmQud3JpdGVsaW5lcyhtc2cpCisgICAgZmQuY2xvc2UoKQorICAgIGlmIGxldmVsIDw9IHZlcmJvc2l0eToKKyAgICAgICAgcHJpbnQgbXNnCisKK2NsYXNzIHA0X2NvbW1hbmQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9yZXBvcGF0aCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdsb2JhbCBsb2dmaWxlCisgICAgICAgICAgICBzZWxmLnVzZXJsaXN0ID0ge30KKyAgICAgICAgICAgIGlmIF9yZXBvcGF0aFstMV0gPT0gJy8nOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3BhdGggPSBfcmVwb3BhdGhbOi0xXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9wYXRoID0gX3JlcG9wYXRoCisgICAgICAgICAgICBpZiBzZWxmLnJlcG9wYXRoWy00Ol0gIT0gIi8uLi4iOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3BhdGg9ICIlcy8uLi4iICUgc2VsZi5yZXBvcGF0aAorICAgICAgICAgICAgZj1vcy5wb3BlbigncDQgLVYgMj4+JXMnJWxvZ2ZpbGUsICdyYicpCisgICAgICAgICAgICBhID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgaWYgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBkaWUoIkNvdWxkIG5vdCBmaW5kIHRoZSBcInA0XCIgY29tbWFuZCIpCisKKyAgICBkZWYgcDQoc2VsZiwgY21kLCAqYXJncyk6CisgICAgICAgIGdsb2JhbCBsb2dmaWxlCisgICAgICAgIGNtZCA9ICIlcyAlcyIgJSAoY21kLCAnICcuam9pbihhcmdzKSkKKyAgICAgICAgcmVwb3J0KDIsICJQNDoiLCBjbWQpCisgICAgICAgIGY9b3MucG9wZW4oJ3A0IC1HICVzIDI+PiVzJyAlIChjbWQsbG9nZmlsZSksICdyYicpCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQobWFyc2hhbC5sb2FkKGYpKQorICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5yZXQgPSBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIGxpc3QKKworICAgIGRlZiBzeW5jKHNlbGYsIGlkLCBmb3JjZT1GYWxzZSwgdHJpY2s9RmFsc2UsIHRlc3Q9RmFsc2UpOgorICAgICAgICBpZiBmb3JjZToKKyAgICAgICAgICAgIHJldCA9IHNlbGYucDQoInN5bmMgLWYgJXNAJXMiJShzZWxmLnJlcG9wYXRoLCBpZCkpWzBdCisgICAgICAgIGVsaWYgdHJpY2s6CisgICAgICAgICAgICByZXQgPSBzZWxmLnA0KCJzeW5jIC1rICVzQCVzIiUoc2VsZi5yZXBvcGF0aCwgaWQpKVswXQorICAgICAgICBlbGlmIHRlc3Q6CisgICAgICAgICAgICByZXQgPSBzZWxmLnA0KCJzeW5jIC1uICVzQCVzIiUoc2VsZi5yZXBvcGF0aCwgaWQpKVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0ID0gc2VsZi5wNCgic3luYyAgICAlc0AlcyIlKHNlbGYucmVwb3BhdGgsIGlkKSlbMF0KKyAgICAgICAgaWYgcmV0Wydjb2RlJ10gPT0gImVycm9yIjoKKyAgICAgICAgICAgICBkYXRhID0gcmV0WydkYXRhJ10udXBwZXIoKQorICAgICAgICAgICAgIGlmIGRhdGEuZmluZCgnVklFVycpID4gMDoKKyAgICAgICAgICAgICAgICAgZGllKCJQZXJmb3JjZSByZXBvcnRzICVzIGlzIG5vdCBpbiBjbGllbnQgdmlldyIlIHNlbGYucmVwb3BhdGgpCisgICAgICAgICAgICAgZWxpZiBkYXRhLmZpbmQoJ1VQLVRPLURBVEUnKSA8IDA6CisgICAgICAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IHN5bmMgZmlsZXMgZnJvbSBwZXJmb3JjZSIsIHNlbGYucmVwb3BhdGgpCisKKyAgICBkZWYgY2hhbmdlcyhzZWxmLCBzaW5jZT0wKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgcmVjIGluIHNlbGYucDQoImNoYW5nZXMgJXNAJXMsI2hlYWQiICUgKHNlbGYucmVwb3BhdGgsIHNpbmNlKzEpKToKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChyZWNbJ2NoYW5nZSddKQorICAgICAgICAgICAgbGlzdC5yZXZlcnNlKCkKKyAgICAgICAgICAgIHJldHVybiBsaXN0CisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIGF1dGhvcnMoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmPW9wZW4oZmlsZW5hbWUpCisgICAgICAgIGZvciBsIGluIGYucmVhZGxpbmVzKCk6CisgICAgICAgICAgICBzZWxmLnVzZXJsaXN0W2xbOmwuZmluZCgnPScpXS5yc3RyaXAoKV0gPSBcCisgICAgICAgICAgICAgICAgICAgIChsW2wuZmluZCgnPScpKzE6bC5maW5kKCc8JyldLnJzdHJpcCgpLGxbbC5maW5kKCc8JykrMTpsLmZpbmQoJz4nKV0pCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmb3IgZixlIGluIHNlbGYudXNlcmxpc3QuaXRlbXMoKToKKyAgICAgICAgICAgICAgICByZXBvcnQoMiwgZiwgIjoiLCBlWzBdLCAiICA8IiwgZVsxXSwgIj4iKQorCisgICAgZGVmIF9nZXRfdXNlcihzZWxmLCBpZCk6CisgICAgICAgIGlmIG5vdCBzZWxmLnVzZXJsaXN0Lmhhc19rZXkoaWQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVzZXIgPSBzZWxmLnA0KCJ1c2VycyIsIGlkKVswXQorICAgICAgICAgICAgICAgIHNlbGYudXNlcmxpc3RbaWRdID0gKHVzZXJbJ0Z1bGxOYW1lJ10sIHVzZXJbJ0VtYWlsJ10pCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi51c2VybGlzdFtpZF0gPSAoaWQsICIiKQorICAgICAgICByZXR1cm4gc2VsZi51c2VybGlzdFtpZF0KKworICAgIGRlZiBfZm9ybWF0X2RhdGUoc2VsZiwgdGlja3MpOgorICAgICAgICBzeW1ib2w9JysnCisgICAgICAgIG5hbWUgPSB0aW1lLnR6bmFtZVswXQorICAgICAgICBvZmZzZXQgPSB0aW1lLnRpbWV6b25lCisgICAgICAgIGlmIHRpY2tzWzhdOgorICAgICAgICAgICAgbmFtZSA9IHRpbWUudHpuYW1lWzFdCisgICAgICAgICAgICBvZmZzZXQgPSB0aW1lLmFsdHpvbmUKKyAgICAgICAgaWYgb2Zmc2V0IDwgMDoKKyAgICAgICAgICAgIG9mZnNldCAqPSAtMQorICAgICAgICAgICAgc3ltYm9sID0gJy0nCisgICAgICAgIGxvY2FsbyA9ICIlcyUwMmQlMDJkICVzIiAlIChzeW1ib2wsIG9mZnNldCAvIDM2MDAsIG9mZnNldCAlIDM2MDAsIG5hbWUpCisgICAgICAgIHRpY2tzbyA9IHRpbWUuc3RyZnRpbWUoIiVhICViICVkICVIOiVNOiVTICVZIiwgdGlja3MpCisgICAgICAgIHJldHVybiAiJXMgJXMiICUgKHRpY2tzbywgbG9jYWxvKQorCisgICAgZGVmIHdoZXJlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wNCgid2hlcmUgJXMiICUgc2VsZi5yZXBvcGF0aClbLTFdWydwYXRoJ10KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgZGVzY3JpYmUoc2VsZiwgbnVtKToKKyAgICAgICAgZGVzYyA9IHNlbGYucDQoImRlc2NyaWJlIC1zIiwgbnVtKVswXQorICAgICAgICBzZWxmLm1zZyA9IGRlc2NbJ2Rlc2MnXQorICAgICAgICBzZWxmLmF1dGhvciwgc2VsZi5lbWFpbCA9IHNlbGYuX2dldF91c2VyKGRlc2NbJ3VzZXInXSkKKyAgICAgICAgc2VsZi5kYXRlID0gc2VsZi5fZm9ybWF0X2RhdGUodGltZS5sb2NhbHRpbWUobG9uZyhkZXNjWyd0aW1lJ10pKSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgZ2l0X2NvbW1hbmQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBzZWxmLmdpdCgiLS12ZXJzaW9uIilbMF1bMTI6XS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBkaWUoIkNvdWxkIG5vdCBmaW5kIHRoZSBcImdpdFwiIGNvbW1hbmQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmdpdGRpciA9IHNlbGYuZ2V0X3NpbmdsZSgicmV2LXBhcnNlIC0tZ2l0LWRpciIpCisgICAgICAgICAgICByZXBvcnQoMiwgImdkaXI6Iiwgc2VsZi5naXRkaXIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiTm90IGEgZ2l0IHJlcG9zaXRvcnkuLi4gZGlkIHlvdSBmb3JnZXQgdG8gXCJnaXQgaW5pdC1kYlwiID8iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNkdXAgPSBzZWxmLmdldF9zaW5nbGUoInJldi1wYXJzZSAtLXNob3ctY2R1cCIpCisgICAgICAgICAgICBpZiBzZWxmLmNkdXAgIT0gIiI6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5jZHVwKQorICAgICAgICAgICAgc2VsZi50b3BkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgcmVwb3J0KDIsICJ0b3BkaXI6Iiwgc2VsZi50b3BkaXIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IGZpbmQgdG9wIGdpdCBkaXJlY3RvcnkiKQorCisgICAgZGVmIGdpdChzZWxmLCBjbWQpOgorICAgICAgICBnbG9iYWwgbG9nZmlsZQorICAgICAgICByZXBvcnQoMiwgIkdJVDoiLCBjbWQpCisgICAgICAgIGY9b3MucG9wZW4oJ2dpdCAlcyAyPj4lcycgJSAoY21kLGxvZ2ZpbGUpLCAncmInKQorICAgICAgICByPWYucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5yZXQgPSBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBnZXRfc2luZ2xlKHNlbGYsIGNtZCk6CisgICAgICAgIHJldHVybiBzZWxmLmdpdChjbWQpWzBdLnJzdHJpcCgpCisKKyAgICBkZWYgY3VycmVudF9icmFuY2goc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RpdCA9IHNlbGYuZ2l0KCJyZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCIpWzBdCisgICAgICAgICAgICByZXR1cm4gc2VsZi5naXQoInN5bWJvbGljLXJlZiBIRUFEIilbMF1bMTE6XS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldF9jb25maWcoc2VsZiwgdmFyaWFibGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5naXQoInJlcG8tY29uZmlnIC0tZ2V0ICVzIiAlIHZhcmlhYmxlKVswXS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHNldF9jb25maWcoc2VsZiwgdmFyaWFibGUsIHZhbHVlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5naXQoInJlcG8tY29uZmlnICVzICVzIiUodmFyaWFibGUsIHZhbHVlKSApCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IHNldCAlcyB0byAiICUgdmFyaWFibGUsIHZhbHVlKQorCisgICAgZGVmIG1ha2VfdGFnKHNlbGYsIG5hbWUsIGhlYWQpOgorICAgICAgICBzZWxmLmdpdCgidGFnIC1mICVzICVzIiUobmFtZSxoZWFkKSkKKworICAgIGRlZiB0b3BfY2hhbmdlKHNlbGYsIGJyYW5jaCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGE9c2VsZi5nZXRfc2luZ2xlKCJuYW1lLXJldiAtLXRhZ3MgcmVmcy9oZWFkcy8lcyIgJSBicmFuY2gpCisgICAgICAgICAgICBsb2MgPSBhLmZpbmQoJyB0YWdzLycpICsgNgorICAgICAgICAgICAgaWYgYVtsb2M6bG9jKzNdICE9ICJwNC8iOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByZXR1cm4gaW50KGFbbG9jKzM6XVs6LTJdKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIHVwZGF0ZV9pbmRleChzZWxmKToKKyAgICAgICAgc2VsZi5naXQoImxzLWZpbGVzIC1tIC1kIC1vIC16IHwgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSAteiAtLXN0ZGluIikKKworICAgIGRlZiBjaGVja291dChzZWxmLCBicmFuY2gpOgorICAgICAgICBzZWxmLmdpdCgiY2hlY2tvdXQgJXMiICUgYnJhbmNoKQorCisgICAgZGVmIHJlcG9pbnRfaGVhZChzZWxmLCBicmFuY2gpOgorICAgICAgICBzZWxmLmdpdCgic3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy8lcyIgJSBicmFuY2gpCisKKyAgICBkZWYgcmVtb3ZlX2ZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLmdpdCgibHMtZmlsZXMgfCB4YXJncyBybSIpCisKKyAgICBkZWYgY2xlYW5fZGlyZWN0b3JpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZ2l0KCJjbGVhbiAtZCIpCisKKyAgICBkZWYgZnJlc2hfYnJhbmNoKHNlbGYsIGJyYW5jaCk6CisgICAgICAgIHJlcG9ydCgxLCAiQ3JlYXRpbmcgbmV3IGJyYW5jaCIsIGJyYW5jaCkKKyAgICAgICAgc2VsZi5naXQoImxzLWZpbGVzIHwgeGFyZ3Mgcm0iKQorICAgICAgICBvcy5yZW1vdmUoIi5naXQvaW5kZXgiKQorICAgICAgICBzZWxmLnJlcG9pbnRfaGVhZChicmFuY2gpCisgICAgICAgIHNlbGYuZ2l0KCJjbGVhbiAtZCIpCisKKyAgICBkZWYgYmFzZWRpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudG9wZGlyCisKKyAgICBkZWYgY29tbWl0KHNlbGYsIGF1dGhvciwgZW1haWwsIGRhdGUsIG1zZywgaWQpOgorICAgICAgICBzZWxmLnVwZGF0ZV9pbmRleCgpCisgICAgICAgIGZkPW9wZW4oIi5tc2ciLCAidyIpCisgICAgICAgIGZkLndyaXRlbGluZXMobXNnKQorICAgICAgICBmZC5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2VsZi5nZXRfc2luZ2xlKCJyZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCIpCisgICAgICAgICAgICAgICAgaGVhZCA9ICItcCBIRUFEIgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgY3VycmVudCA9ICIiCisgICAgICAgICAgICAgICAgaGVhZCA9ICIiCisgICAgICAgIHRyZWUgPSBzZWxmLmdldF9zaW5nbGUoIndyaXRlLXRyZWUiKQorICAgICAgICBmb3IgcixsIGluIFsoJ0RBVEUnLGRhdGUpLCgnTkFNRScsYXV0aG9yKSwoJ0VNQUlMJyxlbWFpbCldOgorICAgICAgICAgICAgb3MuZW52aXJvblsnR0lUX0FVVEhPUl8lcyclcl0gPSBsCisgICAgICAgICAgICBvcy5lbnZpcm9uWydHSVRfQ09NTUlUVEVSXyVzJyVyXSA9IGwKKyAgICAgICAgY29tbWl0ID0gc2VsZi5nZXRfc2luZ2xlKCJjb21taXQtdHJlZSAlcyAlcyA8IC5tc2ciICUgKHRyZWUsaGVhZCkpCisgICAgICAgIG9zLnJlbW92ZSgiLm1zZyIpCisgICAgICAgIHNlbGYubWFrZV90YWcoInA0LyVzIiVpZCwgY29tbWl0KQorICAgICAgICBzZWxmLmdpdCgidXBkYXRlLXJlZiBIRUFEICVzICVzIiAlIChjb21taXQsIGN1cnJlbnQpICkKKworCit0cnk6CisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAicWh2dDoiLAorICAgICAgICAgICAgICAgICAgICBbImF1dGhvcnM9IiwiaGVscCIsInN0aXRjaD0iLCJ0aW1lem9uZT0iLCJsb2c9IiwiaWdub3JlIl0pCitleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorICAgIHVzYWdlKCkKKworZm9yIG8sIGEgaW4gb3B0czoKKyAgICBpZiBvID09ICItcSI6CisgICAgICAgIHZlcmJvc2l0eSA9IDAKKyAgICBpZiBvID09ICItdiI6CisgICAgICAgIHZlcmJvc2l0eSArPSAxCisgICAgaWYgbyBpbiAoIi0tbG9nIik6CisgICAgICAgIGxvZ2ZpbGUgPSBhCisgICAgaWYgbyBpbiAoIi1oIiwgIi0taGVscCIpOgorICAgICAgICB1c2FnZSgpCisgICAgaWYgbyBpbiAoIi0taWdub3JlIik6CisgICAgICAgIGlnbm9yZV93YXJuaW5ncyA9IFRydWUKKworZ2l0ID0gZ2l0X2NvbW1hbmQoKQorYnJhbmNoPWdpdC5jdXJyZW50X2JyYW5jaCgpCisKK2ZvciBvLCBhIGluIG9wdHM6CisgICAgaWYgbyBpbiAoIi10IiwgIi0tdGltZXpvbmUiKToKKyAgICAgICAgZ2l0LnNldF9jb25maWcoInBlcmZvcmNlLnRpbWV6b25lIiwgYSkKKyAgICBpZiBvIGluICgiLS1zdGl0Y2giKToKKyAgICAgICAgZ2l0LnNldF9jb25maWcoInBlcmZvcmNlLiVzLnBhdGgiICUgYnJhbmNoLCBhKQorICAgICAgICBzdGl0Y2ggPSAxCisKK2lmIGxlbihhcmdzKSA9PSAyOgorICAgIGJyYW5jaCA9IGFyZ3NbMV0KKyAgICBnaXQuY2hlY2tvdXQoYnJhbmNoKQorICAgIGlmIGJyYW5jaCA9PSBnaXQuY3VycmVudF9icmFuY2goKToKKyAgICAgICAgZGllKCJCcmFuY2ggJXMgYWxyZWFkeSBleGlzdHMhIiAlIGJyYW5jaCkKKyAgICByZXBvcnQoMSwgIlNldHRpbmcgcGVyZm9yY2UgdG8gIiwgYXJnc1swXSkKKyAgICBnaXQuc2V0X2NvbmZpZygicGVyZm9yY2UuJXMucGF0aCIgJSBicmFuY2gsIGFyZ3NbMF0pCitlbGlmIGxlbihhcmdzKSAhPSAwOgorICAgIGRpZSgiWW91IG11c3Qgc3BlY2lmeSB0aGUgcGVyZm9yY2UgLy9kZXBvdC9wYXRoIGFuZCBnaXQgYnJhbmNoIikKKworcDRwYXRoID0gZ2l0LmdldF9jb25maWcoInBlcmZvcmNlLiVzLnBhdGgiICUgYnJhbmNoKQoraWYgcDRwYXRoID09IE5vbmU6CisgICAgZGllKCJEbyBub3Qga25vdyBQZXJmb3JjZSAvL2RlcG90L3BhdGggZm9yIGdpdCBicmFuY2giLCBicmFuY2gpCisKK3A0ID0gcDRfY29tbWFuZChwNHBhdGgpCisKK2ZvciBvLCBhIGluIG9wdHM6CisgICAgaWYgbyBpbiAoIi1hIiwgIi0tYXV0aG9ycyIpOgorICAgICAgICBwNC5hdXRob3JzKGEpCisKK2xvY2FsZGlyID0gZ2l0LmJhc2VkaXIoKQoraWYgcDQud2hlcmUoKVs6bGVuKGxvY2FsZGlyKV0gIT0gbG9jYWxkaXI6CisgICAgcmVwb3J0KDEsICIqKldBUk5JTkcqKiBBcHBlYXJzIHA0IGNsaWVudCBpcyBtaXNjb25maWd1cmVkIikKKyAgICByZXBvcnQoMSwgIiAgIGZvciBzeW5jIGZyb20gJXMgdG8gJXMiICUgKHA0LnJlcG9wYXRoLCBsb2NhbGRpcikpCisgICAgaWYgaWdub3JlX3dhcm5pbmdzICE9IFRydWU6CisgICAgICAgIGRpZSgiUmVjb25maWd1cmUgb3IgdXNlIFwiLS1pZ25vcmVcIiBvbiBjb21tYW5kIGxpbmUiKQorCitpZiBzdGl0Y2ggPT0gMDoKKyAgICB0b3AgPSBnaXQudG9wX2NoYW5nZShicmFuY2gpCitlbHNlOgorICAgIHRvcCA9IDAKK2NoYW5nZXMgPSBwNC5jaGFuZ2VzKHRvcCkKK2NvdW50ID0gbGVuKGNoYW5nZXMpCitpZiBjb3VudCA9PSAwOgorICAgIHJlcG9ydCgxLCAiQWxyZWFkeSB1cCB0byBkYXRlLi4uIikKKyAgICBzeXMuZXhpdCgwKQorCitwdHogPSBnaXQuZ2V0X2NvbmZpZygicGVyZm9yY2UudGltZXpvbmUiKQoraWYgcHR6OgorICAgIHJlcG9ydCgxLCAiU2V0dGluZyB0aW1lem9uZSB0byIsIHB0eikKKyAgICBvcy5lbnZpcm9uWydUWiddID0gcHR6CisgICAgdGltZS50enNldCgpCisKK2lmIHN0aXRjaCA9PSAxOgorICAgIGdpdC5yZW1vdmVfZmlsZXMoKQorICAgIGdpdC5jbGVhbl9kaXJlY3RvcmllcygpCisgICAgcDQuc3luYyhjaGFuZ2VzWzBdLCBmb3JjZT1UcnVlKQorZWxpZiB0b3AgPT0gMCBhbmQgYnJhbmNoICE9IGdpdC5jdXJyZW50X2JyYW5jaCgpOgorICAgIHA0LnN5bmMoY2hhbmdlc1swXSwgdGVzdD1UcnVlKQorICAgIHJlcG9ydCgxLCAiQ3JlYXRpbmcgbmV3IGluaXRpYWwgY29tbWl0Iik7CisgICAgZ2l0LmZyZXNoX2JyYW5jaChicmFuY2gpCisgICAgcDQuc3luYyhjaGFuZ2VzWzBdLCBmb3JjZT1UcnVlKQorZWxzZToKKyAgICBwNC5zeW5jKGNoYW5nZXNbMF0sIHRyaWNrPVRydWUpCisKK3JlcG9ydCgxLCAicHJvY2Vzc2luZyAlcyBjaGFuZ2VzIGZyb20gcDQgKCVzKSB0byBnaXQgKCVzKSIgJSAoY291bnQsIHA0LnJlcG9wYXRoLCBicmFuY2gpKQorZm9yIGlkIGluIGNoYW5nZXM6CisgICAgcmVwb3J0KDEsICJJbXBvcnRpbmcgY2hhbmdlc2V0IiwgaWQpCisgICAgY2hhbmdlID0gcDQuZGVzY3JpYmUoaWQpCisgICAgcDQuc3luYyhpZCkKKyAgICBnaXQuY29tbWl0KGNoYW5nZS5hdXRob3IsIGNoYW5nZS5lbWFpbCwgY2hhbmdlLmRhdGUsIGNoYW5nZS5tc2csIGlkKQorICAgIGlmIHN0aXRjaCA9PSAxOgorICAgICAgICBnaXQuY2xlYW5fZGlyZWN0b3JpZXMoKQorICAgICAgICBzdGl0Y2ggPSAwCisKZGlmZiAtLWdpdCBhL2dpdC1wYXJzZS1yZW1vdGUuc2ggYi9naXQtcGFyc2UtcmVtb3RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4N2YwODgKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcGFyc2UtcmVtb3RlLnNoCkBAIC0wLDAgKzEsMjExIEBACisjIS9iaW4vc2gKKworIyBnaXQtbHMtcmVtb3RlIGNvdWxkIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgYSBnaXQgbWFuYWdlZCByZXBvc2l0b3J5OworIyB0aGlzIHdvdWxkIGZhaWwgaW4gdGhhdCBjYXNlIGFuZCB3b3VsZCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlLgorR0lUX0RJUj0kKGdpdC1yZXYtcGFyc2UgLS1naXQtZGlyIDI+L2Rldi9udWxsKSB8fCA6OworCitnZXRfZGF0YV9zb3VyY2UgKCkgeworCWNhc2UgIiQxIiBpbgorCSovKikKKwkJIyBOb3Qgc28gZmFzdC4JVGhpcyBjb3VsZCBiZSB0aGUgcGFydGlhbCBVUkwgc2hvcnRoYW5kLi4uCisJCXRva2VuPSQoZXhwciAieiQxIiA6ICd6XChbXi9dKlwpLycpCisJCXJlbWFpbmRlcj0kKGV4cHIgInokMSIgOiAnelteL10qL1woLipcKScpCisJCWlmIHRlc3QgIiQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0ICJyZW1vdGUuJHRva2VuLnVybCIpIgorCQl0aGVuCisJCQllY2hvIGNvbmZpZy1wYXJ0aWFsCisJCWVsaWYgdGVzdCAtZiAiJEdJVF9ESVIvYnJhbmNoZXMvJHRva2VuIgorCQl0aGVuCisJCQllY2hvIGJyYW5jaGVzLXBhcnRpYWwKKwkJZWxzZQorCQkJZWNobyAnJworCQlmaQorCQk7OworCSopCisJCWlmIHRlc3QgIiQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0ICJyZW1vdGUuJDEudXJsIikiCisJCXRoZW4KKwkJCWVjaG8gY29uZmlnCisJCWVsaWYgdGVzdCAtZiAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIKKwkJdGhlbgorCQkJZWNobyByZW1vdGVzCisJCWVsaWYgdGVzdCAtZiAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiCisJCXRoZW4KKwkJCWVjaG8gYnJhbmNoZXMKKwkJZWxzZQorCQkJZWNobyAnJworCQlmaSA7OworCWVzYWMKK30KKworZ2V0X3JlbW90ZV91cmwgKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCScnKQorCQllY2hvICIkMSIgOzsKKwljb25maWctcGFydGlhbCkKKwkJdG9rZW49JChleHByICJ6JDEiIDogJ3pcKFteL10qXCkvJykKKwkJcmVtYWluZGVyPSQoZXhwciAieiQxIiA6ICd6W14vXSovXCguKlwpJykKKwkJdXJsPSQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0ICJyZW1vdGUuJHRva2VuLnVybCIpCisJCWVjaG8gIiR1cmwvJHJlbWFpbmRlciIKKwkJOzsKKwljb25maWcpCisJCWdpdC1yZXBvLWNvbmZpZyAtLWdldCAicmVtb3RlLiQxLnVybCIKKwkJOzsKKwlyZW1vdGVzKQorCQlzZWQgLW5lICcvXlVSTDogKi97CisJCQlzLy8vcAorCQkJcQorCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIgOzsKKwlicmFuY2hlcykKKwkJc2VkIC1lICdzLyMuKi8vJyAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiIDs7CisJYnJhbmNoZXMtcGFydGlhbCkKKwkJdG9rZW49JChleHByICJ6JDEiIDogJ3pcKFteL10qXCkvJykKKwkJcmVtYWluZGVyPSQoZXhwciAieiQxIiA6ICd6W14vXSovXCguKlwpJykKKwkJdXJsPSQoc2VkIC1lICdzLyMuKi8vJyAiJEdJVF9ESVIvYnJhbmNoZXMvJHRva2VuIikKKwkJZWNobyAiJHVybC8kcmVtYWluZGVyIgorCQk7OworCSopCisJCWRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtdXJsICQxIiA7OworCWVzYWMKK30KKworZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX3B1c2ggKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCScnIHwgY29uZmlnLXBhcnRpYWwgfCBicmFuY2hlcyB8IGJyYW5jaGVzLXBhcnRpYWwpCisJCTs7ICMgbm8gZGVmYXVsdCBwdXNoIG1hcHBpbmcsIGp1c3Qgc2VuZCBtYXRjaGluZyByZWZzLgorCWNvbmZpZykKKwkJZ2l0LXJlcG8tY29uZmlnIC0tZ2V0LWFsbCAicmVtb3RlLiQxLnB1c2giIDs7CisJcmVtb3RlcykKKwkJc2VkIC1uZSAnL15QdXNoOiAqL3sKKwkJCXMvLy9wCisJCX0nICIkR0lUX0RJUi9yZW1vdGVzLyQxIiA7OworCSopCisJCWRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtZGVmYXVsdC1yZWYtZm9yLXB1c2ggJDEiIDs7CisJZXNhYworfQorCisjIFN1YnJvdXRpbmUgdG8gY2Fub25pY2FsaXplIHJlbW90ZTpsb2NhbCBub3RhdGlvbi4KK2Nhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggKCkgeworCSMgTGVhdmUgb25seSB0aGUgZmlyc3Qgb25lIGFsb25lOyBhZGQgcHJlZml4IC4gdG8gdGhlIHJlc3QKKwkjIHRvIHByZXZlbnQgdGhlIHNlY29uZGFyeSBicmFuY2hlcyB0byBiZSBtZXJnZWQgYnkgZGVmYXVsdC4KKwlkb3RfcHJlZml4PQorCWZvciByZWYKKwlkbworCQlmb3JjZT0KKwkJY2FzZSAiJHJlZiIgaW4KKwkJKyopCisJCQlyZWY9JChleHByICJ6JHJlZiIgOiAneitcKC4qXCknKQorCQkJZm9yY2U9KworCQkJOzsKKwkJZXNhYworCQlleHByICJ6JHJlZiIgOiAnei4qOicgPi9kZXYvbnVsbCB8fCByZWY9IiR7cmVmfToiCisJCXJlbW90ZT0kKGV4cHIgInokcmVmIiA6ICd6XChbXjpdKlwpOicpCisJCWxvY2FsPSQoZXhwciAieiRyZWYiIDogJ3pbXjpdKjpcKC4qXCknKQorCQljYXNlICIkcmVtb3RlIiBpbgorCQknJykgcmVtb3RlPUhFQUQgOzsKKwkJcmVmcy9oZWFkcy8qIHwgcmVmcy90YWdzLyogfCByZWZzL3JlbW90ZXMvKikgOzsKKwkJaGVhZHMvKiB8IHRhZ3MvKiB8IHJlbW90ZXMvKiApIHJlbW90ZT0icmVmcy8kcmVtb3RlIiA7OworCQkqKSByZW1vdGU9InJlZnMvaGVhZHMvJHJlbW90ZSIgOzsKKwkJZXNhYworCQljYXNlICIkbG9jYWwiIGluCisJCScnKSBsb2NhbD0gOzsKKwkJcmVmcy9oZWFkcy8qIHwgcmVmcy90YWdzLyogfCByZWZzL3JlbW90ZXMvKikgOzsKKwkJaGVhZHMvKiB8IHRhZ3MvKiB8IHJlbW90ZXMvKiApIGxvY2FsPSJyZWZzLyRsb2NhbCIgOzsKKwkJKikgbG9jYWw9InJlZnMvaGVhZHMvJGxvY2FsIiA7OworCQllc2FjCisKKwkJaWYgbG9jYWxfcmVmX25hbWU9JChleHByICJ6JGxvY2FsIiA6ICd6cmVmcy9cKC4qXCknKQorCQl0aGVuCisJCSAgIGdpdC1jaGVjay1yZWYtZm9ybWF0ICIkbG9jYWxfcmVmX25hbWUiIHx8CisJCSAgIGRpZSAiKiByZWZ1c2luZyB0byBjcmVhdGUgZnVubnkgcmVmICckbG9jYWxfcmVmX25hbWUnIGxvY2FsbHkiCisJCWZpCisJCWVjaG8gIiR7ZG90X3ByZWZpeH0ke2ZvcmNlfSR7cmVtb3RlfToke2xvY2FsfSIKKwkJZG90X3ByZWZpeD0uCisJZG9uZQorfQorCisjIFJldHVybnMgbGlzdCBvZiBzcmM6IChubyBzdG9yZSksIG9yIHNyYzpkc3QgKHN0b3JlKQorZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX2ZldGNoICgpIHsKKwlkYXRhX3NvdXJjZT0kKGdldF9kYXRhX3NvdXJjZSAiJDEiKQorCWNhc2UgIiRkYXRhX3NvdXJjZSIgaW4KKwknJyB8IGNvbmZpZy1wYXJ0aWFsIHwgYnJhbmNoZXMtcGFydGlhbCkKKwkJZWNobyAiSEVBRDoiIDs7CisJY29uZmlnKQorCQljYW5vbl9yZWZzX2xpc3RfZm9yX2ZldGNoIFwKKwkJCSQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0LWFsbCAicmVtb3RlLiQxLmZldGNoIikgOzsKKwlicmFuY2hlcykKKwkJcmVtb3RlX2JyYW5jaD0kKHNlZCAtbmUgJy8jL3MvLiojLy9wJyAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiKQorCQljYXNlICIkcmVtb3RlX2JyYW5jaCIgaW4gJycpIHJlbW90ZV9icmFuY2g9bWFzdGVyIDs7IGVzYWMKKwkJZWNobyAicmVmcy9oZWFkcy8ke3JlbW90ZV9icmFuY2h9OnJlZnMvaGVhZHMvJDEiCisJCTs7CisJcmVtb3RlcykKKwkJIyBUaGlzIHByZWZpeGVzIHRoZSBzZWNvbmQgYW5kIGxhdGVyIGRlZmF1bHQgcmVmc3BlY3MKKwkJIyB3aXRoIGEgJy4nLCB0byBzaWduYWwgZ2l0LWZldGNoIHRvIG1hcmsgdGhlbQorCQkjIG5vdC1mb3ItbWVyZ2UuCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggJChzZWQgLW5lICcvXlB1bGw6ICoveworCQkJCQkJcy8vL3AKKwkJCQkJfScgIiRHSVRfRElSL3JlbW90ZXMvJDEiKQorCQk7OworCSopCisJCWRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtZGVmYXVsdC1yZWYtZm9yLXB1c2ggJDEiIDs7CisJZXNhYworfQorCitnZXRfcmVtb3RlX3JlZnNfZm9yX3B1c2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItcHVzaC4iIDs7CisJMSkgZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX3B1c2ggIiRAIiA7OworCSopIHNoaWZ0OyBlY2hvICIkQCIgOzsKKwllc2FjCit9CisKK2dldF9yZW1vdGVfcmVmc19mb3JfZmV0Y2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApCisJICAgIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItZmV0Y2guIiA7OworCTEpCisJICAgIGdldF9yZW1vdGVfZGVmYXVsdF9yZWZzX2Zvcl9mZXRjaCAiJEAiIDs7CisJKikKKwkgICAgc2hpZnQKKwkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkgICAgZm9yIHJlZgorCSAgICBkbworCQlpZiB0ZXN0ICIkdGFnX2p1c3Rfc2VlbiIKKwkJdGhlbgorCQkgICAgZWNobyAicmVmcy90YWdzLyR7cmVmfTpyZWZzL3RhZ3MvJHtyZWZ9IgorCQkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkJICAgIGNvbnRpbnVlCisJCWVsc2UKKwkJICAgIGNhc2UgIiRyZWYiIGluCisJCSAgICB0YWcpCisJCQl0YWdfanVzdF9zZWVuPXllcworCQkJY29udGludWUKKwkJCTs7CisJCSAgICBlc2FjCisJCWZpCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggIiRyZWYiCisJICAgIGRvbmUKKwkgICAgOzsKKwllc2FjCit9CisKK3Jlc29sdmVfYWx0ZXJuYXRlcyAoKSB7CisJIyBvcmlnaW5hbCBVUkwgKHh4eC5naXQpCisJdG9wXz1gZXhwciAieiQxIiA6ICd6XChbXjpdKjovKlteL10qXCkvJ2AKKwl3aGlsZSByZWFkIHBhdGgKKwlkbworCQljYXNlICIkcGF0aCIgaW4KKwkJXCMqIHwgJycpCisJCQljb250aW51ZSA7OworCQkvKikKKwkJCWVjaG8gIiR0b3BfJHBhdGgvIiA7OworCQkuLi8qKQorCQkJIyByZWxhdGl2ZSAtLSB1Z2x5IGJ1dCBzZWVtcyB0byB3b3JrLgorCQkJZWNobyAiJDEvb2JqZWN0cy8kcGF0aC8iIDs7CisJCSopCisJCQkjIGV4aXQgY29kZSBtYXkgbm90IGJlIGNhdWdodCBieSB0aGUgcmVhZGVyLgorCQkJZWNobyAiYmFkIGFsdGVybmF0ZTogJHBhdGgiCisJCQlleGl0IDEgOzsKKwkJZXNhYworCWRvbmUKK30KZGlmZiAtLWdpdCBhL2dpdC1wcnVuZS5zaCBiL2dpdC1wcnVuZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNWE1ZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXBydW5lLnNoCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nWy1uXSBbLS1dIFs8aGVhZD4uLi5dJworLiBnaXQtc2gtc2V0dXAKKworZHJ5cnVuPQorZWNobz0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworICAgIGNhc2UgIiQxIiBpbgorICAgIC1uKSBkcnlydW49LW4gZWNobz1lY2hvIDs7CisgICAgLS0pIGJyZWFrIDs7CisgICAgLSopIHVzYWdlIDs7CisgICAgKikgIGJyZWFrIDs7CisgICAgZXNhYworICAgIHNoaWZ0OworZG9uZQorCitzeW5jCitjYXNlICIkIyIgaW4KKzApIGdpdC1mc2NrLW9iamVjdHMgLS1mdWxsIC0tY2FjaGUgLS11bnJlYWNoYWJsZSA7OworKikgZ2l0LWZzY2stb2JqZWN0cyAtLWZ1bGwgLS1jYWNoZSAtLXVucmVhY2hhYmxlICQoZ2l0LXJldi1wYXJzZSAtLWFsbCkgIiRAIiA7OworZXNhYyB8CisKK3NlZCAtbmUgJy91bnJlYWNoYWJsZSAveworICAgIHMvdW5yZWFjaGFibGUgW14gXVteIF0qIC8vCisgICAgc3xcKC4uXCl8XDEvfHAKK30nIHwgeworCWNkICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiIHx8IGV4aXQKKwl4YXJncyAkZWNobyBybSAtZgorCXJtZGlyIDI+L2Rldi9udWxsIFswLTlhLWZdWzAtOWEtZl0KK30KKworZ2l0LXBydW5lLXBhY2tlZCAkZHJ5cnVuCisKK2lmIHJlZHVuZGFudD0kKGdpdC1wYWNrLXJlZHVuZGFudCAtLWFsbCAyPi9kZXYvbnVsbCkgJiYgdGVzdCAiIiAhPSAiJHJlZHVuZGFudCIKK3RoZW4KKwlpZiB0ZXN0ICIiID0gIiRkcnlydW4iCisJdGhlbgorCQllY2hvICIkcmVkdW5kYW50IiB8IHhhcmdzIHJtIC1mCisJZWxzZQorCQllY2hvIHJtIC1mICIkcmVkdW5kYW50IgorCWZpCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LXB1bGwuc2ggYi9naXQtcHVsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjExYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXB1bGwuc2gKQEAgLTAsMCArMSwxMDMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgRmV0Y2ggb25lIG9yIG1vcmUgcmVtb3RlIHJlZnMgYW5kIG1lcmdlIGl0L3RoZW0gaW50byB0aGUgY3VycmVudCBIRUFELgorCitVU0FHRT0nWy1uIHwgLS1uby1zdW1tYXJ5XSBbLS1uby1jb21taXRdIFstcyBzdHJhdGVneV0uLi4gWzxmZXRjaC1vcHRpb25zPl0gPHJlcG8+IDxoZWFkPi4uLicKK0xPTkdfVVNBR0U9J0ZldGNoIG9uZSBvciBtb3JlIHJlbW90ZSByZWZzIGFuZCBtZXJnZSBpdC90aGVtIGludG8gdGhlIGN1cnJlbnQgSEVBRC4nCisuIGdpdC1zaC1zZXR1cAorCitzdHJhdGVneV9hcmdzPSBub19zdW1tYXJ5PSBub19jb21taXQ9Cit3aGlsZSBjYXNlICIkIywkMSIgaW4gMCkgYnJlYWsgOzsgKiwtKikgOzsgKikgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktbnwtLW58LS1ub3wtLW5vLXwtLW5vLXN8LS1uby1zdXwtLW5vLXN1bXwtLW5vLXN1bW18XAorCQktLW5vLXN1bW1hfC0tbm8tc3VtbWFyfC0tbm8tc3VtbWFyeSkKKwkJbm9fc3VtbWFyeT0tbiA7OworCS0tbm8tY3wtLW5vLWNvfC0tbm8tY29tfC0tbm8tY29tbXwtLW5vLWNvbW1pfC0tbm8tY29tbWl0KQorCQlub19jb21taXQ9LS1uby1jb21taXQgOzsKKwktcz0qfC0tcz0qfC0tc3Q9KnwtLXN0cj0qfC0tc3RyYT0qfC0tc3RyYXQ9KnwtLXN0cmF0ZT0qfFwKKwkJLS1zdHJhdGVnPSp8LS1zdHJhdGVneT0qfFwKKwktc3wtLXN8LS1zdHwtLXN0cnwtLXN0cmF8LS1zdHJhdHwtLXN0cmF0ZXwtLXN0cmF0ZWd8LS1zdHJhdGVneSkKKwkJY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkJc3RyYXRlZ3k9YGV4cHIgIiQxIiA6ICctW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCXN0cmF0ZWd5PSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJc3RyYXRlZ3lfYXJncz0iJHtzdHJhdGVneV9hcmdzfS1zICRzdHJhdGVneSAiCisJCTs7CisJLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorCQl1c2FnZQorCQk7OworCS0qKQorCQkjIFBhc3MgdGhydSBhbnl0aGluZyB0aGF0IGlzIG1lYW50IGZvciBmZXRjaC4KKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworb3JpZ19oZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSB8fCBkaWUgIlB1bGxpbmcgaW50byBhIGJsYWNrIGhvbGU/IgorZ2l0LWZldGNoIC0tdXBkYXRlLWhlYWQtb2sgIiRAIiB8fCBleGl0IDEKKworY3Vycl9oZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQoraWYgdGVzdCAiJGN1cnJfaGVhZCIgIT0gIiRvcmlnX2hlYWQiCit0aGVuCisJIyBUaGUgZmV0Y2ggaW52b2x2ZWQgdXBkYXRpbmcgdGhlIGN1cnJlbnQgYnJhbmNoLgorCisJIyBUaGUgd29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXggZmlsZSBpcyBzdGlsbCBiYXNlZCBvbiB0aGUKKwkjICRvcmlnX2hlYWQgY29tbWl0LCBidXQgd2UgYXJlIG1lcmdpbmcgaW50byAkY3Vycl9oZWFkLgorCSMgRmlyc3QgdXBkYXRlIHRoZSB3b3JraW5nIHRyZWUgdG8gbWF0Y2ggJGN1cnJfaGVhZC4KKworCWVjaG8gPiYyICJXYXJuaW5nOiBmZXRjaCB1cGRhdGVkIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkLiIKKwllY2hvID4mMiAiV2FybmluZzogZmFzdCBmb3J3YXJkaW5nIHlvdXIgd29ya2luZyB0cmVlIGZyb20iCisJZWNobyA+JjIgIldhcm5pbmc6ICRvcmlnX2hlYWQgY29tbWl0LiIKKwlnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorCWdpdC1yZWFkLXRyZWUgLXUgLW0gIiRvcmlnX2hlYWQiICIkY3Vycl9oZWFkIiB8fAorCQlkaWUgJ0Nhbm5vdCBmYXN0LWZvcndhcmQgeW91ciB3b3JraW5nIHRyZWUuCitBZnRlciBtYWtpbmcgc3VyZSB0aGF0IHlvdSBzYXZlZCBhbnl0aGluZyBwcmVjaW91cyBmcm9tCiskIGdpdCBkaWZmICckb3JpZ19oZWFkJworb3V0cHV0LCBydW4KKyQgZ2l0IHJlc2V0IC0taGFyZAordG8gcmVjb3Zlci4nCisKK2ZpCisKK21lcmdlX2hlYWQ9JChzZWQgLWUgJy8Jbm90LWZvci1tZXJnZQkvZCcgXAorCS1lICdzLwkuKi8vJyAiJEdJVF9ESVIiL0ZFVENIX0hFQUQgfCBcCisJdHIgJ1wwMTInICcgJykKKworY2FzZSAiJG1lcmdlX2hlYWQiIGluCisnJykKKwllY2hvID4mMiAiTm8gY2hhbmdlcy4iCisJZXhpdCAwCisJOzsKKz8qJyAnPyopCisJdmFyPWBnaXQtcmVwby1jb25maWcgLS1nZXQgcHVsbC5vY3RvcHVzYAorCWlmIHRlc3QgLW4gIiR2YXIiCisJdGhlbgorCQlzdHJhdGVneV9kZWZhdWx0X2FyZ3M9Ii1zICR2YXIiCisJZmkKKwk7OworKikKKwl2YXI9YGdpdC1yZXBvLWNvbmZpZyAtLWdldCBwdWxsLnR3b2hlYWRgCisJaWYgdGVzdCAtbiAiJHZhciIKKyAgICAgICAgdGhlbgorCQlzdHJhdGVneV9kZWZhdWx0X2FyZ3M9Ii1zICR2YXIiCisJZmkKKwk7OworZXNhYworCitjYXNlICIkc3RyYXRlZ3lfYXJncyIgaW4KKycnKQorCXN0cmF0ZWd5X2FyZ3M9JHN0cmF0ZWd5X2RlZmF1bHRfYXJncworCTs7Citlc2FjCisKK21lcmdlX25hbWU9JChnaXQtZm10LW1lcmdlLW1zZyA8IiRHSVRfRElSL0ZFVENIX0hFQUQiKQorZ2l0LW1lcmdlICRub19zdW1tYXJ5ICRub19jb21taXQgJHN0cmF0ZWd5X2FyZ3MgIiRtZXJnZV9uYW1lIiBIRUFEICRtZXJnZV9oZWFkCmRpZmYgLS1naXQgYS9naXQtcHVzaC5zaCBiL2dpdC1wdXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxMGNhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcHVzaC5zaApAQCAtMCwwICsxLDg3IEBACisjIS9iaW4vc2gKKworVVNBR0U9J1stLWFsbF0gWy0tdGFnc10gWy0tZm9yY2VdIDxyZXBvc2l0b3J5PiBbPHJlZnNwZWM+Li4uXScKKy4gZ2l0LXNoLXNldHVwCisKKyMgUGFyc2Ugb3V0IHBhcmFtZXRlcnMgYW5kIHRoZW4gc3RvcCBhdCByZW1vdGUsIHNvIHRoYXQgd2UgY2FuCisjIHRyYW5zbGF0ZSBpdCB1c2luZyAuZ2l0L2JyYW5jaGVzIGluZm9ybWF0aW9uCitoYXNfYWxsPQoraGFzX2ZvcmNlPQoraGFzX2V4ZWM9CitoYXNfdGhpbj0tLXRoaW4KK3JlbW90ZT0KK2RvX3RhZ3M9CisKK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS0tYWxsKQorCQloYXNfYWxsPS0tYWxsIDs7CisJLS10YWdzKQorCQlkb190YWdzPXllcyA7OworCS0tZm9yY2UpCisJCWhhc19mb3JjZT0tLWZvcmNlIDs7CisJLS1leGVjPSopCisJCWhhc19leGVjPSIkMSIgOzsKKwktLXRoaW4pCisJCTs7ICMgbm9vcAorCS0tbm8tdGhpbikKKwkJaGFzX3RoaW49IDs7CisJLSopCisgICAgICAgICAgICAgICAgdXNhZ2UgOzsKKyAgICAgICAgKikKKwkJc2V0IHggIiRAIgorCQlzaGlmdAorCQlicmVhayA7OworCWVzYWMKKwlzaGlmdAorZG9uZQorY2FzZSAiJCMiIGluCiswKQorCWVjaG8gIldoZXJlIHdvdWxkIHlvdSB3YW50IHRvIHB1c2ggdG9kYXk/IgorICAgICAgICB1c2FnZSA7OworZXNhYworCisuIGdpdC1wYXJzZS1yZW1vdGUKK3JlbW90ZT0kKGdldF9yZW1vdGVfdXJsICIkQCIpCisKK2Nhc2UgIiRoYXNfYWxsIiBpbgorLS1hbGwpCisJc2V0IHggOzsKKycnKQorCWNhc2UgIiRkb190YWdzLCQjIiBpbgorCXllcywxKQorCQlzZXQgeCAkKGNkICIkR0lUX0RJUi9yZWZzIiAmJiBmaW5kIHRhZ3MgLXR5cGUgZiAtcHJpbnQpIDs7CisJeWVzLCopCisJCXNldCB4ICQoY2QgIiRHSVRfRElSL3JlZnMiICYmIGZpbmQgdGFncyAtdHlwZSBmIC1wcmludCkgXAorCQkgICAgJChnZXRfcmVtb3RlX3JlZnNfZm9yX3B1c2ggIiRAIikgOzsKKwksKikKKwkJc2V0IHggJChnZXRfcmVtb3RlX3JlZnNfZm9yX3B1c2ggIiRAIikgOzsKKwllc2FjCitlc2FjCisKK3NoaWZ0IDsjIGF3YXkgdGhlIGluaXRpYWwgJ3gnCisKKyMgJCMgaXMgbm93IDAgaWYgdGhlcmUgd2FzIG5vIGV4cGxpY2l0IHJlZnNwZWMgb24gdGhlIGNvbW1hbmQgbGluZQorIyBhbmQgdGhlcmUgd2FzIG5vIGRlZmFsdCByZWZzcGVjIHRvIHB1c2ggZnJvbSByZW1vdGVzLyBmaWxlLgorIyB3ZSB3aWxsIGxldCBnaXQtc2VuZC1wYWNrIHRvIGRvIGl0cyAibWF0Y2hpbmcgcmVmcyIgdGhpbmcuCisKK2Nhc2UgIiRyZW1vdGUiIGluCitnaXQ6Ly8qKQorCWRpZSAiQ2Fubm90IHVzZSBSRUFELU9OTFkgdHJhbnNwb3J0IHRvIHB1c2ggdG8gJHJlbW90ZSIgOzsKK3JzeW5jOi8vKikKKyAgICAgICAgZGllICJQdXNoaW5nIHdpdGggcnN5bmMgdHJhbnNwb3J0IGlzIGRlcHJlY2F0ZWQiIDs7Citlc2FjCisKK3NldCB4ICIkcmVtb3RlIiAiJEAiOyBzaGlmdAordGVzdCAiJGhhc19hbGwiICYmIHNldCB4ICIkaGFzX2FsbCIgIiRAIiAmJiBzaGlmdAordGVzdCAiJGhhc19mb3JjZSIgJiYgc2V0IHggIiRoYXNfZm9yY2UiICIkQCIgJiYgc2hpZnQKK3Rlc3QgIiRoYXNfZXhlYyIgJiYgc2V0IHggIiRoYXNfZXhlYyIgIiRAIiAmJiBzaGlmdAordGVzdCAiJGhhc190aGluIiAmJiBzZXQgeCAiJGhhc190aGluIiAiJEAiICYmIHNoaWZ0CisKK2Nhc2UgIiRyZW1vdGUiIGluCitodHRwOi8vKiB8IGh0dHBzOi8vKikKKwlleGVjIGdpdC1odHRwLXB1c2ggIiRAIjs7CisqKQorCWV4ZWMgZ2l0LXNlbmQtcGFjayAiJEAiOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2dpdC1xdWlsdGltcG9ydC5zaCBiL2dpdC1xdWlsdGltcG9ydC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMmQ5ZDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXF1aWx0aW1wb3J0LnNoCkBAIC0wLDAgKzEsMTE4IEBACisjIS9iaW4vc2gKK1VTQUdFPSctLWRyeS1ydW4gLS1hdXRob3IgPGF1dGhvcj4gLS1wYXRjaGVzIDwvcGF0aC90by9xdWlsdC9wYXRjaC9kaXJlY3Rvcnk+JworU1VCRElSRUNUT1JZX09OPVllcworLiBnaXQtc2gtc2V0dXAKKworZHJ5X3J1bj0iIgorcXVpbHRfYXV0aG9yPSIiCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS0tYXU9KnwtLWF1dD0qfC0tYXV0aD0qfC0tYXV0aG89KnwtLWF1dGhvcj0qKQorCQlxdWlsdF9hdXRob3I9JChleHByICIkMSIgOiAnLVtePV0qXCguKlwpJykKKwkJc2hpZnQKKwkJOzsKKworCS0tYXV8LS1hdXR8LS1hdXRofC0tYXV0aG98LS1hdXRob3IpCisJCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisJCXNoaWZ0CisJCXF1aWx0X2F1dGhvcj0iJDEiCisJCXNoaWZ0CisJCTs7CisKKwktLWRyeS1ydW4pCisJCXNoaWZ0CisJCWRyeV9ydW49MQorCQk7OworCisJLS1wYT0qfC0tcGF0PSp8LS1wYXRjPSp8LS1wYXRjaD0qfC0tcGF0Y2hlPSp8LS1wYXRjaGVzPSopCisJCVFVSUxUX1BBVENIRVM9JChleHByICIkMSIgOiAnLVtePV0qXCguKlwpJykKKwkJc2hpZnQKKwkJOzsKKworCS0tcGF8LS1wYXR8LS1wYXRjfC0tcGF0Y2h8LS1wYXRjaGV8LS1wYXRjaGVzKQorCQljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworCQlzaGlmdAorCQlRVUlMVF9QQVRDSEVTPSIkMSIKKwkJc2hpZnQKKwkJOzsKKworCSopCisJCWJyZWFrCisJCTs7CisJZXNhYworZG9uZQorCisjIFF1aWx0IEF1dGhvcgoraWYgWyAtbiAiJHF1aWx0X2F1dGhvciIgXSA7IHRoZW4KKwlxdWlsdF9hdXRob3JfbmFtZT0kKGV4cHIgInokcXVpbHRfYXV0aG9yIiA6ICd6XCguKlteIF1cKSAqPC4qJykgJiYKKwlxdWlsdF9hdXRob3JfZW1haWw9JChleHByICJ6JHF1aWx0X2F1dGhvciIgOiAnLio8XChbXj5dKlwpJykgJiYKKwl0ZXN0ICcnICE9ICIkcXVpbHRfYXV0aG9yX25hbWUiICYmCisJdGVzdCAnJyAhPSAiJHF1aWx0X2F1dGhvcl9lbWFpbCIgfHwKKwlkaWUgIm1hbGZvcm1hdHRlZCAtLWF1dGhvciBwYXJhbWV0ZXIiCitmaQorCisjIFF1aWx0IHBhdGNoIGRpcmVjdG9yeQorOiAke1FVSUxUX1BBVENIRVM6PXBhdGNoZXN9CitpZiAhIFsgLWQgIiRRVUlMVF9QQVRDSEVTIiBdIDsgdGhlbgorCWVjaG8gIlRoZSBcIiRRVUlMVF9QQVRDSEVTXCIgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiIKKwlleGl0IDEKK2ZpCisKKyMgVGVtcG9yYXkgZGlyZWN0b3JpZXMKK3RtcF9kaXI9LmRvdGVzdAordG1wX21zZz0iJHRtcF9kaXIvbXNnIgordG1wX3BhdGNoPSIkdG1wX2Rpci9wYXRjaCIKK3RtcF9pbmZvPSIkdG1wX2Rpci9pbmZvIgorCisKKyMgRmluZCB0aGUgaW50aWFsIGNvbW1pdAorY29tbWl0PSQoZ2l0LXJldi1wYXJzZSBIRUFEKQorCitta2RpciAkdG1wX2RpciB8fCBleGl0IDIKK2ZvciBwYXRjaF9uYW1lIGluICQoY2F0ICIkUVVJTFRfUEFUQ0hFUy9zZXJpZXMiIHwgZ3JlcCAtdiAnXiMnKTsgZG8KKwllY2hvICRwYXRjaF9uYW1lCisJKGNhdCAkUVVJTFRfUEFUQ0hFUy8kcGF0Y2hfbmFtZSB8IGdpdC1tYWlsaW5mbyAiJHRtcF9tc2ciICIkdG1wX3BhdGNoIiA+ICIkdG1wX2luZm8iKSB8fCBleGl0IDMKKworCSMgUGFyc2UgdGhlIGF1dGhvciBpbmZvcm1hdGlvbgorCWV4cG9ydCBHSVRfQVVUSE9SX05BTUU9JChzZWQgLW5lICdzL0F1dGhvcjogLy9wJyAiJHRtcF9pbmZvIikKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0kKHNlZCAtbmUgJ3MvRW1haWw6IC8vcCcgIiR0bXBfaW5mbyIpCisJd2hpbGUgdGVzdCAteiAiJEdJVF9BVVRIT1JfRU1BSUwiICYmIHRlc3QgLXogIiRHSVRfQVVUSE9SX05BTUUiIDsgZG8KKwkJaWYgWyAtbiAiJHF1aWx0X2F1dGhvciIgXSA7IHRoZW4KKwkJCUdJVF9BVVRIT1JfTkFNRT0iJHF1aWx0X2F1dGhvcl9uYW1lIjsKKwkJCUdJVF9BVVRIT1JfRU1BSUw9IiRxdWlsdF9hdXRob3JfZW1haWwiOworCQllbGlmIFsgLW4gIiRkcnlfcnVuIiBdOyB0aGVuCisJCQllY2hvICJObyBhdXRob3IgZm91bmQgaW4gJHBhdGNoX25hbWUiID4mMjsKKwkJCUdJVF9BVVRIT1JfTkFNRT0iZHJ5LXJ1bi1ub3QtZm91bmQiOworCQkJR0lUX0FVVEhPUl9FTUFJTD0iZHJ5LXJ1bi1ub3QtZm91bmQiOworCQllbHNlCisJCQllY2hvICJObyBhdXRob3IgZm91bmQgaW4gJHBhdGNoX25hbWUiID4mMjsKKwkJCWVjaG8gIi0tLSIKKwkJCWNhdCAkdG1wX21zZworCQkJZWNobyAtbiAiQXV0aG9yOiAiOworCQkJcmVhZCBwYXRjaF9hdXRob3IKKworCQkJZWNobyAiJHBhdGNoX2F1dGhvciIKKworCQkJcGF0Y2hfYXV0aG9yX25hbWU9JChleHByICJ6JHBhdGNoX2F1dGhvciIgOiAnelwoLipbXiBdXCkgKjwuKicpICYmCisJCQlwYXRjaF9hdXRob3JfZW1haWw9JChleHByICJ6JHBhdGNoX2F1dGhvciIgOiAnLio8XChbXj5dKlwpJykgJiYKKwkJCXRlc3QgJycgIT0gIiRwYXRjaF9hdXRob3JfbmFtZSIgJiYKKwkJCXRlc3QgJycgIT0gIiRwYXRjaF9hdXRob3JfZW1haWwiICYmCisJCQlHSVRfQVVUSE9SX05BTUU9IiRwYXRjaF9hdXRob3JfbmFtZSIgJiYKKwkJCUdJVF9BVVRIT1JfRU1BSUw9IiRwYXRjaF9hdXRob3JfZW1haWwiCisJCWZpCisJZG9uZQorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEU9JChzZWQgLW5lICdzL0RhdGU6IC8vcCcgIiR0bXBfaW5mbyIpCisJZXhwb3J0IFNVQkpFQ1Q9JChzZWQgLW5lICdzL1N1YmplY3Q6IC8vcCcgIiR0bXBfaW5mbyIpCisJaWYgWyAteiAiJFNVQkpFQ1QiIF0gOyB0aGVuCisJCVNVQkpFQ1Q9JChlY2hvICRwYXRjaF9uYW1lIHwgc2VkIC1lICdzLy5wYXRjaCQvLycpCisJZmkKKworCWlmIFsgLXogIiRkcnlfcnVuIiBdIDsgdGhlbgorCQlnaXQtYXBwbHkgLS1pbmRleCAtQzEgIiR0bXBfcGF0Y2giICYmCisJCXRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKwkJY29tbWl0PSQoKGVjaG8gIiRTVUJKRUNUIjsgZWNobzsgY2F0ICIkdG1wX21zZyIpIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlIC1wICRjb21taXQpICYmCisJCWdpdC11cGRhdGUtcmVmIEhFQUQgJGNvbW1pdCB8fCBleGl0IDQKKwlmaQorZG9uZQorcm0gLXJmICR0bXBfZGlyIHx8IGV4aXQgNQpkaWZmIC0tZ2l0IGEvZ2l0LXJlYmFzZS5zaCBiL2dpdC1yZWJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZiNTdiOAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZWJhc2Uuc2gKQEAgLTAsMCArMSwxNTcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8uCisjCisKK1VTQUdFPSdbLS1vbnRvIDxuZXdiYXNlPl0gPHVwc3RyZWFtPiBbPGJyYW5jaD5dJworTE9OR19VU0FHRT0nZ2l0LXJlYmFzZSByZXBsYWNlcyA8YnJhbmNoPiB3aXRoIGEgbmV3IGJyYW5jaCBvZiB0aGUKK3NhbWUgbmFtZS4gIFdoZW4gdGhlIC0tb250byBvcHRpb24gaXMgcHJvdmlkZWQgdGhlIG5ldyBicmFuY2ggc3RhcnRzCitvdXQgd2l0aCBhIEhFQUQgZXF1YWwgdG8gPG5ld2Jhc2U+LCBvdGhlcndpc2UgaXQgaXMgZXF1YWwgdG8gPHVwc3RyZWFtPgorSXQgdGhlbiBhdHRlbXB0cyB0byBjcmVhdGUgYSBuZXcgY29tbWl0IGZvciBlYWNoIGNvbW1pdCBmcm9tIHRoZSBvcmlnaW5hbAorPGJyYW5jaD4gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgPHVwc3RyZWFtPiBicmFuY2guCisKK0l0IGlzIHBvc3NpYmxlIHRoYXQgYSBtZXJnZSBmYWlsdXJlIHdpbGwgcHJldmVudCB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZworY29tcGxldGVseSBhdXRvbWF0aWMuICBZb3Ugd2lsbCBoYXZlIHRvIHJlc29sdmUgYW55IHN1Y2ggbWVyZ2UgZmFpbHVyZQorYW5kIHJ1biBnaXQgcmViYXNlIC0tY29udGludWUuICBBbm90aGVyIG9wdGlvbiBpcyB0byBieXBhc3MgdGhlIGNvbW1pdAordGhhdCBjYXVzZWQgdGhlIG1lcmdlIGZhaWx1cmUgd2l0aCBnaXQgcmViYXNlIC0tc2tpcC4gIFRvIHJlc3RvcmUgdGhlCitvcmlnaW5hbCA8YnJhbmNoPiBhbmQgcmVtb3ZlIHRoZSAuZG90ZXN0IHdvcmtpbmcgZmlsZXMsIHVzZSB0aGUgY29tbWFuZAorZ2l0IHJlYmFzZSAtLWFib3J0IGluc3RlYWQuCisKK05vdGUgdGhhdCBpZiA8YnJhbmNoPiBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZQorY3VycmVudGx5IGNoZWNrZWQgb3V0IGJyYW5jaCBpcyB1c2VkLiAgWW91IG11c3QgYmUgaW4gdGhlIHRvcAorZGlyZWN0b3J5IG9mIHlvdXIgcHJvamVjdCB0byBzdGFydCAob3IgY29udGludWUpIGEgcmViYXNlLgorCitFeGFtcGxlOiAgICAgICBnaXQtcmViYXNlIG1hc3Rlcn4xIHRvcGljCisKKyAgICAgICAgQS0tLUItLS1DIHRvcGljICAgICAgICAgICAgICAgICAgIEEnXCcnLS1CJ1wnJy0tQydcJycgdG9waWMKKyAgICAgICAvICAgICAgICAgICAgICAgICAgIC0tPiAgICAgICAgICAgLworICBELS0tRS0tLUYtLS1HIG1hc3RlciAgICAgICAgICBELS0tRS0tLUYtLS1HIG1hc3RlcgorJworLiBnaXQtc2gtc2V0dXAKKworUkVTT0xWRU1TRz0iCitXaGVuIHlvdSBoYXZlIHJlc29sdmVkIHRoaXMgcHJvYmxlbSBydW4gXCJnaXQgcmViYXNlIC0tY29udGludWVcIi4KK0lmIHlvdSB3b3VsZCBwcmVmZXIgdG8gc2tpcCB0aGlzIHBhdGNoLCBpbnN0ZWFkIHJ1biBcImdpdCByZWJhc2UgLS1za2lwXCIuCitUbyByZXN0b3JlIHRoZSBvcmlnaW5hbCBicmFuY2ggYW5kIHN0b3AgcmViYXNpbmcgcnVuIFwiZ2l0IHJlYmFzZSAtLWFib3J0XCIuCisiCit1bnNldCBuZXdiYXNlCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktLWNvbnRpbnVlKQorCQlkaWZmPSQoZ2l0LWRpZmYtZmlsZXMpCisJCWNhc2UgIiRkaWZmIiBpbgorCQk/KikJZWNobyAiWW91IG11c3QgZWRpdCBhbGwgbWVyZ2UgY29uZmxpY3RzIGFuZCB0aGVuIgorCQkJZWNobyAibWFyayB0aGVtIGFzIHJlc29sdmVkIHVzaW5nIGdpdCB1cGRhdGUtaW5kZXgiCisJCQlleGl0IDEKKwkJCTs7CisJCWVzYWMKKwkJZ2l0IGFtIC0tcmVzb2x2ZWQgLS0zd2F5IC0tcmVzb2x2ZW1zZz0iJFJFU09MVkVNU0ciCisJCWV4aXQKKwkJOzsKKwktLXNraXApCisJCWdpdCBhbSAtMyAtLXNraXAgLS1yZXNvbHZlbXNnPSIkUkVTT0xWRU1TRyIKKwkJZXhpdAorCQk7OworCS0tYWJvcnQpCisJCVsgLWQgLmRvdGVzdCBdIHx8IGRpZSAiTm8gcmViYXNlIGluIHByb2dyZXNzPyIKKwkJZ2l0IHJlc2V0IC0taGFyZCBPUklHX0hFQUQKKwkJcm0gLXIgLmRvdGVzdAorCQlleGl0CisJCTs7CisJLS1vbnRvKQorCQl0ZXN0IDIgLWxlICIkIyIgfHwgdXNhZ2UKKwkJbmV3YmFzZT0iJDIiCisJCXNoaWZ0CisJCTs7CisJLSopCisJCXVzYWdlCisJCTs7CisJKikKKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworIyBNYWtlIHN1cmUgd2UgZG8gbm90IGhhdmUgLmRvdGVzdAoraWYgbWtkaXIgLmRvdGVzdAordGhlbgorCXJtZGlyIC5kb3Rlc3QKK2Vsc2UKKwllY2hvID4mMiAnCitJdCBzZWVtcyB0aGF0IEkgY2Fubm90IGNyZWF0ZSBhIC5kb3Rlc3QgZGlyZWN0b3J5LCBhbmQgSSB3b25kZXIgaWYgeW91CithcmUgaW4gdGhlIG1pZGRsZSBvZiBwYXRjaCBhcHBsaWNhdGlvbiBvciBhbm90aGVyIHJlYmFzZS4gIElmIHRoYXQgaXMgbm90Cit0aGUgY2FzZSwgcGxlYXNlIHJtIC1mciAuZG90ZXN0IGFuZCBydW4gbWUgYWdhaW4uICBJIGFtIHN0b3BwaW5nIGluIGNhc2UKK3lvdSBzdGlsbCBoYXZlIHNvbWV0aGluZyB2YWx1YWJsZSB0aGVyZS4nCisJZXhpdCAxCitmaQorCisjIFRoZSB0cmVlIG11c3QgYmUgcmVhbGx5IHJlYWxseSBjbGVhbi4KK2dpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIHx8IGV4aXQKK2RpZmY9JChnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAtLW5hbWUtc3RhdHVzIC1yIEhFQUQpCitjYXNlICIkZGlmZiIgaW4KKz8qKQllY2hvICIkZGlmZiIKKwlleGl0IDEKKwk7OworZXNhYworCisjIFRoZSB1cHN0cmVhbSBoZWFkIG11c3QgYmUgZ2l2ZW4uICBNYWtlIHN1cmUgaXQgaXMgdmFsaWQuCit1cHN0cmVhbV9uYW1lPSIkMSIKK3Vwc3RyZWFtPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIke3Vwc3RyZWFtX25hbWV9XjAiYCB8fAorICAgIGRpZSAiaW52YWxpZCB1cHN0cmVhbSAkdXBzdHJlYW1fbmFtZSIKKworIyBJZiBhIGhvb2sgZXhpc3RzLCBnaXZlIGl0IGEgY2hhbmNlIHRvIGludGVycnVwdAoraWYgdGVzdCAteCAiJEdJVF9ESVIvaG9va3MvcHJlLXJlYmFzZSIKK3RoZW4KKwkiJEdJVF9ESVIvaG9va3MvcHJlLXJlYmFzZSIgJHsxKyIkQCJ9IHx8IHsKKwkJZWNobyA+JjIgIlRoZSBwcmUtcmViYXNlIGhvb2sgcmVmdXNlZCB0byByZWJhc2UuIgorCQlleGl0IDEKKwl9CitmaQorCisjIElmIHRoZSBicmFuY2ggdG8gcmViYXNlIGlzIGdpdmVuLCBmaXJzdCBzd2l0Y2ggdG8gaXQuCitjYXNlICIkIyIgaW4KKzIpCisJYnJhbmNoX25hbWU9IiQyIgorCWdpdC1jaGVja291dCAiJDIiIHx8IHVzYWdlCisJOzsKKyopCisJYnJhbmNoX25hbWU9YGdpdCBzeW1ib2xpYy1yZWYgSEVBRGAgfHwgZGllICJObyBjdXJyZW50IGJyYW5jaCIKKwlicmFuY2hfbmFtZT1gZXhwciAieiRicmFuY2hfbmFtZSIgOiAnenJlZnMvaGVhZHMvXCguKlwpJ2AKKwk7OworZXNhYworYnJhbmNoPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJHticmFuY2hfbmFtZX1eMCIpIHx8IGV4aXQKKworIyBNYWtlIHN1cmUgdGhlIGJyYW5jaCB0byByZWJhc2Ugb250byBpcyB2YWxpZC4KK29udG9fbmFtZT0ke25ld2Jhc2UtIiR1cHN0cmVhbV9uYW1lIn0KK29udG89JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIke29udG9fbmFtZX1eMCIpIHx8IGV4aXQKKworIyBOb3cgd2UgYXJlIHJlYmFzaW5nIGNvbW1pdHMgJHVwc3RyZWFtLi4kYnJhbmNoIG9uIHRvcCBvZiAkb250bworCisjIENoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IGJhc2VkIG9uICRvbnRvLCBidXQgdGhpcyBzaG91bGQgYmUKKyMgZG9uZSBvbmx5IHdoZW4gdXBzdHJlYW0gYW5kIG9udG8gYXJlIHRoZSBzYW1lLgoraWYgdGVzdCAiJHVwc3RyZWFtIiA9ICIkb250byIKK3RoZW4KKwltYj0kKGdpdC1tZXJnZS1iYXNlICIkb250byIgIiRicmFuY2giKQorCWlmIHRlc3QgIiRtYiIgPSAiJG9udG8iCisJdGhlbgorCQllY2hvID4mMiAiQ3VycmVudCBicmFuY2ggJGJyYW5jaF9uYW1lIGlzIHVwIHRvIGRhdGUuIgorCQlleGl0IDAKKwlmaQorZmkKKworIyBSZXdpbmQgdGhlIGhlYWQgdG8gIiRvbnRvIjsgdGhpcyBzYXZlcyBvdXIgY3VycmVudCBoZWFkIGluIE9SSUdfSEVBRC4KK2dpdC1yZXNldCAtLWhhcmQgIiRvbnRvIgorCisjIElmIHRoZSAkb250byBpcyBhIHByb3BlciBkZXNjZW5kYW50IG9mIHRoZSB0aXAgb2YgdGhlIGJyYW5jaCwgdGhlbgorIyB3ZSBqdXN0IGZhc3QgZm9yd2FyZGVkLgoraWYgdGVzdCAiJG1iIiA9ICIkb250byIKK3RoZW4KKwllY2hvID4mMiAiRmFzdC1mb3J3YXJkZWQgJGJyYW5jaCB0byAkbmV3YmFzZS4iCisJZXhpdCAwCitmaQorCitnaXQtZm9ybWF0LXBhdGNoIC1rIC0tc3Rkb3V0IC0tZnVsbC1pbmRleCAiJHVwc3RyZWFtIi4uT1JJR19IRUFEIHwKK2dpdCBhbSAtLWJpbmFyeSAtMyAtayAtLXJlc29sdmVtc2c9IiRSRVNPTFZFTVNHIgorCmRpZmYgLS1naXQgYS9naXQtcmVsaW5rLnBlcmwgYi9naXQtcmVsaW5rLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjZiNGY2YQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZWxpbmsucGVybApAQCAtMCwwICsxLDE3MyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIyBDb3B5cmlnaHQgMjAwNSwgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKyMgRGlzdHJpYnV0aW9uIHBlcm1pdHRlZCB1bmRlciB0aGUgR1BMIHYyLCBhcyBkaXN0cmlidXRlZAorIyBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIyBMYXRlciB2ZXJzaW9ucyBvZiB0aGUgR1BMIGF0IHRoZSBkaXNjcmV0aW9uIG9mIExpbnVzIFRvcnZhbGRzCisjCisjIFNjYW4gdHdvIGdpdCBvYmplY3QtdHJlZXMsIGFuZCBoYXJkbGluayBhbnkgY29tbW9uIG9iamVjdHMgYmV0d2VlbiB0aGVtLgorCit1c2UgNS4wMDY7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6TG9uZzsKKworc3ViIGdldF9jYW5vbmljYWxfZm9ybSgkKTsKK3N1YiBkb19zY2FuX2RpcmVjdG9yeSgkJCQpOworc3ViIGNvbXBhcmVfdHdvX2ZpbGVzKCQkKTsKK3N1YiB1c2FnZSgpOworc3ViIGxpbmtfdHdvX2ZpbGVzKCQkKTsKKworIyBzdGF0cworbXkgJHRvdGFsX2xpbmtlZCA9IDA7CitteSAkdG90YWxfYWxyZWFkeSA9IDA7CitteSAoJGxpbmtlZCwkYWxyZWFkeSk7CisKK215ICRmYWlsX29uX2RpZmZlcmVudF9zaXplcyA9IDA7CitteSAkaGVscCA9IDA7CitHZXRPcHRpb25zKCJzYWZlIiA9PiBcJGZhaWxfb25fZGlmZmVyZW50X3NpemVzLAorCSAgICJoZWxwIiA9PiBcJGhlbHApOworCit1c2FnZSgpIGlmICRoZWxwOworCitteSAoQGRpcnMpID0gQEFSR1Y7CisKK3VzYWdlKCkgaWYgKCFkZWZpbmVkICRkaXJzWzBdIHx8ICFkZWZpbmVkICRkaXJzWzFdKTsKKworJF8gPSBnZXRfY2Fub25pY2FsX2Zvcm0oJF8pIGZvcmVhY2ggKEBkaXJzKTsKKworbXkgJG1hc3Rlcl9kaXIgPSBwb3AgQGRpcnM7CisKK29wZW5kaXIoRCwkbWFzdGVyX2RpciAuICJvYmplY3RzLyIpCisJb3IgZGllICJGYWlsZWQgdG8gb3BlbiAkbWFzdGVyX2Rpci9vYmplY3RzLyA6ICQhIjsKKworbXkgQGhhc2hkaXJzID0gZ3JlcCAhL15cLnsxLDJ9JC8sIHJlYWRkaXIoRCk7CisKK2ZvcmVhY2ggbXkgJHJlcG8gKEBkaXJzKSB7CisJJGxpbmtlZCA9IDA7CisJJGFscmVhZHkgPSAwOworCXByaW50ZigiU2VhcmNoaW5nICclcycgYW5kICclcycgZm9yIGNvbW1vbiBvYmplY3RzIGFuZCBoYXJkbGlua2luZyB0aGVtLi4uXG4iLAorCQkkbWFzdGVyX2RpciwkcmVwbyk7CisKKwlmb3JlYWNoIG15ICRoYXNoZGlyIChAaGFzaGRpcnMpIHsKKwkJZG9fc2Nhbl9kaXJlY3RvcnkoJG1hc3Rlcl9kaXIsICRoYXNoZGlyLCAkcmVwbyk7CisJfQorCisJcHJpbnRmKCJMaW5rZWQgJWQgZmlsZXMsICVkIHdlcmUgYWxyZWFkeSBsaW5rZWQuXG4iLCRsaW5rZWQsICRhbHJlYWR5KTsKKworCSR0b3RhbF9saW5rZWQgKz0gJGxpbmtlZDsKKwkkdG90YWxfYWxyZWFkeSArPSAkYWxyZWFkeTsKK30KKworcHJpbnRmKCJUb3RhbHM6IExpbmtlZCAlZCBmaWxlcywgJWQgd2VyZSBhbHJlYWR5IGxpbmtlZC5cbiIsCisJJHRvdGFsX2xpbmtlZCwgJHRvdGFsX2FscmVhZHkpOworCisKK3N1YiBkb19zY2FuX2RpcmVjdG9yeSgkJCQpIHsKKwlteSAoJHNyY2RpciwgJHN1YmRpciwgJGRzdGRpcikgPSBAXzsKKworCW15ICRzZnVsbGRpciA9IHNwcmludGYoIiVzb2JqZWN0cy8lcy8iLCRzcmNkaXIsJHN1YmRpcik7CisJbXkgJGRmdWxsZGlyID0gc3ByaW50ZigiJXNvYmplY3RzLyVzLyIsJGRzdGRpciwkc3ViZGlyKTsKKworCW9wZW5kaXIoUywkc2Z1bGxkaXIpCisJCW9yIGRpZSAiRmFpbGVkIHRvIG9wZW5kaXIgJHNmdWxsZGlyOiAkISI7CisKKwlmb3JlYWNoIG15ICRmaWxlIChncmVwKCEvXC57MSwyfSQvLCByZWFkZGlyKFMpKSkgeworCQlteSAkc2ZpbGVuYW1lID0gJHNmdWxsZGlyIC4gJGZpbGU7CisJCW15ICRkZmlsZW5hbWUgPSAkZGZ1bGxkaXIgLiAkZmlsZTsKKworCQljb21wYXJlX3R3b19maWxlcygkc2ZpbGVuYW1lLCRkZmlsZW5hbWUpOworCisJfQorCWNsb3NlZGlyKFMpOworfQorCitzdWIgY29tcGFyZV90d29fZmlsZXMoJCQpIHsKKwlteSAoJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSkgPSBAXzsKKworCSMgUGVybCdzIHN0YXQgcmV0dXJucyByZWxldmFudCBpbmZvcm1hdGlvbiBhcyBmb2xsb3dzOgorCSMgMCA9IGRldiBudW1iZXIKKwkjIDEgPSBpbm9kZSBudW1iZXIKKwkjIDcgPSBzaXplCisJbXkgQHNzdGF0aW5mbyA9IHN0YXQoJHNmaWxlbmFtZSk7CisJbXkgQGRzdGF0aW5mbyA9IHN0YXQoJGRmaWxlbmFtZSk7CisKKwlpZiAoQHNzdGF0aW5mbyA9PSAwICYmIEBkc3RhdGluZm8gPT0gMCkgeworCQlkaWUgc3ByaW50ZigiU3RhdCBvZiBib3RoICVzIGFuZCAlcyBmYWlsZWQ6ICVzXG4iLCRzZmlsZW5hbWUsICRkZmlsZW5hbWUsICQhKTsKKworCX0gZWxzaWYgKEBkc3RhdGluZm8gPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKCAoJHNzdGF0aW5mb1swXSA9PSAkZHN0YXRpbmZvWzBdKSAmJgorCSAgICAgKCRzc3RhdGluZm9bMV0gIT0gJGRzdGF0aW5mb1sxXSkpIHsKKwkJaWYgKCRzc3RhdGluZm9bN10gPT0gJGRzdGF0aW5mb1s3XSkgeworCQkJbGlua190d29fZmlsZXMoJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSk7CisKKwkJfSBlbHNlIHsKKwkJCW15ICRlcnIgPSBzcHJpbnRmKCJFUlJPUjogRmlsZSBzaXplcyBhcmUgbm90IHRoZSBzYW1lLCBjYW5ub3QgcmVsaW5rICVzIHRvICVzLlxuIiwKKwkJCQkkc2ZpbGVuYW1lLCAkZGZpbGVuYW1lKTsKKwkJCWlmICgkZmFpbF9vbl9kaWZmZXJlbnRfc2l6ZXMpIHsKKwkJCQlkaWUgJGVycjsKKwkJCX0gZWxzZSB7CisJCQkJd2FybiAkZXJyOworCQkJfQorCQl9CisKKwl9IGVsc2lmICggKCRzc3RhdGluZm9bMF0gPT0gJGRzdGF0aW5mb1swXSkgJiYKKwkgICAgICgkc3N0YXRpbmZvWzFdID09ICRkc3RhdGluZm9bMV0pKSB7CisJCSRhbHJlYWR5Kys7CisJfQorfQorCitzdWIgZ2V0X2Nhbm9uaWNhbF9mb3JtKCQpIHsKKwlteSAkZGlyID0gc2hpZnQ7CisJbXkgJG9yaWdpbmFsID0gJGRpcjsKKworCWRpZSAiJGRpciBpcyBub3QgYSBkaXJlY3RvcnkuIiB1bmxlc3MgLWQgJGRpcjsKKworCSRkaXIgLj0gIi8iIHVubGVzcyAkZGlyID1+IG0jLyQjOworCSRkaXIgLj0gIi5naXQvIiB1bmxlc3MgJGRpciA9fiBtI1wuZ2l0LyQjOworCisJZGllICIkb3JpZ2luYWwgZG9lcyBub3QgaGF2ZSBhIC5naXQvIHN1YmRpcmVjdG9yeS5cbiIgdW5sZXNzIC1kICRkaXI7CisKKwlyZXR1cm4gJGRpcjsKK30KKworc3ViIGxpbmtfdHdvX2ZpbGVzKCQkKSB7CisJbXkgKCRzZmlsZW5hbWUsICRkZmlsZW5hbWUpID0gQF87CisJbXkgJHRtcGRuYW1lID0gc3ByaW50ZigiJXMub2xkIiwkZGZpbGVuYW1lKTsKKwlyZW5hbWUoJGRmaWxlbmFtZSwkdG1wZG5hbWUpCisJCW9yIGRpZSBzcHJpbnRmKCJGYWlsdXJlIHJlbmFtaW5nICVzIHRvICVzOiAlcyIsCisJCQkkZGZpbGVuYW1lLCAkdG1wZG5hbWUsICQhKTsKKworCWlmICghIGxpbmsoJHNmaWxlbmFtZSwkZGZpbGVuYW1lKSkgeworCQlteSAkZmFpbHR4dCA9ICIiOworCQl1bmxlc3MgKHJlbmFtZSgkdG1wZG5hbWUsJGRmaWxlbmFtZSkpIHsKKwkJCSRmYWlsdHh0ID0gc3ByaW50ZigKKwkJCQkiR2l0IFJlcG9zaXRvcnkgY29udGFpbmluZyAlcyBpcyBwcm9iYWJseSBjb3JydXB0ZWQsICIgLgorCQkJCSJwbGVhc2UgY29weSAnJXMnIHRvICclcycgdG8gZml4LlxuIiwKKwkJCQkkdG1wZG5hbWUsICRkZmlsZW5hbWUpOworCQl9CisKKwkJZGllIHNwcmludGYoIkZhaWxlZCB0byBsaW5rICVzIHRvICVzOiAlc1xuJXMiIC4KKwkJCSRzZmlsZW5hbWUsICRkZmlsZW5hbWUsCisJCQkkISwgJGRmaWxlbmFtZSwgJGZhaWx0eHQpOworCX0KKworCXVubGluaygkdG1wZG5hbWUpCisJCW9yIGRpZSBzcHJpbnRmKCJVbmxpbmsgb2YgJXMgZmFpbGVkOiAlc1xuIiwKKwkJCSRkZmlsZW5hbWUsICQhKTsKKworCSRsaW5rZWQrKzsKK30KKworCitzdWIgdXNhZ2UoKSB7CisJcHJpbnQoIlVzYWdlOiAkMCBbLS1zYWZlXSA8ZGlyPiBbPGRpcj4gLi4uXSA8bWFzdGVyX2Rpcj4gXG4iKTsKKwlwcmludCgiQWxsIGRpcmVjdG9yaWVzIHNob3VsZCBjb250YWluIGEgLmdpdC9vYmplY3RzLyBzdWJkaXJlY3RvcnkuXG4iKTsKKwlwcmludCgiT3B0aW9uc1xuIik7CisJcHJpbnQoIlx0LS1zYWZlXHQiIC4KKwkJIlN0b3BzIGlmIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUgaGFzaCBleGlzdCBidXQgIiAuCisJCSJoYXZlIGRpZmZlcmVudCBzaXplcy4gIERlZmF1bHQgaXMgdG8gd2FybiBhbmQgY29udGludWUuXG4iKTsKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvZ2l0LXJlcGFjay5zaCBiL2dpdC1yZXBhY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGZiM2YyNgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZXBhY2suc2gKQEAgLTAsMCArMSw4NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIworCitVU0FHRT0nWy1hXSBbLWRdIFstZl0gWy1sXSBbLW5dIFstcV0nCisuIGdpdC1zaC1zZXR1cAorCitub191cGRhdGVfaW5mbz0gYWxsX2ludG9fb25lPSByZW1vdmVfcmVkdW5kYW50PQorbG9jYWw9IHF1aWV0PSBub19yZXVzZV9kZWx0YT0gZXh0cmE9Cit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktbikJbm9fdXBkYXRlX2luZm89dCA7OworCS1hKQlhbGxfaW50b19vbmU9dCA7OworCS1kKQlyZW1vdmVfcmVkdW5kYW50PXQgOzsKKwktcSkJcXVpZXQ9LXEgOzsKKwktZikJbm9fcmV1c2VfZGVsdGE9LS1uby1yZXVzZS1kZWx0YSA7OworCS1sKQlsb2NhbD0tLWxvY2FsIDs7CisJLS13aW5kb3c9KikgZXh0cmE9IiRleHRyYSAkMSIgOzsKKwktLWRlcHRoPSopIGV4dHJhPSIkZXh0cmEgJDEiIDs7CisJKikJdXNhZ2UgOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworcm0gLWYgLnRtcC1wYWNrLSoKK1BBQ0tESVI9IiRHSVRfT0JKRUNUX0RJUkVDVE9SWS9wYWNrIgorCisjIFRoZXJlIHdpbGwgYmUgbW9yZSByZXBhY2tpbmcgc3RyYXRlZ2llcyB0byBjb21lLi4uCitjYXNlICIsJGFsbF9pbnRvX29uZSwiIGluCissLCkKKwlyZXZfbGlzdD0nLS11bnBhY2tlZCcKKwlwYWNrX29iamVjdHM9Jy0taW5jcmVtZW50YWwnCisJOzsKKyx0LCkKKwlyZXZfbGlzdD0KKwlwYWNrX29iamVjdHM9CisKKwkjIFJlZHVuZGFuY3kgY2hlY2sgaW4gYWxsLWludG8tb25lIGNhc2UgaXMgdHJpdmlhbC4KKwlleGlzdGluZz1gY2QgIiRQQUNLRElSIiAmJiBcCisJICAgIGZpbmQgLiAtdHlwZSBmIFwoIC1uYW1lICcqLnBhY2snIC1vIC1uYW1lICcqLmlkeCcgXCkgLXByaW50YAorCTs7Citlc2FjCitwYWNrX29iamVjdHM9IiRwYWNrX29iamVjdHMgJGxvY2FsICRxdWlldCAkbm9fcmV1c2VfZGVsdGEkZXh0cmEiCituYW1lPSQoZ2l0LXJldi1saXN0IC0tb2JqZWN0cyAtLWFsbCAkcmV2X2xpc3QgMj4mMSB8CisJZ2l0LXBhY2stb2JqZWN0cyAtLW5vbi1lbXB0eSAkcGFja19vYmplY3RzIC50bXAtcGFjaykgfHwKKwlleGl0IDEKK2lmIFsgLXogIiRuYW1lIiBdOyB0aGVuCisJZWNobyBOb3RoaW5nIG5ldyB0byBwYWNrLgorZWxzZQorCWVjaG8gIlBhY2sgcGFjay0kbmFtZSBjcmVhdGVkLiIKKworCW1rZGlyIC1wICIkUEFDS0RJUiIgfHwgZXhpdAorCisJbXYgLnRtcC1wYWNrLSRuYW1lLnBhY2sgIiRQQUNLRElSL3BhY2stJG5hbWUucGFjayIgJiYKKwltdiAudG1wLXBhY2stJG5hbWUuaWR4ICAiJFBBQ0tESVIvcGFjay0kbmFtZS5pZHgiIHx8CisJZXhpdAorZmkKKworaWYgdGVzdCAiJHJlbW92ZV9yZWR1bmRhbnQiID0gdAordGhlbgorCSMgV2Uga25vdyAkZXhpc3RpbmcgYXJlIGFsbCByZWR1bmRhbnQgb25seSB3aGVuCisJIyBhbGwtaW50by1vbmUgaXMgdXNlZC4KKwlpZiB0ZXN0ICIkYWxsX2ludG9fb25lIiAhPSAnJyAmJiB0ZXN0ICIkZXhpc3RpbmciICE9ICcnCisJdGhlbgorCQlzeW5jCisJCSggY2QgIiRQQUNLRElSIiAmJgorCQkgIGZvciBlIGluICRleGlzdGluZworCQkgIGRvCisJCQljYXNlICIkZSIgaW4KKwkJCS4vcGFjay0kbmFtZS5wYWNrIHwgLi9wYWNrLSRuYW1lLmlkeCkgOzsKKwkJCSopCXJtIC1mICRlIDs7CisJCQllc2FjCisJCSAgZG9uZQorCQkpCisJZmkKKwlnaXQtcHJ1bmUtcGFja2VkCitmaQorCitjYXNlICIkbm9fdXBkYXRlX2luZm8iIGluCit0KSA6IDs7CisqKSBnaXQtdXBkYXRlLXNlcnZlci1pbmZvIDs7Citlc2FjCmRpZmYgLS1naXQgYS9naXQtcmVxdWVzdC1wdWxsLnNoIGIvZ2l0LXJlcXVlc3QtcHVsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzE5ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXJlcXVlc3QtcHVsbC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2ggLWUKKyMgQ29weXJpZ2h0IDIwMDUsIFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisjCisjIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKyMgYXQgdGhlIGRpc2NyZXRpb24gb2YgTGludXMgVG9ydmFsZHMuCisKK1VTQUdFPSc8Y29tbWl0PiA8dXJsPiBbPGhlYWQ+XScKK0xPTkdfVVNBR0U9J1N1bW1hcml6ZXMgdGhlIGNoYW5nZXMgc2luY2UgPGNvbW1pdD4gdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwKK2FuZCBpbmNsdWRlcyA8dXJsPiBpbiB0aGUgbWVzc2FnZSBnZW5lcmF0ZWQuJworU1VCRElSRUNUT1JZX09LPSdZZXMnCisuIGdpdC1zaC1zZXR1cAorCityZXZpc2lvbj0kMQordXJsPSQyCitoZWFkPSR7My1IRUFEfQorCitbICIkcmV2aXNpb24iIF0gfHwgdXNhZ2UKK1sgIiR1cmwiIF0gfHwgdXNhZ2UKKworYmFzZXJldj1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJHJldmlzaW9uIl4wYCAmJgoraGVhZHJldj1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJGhlYWQiXjBgIHx8IGV4aXQKKworZWNobyAiVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHNpbmNlIGNvbW1pdCAkYmFzZXJldjoiCitnaXQgbG9nIC0tbWF4LWNvdW50PTEgLS1wcmV0dHk9c2hvcnQgIiRiYXNlcmV2IiB8CitnaXQtc2hvcnRsb2cgfCBzZWQgLWUgJ3MvXlwoLlwpLyAgXDEvJworCitlY2hvICJhcmUgZm91bmQgaW4gdGhlIGdpdCByZXBvc2l0b3J5IGF0OiIgCitlY2hvCitlY2hvICIgICR1cmwiCitlY2hvCisKK2dpdCBsb2cgICRiYXNlcmV2Li4kaGVhZHJldiB8IGdpdC1zaG9ydGxvZyA7CitnaXQgZGlmZiAtLXN0YXQgLS1zdW1tYXJ5ICRiYXNlcmV2Li4kaGVhZHJldgpkaWZmIC0tZ2l0IGEvZ2l0LXJlcmVyZS5wZXJsIGIvZ2l0LXJlcmVyZS5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQzNjY0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmVyZXJlLnBlcmwKQEAgLTAsMCArMSwyMjcgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBSRXVzZSBSRWNvcmRlZCBSRXNvbHZlLiAgVGhpcyB0b29sIHJlY29yZHMgYSBjb25mbGljdGVkIGF1dG9tZXJnZQorIyByZXN1bHQgYW5kIGl0cyBoYW5kIHJlc29sdXRpb24sIGFuZCBoZWxwcyB0byByZXNvbHZlIGZ1dHVyZQorIyBhdXRvbWVyZ2UgdGhhdCByZXN1bHRzIGluIHRoZSBzYW1lIGNvbmZsaWN0LgorIworIyBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBjcmVhdGUgYSBkaXJlY3RvcnkgJ3JyLWNhY2hlJyB1bmRlciB5b3VyCisjIC5naXQvIGRpcmVjdG9yeS4KKwordXNlIERpZ2VzdDsKK3VzZSBGaWxlOjpQYXRoOwordXNlIEZpbGU6OkNvcHk7CisKK215ICRnaXRfZGlyID0gJDo6RU5We0dJVF9ESVJ9IHx8ICIuZ2l0IjsKK215ICRycl9kaXIgPSAiJGdpdF9kaXIvcnItY2FjaGUiOworbXkgJG1lcmdlX3JyID0gIiRnaXRfZGlyL3JyLWNhY2hlL01FUkdFX1JSIjsKKworbXkgJW1lcmdlX3JyID0gKCk7CisKK3N1YiByZWFkX3JyIHsKKwlpZiAoIS1mICRtZXJnZV9ycikgeworCQklbWVyZ2VfcnIgPSAoKTsKKwkJcmV0dXJuOworCX0KKwlteSAkaW47CisJbG9jYWwgJC8gPSAiXDAiOworCW9wZW4gJGluLCAiPCRtZXJnZV9yciIgb3IgZGllICIkITogJG1lcmdlX3JyIjsKKwl3aGlsZSAoPCRpbj4pIHsKKwkJY2hvbXA7CisJCW15ICgkbmFtZSwgJHBhdGgpID0gL14oWzAtOWEtZl17NDB9KVx0KC4qKSQvczsKKwkJJG1lcmdlX3JyeyRwYXRofSA9ICRuYW1lOworCX0KKwljbG9zZSAkaW47Cit9CisKK3N1YiB3cml0ZV9yciB7CisJbXkgJG91dDsKKwlvcGVuICRvdXQsICI+JG1lcmdlX3JyIiBvciBkaWUgIiQhOiAkbWVyZ2VfcnIiOworCWZvciBteSAkcGF0aCAoc29ydCBrZXlzICVtZXJnZV9ycikgeworCQlteSAkbmFtZSA9ICRtZXJnZV9ycnskcGF0aH07CisJCXByaW50ICRvdXQgIiRuYW1lXHQkcGF0aFwwIjsKKwl9CisJY2xvc2UgJG91dDsKK30KKworc3ViIGNvbXB1dGVfY29uZmxpY3RfbmFtZSB7CisJbXkgKCRwYXRoKSA9IEBfOworCW15IEBzaWRlID0gKCk7CisJbXkgJGluOworCW9wZW4gJGluLCAiPCRwYXRoIiAgb3IgZGllICIkITogJHBhdGgiOworCisJbXkgJHNoYTEgPSBEaWdlc3QtPm5ldygiU0hBLTEiKTsKKwlteSAkaHVuayA9IDA7CisJd2hpbGUgKDwkaW4+KSB7CisJCWlmICgvXjw8PDw8PDwgLiovKSB7CisJCQkkaHVuaysrOworCQkJQHNpZGUgPSAoW10sIHVuZGVmKTsKKwkJfQorCQllbHNpZiAoL149PT09PT09JC8pIHsKKwkJCSRzaWRlWzFdID0gW107CisJCX0KKwkJZWxzaWYgKC9ePj4+Pj4+PiAuKi8pIHsKKwkJCW15ICgkb25lLCAkdHdvKTsKKwkJCSRvbmUgPSBqb2luKCcnLCBAeyRzaWRlWzBdfSk7CisJCQkkdHdvID0gam9pbignJywgQHskc2lkZVsxXX0pOworCQkJaWYgKCR0d28gbGUgJG9uZSkgeworCQkJCSgkb25lLCAkdHdvKSA9ICgkdHdvLCAkb25lKTsKKwkJCX0KKwkJCSRzaGExLT5hZGQoJG9uZSk7CisJCQkkc2hhMS0+YWRkKCJcMCIpOworCQkJJHNoYTEtPmFkZCgkdHdvKTsKKwkJCSRzaGExLT5hZGQoIlwwIik7CisJCQlAc2lkZSA9ICgpOworCQl9CisJCWVsc2lmIChAc2lkZSA9PSAwKSB7CisJCQluZXh0OworCQl9CisJCWVsc2lmIChkZWZpbmVkICRzaWRlWzFdKSB7CisJCQlwdXNoIEB7JHNpZGVbMV19LCAkXzsKKwkJfQorCQllbHNlIHsKKwkJCXB1c2ggQHskc2lkZVswXX0sICRfOworCQl9CisJfQorCWNsb3NlICRpbjsKKwlyZXR1cm4gKCRzaGExLT5oZXhkaWdlc3QsICRodW5rKTsKK30KKworc3ViIHJlY29yZF9wcmVpbWFnZSB7CisJbXkgKCRwYXRoLCAkbmFtZSkgPSBAXzsKKwlteSBAc2lkZSA9ICgpOworCW15ICgkaW4sICRvdXQpOworCW9wZW4gJGluLCAiPCRwYXRoIiAgb3IgZGllICIkITogJHBhdGgiOworCW9wZW4gJG91dCwgIj4kbmFtZSIgb3IgZGllICIkITogJG5hbWUiOworCisJd2hpbGUgKDwkaW4+KSB7CisJCWlmICgvXjw8PDw8PDwgLiovKSB7CisJCQlAc2lkZSA9IChbXSwgdW5kZWYpOworCQl9CisJCWVsc2lmICgvXj09PT09PT0kLykgeworCQkJJHNpZGVbMV0gPSBbXTsKKwkJfQorCQllbHNpZiAoL14+Pj4+Pj4+IC4qLykgeworCQkJbXkgKCRvbmUsICR0d28pOworCQkJJG9uZSA9IGpvaW4oJycsIEB7JHNpZGVbMF19KTsKKwkJCSR0d28gPSBqb2luKCcnLCBAeyRzaWRlWzFdfSk7CisJCQlpZiAoJHR3byBsZSAkb25lKSB7CisJCQkJKCRvbmUsICR0d28pID0gKCR0d28sICRvbmUpOworCQkJfQorCQkJcHJpbnQgJG91dCAiPDw8PDw8PFxuIjsKKwkJCXByaW50ICRvdXQgJG9uZTsKKwkJCXByaW50ICRvdXQgIj09PT09PT1cbiI7CisJCQlwcmludCAkb3V0ICR0d287CisJCQlwcmludCAkb3V0ICI+Pj4+Pj4+XG4iOworCQkJQHNpZGUgPSAoKTsKKwkJfQorCQllbHNpZiAoQHNpZGUgPT0gMCkgeworCQkJcHJpbnQgJG91dCAkXzsKKwkJfQorCQllbHNpZiAoZGVmaW5lZCAkc2lkZVsxXSkgeworCQkJcHVzaCBAeyRzaWRlWzFdfSwgJF87CisJCX0KKwkJZWxzZSB7CisJCQlwdXNoIEB7JHNpZGVbMF19LCAkXzsKKwkJfQorCX0KKwljbG9zZSAkb3V0OworCWNsb3NlICRpbjsKK30KKworc3ViIGZpbmRfY29uZmxpY3QgeworCW15ICRpbjsKKwlsb2NhbCAkLyA9ICJcMCI7CisJbXkgJHBpZCA9IG9wZW4oJGluLCAnLXwnKTsKKwlkaWUgIiQhIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCWlmICghJHBpZCkgeworCQlleGVjKHF3KGdpdCBscy1maWxlcyAteiAtdSkpIG9yIGRpZSAiJCE6IGxzLWZpbGVzIjsKKwl9CisJbXkgJXBhdGggPSAoKTsKKwlteSBAcGF0aCA9ICgpOworCXdoaWxlICg8JGluPikgeworCQljaG9tcDsKKwkJbXkgKCRtb2RlLCAkc2hhMSwgJHN0YWdlLCAkcGF0aCkgPQorCQkgICAgL14oWzAtN10rKSAoWzAtOWEtZl17NDB9KSAoWzEyM10pXHQoLiopJC9zOworCQkkcGF0aHskcGF0aH0gfD0gKDEgPDwgJHN0YWdlKTsKKwl9CisJY2xvc2UgJGluOworCXdoaWxlIChteSAoJHBhdGgsICRzdGF0dXMpID0gZWFjaCAlcGF0aCkgeworCQlpZiAoJHN0YXR1cyA9PSAxNCkgeyBwdXNoIEBwYXRoLCAkcGF0aDsgfQorCX0KKwlyZXR1cm4gQHBhdGg7Cit9CisKK3N1YiBtZXJnZSB7CisJbXkgKCRuYW1lLCAkcGF0aCkgPSBAXzsKKwlyZWNvcmRfcHJlaW1hZ2UoJHBhdGgsICIkcnJfZGlyLyRuYW1lL3RoaXNpbWFnZSIpOworCXVubGVzcyAoc3lzdGVtKCdtZXJnZScsIG1hcCB7ICIkcnJfZGlyLyRuYW1lLyR7X31pbWFnZSIgfQorCQkgICAgICAgcXcodGhpcyBwcmUgcG9zdCkpKSB7CisJCW15ICRpbjsKKwkJb3BlbiAkaW4sICI8JHJyX2Rpci8kbmFtZS90aGlzaW1hZ2UiIG9yCisJCSAgICBkaWUgIiQhOiAkbmFtZS90aGlzaW1hZ2UiOworCQlteSAkb3V0OworCQlvcGVuICRvdXQsICI+JHBhdGgiIG9yIGRpZSAiJCE6ICRwYXRoIjsKKwkJd2hpbGUgKDwkaW4+KSB7IHByaW50ICRvdXQgJF87IH0KKwkJY2xvc2UgJGluOworCQljbG9zZSAkb3V0OworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy1kICIkcnJfZGlyIiB8fCBleGl0KDApOworCityZWFkX3JyKCk7CitteSAlY29uZmxpY3QgPSBtYXAgeyAkXyA9PiAxIH0gZmluZF9jb25mbGljdCgpOworCisjIE1FUkdFX1JSIHJlY29yZHMgcGF0aHMgd2l0aCBjb25mbGljdHMgaW1tZWRpYXRlbHkgYWZ0ZXIgbWVyZ2UKKyMgZmFpbGVkLiAgU29tZSBvZiB0aGUgY29uZmxpY3RlZCBwYXRocyBtaWdodCBoYXZlIGJlZW4gaGFuZCByZXNvbHZlZAorIyBpbiB0aGUgd29ya2luZyB0cmVlIHNpbmNlIHRoZW4sIGJ1dCB0aGUgaW5pdGlhbCBydW4gd291bGQgY2F0Y2ggYWxsCisjIGFuZCByZWdpc3RlciB0aGVpciBwcmVpbWFnZXMuCisKK2ZvciBteSAkcGF0aCAoa2V5cyAlY29uZmxpY3QpIHsKKwkjIFRoaXMgcGF0aCBoYXMgY29uZmxpY3QuICBJZiBpdCBpcyBub3QgcmVjb3JkZWQgeWV0LAorCSMgcmVjb3JkIHRoZSBwcmUtaW1hZ2UuCisJaWYgKCFleGlzdHMgJG1lcmdlX3JyeyRwYXRofSkgeworCQlteSAoJG5hbWUsICRodW5rKSA9IGNvbXB1dGVfY29uZmxpY3RfbmFtZSgkcGF0aCk7CisJCW5leHQgdW5sZXNzICgkaHVuayk7CisJCSRtZXJnZV9ycnskcGF0aH0gPSAkbmFtZTsKKwkJaWYgKCEgLWQgIiRycl9kaXIvJG5hbWUiKSB7CisJCQlta3BhdGgoIiRycl9kaXIvJG5hbWUiLCAwLCAwNzc3KTsKKwkJCXByaW50IFNUREVSUiAiUmVjb3JkZWQgcHJlaW1hZ2UgZm9yICckcGF0aCdcbiI7CisJCQlyZWNvcmRfcHJlaW1hZ2UoJHBhdGgsICIkcnJfZGlyLyRuYW1lL3ByZWltYWdlIik7CisJCX0KKwl9Cit9CisKKyMgTm93IHNvbWUgb2YgdGhlIHBhdGhzIHRoYXQgaGFkIGNvbmZsaWN0cyBlYXJsaWVyIG1pZ2h0IGhhdmUgYmVlbgorIyBoYW5kIHJlc29sdmVkLiAgT3RoZXJzIG1heSBiZSBzaW1pbGFyIHRvIGEgY29uZmxpY3QgYWxyZWFkeSB0aGF0CisjIHdhcyByZXNvbHZlZCBiZWZvcmUuCisKK2ZvciBteSAkcGF0aCAoa2V5cyAlbWVyZ2VfcnIpIHsKKwlteSAkbmFtZSA9ICRtZXJnZV9ycnskcGF0aH07CisKKwkjIFdlIGNvdWxkIHJlc29sdmUgdGhpcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgaW1hZ2VzLgorCWlmICgtZiAiJHJyX2Rpci8kbmFtZS9wcmVpbWFnZSIgJiYKKwkgICAgLWYgIiRycl9kaXIvJG5hbWUvcG9zdGltYWdlIikgeworCQlpZiAobWVyZ2UoJG5hbWUsICRwYXRoKSkgeworCQkJcHJpbnQgU1RERVJSICJSZXNvbHZlZCAnJHBhdGgnIHVzaW5nIHByZXZpb3VzIHJlc29sdXRpb24uXG4iOworCQkJIyBUaGVuIHdlIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgcGF0aAorCQkJIyBhbnltb3JlLgorCQkJZGVsZXRlICRtZXJnZV9ycnskcGF0aH07CisJCQluZXh0OworCQl9CisJfQorCisJIyBMZXQncyBzZWUgaWYgd2UgaGF2ZSByZXNvbHZlZCBpdC4KKwkodW5kZWYsIG15ICRodW5rKSA9IGNvbXB1dGVfY29uZmxpY3RfbmFtZSgkcGF0aCk7CisJbmV4dCBpZiAoJGh1bmspOworCisJcHJpbnQgU1RERVJSICJSZWNvcmRlZCByZXNvbHV0aW9uIGZvciAnJHBhdGgnLlxuIjsKKwljb3B5KCRwYXRoLCAiJHJyX2Rpci8kbmFtZS9wb3N0aW1hZ2UiKTsKKwkjIEFuZCB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGlzIHBhdGggYW55bW9yZS4KKwlkZWxldGUgJG1lcmdlX3JyeyRwYXRofTsKK30KKworIyBXcml0ZSBvdXQgdGhlIHJlc3QuCit3cml0ZV9ycigpOwpkaWZmIC0tZ2l0IGEvZ2l0LXJlc2V0LnNoIGIvZ2l0LXJlc2V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5NmYzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmVzZXQuc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL3NoCisKK1VTQUdFPSdbLS1taXhlZCB8IC0tc29mdCB8IC0taGFyZF0gIFs8Y29tbWl0LWlzaD5dJworLiBnaXQtc2gtc2V0dXAKKwordG1wPSR7R0lUX0RJUn0vcmVzZXQuJCQKK3RyYXAgJ3JtIC1mICR0bXAtKicgMCAxIDIgMyAxNQorCit1cGRhdGU9CityZXNldF90eXBlPS0tbWl4ZWQKK2Nhc2UgIiQxIiBpbgorLS1taXhlZCB8IC0tc29mdCB8IC0taGFyZCkKKwlyZXNldF90eXBlPSIkMSIKKwlzaGlmdAorCTs7CistKikKKyAgICAgICAgdXNhZ2UgOzsKK2VzYWMKKworcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAtLWRlZmF1bHQgSEVBRCAiJEAiKSB8fCBleGl0CityZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICRyZXZeMCkgfHwgZXhpdAorCisjIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHNldCBvZiBwYXRocyB0aGF0IF9jb3VsZF8gYmUgbGVmdAorIyBiZWhpbmQgYmVmb3JlIGEgaGFyZCByZXNldCwgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoZW0uCitpZiB0ZXN0ICIkcmVzZXRfdHlwZSIgPSAiLS1oYXJkIgordGhlbgorCXVwZGF0ZT0tdQorZmkKKworIyBTb2Z0IHJlc2V0IGRvZXMgbm90IHRvdWNoIHRoZSBpbmRleCBmaWxlIG5vciB0aGUgd29ya2luZyB0cmVlCisjIGF0IGFsbCwgYnV0IHJlcXVpcmVzIHRoZW0gaW4gYSBnb29kIG9yZGVyLiAgT3RoZXIgcmVzZXRzIHJlc2V0CisjIHRoZSBpbmRleCBmaWxlIHRvIHRoZSB0cmVlIG9iamVjdCB3ZSBhcmUgc3dpdGNoaW5nIHRvLgoraWYgdGVzdCAiJHJlc2V0X3R5cGUiID0gIi0tc29mdCIKK3RoZW4KKwlpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiB8fAorCSAgIHRlc3QgIiIgIT0gIiQoZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQpIgorCXRoZW4KKwkJZGllICJDYW5ub3QgZG8gYSBzb2Z0IHJlc2V0IGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZS4iCisJZmkKK2Vsc2UKKwlnaXQtcmVhZC10cmVlIC0tcmVzZXQgJHVwZGF0ZSAiJHJldiIgfHwgZXhpdAorZmkKKworIyBBbnkgcmVzZXRzIHVwZGF0ZSBIRUFEIHRvIHRoZSBoZWFkIGJlaW5nIHN3aXRjaGVkIHRvLgoraWYgb3JpZz0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCAyPi9kZXYvbnVsbCkKK3RoZW4KKwllY2hvICIkb3JpZyIgPiIkR0lUX0RJUi9PUklHX0hFQUQiCitlbHNlCisJcm0gLWYgIiRHSVRfRElSL09SSUdfSEVBRCIKK2ZpCitnaXQtdXBkYXRlLXJlZiAtbSAicmVzZXQgJHJlc2V0X3R5cGUgJEAiIEhFQUQgIiRyZXYiCisKK2Nhc2UgIiRyZXNldF90eXBlIiBpbgorLS1oYXJkICkKKwk7OyAjIE5vdGhpbmcgZWxzZSB0byBkbworLS1zb2Z0ICkKKwk7OyAjIE5vdGhpbmcgZWxzZSB0byBkbworLS1taXhlZCApCisJIyBSZXBvcnQgd2hhdCBoYXMgbm90IGJlZW4gdXBkYXRlZC4KKwlnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaAorCTs7Citlc2FjCisKK3JtIC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiAiJEdJVF9ESVIvcnItY2FjaGUvTUVSR0VfUlIiCmRpZmYgLS1naXQgYS9naXQtcmVzb2x2ZS5zaCBiL2dpdC1yZXNvbHZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjN2FhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmVzb2x2ZS5zaApAQCAtMCwwICsxLDEwNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIworIyBSZXNvbHZlIHR3byB0cmVlcy4KKyMKKworVVNBR0U9JzxoZWFkPiA8cmVtb3RlPiA8bWVyZ2UtbWVzc2FnZT4nCisuIGdpdC1zaC1zZXR1cAorCitkcm9waGVhZHMoKSB7CisJcm0gLWYgLS0gIiRHSVRfRElSL01FUkdFX0hFQUQiIFwKKwkJIiRHSVRfRElSL0xBU1RfTUVSR0UiIHx8IGV4aXQgMQorfQorCitoZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDEiXjApICYmCittZXJnZT0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQyIl4wKSAmJgorbWVyZ2VfbXNnPSIkMyIgfHwgdXNhZ2UKKworIworIyBUaGUgcmVtb3RlIG5hbWUgaXMganVzdCB1c2VkIGZvciB0aGUgbWVzc2FnZSwKKyMgYnV0IHdlIGRvIHdhbnQgaXQuCisjCitpZiBbIC16ICIkaGVhZCIgLW8gLXogIiRtZXJnZSIgLW8gLXogIiRtZXJnZV9tc2ciIF07IHRoZW4KKwl1c2FnZQorZmkKKworZHJvcGhlYWRzCitlY2hvICRoZWFkID4gIiRHSVRfRElSIi9PUklHX0hFQUQKK2VjaG8gJG1lcmdlID4gIiRHSVRfRElSIi9MQVNUX01FUkdFCisKK2NvbW1vbj0kKGdpdC1tZXJnZS1iYXNlICRoZWFkICRtZXJnZSkKK2lmIFsgLXogIiRjb21tb24iIF07IHRoZW4KKwlkaWUgIlVuYWJsZSB0byBmaW5kIGNvbW1vbiBjb21taXQgYmV0d2VlbiIgJG1lcmdlICRoZWFkCitmaQorCitjYXNlICIkY29tbW9uIiBpbgorIiRtZXJnZSIpCisJZWNobyAiQWxyZWFkeSB1cC10by1kYXRlLiBZZWVhaCEiCisJZHJvcGhlYWRzCisJZXhpdCAwCisJOzsKKyIkaGVhZCIpCisJZWNobyAiVXBkYXRpbmcgZnJvbSAkaGVhZCB0byAkbWVyZ2UiCisJZ2l0LXJlYWQtdHJlZSAtdSAtbSAkaGVhZCAkbWVyZ2UgfHwgZXhpdCAxCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAiJG1lcmdlIiAiJGhlYWQiCisJZ2l0LWRpZmYtdHJlZSAtcCAkaGVhZCAkbWVyZ2UgfCBnaXQtYXBwbHkgLS1zdGF0CisJZHJvcGhlYWRzCisJZXhpdCAwCisJOzsKK2VzYWMKKworIyBXZSBhcmUgZ29pbmcgdG8gbWFrZSBhIG5ldyBjb21taXQuCitnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKKyMgRmluZCBhbiBvcHRpbXVtIG1lcmdlIGJhc2UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY2FuZGlkYXRlcy4KK0xGPScKKycKK2NvbW1vbj0kKGdpdC1tZXJnZS1iYXNlIC1hICRoZWFkICRtZXJnZSkKK2Nhc2UgIiRjb21tb24iIGluCis/KiIkTEYiPyopCisJZWNobyAiVHJ5aW5nIHRvIGZpbmQgdGhlIG9wdGltdW0gbWVyZ2UgYmFzZS4iCisJRz0udG1wLWluZGV4JCQKKwliZXN0PQorCWJlc3RfY250PS0xCisJZm9yIGMgaW4gJGNvbW1vbgorCWRvCisJCXJtIC1mICRHCisJCUdJVF9JTkRFWF9GSUxFPSRHIGdpdC1yZWFkLXRyZWUgLW0gJGMgJGhlYWQgJG1lcmdlIFwKKwkJCTI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCisJCSMgQ291bnQgdGhlIHBhdGhzIHRoYXQgYXJlIHVubWVyZ2VkLgorCQljbnQ9YEdJVF9JTkRFWF9GSUxFPSRHIGdpdC1scy1maWxlcyAtLXVubWVyZ2VkIHwgd2MgLWxgCisJCWlmIHRlc3QgJGJlc3RfY250IC1sZSAwIC1vICRjbnQgLWxlICRiZXN0X2NudAorCQl0aGVuCisJCQliZXN0PSRjCisJCQliZXN0X2NudD0kY250CisJCQlpZiB0ZXN0ICIkYmVzdF9jbnQiIC1lcSAwCisJCQl0aGVuCisJCQkJIyBDYW5ub3QgZG8gYW55IGJldHRlciB0aGFuIGFsbCB0cml2aWFsIG1lcmdlLgorCQkJCWJyZWFrCisJCQlmaQorCQlmaQorCWRvbmUKKwlybSAtZiAkRworCWNvbW1vbj0iJGJlc3QiCitlc2FjCisKK2VjaG8gIlRyeWluZyB0byBtZXJnZSAkbWVyZ2UgaW50byAkaGVhZCB1c2luZyAkY29tbW9uLiIKK2dpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCitnaXQtcmVhZC10cmVlIC11IC1tICRjb21tb24gJGhlYWQgJG1lcmdlIHx8IGV4aXQgMQorcmVzdWx0X3RyZWU9JChnaXQtd3JpdGUtdHJlZSAgMj4gL2Rldi9udWxsKQoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJZWNobyAiU2ltcGxlIG1lcmdlIGZhaWxlZCwgdHJ5aW5nIEF1dG9tYXRpYyBtZXJnZSIKKwlnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJCWVjaG8gJG1lcmdlID4gIiRHSVRfRElSIi9NRVJHRV9IRUFECisJCWRpZSAiQXV0b21hdGljIG1lcmdlIGZhaWxlZCwgZml4IHVwIGJ5IGhhbmQiCisJZmkKKwlyZXN1bHRfdHJlZT0kKGdpdC13cml0ZS10cmVlKSB8fCBleGl0IDEKK2ZpCityZXN1bHRfY29tbWl0PSQoZWNobyAiJG1lcmdlX21zZyIgfCBnaXQtY29tbWl0LXRyZWUgJHJlc3VsdF90cmVlIC1wICRoZWFkIC1wICRtZXJnZSkKK2VjaG8gIkNvbW1pdHRlZCBtZXJnZSAkcmVzdWx0X2NvbW1pdCIKK2dpdC11cGRhdGUtcmVmIEhFQUQgIiRyZXN1bHRfY29tbWl0IiAiJGhlYWQiCitnaXQtZGlmZi10cmVlIC1wICRoZWFkICRyZXN1bHRfY29tbWl0IHwgZ2l0LWFwcGx5IC0tc3RhdAorZHJvcGhlYWRzCmRpZmYgLS1naXQgYS9naXQtcmV2ZXJ0LnNoIGIvZ2l0LXJldmVydC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZThiNWYwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXJldmVydC5zaApAQCAtMCwwICsxLDE3MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKworY2FzZSAiJDAiIGluCisqLXJldmVydCogKQorCXRlc3QgLXQgMCAmJiBlZGl0PS1lCisJbWU9cmV2ZXJ0CisJVVNBR0U9J1stLWVkaXQgfCAtLW5vLWVkaXRdIFstbl0gPGNvbW1pdC1pc2g+JyA7OworKi1jaGVycnktcGljayogKQorCWVkaXQ9CisJbWU9Y2hlcnJ5LXBpY2sKKwlVU0FHRT0nWy0tZWRpdF0gWy1uXSBbLXJdIDxjb21taXQtaXNoPicgIDs7CisqICkKKwlkaWUgIldoYXQgYXJlIHlvdSB0YWxraW5nIGFib3V0PyIgOzsKK2VzYWMKKy4gZ2l0LXNoLXNldHVwCisKK25vX2NvbW1pdD0gcmVwbGF5PQord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLW58LS1ufC0tbm98LS1uby18LS1uby1jfC0tbm8tY298LS1uby1jb218LS1uby1jb21tfFwKKwkgICAgLS1uby1jb21taXwtLW5vLWNvbW1pdCkKKwkJbm9fY29tbWl0PXQKKwkJOzsKKwktZXwtLWV8LS1lZHwtLWVkaXwtLWVkaXQpCisJCWVkaXQ9LWUKKwkJOzsKKwktLW58LS1ub3wtLW5vLXwtLW5vLWV8LS1uby1lZHwtLW5vLWVkaXwtLW5vLWVkaXQpCisJCWVkaXQ9CisJCTs7CisJLXJ8LS1yfC0tcmV8LS1yZXB8LS1yZXBsfC0tcmVwbGF8LS1yZXBsYXkpCisJCXJlcGxheT10CisJCTs7CisJLSopCisJCXVzYWdlCisJCTs7CisJKikKKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKwordGVzdCAiJG1lLCRyZXBsYXkiID0gInJldmVydCx0IiAmJiB1c2FnZQorCitjYXNlICIkbm9fY29tbWl0IiBpbgordCkKKwkjIFdlIGRvIG5vdCBpbnRlbmQgdG8gY29tbWl0IGltbWVkaWF0ZWx5LiAgV2UganVzdCB3YW50IHRvCisJIyBtZXJnZSB0aGUgZGlmZmVyZW5jZXMgaW4uCisJaGVhZD0kKGdpdC13cml0ZS10cmVlKSB8fAorCQlkaWUgIllvdXIgaW5kZXggZmlsZSBpcyB1bm1lcmdlZC4iCisJOzsKKyopCisJaGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgfHwKKwkJZGllICJZb3UgZG8gbm90IGhhdmUgYSB2YWxpZCBIRUFEIgorCWZpbGVzPSQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgJGhlYWQpIHx8IGV4aXQKKwlpZiBbICIkZmlsZXMiIF07IHRoZW4KKwkJZGllICJEaXJ0eSBpbmRleDogY2Fubm90ICRtZSAoZGlydHk6ICRmaWxlcykiCisJZmkKKwk7OworZXNhYworCityZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkQCIpICYmCitjb21taXQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmV2XjAiKSB8fAorCWRpZSAiTm90IGEgc2luZ2xlIGNvbW1pdCAkQCIKK3ByZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkY29tbWl0XjEiIDI+L2Rldi9udWxsKSB8fAorCWRpZSAiQ2Fubm90IHJ1biAkbWUgYSByb290IGNvbW1pdCIKK2dpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRjb21taXReMiIgPi9kZXYvbnVsbCAyPiYxICYmCisJZGllICJDYW5ub3QgcnVuICRtZSBhIG11bHRpLXBhcmVudCBjb21taXQuIgorCisjICJjb21taXQiIGlzIGFuIGV4aXN0aW5nIGNvbW1pdC4gIFdlIHdvdWxkIHdhbnQgdG8gYXBwbHkKKyMgdGhlIGRpZmZlcmVuY2UgaXQgaW50cm9kdWNlcyBzaW5jZSBpdHMgZmlyc3QgcGFyZW50ICJwcmV2IgorIyBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgSEVBRCBpZiB3ZSBhcmUgY2hlcnJ5LXBpY2suICBPciB0aGUKKyMgcmV2ZXJzZSBvZiBpdCBpZiB3ZSBhcmUgcmV2ZXJ0LgorCitjYXNlICIkbWUiIGluCityZXZlcnQpCisJZ2l0LXJldi1saXN0IC0tcHJldHR5PW9uZWxpbmUgLS1tYXgtY291bnQ9MSAkY29tbWl0IHwKKwlzZWQgLWUgJworCQlzL15bXiBdKiAvUmV2ZXJ0ICIvCisJCXMvJC8iLycKKwllY2hvCisJZWNobyAiVGhpcyByZXZlcnRzICRjb21taXQgY29tbWl0LiIKKwl0ZXN0ICIkcmV2IiA9ICIkY29tbWl0IiB8fAorCWVjaG8gIihvcmlnaW5hbCAnZ2l0IHJldmVydCcgYXJndW1lbnRzOiAkQCkiCisJYmFzZT0kY29tbWl0IG5leHQ9JHByZXYKKwk7OworCitjaGVycnktcGljaykKKwlwaWNrX2F1dGhvcl9zY3JpcHQ9JworCS9eYXV0aG9yIC97CisJCXMvJ1wnJy8nXCcnXFwnXCdcJycvZworCQloCisJCXMvXmF1dGhvciBcKFtePF0qXCkgPFtePl0qPiAuKiQvXDEvCisJCXMvJ1wnJy8nXCcnXCdcJ1wnJy9nCisJCXMvLiovR0lUX0FVVEhPUl9OQU1FPSdcJycmJ1wnJy9wCisKKwkJZworCQlzL15hdXRob3IgW148XSogPFwoW14+XSpcKT4gLiokL1wxLworCQlzLydcJycvJ1wnJ1wnXCdcJycvZworCQlzLy4qL0dJVF9BVVRIT1JfRU1BSUw9J1wnJyYnXCcnL3AKKworCQlnCisJCXMvXmF1dGhvciBbXjxdKiA8W14+XSo+IFwoLipcKSQvXDEvCisJCXMvJ1wnJy8nXCcnXCdcJ1wnJy9nCisJCXMvLiovR0lUX0FVVEhPUl9EQVRFPSdcJycmJ1wnJy9wCisKKwkJcQorCX0nCisJc2V0X2F1dGhvcl9lbnY9YGdpdC1jYXQtZmlsZSBjb21taXQgIiRjb21taXQiIHwKKwlMQU5HPUMgTENfQUxMPUMgc2VkIC1uZSAiJHBpY2tfYXV0aG9yX3NjcmlwdCJgCisJZXZhbCAiJHNldF9hdXRob3JfZW52IgorCWV4cG9ydCBHSVRfQVVUSE9SX05BTUUKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTAorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEUKKworCWdpdC1jYXQtZmlsZSBjb21taXQgJGNvbW1pdCB8IHNlZCAtZSAnMSwvXiQvZCcKKwljYXNlICIkcmVwbGF5IiBpbgorCScnKQorCQllY2hvICIoY2hlcnJ5IHBpY2tlZCBmcm9tICRjb21taXQgY29tbWl0KSIKKwkJdGVzdCAiJHJldiIgPSAiJGNvbW1pdCIgfHwKKwkJZWNobyAiKG9yaWdpbmFsICdnaXQgY2hlcnJ5LXBpY2snIGFyZ3VtZW50czogJEApIgorCQk7OworCWVzYWMKKwliYXNlPSRwcmV2IG5leHQ9JGNvbW1pdAorCTs7CisKK2VzYWMgPi5tc2cKKworIyBUaGlzIHRocmVlIHdheSBtZXJnZSBpcyBhbiBpbnRlcmVzdGluZyBvbmUuICBXZSBhcmUgYXQKKyMgJGhlYWQsIGFuZCB3b3VsZCB3YW50IHRvIGFwcGx5IHRoZSBjaGFuZ2UgYmV0d2VlbiAkY29tbWl0CisjIGFuZCAkcHJldiBvbiB0b3Agb2YgdXMgKHdoZW4gcmV2ZXJ0aW5nKSwgb3IgdGhlIGNoYW5nZSBiZXR3ZWVuCisjICRwcmV2IGFuZCAkY29tbWl0IG9uIHRvcCBvZiB1cyAod2hlbiBjaGVycnktcGlja2luZyBvciByZXBsYXlpbmcpLgorCitlY2hvID4mMiAiRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byAkbWUuIgorZ2l0LXJlYWQtdHJlZSAtbSAtdSAtLWFnZ3Jlc3NpdmUgJGJhc2UgJGhlYWQgJG5leHQgJiYKK3Jlc3VsdD0kKGdpdC13cml0ZS10cmVlIDI+L2Rldi9udWxsKSB8fCB7CisgICAgZWNobyA+JjIgIlNpbXBsZSAkbWUgZmFpbHM7IHRyeWluZyBBdXRvbWF0aWMgJG1lLiIKKyAgICBnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hIHx8IHsKKwkgICAgZWNobyA+JjIgIkF1dG9tYXRpYyAkbWUgZmFpbGVkLiAgQWZ0ZXIgcmVzb2x2aW5nIHRoZSBjb25mbGljdHMsIgorCSAgICBlY2hvID4mMiAibWFyayB0aGUgY29ycmVjdGVkIHBhdGhzIHdpdGggJ2dpdC11cGRhdGUtaW5kZXggPHBhdGhzPiciCisJICAgIGVjaG8gPiYyICJhbmQgY29tbWl0IHdpdGggJ2dpdCBjb21taXQgLUYgLm1zZyciCisJICAgIGNhc2UgIiRtZSIgaW4KKwkgICAgY2hlcnJ5LXBpY2spCisJCWVjaG8gPiYyICJZb3UgbWF5IGNob29zZSB0byB1c2UgdGhlIGZvbGxvd2luZyB3aGVuIG1ha2luZyIKKwkJZWNobyA+JjIgInRoZSBjb21taXQ6IgorCQllY2hvID4mMiAiJHNldF9hdXRob3JfZW52IgorCSAgICBlc2FjCisJICAgIGV4aXQgMQorICAgIH0KKyAgICByZXN1bHQ9JChnaXQtd3JpdGUtdHJlZSkgfHwgZXhpdAorfQorZWNobyA+JjIgIkZpbmlzaGVkIG9uZSAkbWUuIgorCisjIElmIHdlIGFyZSBjaGVycnktcGljaywgYW5kIGlmIHRoZSBtZXJnZSBkaWQgbm90IHJlc3VsdCBpbgorIyBoYW5kLWVkaXRpbmcsIHdlIHdpbGwgaGl0IHRoaXMgY29tbWl0IGFuZCBpbmhlcml0IHRoZSBvcmlnaW5hbAorIyBhdXRob3IgZGF0ZSBhbmQgbmFtZS4KKyMgSWYgd2UgYXJlIHJldmVydCwgb3IgaWYgb3VyIGNoZXJyeS1waWNrIHJlc3VsdHMgaW4gYSBoYW5kIG1lcmdlLAorIyB3ZSBoYWQgYmV0dGVyIHNheSB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoYXQuCisKK2Nhc2UgIiRub19jb21taXQiIGluCisnJykKKwlnaXQtY29tbWl0IC1uIC1GIC5tc2cgJGVkaXQKKwlybSAtZiAubXNnCisJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2dpdC1zZW5kLWVtYWlsLnBlcmwgYi9naXQtc2VuZC1lbWFpbC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiMWNjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc2VuZC1lbWFpbC5wZXJsCkBAIC0wLDAgKzEsNTM2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXJpZ2h0IDIwMDIsMjAwNSBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorIyBDb3B5cmlnaHQgMjAwNSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorIworIyBHUEwgdjIgKFNlZSBDT1BZSU5HKQorIworIyBQb3J0ZWQgdG8gc3VwcG9ydCBnaXQgIm1ib3giIGZvcm1hdCBmaWxlcyBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorIworIyBTZW5kcyBhIGNvbGxlY3Rpb24gb2YgZW1haWxzIHRvIHRoZSBnaXZlbiBlbWFpbCBhZGRyZXNzZXMsIGRpc3R1cmJpbmdseSBmYXN0LgorIworIyBTdXBwb3J0cyB0d28gZm9ybWF0czoKKyMgMS4gbWJveCBmb3JtYXQgZmlsZXMgKGlnbm9yaW5nIG1vc3QgaGVhZGVycyBhbmQgTUlNRSBmb3JtYXR0aW5nIC0gdGhpcyBpcyBkZXNpZ25lZCBmb3Igc2VuZGluZyBwYXRjaGVzKQorIyAyLiBUaGUgb3JpZ2luYWwgZm9ybWF0IHN1cHBvcnQgYnkgR3JlZydzIHNjcmlwdDoKKyMgICAgZmlyc3QgbGluZSBvZiB0aGUgbWVzc2FnZSBpcyB3aG8gdG8gQ0MsCisjICAgIGFuZCBzZWNvbmQgbGluZSBpcyB0aGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZS4KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBUZXJtOjpSZWFkTGluZTsKK3VzZSBHZXRvcHQ6Okxvbmc7Cit1c2UgRGF0YTo6RHVtcGVyOworCisjIG1vc3QgbWFpbCBzZXJ2ZXJzIGdlbmVyYXRlIHRoZSBEYXRlOiBoZWFkZXIsIGJ1dCBub3QgYWxsLi4uCiskRU5We0xDX0FMTH0gPSAnQyc7Cit1c2UgUE9TSVggcXcvc3RyZnRpbWUvOworCitteSAkaGF2ZV9lbWFpbF92YWxpZCA9IGV2YWwgeyByZXF1aXJlIEVtYWlsOjpWYWxpZDsgMSB9OworbXkgJHNtdHA7CisKK3N1YiB1bmlxdWVfZW1haWxfbGlzdChAKTsKK3N1YiBjbGVhbnVwX2NvbXBvc2VfZmlsZXMoKTsKKworIyBDb25zdGFudHMgKGVzc2VudGlhbGx5KQorbXkgJGNvbXBvc2VfZmlsZW5hbWUgPSAiLm1zZy4kJCI7CisKKyMgVmFyaWFibGVzIHdlIGZpbGwgaW4gYXV0b21hdGljYWxseSwgb3IgdmlhIHByb21wdGluZzoKK215IChAdG8sQGNjLEBpbml0aWFsX2NjLEBiY2NsaXN0LAorCSRpbml0aWFsX3JlcGx5X3RvLCRpbml0aWFsX3N1YmplY3QsQGZpbGVzLCRmcm9tLCRjb21wb3NlLCR0aW1lKTsKKworIyBCZWhhdmlvciBtb2RpZmljYXRpb24gdmFyaWFibGVzCitteSAoJGNoYWluX3JlcGx5X3RvLCAkcXVpZXQsICRzdXBwcmVzc19mcm9tLCAkbm9fc2lnbmVkX29mZl9jYykgPSAoMSwgMCwgMCwgMCk7CitteSAkc210cF9zZXJ2ZXI7CisKKyMgRXhhbXBsZSByZXBseSB0bzoKKyMkaW5pdGlhbF9yZXBseV90byA9ICcnOyAjPDIwMDUwMjAzMTczMjA4LkdBMjM5NjRAZm9vYmFyLmNvbT4nOworCitteSAkdGVybSA9IG5ldyBUZXJtOjpSZWFkTGluZSAnZ2l0LXNlbmQtZW1haWwnOworCisjIEJlZ2luIGJ5IGFjY3VtdWxhdGluZyBhbGwgdGhlIHZhcmlhYmxlcyAoZGVmaW5lZCBhYm92ZSksIHRoYXQgd2Ugd2lsbCBlbmQgdXAKKyMgbmVlZGluZywgZmlyc3QsIGZyb20gdGhlIGNvbW1hbmQgbGluZToKKworbXkgJHJjID0gR2V0T3B0aW9ucygiZnJvbT1zIiA9PiBcJGZyb20sCisgICAgICAgICAgICAgICAgICAgICJpbi1yZXBseS10bz1zIiA9PiBcJGluaXRpYWxfcmVwbHlfdG8sCisJCSAgICAic3ViamVjdD1zIiA9PiBcJGluaXRpYWxfc3ViamVjdCwKKwkJICAgICJ0bz1zIiA9PiBcQHRvLAorCQkgICAgImNjPXMiID0+IFxAaW5pdGlhbF9jYywKKwkJICAgICJiY2M9cyIgPT4gXEBiY2NsaXN0LAorCQkgICAgImNoYWluLXJlcGx5LXRvISIgPT4gXCRjaGFpbl9yZXBseV90bywKKwkJICAgICJzbXRwLXNlcnZlcj1zIiA9PiBcJHNtdHBfc2VydmVyLAorCQkgICAgImNvbXBvc2UiID0+IFwkY29tcG9zZSwKKwkJICAgICJxdWlldCIgPT4gXCRxdWlldCwKKwkJICAgICJzdXBwcmVzcy1mcm9tIiA9PiBcJHN1cHByZXNzX2Zyb20sCisJCSAgICAibm8tc2lnbmVkLW9mZi1jY3xuby1zaWduZWQtb2ZmLWJ5LWNjIiA9PiBcJG5vX3NpZ25lZF9vZmZfY2MsCisJICk7CisKKyMgTm93LCBsZXQncyBmaWxsIGFueSB0aGF0IGFyZW4ndCBzZXQgaW4gd2l0aCBkZWZhdWx0czoKKworc3ViIGdpdHZhciB7CisgICAgbXkgKCR2YXIpID0gQF87CisgICAgbXkgJGZoOworICAgIG15ICRwaWQgPSBvcGVuKCRmaCwgJy18Jyk7CisgICAgZGllICIkISIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKyAgICBpZiAoISRwaWQpIHsKKwlleGVjKCdnaXQtdmFyJywgJHZhcikgb3IgZGllICIkISI7CisgICAgfQorICAgIG15ICgkdmFsKSA9IDwkZmg+OworICAgIGNsb3NlICRmaCBvciBkaWUgIiQhIjsKKyAgICBjaG9tcCgkdmFsKTsKKyAgICByZXR1cm4gJHZhbDsKK30KKworc3ViIGdpdHZhcl9pZGVudCB7CisgICAgbXkgKCRuYW1lKSA9IEBfOworICAgIG15ICR2YWwgPSBnaXR2YXIoJG5hbWUpOworICAgIG15IEBmaWVsZCA9IHNwbGl0KC9ccysvLCAkdmFsKTsKKyAgICByZXR1cm4gam9pbignICcsIEBmaWVsZFswLi4uKEBmaWVsZC0zKV0pOworfQorCitteSAoJGF1dGhvcikgPSBnaXR2YXJfaWRlbnQoJ0dJVF9BVVRIT1JfSURFTlQnKTsKK215ICgkY29tbWl0dGVyKSA9IGdpdHZhcl9pZGVudCgnR0lUX0NPTU1JVFRFUl9JREVOVCcpOworCitteSAlYWxpYXNlczsKK2Nob21wKG15IEBhbGlhc19maWxlcyA9IGBnaXQtcmVwby1jb25maWcgLS1nZXQtYWxsIHNlbmRlbWFpbC5hbGlhc2VzZmlsZWApOworY2hvbXAobXkgJGFsaWFzZmlsZXR5cGUgPSBgZ2l0LXJlcG8tY29uZmlnIHNlbmRlbWFpbC5hbGlhc2ZpbGV0eXBlYCk7CitteSAlcGFyc2VfYWxpYXMgPSAoCisJIyBtdWx0aWxpbmUgZm9ybWF0cyBjYW4gYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUKKwltdXR0ID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9eYWxpYXNccysoXFMrKVxzKyguKikkLykgeworCQkJbXkgKCRhbGlhcywgJGFkZHIpID0gKCQxLCAkMik7CisJCQkkYWRkciA9fiBzLyMuKiQvLzsgIyBtdXR0IGFsbG93cyAjIGNvbW1lbnRzCisJCQkgIyBjb21tYXMgZGVsaW1pdCBtdWx0aXBsZSBhZGRyZXNzZXMKKwkJCSRhbGlhc2VzeyRhbGlhc30gPSBbIHNwbGl0KC9ccyosXHMqLywgJGFkZHIpIF07CisJCX19fSwKKwltYWlscmMgPT4gc3ViIHsgbXkgJGZoID0gc2hpZnQ7IHdoaWxlICg8JGZoPikgeworCQlpZiAoL15hbGlhc1xzKyhcUyspXHMrKC4qKSQvKSB7CisJCQkjIHNwYWNlcyBkZWxpbWl0IG11bHRpcGxlIGFkZHJlc3NlcworCQkJJGFsaWFzZXN7JDF9ID0gWyBzcGxpdCgvXHMrLywgJDIpIF07CisJCX19fSwKKwlwaW5lID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9eKFxTKylccysoLiopJC8pIHsKKwkJCSRhbGlhc2VzeyQxfSA9IFsgc3BsaXQoL1xzKixccyovLCAkMikgXTsKKwkJfX19LAorCWdudXMgPT4gc3ViIHsgbXkgJGZoID0gc2hpZnQ7IHdoaWxlICg8JGZoPikgeworCQlpZiAoL1woZGVmaW5lLW1haWwtYWxpYXNccysiKFxTKz8pIlxzKyIoXFMrPykiXCkvKSB7CisJCQkkYWxpYXNlc3skMX0gPSBbICQyIF07CisJCX19fQorKTsKKworaWYgKEBhbGlhc19maWxlcyAmJiBkZWZpbmVkICRwYXJzZV9hbGlhc3skYWxpYXNmaWxldHlwZX0pIHsKKwlmb3JlYWNoIG15ICRmaWxlIChAYWxpYXNfZmlsZXMpIHsKKwkJb3BlbiBteSAkZmgsICc8JywgJGZpbGUgb3IgZGllICJvcGVuaW5nICRmaWxlOiAkIVxuIjsKKwkJJHBhcnNlX2FsaWFzeyRhbGlhc2ZpbGV0eXBlfS0+KCRmaCk7CisJCWNsb3NlICRmaDsKKwl9Cit9CisKK215ICRwcm9tcHRpbmcgPSAwOworaWYgKCFkZWZpbmVkICRmcm9tKSB7CisJJGZyb20gPSAkYXV0aG9yIHx8ICRjb21taXR0ZXI7CisJZG8geworCQkkXyA9ICR0ZXJtLT5yZWFkbGluZSgiV2hvIHNob3VsZCB0aGUgZW1haWxzIGFwcGVhciB0byBiZSBmcm9tPyAiLAorCQkJJGZyb20pOworCX0gd2hpbGUgKCFkZWZpbmVkICRfKTsKKworCSRmcm9tID0gJF87CisJcHJpbnQgIkVtYWlscyB3aWxsIGJlIHNlbnQgZnJvbTogIiwgJGZyb20sICJcbiI7CisJJHByb21wdGluZysrOworfQorCitpZiAoIUB0bykgeworCWRvIHsKKwkJJF8gPSAkdGVybS0+cmVhZGxpbmUoIldobyBzaG91bGQgdGhlIGVtYWlscyBiZSBzZW50IHRvPyAiLAorCQkJCSIiKTsKKwl9IHdoaWxlICghZGVmaW5lZCAkXyk7CisJbXkgJHRvID0gJF87CisJcHVzaCBAdG8sIHNwbGl0IC8sLywgJHRvOworCSRwcm9tcHRpbmcrKzsKK30KKworc3ViIGV4cGFuZF9hbGlhc2VzIHsKKwlteSBAY3VyID0gQF87CisJbXkgQGxhc3Q7CisJZG8geworCQlAbGFzdCA9IEBjdXI7CisJCUBjdXIgPSBtYXAgeyAkYWxpYXNlc3skX30gPyBAeyRhbGlhc2VzeyRffX0gOiAkXyB9IEBsYXN0OworCX0gd2hpbGUgKGpvaW4oJywnLEBjdXIpIG5lIGpvaW4oJywnLEBsYXN0KSk7CisJcmV0dXJuIEBjdXI7Cit9CisKK0B0byA9IGV4cGFuZF9hbGlhc2VzKEB0byk7CitAaW5pdGlhbF9jYyA9IGV4cGFuZF9hbGlhc2VzKEBpbml0aWFsX2NjKTsKK0BiY2NsaXN0ID0gZXhwYW5kX2FsaWFzZXMoQGJjY2xpc3QpOworCitpZiAoIWRlZmluZWQgJGluaXRpYWxfc3ViamVjdCAmJiAkY29tcG9zZSkgeworCWRvIHsKKwkJJF8gPSAkdGVybS0+cmVhZGxpbmUoIldoYXQgc3ViamVjdCBzaG91bGQgdGhlIGVtYWlscyBzdGFydCB3aXRoPyAiLAorCQkJJGluaXRpYWxfc3ViamVjdCk7CisJfSB3aGlsZSAoIWRlZmluZWQgJF8pOworCSRpbml0aWFsX3N1YmplY3QgPSAkXzsKKwkkcHJvbXB0aW5nKys7Cit9CisKK2lmICghZGVmaW5lZCAkaW5pdGlhbF9yZXBseV90byAmJiAkcHJvbXB0aW5nKSB7CisJZG8geworCQkkXz0gJHRlcm0tPnJlYWRsaW5lKCJNZXNzYWdlLUlEIHRvIGJlIHVzZWQgYXMgSW4tUmVwbHktVG8gZm9yIHRoZSBmaXJzdCBlbWFpbD8gIiwKKwkJCSRpbml0aWFsX3JlcGx5X3RvKTsKKwl9IHdoaWxlICghZGVmaW5lZCAkXyk7CisKKwkkaW5pdGlhbF9yZXBseV90byA9ICRfOworCSRpbml0aWFsX3JlcGx5X3RvID1+IHMvKF5ccyt8XHMrJCkvL2c7Cit9CisKK2lmICghJHNtdHBfc2VydmVyKSB7CisJZm9yZWFjaCAocXcoIC91c3Ivc2Jpbi9zZW5kbWFpbCAvdXNyL2xpYi9zZW5kbWFpbCApKSB7CisJCWlmICgteCAkXykgeworCQkJJHNtdHBfc2VydmVyID0gJF87CisJCQlsYXN0OworCQl9CisJfQorCSRzbXRwX3NlcnZlciB8fD0gJ2xvY2FsaG9zdCc7ICMgY291bGQgYmUgMTI3LjAuMC4xLCB0b28uLi4gKnNocnVnKgorfQorCitpZiAoJGNvbXBvc2UpIHsKKwkjIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG5lZWQgdG8gYmUgc2VjdXJlLCBidXQgd2Ugd2lsbCBtYWtlIGEgc21hbGwKKwkjIGVmZm9ydCB0byBoYXZlIGl0IGJlIHVuaXF1ZQorCW9wZW4oQywiPiIsJGNvbXBvc2VfZmlsZW5hbWUpCisJCW9yIGRpZSAiRmFpbGVkIHRvIG9wZW4gZm9yIHdyaXRpbmcgJGNvbXBvc2VfZmlsZW5hbWU6ICQhIjsKKwlwcmludCBDICJGcm9tICRmcm9tICMgVGhpcyBsaW5lIGlzIGlnbm9yZWQuXG4iOworCXByaW50ZiBDICJTdWJqZWN0OiAlc1xuXG4iLCAkaW5pdGlhbF9zdWJqZWN0OworCXByaW50ZiBDIDw8RU9UOworR0lUOiBQbGVhc2UgZW50ZXIgeW91ciBlbWFpbCBiZWxvdy4KK0dJVDogTGluZXMgYmVnaW5uaW5nIGluICJHSVQ6ICIgd2lsbCBiZSByZW1vdmVkLgorR0lUOiBDb25zaWRlciBpbmNsdWRpbmcgYW4gb3ZlcmFsbCBkaWZmc3RhdCBvciB0YWJsZSBvZiBjb250ZW50cworR0lUOiBmb3IgdGhlIHBhdGNoIHlvdSBhcmUgd3JpdGluZy4KKworRU9UCisJY2xvc2UoQyk7CisKKwlteSAkZWRpdG9yID0gJEVOVntFRElUT1J9OworCSRlZGl0b3IgPSAndmknIHVubGVzcyBkZWZpbmVkICRlZGl0b3I7CisJc3lzdGVtKCRlZGl0b3IsICRjb21wb3NlX2ZpbGVuYW1lKTsKKworCW9wZW4oQzIsIj4iLCRjb21wb3NlX2ZpbGVuYW1lIC4gIi5maW5hbCIpCisJCW9yIGRpZSAiRmFpbGVkIHRvIG9wZW4gJGNvbXBvc2VfZmlsZW5hbWUuZmluYWwgOiAiIC4gJCE7CisKKwlvcGVuKEMsIjwiLCRjb21wb3NlX2ZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuICRjb21wb3NlX2ZpbGVuYW1lIDogIiAuICQhOworCisJd2hpbGUoPEM+KSB7CisJCW5leHQgaWYgbS9eR0lUOiAvOworCQlwcmludCBDMiAkXzsKKwl9CisJY2xvc2UoQyk7CisJY2xvc2UoQzIpOworCisJZG8geworCQkkXyA9ICR0ZXJtLT5yZWFkbGluZSgiU2VuZCB0aGlzIGVtYWlsPyAoeXxuKSAiKTsKKwl9IHdoaWxlICghZGVmaW5lZCAkXyk7CisKKwlpZiAodWMgc3Vic3RyKCRfLDAsMSkgbmUgJ1knKSB7CisJCWNsZWFudXBfY29tcG9zZV9maWxlcygpOworCQlleGl0KDApOworCX0KKworCUBmaWxlcyA9ICgkY29tcG9zZV9maWxlbmFtZSAuICIuZmluYWwiKTsKK30KKworCisjIE5vdyB0aGF0IGFsbCB0aGUgZGVmYXVsdHMgYXJlIHNldCwgcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBsaW5lCisjIGFyZ3VtZW50cyBhbmQgY29sbGVjdCB1cCB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZC4KK2ZvciBteSAkZiAoQEFSR1YpIHsKKwlpZiAoLWQgJGYpIHsKKwkJb3BlbmRpcihESCwkZikKKwkJCW9yIGRpZSAiRmFpbGVkIHRvIG9wZW5kaXIgJGY6ICQhIjsKKworCQlwdXNoIEBmaWxlcywgZ3JlcCB7IC1mICRfIH0gbWFwIHsgKyRmIC4gIi8iIC4gJF8gfQorCQkJCXNvcnQgcmVhZGRpcihESCk7CisKKwl9IGVsc2lmICgtZiAkZikgeworCQlwdXNoIEBmaWxlcywgJGY7CisKKwl9IGVsc2UgeworCQlwcmludCBTVERFUlIgIlNraXBwaW5nICRmIC0gbm90IGZvdW5kLlxuIjsKKwl9Cit9CisKK2lmIChAZmlsZXMpIHsKKwl1bmxlc3MgKCRxdWlldCkgeworCQlwcmludCAkXywiXG4iIGZvciAoQGZpbGVzKTsKKwl9Cit9IGVsc2UgeworCXByaW50IDw8RU9UOworZ2l0LXNlbmQtZW1haWwgW29wdGlvbnNdIDxmaWxlIHwgZGlyZWN0b3J5PiBbLi4uIGZpbGUgfCBkaXJlY3RvcnkgXQorT3B0aW9uczoKKyAgIC0tZnJvbSAgICAgICAgIFNwZWNpZnkgdGhlICJGcm9tOiIgbGluZSBvZiB0aGUgZW1haWwgdG8gYmUgc2VudC4KKworICAgLS10byAgICAgICAgICAgU3BlY2lmeSB0aGUgcHJpbWFyeSAiVG86IiBsaW5lIG9mIHRoZSBlbWFpbC4KKworICAgLS1jYyAgICAgICAgICAgU3BlY2lmeSBhbiBpbml0aWFsICJDYzoiIGxpc3QgZm9yIHRoZSBlbnRpcmUgc2VyaWVzCisgICAgICAgICAgICAgICAgICBvZiBlbWFpbHMuCisKKyAgIC0tYmNjICAgICAgICAgIFNwZWNpZnkgYSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyB0aGF0IHNob3VsZCBiZSBCY2M6CisJCSAgb24gYWxsIHRoZSBlbWFpbHMuCisKKyAgIC0tY29tcG9zZSAgICAgIFVzZSBcJEVESVRPUiB0byBlZGl0IGFuIGludHJvZHVjdG9yeSBtZXNzYWdlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgIHBhdGNoIHNlcmllcy4KKworICAgLS1zdWJqZWN0ICAgICAgU3BlY2lmeSB0aGUgaW5pdGlhbCAiU3ViamVjdDoiIGxpbmUuCisgICAgICAgICAgICAgICAgICBPbmx5IG5lY2Vzc2FyeSBpZiAtLWNvbXBvc2UgaXMgYWxzbyBzZXQuICBJZiAtLWNvbXBvc2UKKwkJICBpcyBub3Qgc2V0LCB0aGlzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yLgorCisgICAtLWluLXJlcGx5LXRvICBTcGVjaWZ5IHRoZSBmaXJzdCAiSW4tUmVwbHktVG86IiBoZWFkZXIgbGluZS4KKyAgICAgICAgICAgICAgICAgIE9ubHkgdXNlZCBpZiAtLWNvbXBvc2UgaXMgYWxzbyBzZXQuICBJZiAtLWNvbXBvc2UgaXMgbm90CisJCSAgc2V0LCB0aGlzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yLgorCisgICAtLWNoYWluLXJlcGx5LXRvIElmIHNldCwgdGhlIHJlcGxpZXMgd2lsbCBhbGwgYmUgdG8gdGhlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICBlbWFpbCBzZW50LCByYXRoZXIgdGhhbiB0byB0aGUgZmlyc3QgZW1haWwgc2VudC4KKyAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIG9uLgorCisgICAtLW5vLXNpZ25lZC1vZmYtY2MgU3VwcHJlc3MgdGhlIGF1dG9tYXRpYyBhZGRpdGlvbiBvZiBlbWFpbCBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgdGhhdCBhcHBlYXIgaW4gYSBTaWduZWQtb2ZmLWJ5OiBsaW5lLCB0byB0aGUgY2M6IGxpc3QuCisJCSBOb3RlOiBVc2luZyB0aGlzIG9wdGlvbiBpcyBub3QgcmVjb21tZW5kZWQuCisKKyAgIC0tc210cC1zZXJ2ZXIgIElmIHNldCwgc3BlY2lmaWVzIHRoZSBvdXRnb2luZyBTTVRQIHNlcnZlciB0byB1c2UuCisgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBsb2NhbGhvc3QuCisKKyAgLS1zdXBwcmVzcy1mcm9tIFN1cHJlc3Mgc2VuZGluZyBlbWFpbHMgdG8geW91cnNlbGYgaWYgeW91ciBhZGRyZXNzCisgICAgICAgICAgICAgICAgICBhcHBlYXJzIGluIGEgRnJvbTogbGluZS4KKworICAgLS1xdWlldAlNYWtlIGdpdC1zZW5kLWVtYWlsIGxlc3MgdmVyYm9zZS4gIE9uZSBsaW5lIHBlciBlbWFpbCBzaG91bGQgYmUKKwkJYWxsIHRoYXQgaXMgb3V0cHV0LgorCitFcnJvcjogUGxlYXNlIHNwZWNpZnkgYSBmaWxlIG9yIGEgZGlyZWN0b3J5IG9uIHRoZSBjb21tYW5kIGxpbmUuCitFT1QKKwlleGl0KDEpOworfQorCisjIFZhcmlhYmxlcyB3ZSBzZXQgYXMgcGFydCBvZiB0aGUgbG9vcCBvdmVyIGZpbGVzCitvdXIgKCRtZXNzYWdlX2lkLCAkY2MsICVtYWlsLCAkc3ViamVjdCwgJHJlcGx5X3RvLCAkcmVmZXJlbmNlcywgJG1lc3NhZ2UpOworCitzdWIgZXh0cmFjdF92YWxpZF9hZGRyZXNzIHsKKwlteSAkYWRkcmVzcyA9IHNoaWZ0OworCW15ICRsb2NhbF9wYXJ0X3JlZ2V4cCA9ICdbXjw+IlxzQF0rJzsKKwlteSAkZG9tYWluX3JlZ2V4cCA9ICdbXi48PiJcc0BdKyg/OlwuW14uPD4iXHNAXSspKyc7CisKKwkjIGNoZWNrIGZvciBhIGxvY2FsIGFkZHJlc3M6CisJcmV0dXJuICRhZGRyZXNzIGlmICgkYWRkcmVzcyA9fiAvXigkbG9jYWxfcGFydF9yZWdleHApJC8pOworCisJaWYgKCRoYXZlX2VtYWlsX3ZhbGlkKSB7CisJCXJldHVybiBzY2FsYXIgRW1haWw6OlZhbGlkLT5hZGRyZXNzKCRhZGRyZXNzKTsKKwl9IGVsc2UgeworCQkjIGxlc3Mgcm9idXN0L2NvcnJlY3QgdGhhbiB0aGUgbW9uc3RlciByZWdleHAgaW4gRW1haWw6OlZhbGlkLAorCQkjIGJ1dCBzdGlsbCBkb2VzIGEgOTklIGpvYiwgYW5kIG9uZSBsZXNzIGRlcGVuZGVuY3kKKwkJJGFkZHJlc3MgPX4gLygkbG9jYWxfcGFydF9yZWdleHBcQCRkb21haW5fcmVnZXhwKS87CisJCXJldHVybiAkMTsKKwl9Cit9CisKKyMgVXN1YWxseSBkb24ndCBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBiZWxvdyBoZXJlLgorCisjIHdlIG1ha2UgYSAiZmFrZSIgbWVzc2FnZSBpZCBieSB0YWtpbmcgdGhlIGN1cnJlbnQgbnVtYmVyCisjIG9mIHNlY29uZHMgc2luY2UgdGhlIGJlZ2lubmluZyBvZiBVbml4IHRpbWUgYW5kIHRhY2tpbmcgb24KKyMgYSByYW5kb20gbnVtYmVyIHRvIHRoZSBlbmQsIGluIGNhc2Ugd2UgYXJlIGNhbGxlZCBxdWlja2VyIHRoYW4KKyMgMSBzZWNvbmQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSB3ZXJlIGNhbGxlZC4KKworIyBXZSdsbCBzZXR1cCBhIHRlbXBsYXRlIGZvciB0aGUgbWVzc2FnZSBpZCwgdXNpbmcgdGhlICJmcm9tIiBhZGRyZXNzOgorbXkgJG1lc3NhZ2VfaWRfZnJvbSA9IGV4dHJhY3RfdmFsaWRfYWRkcmVzcygkZnJvbSk7CitteSAkbWVzc2FnZV9pZF90ZW1wbGF0ZSA9ICI8JXMtZ2l0LXNlbmQtZW1haWwtJG1lc3NhZ2VfaWRfZnJvbT4iOworCitzdWIgbWFrZV9tZXNzYWdlX2lkCit7CisJbXkgJGRhdGUgPSB0aW1lOworCW15ICRwc2V1ZG9fcmFuZCA9IGludCAocmFuZCg0MjAwKSk7CisJJG1lc3NhZ2VfaWQgPSBzcHJpbnRmICRtZXNzYWdlX2lkX3RlbXBsYXRlLCAiJGRhdGUkcHNldWRvX3JhbmQiOworCSNwcmludCAibmV3IG1lc3NhZ2UgaWQgPSAkbWVzc2FnZV9pZFxuIjsgIyBXYXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKK30KKworCisKKyRjYyA9ICIiOworJHRpbWUgPSB0aW1lIC0gc2NhbGFyICQjZmlsZXM7CisKK3N1YiBzZW5kX21lc3NhZ2UKK3sKKwlteSBAcmVjaXBpZW50cyA9IHVuaXF1ZV9lbWFpbF9saXN0KEB0byk7CisJbXkgJHRvID0gam9pbiAoIixcblx0IiwgQHJlY2lwaWVudHMpOworCUByZWNpcGllbnRzID0gdW5pcXVlX2VtYWlsX2xpc3QoQHJlY2lwaWVudHMsQGNjLEBiY2NsaXN0KTsKKwlteSAkZGF0ZSA9IHN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgJXonLCBsb2NhbHRpbWUoJHRpbWUrKykpOworCW15ICRnaXR2ZXJzaW9uID0gJ0BAR0lUX1ZFUlNJT05AQCc7CisJaWYgKCRnaXR2ZXJzaW9uID1+IG0vLi5HSVRfVkVSU0lPTi4uLykgeworCSAgICAkZ2l0dmVyc2lvbiA9IGBnaXQgLS12ZXJzaW9uYDsKKwkgICAgY2hvbXAgJGdpdHZlcnNpb247CisJICAgICMga2VlcCBvbmx5IHdoYXQncyBhZnRlciB0aGUgbGFzdCBzcGFjZQorCSAgICAkZ2l0dmVyc2lvbiA9fiBzL14uKiAvLzsKKwl9CisKKwlteSAkaGVhZGVyID0gIkZyb206ICRmcm9tCitUbzogJHRvCitDYzogJGNjCitTdWJqZWN0OiAkc3ViamVjdAorUmVwbHktVG86ICRmcm9tCitEYXRlOiAkZGF0ZQorTWVzc2FnZS1JZDogJG1lc3NhZ2VfaWQKK1gtTWFpbGVyOiBnaXQtc2VuZC1lbWFpbCAkZ2l0dmVyc2lvbgorIjsKKwlpZiAoJHJlcGx5X3RvKSB7CisKKwkJJGhlYWRlciAuPSAiSW4tUmVwbHktVG86ICRyZXBseV90b1xuIjsKKwkJJGhlYWRlciAuPSAiUmVmZXJlbmNlczogJHJlZmVyZW5jZXNcbiI7CisJfQorCisJaWYgKCRzbXRwX3NlcnZlciA9fiBtI14vIykgeworCQlteSAkcGlkID0gb3BlbiBteSAkc20sICd8LSc7CisJCWRlZmluZWQgJHBpZCBvciBkaWUgJCE7CisJCWlmICghJHBpZCkgeworCQkJZXhlYygkc210cF9zZXJ2ZXIsJy1pJywKKwkJCSAgICAgbWFwIHsgZXh0cmFjdF92YWxpZF9hZGRyZXNzKCRfKSB9CisJCQkgICAgIEByZWNpcGllbnRzKSBvciBkaWUgJCE7CisJCX0KKwkJcHJpbnQgJHNtICIkaGVhZGVyXG4kbWVzc2FnZSI7CisJCWNsb3NlICRzbSBvciBkaWUgJD87CisJfSBlbHNlIHsKKwkJcmVxdWlyZSBOZXQ6OlNNVFA7CisJCSRzbXRwIHx8PSBOZXQ6OlNNVFAtPm5ldyggJHNtdHBfc2VydmVyICk7CisJCSRzbXRwLT5tYWlsKCAkZnJvbSApIG9yIGRpZSAkc210cC0+bWVzc2FnZTsKKwkJJHNtdHAtPnRvKCBAcmVjaXBpZW50cyApIG9yIGRpZSAkc210cC0+bWVzc2FnZTsKKwkJJHNtdHAtPmRhdGEgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+ZGF0YXNlbmQoIiRoZWFkZXJcbiRtZXNzYWdlIikgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+ZGF0YWVuZCgpIG9yIGRpZSAkc210cC0+bWVzc2FnZTsKKwkJJHNtdHAtPm9rIG9yIGRpZSAiRmFpbGVkIHRvIHNlbmQgJHN1YmplY3RcbiIuJHNtdHAtPm1lc3NhZ2U7CisJfQorCWlmICgkcXVpZXQpIHsKKwkJcHJpbnRmICJTZW50ICVzXG4iLCAkc3ViamVjdDsKKwl9IGVsc2UgeworCQlwcmludCAiT0suIExvZyBzYXlzOlxuRGF0ZTogJGRhdGVcbiI7CisJCWlmICgkc210cCkgeworCQkJcHJpbnQgIlNlcnZlcjogJHNtdHBfc2VydmVyXG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIlNlbmRtYWlsOiAkc210cF9zZXJ2ZXJcbiI7CisJCX0KKwkJcHJpbnQgIkZyb206ICRmcm9tXG5TdWJqZWN0OiAkc3ViamVjdFxuQ2M6ICRjY1xuVG86ICR0b1xuXG4iOworCQlpZiAoJHNtdHApIHsKKwkJCXByaW50ICJSZXN1bHQ6ICIsICRzbXRwLT5jb2RlLCAnICcsCisJCQkJKCRzbXRwLT5tZXNzYWdlID1+IC9cbihbXlxuXStcbikkL3MpLCAiXG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIlJlc3VsdDogT0tcbiI7CisJCX0KKwl9Cit9CisKKyRyZXBseV90byA9ICRpbml0aWFsX3JlcGx5X3RvOworJHJlZmVyZW5jZXMgPSAkaW5pdGlhbF9yZXBseV90byB8fCAnJzsKK21ha2VfbWVzc2FnZV9pZCgpOworJHN1YmplY3QgPSAkaW5pdGlhbF9zdWJqZWN0OworCitmb3JlYWNoIG15ICR0IChAZmlsZXMpIHsKKwlvcGVuKEYsIjwiLCR0KSBvciBkaWUgImNhbid0IG9wZW4gZmlsZSAkdCI7CisKKwlteSAkYXV0aG9yX25vdF9zZW5kZXIgPSB1bmRlZjsKKwlAY2MgPSBAaW5pdGlhbF9jYzsKKwlteSAkZm91bmRfbWJveCA9IDA7CisJbXkgJGhlYWRlcl9kb25lID0gMDsKKwkkbWVzc2FnZSA9ICIiOworCXdoaWxlKDxGPikgeworCQlpZiAoISRoZWFkZXJfZG9uZSkgeworCQkJJGZvdW5kX21ib3ggPSAxLCBuZXh0IGlmICgvXkZyb20gLyk7CisJCQljaG9tcDsKKworCQkJaWYgKCRmb3VuZF9tYm94KSB7CisJCQkJaWYgKC9eU3ViamVjdDpccysoLiopJC8pIHsKKwkJCQkJJHN1YmplY3QgPSAkMTsKKworCQkJCX0gZWxzaWYgKC9eKENjfEZyb20pOlxzKyguKikkLykgeworCQkJCQlpZiAoJDIgZXEgJGZyb20pIHsKKwkJCQkJCW5leHQgaWYgKCRzdXBwcmVzc19mcm9tKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCSRhdXRob3Jfbm90X3NlbmRlciA9ICQyOworCQkJCQl9CisJCQkJCXByaW50ZigiKG1ib3gpIEFkZGluZyBjYzogJXMgZnJvbSBsaW5lICclcydcbiIsCisJCQkJCQkkMiwgJF8pIHVubGVzcyAkcXVpZXQ7CisJCQkJCXB1c2ggQGNjLCAkMjsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJIyBJbiB0aGUgdHJhZGl0aW9uYWwKKwkJCQkjICJzZW5kIGxvdHMgb2YgZW1haWwiIGZvcm1hdCwKKwkJCQkjIGxpbmUgMSA9IGNjCisJCQkJIyBsaW5lIDIgPSBzdWJqZWN0CisJCQkJIyBTbyBsZXQncyBzdXBwb3J0IHRoYXQsIHRvby4KKwkJCQlpZiAoQGNjID09IDApIHsKKwkJCQkJcHJpbnRmKCIobm9uLW1ib3gpIEFkZGluZyBjYzogJXMgZnJvbSBsaW5lICclcydcbiIsCisJCQkJCQkkXywgJF8pIHVubGVzcyAkcXVpZXQ7CisKKwkJCQkJcHVzaCBAY2MsICRfOworCisJCQkJfSBlbHNpZiAoIWRlZmluZWQgJHN1YmplY3QpIHsKKwkJCQkJJHN1YmplY3QgPSAkXzsKKwkJCQl9CisJCQl9CisKKwkJCSMgQSB3aGl0ZXNwYWNlIGxpbmUgd2lsbCB0ZXJtaW5hdGUgdGhlIGhlYWRlcnMKKwkJCWlmIChtL15ccyokLykgeworCQkJCSRoZWFkZXJfZG9uZSA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkkbWVzc2FnZSAuPSAgJF87CisJCQlpZiAoL15TaWduZWQtb2ZmLWJ5OiAoLiopJC9pICYmICEkbm9fc2lnbmVkX29mZl9jYykgeworCQkJCW15ICRjID0gJDE7CisJCQkJY2hvbXAgJGM7CisJCQkJcHVzaCBAY2MsICRjOworCQkJCXByaW50ZigiKHNvYikgQWRkaW5nIGNjOiAlcyBmcm9tIGxpbmUgJyVzJ1xuIiwKKwkJCQkJJGMsICRfKSB1bmxlc3MgJHF1aWV0OworCQkJfQorCQl9CisJfQorCWNsb3NlIEY7CisJaWYgKGRlZmluZWQgJGF1dGhvcl9ub3Rfc2VuZGVyKSB7CisJCSRtZXNzYWdlID0gIkZyb206ICRhdXRob3Jfbm90X3NlbmRlclxuXG4kbWVzc2FnZSI7CisJfQorCisJJGNjID0gam9pbigiLCAiLCB1bmlxdWVfZW1haWxfbGlzdChAY2MpKTsKKworCXNlbmRfbWVzc2FnZSgpOworCisJIyBzZXQgdXAgZm9yIHRoZSBuZXh0IG1lc3NhZ2UKKwlpZiAoJGNoYWluX3JlcGx5X3RvIHx8IGxlbmd0aCgkcmVwbHlfdG8pID09IDApIHsKKwkJJHJlcGx5X3RvID0gJG1lc3NhZ2VfaWQ7CisJCWlmIChsZW5ndGggJHJlZmVyZW5jZXMgPiAwKSB7CisJCQkkcmVmZXJlbmNlcyAuPSAiICRtZXNzYWdlX2lkIjsKKwkJfSBlbHNlIHsKKwkJCSRyZWZlcmVuY2VzID0gIiRtZXNzYWdlX2lkIjsKKwkJfQorCX0KKwltYWtlX21lc3NhZ2VfaWQoKTsKK30KKworaWYgKCRjb21wb3NlKSB7CisJY2xlYW51cF9jb21wb3NlX2ZpbGVzKCk7Cit9CisKK3N1YiBjbGVhbnVwX2NvbXBvc2VfZmlsZXMoKSB7CisJdW5saW5rKCRjb21wb3NlX2ZpbGVuYW1lLCAkY29tcG9zZV9maWxlbmFtZSAuICIuZmluYWwiKTsKKworfQorCiskc210cC0+cXVpdCBpZiAkc210cDsKKworc3ViIHVuaXF1ZV9lbWFpbF9saXN0KEApIHsKKwlteSAlc2VlbjsKKwlteSBAZW1haWxzOworCisJZm9yZWFjaCBteSAkZW50cnkgKEBfKSB7CisJCWlmIChteSAkY2xlYW4gPSBleHRyYWN0X3ZhbGlkX2FkZHJlc3MoJGVudHJ5KSkgeworCQkJJHNlZW57JGNsZWFufSB8fD0gMDsKKwkJCW5leHQgaWYgJHNlZW57JGNsZWFufSsrOworCQkJcHVzaCBAZW1haWxzLCAkZW50cnk7CisJCX0gZWxzZSB7CisJCQlwcmludCBTVERFUlIgIlc6IHVuYWJsZSB0byBleHRyYWN0IGEgdmFsaWQgYWRkcmVzcyIsCisJCQkJCSIgZnJvbTogJGVudHJ5XG4iOworCQl9CisJfQorCXJldHVybiBAZW1haWxzOworfQpkaWZmIC0tZ2l0IGEvZ2l0LXNoLXNldHVwLnNoIGIvZ2l0LXNoLXNldHVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxNTc0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc2gtc2V0dXAuc2gKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL3NoCisjCisjIFRoaXMgaXMgaW5jbHVkZWQgaW4gY29tbWFuZHMgdGhhdCBlaXRoZXIgaGF2ZSB0byBiZSBydW4gZnJvbSB0aGUgdG9wbGV2ZWwKKyMgb2YgdGhlIHJlcG9zaXRvcnksIG9yIHdpdGggR0lUX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBwcm9wZXJseS4KKyMgSWYgdGhlIEdJVF9ESVIgZG9lcyBub3QgbG9vayBsaWtlIHRoZSByaWdodCBjb3JyZWN0IGdpdC1yZXBvc2l0b3J5LAorIyBpdCBkaWVzLgorCisjIEhhdmluZyB0aGlzIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgd291bGQgYnJlYWsgc2NyaXB0cyBiZWNhdXNlCisjIHlvdSB3b3VsZCBjYXVzZSAiY2QiIHRvIGJlIGJlIHRha2VuIHRvIHVuZXhwZWN0ZWQgcGxhY2VzLiAgSWYgeW91CisjIGxpa2UgQ0RQQVRILCBkZWZpbmUgaXQgZm9yIHlvdXIgaW50ZXJhY3RpdmUgc2hlbGwgc2Vzc2lvbnMgd2l0aG91dAorIyBleHBvcnRpbmcgaXQuCit1bnNldCBDRFBBVEgKKworZGllKCkgeworCWVjaG8gPiYyICIkQCIKKwlleGl0IDEKK30KKwordXNhZ2UoKSB7CisJZGllICJVc2FnZTogJDAgJFVTQUdFIgorfQorCitpZiBbIC16ICIkTE9OR19VU0FHRSIgXQordGhlbgorCUxPTkdfVVNBR0U9IlVzYWdlOiAkMCAkVVNBR0UiCitlbHNlCisJTE9OR19VU0FHRT0iVXNhZ2U6ICQwICRVU0FHRQorCiskTE9OR19VU0FHRSIKK2ZpCisKK2Nhc2UgIiQxIiBpbgorCS1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKwllY2hvICIkTE9OR19VU0FHRSIKKwlleGl0Citlc2FjCisKK2lmIFsgLXogIiRTVUJESVJFQ1RPUllfT0siIF0KK3RoZW4KKwk6ICR7R0lUX0RJUj0uZ2l0fQorCTogJHtHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJEdJVF9ESVIvb2JqZWN0cyJ9CisKKwkjIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSB2YWxpZCByZXBvc2l0b3J5IG9mIGEgdmludGFnZSB3ZSB1bmRlcnN0YW5kLgorCUdJVF9ESVI9IiRHSVRfRElSIiBnaXQgcmVwby1jb25maWcgLS1nZXQgY29yZS5ub3N1Y2ggPi9kZXYvbnVsbAorCWlmIHRlc3QgJD8gPSAxMjgKKwl0aGVuCisJICAgIGV4aXQKKwlmaQorZWxzZQorCUdJVF9ESVI9JChnaXQtcmV2LXBhcnNlIC0tZ2l0LWRpcikgfHwgZXhpdAorZmkKZGlmZiAtLWdpdCBhL2dpdC1zaG9ydGxvZy5wZXJsIGIvZ2l0LXNob3J0bG9nLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGIxNGY4MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1zaG9ydGxvZy5wZXJsCkBAIC0wLDAgKzEsMjAwIEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworbXkgKCVtYWlsbWFwKTsKK215ICglZW1haWwpOworbXkgKCVtYXApOworbXkgJHBzdGF0ZSA9IDE7CitteSAkbl9yZWNvcmRzID0gMDsKK215ICRuX291dHB1dCA9IDA7CisKK3N1YiBzaG9ydGxvZ19lbnRyeSgkJCkgeworCW15ICgkbmFtZSwgJGRlc2MpID0gQF87CisJbXkgJGtleSA9ICRuYW1lOworCisJJGRlc2MgPX4gcyMvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0LyMvLi4uLyNnOworCSRkZXNjID1+IHMjXFtQQVRDSFxdICMjZzsKKworCSMgc3RvcmUgZGVzY3JpcHRpb24gaW4gYXJyYXksIGluIGVtYWlsLT57ZGVzYyBsaXN0fSBtYXAKKwlpZiAoZXhpc3RzICRtYXB7JGtleX0pIHsKKwkJIyBncmFiIHJlZgorCQlteSAkb2JqID0gJG1hcHska2V5fTsKKworCQkjIGFkZCBkZXNjIHRvIGFycmF5CisJCXB1c2goQCRvYmosICRkZXNjKTsKKwl9IGVsc2UgeworCQkjIGNyZWF0ZSBuZXcgYXJyYXksIGNvbnRhaW5pbmcgMSBpdGVtCisJCW15IEBhcnIgPSAoJGRlc2MpOworCisJCSMgc3RvcmUgcmVmIHRvIGFycmF5CisJCSRtYXB7JGtleX0gPSBcQGFycjsKKwl9Cit9CisKKyMgc29ydCBjb21wYXJpc29uIGZ1bmN0aW9uCitzdWIgYnlfbmFtZSgkJCkgeworCW15ICgkYSwgJGIpID0gQF87CisKKwl1YygkYSkgY21wIHVjKCRiKTsKK30KKworc3ViIHNob3J0bG9nX291dHB1dCB7CisJbXkgKCRvYmosICRrZXksICRkZXNjKTsKKworCWZvcmVhY2ggJGtleSAoc29ydCBieV9uYW1lIGtleXMgJW1hcCkgeworCQkjIG91dHB1dCBhdXRob3IKKwkJcHJpbnRmICIlczpcbiIsICRrZXk7CisKKwkJIyBvdXRwdXQgYXV0aG9yJ3MgMS1saW5lIHN1bW1hcmllcworCQkkb2JqID0gJG1hcHska2V5fTsKKwkJZm9yZWFjaCAkZGVzYyAocmV2ZXJzZSBAJG9iaikgeworCQkJcHJpbnQgIiAgJGRlc2NcbiI7CisJCQkkbl9vdXRwdXQrKzsKKwkJfQorCisJCSMgYmxhbmsgbGluZSBzZXBhcmF0aW5nIGF1dGhvciBmcm9tIG5leHQgYXV0aG9yCisJCXByaW50ICJcbiI7CisJfQorfQorCitzdWIgY2hhbmdlbG9nX2lucHV0IHsKKwlteSAoJGF1dGhvciwgJGRlc2MpOworCisJd2hpbGUgKDw+KSB7CisJCSMgZ2V0IGF1dGhvciBhbmQgZW1haWwKKwkJaWYgKCRwc3RhdGUgPT0gMSkgeworCQkJbXkgKCRlbWFpbCk7CisKKwkJCW5leHQgdW5sZXNzIC9eW0FhXXV0aG9yOj9ccyooLio/KVxzKjwoLiopPi87CisKKwkJCSRuX3JlY29yZHMrKzsKKworCQkJJGF1dGhvciA9ICQxOworCQkJJGVtYWlsID0gJDI7CisJCQkkZGVzYyA9IHVuZGVmOworCisJCQkjIGNzZXQgYXV0aG9yIGZpeHVwcworCQkJaWYgKGV4aXN0cyAkbWFpbG1hcHskZW1haWx9KSB7CisJCQkJJGF1dGhvciA9ICRtYWlsbWFweyRlbWFpbH07CisJCQl9IGVsc2lmIChleGlzdHMgJG1haWxtYXB7JGF1dGhvcn0pIHsKKwkJCQkkYXV0aG9yID0gJG1haWxtYXB7JGF1dGhvcn07CisJCQl9IGVsc2lmICghJGF1dGhvcikgeworCQkJCSRhdXRob3IgPSAkZW1haWw7CisJCQl9CisJCQkkZW1haWx7JGF1dGhvcn17JGVtYWlsfSsrOworCQkJJHBzdGF0ZSsrOworCQl9CisKKwkJIyBza2lwIHRvIGJsYW5rIGxpbmUKKwkJZWxzaWYgKCRwc3RhdGUgPT0gMikgeworCQkJbmV4dCB1bmxlc3MgL15ccyokLzsKKwkJCSRwc3RhdGUrKzsKKwkJfQorCisJCSMgc2tpcCB0byBub24tYmxhbmsgbGluZQorCQllbHNpZiAoJHBzdGF0ZSA9PSAzKSB7CisJCQluZXh0IHVubGVzcyAvXlxzKj8oLiopLzsKKworCQkJIyBza2lwIGxpbmVzIHRoYXQgYXJlIG9idmlvdXNseSBub3QKKwkJCSMgYSAxLWxpbmUgY3NldCBkZXNjcmlwdGlvbgorCQkJbmV4dCBpZiAvXlxzKkZyb206IC87CisKKwkJCWNob21wOworCQkJJGRlc2MgPSAkMTsKKworCQkJJnNob3J0bG9nX2VudHJ5KCRhdXRob3IsICRkZXNjKTsKKworCQkJJHBzdGF0ZSA9IDE7CisJCX0KKwkKKwkJZWxzZSB7CisJCQlkaWUgImludmFsaWQgcGFyc2Ugc3RhdGUgJHBzdGF0ZSI7CisJCX0KKwl9Cit9CisKK3N1YiByZWFkX21haWxtYXAgeworCW15ICgkZmgsICRtYWlsbWFwKSA9IEBfOworCXdoaWxlICg8JGZoPikgeworCQljaG9tcDsKKwkJaWYgKC9eKFteI10uKj8pXHMqPCguKik+LykgeworCQkJJG1haWxtYXAtPnskMn0gPSAkMTsKKwkJfQorCX0KK30KKworc3ViIHNldHVwX21haWxtYXAgeworCXJlYWRfbWFpbG1hcChcKkRBVEEsIFwlbWFpbG1hcCk7CisJaWYgKC1mICcubWFpbG1hcCcpIHsKKwkJbXkgJGZoID0gdW5kZWY7CisJCW9wZW4gJGZoLCAnPCcsICcubWFpbG1hcCc7CisJCXJlYWRfbWFpbG1hcCgkZmgsIFwlbWFpbG1hcCk7CisJCWNsb3NlICRmaDsKKwl9Cit9CisKK3N1YiBmaW5hbGl6ZSB7CisJI3ByaW50ICJcbiRuX3JlY29yZHMgcmVjb3JkcyBwYXJzZWQuXG4iOworCisJaWYgKCRuX3JlY29yZHMgIT0gJG5fb3V0cHV0KSB7CisJCWRpZSAicGFyc2UgZXJyb3I6IGlucHV0IHJlY29yZHMgIT0gb3V0cHV0IHJlY29yZHNcbiI7CisJfQorCWlmICgwKSB7CisJCWZvciBteSAkYXV0aG9yIChzb3J0IGtleXMgJWVtYWlsKSB7CisJCQlteSAkZSA9ICRlbWFpbHskYXV0aG9yfTsKKwkJCWZvciBteSAkZW1haWwgKHNvcnQga2V5cyAlJGUpIHsKKwkJCQlwcmludCBTVERFUlIgIiRhdXRob3IgPCRlbWFpbD5cbiI7CisJCQl9CisJCX0KKwl9Cit9CisKKyZzZXR1cF9tYWlsbWFwOworJmNoYW5nZWxvZ19pbnB1dDsKKyZzaG9ydGxvZ19vdXRwdXQ7CismZmluYWxpemU7CitleGl0KDApOworCisKK19fREFUQV9fCisjCisjIEV2ZW4gd2l0aCBnaXQsIHdlIGRvbid0IGFsd2F5cyBoYXZlIG5hbWUgdHJhbnNsYXRpb25zLgorIyBTbyBoYXZlIGFuIGVtYWlsLT5yZWFsIG5hbWUgdGFibGUgdG8gdHJhbnNsYXRlIHRoZQorIyAoaG9wZWZ1bGx5IGZldykgbWlzc2luZyBuYW1lcworIworQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPgorQW5kcmVhcyBIZXJybWFubiA8YWhlcnJtYW5AZGUuaWJtLmNvbT4KK0FuZHJldyBNb3J0b24gPGFrcG1Ab3NkbC5vcmc+CitBbmRyZXcgVmFzcXVleiA8YW5kcmV3LnZhc3F1ZXpAcWxvZ2ljLmNvbT4KK0NocmlzdG9waCBIZWxsd2lnIDxoY2hAbHN0LmRlPgorQ29yZXkgTWlueWFyZCA8bWlueWFyZEBhY20ub3JnPgorRGF2aWQgV29vZGhvdXNlIDxkd213MkBzaGlueWJvb2suaW5mcmFkZWFkLm9yZz4KK0RvbWVuIFB1bmNlciA8ZG9tZW5AY29kZXJvY2sub3JnPgorRG91Z2xhcyBHaWxiZXJ0IDxkb3VnZ0B0b3JxdWUubmV0PgorRWQgTCBDYXNoaW4gPGVjYXNoaW5AY29yYWlkLmNvbT4KK0V2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+CitGZWxpeCBNb2VsbGVyIDxmZWxpeEBkZXJrbGVja3MuZGU+CitGcmFuayBaYWdvIDxmemFnb0BzeXN0ZW1mYWJyaWN3b3Jrcy5jb20+CitHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBzdXNlLmRlPgorSmFtZXMgQm90dG9tbGV5IDxqZWpiQG11bGdyYXZlLihub25lKT4KK0phbWVzIEJvdHRvbWxleSA8amVqYkB0aXRhbmljLmlsLnN0ZWVsZXllLmNvbT4KK0plZmYgR2FyemlrIDxqZ2FyemlrQHByZXR6ZWwueXl6LnVzPgorSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4KK0theSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KK01pdGVzaCBzaGFoIDxtc2hhaEB0ZWphLmNvbT4KK01vcnRlbiBXZWxpbmRlciA8dGVycmFAZ25vbWUub3JnPgorTW9ydGVuIFdlbGluZGVyIDx3ZWxpbmRlckBhbmVtb25lLnJlbnRlYy5jb20+CitNb3J0ZW4gV2VsaW5kZXIgPHdlbGluZGVyQGRhcnRlci5yZW50ZWMuY29tPgorTW9ydGVuIFdlbGluZGVyIDx3ZWxpbmRlckB0cm9sbC5jb20+CitOZ3V5ZW4gQW5oIFF1eW5oIDxhcXV5bmhAZ21haWwuY29tPgorUGFvbG8gJ0JsYWlzb3JibGFkZScgR2lhcnJ1c3NvIDxibGFpc29yYmxhZGVAeWFob28uaXQ+CitQZXRlciBBIEpvbnNzb24gPHBqQGx1ZGQubHR1LnNlPgorUmFsZiBXaWxkZW5odWVzIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorUnVkb2xmIE1hcmVrIDxSLk1hcmVrQHNoLmN2dXQuY3o+CitSdWkgU2FyYWl2YSA8cm1wc0Bqb2VsLmlzdC51dGwucHQ+CitTYWNoaW4gUCBTYW50IDxzc2FudEBpbi5pYm0uY29tPgorU2FudHR1IEh5cmtrGyxBdhsoQiA8c2FudHR1Lmh5cmtrb0BnbWFpbC5jb20+CitTaW1vbiBLZWxsZXkgPHNpbW9uQHRoZWtlbGxleXMub3JnLnVrPgorVGVqdW4gSGVvIDxodGVqdW5AZ21haWwuY29tPgorVG9ueSBMdWNrIDx0b255Lmx1Y2tAaW50ZWwuY29tPgpkaWZmIC0tZ2l0IGEvZ2l0LXN2bmltcG9ydC5wZXJsIGIvZ2l0LXN2bmltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4YWM3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc3ZuaW1wb3J0LnBlcmwKQEAgLTAsMCArMSw5MjQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDUsIE1hdHRoaWFzIFVybGljaHMuCisjIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHbnUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMKKyMgVGhlIGJhc2ljIGlkZWEgaXMgdG8gcHVsbCBhbmQgYW5hbHl6ZSBTVk4gY2hhbmdlcy4KKyMKKyMgQ2hlY2tpbmcgb3V0IHRoZSBmaWxlcyBpcyBkb25lIGJ5IGEgc2luZ2xlIGxvbmctcnVubmluZyBTVk4gY29ubmVjdGlvbi4KKyMKKyMgVGhlIGhlYWQgcmV2aXNpb24gaXMgb24gYnJhbmNoICJvcmlnaW4iIGJ5IGRlZmF1bHQuCisjIFlvdSBjYW4gY2hhbmdlIHRoYXQgd2l0aCB0aGUgJy1vJyBvcHRpb24uCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgRmlsZTo6Q29weTsKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUpOwordXNlIEZpbGU6OlBhdGggcXcobWtwYXRoKTsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKK3VzZSBUaW1lOjpMb2NhbDsKK3VzZSBJTzo6UGlwZTsKK3VzZSBQT1NJWCBxdyhzdHJmdGltZSBkdXAyKTsKK3VzZSBJUEM6Ok9wZW4yOwordXNlIFNWTjo6Q29yZTsKK3VzZSBTVk46OlJhOworCitkaWUgIk5lZWQgU1ZOOkNvcmUgMS4yLjEgb3IgYmV0dGVyIiBpZiAkU1ZOOjpDb3JlOjpWRVJTSU9OIGx0ICIxLjIuMSI7CisKKyRTSUd7J1BJUEUnfT0iSUdOT1JFIjsKKyRFTlZ7J1RaJ309IlVUQyI7CisKK291cigkb3B0X2gsJG9wdF9vLCRvcHRfdiwkb3B0X3UsJG9wdF9DLCRvcHRfaSwkb3B0X20sJG9wdF9NLCRvcHRfdCwkb3B0X1QsCisgICAgJG9wdF9iLCRvcHRfciwkb3B0X0ksJG9wdF9BLCRvcHRfcywkb3B0X2wsJG9wdF9kLCRvcHRfRCk7CisKK3N1YiB1c2FnZSgpIHsKKwlwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogJHtcYmFzZW5hbWUgJDB9ICAgICAjIGZldGNoL3VwZGF0ZSBHSVQgZnJvbSBTVk4KKyAgICAgICBbLW8gYnJhbmNoLWZvci1IRUFEXSBbLWhdIFstdl0gWy1sIG1heF9yZXZdCisgICAgICAgWy1DIEdJVF9yZXBvc2l0b3J5XSBbLXQgdGFnbmFtZV0gWy1UIHRydW5rbmFtZV0gWy1iIGJyYW5jaG5hbWVdCisgICAgICAgWy1kfC1EXSBbLWldIFstdV0gWy1yXSBbLUkgaWdub3JlZmlsZW5hbWVdIFstcyBzdGFydF9jaGddCisgICAgICAgWy1tXSBbLU0gcmVnZXhdIFstQSBhdXRob3JfZmlsZV0gW1NWTl9VUkxdCitFTkQKKwlleGl0KDEpOworfQorCitnZXRvcHRzKCJBOmI6QzpkRGhpSTpsOm1NOm86cnM6dDpUOnV2Iikgb3IgdXNhZ2UoKTsKK3VzYWdlIGlmICRvcHRfaDsKKworbXkgJHRhZ19uYW1lID0gJG9wdF90IHx8ICJ0YWdzIjsKK215ICR0cnVua19uYW1lID0gJG9wdF9UIHx8ICJ0cnVuayI7CitteSAkYnJhbmNoX25hbWUgPSAkb3B0X2IgfHwgImJyYW5jaGVzIjsKKworQEFSR1YgPT0gMSBvciBAQVJHViA9PSAyIG9yIHVzYWdlKCk7CisKKyRvcHRfbyB8fD0gIm9yaWdpbiI7Ciskb3B0X3MgfHw9IDE7CitteSAkZ2l0X3RyZWUgPSAkb3B0X0M7CiskZ2l0X3RyZWUgfHw9ICIuIjsKKworbXkgJHN2bl91cmwgPSAkQVJHVlswXTsKK215ICRzdm5fZGlyID0gJEFSR1ZbMV07CisKK291ciBAbWVyZ2VyeCA9ICgpOworaWYgKCRvcHRfbSkgeworCW15ICRicmFuY2hfZXNjID0gcXVvdGVtZXRhICgkYnJhbmNoX25hbWUpOworCW15ICR0cnVua19lc2MgID0gcXVvdGVtZXRhICgkdHJ1bmtfbmFtZSk7CisJQG1lcmdlcnggPQorCSgKKwkJcXIhXGIoPzptZXJnKD86ZWQ/fGluZykpXGIuKj9cYigoPzooPzw9JGJyYW5jaF9lc2MvKVtcd1wuXC1dKyl8KD86JHRydW5rX2VzYykpXGIhaSwKKwkJcXIhXGIoPzpmcm9tfG9mKVxXKygoPzooPzw9JGJyYW5jaF9lc2MvKVtcd1wuXC1dKyl8KD86JHRydW5rX2VzYykpXGIhaSwKKwkJcXIhXGIoPzpmcm9tfG9mKVxXKyg/OnRoZSApPyhbXHdcLlwtXSspWy1cc11icmFuY2hcYiFpCisJKTsKK30KK2lmICgkb3B0X00pIHsKKwl1bnNoaWZ0IChAbWVyZ2VyeCwgcXIvJG9wdF9NLyk7Cit9CisKKyMgQWJzb2x1dGl6ZSBmaWxlbmFtZSBub3csIHNpbmNlIHdlIHdpbGwgaGF2ZSBjaGRpcidlZCBieSB0aGUgdGltZSB3ZQorIyBnZXQgYXJvdW5kIHRvIG9wZW5pbmcgaXQuCiskb3B0X0EgPSBGaWxlOjpTcGVjLT5yZWwyYWJzKCRvcHRfQSkgaWYgJG9wdF9BOworCitvdXIgJXVzZXJzID0gKCk7CitvdXIgJHVzZXJzX2ZpbGUgPSB1bmRlZjsKK3N1YiByZWFkX3VzZXJzKCQpIHsKKwkkdXNlcnNfZmlsZSA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoQF8pOworCWRpZSAiQ2Fubm90IG9wZW4gJHVzZXJzX2ZpbGVcbiIgdW5sZXNzIC1mICR1c2Vyc19maWxlOworCW9wZW4obXkgJGF1dGhvcnMsJHVzZXJzX2ZpbGUpOworCXdoaWxlKDwkYXV0aG9ycz4pIHsKKwkJY2hvbXA7CisJCW5leHQgdW5sZXNzIC9eKFxTKz8pXHMqPVxzKiguKz8pXHMqPCguKyk+XHMqJC87CisJCShteSAkdXNlcixteSAkbmFtZSxteSAkZW1haWwpID0gKCQxLCQyLCQzKTsKKwkJJHVzZXJzeyR1c2VyfSA9IFskbmFtZSwkZW1haWxdOworCX0KKwljbG9zZSgkYXV0aG9ycyk7Cit9CisKK3NlbGVjdChTVERFUlIpOyAkfD0xOyBzZWxlY3QoU1RET1VUKTsKKworCitwYWNrYWdlIFNWTmNvbm47CisjIEJhc2ljIFNWTiBjb25uZWN0aW9uLgorIyBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gY29ubmVjdGluZyBhbmQgZG93bmxvYWRpbmcsIHNvIC4uLgorCit1c2UgRmlsZTo6U3BlYzsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBmaWxlKTsKK3VzZSBQT1NJWCBxdyhzdHJmdGltZSBkdXAyKTsKK3VzZSBGY250bCBxdyhTRUVLX1NFVCk7CisKK3N1YiBuZXcgeworCW15KCR3aGF0LCRyZXBvKSA9IEBfOworCSR3aGF0PXJlZigkd2hhdCkgaWYgcmVmKCR3aGF0KTsKKworCW15ICRzZWxmID0ge307CisJJHNlbGYtPnsnYnVmZmVyJ30gPSAiIjsKKwlibGVzcygkc2VsZiwkd2hhdCk7CisKKwkkcmVwbyA9fiBzIy8rJCMjOworCSRzZWxmLT57J2Z1bGxyZXAnfSA9ICRyZXBvOworCSRzZWxmLT5jb25uKCk7CisKKwlyZXR1cm4gJHNlbGY7Cit9CisKK3N1YiBjb25uIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCW15ICRyZXBvID0gJHNlbGYtPnsnZnVsbHJlcCd9OworCW15ICRhdXRoID0gU1ZOOjpDb3JlOjphdXRoX29wZW4gKFtTVk46OkNsaWVudDo6Z2V0X3NpbXBsZV9wcm92aWRlciwKKwkJCSAgU1ZOOjpDbGllbnQ6OmdldF9zc2xfc2VydmVyX3RydXN0X2ZpbGVfcHJvdmlkZXIsCisJCQkgIFNWTjo6Q2xpZW50OjpnZXRfdXNlcm5hbWVfcHJvdmlkZXJdKTsKKwlteSAkcyA9IFNWTjo6UmEtPm5ldyh1cmwgPT4gJHJlcG8sIGF1dGggPT4gJGF1dGgpOworCWRpZSAiU1ZOIGNvbm5lY3Rpb24gdG8gJHJlcG86ICQhXG4iIHVubGVzcyBkZWZpbmVkICRzOworCSRzZWxmLT57J3N2bid9ID0gJHM7CisJJHNlbGYtPnsncmVwbyd9ID0gJHJlcG87CisJJHNlbGYtPnsnbWF4cmV2J30gPSAkcy0+Z2V0X2xhdGVzdF9yZXZudW0oKTsKK30KKworc3ViIGZpbGUgeworCW15KCRzZWxmLCRwYXRoLCRyZXYpID0gQF87CisKKwlteSAoJGZoLCAkbmFtZSkgPSB0ZW1wZmlsZSgnZ2l0c3ZuLlhYWFhYWCcsCisJCSAgICBESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksIFVOTElOSyA9PiAxKTsKKworCXByaW50ICIuLi4gJHJldiAkcGF0aCAuLi5cbiIgaWYgJG9wdF92OworCW15ICh1bmRlZiwgJHByb3BlcnRpZXMpOworCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXcoKTsKKwlldmFsIHsgKHVuZGVmLCAkcHJvcGVydGllcykKKwkJICAgPSAkc2VsZi0+eydzdm4nfS0+Z2V0X2ZpbGUoJHBhdGgsJHJldiwkZmgsJHBvb2wpOyB9OworCSRwb29sLT5jbGVhcjsKKwlpZigkQCkgeworCQlyZXR1cm4gdW5kZWYgaWYgJEAgPX4gL0F0dGVtcHRlZCB0byBnZXQgY2hlY2tzdW0vOworCQlkaWUgJEA7CisJfQorCW15ICRtb2RlOworCWlmIChleGlzdHMgJHByb3BlcnRpZXMtPnsnc3ZuOmV4ZWN1dGFibGUnfSkgeworCQkkbW9kZSA9ICcxMDA3NTUnOworCX0gZWxzaWYgKGV4aXN0cyAkcHJvcGVydGllcy0+eydzdm46c3BlY2lhbCd9KSB7CisJCW15ICgkc3BlY2lhbF9jb250ZW50LCAkZmlsZXNpemUpOworCQkkZmlsZXNpemUgPSB0ZWxsICRmaDsKKwkJc2VlayAkZmgsIDAsIFNFRUtfU0VUOworCQlyZWFkICRmaCwgJHNwZWNpYWxfY29udGVudCwgJGZpbGVzaXplOworCQlpZiAoJHNwZWNpYWxfY29udGVudCA9fiBzL15saW5rIC8vKSB7CisJCQkkbW9kZSA9ICcxMjAwMDAnOworCQkJc2VlayAkZmgsIDAsIFNFRUtfU0VUOworCQkJdHJ1bmNhdGUgJGZoLCAwOworCQkJcHJpbnQgJGZoICRzcGVjaWFsX2NvbnRlbnQ7CisJCX0gZWxzZSB7CisJCQlkaWUgInVuZXhwZWN0ZWQgc3ZuOnNwZWNpYWwgZmlsZSBlbmNvdW50ZXJlZCI7CisJCX0KKwl9IGVsc2UgeworCQkkbW9kZSA9ICcxMDA2NDQnOworCX0KKwljbG9zZSAoJGZoKTsKKworCXJldHVybiAoJG5hbWUsICRtb2RlKTsKK30KKworc3ViIGlnbm9yZSB7CisJbXkoJHNlbGYsJHBhdGgsJHJldikgPSBAXzsKKworCXByaW50ICIuLi4gJHJldiAkcGF0aCAuLi5cbiIgaWYgJG9wdF92OworCW15ICh1bmRlZix1bmRlZiwkcHJvcGVydGllcykKKwkgICAgPSAkc2VsZi0+eydzdm4nfS0+Z2V0X2RpcigkcGF0aCwkcmV2LHVuZGVmKTsKKwlpZiAoZXhpc3RzICRwcm9wZXJ0aWVzLT57J3N2bjppZ25vcmUnfSkgeworCQlteSAoJGZoLCAkbmFtZSkgPSB0ZW1wZmlsZSgnZ2l0c3ZuLlhYWFhYWCcsCisJCQkJCSAgIERJUiA9PiBGaWxlOjpTcGVjLT50bXBkaXIoKSwKKwkJCQkJICAgVU5MSU5LID0+IDEpOworCQlwcmludCAkZmggJHByb3BlcnRpZXMtPnsnc3ZuOmlnbm9yZSd9OworCQljbG9zZSgkZmgpOworCQlyZXR1cm4gJG5hbWU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHVuZGVmOworCX0KK30KKworcGFja2FnZSBtYWluOwordXNlIFVSSTsKKworb3VyICRzdm4gPSAkc3ZuX3VybDsKKyRzdm4gLj0gIi8kc3ZuX2RpciIgaWYgZGVmaW5lZCAkc3ZuX2RpcjsKK215ICRzdm4yID0gU1ZOY29ubi0+bmV3KCRzdm4pOworJHN2biA9IFNWTmNvbm4tPm5ldygkc3ZuKTsKKworbXkgJGx3cF91YTsKK2lmKCRvcHRfZCBvciAkb3B0X0QpIHsKKwkkc3ZuX3VybCA9IFVSSS0+bmV3KCRzdm5fdXJsKS0+Y2Fub25pY2FsOworCWlmKCRvcHRfRCkgeworCQkkc3ZuX2RpciA9fiBzIy8qJCMvIzsKKwl9IGVsc2UgeworCQkkc3ZuX2RpciA9ICIiOworCX0KKwlpZiAoJHN2bl91cmwtPnNjaGVtZSBlcSAiaHR0cCIpIHsKKwkJdXNlIExXUDo6VXNlckFnZW50OworCQkkbHdwX3VhID0gTFdQOjpVc2VyQWdlbnQtPm5ldyhrZWVwX2FsaXZlID0+IDEsIHJlcXVlc3RzX3JlZGlyZWN0YWJsZSA9PiBbXSk7CisJfSBlbHNlIHsKKwkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiBub3QgSFRUUDsgdHVybmluZyBvZmYgZGlyZWN0IGZpbGUgYWNjZXNzXG4iOworCQkkb3B0X2Q9MDsKKwl9Cit9CisKK3N1YiBwZGF0ZSgkKSB7CisJbXkoJGQpID0gQF87CisJJGQgPX4gbSMoXGRcZFxkXGQpLShcZFxkKS0oXGRcZClUKFxkXGQpOihcZFxkKTooXGRcZCkjCisJCW9yIGRpZSAiVW5wYXJzZWFibGUgZGF0ZTogJGRcbiI7CisJbXkgJHk9JDE7ICR5LT0xOTAwIGlmICR5PjE5MDA7CisJcmV0dXJuIHRpbWVnbSgkNnx8MCwkNSwkNCwkMywkMi0xLCR5KTsKK30KKworc3ViIGdldHdkKCkgeworCW15ICRwd2QgPSBgcHdkYDsKKwljaG9tcCAkcHdkOworCXJldHVybiAkcHdkOworfQorCisKK3N1YiBnZXRfaGVhZHJlZigkJCkgeworICAgIG15ICRuYW1lICAgID0gc2hpZnQ7CisgICAgbXkgJGdpdF9kaXIgPSBzaGlmdDsKKyAgICBteSAkc2hhOworCisgICAgaWYgKG9wZW4oQywiJGdpdF9kaXIvcmVmcy9oZWFkcy8kbmFtZSIpKSB7CisJY2hvbXAoJHNoYSA9IDxDPik7CisJY2xvc2UoQyk7CisJbGVuZ3RoKCRzaGEpID09IDQwCisJICAgIG9yIGRpZSAiQ2Fubm90IGdldCBoZWFkIGlkIGZvciAkbmFtZSAoJHNoYSk6ICQhXG4iOworICAgIH0KKyAgICByZXR1cm4gJHNoYTsKK30KKworCistZCAkZ2l0X3RyZWUKKwlvciBta2RpcigkZ2l0X3RyZWUsMDc3NykKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgJGdpdF90cmVlOiAkISI7CitjaGRpcigkZ2l0X3RyZWUpOworCitteSAkb3JpZ19icmFuY2ggPSAiIjsKK215ICRmb3J3YXJkX21hc3RlciA9IDA7CitteSAlYnJhbmNoZXM7CisKK215ICRnaXRfZGlyID0gJEVOVnsiR0lUX0RJUiJ9IHx8ICIuZ2l0IjsKKyRnaXRfZGlyID0gZ2V0d2QoKS4iLyIuJGdpdF9kaXIgdW5sZXNzICRnaXRfZGlyID1+IG0jXi8jOworJEVOVnsiR0lUX0RJUiJ9ID0gJGdpdF9kaXI7CitteSAkb3JpZ19naXRfaW5kZXg7Ciskb3JpZ19naXRfaW5kZXggPSAkRU5We0dJVF9JTkRFWF9GSUxFfSBpZiBleGlzdHMgJEVOVntHSVRfSU5ERVhfRklMRX07CitteSAoJGdpdF9paCwgJGdpdF9pbmRleCkgPSB0ZW1wZmlsZSgnZ2l0WFhYWFhYJywgU1VGRklYID0+ICcuaWR4JywKKwkJCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpKTsKK2Nsb3NlICgkZ2l0X2loKTsKKyRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGdpdF9pbmRleDsKK215ICRtYXhudW0gPSAwOworbXkgJGxhc3RfcmV2ID0gIiI7CitteSAkbGFzdF9icmFuY2g7CitteSAkY3VycmVudF9yZXYgPSAkb3B0X3MgfHwgMTsKK3VubGVzcygtZCAkZ2l0X2RpcikgeworCXN5c3RlbSgiZ2l0LWluaXQtZGIiKTsKKwlkaWUgIkNhbm5vdCBpbml0IHRoZSBHSVQgZGIgYXQgJGdpdF90cmVlOiAkP1xuIiBpZiAkPzsKKwlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiKTsKKwlkaWUgIkNhbm5vdCBpbml0IGFuIGVtcHR5IHRyZWU6ICQ/XG4iIGlmICQ/OworCisJJGxhc3RfYnJhbmNoID0gJG9wdF9vOworCSRvcmlnX2JyYW5jaCA9ICIiOworfSBlbHNlIHsKKwktZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kb3B0X28iCisJCW9yIGRpZSAiQnJhbmNoICckb3B0X28nIGRvZXMgbm90IGV4aXN0LlxuIi4KKwkJICAgICAgICJFaXRoZXIgdXNlIHRoZSBjb3JyZWN0ICctbyBicmFuY2gnIG9wdGlvbixcbiIuCisJCSAgICAgICAib3IgaW1wb3J0IHRvIGEgbmV3IHJlcG9zaXRvcnkuXG4iOworCisJLWYgIiRnaXRfZGlyL3N2bjJnaXQiCisJCW9yIGRpZSAiJyRnaXRfZGlyL3N2bjJnaXQnIGRvZXMgbm90IGV4aXN0LlxuIi4KKwkJICAgICAgICJZb3UgbmVlZCB0aGF0IGZpbGUgZm9yIGluY3JlbWVudGFsIGltcG9ydHMuXG4iOworCW9wZW4oRiwgImdpdC1zeW1ib2xpYy1yZWYgSEVBRCB8Iikgb3IKKwkJZGllICJDYW5ub3QgcnVuIGdpdC1zeW1ib2xpYy1yZWY6ICQhXG4iOworCWNob21wICgkbGFzdF9icmFuY2ggPSA8Rj4pOworCSRsYXN0X2JyYW5jaCA9IGJhc2VuYW1lKCRsYXN0X2JyYW5jaCk7CisJY2xvc2UoRik7CisJdW5sZXNzKCRsYXN0X2JyYW5jaCkgeworCQl3YXJuICJDYW5ub3QgcmVhZCB0aGUgbGFzdCBicmFuY2ggbmFtZTogJCEgLS0gYXNzdW1pbmcgJ21hc3RlcidcbiI7CisJCSRsYXN0X2JyYW5jaCA9ICJtYXN0ZXIiOworCX0KKwkkb3JpZ19icmFuY2ggPSAkbGFzdF9icmFuY2g7CisJJGxhc3RfcmV2ID0gZ2V0X2hlYWRyZWYoJG9yaWdfYnJhbmNoLCAkZ2l0X2Rpcik7CisJaWYgKC1mICIkZ2l0X2Rpci9TVk4yR0lUX0hFQUQiKSB7CisJCWRpZSA8PEVPTTsKK1NWTjJHSVRfSEVBRCBleGlzdHMuCitNYWtlIHN1cmUgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBjb3JyZXNwb25kcyB0byBIRUFEIGFuZCByZW1vdmUgU1ZOMkdJVF9IRUFELgorWW91IG1heSBuZWVkIHRvIHJ1bgorCisgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSBTVk4yR0lUX0hFQUQgSEVBRAorRU9NCisJfQorCXN5c3RlbSgnY3AnLCAiJGdpdF9kaXIvSEVBRCIsICIkZ2l0X2Rpci9TVk4yR0lUX0hFQUQiKTsKKworCSRmb3J3YXJkX21hc3RlciA9CisJICAgICRvcHRfbyBuZSAnbWFzdGVyJyAmJiAtZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiICYmCisJICAgIHN5c3RlbSgnY21wJywgJy1zJywgIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIiwKKwkJCQkiJGdpdF9kaXIvcmVmcy9oZWFkcy8kb3B0X28iKSA9PSAwOworCisJIyBwb3B1bGF0ZSBpbmRleAorCXN5c3RlbSgnZ2l0LXJlYWQtdHJlZScsICRsYXN0X3Jldik7CisJZGllICJyZWFkLXRyZWUgZmFpbGVkOiAkP1xuIiBpZiAkPzsKKworCSMgR2V0IHRoZSBsYXN0IGltcG9ydCB0aW1lc3RhbXBzCisJb3BlbiBteSAkQiwiPCIsICIkZ2l0X2Rpci9zdm4yZ2l0IjsKKwl3aGlsZSg8JEI+KSB7CisJCWNob21wOworCQlteSgkbnVtLCRicmFuY2gsJHJlZikgPSBzcGxpdDsKKwkJJGJyYW5jaGVzeyRicmFuY2h9eyRudW19ID0gJHJlZjsKKwkJJGJyYW5jaGVzeyRicmFuY2h9eyJMQVNUIn0gPSAkcmVmOworCQkkY3VycmVudF9yZXYgPSAkbnVtKzEgaWYgJGN1cnJlbnRfcmV2IDw9ICRudW07CisJfQorCWNsb3NlKCRCKTsKK30KKy1kICRnaXRfZGlyCisJb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIGdpdCBzdWJkaXIgKCRnaXRfZGlyKS5cbiI7CisKK215ICRkZWZhdWx0X2F1dGhvcnMgPSAiJGdpdF9kaXIvc3ZuLWF1dGhvcnMiOworaWYgKCRvcHRfQSkgeworCXJlYWRfdXNlcnMoJG9wdF9BKTsKKwljb3B5KCRvcHRfQSwkZGVmYXVsdF9hdXRob3JzKSBvciBkaWUgIkNvcHkgZmFpbGVkOiAkISI7Cit9IGVsc2UgeworCXJlYWRfdXNlcnMoJGRlZmF1bHRfYXV0aG9ycykgaWYgLWYgJGRlZmF1bHRfYXV0aG9yczsKK30KKworb3BlbiBCUkFOQ0hFUywiPj4iLCAiJGdpdF9kaXIvc3ZuMmdpdCI7CisKK3N1YiBub2RlX2tpbmQoJCQkKSB7CisJbXkgKCRicmFuY2gsICRwYXRoLCAkcmV2aXNpb24pID0gQF87CisJbXkgJHBvb2w9U1ZOOjpQb29sLT5uZXc7CisJbXkgJGtpbmQgPSAkc3ZuLT57J3N2bid9LT5jaGVja19wYXRoKHJldmVydF9zcGxpdF9wYXRoKCRicmFuY2gsJHBhdGgpLCRyZXZpc2lvbiwkcG9vbCk7CisJJHBvb2wtPmNsZWFyOworCXJldHVybiAka2luZDsKK30KKworc3ViIHJldmVydF9zcGxpdF9wYXRoKCQkKSB7CisJbXkoJGJyYW5jaCwkcGF0aCkgPSBAXzsKKworCW15ICRzdm5wYXRoOworCSRwYXRoID0gIiIgaWYgJHBhdGggZXEgIi8iOyAjIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCAuLi4KKwlpZigkYnJhbmNoIGVxICIvIikgeworCQkkc3ZucGF0aCA9ICIkdHJ1bmtfbmFtZS8kcGF0aCI7CisJfSBlbHNpZigkYnJhbmNoID1+IG0jXi8jKSB7CisJCSRzdm5wYXRoID0gIiR0YWdfbmFtZSRicmFuY2gvJHBhdGgiOworCX0gZWxzZSB7CisJCSRzdm5wYXRoID0gIiRicmFuY2hfbmFtZS8kYnJhbmNoLyRwYXRoIjsKKwl9CisKKwkkc3ZucGF0aCA9fiBzIy8rJCMjOworCXJldHVybiAkc3ZucGF0aDsKK30KKworc3ViIGdldF9maWxlKCQkJCkgeworCW15KCRyZXYsJGJyYW5jaCwkcGF0aCkgPSBAXzsKKworCW15ICRzdm5wYXRoID0gcmV2ZXJ0X3NwbGl0X3BhdGgoJGJyYW5jaCwkcGF0aCk7CisKKwkjIG5vdyBnZXQgaXQKKwlteSAoJG5hbWUsJG1vZGUpOworCWlmKCRvcHRfZCkgeworCQlteSgkcmVxLCRyZXMpOworCisJCSMgL3N2bi8hc3ZuL2JjLzIvZGphbmdvL3RydW5rL2RqYW5nby1kb2NzL2J1aWxkLnB5CisJCW15ICR1cmw9JHN2bl91cmwtPmNsb25lKCk7CisJCSR1cmwtPnBhdGgoJHVybC0+cGF0aC4iLyFzdm4vYmMvJHJldi8kc3ZuX2RpciRzdm5wYXRoIik7CisJCXByaW50ICIuLi4gJHBhdGguLi5cbiIgaWYgJG9wdF92OworCQkkcmVxID0gSFRUUDo6UmVxdWVzdC0+bmV3KEdFVCA9PiAkdXJsKTsKKwkJJHJlcyA9ICRsd3BfdWEtPnJlcXVlc3QoJHJlcSk7CisJCWlmICgkcmVzLT5pc19zdWNjZXNzKSB7CisJCQlteSAkZmg7CisJCQkoJGZoLCAkbmFtZSkgPSB0ZW1wZmlsZSgnZ2l0c3ZuLlhYWFhYWCcsCisJCQlESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksIFVOTElOSyA9PiAxKTsKKwkJCXByaW50ICRmaCAkcmVzLT5jb250ZW50OworCQkJY2xvc2UoJGZoKSBvciBkaWUgIkNvdWxkIG5vdCB3cml0ZSAkbmFtZTogJCFcbiI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdW5kZWYgaWYgJHJlcy0+Y29kZSA9PSAzMDE7ICMgZGlyZWN0b3J5PworCQkJZGllICRyZXMtPnN0YXR1c19saW5lLiIgYXQgJHVybFxuIjsKKwkJfQorCQkkbW9kZSA9ICcwNjQ0JzsgIyBjYW4ndCBvYnRhaW4gbW9kZSB2aWEgZGlyZWN0IGh0dHAgcmVxdWVzdD8KKwl9IGVsc2UgeworCQkoJG5hbWUsJG1vZGUpID0gJHN2bi0+ZmlsZSgiJHN2bnBhdGgiLCRyZXYpOworCQlyZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJG5hbWU7CisJfQorCisJbXkgJHBpZCA9IG9wZW4obXkgJEYsICctfCcpOworCWRpZSAkISB1bmxlc3MgZGVmaW5lZCAkcGlkOworCWlmICghJHBpZCkgeworCSAgICBleGVjKCJnaXQtaGFzaC1vYmplY3QiLCAiLXciLCAkbmFtZSkKKwkJb3IgZGllICJDYW5ub3QgY3JlYXRlIG9iamVjdDogJCFcbiI7CisJfQorCW15ICRzaGEgPSA8JEY+OworCWNob21wICRzaGE7CisJY2xvc2UgJEY7CisJdW5saW5rICRuYW1lOworCXJldHVybiBbJG1vZGUsICRzaGEsICRwYXRoXTsKK30KKworc3ViIGdldF9pZ25vcmUoJCQkJCQpIHsKKwlteSgkbmV3LCRvbGQsJHJldiwkYnJhbmNoLCRwYXRoKSA9IEBfOworCisJcmV0dXJuIHVubGVzcyAkb3B0X0k7CisJbXkgJHN2bnBhdGggPSByZXZlcnRfc3BsaXRfcGF0aCgkYnJhbmNoLCRwYXRoKTsKKwlteSAkbmFtZSA9ICRzdm4tPmlnbm9yZSgiJHN2bnBhdGgiLCRyZXYpOworCWlmICgkcGF0aCBlcSAnLycpIHsKKwkJJHBhdGggPSAkb3B0X0k7CisJfSBlbHNlIHsKKwkJJHBhdGggPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCRwYXRoLCRvcHRfSSk7CisJfQorCWlmIChkZWZpbmVkICRuYW1lKSB7CisJCW15ICRwaWQgPSBvcGVuKG15ICRGLCAnLXwnKTsKKwkJZGllICQhIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJCWlmICghJHBpZCkgeworCQkJZXhlYygiZ2l0LWhhc2gtb2JqZWN0IiwgIi13IiwgJG5hbWUpCisJCQkgICAgb3IgZGllICJDYW5ub3QgY3JlYXRlIG9iamVjdDogJCFcbiI7CisJCX0KKwkJbXkgJHNoYSA9IDwkRj47CisJCWNob21wICRzaGE7CisJCWNsb3NlICRGOworCQl1bmxpbmsgJG5hbWU7CisJCXB1c2goQCRuZXcsWycwNjQ0Jywkc2hhLCRwYXRoXSk7CisJfSBlbHNlIHsKKwkJcHVzaChAJG9sZCwkcGF0aCk7CisJfQorfQorCitzdWIgc3BsaXRfcGF0aCgkJCkgeworCW15KCRyZXYsJHBhdGgpID0gQF87CisJbXkgJGJyYW5jaDsKKworCWlmKCRwYXRoID1+IHMjXi9cUSR0YWdfbmFtZVxFLyhbXi9dKykvPyMjKSB7CisJCSRicmFuY2ggPSAiLyQxIjsKKwl9IGVsc2lmKCRwYXRoID1+IHMjXi9cUSR0cnVua19uYW1lXEUvPyMjKSB7CisJCSRicmFuY2ggPSAiLyI7CisJfSBlbHNpZigkcGF0aCA9fiBzI14vXFEkYnJhbmNoX25hbWVcRS8oW14vXSspLz8jIykgeworCQkkYnJhbmNoID0gJDE7CisJfSBlbHNlIHsKKwkJbXkgJW5vX2Vycm9yID0gKAorCQkJIi8iID0+IDEsCisJCQkiLyR0YWdfbmFtZSIgPT4gMSwKKwkJCSIvJGJyYW5jaF9uYW1lIiA9PiAxCisJCSk7CisJCXByaW50IFNUREVSUiAiJHJldjogVW5yZWNvZ25pemVkIHBhdGg6ICRwYXRoXG4iIHVubGVzcyAoZGVmaW5lZCAkbm9fZXJyb3J7JHBhdGh9KTsKKwkJcmV0dXJuICgpCisJfQorCSRwYXRoID0gIi8iIGlmICRwYXRoIGVxICIiOworCXJldHVybiAoJGJyYW5jaCwkcGF0aCk7Cit9CisKK3N1YiBicmFuY2hfcmV2KCQkKSB7CisKKwlteSAoJHNyY2JyYW5jaCwkdXB0b3JldikgPSBAXzsKKworCW15ICRiYnJhbmNoZXMgPSAkYnJhbmNoZXN7JHNyY2JyYW5jaH07CisJbXkgQHJldnMgPSByZXZlcnNlIHNvcnQgeyAoJGEgZXEgJ0xBU1QnID8gMCA6ICRhKSA8PT4gKCRiIGVxICdMQVNUJyA/IDAgOiAkYikgfSBrZXlzICUkYmJyYW5jaGVzOworCW15ICR0aGVyZXY7CisJZm9yZWFjaCBteSAkYXJldihAcmV2cykgeworCQluZXh0IGlmICAoJGFyZXYgZXEgJ0xBU1QnKTsKKwkJaWYgKCRhcmV2IDw9ICR1cHRvcmV2KSB7CisJCQkkdGhlcmV2ID0gJGFyZXY7CisJCQlsYXN0OworCQl9CisJfQorCXJldHVybiAkdGhlcmV2OworfQorCitzdWIgY29weV9wYXRoKCQkJCQkJCQkKSB7CisJIyBTb21lYm9keSBjb3BpZWQgYSB3aG9sZSBzdWJkaXJlY3RvcnkuCisJIyBXZSBuZWVkIHRvIGZpbmQgdGhlIGluZGV4IGVudHJpZXMgZnJvbSB0aGUgb2xkIHZlcnNpb24gd2hpY2ggdGhlCisJIyBTVk4gbG9nIGVudHJ5IHBvaW50cyB0bywgYW5kIGFkZCB0aGVtIHRvIHRoZSBuZXcgcGxhY2UuCisKKwlteSgkbmV3cmV2LCRuZXdicmFuY2gsJHBhdGgsJG9sZHBhdGgsJHJldiwkbm9kZV9raW5kLCRuZXcsJHBhcmVudHMpID0gQF87CisKKwlteSgkc3JjYnJhbmNoLCRzcmNwYXRoKSA9IHNwbGl0X3BhdGgoJHJldiwkb2xkcGF0aCk7CisJdW5sZXNzKGRlZmluZWQgJHNyY2JyYW5jaCkgeworCQlwcmludCAiUGF0aCBub3QgZm91bmQgd2hlbiBjb3B5aW5nIGZyb20gJG9sZHBhdGggQCAkcmV2XG4iOworCQlyZXR1cm47CisJfQorCW15ICR0aGVyZXYgPSBicmFuY2hfcmV2KCRzcmNicmFuY2gsICRyZXYpOworCW15ICRnaXRyZXYgPSAkYnJhbmNoZXN7JHNyY2JyYW5jaH17JHRoZXJldn07CisJdW5sZXNzKCRnaXRyZXYpIHsKKwkJcHJpbnQgU1RERVJSICIkbmV3cmV2OiRuZXdicmFuY2g6IGNvdWxkIG5vdCBmaW5kICRvbGRwYXRoIFxAICRyZXZcbiI7CisJCXJldHVybjsKKwl9CisJaWYgKCRzcmNicmFuY2ggbmUgJG5ld2JyYW5jaCkgeworCQlwdXNoKEAkcGFyZW50cywgJGJyYW5jaGVzeyRzcmNicmFuY2h9eydMQVNUJ30pOworCX0KKwlwcmludCAiJG5ld3JldjokbmV3YnJhbmNoOiRwYXRoOiBjb3B5aW5nIGZyb20gJHNyY2JyYW5jaDokc3JjcGF0aCBAICRyZXZcbiIgaWYgJG9wdF92OworCWlmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmRpcikgeworCQkJJHNyY3BhdGggPX4gcyMvKiQjLyM7CisJfQorCQorCW15ICRwaWQgPSBvcGVuIG15ICRmLCctfCc7CisJZGllICQhIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJaWYgKCEkcGlkKSB7CisJCWV4ZWMoImdpdC1scy10cmVlIiwiLXIiLCIteiIsJGdpdHJldiwkc3JjcGF0aCkKKwkJCW9yIGRpZSAkITsKKwl9CisJbG9jYWwgJC8gPSAiXDAiOworCXdoaWxlKDwkZj4pIHsKKwkJY2hvbXA7CisJCW15KCRtLCRwKSA9IHNwbGl0KC9cdC8sJF8sMik7CisJCW15KCRtb2RlLCR0eXBlLCRzaGExKSA9IHNwbGl0KC8gLywkbSk7CisJCW5leHQgaWYgJHR5cGUgbmUgImJsb2IiOworCQlpZiAoJG5vZGVfa2luZCBlcSAkU1ZOOjpOb2RlOjpkaXIpIHsKKwkJCSRwID0gJHBhdGggLiBzdWJzdHIoJHAsbGVuZ3RoKCRzcmNwYXRoKS0xKTsKKwkJfSBlbHNlIHsKKwkJCSRwID0gJHBhdGg7CisJCX0KKwkJcHVzaChAJG5ldyxbJG1vZGUsJHNoYTEsJHBdKTsJCisJfQorCWNsb3NlKCRmKSBvcgorCQlwcmludCBTVERFUlIgIiRuZXdyZXY6JG5ld2JyYW5jaDogY291bGQgbm90IGxpc3QgZmlsZXMgaW4gJG9sZHBhdGggXEAgJHJldlxuIjsKK30KKworc3ViIGNvbW1pdCB7CisJbXkoJGJyYW5jaCwgJGNoYW5nZWRfcGF0aHMsICRyZXZpc2lvbiwgJGF1dGhvciwgJGRhdGUsICRtZXNzYWdlKSA9IEBfOworCW15KCRhdXRob3JfbmFtZSwkYXV0aG9yX2VtYWlsLCRkZXN0KTsKKwlteShAb2xkLEBuZXcsQHBhcmVudHMpOworCisJaWYgKG5vdCBkZWZpbmVkICRhdXRob3IpIHsKKwkJJGF1dGhvcl9uYW1lID0gJGF1dGhvcl9lbWFpbCA9ICJ1bmtub3duIjsKKwl9IGVsc2lmIChkZWZpbmVkICR1c2Vyc19maWxlKSB7CisJCWRpZSAiVXNlciAkYXV0aG9yIGlzIG5vdCBsaXN0ZWQgaW4gJHVzZXJzX2ZpbGVcbiIKKwkJICAgIHVubGVzcyBleGlzdHMgJHVzZXJzeyRhdXRob3J9OworCQkoJGF1dGhvcl9uYW1lLCRhdXRob3JfZW1haWwpID0gQHskdXNlcnN7JGF1dGhvcn19OworCX0gZWxzaWYgKCRhdXRob3IgPX4gL14oLio/KVxzKzwoLiopPiQvKSB7CisJCSgkYXV0aG9yX25hbWUsICRhdXRob3JfZW1haWwpID0gKCQxLCAkMik7CisJfSBlbHNlIHsKKwkJJGF1dGhvciA9fiBzL148KC4qKT4kLyQxLzsKKwkJJGF1dGhvcl9uYW1lID0gJGF1dGhvcl9lbWFpbCA9ICRhdXRob3I7CisJfQorCSRkYXRlID0gcGRhdGUoJGRhdGUpOworCisJbXkgJHRhZzsKKwlteSAkcGFyZW50OworCWlmKCRicmFuY2ggZXEgIi8iKSB7ICMgdHJ1bmsKKwkJJHBhcmVudCA9ICRvcHRfbzsKKwl9IGVsc2lmKCRicmFuY2ggPX4gbSNeLyguKykjKSB7ICMgdGFnCisJCSR0YWcgPSAxOworCQkkcGFyZW50ID0gJDE7CisJfSBlbHNlIHsgIyAibm9ybWFsIiBicmFuY2gKKwkJIyBub3RoaW5nIHRvIGRvCisJCSRwYXJlbnQgPSAkYnJhbmNoOworCX0KKwkkZGVzdCA9ICRwYXJlbnQ7CisKKwlteSAkcHJldiA9ICRjaGFuZ2VkX3BhdGhzLT57Ii8ifTsKKwlpZigkcHJldiBhbmQgJHByZXYtPlswXSBlcSAiQSIpIHsKKwkJZGVsZXRlICRjaGFuZ2VkX3BhdGhzLT57Ii8ifTsKKwkJbXkgJG9sZHBhdGggPSAkcHJldi0+WzFdOworCQlteSAkcmV2OworCQlpZihkZWZpbmVkICRvbGRwYXRoKSB7CisJCQlteSAkcDsKKwkJCSgkcGFyZW50LCRwKSA9IHNwbGl0X3BhdGgoJHJldmlzaW9uLCRvbGRwYXRoKTsKKwkJCWlmKCRwYXJlbnQgZXEgIi8iKSB7CisJCQkJJHBhcmVudCA9ICRvcHRfbzsKKwkJCX0gZWxzZSB7CisJCQkJJHBhcmVudCA9fiBzI14vIyM7ICMgaWYgaXQncyBhIHRhZworCQkJfQorCQl9IGVsc2UgeworCQkJJHBhcmVudCA9IHVuZGVmOworCQl9CisJfQorCisJbXkgJHJldjsKKwlpZigkcmV2aXNpb24gPiAkb3B0X3MgYW5kIGRlZmluZWQgJHBhcmVudCkgeworCQlvcGVuKEgsImdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgJHBhcmVudCB8Iik7CisJCSRyZXYgPSA8SD47CisJCWNsb3NlKEgpIG9yIGRvIHsKKwkJCXByaW50IFNUREVSUiAiJHJldmlzaW9uOiBjYW5ub3QgZmluZCBjb21taXQgJyRwYXJlbnQnIVxuIjsKKwkJCXJldHVybjsKKwkJfTsKKwkJY2hvcCAkcmV2OworCQlpZihsZW5ndGgoJHJldikgIT0gNDApIHsKKwkJCXByaW50IFNUREVSUiAiJHJldmlzaW9uOiBjYW5ub3QgZmluZCBjb21taXQgJyRwYXJlbnQnIVxuIjsKKwkJCXJldHVybjsKKwkJfQorCQkkcmV2ID0gJGJyYW5jaGVzeygkcGFyZW50IGVxICRvcHRfbykgPyAiLyIgOiAkcGFyZW50fXsiTEFTVCJ9OworCQlpZigkcmV2aXNpb24gIT0gJG9wdF9zIGFuZCBub3QgJHJldikgeworCQkJcHJpbnQgU1RERVJSICIkcmV2aXNpb246IGRvIG5vdCBrbm93IGFuY2VzdG9yIGZvciAnJHBhcmVudCchXG4iOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJJHJldiA9IHVuZGVmOworCX0KKworIwlpZigkcHJldiBhbmQgJHByZXYtPlswXSBlcSAiQSIpIHsKKyMJCWlmKG5vdCAkdGFnKSB7CisjCQkJdW5sZXNzKG9wZW4oSCwiPiAkZ2l0X2Rpci9yZWZzL2hlYWRzLyRicmFuY2giKSkgeworIwkJCQlwcmludCBTVERFUlIgIiRyZXZpc2lvbjogQ291bGQgbm90IGNyZWF0ZSBicmFuY2ggJGJyYW5jaDogJCFcbiI7CisjCQkJCSRzdGF0ZT0xMTsKKyMJCQkJbmV4dDsKKyMJCQl9CisjCQkJcHJpbnQgSCAiJHJldlxuIgorIwkJCQlvciBkaWUgIkNvdWxkIG5vdCB3cml0ZSBicmFuY2ggJGJyYW5jaDogJCEiOworIwkJCWNsb3NlKEgpCisjCQkJCW9yIGRpZSAiQ291bGQgbm90IHdyaXRlIGJyYW5jaCAkYnJhbmNoOiAkISI7CisjCQl9CisjCX0KKwlpZihub3QgZGVmaW5lZCAkcmV2KSB7CisJCXVubGluaygkZ2l0X2luZGV4KTsKKwl9IGVsc2lmICgkcmV2IG5lICRsYXN0X3JldikgeworCQlwcmludCAiU3dpdGNoaW5nIGZyb20gJGxhc3RfcmV2IHRvICRyZXYgKCRicmFuY2gpXG4iIGlmICRvcHRfdjsKKwkJc3lzdGVtKCJnaXQtcmVhZC10cmVlIiwgJHJldik7CisJCWRpZSAicmVhZC10cmVlIGZhaWxlZCBmb3IgJHJldjogJD9cbiIgaWYgJD87CisJCSRsYXN0X3JldiA9ICRyZXY7CisJfQorCisJcHVzaCAoQHBhcmVudHMsICRyZXYpIGlmIGRlZmluZWQgJHJldjsKKworCW15ICRjaWQ7CisJaWYoJHRhZyBhbmQgbm90ICUkY2hhbmdlZF9wYXRocykgeworCQkkY2lkID0gJHJldjsKKwl9IGVsc2UgeworCQlteSBAcGF0aHMgPSBzb3J0IGtleXMgJSRjaGFuZ2VkX3BhdGhzOworCQlmb3JlYWNoIG15ICRwYXRoKEBwYXRocykgeworCQkJbXkgJGFjdGlvbiA9ICRjaGFuZ2VkX3BhdGhzLT57JHBhdGh9OworCisJCQlpZiAoJGFjdGlvbi0+WzBdIGVxICJSIikgeworCQkJCSMgcmVmZXIgdG8gYSBmaWxlL3RyZWUgaW4gYW4gZWFybGllciBjb21taXQKKwkJCQlwdXNoKEBvbGQsJHBhdGgpOyAjIHJlbW92ZSBhbnkgb2xkIHN0dWZmCisJCQl9CisJCQlpZigoJGFjdGlvbi0+WzBdIGVxICJBIikgfHwgKCRhY3Rpb24tPlswXSBlcSAiUiIpKSB7CisJCQkJbXkgJG5vZGVfa2luZCA9IG5vZGVfa2luZCgkYnJhbmNoLCRwYXRoLCRyZXZpc2lvbik7CisJCQkJaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZmlsZSkgeworCQkJCQlteSAkZiA9IGdldF9maWxlKCRyZXZpc2lvbiwkYnJhbmNoLCRwYXRoKTsKKwkJCQkJaWYgKCRmKSB7CisJCQkJCQlwdXNoKEBuZXcsJGYpIGlmICRmOworCQkJCQl9IGVsc2UgeworCQkJCQkJbXkgJG9wYXRoID0gJGFjdGlvbi0+WzNdOworCQkJCQkJcHJpbnQgU1RERVJSICIkcmV2aXNpb246ICRicmFuY2g6IGNvdWxkIG5vdCBmZXRjaCAnJG9wYXRoJ1xuIjsKKwkJCQkJfQorCQkJCX0gZWxzaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCQkJCWlmKCRhY3Rpb24tPlsxXSkgeworCQkJCQkJY29weV9wYXRoKCRyZXZpc2lvbiwgJGJyYW5jaCwKKwkJCQkJCQkgICRwYXRoLCAkYWN0aW9uLT5bMV0sCisJCQkJCQkJICAkYWN0aW9uLT5bMl0sICRub2RlX2tpbmQsCisJCQkJCQkJICBcQG5ldywgXEBwYXJlbnRzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWdldF9pZ25vcmUoXEBuZXcsIFxAb2xkLCAkcmV2aXNpb24sCisJCQkJCQkJICAgJGJyYW5jaCwgJHBhdGgpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNpZiAoJGFjdGlvbi0+WzBdIGVxICJEIikgeworCQkJCXB1c2goQG9sZCwkcGF0aCk7CisJCQl9IGVsc2lmICgkYWN0aW9uLT5bMF0gZXEgIk0iKSB7CisJCQkJbXkgJG5vZGVfa2luZCA9IG5vZGVfa2luZCgkYnJhbmNoLCRwYXRoLCRyZXZpc2lvbik7CisJCQkJaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZmlsZSkgeworCQkJCQlteSAkZiA9IGdldF9maWxlKCRyZXZpc2lvbiwkYnJhbmNoLCRwYXRoKTsKKwkJCQkJcHVzaChAbmV3LCRmKSBpZiAkZjsKKwkJCQl9IGVsc2lmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmRpcikgeworCQkJCQlnZXRfaWdub3JlKFxAbmV3LCBcQG9sZCwgJHJldmlzaW9uLAorCQkJCQkJICAgJGJyYW5jaCwkcGF0aCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkaWUgIiRyZXZpc2lvbjogdW5rbm93biBhY3Rpb24gJyIuJGFjdGlvbi0+WzBdLiInIGZvciAkcGF0aFxuIjsKKwkJCX0KKwkJfQorCisJCXdoaWxlKEBvbGQpIHsKKwkJCW15IEBvMTsKKwkJCWlmKEBvbGQgPiA1NSkgeworCQkJCUBvMSA9IHNwbGljZShAb2xkLDAsNTApOworCQkJfSBlbHNlIHsKKwkJCQlAbzEgPSBAb2xkOworCQkJCUBvbGQgPSAoKTsKKwkJCX0KKwkJCW15ICRwaWQgPSBvcGVuIG15ICRGLCAiLXwiOworCQkJZGllICIkISIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJCWlmICghJHBpZCkgeworCQkJCWV4ZWMoImdpdC1scy1maWxlcyIsICIteiIsIEBvMSkgb3IgZGllICQhOworCQkJfQorCQkJQG8xID0gKCk7CisJCQlsb2NhbCAkLyA9ICJcMCI7CisJCQl3aGlsZSg8JEY+KSB7CisJCQkJY2hvbXA7CisJCQkJcHVzaChAbzEsJF8pOworCQkJfQorCQkJY2xvc2UoJEYpOworCisJCQl3aGlsZShAbzEpIHsKKwkJCQlteSBAbzI7CisJCQkJaWYoQG8xID4gNTUpIHsKKwkJCQkJQG8yID0gc3BsaWNlKEBvMSwwLDUwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlAbzIgPSBAbzE7CisJCQkJCUBvMSA9ICgpOworCQkJCX0KKwkJCQlzeXN0ZW0oImdpdC11cGRhdGUtaW5kZXgiLCItLWZvcmNlLXJlbW92ZSIsIi0tIixAbzIpOworCQkJCWRpZSAiQ2Fubm90IHJlbW92ZSBmaWxlczogJD9cbiIgaWYgJD87CisJCQl9CisJCX0KKwkJd2hpbGUoQG5ldykgeworCQkJbXkgQG4yOworCQkJaWYoQG5ldyA+IDEyKSB7CisJCQkJQG4yID0gc3BsaWNlKEBuZXcsMCwxMCk7CisJCQl9IGVsc2UgeworCQkJCUBuMiA9IEBuZXc7CisJCQkJQG5ldyA9ICgpOworCQkJfQorCQkJc3lzdGVtKCJnaXQtdXBkYXRlLWluZGV4IiwiLS1hZGQiLAorCQkJCShtYXAgeyAoJy0tY2FjaGVpbmZvJywgQCRfKSB9IEBuMikpOworCQkJZGllICJDYW5ub3QgYWRkIGZpbGVzOiAkP1xuIiBpZiAkPzsKKwkJfQorCisJCW15ICRwaWQgPSBvcGVuKEMsIi18Iik7CisJCWRpZSAiQ2Fubm90IGZvcms6ICQhIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQl1bmxlc3MoJHBpZCkgeworCQkJZXhlYygiZ2l0LXdyaXRlLXRyZWUiKTsKKwkJCWRpZSAiQ2Fubm90IGV4ZWMgZ2l0LXdyaXRlLXRyZWU6ICQhXG4iOworCQl9CisJCWNob21wKG15ICR0cmVlID0gPEM+KTsKKwkJbGVuZ3RoKCR0cmVlKSA9PSA0MAorCQkJb3IgZGllICJDYW5ub3QgZ2V0IHRyZWUgaWQgKCR0cmVlKTogJCFcbiI7CisJCWNsb3NlKEMpCisJCQlvciBkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LXdyaXRlLXRyZWU6ICQ/XG4iOworCQlwcmludCAiVHJlZSBJRCAkdHJlZVxuIiBpZiAkb3B0X3Y7CisKKwkJbXkgJHByID0gSU86OlBpcGUtPm5ldygpIG9yIGRpZSAiQ2Fubm90IG9wZW4gcGlwZTogJCFcbiI7CisJCW15ICRwdyA9IElPOjpQaXBlLT5uZXcoKSBvciBkaWUgIkNhbm5vdCBvcGVuIHBpcGU6ICQhXG4iOworCQkkcGlkID0gZm9yaygpOworCQlkaWUgIkZvcms6ICQhXG4iIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJCXVubGVzcygkcGlkKSB7CisJCQkkcHItPndyaXRlcigpOworCQkJJHB3LT5yZWFkZXIoKTsKKwkJCW9wZW4oT1VULCI+JlNURE9VVCIpOworCQkJZHVwMigkcHctPmZpbGVubygpLDApOworCQkJZHVwMigkcHItPmZpbGVubygpLDEpOworCQkJJHByLT5jbG9zZSgpOworCQkJJHB3LT5jbG9zZSgpOworCisJCQlteSBAcGFyID0gKCk7CisKKwkJCSMgbG9vc2UgZGV0ZWN0aW9uIG9mIG1lcmdlcworCQkJIyBiYXNlZCBvbiB0aGUgY29tbWl0IG1zZworCQkJZm9yZWFjaCBteSAkcnggKEBtZXJnZXJ4KSB7CisJCQkJaWYgKCRtZXNzYWdlID1+ICRyeCkgeworCQkJCQlteSAkbXBhcmVudCA9ICQxOworCQkJCQlpZiAoJG1wYXJlbnQgZXEgJ0hFQUQnKSB7ICRtcGFyZW50ID0gJG9wdF9vIH07CisJCQkJCWlmICggLWUgIiRnaXRfZGlyL3JlZnMvaGVhZHMvJG1wYXJlbnQiKSB7CisJCQkJCQkkbXBhcmVudCA9IGdldF9oZWFkcmVmKCRtcGFyZW50LCAkZ2l0X2Rpcik7CisJCQkJCQlwdXNoIChAcGFyZW50cywgJG1wYXJlbnQpOworCQkJCQkJcHJpbnQgT1VUICJNZXJnZSBwYXJlbnQgYnJhbmNoOiAkbXBhcmVudFxuIiBpZiAkb3B0X3Y7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlteSAlc2Vlbl9wYXJlbnRzID0gKCk7CisJCQlteSBAdW5pcXVlX3BhcmVudHMgPSBncmVwIHsgISAkc2Vlbl9wYXJlbnRzeyRffSArKyB9IEBwYXJlbnRzOworCQkJZm9yZWFjaCBteSAkYnBhcmVudCAoQHVuaXF1ZV9wYXJlbnRzKSB7CisJCQkJcHVzaCBAcGFyLCAnLXAnLCAkYnBhcmVudDsKKwkJCQlwcmludCBPVVQgIk1lcmdlIHBhcmVudCBicmFuY2g6ICRicGFyZW50XG4iIGlmICRvcHRfdjsKKwkJCX0KKworCQkJZXhlYygiZW52IiwKKwkJCQkiR0lUX0FVVEhPUl9OQU1FPSRhdXRob3JfbmFtZSIsCisJCQkJIkdJVF9BVVRIT1JfRU1BSUw9JGF1dGhvcl9lbWFpbCIsCisJCQkJIkdJVF9BVVRIT1JfREFURT0iLnN0cmZ0aW1lKCIrMDAwMCAlWS0lbS0lZCAlSDolTTolUyIsZ210aW1lKCRkYXRlKSksCisJCQkJIkdJVF9DT01NSVRURVJfTkFNRT0kYXV0aG9yX25hbWUiLAorCQkJCSJHSVRfQ09NTUlUVEVSX0VNQUlMPSRhdXRob3JfZW1haWwiLAorCQkJCSJHSVRfQ09NTUlUVEVSX0RBVEU9Ii5zdHJmdGltZSgiKzAwMDAgJVktJW0tJWQgJUg6JU06JVMiLGdtdGltZSgkZGF0ZSkpLAorCQkJCSJnaXQtY29tbWl0LXRyZWUiLCAkdHJlZSxAcGFyKTsKKwkJCWRpZSAiQ2Fubm90IGV4ZWMgZ2l0LWNvbW1pdC10cmVlOiAkIVxuIjsKKwkJfQorCQkkcHctPndyaXRlcigpOworCQkkcHItPnJlYWRlcigpOworCisJCSRtZXNzYWdlID1+IHMvW1xzXG5dK1x6Ly87CisJCSRtZXNzYWdlID0gInIkcmV2aXNpb246ICRtZXNzYWdlIiBpZiAkb3B0X3I7CisKKwkJcHJpbnQgJHB3ICIkbWVzc2FnZVxuIgorCQkJb3IgZGllICJFcnJvciB3cml0aW5nIHRvIGdpdC1jb21taXQtdHJlZTogJCFcbiI7CisJCSRwdy0+Y2xvc2UoKTsKKworCQlwcmludCAiQ29tbWl0dGVkIGNoYW5nZSAkcmV2aXNpb246JGJyYW5jaCAiLnN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyIsZ210aW1lKCRkYXRlKSkuIilcbiIgaWYgJG9wdF92OworCQljaG9tcCgkY2lkID0gPCRwcj4pOworCQlsZW5ndGgoJGNpZCkgPT0gNDAKKwkJCW9yIGRpZSAiQ2Fubm90IGdldCBjb21taXQgaWQgKCRjaWQpOiAkIVxuIjsKKwkJcHJpbnQgIkNvbW1pdCBJRCAkY2lkXG4iIGlmICRvcHRfdjsKKwkJJHByLT5jbG9zZSgpOworCisJCXdhaXRwaWQoJHBpZCwwKTsKKwkJZGllICJFcnJvciBydW5uaW5nIGdpdC1jb21taXQtdHJlZTogJD9cbiIgaWYgJD87CisJfQorCisJaWYgKG5vdCBkZWZpbmVkICRjaWQpIHsKKwkJJGNpZCA9ICRicmFuY2hlc3siLyJ9eyJMQVNUIn07CisJfQorCisJaWYobm90IGRlZmluZWQgJGRlc3QpIHsKKwkJcHJpbnQgIi4uLiBubyBrbm93biBwYXJlbnRcbiIgaWYgJG9wdF92OworCX0gZWxzaWYobm90ICR0YWcpIHsKKwkJcHJpbnQgIldyaXRpbmcgdG8gcmVmcy9oZWFkcy8kZGVzdFxuIiBpZiAkb3B0X3Y7CisJCW9wZW4oQywiPiRnaXRfZGlyL3JlZnMvaGVhZHMvJGRlc3QiKSBhbmQKKwkJcHJpbnQgQyAoIiRjaWRcbiIpIGFuZAorCQljbG9zZShDKQorCQkJb3IgZGllICJDYW5ub3Qgd3JpdGUgYnJhbmNoICRkZXN0IGZvciB1cGRhdGU6ICQhXG4iOworCX0KKworCWlmKCR0YWcpIHsKKwkJbXkoJGluLCAkb3V0KSA9ICgnJywnJyk7CisJCSRsYXN0X3JldiA9ICItIiBpZiAlJGNoYW5nZWRfcGF0aHM7CisJCSMgdGhlIHRhZyB3YXMgJ2NvbXBsZXgnLCBpLmUuIGRpZCBub3QgcmVmZXIgdG8gYSAicmVhbCIgcmV2aXNpb24KKworCQkkZGVzdCA9fiB0ci9fL1wuLyBpZiAkb3B0X3U7CisJCSRicmFuY2ggPSAkZGVzdDsKKworCQlteSAkcGlkID0gb3BlbjIoJGluLCAkb3V0LCAnZ2l0LW1rdGFnJyk7CisJCXByaW50ICRvdXQgKCJvYmplY3QgJGNpZFxuIi4KKwkJICAgICJ0eXBlIGNvbW1pdFxuIi4KKwkJICAgICJ0YWcgJGRlc3RcbiIuCisJCSAgICAidGFnZ2VyICRhdXRob3JfbmFtZSA8JGF1dGhvcl9lbWFpbD5cbiIpIGFuZAorCQljbG9zZSgkb3V0KQorCQkgICAgb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyBvYmplY3QgJGRlc3Q6ICQhXG4iOworCisJCW15ICR0YWdvYmogPSA8JGluPjsKKwkJY2hvbXAgJHRhZ29iajsKKworCQlpZiAoICFjbG9zZSgkaW4pIG9yIHdhaXRwaWQoJHBpZCwgMCkgIT0gJHBpZCBvcgorCQkJCSQ/ICE9IDAgb3IgJHRhZ29iaiAhfiAvXlswMTIzNDU2Nzg5YWJjZGVmXXs0MH0kLyApIHsKKwkJCWRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgb2JqZWN0ICRkZXN0OiAkIVxuIjsKKwkJfQorCisJCW9wZW4oQywiPiRnaXRfZGlyL3JlZnMvdGFncy8kZGVzdCIpIGFuZAorCQlwcmludCBDICgiJHRhZ29ialxuIikgYW5kCisJCWNsb3NlKEMpCisJCQlvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnICRicmFuY2g6ICQhXG4iOworCisJCXByaW50ICJDcmVhdGVkIHRhZyAnJGRlc3QnIG9uICckYnJhbmNoJ1xuIiBpZiAkb3B0X3Y7CisJfQorCSRicmFuY2hlc3skYnJhbmNofXsiTEFTVCJ9ID0gJGNpZDsKKwkkYnJhbmNoZXN7JGJyYW5jaH17JHJldmlzaW9ufSA9ICRjaWQ7CisJJGxhc3RfcmV2ID0gJGNpZDsKKwlwcmludCBCUkFOQ0hFUyAiJHJldmlzaW9uICRicmFuY2ggJGNpZFxuIjsKKwlwcmludCAiRE9ORTogJHJldmlzaW9uICRkZXN0ICRjaWRcbiIgaWYgJG9wdF92OworfQorCitzdWIgY29tbWl0X2FsbCB7CisJIyBSZWN1cnNpdmUgdXNlIG9mIHRoZSBTVk4gY29ubmVjdGlvbiBkb2VzIG5vdCB3b3JrCisJbG9jYWwgJHN2biA9ICRzdm4yOworCisJbXkgKCRjaGFuZ2VkX3BhdGhzLCAkcmV2aXNpb24sICRhdXRob3IsICRkYXRlLCAkbWVzc2FnZSwgJHBvb2wpID0gQF87CisJbXkgJXA7CisJd2hpbGUobXkoJHBhdGgsJGFjdGlvbikgPSBlYWNoICUkY2hhbmdlZF9wYXRocykgeworCQkkcHskcGF0aH0gPSBbICRhY3Rpb24tPmFjdGlvbiwkYWN0aW9uLT5jb3B5ZnJvbV9wYXRoLCAkYWN0aW9uLT5jb3B5ZnJvbV9yZXYsICRwYXRoIF07CisJfQorCSRjaGFuZ2VkX3BhdGhzID0gXCVwOworCisJbXkgJWRvbmU7CisJbXkgQGNvbDsKKwlteSAkcHJlZjsKKwlteSAkYnJhbmNoOworCisJd2hpbGUobXkoJHBhdGgsJGFjdGlvbikgPSBlYWNoICUkY2hhbmdlZF9wYXRocykgeworCQkoJGJyYW5jaCwkcGF0aCkgPSBzcGxpdF9wYXRoKCRyZXZpc2lvbiwkcGF0aCk7CisJCW5leHQgaWYgbm90IGRlZmluZWQgJGJyYW5jaDsKKwkJJGRvbmV7JGJyYW5jaH17JHBhdGh9ID0gJGFjdGlvbjsKKwl9CisJd2hpbGUoKCRicmFuY2gsJGNoYW5nZWRfcGF0aHMpID0gZWFjaCAlZG9uZSkgeworCQljb21taXQoJGJyYW5jaCwgJGNoYW5nZWRfcGF0aHMsICRyZXZpc2lvbiwgJGF1dGhvciwgJGRhdGUsICRtZXNzYWdlKTsKKwl9Cit9CisKKyRvcHRfbCA9ICRzdm4tPnsnbWF4cmV2J30gaWYgbm90IGRlZmluZWQgJG9wdF9sIG9yICRvcHRfbCA+ICRzdm4tPnsnbWF4cmV2J307CisKK2lmICgkb3B0X2wgPCAkY3VycmVudF9yZXYpIHsKKyAgICBwcmludCAiVXAgdG8gZGF0ZTogbm8gbmV3IHJldmlzaW9ucyB0byBmZXRjaCFcbiIgaWYgJG9wdF92OworICAgIHVubGluaygiJGdpdF9kaXIvU1ZOMkdJVF9IRUFEIik7CisgICAgZXhpdDsKK30KKworcHJpbnQgIkZldGNoaW5nIGZyb20gJGN1cnJlbnRfcmV2IHRvICRvcHRfbCAuLi5cbiIgaWYgJG9wdF92OworCitteSAkcG9vbD1TVk46OlBvb2wtPm5ldzsKKyRzdm4tPnsnc3ZuJ30tPmdldF9sb2coIi8iLCRjdXJyZW50X3Jldiwkb3B0X2wsMCwxLDEsXCZjb21taXRfYWxsLCRwb29sKTsKKyRwb29sLT5jbGVhcjsKKworCit1bmxpbmsoJGdpdF9pbmRleCk7CisKK2lmIChkZWZpbmVkICRvcmlnX2dpdF9pbmRleCkgeworCSRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJG9yaWdfZ2l0X2luZGV4OworfSBlbHNlIHsKKwlkZWxldGUgJEVOVntHSVRfSU5ERVhfRklMRX07Cit9CisKKyMgTm93IHN3aXRjaCBiYWNrIHRvIHRoZSBicmFuY2ggd2Ugd2VyZSBpbiBiZWZvcmUgYWxsIG9mIHRoaXMgaGFwcGVuZWQKK2lmKCRvcmlnX2JyYW5jaCkgeworCXByaW50ICJET05FXG4iIGlmICRvcHRfdiBhbmQgKG5vdCBkZWZpbmVkICRvcHRfbCBvciAkb3B0X2wgPiAwKTsKKwlzeXN0ZW0oImNwIiwiJGdpdF9kaXIvcmVmcy9oZWFkcy8kb3B0X28iLCIkZ2l0X2Rpci9yZWZzL2hlYWRzL21hc3RlciIpCisJCWlmICRmb3J3YXJkX21hc3RlcjsKKwl1bmxlc3MgKCRvcHRfaSkgeworCQlzeXN0ZW0oJ2dpdC1yZWFkLXRyZWUnLCAnLW0nLCAnLXUnLCAnU1ZOMkdJVF9IRUFEJywgJ0hFQUQnKTsKKwkJZGllICJyZWFkLXRyZWUgZmFpbGVkOiAkP1xuIiBpZiAkPzsKKwl9Cit9IGVsc2UgeworCSRvcmlnX2JyYW5jaCA9ICJtYXN0ZXIiOworCXByaW50ICJET05FOyBjcmVhdGluZyAkb3JpZ19icmFuY2ggYnJhbmNoXG4iIGlmICRvcHRfdiBhbmQgKG5vdCBkZWZpbmVkICRvcHRfbCBvciAkb3B0X2wgPiAwKTsKKwlzeXN0ZW0oImNwIiwiJGdpdF9kaXIvcmVmcy9oZWFkcy8kb3B0X28iLCIkZ2l0X2Rpci9yZWZzL2hlYWRzL21hc3RlciIpCisJCXVubGVzcyAtZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiOworCXN5c3RlbSgnZ2l0LXVwZGF0ZS1yZWYnLCAnSEVBRCcsICIkb3JpZ19icmFuY2giKTsKKwl1bmxlc3MgKCRvcHRfaSkgeworCQlzeXN0ZW0oJ2dpdCBjaGVja291dCcpOworCQlkaWUgImNoZWNrb3V0IGZhaWxlZDogJD9cbiIgaWYgJD87CisJfQorfQordW5saW5rKCIkZ2l0X2Rpci9TVk4yR0lUX0hFQUQiKTsKK2Nsb3NlKEJSQU5DSEVTKTsKZGlmZiAtLWdpdCBhL2dpdC10YWcuc2ggYi9naXQtdGFnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwYWZhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtdGFnLnNoCkBAIC0wLDAgKzEsMTEyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChjKSAyMDA1IExpbnVzIFRvcnZhbGRzCisKK1VTQUdFPSctbCBbPHBhdHRlcm4+XSB8IFstYSB8IC1zIHwgLXUgPGtleS1pZD5dIFstZiB8IC1kXSBbLW0gPG1zZz5dIDx0YWduYW1lPiBbPGhlYWQ+XScKK1NVQkRJUkVDVE9SWV9PSz0nWWVzJworLiBnaXQtc2gtc2V0dXAKKworYW5ub3RhdGU9CitzaWduZWQ9Citmb3JjZT0KK21lc3NhZ2U9Cit1c2VybmFtZT0KK2xpc3Q9Cit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKyAgICBjYXNlICIkMSIgaW4KKyAgICAtYSkKKwlhbm5vdGF0ZT0xCisJOzsKKyAgICAtcykKKwlhbm5vdGF0ZT0xCisJc2lnbmVkPTEKKwk7OworICAgIC1mKQorCWZvcmNlPTEKKwk7OworICAgIC1sKQorCWNhc2UgIiQjIiBpbgorCTEpCisJCXNldCB4IC4gOzsKKwllc2FjCisJc2hpZnQKKwlnaXQgcmV2LXBhcnNlIC0tc3ltYm9saWMgLS10YWdzIHwgc29ydCB8IGdyZXAgIiRAIgorCWV4aXQgJD8KKwk7OworICAgIC1tKQorICAgIAlhbm5vdGF0ZT0xCisJc2hpZnQKKwltZXNzYWdlPSIkMSIKKwk7OworICAgIC11KQorCWFubm90YXRlPTEKKwlzaWduZWQ9MQorCXNoaWZ0CisJdXNlcm5hbWU9IiQxIgorCTs7CisgICAgLWQpCisgICAgCXNoaWZ0CisJdGFnX25hbWU9IiQxIgorCXJtICIkR0lUX0RJUi9yZWZzL3RhZ3MvJHRhZ19uYW1lIiAmJiBcCisJICAgICAgICBlY2hvICJEZWxldGVkIHRhZyAkdGFnX25hbWUuIgorCWV4aXQgJD8KKwk7OworICAgIC0qKQorICAgICAgICB1c2FnZQorCTs7CisgICAgKikKKwlicmVhaworCTs7CisgICAgZXNhYworICAgIHNoaWZ0Citkb25lCisKK25hbWU9IiQxIgorWyAiJG5hbWUiIF0gfHwgdXNhZ2UKK2lmIFsgLWUgIiRHSVRfRElSL3JlZnMvdGFncy8kbmFtZSIgLWEgLXogIiRmb3JjZSIgXTsgdGhlbgorICAgIGRpZSAidGFnICckbmFtZScgYWxyZWFkeSBleGlzdHMiCitmaQorc2hpZnQKK2dpdC1jaGVjay1yZWYtZm9ybWF0ICJ0YWdzLyRuYW1lIiB8fAorCWRpZSAid2UgZG8gbm90IGxpa2UgJyRuYW1lJyBhcyBhIHRhZyBuYW1lLiIKKworb2JqZWN0PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAtLWRlZmF1bHQgSEVBRCAiJEAiKSB8fCBleGl0IDEKK3R5cGU9JChnaXQtY2F0LWZpbGUgLXQgJG9iamVjdCkgfHwgZXhpdCAxCit0YWdnZXI9JChnaXQtdmFyIEdJVF9DT01NSVRURVJfSURFTlQpIHx8IGV4aXQgMQorOiAke3VzZXJuYW1lOj0kKGV4cHIgInokdGFnZ2VyIiA6ICd6XCguKj5cKScpfQorCit0cmFwICdybSAtZiAiJEdJVF9ESVIiL1RBR19UTVAqICIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHICIkR0lUX0RJUiIvVEFHX0VESVRNU0cnIDAKKworaWYgWyAiJGFubm90YXRlIiBdOyB0aGVuCisgICAgaWYgWyAteiAiJG1lc3NhZ2UiIF07IHRoZW4KKyAgICAgICAgKCBlY2hvICIjIgorICAgICAgICAgIGVjaG8gIiMgV3JpdGUgYSB0YWcgbWVzc2FnZSIKKyAgICAgICAgICBlY2hvICIjIiApID4gIiRHSVRfRElSIi9UQUdfRURJVE1TRworICAgICAgICAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gIiRHSVRfRElSIi9UQUdfRURJVE1TRyB8fCBleGl0CisgICAgZWxzZQorICAgICAgICBlY2hvICIkbWVzc2FnZSIgPiIkR0lUX0RJUiIvVEFHX0VESVRNU0cKKyAgICBmaQorCisgICAgZ3JlcCAtdiAnXiMnIDwiJEdJVF9ESVIiL1RBR19FRElUTVNHIHwKKyAgICBnaXQtc3RyaXBzcGFjZSA+IiRHSVRfRElSIi9UQUdfRklOQUxNU0cKKworICAgIFsgLXMgIiRHSVRfRElSIi9UQUdfRklOQUxNU0cgXSB8fCB7CisJZWNobyA+JjIgIk5vIHRhZyBtZXNzYWdlPyIKKwlleGl0IDEKKyAgICB9CisKKyAgICAoIHByaW50ZiAnb2JqZWN0ICVzXG50eXBlICVzXG50YWcgJXNcbnRhZ2dlciAlc1xuXG4nIFwKKwkiJG9iamVjdCIgIiR0eXBlIiAiJG5hbWUiICIkdGFnZ2VyIjsKKyAgICAgIGNhdCAiJEdJVF9ESVIiL1RBR19GSU5BTE1TRyApID4iJEdJVF9ESVIiL1RBR19UTVAKKyAgICBybSAtZiAiJEdJVF9ESVIiL1RBR19UTVAuYXNjICIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHCisgICAgaWYgWyAiJHNpZ25lZCIgXTsgdGhlbgorCWdwZyAtYnNhIC11ICIkdXNlcm5hbWUiICIkR0lUX0RJUiIvVEFHX1RNUCAmJgorCWNhdCAiJEdJVF9ESVIiL1RBR19UTVAuYXNjID4+IiRHSVRfRElSIi9UQUdfVE1QIHx8CisJZGllICJmYWlsZWQgdG8gc2lnbiB0aGUgdGFnIHdpdGggR1BHLiIKKyAgICBmaQorICAgIG9iamVjdD0kKGdpdC1ta3RhZyA8ICIkR0lUX0RJUiIvVEFHX1RNUCkKK2ZpCisKK2xlYWRpbmc9YGV4cHIgInJlZnMvdGFncy8kbmFtZSIgOiAnXCguKlwpLydgICYmCitta2RpciAtcCAiJEdJVF9ESVIvJGxlYWRpbmciICYmCitlY2hvICRvYmplY3QgPiAiJEdJVF9ESVIvcmVmcy90YWdzLyRuYW1lIgpkaWZmIC0tZ2l0IGEvZ2l0LXZlcmlmeS10YWcuc2ggYi9naXQtdmVyaWZ5LXRhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNmYxNzFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXZlcmlmeS10YWcuc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisKK1VTQUdFPSc8dGFnPicKK1NVQkRJUkVDVE9SWV9PSz0nWWVzJworLiBnaXQtc2gtc2V0dXAKKwordmVyYm9zZT0KK3doaWxlIGNhc2UgJCMgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS12fC0tdnwtLXZlfC0tdmVyfC0tdmVyYnwtLXZlcmJvfC0tdmVyYm9zfC0tdmVyYm9zZSkKKwkJdmVyYm9zZT10IDs7CisJKikKKwkJYnJlYWsgOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworaWYgWyAiJCMiICE9ICIxIiBdCit0aGVuCisJdXNhZ2UKK2ZpCisKK3R5cGU9IiQoZ2l0LWNhdC1maWxlIC10ICIkMSIgMj4vZGV2L251bGwpIiB8fAorCWRpZSAiJDE6IG5vIHN1Y2ggb2JqZWN0LiIKKwordGVzdCAiJHR5cGUiID0gdGFnIHx8CisJZGllICIkMTogY2Fubm90IHZlcmlmeSBhIG5vbi10YWcgb2JqZWN0IG9mIHR5cGUgJHR5cGUuIgorCitjYXNlICIkdmVyYm9zZSIgaW4KK3QpCisJZ2l0LWNhdC1maWxlIC1wICIkMSIgfAorCXNlZCAtbiAtZSAnL14tLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLS9xJyAtZSBwCisJOzsKK2VzYWMKKworZ2l0LWNhdC1maWxlIHRhZyAiJDEiID4iJEdJVF9ESVIvLnRtcC12dGFnIiB8fCBleGl0IDEKK2NhdCAiJEdJVF9ESVIvLnRtcC12dGFnIiB8CitzZWQgJy8tLS0tLUJFR0lOIFBHUC9RJyB8CitncGcgLS12ZXJpZnkgIiRHSVRfRElSLy50bXAtdnRhZyIgLSB8fCBleGl0IDEKK3JtIC1mICIkR0lUX0RJUi8udG1wLXZ0YWciCisKZGlmZiAtLWdpdCBhL2dpdC5jIGIvZ2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2OWQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC5jCkBAIC0wLDAgKzEsMzEzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgdm9pZCBwcmVwZW5kX3RvX3BhdGgoY29uc3QgY2hhciAqZGlyLCBpbnQgbGVuKQoreworCWNoYXIgKnBhdGgsICpvbGRfcGF0aCA9IGdldGVudigiUEFUSCIpOworCWludCBwYXRoX2xlbiA9IGxlbjsKKworCWlmICghb2xkX3BhdGgpCisJCW9sZF9wYXRoID0gIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW4iOworCisJcGF0aF9sZW4gPSBsZW4gKyBzdHJsZW4ob2xkX3BhdGgpICsgMTsKKworCXBhdGggPSBtYWxsb2MocGF0aF9sZW4gKyAxKTsKKworCW1lbWNweShwYXRoLCBkaXIsIGxlbik7CisJcGF0aFtsZW5dID0gJzonOworCW1lbWNweShwYXRoICsgbGVuICsgMSwgb2xkX3BhdGgsIHBhdGhfbGVuIC0gbGVuKTsKKworCXNldGVudigiUEFUSCIsIHBhdGgsIDEpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYWxpYXNfY29tbWFuZDsKK3N0YXRpYyBjaGFyICphbGlhc19zdHJpbmcgPSBOVUxMOworCitzdGF0aWMgaW50IGdpdF9hbGlhc19jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cm5jbXAodmFyLCAiYWxpYXMuIiwgNikgJiYgIXN0cmNtcCh2YXIgKyA2LCBhbGlhc19jb21tYW5kKSkgeworCQlhbGlhc19zdHJpbmcgPSBzdHJkdXAodmFsdWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGxpdF9jbWRsaW5lKGNoYXIgKmNtZGxpbmUsIGNvbnN0IGNoYXIgKioqYXJndikKK3sKKwlpbnQgc3JjLCBkc3QsIGNvdW50ID0gMCwgc2l6ZSA9IDE2OworCWNoYXIgcXVvdGVkID0gMDsKKworCSphcmd2ID0gbWFsbG9jKHNpemVvZihjaGFyKikgKiBzaXplKTsKKworCS8qIHNwbGl0IGFsaWFzX3N0cmluZyAqLworCSgqYXJndilbY291bnQrK10gPSBjbWRsaW5lOworCWZvciAoc3JjID0gZHN0ID0gMDsgY21kbGluZVtzcmNdOykgeworCQljaGFyIGMgPSBjbWRsaW5lW3NyY107CisJCWlmICghcXVvdGVkICYmIGlzc3BhY2UoYykpIHsKKwkJCWNtZGxpbmVbZHN0KytdID0gMDsKKwkJCXdoaWxlIChjbWRsaW5lWysrc3JjXQorCQkJCQkmJiBpc3NwYWNlKGNtZGxpbmVbc3JjXSkpCisJCQkJOyAvKiBza2lwICovCisJCQlpZiAoY291bnQgPj0gc2l6ZSkgeworCQkJCXNpemUgKz0gMTY7CisJCQkJKmFyZ3YgPSByZWFsbG9jKCphcmd2LCBzaXplb2YoY2hhciopICogc2l6ZSk7CisJCQl9CisJCQkoKmFyZ3YpW2NvdW50KytdID0gY21kbGluZSArIGRzdDsKKwkJfSBlbHNlIGlmKCFxdW90ZWQgJiYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykpIHsKKwkJCXF1b3RlZCA9IGM7CisJCQlzcmMrKzsKKwkJfSBlbHNlIGlmIChjID09IHF1b3RlZCkgeworCQkJcXVvdGVkID0gMDsKKwkJCXNyYysrOworCQl9IGVsc2UgeworCQkJaWYgKGMgPT0gJ1xcJyAmJiBxdW90ZWQgIT0gJ1wnJykgeworCQkJCXNyYysrOworCQkJCWMgPSBjbWRsaW5lW3NyY107CisJCQkJaWYgKCFjKSB7CisJCQkJCWZyZWUoKmFyZ3YpOworCQkJCQkqYXJndiA9IE5VTEw7CisJCQkJCXJldHVybiBlcnJvcigiY21kbGluZSBlbmRzIHdpdGggXFwiKTsKKwkJCQl9CisJCQl9CisJCQljbWRsaW5lW2RzdCsrXSA9IGM7CisJCQlzcmMrKzsKKwkJfQorCX0KKworCWNtZGxpbmVbZHN0XSA9IDA7CisKKwlpZiAocXVvdGVkKSB7CisJCWZyZWUoKmFyZ3YpOworCQkqYXJndiA9IE5VTEw7CisJCXJldHVybiBlcnJvcigidW5jbG9zZWQgcXVvdGUiKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2FsaWFzKGludCAqYXJnY3AsIGNvbnN0IGNoYXIgKioqYXJndikKK3sKKwlpbnQgbm9uZ2l0ID0gMCwgcmV0ID0gMDsKKwljb25zdCBjaGFyICpzdWJkaXI7CisKKwlzdWJkaXIgPSBzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmbm9uZ2l0KTsKKwlpZiAoIW5vbmdpdCkgeworCQlpbnQgY291bnQ7CisJCWNvbnN0IGNoYXIqKiBuZXdfYXJndjsKKworCQlhbGlhc19jb21tYW5kID0gKCphcmd2KVswXTsKKwkJZ2l0X2NvbmZpZyhnaXRfYWxpYXNfY29uZmlnKTsKKwkJaWYgKGFsaWFzX3N0cmluZykgeworCisJCQljb3VudCA9IHNwbGl0X2NtZGxpbmUoYWxpYXNfc3RyaW5nLCAmbmV3X2FyZ3YpOworCisJCQlpZiAoY291bnQgPCAxKQorCQkJCWRpZSgiZW1wdHkgYWxpYXMgZm9yICVzIiwgYWxpYXNfY29tbWFuZCk7CisKKwkJCWlmICghc3RyY21wKGFsaWFzX2NvbW1hbmQsIG5ld19hcmd2WzBdKSkKKwkJCQlkaWUoInJlY3Vyc2l2ZSBhbGlhczogJXMiLCBhbGlhc19jb21tYW5kKTsKKworCQkJLyogaW5zZXJ0IGFmdGVyIGNvbW1hbmQgbmFtZSAqLworCQkJaWYgKCphcmdjcCA+IDEpIHsKKwkJCQluZXdfYXJndiA9IHJlYWxsb2MobmV3X2FyZ3YsIHNpemVvZihjaGFyKikgKgorCQkJCQkJKGNvdW50ICsgKmFyZ2NwIC0gMSkpOworCQkJCW1lbWNweShuZXdfYXJndiArIGNvdW50LCAqYXJndiwgc2l6ZW9mKGNoYXIqKSAqCisJCQkJCQkoKmFyZ2NwIC0gMSkpOworCQkJfQorCisJCQkqYXJndiA9IG5ld19hcmd2OworCQkJKmFyZ2NwICs9IGNvdW50IC0gMTsKKworCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCWlmIChzdWJkaXIpCisJCWNoZGlyKHN1YmRpcik7CisKKwlyZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyIGdpdF92ZXJzaW9uX3N0cmluZ1tdID0gR0lUX1ZFUlNJT047CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJY29uc3QgY2hhciAqY21kID0gYXJndlswXTsKKwlzdGF0aWMgc3RydWN0IGNtZF9zdHJ1Y3QgeworCQljb25zdCBjaGFyICpjbWQ7CisJCWludCAoKmZuKShpbnQsIGNvbnN0IGNoYXIgKiosIGNoYXIgKiopOworCX0gY29tbWFuZHNbXSA9IHsKKwkJeyAidmVyc2lvbiIsIGNtZF92ZXJzaW9uIH0sCisJCXsgImhlbHAiLCBjbWRfaGVscCB9LAorCQl7ICJsb2ciLCBjbWRfbG9nIH0sCisJCXsgIndoYXRjaGFuZ2VkIiwgY21kX3doYXRjaGFuZ2VkIH0sCisJCXsgInNob3ciLCBjbWRfc2hvdyB9LAorCQl7ICJwdXNoIiwgY21kX3B1c2ggfSwKKwkJeyAiZm9ybWF0LXBhdGNoIiwgY21kX2Zvcm1hdF9wYXRjaCB9LAorCQl7ICJjb3VudC1vYmplY3RzIiwgY21kX2NvdW50X29iamVjdHMgfSwKKwkJeyAiZGlmZiIsIGNtZF9kaWZmIH0sCisJCXsgImdyZXAiLCBjbWRfZ3JlcCB9LAorCQl7ICJybSIsIGNtZF9ybSB9LAorCQl7ICJhZGQiLCBjbWRfYWRkIH0sCisJCXsgInJldi1saXN0IiwgY21kX3Jldl9saXN0IH0sCisJCXsgImluaXQtZGIiLCBjbWRfaW5pdF9kYiB9LAorCQl7ICJnZXQtdGFyLWNvbW1pdC1pZCIsIGNtZF9nZXRfdGFyX2NvbW1pdF9pZCB9LAorCQl7ICJ1cGxvYWQtdGFyIiwgY21kX3VwbG9hZF90YXIgfSwKKwkJeyAiY2hlY2stcmVmLWZvcm1hdCIsIGNtZF9jaGVja19yZWZfZm9ybWF0IH0sCisJCXsgImxzLWZpbGVzIiwgY21kX2xzX2ZpbGVzIH0sCisJCXsgImxzLXRyZWUiLCBjbWRfbHNfdHJlZSB9LAorCQl7ICJ0YXItdHJlZSIsIGNtZF90YXJfdHJlZSB9LAorCQl7ICJyZWFkLXRyZWUiLCBjbWRfcmVhZF90cmVlIH0sCisJCXsgImNvbW1pdC10cmVlIiwgY21kX2NvbW1pdF90cmVlIH0sCisJCXsgImFwcGx5IiwgY21kX2FwcGx5IH0sCisJCXsgInNob3ctYnJhbmNoIiwgY21kX3Nob3dfYnJhbmNoIH0sCisJCXsgImRpZmYtZmlsZXMiLCBjbWRfZGlmZl9maWxlcyB9LAorCQl7ICJkaWZmLWluZGV4IiwgY21kX2RpZmZfaW5kZXggfSwKKwkJeyAiZGlmZi1zdGFnZXMiLCBjbWRfZGlmZl9zdGFnZXMgfSwKKwkJeyAiZGlmZi10cmVlIiwgY21kX2RpZmZfdHJlZSB9LAorCQl7ICJjYXQtZmlsZSIsIGNtZF9jYXRfZmlsZSB9LAorCQl7ICJyZXYtcGFyc2UiLCBjbWRfcmV2X3BhcnNlIH0KKwl9OworCWludCBpOworCisJLyogVHVybiAiZ2l0IGNtZCAtLWhlbHAiIGludG8gImdpdCBoZWxwIGNtZCIgKi8KKwlpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpIHsKKwkJYXJndlsxXSA9IGFyZ3ZbMF07CisJCWFyZ3ZbMF0gPSBjbWQgPSAiaGVscCI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbWFuZHMpOyBpKyspIHsKKwkJc3RydWN0IGNtZF9zdHJ1Y3QgKnAgPSBjb21tYW5kcytpOworCQlpZiAoc3RyY21wKHAtPmNtZCwgY21kKSkKKwkJCWNvbnRpbnVlOworCQlleGl0KHAtPmZuKGFyZ2MsIGFyZ3YsIGVudnApKTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJY29uc3QgY2hhciAqY21kID0gYXJndlswXTsKKwljaGFyICpzbGFzaCA9IHN0cnJjaHIoY21kLCAnLycpOworCWNoYXIgZ2l0X2NvbW1hbmRbUEFUSF9NQVggKyAxXTsKKwljb25zdCBjaGFyICpleGVjX3BhdGggPSBOVUxMOworCWludCBkb25lX2FsaWFzID0gMDsKKworCS8qCisJICogVGFrZSB0aGUgYmFzZW5hbWUgb2YgYXJndlswXSBhcyB0aGUgY29tbWFuZAorCSAqIG5hbWUsIGFuZCB0aGUgZGlybmFtZSBhcyB0aGUgZGVmYXVsdCBleGVjX3BhdGgKKwkgKiBpZiBpdCdzIGFuIGFic29sdXRlIHBhdGggYW5kIHdlIGRvbid0IGhhdmUKKwkgKiBhbnl0aGluZyBiZXR0ZXIuCisJICovCisJaWYgKHNsYXNoKSB7CisJCSpzbGFzaCsrID0gMDsKKwkJaWYgKCpjbWQgPT0gJy8nKQorCQkJZXhlY19wYXRoID0gY21kOworCQljbWQgPSBzbGFzaDsKKwl9CisKKwkvKgorCSAqICJnaXQteHh4eCIgaXMgdGhlIHNhbWUgYXMgImdpdCB4eHh4IiwgYnV0IHdlIG9idmlvdXNseToKKwkgKgorCSAqICAtIGNhbm5vdCB0YWtlIGZsYWdzIGluIGJldHdlZW4gdGhlICJnaXQiIGFuZCB0aGUgInh4eHgiLgorCSAqICAtIGNhbm5vdCBleGVjdXRlIGl0IGV4dGVybmFsbHkgKHNpbmNlIGl0IHdvdWxkIGp1c3QgZG8KKwkgKiAgICB0aGUgc2FtZSB0aGluZyBvdmVyIGFnYWluKQorCSAqCisJICogU28gd2UganVzdCBkaXJlY3RseSBjYWxsIHRoZSBpbnRlcm5hbCBjb21tYW5kIGhhbmRsZXIsIGFuZAorCSAqIGRpZSBpZiB0aGF0IG9uZSBjYW5ub3QgaGFuZGxlIGl0LgorCSAqLworCWlmICghc3RybmNtcChjbWQsICJnaXQtIiwgNCkpIHsKKwkJY21kICs9IDQ7CisJCWFyZ3ZbMF0gPSBjbWQ7CisJCWhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKGFyZ2MsIGFyZ3YsIGVudnApOworCQlkaWUoImNhbm5vdCBoYW5kbGUgJXMgaW50ZXJuYWxseSIsIGNtZCk7CisJfQorCisJLyogRGVmYXVsdCBjb21tYW5kOiAiaGVscCIgKi8KKwljbWQgPSAiaGVscCI7CisKKwkvKiBMb29rIGZvciBmbGFncy4uICovCisJd2hpbGUgKGFyZ2MgPiAxKSB7CisJCWNtZCA9ICorK2FyZ3Y7CisJCWFyZ2MtLTsKKworCQlpZiAoc3RybmNtcChjbWQsICItLSIsIDIpKQorCQkJYnJlYWs7CisKKwkJY21kICs9IDI7CisKKwkJLyoKKwkJICogRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgInZlcnNpb24iIGFuZCAiaGVscCIKKwkJICogY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCAiLS0iIHByZXBlbmRlZAorCQkgKiB0byBtYWtlIHRoZW0gbG9vayBsaWtlIGZsYWdzLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoY21kLCAiaGVscCIpKQorCQkJYnJlYWs7CisJCWlmICghc3RyY21wKGNtZCwgInZlcnNpb24iKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIENoZWNrIHJlbWFpbmluZyBmbGFncyAod2hpY2ggYnkgbm93IG11c3QgYmUKKwkJICogIi0tZXhlYy1wYXRoIiwgYnV0IG1heWJlIHdlIHdpbGwgYWNjZXB0CisJCSAqIG90aGVyIGFyZ3VtZW50cyBzb21lIGRheSkKKwkJICovCisJCWlmICghc3RybmNtcChjbWQsICJleGVjLXBhdGgiLCA5KSkgeworCQkJY21kICs9IDk7CisJCQlpZiAoKmNtZCA9PSAnPScpIHsKKwkJCQlnaXRfc2V0X2V4ZWNfcGF0aChjbWQgKyAxKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB1dHMoZ2l0X2V4ZWNfcGF0aCgpKTsKKwkJCWV4aXQoMCk7CisJCX0KKwkJY21kX3VzYWdlKDAsIE5VTEwsIE5VTEwpOworCX0KKwlhcmd2WzBdID0gY21kOworCisJLyoKKwkgKiBXZSBzZWFyY2ggZm9yIGdpdCBjb21tYW5kcyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorCSAqICAtIGdpdF9leGVjX3BhdGgoKQorCSAqICAtIHRoZSBwYXRoIG9mIHRoZSAiZ2l0IiBjb21tYW5kIGlmIHdlIGNvdWxkIGZpbmQgaXQKKwkgKiAgICBpbiAkMAorCSAqICAtIHRoZSByZWd1bGFyIFBBVEguCisJICovCisJaWYgKGV4ZWNfcGF0aCkKKwkJcHJlcGVuZF90b19wYXRoKGV4ZWNfcGF0aCwgc3RybGVuKGV4ZWNfcGF0aCkpOworCWV4ZWNfcGF0aCA9IGdpdF9leGVjX3BhdGgoKTsKKwlwcmVwZW5kX3RvX3BhdGgoZXhlY19wYXRoLCBzdHJsZW4oZXhlY19wYXRoKSk7CisKKwl3aGlsZSAoMSkgeworCQkvKiBTZWUgaWYgaXQncyBhbiBpbnRlcm5hbCBjb21tYW5kICovCisJCWhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKGFyZ2MsIGFyZ3YsIGVudnApOworCisJCS8qIC4uIHRoZW4gdHJ5IHRoZSBleHRlcm5hbCBvbmVzICovCisJCWV4ZWN2X2dpdF9jbWQoYXJndik7CisKKwkJLyogSXQgY291bGQgYmUgYW4gYWxpYXMgLS0gdGhpcyB3b3JrcyBhcm91bmQgdGhlIGluc2FuaXR5CisJCSAqIG9mIG92ZXJyaWRpbmcgImdpdCBsb2ciIHdpdGggImdpdCBzaG93IiBieSBoYXZpbmcKKwkJICogYWxpYXMubG9nID0gc2hvdworCQkgKi8KKwkJaWYgKGRvbmVfYWxpYXMgfHwgIWhhbmRsZV9hbGlhcygmYXJnYywgJmFyZ3YpKQorCQkJYnJlYWs7CisJCWRvbmVfYWxpYXMgPSAxOworCX0KKworCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCWNtZF91c2FnZSgwLCBleGVjX3BhdGgsICInJXMnIGlzIG5vdCBhIGdpdC1jb21tYW5kIiwgY21kKTsKKworCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJ1biBjb21tYW5kICclcyc6ICVzXG4iLAorCQlnaXRfY29tbWFuZCwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZ2l0LnNwZWMuaW4gYi9naXQuc3BlYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NkMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LnNwZWMuaW4KQEAgLTAsMCArMSwxODggQEAKKyMgUGFzcyAtLXdpdGhvdXQgZG9jcyB0byBycG1idWlsZCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZG9jdW1lbnRhdGlvbgorTmFtZTogCQlnaXQKK1ZlcnNpb246IAlAQFZFUlNJT05AQAorUmVsZWFzZTogCTElez9kaXN0fQorU3VtbWFyeTogIAlHaXQgY29yZSBhbmQgdG9vbHMKK0xpY2Vuc2U6IAlHUEwKK0dyb3VwOiAJCURldmVsb3BtZW50L1Rvb2xzCitVUkw6IAkJaHR0cDovL2tlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvCitTb3VyY2U6IAlodHRwOi8va2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC8le25hbWV9LSV7dmVyc2lvbn0udGFyLmd6CitCdWlsZFJlcXVpcmVzOgl6bGliLWRldmVsID49IDEuMiwgb3BlbnNzbC1kZXZlbCwgY3VybC1kZXZlbCwgZXhwYXQtZGV2ZWwgICV7IT9fd2l0aG91dF9kb2NzOiwgeG1sdG8sIGFzY2lpZG9jID4gNi4wLjN9CitCdWlsZFJvb3Q6CSV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9LXJvb3QtJSgle19faWRfdX0gLW4pCitSZXF1aXJlczoJZ2l0LWNvcmUsIGdpdC1zdm4sIGdpdC1jdnMsIGdpdC1hcmNoLCBnaXQtZW1haWwsIGdpdGsKKworJWRlc2NyaXB0aW9uCitUaGlzIGlzIGEgc3R1cGlkIChidXQgZXh0cmVtZWx5IGZhc3QpIGRpcmVjdG9yeSBjb250ZW50IG1hbmFnZXIuICBJdAorZG9lc24ndCBkbyBhIHdob2xlIGxvdCwgYnV0IHdoYXQgaXQgX2RvZXNfIGRvIGlzIHRyYWNrIGRpcmVjdG9yeQorY29udGVudHMgZWZmaWNpZW50bHkuIEl0IGlzIGludGVuZGVkIHRvIGJlIHRoZSBiYXNlIG9mIGFuIGVmZmljaWVudCwKK2Rpc3RyaWJ1dGVkIHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQgc3lzdGVtLiBUaGlzIHBhY2thZ2UgaW5jbHVkZXMKK3J1ZGltZW50YXJ5IHRvb2xzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBTQ00sIGJ1dCB5b3Ugc2hvdWxkIGxvb2sKK2Vsc2V3aGVyZSBmb3IgdG9vbHMgZm9yIG9yZGluYXJ5IGh1bWFucyBsYXllcmVkIG9uIHRvcCBvZiB0aGlzLgorCitUaGlzIGlzIGEgZHVtbXkgcGFja2FnZSB3aGljaCBicmluZ3MgaW4gYWxsIHN1YnBhY2thZ2VzLgorCislcGFja2FnZSBjb3JlCitTdW1tYXJ5OglDb3JlIGdpdCB0b29scworR3JvdXA6CQlEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6CXpsaWIgPj0gMS4yLCByc3luYywgcmNzLCBjdXJsLCBsZXNzLCBvcGVuc3NoLWNsaWVudHMsIHB5dGhvbiA+PSAyLjMsIGV4cGF0CislZGVzY3JpcHRpb24gY29yZQorVGhpcyBpcyBhIHN0dXBpZCAoYnV0IGV4dHJlbWVseSBmYXN0KSBkaXJlY3RvcnkgY29udGVudCBtYW5hZ2VyLiAgSXQKK2RvZXNuJ3QgZG8gYSB3aG9sZSBsb3QsIGJ1dCB3aGF0IGl0IF9kb2VzXyBkbyBpcyB0cmFjayBkaXJlY3RvcnkKK2NvbnRlbnRzIGVmZmljaWVudGx5LiBJdCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgYmFzZSBvZiBhbiBlZmZpY2llbnQsCitkaXN0cmlidXRlZCBzb3VyY2UgY29kZSBtYW5hZ2VtZW50IHN5c3RlbS4gVGhpcyBwYWNrYWdlIGluY2x1ZGVzCitydWRpbWVudGFyeSB0b29scyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgU0NNLCBidXQgeW91IHNob3VsZCBsb29rCitlbHNld2hlcmUgZm9yIHRvb2xzIGZvciBvcmRpbmFyeSBodW1hbnMgbGF5ZXJlZCBvbiB0b3Agb2YgdGhpcy4KKworVGhlc2UgYXJlIHRoZSBjb3JlIHRvb2xzIHdpdGggbWluaW1hbCBkZXBlbmRlbmNpZXMuCisKKyVwYWNrYWdlIHN2bgorU3VtbWFyeTogICAgICAgIEdpdCB0b29scyBmb3IgaW1wb3J0aW5nIFN1YnZlcnNpb24gcmVwb3NpdG9yaWVzCitHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvVG9vbHMKK1JlcXVpcmVzOiAgICAgICBnaXQtY29yZSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSwgc3VidmVyc2lvbgorJWRlc2NyaXB0aW9uIHN2bgorR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgU3VidmVyc2lvbiByZXBvc2l0b3JpZXMuCisKKyVwYWNrYWdlIGN2cworU3VtbWFyeTogICAgICAgIEdpdCB0b29scyBmb3IgaW1wb3J0aW5nIENWUyByZXBvc2l0b3JpZXMKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCBjdnMsIGN2c3BzCislZGVzY3JpcHRpb24gY3ZzCitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBDVlMgcmVwb3NpdG9yaWVzLgorCislcGFja2FnZSBhcmNoCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgQXJjaCByZXBvc2l0b3JpZXMKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCB0bGEKKyVkZXNjcmlwdGlvbiBhcmNoCitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBBcmNoIHJlcG9zaXRvcmllcy4KKworJXBhY2thZ2UgZW1haWwKK1N1bW1hcnk6ICAgICAgICBHaXQgdG9vbHMgZm9yIHNlbmRpbmcgZW1haWwKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6CWdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9IAorJWRlc2NyaXB0aW9uIGVtYWlsCitHaXQgdG9vbHMgZm9yIHNlbmRpbmcgZW1haWwuCisKKyVwYWNrYWdlIC1uIGdpdGsKK1N1bW1hcnk6ICAgICAgICBHaXQgcmV2aXNpb24gdHJlZSB2aXN1YWxpc2VyICgnZ2l0aycpCitHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvVG9vbHMKK1JlcXVpcmVzOiAgICAgICBnaXQtY29yZSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSwgdGsgPj0gOC40CislZGVzY3JpcHRpb24gLW4gZ2l0aworR2l0IHJldmlzaW9uIHRyZWUgdmlzdWFsaXNlciAoJ2dpdGsnKQorCislcHJlcAorJXNldHVwIC1xCisKKyVidWlsZAorbWFrZSAle19zbXBfbWZsYWdzfSBDRkxBR1M9IiRSUE1fT1BUX0ZMQUdTIiBXSVRIX09XTl9TVUJQUk9DRVNTX1BZPVllc1BsZWFzZSBcCisgICAgIHByZWZpeD0le19wcmVmaXh9IGFsbCAleyE/X3dpdGhvdXRfZG9jczogZG9jfQorCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorbWFrZSAle19zbXBfbWZsYWdzfSBERVNURElSPSRSUE1fQlVJTERfUk9PVCBXSVRIX09XTl9TVUJQUk9DRVNTX1BZPVllc1BsZWFzZSBcCisgICAgIHByZWZpeD0le19wcmVmaXh9IG1hbmRpcj0le19tYW5kaXJ9IFwKKyAgICAgaW5zdGFsbCAleyE/X3dpdGhvdXRfZG9jczogaW5zdGFsbC1kb2N9CisKKyhmaW5kICRSUE1fQlVJTERfUk9PVCV7X2JpbmRpcn0gLXR5cGUgZiB8IGdyZXAgLXZFICJhcmNofHN2bnxjdnN8ZW1haWx8Z2l0ayIgfCBzZWQgLWUgc0BeJFJQTV9CVUlMRF9ST09UQEApICAgICAgICAgICAgICAgPiBiaW4tbWFuLWRvYy1maWxlcworJWlmICV7IT9fd2l0aG91dF9kb2NzOjF9MAorKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfSAkUlBNX0JVSUxEX1JPT1QvRG9jdW1lbnRhdGlvbiAtdHlwZSBmIHwgZ3JlcCAtdkUgImFyY2h8c3ZufGdpdC1jdnN8ZW1haWx8Z2l0ayIgfCBzZWQgLWUgc0BeJFJQTV9CVUlMRF9ST09UQEAgLWUgJ3MvJC8qLycgKSA+PiBiaW4tbWFuLWRvYy1maWxlcworJWVuZGlmCisKKyVjbGVhbgorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorCislZmlsZXMKKyMgVGhlc2UgYXJlIG5vIGZpbGVzIGluIHRoZSByb290IHBhY2thZ2UKKworJWZpbGVzIHN2bgorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19iaW5kaXJ9Lypzdm4qCislZG9jIERvY3VtZW50YXRpb24vKnN2bioudHh0CisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xLypzdm4qLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qc3ZuKi5odG1sIH0KKworJWZpbGVzIGN2cworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLnR4dAorJXtfYmluZGlyfS8qY3ZzKgorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS8qY3ZzKi4xKn0KKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLmh0bWwgfQorCislZmlsZXMgYXJjaAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmFyY2gqLnR4dAorJXtfYmluZGlyfS8qYXJjaCoKKyV7IT9fd2l0aG91dF9kb2NzOiAle19tYW5kaXJ9L21hbjEvKmFyY2gqLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qYXJjaCouaHRtbCB9CisKKyVmaWxlcyBlbWFpbAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmVtYWlsKi50eHQKKyV7X2JpbmRpcn0vKmVtYWlsKgorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS8qZW1haWwqLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qZW1haWwqLmh0bWwgfQorCislZmlsZXMgLW4gZ2l0aworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmdpdGsqLnR4dAorJXtfYmluZGlyfS8qZ2l0ayoKKyV7IT9fd2l0aG91dF9kb2NzOiAle19tYW5kaXJ9L21hbjEvKmdpdGsqLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qZ2l0ayouaHRtbCB9CisKKyVmaWxlcyBjb3JlIC1mIGJpbi1tYW4tZG9jLWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyV7X2RhdGFkaXJ9L2dpdC1jb3JlLworJWRvYyBSRUFETUUgQ09QWUlORyBEb2N1bWVudGF0aW9uLyoudHh0CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uLyouaHRtbCB9CisKKyVjaGFuZ2Vsb2cKKyogTW9uIE5vdiAxNCAyMDA1IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPiAwLjk5LjlqLTEKKy0gQ2hhbmdlIHN1YnBhY2thZ2UgbmFtZXMgdG8gZ2l0LTxuYW1lPiBpbnN0ZWFkIG9mIGdpdC1jb3JlLTxuYW1lPgorLSBDcmVhdGUgZW1wdHkgcm9vdCBwYWNrYWdlIHdoaWNoIGJyaW5ncyBpbiBhbGwgc3VicGFja2FnZXMKKy0gUmVuYW1lIGdpdC10ayAtPiBnaXRrCisKKyogVGh1IE5vdiAxMCAyMDA1IENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPiAwLjk5LjlnLTEKKy0gemxpYiBkZXBlbmRlbmN5IGZpeAorLSBNaW5vciBjbGVhbnVwcyBmcm9tIHNwbGl0CistIE1vdmUgYXJjaCBpbXBvcnQgdG8gc2VwYXJhdGUgcGFja2FnZSBhcyB3ZWxsCisKKyogVHVlIFNlcCAyNyAyMDA1IEppbSBSYWRmb3JkIDxyYWRmb3JkQGJsYWNrYmVhbi5vcmc+CistIE1vdmUgcHJvZ3JhbXMgd2l0aCBub24tc3RhbmRhcmQgZGVwZW5kZW5jaWVzIChzdm4sIGN2cywgZW1haWwpCisgIGludG8gc2VwYXJhdGUgcGFja2FnZXMKKworKiBUdWUgU2VwIDI3IDIwMDUgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIHBhcmFsbGVsaXplIGJ1aWxkCistIENPUFRTIC0+IENGTEFHUworCisqIEZyaSBTZXAgMTYgMjAwNSBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4gMC45OS42LTEKKy0gdXBkYXRlIHRvIDAuOTkuNgorCisqIEZyaSBTZXAgMTYgMjAwNSBIb3JzdCBILiB2b24gQnJhbmQgPHZvbmJyYW5kQGluZi51dGZzbS5jbD4KKy0gTGludXMgbm90aWNlZCB0aGF0IGxlc3MgaXMgcmVxdWlyZWQsIGFkZGVkIHRvIHRoZSBkZXBlbmRlbmNpZXMKKworKiBTdW4gU2VwIDExIDIwMDUgSG9yc3QgSC4gdm9uIEJyYW5kIDx2b25icmFuZEBpbmYudXRmc20uY2w+CistIFVwZGF0ZWQgZGVwZW5kZW5jaWVzCistIERvbid0IGFzc3VtZSBtYW5wYWdlcyBhcmUgZ3ppcHBlZAorCisqIFRodSBBdWcgMTggMjAwNSBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4gMC45OS40LTQKKy0gZHJvcCBzaF91dGlscywgc2gtdXRpbHMsIGRpZmZ1dGlscywgbWt0ZW1wLCBhbmQgb3BlbnNzbCBSZXF1aXJlcworLSB1c2UgUlBNX09QVF9GTEFHUyBpbiBzcGVjIGZpbGUsIGRyb3AgcGF0Y2gwCisKKyogV2VkIEF1ZyAxNyAyMDA1IFRvbSAic3BvdCIgQ2FsbGF3YXkgPHRjYWxsYXdhQHJlZGhhdC5jb20+IDAuOTkuNC0zCistIHVzZSBkaXN0IHRhZyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYnJhbmNoZXMKKy0gdXNlIHJwbSBvcHRmbGFncyBieSBkZWZhdWx0IChwYXRjaDApCistIG93biAle19kYXRhZGlyfS9naXQtY29yZS8KKworKiBNb24gQXVnIDE1IDIwMDUgQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+CistIHVwZGF0ZSBzcGVjIGZpbGUgdG8gZml4IEJ1aWxkcm9vdCwgUmVxdWlyZXMsIGFuZCBkcm9wIFZlbmRvcgorCisqIFN1biBBdWcgMDcgMjAwNSBIb3JzdCBILiB2b24gQnJhbmQgPHZvbmJyYW5kQGluZi51dGZzbS5jbD4KKy0gUmVkaWQgdGhlIGRlc2NyaXB0aW9uCistIEN1dCBvdmVybG9uZyBtYWtlIGxpbmUsIGxvb3NlbmVkIGNoYW5nZWxvZyBhIGJpdAorLSBJIHRoaW5rIEp1bmlvIChvciBwZXJoYXBzIE9TREw/KSBzaG91bGQgYmUgdmVuZG9yLi4uCisKKyogVGh1IEp1bCAxNCAyMDA1IEVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CistIEFkZCB0aGUgbWFuIHBhZ2VzLCBhbmQgdGhlIC0td2l0aG91dCBkb2NzIGJ1aWxkIG9wdGlvbgorCisqIFdlZCBKdWwgNyAyMDA1IENocmlzIFdyaWdodCA8Y2hyaXNAb3NkbC5vcmc+CistIGluaXRpYWwgZ2l0IHNwZWMgZmlsZQpkaWZmIC0tZ2l0IGEvZ2l0TWVyZ2VDb21tb24ucHkgYi9naXRNZXJnZUNvbW1vbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJmOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0TWVyZ2VDb21tb24ucHkKQEAgLTAsMCArMSwyNzUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEZyZWRyaWsgS3VpdmluZW4KKyMKKworaW1wb3J0IHN5cywgcmUsIG9zLCB0cmFjZWJhY2sKK2Zyb20gc2V0cyBpbXBvcnQgU2V0CisKK2RlZiBkaWUoKmFyZ3MpOgorICAgIHByaW50TGlzdChhcmdzLCBzeXMuc3RkZXJyKQorICAgIHN5cy5leGl0KDIpCisKK2RlZiBwcmludExpc3QobGlzdCwgZmlsZT1zeXMuc3Rkb3V0KToKKyAgICBmb3IgeCBpbiBsaXN0OgorICAgICAgICBmaWxlLndyaXRlKHN0cih4KSkKKyAgICAgICAgZmlsZS53cml0ZSgnICcpCisgICAgZmlsZS53cml0ZSgnXG4nKQorCitpbXBvcnQgc3VicHJvY2VzcworCisjIERlYnVnZ2luZyBtYWNoaW5lcnkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorCitERUJVRyA9IDAKK2Z1bmN0aW9uc1RvRGVidWcgPSBTZXQoKQorCitkZWYgYWRkRGVidWcoZnVuYyk6CisgICAgaWYgdHlwZShmdW5jKSA9PSBzdHI6CisgICAgICAgIGZ1bmN0aW9uc1RvRGVidWcuYWRkKGZ1bmMpCisgICAgZWxzZToKKyAgICAgICAgZnVuY3Rpb25zVG9EZWJ1Zy5hZGQoZnVuYy5mdW5jX25hbWUpCisKK2RlZiBkZWJ1ZygqYXJncyk6CisgICAgaWYgREVCVUc6CisgICAgICAgIGZ1bmNOYW1lID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2soKVstMl1bMl0KKyAgICAgICAgaWYgZnVuY05hbWUgaW4gZnVuY3Rpb25zVG9EZWJ1ZzoKKyAgICAgICAgICAgIHByaW50TGlzdChhcmdzKQorCisjIFByb2dyYW0gZXhlY3V0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFByb2dyYW1FcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9nU3RyLCBlcnJvcik6CisgICAgICAgIHNlbGYucHJvZ1N0ciA9IHByb2dTdHIKKyAgICAgICAgc2VsZi5lcnJvciA9IGVycm9yCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvZ1N0ciArICc6ICcgKyBzZWxmLmVycm9yCisKK2FkZERlYnVnKCdydW5Qcm9ncmFtJykKK2RlZiBydW5Qcm9ncmFtKHByb2csIGlucHV0PU5vbmUsIHJldHVybkNvZGU9RmFsc2UsIGVudj1Ob25lLCBwaXBlT3V0cHV0PVRydWUpOgorICAgIGRlYnVnKCdydW5Qcm9ncmFtIHByb2c6Jywgc3RyKHByb2cpLCAnaW5wdXQ6Jywgc3RyKGlucHV0KSkKKyAgICBpZiB0eXBlKHByb2cpIGlzIHN0cjoKKyAgICAgICAgcHJvZ1N0ciA9IHByb2cKKyAgICBlbHNlOgorICAgICAgICBwcm9nU3RyID0gJyAnLmpvaW4ocHJvZykKKyAgICAKKyAgICB0cnk6CisgICAgICAgIGlmIHBpcGVPdXRwdXQ6CisgICAgICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlNURE9VVAorICAgICAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGRlcnIgPSBOb25lCisgICAgICAgICAgICBzdGRvdXQgPSBOb25lCisgICAgICAgIHBvcCA9IHN1YnByb2Nlc3MuUG9wZW4ocHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCA9IHR5cGUocHJvZykgaXMgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudikKKyAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgZGVidWcoJ3N0cmVycm9yOicsIGUuc3RyZXJyb3IpCisgICAgICAgIHJhaXNlIFByb2dyYW1FcnJvcihwcm9nU3RyLCBlLnN0cmVycm9yKQorCisgICAgaWYgaW5wdXQgIT0gTm9uZToKKyAgICAgICAgcG9wLnN0ZGluLndyaXRlKGlucHV0KQorICAgIHBvcC5zdGRpbi5jbG9zZSgpCisKKyAgICBpZiBwaXBlT3V0cHV0OgorICAgICAgICBvdXQgPSBwb3Auc3Rkb3V0LnJlYWQoKQorICAgIGVsc2U6CisgICAgICAgIG91dCA9ICcnCisKKyAgICBjb2RlID0gcG9wLndhaXQoKQorICAgIGlmIHJldHVybkNvZGU6CisgICAgICAgIHJldCA9IFtvdXQsIGNvZGVdCisgICAgZWxzZToKKyAgICAgICAgcmV0ID0gb3V0CisgICAgaWYgY29kZSAhPSAwIGFuZCBub3QgcmV0dXJuQ29kZToKKyAgICAgICAgZGVidWcoJ2Vycm9yIG91dHB1dDonLCBvdXQpCisgICAgICAgIGRlYnVnKCdwcm9nOicsIHByb2cpCisgICAgICAgIHJhaXNlIFByb2dyYW1FcnJvcihwcm9nU3RyLCBvdXQpCisjICAgIGRlYnVnKCdvdXRwdXQ6Jywgb3V0LnJlcGxhY2UoJ1wwJywgJ1xuJykpCisgICAgcmV0dXJuIHJldAorCisjIENvZGUgZm9yIGNvbXB1dGluZyBjb21tb24gYW5jZXN0b3JzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2N1cnJlbnRJZCA9IDAKK2RlZiBnZXRVbmlxdWVJZCgpOgorICAgIGdsb2JhbCBjdXJyZW50SWQKKyAgICBjdXJyZW50SWQgKz0gMQorICAgIHJldHVybiBjdXJyZW50SWQKKworIyBUaGUgJ3ZpcnR1YWwnIGNvbW1pdCBvYmplY3RzIGhhdmUgU0hBcyB3aGljaCBhcmUgaW50ZWdlcnMKK3NoYVJFID0gcmUuY29tcGlsZSgnXlswLTlhLWZdezQwfSQnKQorZGVmIGlzU2hhKG9iaik6CisgICAgcmV0dXJuICh0eXBlKG9iaikgaXMgc3RyIGFuZCBib29sKHNoYVJFLm1hdGNoKG9iaikpKSBvciBcCisgICAgICAgICAgICh0eXBlKG9iaikgaXMgaW50IGFuZCBvYmogPj0gMSkKKworY2xhc3MgQ29tbWl0KG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydwYXJlbnRzJywgJ2ZpcnN0TGluZU1zZycsICdjaGlsZHJlbicsICdfdHJlZScsICdzaGEnLAorICAgICAgICAgICAgICAgICAndmlydHVhbCddCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2hhLCBwYXJlbnRzLCB0cmVlPU5vbmUpOgorICAgICAgICBzZWxmLnBhcmVudHMgPSBwYXJlbnRzCisgICAgICAgIHNlbGYuZmlyc3RMaW5lTXNnID0gTm9uZQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KKworICAgICAgICBpZiB0cmVlOgorICAgICAgICAgICAgdHJlZSA9IHRyZWUucnN0cmlwKCkKKyAgICAgICAgICAgIGFzc2VydChpc1NoYSh0cmVlKSkKKyAgICAgICAgc2VsZi5fdHJlZSA9IHRyZWUKKworICAgICAgICBpZiBub3Qgc2hhOgorICAgICAgICAgICAgc2VsZi5zaGEgPSBnZXRVbmlxdWVJZCgpCisgICAgICAgICAgICBzZWxmLnZpcnR1YWwgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmZpcnN0TGluZU1zZyA9ICd2aXJ0dWFsIGNvbW1pdCcKKyAgICAgICAgICAgIGFzc2VydChpc1NoYSh0cmVlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudmlydHVhbCA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLnNoYSA9IHNoYS5yc3RyaXAoKQorICAgICAgICBhc3NlcnQoaXNTaGEoc2VsZi5zaGEpKQorCisgICAgZGVmIHRyZWUoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0SW5mbygpCisgICAgICAgIGFzc2VydChzZWxmLl90cmVlICE9IE5vbmUpCisgICAgICAgIHJldHVybiBzZWxmLl90cmVlCisKKyAgICBkZWYgc2hvcnRJbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmdldEluZm8oKQorICAgICAgICByZXR1cm4gc3RyKHNlbGYuc2hhKSArICcgJyArIHNlbGYuZmlyc3RMaW5lTXNnCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2hvcnRJbmZvKCkKKworICAgIGRlZiBnZXRJbmZvKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnZpcnR1YWwgb3Igc2VsZi5maXJzdExpbmVNc2cgIT0gTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5mbyA9IHJ1blByb2dyYW0oWydnaXQtY2F0LWZpbGUnLCAnY29tbWl0Jywgc2VsZi5zaGFdKQorICAgICAgICAgICAgaW5mbyA9IGluZm8uc3BsaXQoJ1xuJykKKyAgICAgICAgICAgIG1zZyA9IEZhbHNlCisgICAgICAgICAgICBmb3IgbCBpbiBpbmZvOgorICAgICAgICAgICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdExpbmVNc2cgPSBsCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbC5zdGFydHN3aXRoKCd0cmVlJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90cmVlID0gbFs1Ol0ucnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBsID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gVHJ1ZQorCitjbGFzcyBHcmFwaDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY29tbWl0cyA9IFtdCisgICAgICAgIHNlbGYuc2hhTWFwID0ge30KKworICAgIGRlZiBhZGROb2RlKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShub2RlLCBDb21taXQpKQorICAgICAgICBzZWxmLnNoYU1hcFtub2RlLnNoYV0gPSBub2RlCisgICAgICAgIHNlbGYuY29tbWl0cy5hcHBlbmQobm9kZSkKKyAgICAgICAgZm9yIHAgaW4gbm9kZS5wYXJlbnRzOgorICAgICAgICAgICAgcC5jaGlsZHJlbi5hcHBlbmQobm9kZSkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiByZWFjaGFibGVOb2RlcyhzZWxmLCBuMSwgbjIpOgorICAgICAgICByZXMgPSB7fQorICAgICAgICBkZWYgdHJhdmVyc2Uobik6CisgICAgICAgICAgICByZXNbbl0gPSBUcnVlCisgICAgICAgICAgICBmb3IgcCBpbiBuLnBhcmVudHM6CisgICAgICAgICAgICAgICAgdHJhdmVyc2UocCkKKworICAgICAgICB0cmF2ZXJzZShuMSkKKyAgICAgICAgdHJhdmVyc2UobjIpCisgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiBmaXhQYXJlbnRzKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgeCBpbiByYW5nZSgwLCBsZW4obm9kZS5wYXJlbnRzKSk6CisgICAgICAgICAgICBub2RlLnBhcmVudHNbeF0gPSBzZWxmLnNoYU1hcFtub2RlLnBhcmVudHNbeF1dCisKKyMgYWRkRGVidWcoJ2J1aWxkR3JhcGgnKQorZGVmIGJ1aWxkR3JhcGgoaGVhZHMpOgorICAgIGRlYnVnKCdidWlsZEdyYXBoIGhlYWRzOicsIGhlYWRzKQorICAgIGZvciBoIGluIGhlYWRzOgorICAgICAgICBhc3NlcnQoaXNTaGEoaCkpCisKKyAgICBnID0gR3JhcGgoKQorCisgICAgb3V0ID0gcnVuUHJvZ3JhbShbJ2dpdC1yZXYtbGlzdCcsICctLXBhcmVudHMnXSArIGhlYWRzKQorICAgIGZvciBsIGluIG91dC5zcGxpdCgnXG4nKToKKyAgICAgICAgaWYgbCA9PSAnJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHNoYXMgPSBsLnNwbGl0KCcgJykKKworICAgICAgICAjIFRoaXMgaXMgYSBoYWNrLCB3ZSB0ZW1wb3JhcmlseSB1c2UgdGhlICdwYXJlbnRzJyBhdHRyaWJ1dGUKKyAgICAgICAgIyB0byBjb250YWluIGEgbGlzdCBvZiBTSEExOnMuIFRoZXkgYXJlIGxhdGVyIHJlcGxhY2VkIGJ5IHByb3BlcgorICAgICAgICAjIENvbW1pdCBvYmplY3RzLgorICAgICAgICBjID0gQ29tbWl0KHNoYXNbMF0sIHNoYXNbMTpdKQorCisgICAgICAgIGcuY29tbWl0cy5hcHBlbmQoYykKKyAgICAgICAgZy5zaGFNYXBbYy5zaGFdID0gYworCisgICAgZm9yIGMgaW4gZy5jb21taXRzOgorICAgICAgICBnLmZpeFBhcmVudHMoYykKKworICAgIGZvciBjIGluIGcuY29tbWl0czoKKyAgICAgICAgZm9yIHAgaW4gYy5wYXJlbnRzOgorICAgICAgICAgICAgcC5jaGlsZHJlbi5hcHBlbmQoYykKKyAgICByZXR1cm4gZworCisjIFdyaXRlIHRoZSBlbXB0eSB0cmVlIHRvIHRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIHJldHVybiBpdHMgU0hBMQorZGVmIHdyaXRlRW1wdHlUcmVlKCk6CisgICAgdG1wSW5kZXggPSBvcy5lbnZpcm9uLmdldCgnR0lUX0RJUicsICcuZ2l0JykgKyAnL21lcmdlLXRtcC1pbmRleCcKKyAgICBkZWYgZGVsVG1wSW5kZXgoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKHRtcEluZGV4KQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBkZWxUbXBJbmRleCgpCisgICAgbmV3RW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICBuZXdFbnZbJ0dJVF9JTkRFWF9GSUxFJ10gPSB0bXBJbmRleAorICAgIHJlcyA9IHJ1blByb2dyYW0oWydnaXQtd3JpdGUtdHJlZSddLCBlbnY9bmV3RW52KS5yc3RyaXAoKQorICAgIGRlbFRtcEluZGV4KCkKKyAgICByZXR1cm4gcmVzCisKK2RlZiBhZGRDb21tb25Sb290KGdyYXBoKToKKyAgICByb290cyA9IFtdCisgICAgZm9yIGMgaW4gZ3JhcGguY29tbWl0czoKKyAgICAgICAgaWYgbGVuKGMucGFyZW50cykgPT0gMDoKKyAgICAgICAgICAgIHJvb3RzLmFwcGVuZChjKQorCisgICAgc3VwZXJSb290ID0gQ29tbWl0KHNoYT1Ob25lLCBwYXJlbnRzPVtdLCB0cmVlPXdyaXRlRW1wdHlUcmVlKCkpCisgICAgZ3JhcGguYWRkTm9kZShzdXBlclJvb3QpCisgICAgZm9yIHIgaW4gcm9vdHM6CisgICAgICAgIHIucGFyZW50cyA9IFtzdXBlclJvb3RdCisgICAgc3VwZXJSb290LmNoaWxkcmVuID0gcm9vdHMKKyAgICByZXR1cm4gc3VwZXJSb290CisKK2RlZiBnZXRDb21tb25BbmNlc3RvcnMoZ3JhcGgsIGNvbW1pdDEsIGNvbW1pdDIpOgorICAgICcnJ0ZpbmQgdGhlIGNvbW1vbiBhbmNlc3RvcnMgZm9yIGNvbW1pdDEgYW5kIGNvbW1pdDInJycKKyAgICBhc3NlcnQoaXNpbnN0YW5jZShjb21taXQxLCBDb21taXQpIGFuZCBpc2luc3RhbmNlKGNvbW1pdDIsIENvbW1pdCkpCisKKyAgICBkZWYgdHJhdmVyc2Uoc3RhcnQsIHNldCk6CisgICAgICAgIHN0YWNrID0gW3N0YXJ0XQorICAgICAgICB3aGlsZSBsZW4oc3RhY2spID4gMDoKKyAgICAgICAgICAgIGVsID0gc3RhY2sucG9wKCkKKyAgICAgICAgICAgIHNldC5hZGQoZWwpCisgICAgICAgICAgICBmb3IgcCBpbiBlbC5wYXJlbnRzOgorICAgICAgICAgICAgICAgIGlmIHAgbm90IGluIHNldDoKKyAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKHApCisgICAgaDFTZXQgPSBTZXQoKQorICAgIGgyU2V0ID0gU2V0KCkKKyAgICB0cmF2ZXJzZShjb21taXQxLCBoMVNldCkKKyAgICB0cmF2ZXJzZShjb21taXQyLCBoMlNldCkKKyAgICBzaGFyZWQgPSBoMVNldC5pbnRlcnNlY3Rpb24oaDJTZXQpCisKKyAgICBpZiBsZW4oc2hhcmVkKSA9PSAwOgorICAgICAgICBzaGFyZWQgPSBbYWRkQ29tbW9uUm9vdChncmFwaCldCisgICAgICAgIAorICAgIHJlcyA9IFNldCgpCisKKyAgICBmb3IgcyBpbiBzaGFyZWQ6CisgICAgICAgIGlmIGxlbihbYyBmb3IgYyBpbiBzLmNoaWxkcmVuIGlmIGMgaW4gc2hhcmVkXSkgPT0gMDoKKyAgICAgICAgICAgIHJlcy5hZGQocykKKyAgICByZXR1cm4gbGlzdChyZXMpCmRpZmYgLS1naXQgYS9naXRrIGIvZ2l0awpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YmUxMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0awpAQCAtMCwwICsxLDU3MDMgQEAKKyMhL2Jpbi9zaAorIyBUY2wgaWdub3JlcyB0aGUgbmV4dCBsaW5lIC0qLSB0Y2wgLSotIFwKK2V4ZWMgd2lzaCAiJDAiIC0tICIkQCIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKKyMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UsCisjIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK3Byb2MgZ2l0ZGlyIHt9IHsKKyAgICBnbG9iYWwgZW52CisgICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CisJcmV0dXJuICRlbnYoR0lUX0RJUikKKyAgICB9IGVsc2UgeworCXJldHVybiAiLmdpdCIKKyAgICB9Cit9CisKK3Byb2Mgc3RhcnRfcmV2X2xpc3Qge3ZpZXd9IHsKKyAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlIG5jbXVwZGF0ZQorICAgIGdsb2JhbCBjb21tZmQgbGVmdG92ZXIgdGNsZW5jb2RpbmcgZGF0ZW1vZGUKKyAgICBnbG9iYWwgdmlld2FyZ3Mgdmlld2ZpbGVzIGNvbW1pdGlkeAorCisgICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQorICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCisgICAgc2V0IG5jbXVwZGF0ZSAxCisgICAgc2V0IGNvbW1pdGlkeCgkdmlldykgMAorICAgIHNldCBhcmdzICR2aWV3YXJncygkdmlldykKKyAgICBpZiB7JHZpZXdmaWxlcygkdmlldykgbmUge319IHsKKwlzZXQgYXJncyBbY29uY2F0ICRhcmdzICItLSIgJHZpZXdmaWxlcygkdmlldyldCisgICAgfQorICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgorICAgIGlmIHskZGF0ZW1vZGV9IHsKKwlzZXQgb3JkZXIgIi0tZGF0ZS1vcmRlciIKKyAgICB9CisgICAgaWYge1tjYXRjaCB7CisJc2V0IGZkIFtvcGVuIFtjb25jYXQgfCBnaXQgcmV2LWxpc3QgLS1oZWFkZXIgJG9yZGVyIFwKKwkJCSAgLS1wYXJlbnRzIC0tYm91bmRhcnkgLS1kZWZhdWx0IEhFQUQgJGFyZ3NdIHJdCisgICAgfSBlcnJdfSB7CisJcHV0cyBzdGRlcnIgIkVycm9yIGV4ZWN1dGluZyBnaXQgcmV2LWxpc3Q6ICRlcnIiCisJZXhpdCAxCisgICAgfQorICAgIHNldCBjb21tZmQoJHZpZXcpICRmZAorICAgIHNldCBsZWZ0b3Zlcigkdmlldykge30KKyAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYKKyAgICBpZiB7JHRjbGVuY29kaW5nICE9IHt9fSB7CisJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nICR0Y2xlbmNvZGluZworICAgIH0KKyAgICBmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtsaXN0IGdldGNvbW1pdGxpbmVzICRmZCAkdmlld10KKyAgICBub3didXN5ICR2aWV3Cit9CisKK3Byb2Mgc3RvcF9yZXZfbGlzdCB7fSB7CisgICAgZ2xvYmFsIGNvbW1mZCBjdXJ2aWV3CisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21tZmQoJGN1cnZpZXcpXX0gcmV0dXJuCisgICAgc2V0IGZkICRjb21tZmQoJGN1cnZpZXcpCisgICAgY2F0Y2ggeworCXNldCBwaWQgW3BpZCAkZmRdCisJZXhlYyBraWxsICRwaWQKKyAgICB9CisgICAgY2F0Y2gge2Nsb3NlICRmZH0KKyAgICB1bnNldCBjb21tZmQoJGN1cnZpZXcpCit9CisKK3Byb2MgZ2V0Y29tbWl0cyB7fSB7CisgICAgZ2xvYmFsIHBoYXNlIGNhbnYgbWFpbmZvbnQgY3VydmlldworCisgICAgc2V0IHBoYXNlIGdldGNvbW1pdHMKKyAgICBpbml0bGF5b3V0CisgICAgc3RhcnRfcmV2X2xpc3QgJGN1cnZpZXcKKyAgICBzaG93X3N0YXR1cyAiUmVhZGluZyBjb21taXRzLi4uIgorfQorCitwcm9jIGdldGNvbW1pdGxpbmVzIHtmZCB2aWV3fSAgeworICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgbmV4dHVwZGF0ZQorICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGNvbW1pdGlkeCBjb21taXRyb3cgY29tbWl0ZGF0YQorICAgIGdsb2JhbCBwYXJlbnRsaXN0IGNoaWxkbGlzdCBjaGlsZHJlbiBjdXJ2aWV3IGhsdmlldworICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKKworICAgIHNldCBzdHVmZiBbcmVhZCAkZmRdCisgICAgaWYgeyRzdHVmZiA9PSB7fX0geworCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KKwlnbG9iYWwgdmlld25hbWUKKwl1bnNldCBjb21tZmQoJHZpZXcpCisJbm90YnVzeSAkdmlldworCSMgc2V0IGl0IGJsb2NraW5nIHNvIHdlIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIHRlcm1pbmF0ZQorCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAxCisJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CisJICAgIHNldCBmdiB7fQorCSAgICBpZiB7JHZpZXcgIT0gJGN1cnZpZXd9IHsKKwkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgorCSAgICB9CisJICAgIGlmIHtbc3RyaW5nIHJhbmdlICRlcnIgMCA0XSA9PSAidXNhZ2UifSB7CisJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCisJCQliYWQgYXJndW1lbnRzIHRvIGdpdCByZXYtbGlzdC4iCisJCWlmIHskdmlld25hbWUoJHZpZXcpIGVxICJDb21tYW5kIGxpbmUifSB7CisJCSAgICBhcHBlbmQgZXJyIFwKKwkJCSIgIChOb3RlOiBhcmd1bWVudHMgdG8gZ2l0ayBhcmUgcGFzc2VkIHRvIGdpdCByZXYtbGlzdFwKKwkJCSB0byBhbGxvdyBzZWxlY3Rpb24gb2YgY29tbWl0cyB0byBiZSBkaXNwbGF5ZWQuKSIKKwkJfQorCSAgICB9IGVsc2UgeworCQlzZXQgZXJyICJFcnJvciByZWFkaW5nIGNvbW1pdHMkZnY6ICRlcnIiCisJICAgIH0KKwkgICAgZXJyb3JfcG9wdXAgJGVycgorCX0KKwlpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKKwkgICAgYWZ0ZXIgaWRsZSBmaW5pc2hjb21taXRzCisJfQorCXJldHVybgorICAgIH0KKyAgICBzZXQgc3RhcnQgMAorICAgIHNldCBnb3Rzb21lIDAKKyAgICB3aGlsZSAxIHsKKwlzZXQgaSBbc3RyaW5nIGZpcnN0ICJcMCIgJHN0dWZmICRzdGFydF0KKwlpZiB7JGkgPCAwfSB7CisJICAgIGFwcGVuZCBsZWZ0b3ZlcigkdmlldykgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IGVuZF0KKwkgICAgYnJlYWsKKwl9CisJaWYgeyRzdGFydCA9PSAwfSB7CisJICAgIHNldCBjbWl0ICRsZWZ0b3ZlcigkdmlldykKKwkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCisJICAgIHNldCBsZWZ0b3Zlcigkdmlldykge30KKwl9IGVsc2UgeworCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQorCX0KKwlzZXQgc3RhcnQgW2V4cHIgeyRpICsgMX1dCisJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQorCXNldCBvayAwCisJc2V0IGxpc3RlZCAxCisJaWYgeyRqID49IDB9IHsKKwkgICAgc2V0IGlkcyBbc3RyaW5nIHJhbmdlICRjbWl0IDAgW2V4cHIgeyRqIC0gMX1dXQorCSAgICBpZiB7W3N0cmluZyByYW5nZSAkaWRzIDAgMF0gPT0gIi0ifSB7CisJCXNldCBsaXN0ZWQgMAorCQlzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGlkcyAxIGVuZF0KKwkgICAgfQorCSAgICBzZXQgb2sgMQorCSAgICBmb3JlYWNoIGlkICRpZHMgeworCQlpZiB7W3N0cmluZyBsZW5ndGggJGlkXSAhPSA0MH0geworCQkgICAgc2V0IG9rIDAKKwkJICAgIGJyZWFrCisJCX0KKwkgICAgfQorCX0KKwlpZiB7ISRva30geworCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CisJICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hvcnRjbWl0XSA+IDgwfSB7CisJCXNldCBzaG9ydGNtaXQgIltzdHJpbmcgcmFuZ2UgJHNob3J0Y21pdCAwIDgwXS4uLiIKKwkgICAgfQorCSAgICBlcnJvcl9wb3B1cCAiQ2FuJ3QgcGFyc2UgZ2l0IHJldi1saXN0IG91dHB1dDogeyRzaG9ydGNtaXR9IgorCSAgICBleGl0IDEKKwl9CisJc2V0IGlkIFtsaW5kZXggJGlkcyAwXQorCWlmIHskbGlzdGVkfSB7CisJICAgIHNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KKwkgICAgc2V0IGkgMAorCSAgICBmb3JlYWNoIHAgJG9sZHMgeworCQlpZiB7JGkgPT0gMCB8fCBbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdID49ICRpfSB7CisJCSAgICBsYXBwZW5kIGNoaWxkcmVuKCR2aWV3LCRwKSAkaWQKKwkJfQorCQlpbmNyIGkKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHNldCBvbGRzIHt9CisJfQorCWlmIHshW2luZm8gZXhpc3RzIGNoaWxkcmVuKCR2aWV3LCRpZCldfSB7CisJICAgIHNldCBjaGlsZHJlbigkdmlldywkaWQpIHt9CisJfQorCXNldCBjb21taXRkYXRhKCRpZCkgW3N0cmluZyByYW5nZSAkY21pdCBbZXhwciB7JGogKyAxfV0gZW5kXQorCXNldCBjb21taXRyb3coJHZpZXcsJGlkKSAkY29tbWl0aWR4KCR2aWV3KQorCWluY3IgY29tbWl0aWR4KCR2aWV3KQorCWlmIHskdmlldyA9PSAkY3Vydmlld30geworCSAgICBsYXBwZW5kIHBhcmVudGxpc3QgJG9sZHMKKwkgICAgbGFwcGVuZCBjaGlsZGxpc3QgJGNoaWxkcmVuKCR2aWV3LCRpZCkKKwkgICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgJGlkCisJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKKwl9IGVsc2UgeworCSAgICBsYXBwZW5kIHZwYXJlbnRsaXN0KCR2aWV3KSAkb2xkcworCSAgICBsYXBwZW5kIHZjaGlsZGxpc3QoJHZpZXcpICRjaGlsZHJlbigkdmlldywkaWQpCisJICAgIGxhcHBlbmQgdmRpc3BvcmRlcigkdmlldykgJGlkCisJICAgIGxhcHBlbmQgdmNtaXRsaXN0ZWQoJHZpZXcpICRsaXN0ZWQKKwl9CisJc2V0IGdvdHNvbWUgMQorICAgIH0KKyAgICBpZiB7JGdvdHNvbWV9IHsKKwlpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKKwkgICAgbGF5b3V0bW9yZQorCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkdmlldyA9PSAkaGx2aWV3fSB7CisJICAgIHZoaWdobGlnaHRtb3JlCisJfQorICAgIH0KKyAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0geworCWRvdXBkYXRlCisgICAgfQorfQorCitwcm9jIGRvdXBkYXRlIHt9IHsKKyAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cyBuY211cGRhdGUKKworICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CisJZmlsZWV2ZW50ICRjb21tZmQoJHYpIHJlYWRhYmxlIHt9CisgICAgfQorICAgIHVwZGF0ZQorICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KKyAgICBpZiB7JG51bWNvbW1pdHMgPCAxMDB9IHsKKwlzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDF9XQorICAgIH0gZWxzZWlmIHskbnVtY29tbWl0cyA8IDEwMDAwfSB7CisJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCisgICAgfSBlbHNlIHsKKwlzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDEwMH1dCisgICAgfQorICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CisJc2V0IGZkICRjb21tZmQoJHYpCisJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZdCisgICAgfQorfQorCitwcm9jIHJlYWRjb21taXQge2lkfSB7CisgICAgaWYge1tjYXRjaCB7c2V0IGNvbnRlbnRzIFtleGVjIGdpdCBjYXQtZmlsZSBjb21taXQgJGlkXX1dfSByZXR1cm4KKyAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKK30KKworcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKKyAgICBnbG9iYWwgdmlld2RhdGEgY3VydmlldyBwaGFzZSBkaXNwbGF5b3JkZXIKKyAgICBnbG9iYWwgY2hpbGRyZW4gY29tbWl0cm93IHNlbGVjdGVkbGluZSB0aGlja2VybGluZQorCisgICAgaWYgeyRwaGFzZSBuZSB7fX0geworCXN0b3BfcmV2X2xpc3QKKwlzZXQgcGhhc2Uge30KKyAgICB9CisgICAgc2V0IG4gJGN1cnZpZXcKKyAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgeworCWNhdGNoIHt1bnNldCBjaGlsZHJlbigkbiwkaWQpfQorCWNhdGNoIHt1bnNldCBjb21taXRyb3coJG4sJGlkKX0KKyAgICB9CisgICAgc2V0IGN1cnZpZXcgLTEKKyAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQorICAgIGNhdGNoIHt1bnNldCB0aGlja2VybGluZX0KKyAgICBjYXRjaCB7dW5zZXQgdmlld2RhdGEoJG4pfQorICAgIGRpc2NhcmRhbGxjb21taXRzCisgICAgcmVhZHJlZnMKKyAgICBzaG93dmlldyAkbgorfQorCitwcm9jIHBhcnNlY29tbWl0IHtpZCBjb250ZW50cyBsaXN0ZWR9IHsKKyAgICBnbG9iYWwgY29tbWl0aW5mbyBjZGF0ZQorCisgICAgc2V0IGluaGRyIDEKKyAgICBzZXQgY29tbWVudCB7fQorICAgIHNldCBoZWFkbGluZSB7fQorICAgIHNldCBhdW5hbWUge30KKyAgICBzZXQgYXVkYXRlIHt9CisgICAgc2V0IGNvbW5hbWUge30KKyAgICBzZXQgY29tZGF0ZSB7fQorICAgIHNldCBoZHJlbmQgW3N0cmluZyBmaXJzdCAiXG5cbiIgJGNvbnRlbnRzXQorICAgIGlmIHskaGRyZW5kIDwgMH0geworCSMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgorCXNldCBoZHJlbmQgW3N0cmluZyBsZW5ndGggJGNvbnRlbnRzXQorICAgIH0KKyAgICBzZXQgaGVhZGVyIFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIDAgW2V4cHIgeyRoZHJlbmQgLSAxfV1dCisgICAgc2V0IGNvbW1lbnQgW3N0cmluZyByYW5nZSAkY29udGVudHMgW2V4cHIgeyRoZHJlbmQgKyAyfV0gZW5kXQorICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CisJc2V0IHRhZyBbbGluZGV4ICRsaW5lIDBdCisJaWYgeyR0YWcgPT0gImF1dGhvciJ9IHsKKwkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQorCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KKwl9IGVsc2VpZiB7JHRhZyA9PSAiY29tbWl0dGVyIn0geworCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQorCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCisJfQorICAgIH0KKyAgICBzZXQgaGVhZGxpbmUge30KKyAgICAjIHRha2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1lbnQgYXMgdGhlIGhlYWRsaW5lCisgICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRjb21tZW50XQorICAgIGlmIHskaSA+PSAwfSB7CisJc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbSBbc3RyaW5nIHJhbmdlICRjb21tZW50IDAgJGldXQorICAgIH0gZWxzZSB7CisJc2V0IGhlYWRsaW5lICRjb21tZW50CisgICAgfQorICAgIGlmIHshJGxpc3RlZH0geworCSMgZ2l0IHJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CisJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0IGNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCisJc2V0IG5ld2NvbW1lbnQge30KKwlmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb21tZW50ICJcbiJdIHsKKwkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIiAgICAiCisJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCisJICAgIGFwcGVuZCBuZXdjb21tZW50ICJcbiIKKwl9CisJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKKyAgICB9CisgICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CisJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKKyAgICB9CisgICAgc2V0IGNvbW1pdGluZm8oJGlkKSBbbGlzdCAkaGVhZGxpbmUgJGF1bmFtZSAkYXVkYXRlIFwKKwkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCit9CisKK3Byb2MgZ2V0Y29tbWl0IHtpZH0geworICAgIGdsb2JhbCBjb21taXRkYXRhIGNvbW1pdGluZm8KKworICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0geworCXBhcnNlY29tbWl0ICRpZCAkY29tbWl0ZGF0YSgkaWQpIDEKKyAgICB9IGVsc2UgeworCXJlYWRjb21taXQgJGlkCisJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0geworCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CisJfQorICAgIH0KKyAgICByZXR1cm4gMQorfQorCitwcm9jIHJlYWRyZWZzIHt9IHsKKyAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKKyAgICBnbG9iYWwgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnMKKworICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKKwljYXRjaCB7dW5zZXQgJHZ9CisgICAgfQorICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0IGxzLXJlbW90ZSBbZ2l0ZGlyXV0gcl0KKyAgICB3aGlsZSB7MCA8PSBbc2V0IG4gW2dldHMgJHJlZmQgbGluZV1dfSB7CisJaWYgeyFbcmVnZXhwIHteKFswLTlhLWZdezQwfSkJcmVmcy8oW15eXSopJH0gJGxpbmUgXAorCSAgICBtYXRjaCBpZCBwYXRoXX0geworCSAgICBjb250aW51ZQorCX0KKwlpZiB7W3JlZ2V4cCB7XnJlbW90ZXMvLiovSEVBRCR9ICRwYXRoIG1hdGNoXX0geworCSAgICBjb250aW51ZQorCX0KKwlpZiB7IVtyZWdleHAge14odGFnc3xoZWFkcykvKC4qKSR9ICRwYXRoIG1hdGNoIHR5cGUgbmFtZV19IHsKKwkgICAgc2V0IHR5cGUgb3RoZXJzCisJICAgIHNldCBuYW1lICRwYXRoCisJfQorCWlmIHtbcmVnZXhwIHtecmVtb3Rlcy99ICRwYXRoIG1hdGNoXX0geworCSAgICBzZXQgdHlwZSBoZWFkcworCX0KKwlpZiB7JHR5cGUgPT0gInRhZ3MifSB7CisJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAorCSAgICBsYXBwZW5kIGlkdGFncygkaWQpICRuYW1lCisJICAgIHNldCBvYmoge30KKwkgICAgc2V0IHR5cGUge30KKwkgICAgc2V0IHRhZyB7fQorCSAgICBjYXRjaCB7CisJCXNldCBjb21taXQgW2V4ZWMgZ2l0IHJldi1wYXJzZSAiJGlkXjAiXQorCQlpZiB7IiRjb21taXQiICE9ICIkaWQifSB7CisJCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkY29tbWl0CisJCSAgICBsYXBwZW5kIGlkdGFncygkY29tbWl0KSAkbmFtZQorCQl9CisJICAgIH0JCQorCSAgICBjYXRjaCB7CisJICAgICAgICBzZXQgdGFnY29udGVudHMoJG5hbWUpIFtleGVjIGdpdCBjYXQtZmlsZSB0YWcgIiRpZCJdCisJICAgIH0KKwl9IGVsc2VpZiB7ICR0eXBlID09ICJoZWFkcyIgfSB7CisJICAgIHNldCBoZWFkaWRzKCRuYW1lKSAkaWQKKwkgICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKKwl9IGVsc2UgeworCSAgICBzZXQgb3RoZXJyZWZpZHMoJG5hbWUpICRpZAorCSAgICBsYXBwZW5kIGlkb3RoZXJyZWZzKCRpZCkgJG5hbWUKKwl9CisgICAgfQorICAgIGNsb3NlICRyZWZkCit9CisKK3Byb2Mgc2hvd19lcnJvciB7dyB0b3AgbXNnfSB7CisgICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCisgICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCisgICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJkZXN0cm95ICR0b3AiCisgICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWZpbGwgeAorICAgIGJpbmQgJHRvcCA8VmlzaWJpbGl0eT4gImdyYWIgJHRvcDsgZm9jdXMgJHRvcCIKKyAgICBiaW5kICR0b3AgPEtleS1SZXR1cm4+ICJkZXN0cm95ICR0b3AiCisgICAgdGt3YWl0IHdpbmRvdyAkdG9wCit9CisKK3Byb2MgZXJyb3JfcG9wdXAgbXNnIHsKKyAgICBzZXQgdyAuZXJyb3IKKyAgICB0b3BsZXZlbCAkdworICAgIHdtIHRyYW5zaWVudCAkdyAuCisgICAgc2hvd19lcnJvciAkdyAkdyAkbXNnCit9CisKK3Byb2MgbWFrZXdpbmRvdyB7fSB7CisgICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbGluZXNwYyBjaGFyc3BjIGN0ZXh0IGNmbGlzdAorICAgIGdsb2JhbCB0ZXh0Zm9udCBtYWluZm9udCB1aWZvbnQKKyAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CisgICAgZ2xvYmFsIGVudHJpZXMgc2hhMWVudHJ5IHNoYTFzdHJpbmcgc2hhMWJ1dAorICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IgY3VydGV4dGN1cnNvcgorICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4IHdyYXBjb21tZW50CisgICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBnZHR0eXBlCisgICAgZ2xvYmFsIHNlYXJjaHN0cmluZyBzc3RyaW5nCisKKyAgICBtZW51IC5iYXIKKyAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCisgICAgLmJhciBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorICAgIG1lbnUgLmJhci5maWxlCisgICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiVXBkYXRlIiAtY29tbWFuZCB1cGRhdGVjb21taXRzCisgICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKKyAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKKyAgICAuYmFyLmZpbGUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICBtZW51IC5iYXIuZWRpdAorICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJFZGl0IiAtbWVudSAuYmFyLmVkaXQKKyAgICAuYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJQcmVmZXJlbmNlcyIgLWNvbW1hbmQgZG9wcmVmcworICAgIC5iYXIuZWRpdCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAorCisgICAgbWVudSAuYmFyLnZpZXcgLWZvbnQgJHVpZm9udAorICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJWaWV3IiAtbWVudSAuYmFyLnZpZXcKKyAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJOZXcgdmlldy4uLiIgLWNvbW1hbmQge25ld3ZpZXcgMH0KKyAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJFZGl0IHZpZXcuLi4iIC1jb21tYW5kIGVkaXR2aWV3IFwKKwktc3RhdGUgZGlzYWJsZWQKKyAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJEZWxldGUgdmlldyIgLWNvbW1hbmQgZGVsdmlldyAtc3RhdGUgZGlzYWJsZWQKKyAgICAuYmFyLnZpZXcgYWRkIHNlcGFyYXRvcgorICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICJBbGwgZmlsZXMiIC1jb21tYW5kIHtzaG93dmlldyAwfSBcCisJLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgMAorICAgIAorICAgIG1lbnUgLmJhci5oZWxwCisgICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkhlbHAiIC1tZW51IC5iYXIuaGVscAorICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CisgICAgLmJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiS2V5IGJpbmRpbmdzIiAtY29tbWFuZCBrZXlzCisgICAgLmJhci5oZWxwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgorCisgICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0geworCXNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIgezQ1ICogJGNoYXJzcGN9XQorCXNldCBnZW9tZXRyeShjYW52MikgW2V4cHIgezMwICogJGNoYXJzcGN9XQorCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezE1ICogJGNoYXJzcGN9XQorCXNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgezI1ICogJGxpbmVzcGMgKyA0fV0KKwlzZXQgZ2VvbWV0cnkoY3RleHR3KSA4MAorCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCisJc2V0IGdlb21ldHJ5KGNmbGlzdHcpIDMwCisgICAgfQorICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKKyAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KHdpZHRoKV19IHsKKwkuY3RvcCBjb25mIC13aWR0aCAkZ2VvbWV0cnkod2lkdGgpIC1oZWlnaHQgJGdlb21ldHJ5KGhlaWdodCkKKwlzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KKwlzZXQgZ2VvbWV0cnkoY3RleHRoKSBbZXhwciB7KCR0ZXh0aCAtIDgpIC8KKwkJCQkgICAgW2ZvbnQgbWV0cmljcyAkdGV4dGZvbnQgLWxpbmVzcGFjZV19XQorICAgIH0KKyAgICBmcmFtZSAuY3RvcC50b3AKKyAgICBmcmFtZSAuY3RvcC50b3AuYmFyCisgICAgZnJhbWUgLmN0b3AudG9wLmxiYXIKKyAgICBwYWNrIC5jdG9wLnRvcC5sYmFyIC1zaWRlIGJvdHRvbSAtZmlsbCB4CisgICAgcGFjayAuY3RvcC50b3AuYmFyIC1zaWRlIGJvdHRvbSAtZmlsbCB4CisgICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgorICAgIHNjcm9sbGJhciAkY3Njcm9sbCAtY29tbWFuZCB7YWxsY2FudnMgeXZpZXd9IC1oaWdobGlnaHR0aGlja25lc3MgMAorICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQorICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CisgICAgcGFjayAuY3RvcC50b3AuY2xpc3QgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCisgICAgLmN0b3AgYWRkIC5jdG9wLnRvcAorICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CisgICAgY2FudmFzICRjYW52IC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYxKSBcCisJLWJnIHdoaXRlIC1iZCAwIFwKKwkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICJzY3JvbGxjYW52ICRjc2Nyb2xsIgorICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYKKyAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCisgICAgY2FudmFzICRjYW52MiAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MikgXAorCS1iZyB3aGl0ZSAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKKyAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgorICAgIHNldCBjYW52MyAuY3RvcC50b3AuY2xpc3QuY2FudjMKKyAgICBjYW52YXMgJGNhbnYzIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCisJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYworICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYzCisgICAgYmluZCAuY3RvcC50b3AuY2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CisKKyAgICBzZXQgc2hhMWVudHJ5IC5jdG9wLnRvcC5iYXIuc2hhMQorICAgIHNldCBlbnRyaWVzICRzaGExZW50cnkKKyAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAorICAgIGJ1dHRvbiAkc2hhMWJ1dCAtdGV4dCAiU0hBMSBJRDogIiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IFwKKwktY29tbWFuZCBnb3RvY29tbWl0IC13aWR0aCA4IC1mb250ICR1aWZvbnQKKyAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCisgICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CisgICAgZW50cnkgJHNoYTFlbnRyeSAtd2lkdGggNDAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgc2hhMXN0cmluZworICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKKyAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCisKKyAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLWxlZnQgLWRhdGEgeworCSNkZWZpbmUgbGVmdF93aWR0aCAxNgorCSNkZWZpbmUgbGVmdF9oZWlnaHQgMTYKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsZWZ0X2JpdHNbXSA9IHsKKwkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAorCTB4MGUsIDB4MDAsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MGUsIDB4MDAsIDB4MWMsIDB4MDAsCisJMHgzOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhjMCwgMHgwMX07CisgICAgfQorICAgIGltYWdlIGNyZWF0ZSBiaXRtYXAgYm0tcmlnaHQgLWRhdGEgeworCSNkZWZpbmUgcmlnaHRfd2lkdGggMTYKKwkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgorCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJpZ2h0X2JpdHNbXSA9IHsKKwkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweDgwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDBlLCAweDAwLCAweDFjLAorCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCisJMHgwMCwgMHgwZSwgMHgwMCwgMHgwNywgMHg4MCwgMHgwMywgMHhjMCwgMHgwMX07CisgICAgfQorICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKKwktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CisgICAgcGFjayAuY3RvcC50b3AuYmFyLmxlZnRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CisgICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCisJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgorICAgIHBhY2sgLmN0b3AudG9wLmJhci5yaWdodGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKKworICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmZpbmRidXQgLXRleHQgIkZpbmQiIC1jb21tYW5kIGRvZmluZCAtZm9udCAkdWlmb250CisgICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmRidXQgLXNpZGUgbGVmdAorICAgIHNldCBmaW5kc3RyaW5nIHt9CisgICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCisgICAgbGFwcGVuZCBlbnRyaWVzICRmc3RyaW5nCisgICAgZW50cnkgJGZzdHJpbmcgLXdpZHRoIDMwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIGZpbmRzdHJpbmcKKyAgICB0cmFjZSBhZGQgdmFyaWFibGUgZmluZHN0cmluZyB3cml0ZSBmaW5kX2NoYW5nZQorICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAorICAgIHNldCBmaW5kdHlwZSBFeGFjdAorICAgIHNldCBmaW5kdHlwZW1lbnUgW3RrX29wdGlvbk1lbnUgLmN0b3AudG9wLmJhci5maW5kdHlwZSBcCisJCQkgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQorICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kdHlwZSB3cml0ZSBmaW5kX2NoYW5nZQorICAgIC5jdG9wLnRvcC5iYXIuZmluZHR5cGUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICAuY3RvcC50b3AuYmFyLmZpbmR0eXBlLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICBzZXQgZmluZGxvYyAiQWxsIGZpZWxkcyIKKyAgICB0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZGxvYyBmaW5kbG9jICJBbGwgZmllbGRzIiBIZWFkbGluZSBcCisJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlcgorICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRfY2hhbmdlCisgICAgLmN0b3AudG9wLmJhci5maW5kbG9jIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CisgICAgLmN0b3AudG9wLmJhci5maW5kbG9jLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKKyAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAorICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kdHlwZSAtc2lkZSByaWdodAorCisgICAgbGFiZWwgLmN0b3AudG9wLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAorCS1mb250ICR1aWZvbnQKKyAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLmZsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKKyAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgorICAgIHNldCBnbSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci5nZHR0eXBlIGdkdHR5cGUgInRvdWNoaW5nIHBhdGhzOiIgXAorCQkiYWRkaW5nL3JlbW92aW5nIHN0cmluZzoiXQorICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBnZHR0eXBlIHdyaXRlIGhmaWxlc19jaGFuZ2UKKyAgICAkZ20gY29uZiAtZm9udCAkdWlmb250CisgICAgLmN0b3AudG9wLmxiYXIuZ2R0dHlwZSBjb25mIC1mb250ICR1aWZvbnQKKyAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgLXNpZGUgbGVmdCAtZmlsbCB5CisgICAgZW50cnkgLmN0b3AudG9wLmxiYXIuZmVudCAtd2lkdGggMjUgLWZvbnQgJHRleHRmb250IFwKKwktdGV4dHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcworICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBoaWdobGlnaHRfZmlsZXMgd3JpdGUgaGZpbGVzX2NoYW5nZQorICAgIGxhcHBlbmQgZW50cmllcyAuY3RvcC50b3AubGJhci5mZW50CisgICAgcGFjayAuY3RvcC50b3AubGJhci5mZW50IC1zaWRlIGxlZnQgLWZpbGwgeCAtZXhwYW5kIDEKKyAgICBsYWJlbCAuY3RvcC50b3AubGJhci52bGFiZWwgLXRleHQgIiBPUiBpbiB2aWV3IiAtZm9udCAkdWlmb250CisgICAgcGFjayAuY3RvcC50b3AubGJhci52bGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CisgICAgZ2xvYmFsIHZpZXdobG1lbnUgc2VsZWN0ZWRobHZpZXcKKyAgICBzZXQgdmlld2hsbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci52aGwgc2VsZWN0ZWRobHZpZXcgTm9uZV0KKyAgICAkdmlld2hsbWVudSBlbnRyeWNvbmYgMCAtY29tbWFuZCBkZWx2aGlnaGxpZ2h0CisgICAgJHZpZXdobG1lbnUgY29uZiAtZm9udCAkdWlmb250CisgICAgLmN0b3AudG9wLmxiYXIudmhsIGNvbmYgLWZvbnQgJHVpZm9udAorICAgIHBhY2sgLmN0b3AudG9wLmxiYXIudmhsIC1zaWRlIGxlZnQgLWZpbGwgeQorICAgIGxhYmVsIC5jdG9wLnRvcC5sYmFyLnJsYWJlbCAtdGV4dCAiIE9SICIgLWZvbnQgJHVpZm9udAorICAgIHBhY2sgLmN0b3AudG9wLmxiYXIucmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQorICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZAorICAgIHNldCBtIFt0a19vcHRpb25NZW51IC5jdG9wLnRvcC5sYmFyLnJlbG0gaGlnaGxpZ2h0X3JlbGF0ZWQgTm9uZSBcCisJICAgICAgICJEZXNjZW5kZW50IiAiTm90IGRlc2NlbmRlbnQiICJBbmNlc3RvciIgIk5vdCBhbmNlc3RvciJdCisgICAgJG0gY29uZiAtZm9udCAkdWlmb250CisgICAgLmN0b3AudG9wLmxiYXIucmVsbSBjb25mIC1mb250ICR1aWZvbnQKKyAgICB0cmFjZSBhZGQgdmFyaWFibGUgaGlnaGxpZ2h0X3JlbGF0ZWQgd3JpdGUgdnJlbF9jaGFuZ2UKKyAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLnJlbG0gLXNpZGUgbGVmdCAtZmlsbCB5CisKKyAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAorICAgIC5jdG9wIGFkZCAuY3RvcC5jZGV0CisgICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0CisgICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0LmJvdAorICAgIHBhY2sgLmN0b3AuY2RldC5sZWZ0LmJvdCAtc2lkZSBib3R0b20gLWZpbGwgeAorICAgIGJ1dHRvbiAuY3RvcC5jZGV0LmxlZnQuYm90LnNlYXJjaCAtdGV4dCAiU2VhcmNoIiAtY29tbWFuZCBkb3NlYXJjaCBcCisJLWZvbnQgJHVpZm9udAorICAgIHBhY2sgLmN0b3AuY2RldC5sZWZ0LmJvdC5zZWFyY2ggLXNpZGUgbGVmdCAtcGFkeCA1CisgICAgc2V0IHNzdHJpbmcgLmN0b3AuY2RldC5sZWZ0LmJvdC5zc3RyaW5nCisgICAgZW50cnkgJHNzdHJpbmcgLXdpZHRoIDIwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNlYXJjaHN0cmluZworICAgIGxhcHBlbmQgZW50cmllcyAkc3N0cmluZworICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzZWFyY2hzdHJpbmcgd3JpdGUgaW5jcnNlYXJjaAorICAgIHBhY2sgJHNzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAorICAgIHNldCBjdGV4dCAuY3RvcC5jZGV0LmxlZnQuY3RleHQKKyAgICB0ZXh0ICRjdGV4dCAtYmcgd2hpdGUgLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCisJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAorCS15c2Nyb2xsY29tbWFuZCBzY3JvbGx0ZXh0IC13cmFwIG5vbmUKKyAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCisgICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQorICAgIHBhY2sgJGN0ZXh0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKKyAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKKworICAgICRjdGV4dCB0YWcgY29uZiBjb21tZW50IC13cmFwICR3cmFwY29tbWVudAorICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdIC1iYWNrICIjYWFhYWFhIgorICAgICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlIGJsdWUKKyAgICAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgcmVkCisgICAgJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlICIjMDBhMDAwIgorICAgICRjdGV4dCB0YWcgY29uZiBtMCAtZm9yZSByZWQKKyAgICAkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQorICAgICRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgorICAgICRjdGV4dCB0YWcgY29uZiBtMyAtZm9yZSBwdXJwbGUKKyAgICAkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KKyAgICAkY3RleHQgdGFnIGNvbmYgbTUgLWZvcmUgIiMwMDkwOTAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG02IC1mb3JlIG1hZ2VudGEKKyAgICAkY3RleHQgdGFnIGNvbmYgbTcgLWZvcmUgIiM4MDgwMDAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG04IC1mb3JlICIjMDA5MDAwIgorICAgICRjdGV4dCB0YWcgY29uZiBtOSAtZm9yZSAiI2ZmMDA4MCIKKyAgICAkY3RleHQgdGFnIGNvbmYgbTEwIC1mb3JlIGN5YW4KKyAgICAkY3RleHQgdGFnIGNvbmYgbTExIC1mb3JlICIjYjA3MDcwIgorICAgICRjdGV4dCB0YWcgY29uZiBtMTIgLWZvcmUgIiM3MGIwZjAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG0xMyAtZm9yZSAiIzcwZjBiMCIKKyAgICAkY3RleHQgdGFnIGNvbmYgbTE0IC1mb3JlICIjZjBiMDcwIgorICAgICRjdGV4dCB0YWcgY29uZiBtMTUgLWZvcmUgIiNmZjcwYjAiCisgICAgJGN0ZXh0IHRhZyBjb25mIG1tYXggLWZvcmUgZGFya2dyZXkKKyAgICBzZXQgbWVyZ2VtYXggMTYKKyAgICAkY3RleHQgdGFnIGNvbmYgbXJlc3VsdCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQorICAgICRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCisgICAgJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdworCisgICAgZnJhbWUgLmN0b3AuY2RldC5yaWdodAorICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQubW9kZQorICAgIHJhZGlvYnV0dG9uIC5jdG9wLmNkZXQucmlnaHQubW9kZS5wYXRjaCAtdGV4dCAiUGF0Y2giIFwKKwktY29tbWFuZCByZXNlbGVjdGxpbmUgLXZhcmlhYmxlIGNtaXRtb2RlIC12YWx1ZSAicGF0Y2giCisgICAgcmFkaW9idXR0b24gLmN0b3AuY2RldC5yaWdodC5tb2RlLnRyZWUgLXRleHQgIlRyZWUiIFwKKwktY29tbWFuZCByZXNlbGVjdGxpbmUgLXZhcmlhYmxlIGNtaXRtb2RlIC12YWx1ZSAidHJlZSIKKyAgICBncmlkIC5jdG9wLmNkZXQucmlnaHQubW9kZS5wYXRjaCAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUudHJlZSAtc3RpY2t5IGV3CisgICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKKyAgICBzZXQgY2ZsaXN0IC5jdG9wLmNkZXQucmlnaHQuY2ZpbGVzCisgICAgc2V0IGluZGVudCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAibm4iXQorICAgIHRleHQgJGNmbGlzdCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb250ICRtYWluZm9udCBcCisJLXRhYnMgW2xpc3QgJGluZGVudCBbZXhwciB7MiAqICRpbmRlbnR9XV0gXAorCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5yaWdodC5zYiBzZXQiIFwKKwktY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0gXAorCS1zcGFjaW5nMSAxIC1zcGFjaW5nMyAxCisgICAgc2Nyb2xsYmFyIC5jdG9wLmNkZXQucmlnaHQuc2IgLWNvbW1hbmQgIiRjZmxpc3QgeXZpZXciCisgICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKKyAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQorICAgICRjZmxpc3QgdGFnIGNvbmZpZ3VyZSBoaWdobGlnaHQgXAorCS1iYWNrZ3JvdW5kIFskY2ZsaXN0IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdCisgICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGJvbGQgLWZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KKyAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LnJpZ2h0CisgICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CisKKyAgICBwYWNrIC5jdG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQorCisgICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQorICAgICNiaW5kYWxsIDxCMS1Nb3Rpb24+IHtzZWxjYW52bGluZSAlVyAleCAleX0KKyAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCisgICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCisgICAgYmluZGFsbCA8Mj4gImNhbnZzY2FuIG1hcmsgJVcgJXggJXkiCisgICAgYmluZGFsbCA8QjItTW90aW9uPiAiY2FudnNjYW4gZHJhZ3RvICVXICV4ICV5IgorICAgIGJpbmRrZXkgPEhvbWU+IHNlbGZpcnN0bGluZQorICAgIGJpbmRrZXkgPEVuZD4gc2VsbGFzdGxpbmUKKyAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgorICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgorICAgIGJpbmQgLiA8U2hpZnQtS2V5LVVwPiAibmV4dF9oaWdobGlnaHQgLTEiCisgICAgYmluZCAuIDxTaGlmdC1LZXktRG93bj4gIm5leHRfaGlnaGxpZ2h0IDEiCisgICAgYmluZGtleSA8S2V5LVJpZ2h0PiAiZ29mb3J3IgorICAgIGJpbmRrZXkgPEtleS1MZWZ0PiAiZ29iYWNrIgorICAgIGJpbmQgLiA8S2V5LVByaW9yPiAic2VsbmV4dHBhZ2UgLTEiCisgICAgYmluZCAuIDxLZXktTmV4dD4gInNlbG5leHRwYWdlIDEiCisgICAgYmluZCAuIDxDb250cm9sLUhvbWU+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMC4wIgorICAgIGJpbmQgLiA8Q29udHJvbC1FbmQ+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMS4wIgorICAgIGJpbmQgLiA8Q29udHJvbC1LZXktVXA+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgdW5pdHMiCisgICAgYmluZCAuIDxDb250cm9sLUtleS1Eb3duPiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDEgdW5pdHMiCisgICAgYmluZCAuIDxDb250cm9sLUtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKKyAgICBiaW5kIC4gPENvbnRyb2wtS2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKKyAgICBiaW5ka2V5IDxLZXktRGVsZXRlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKKyAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKKyAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCisgICAgYmluZGtleSBwICJzZWxuZXh0bGluZSAtMSIKKyAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCisgICAgYmluZGtleSB6ICJnb2JhY2siCisgICAgYmluZGtleSB4ICJnb2ZvcnciCisgICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKKyAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCisgICAgYmluZGtleSBqICJnb2JhY2siCisgICAgYmluZGtleSBsICJnb2ZvcnciCisgICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgorICAgIGJpbmRrZXkgZCAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxOCB1bml0cyIKKyAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgorICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KKyAgICBiaW5ka2V5IDxLZXktUmV0dXJuPiB7ZmluZG5leHQgMH0KKyAgICBiaW5ka2V5ID8gZmluZHByZXYKKyAgICBiaW5ka2V5IGYgbmV4dGZpbGUKKyAgICBiaW5kIC4gPENvbnRyb2wtcT4gZG9xdWl0CisgICAgYmluZCAuIDxDb250cm9sLWY+IGRvZmluZAorICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KKyAgICBiaW5kIC4gPENvbnRyb2wtcj4gZG9zZWFyY2hiYWNrCisgICAgYmluZCAuIDxDb250cm9sLXM+IGRvc2VhcmNoCisgICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KKyAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KKyAgICBiaW5kIC4gPENvbnRyb2wtbWludXM+IHtpbmNyZm9udCAtMX0KKyAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KKyAgICBiaW5kIC4gPERlc3Ryb3k+IHtzYXZlc3R1ZmYgJVd9CisgICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgorICAgIGJpbmQgJGZzdHJpbmcgPEtleS1SZXR1cm4+IGRvZmluZAorICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAorICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCisgICAgYmluZCAkY2ZsaXN0IDwxPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KKyAgICBiaW5kICRjZmxpc3QgPEIxLU1vdGlvbj4ge3NlbF9mbGlzdCAlVyAleCAleTsgYnJlYWt9CisgICAgYmluZCAkY2ZsaXN0IDxCdXR0b25SZWxlYXNlLTE+IHt0cmVlY2xpY2sgJVcgJXggJXl9CisKKyAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCisgICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCisgICAgc2V0IGN1cnRleHRjdXJzb3IgJHRleHRjdXJzb3IKKworICAgIHNldCByb3djdHhtZW51IC5yb3djdHhtZW51CisgICAgbWVudSAkcm93Y3R4bWVudSAtdGVhcm9mZiAwCisgICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKKwktY29tbWFuZCB7ZGlmZnZzc2VsIDB9CisgICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHNlbGVjdGVkIC0+IHRoaXMiIFwKKwktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CisgICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCisgICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgdGFnIiAtY29tbWFuZCBta3RhZworICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0Cit9CisKKyMgbW91c2UtMiBtYWtlcyBhbGwgd2luZG93cyBzY2FuIHZlcnRpY2FsbHksIGJ1dCBvbmx5IHRoZSBvbmUKKyMgdGhlIGN1cnNvciBpcyBpbiBzY2FucyBob3Jpem9udGFsbHkKK3Byb2MgY2FudnNjYW4ge29wIHcgeCB5fSB7CisgICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKKyAgICBmb3JlYWNoIGMgW2xpc3QgJGNhbnYgJGNhbnYyICRjYW52M10geworCWlmIHskYyA9PSAkd30geworCSAgICAkYyBzY2FuICRvcCAkeCAkeQorCX0gZWxzZSB7CisJICAgICRjIHNjYW4gJG9wIDAgJHkKKwl9CisgICAgfQorfQorCitwcm9jIHNjcm9sbGNhbnYge2NzY3JvbGwgZjAgZjF9IHsKKyAgICAkY3Njcm9sbCBzZXQgJGYwICRmMQorICAgIGRyYXdmcmFjICRmMCAkZjEKKyAgICBmbHVzaGhpZ2hsaWdodHMKK30KKworIyB3aGVuIHdlIG1ha2UgYSBrZXkgYmluZGluZyBmb3IgdGhlIHRvcGxldmVsLCBtYWtlIHN1cmUKKyMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKKyMgZmluZCBzdHJpbmcgZW50cnkgd2lkZ2V0LgorcHJvYyBiaW5ka2V5IHtldiBzY3JpcHR9IHsKKyAgICBnbG9iYWwgZW50cmllcworICAgIGJpbmQgLiAkZXYgJHNjcmlwdAorICAgIHNldCBlc2NyaXB0IFtiaW5kIEVudHJ5ICRldl0KKyAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKKwlzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSA8S2V5Pl0KKyAgICB9CisgICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKKwliaW5kICRlICRldiAiJGVzY3JpcHQ7IGJyZWFrIgorICAgIH0KK30KKworIyBzZXQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRvcGxldmVsIGZvciBhbnkgY2xpY2sgb3V0c2lkZQorIyB0aGUgZW50cnkgd2lkZ2V0cworcHJvYyBjbGljayB7d30geworICAgIGdsb2JhbCBlbnRyaWVzCisgICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKKwlpZiB7JHcgPT0gJGV9IHJldHVybgorICAgIH0KKyAgICBmb2N1cyAuCit9CisKK3Byb2Mgc2F2ZXN0dWZmIHt3fSB7CisgICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250IHVpZm9udAorICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIG1heGdyYXBocGN0CisgICAgZ2xvYmFsIG1heHdpZHRoIHNob3duZWFydGFncworICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3ZmlsZXMgdmlld2FyZ3Mgdmlld3Blcm0gbmV4dHZpZXdudW0KKyAgICBnbG9iYWwgY21pdG1vZGUgd3JhcGNvbW1lbnQKKworICAgIGlmIHskc3R1ZmZzYXZlZH0gcmV0dXJuCisgICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgorICAgIGNhdGNoIHsKKwlzZXQgZiBbb3BlbiAifi8uZ2l0ay1uZXciIHddCisJcHV0cyAkZiBbbGlzdCBzZXQgbWFpbmZvbnQgJG1haW5mb250XQorCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KKwlwdXRzICRmIFtsaXN0IHNldCB1aWZvbnQgJHVpZm9udF0KKwlwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCisJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQorCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KKwlwdXRzICRmIFtsaXN0IHNldCBjbWl0bW9kZSAkY21pdG1vZGVdCisJcHV0cyAkZiBbbGlzdCBzZXQgd3JhcGNvbW1lbnQgJHdyYXBjb21tZW50XQorCXB1dHMgJGYgW2xpc3Qgc2V0IHNob3duZWFydGFncyAkc2hvd25lYXJ0YWdzXQorCXB1dHMgJGYgInNldCBnZW9tZXRyeSh3aWR0aCkgW3dpbmZvIHdpZHRoIC5jdG9wXSIKKwlwdXRzICRmICJzZXQgZ2VvbWV0cnkoaGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC5jdG9wXSIKKwlwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnZdLTJ9XSIKKwlwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYyXS0yfV0iCisJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52M10tMn1dIgorCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIge1t3aW5mbyBoZWlnaHQgJGNhbnZdLTJ9XSIKKwlzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCisJCQkgICAvIFtmb250IG1lYXN1cmUgJHRleHRmb250ICIwIl19XQorCXB1dHMgJGYgInNldCBnZW9tZXRyeShjdGV4dHcpICR3aWQiCisJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCisJCQkgICAvIFtmb250IG1lYXN1cmUgWyRjZmxpc3QgY2dldCAtZm9udF0gIjAiXX1dCisJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNmbGlzdHcpICR3aWQiCisJcHV0cyAtbm9uZXdsaW5lICRmICJzZXQgcGVybXZpZXdzIHsiCisJZm9yIHtzZXQgdiAwfSB7JHYgPCAkbmV4dHZpZXdudW19IHtpbmNyIHZ9IHsKKwkgICAgaWYgeyR2aWV3cGVybSgkdil9IHsKKwkJcHV0cyAkZiAie1tsaXN0ICR2aWV3bmFtZSgkdikgJHZpZXdmaWxlcygkdikgJHZpZXdhcmdzKCR2KV19IgorCSAgICB9CisJfQorCXB1dHMgJGYgIn0iCisJY2xvc2UgJGYKKwlmaWxlIHJlbmFtZSAtZm9yY2UgIn4vLmdpdGstbmV3IiAifi8uZ2l0ayIKKyAgICB9CisgICAgc2V0IHN0dWZmc2F2ZWQgMQorfQorCitwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CisgICAgZ2xvYmFsIG9sZHdpZHRoCisgICAgaWYge1tpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV19IHsKKwlzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQorCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCisJaWYgeyR3IDwgNjB9IHsKKwkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KKwkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQorCX0gZWxzZSB7CisJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KKwkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCisJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMSAwXSl9XQorCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKKwkJc2V0IHNhc2gwIDMwCisJICAgIH0KKwkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CisJCXNldCBzYXNoMSBbZXhwciB7JHNhc2gwICsgMjB9XQorCSAgICB9CisJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CisJCXNldCBzYXNoMSBbZXhwciB7JHcgLSAxMH1dCisJCWlmIHskc2FzaDAgPiAkc2FzaDEgLSAyMH0geworCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCisJCX0KKwkgICAgfQorCX0KKwkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KKwkkd2luIHNhc2ggcGxhY2UgMSAkc2FzaDEgW2xpbmRleCAkczEgMV0KKyAgICB9CisgICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cit9CisKK3Byb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30geworICAgIGdsb2JhbCBvbGR3aWR0aAorICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CisJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KKwlpZiB7JHcgPCA2MH0geworCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCisJfSBlbHNlIHsKKwkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQorCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KKwkgICAgaWYgeyRzYXNoMCA8IDQ1fSB7CisJCXNldCBzYXNoMCA0NQorCSAgICB9CisJICAgIGlmIHskc2FzaDAgPiAkdyAtIDE1fSB7CisJCXNldCBzYXNoMCBbZXhwciB7JHcgLSAxNX1dCisJICAgIH0KKwl9CisJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCisgICAgfQorICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdworfQorCitwcm9jIGFsbGNhbnZzIGFyZ3MgeworICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCisgICAgZXZhbCAkY2FudiAkYXJncworICAgIGV2YWwgJGNhbnYyICRhcmdzCisgICAgZXZhbCAkY2FudjMgJGFyZ3MKK30KKworcHJvYyBiaW5kYWxsIHtldmVudCBhY3Rpb259IHsKKyAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MworICAgIGJpbmQgJGNhbnYgJGV2ZW50ICRhY3Rpb24KKyAgICBiaW5kICRjYW52MiAkZXZlbnQgJGFjdGlvbgorICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCit9CisKK3Byb2MgYWJvdXQge30geworICAgIHNldCB3IC5hYm91dAorICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0geworCXJhaXNlICR3CisJcmV0dXJuCisgICAgfQorICAgIHRvcGxldmVsICR3CisgICAgd20gdGl0bGUgJHcgIkFib3V0IGdpdGsiCisgICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKK0dpdGsgLSBhIGNvbW1pdCB2aWV3ZXIgZm9yIGdpdAorCitDb3B5cmlnaHQgqSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMKKworVXNlIGFuZCByZWRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZX0gXAorCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKKyAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKKyAgICBidXR0b24gJHcub2sgLXRleHQgQ2xvc2UgLWNvbW1hbmQgImRlc3Ryb3kgJHciCisgICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KK30KKworcHJvYyBrZXlzIHt9IHsKKyAgICBzZXQgdyAua2V5cworICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0geworCXJhaXNlICR3CisJcmV0dXJuCisgICAgfQorICAgIHRvcGxldmVsICR3CisgICAgd20gdGl0bGUgJHcgIkdpdGsga2V5IGJpbmRpbmdzIgorICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CitHaXRrIGtleSBiaW5kaW5nczoKKworPEN0cmwtUT4JCVF1aXQKKzxIb21lPgkJTW92ZSB0byBmaXJzdCBjb21taXQKKzxFbmQ+CQlNb3ZlIHRvIGxhc3QgY29tbWl0Cis8VXA+LCBwLCBpCU1vdmUgdXAgb25lIGNvbW1pdAorPERvd24+LCBuLCBrCU1vdmUgZG93biBvbmUgY29tbWl0Cis8TGVmdD4sIHosIGoJR28gYmFjayBpbiBoaXN0b3J5IGxpc3QKKzxSaWdodD4sIHgsIGwJR28gZm9yd2FyZCBpbiBoaXN0b3J5IGxpc3QKKzxQYWdlVXA+CU1vdmUgdXAgb25lIHBhZ2UgaW4gY29tbWl0IGxpc3QKKzxQYWdlRG93bj4JTW92ZSBkb3duIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0Cis8Q3RybC1Ib21lPglTY3JvbGwgdG8gdG9wIG9mIGNvbW1pdCBsaXN0Cis8Q3RybC1FbmQ+CVNjcm9sbCB0byBib3R0b20gb2YgY29tbWl0IGxpc3QKKzxDdHJsLVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIGxpbmUKKzxDdHJsLURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBsaW5lCis8Q3RybC1QYWdlVXA+CVNjcm9sbCBjb21taXQgbGlzdCB1cCBvbmUgcGFnZQorPEN0cmwtUGFnZURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBwYWdlCis8U2hpZnQtVXA+CU1vdmUgdG8gcHJldmlvdXMgaGlnaGxpZ2h0ZWQgbGluZQorPFNoaWZ0LURvd24+CU1vdmUgdG8gbmV4dCBoaWdobGlnaHRlZCBsaW5lCis8RGVsZXRlPiwgYglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCis8QmFja3NwYWNlPglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCis8U3BhY2U+CQlTY3JvbGwgZGlmZiB2aWV3IGRvd24gb25lIHBhZ2UKK3UJCVNjcm9sbCBkaWZmIHZpZXcgdXAgMTggbGluZXMKK2QJCVNjcm9sbCBkaWZmIHZpZXcgZG93biAxOCBsaW5lcworPEN0cmwtRj4JCUZpbmQKKzxDdHJsLUc+CQlNb3ZlIHRvIG5leHQgZmluZCBoaXQKKzxSZXR1cm4+CU1vdmUgdG8gbmV4dCBmaW5kIGhpdAorLwkJTW92ZSB0byBuZXh0IGZpbmQgaGl0LCBvciByZWRvIGZpbmQKKz8JCU1vdmUgdG8gcHJldmlvdXMgZmluZCBoaXQKK2YJCVNjcm9sbCBkaWZmIHZpZXcgdG8gbmV4dCBmaWxlCis8Q3RybC1TPgkJU2VhcmNoIGZvciBuZXh0IGhpdCBpbiBkaWZmIHZpZXcKKzxDdHJsLVI+CQlTZWFyY2ggZm9yIHByZXZpb3VzIGhpdCBpbiBkaWZmIHZpZXcKKzxDdHJsLUtQKz4JSW5jcmVhc2UgZm9udCBzaXplCis8Q3RybC1wbHVzPglJbmNyZWFzZSBmb250IHNpemUKKzxDdHJsLUtQLT4JRGVjcmVhc2UgZm9udCBzaXplCis8Q3RybC1taW51cz4JRGVjcmVhc2UgZm9udCBzaXplCit9IFwKKwkgICAgLWp1c3RpZnkgbGVmdCAtYmcgd2hpdGUgLWJvcmRlciAyIC1yZWxpZWYgc3Vua2VuCisgICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoCisgICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgorICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCit9CisKKyMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQorIyBib3R0b20gcmlnaHQgb2YgdGhlIG92ZXJhbGwgd2luZG93LgorCitwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKKyAgICBnbG9iYWwgdHJlZWNvbnRlbnRzIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKKworICAgIHNldCBpeCAwCisgICAgc2V0IHRyZWVpbmRleCgpIDAKKyAgICBzZXQgbGV2IDAKKyAgICBzZXQgcHJlZml4IHt9CisgICAgc2V0IHByZWZpeGVuZCAtMQorICAgIHNldCBwcmVmZW5kc3RhY2sge30KKyAgICBzZXQgaHRzdGFjayB7fQorICAgIHNldCBodCAwCisgICAgc2V0IHRyZWVjb250ZW50cygpIHt9CisgICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCisgICAgZm9yZWFjaCBmICRsIHsKKwl3aGlsZSB7W3N0cmluZyByYW5nZSAkZiAwICRwcmVmaXhlbmRdIG5lICRwcmVmaXh9IHsKKwkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CisJCSR3IG1hcmsgc2V0IGU6JHRyZWVpbmRleCgkcHJlZml4KSAiZW5kIC0xYyIKKwkJJHcgbWFyayBncmF2aXR5IGU6JHRyZWVpbmRleCgkcHJlZml4KSBsZWZ0CisJICAgIH0KKwkgICAgc2V0IHRyZWVoZWlnaHQoJHByZWZpeCkgJGh0CisJICAgIGluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCisJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQorCSAgICBzZXQgcHJlZml4ZW5kIFtsaW5kZXggJHByZWZlbmRzdGFjayBlbmRdCisJICAgIHNldCBwcmVmZW5kc3RhY2sgW2xyZXBsYWNlICRwcmVmZW5kc3RhY2sgZW5kIGVuZF0KKwkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQorCSAgICBpbmNyIGxldiAtMQorCX0KKwlzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCisJd2hpbGUge1tzZXQgc2xhc2ggW3N0cmluZyBmaXJzdCAiLyIgJHRhaWxdXSA+PSAwfSB7CisJICAgIGxhcHBlbmQgaHRzdGFjayAkaHQKKwkgICAgc2V0IGh0IDAKKwkgICAgbGFwcGVuZCBwcmVmZW5kc3RhY2sgJHByZWZpeGVuZAorCSAgICBpbmNyIHByZWZpeGVuZCBbZXhwciB7JHNsYXNoICsgMX1dCisJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCisJICAgIGxhcHBlbmQgdHJlZWNvbnRlbnRzKCRwcmVmaXgpICRkCisJICAgIHNldCBvbGRwcmVmaXggJHByZWZpeAorCSAgICBhcHBlbmQgcHJlZml4ICRkCisJICAgIHNldCB0cmVlY29udGVudHMoJHByZWZpeCkge30KKwkgICAgc2V0IHRyZWVpbmRleCgkcHJlZml4KSBbaW5jciBpeF0KKwkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAorCSAgICBzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICR0YWlsIFtleHByIHskc2xhc2grMX1dIGVuZF0KKwkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CisJCXNldCBodCAxCisJCXNldCB0cmVlZGlyb3BlbigkcHJlZml4KSBbZXhwciB7JGxldiA8ICRvcGVubGV2c31dCisJCXNldCBibSBbZXhwciB7JGxldiA9PSAkb3BlbmxldnM/ICJ0cmktcnQiOiAidHJpLWRuIn1dCisJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgorCQkkdyBtYXJrIGdyYXZpdHkgZDokaXggbGVmdAorCQlzZXQgc3RyICJcbiIKKwkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQorCQkkdyBpbnNlcnQgZW5kICRzdHIKKwkJJHcgaW1hZ2UgY3JlYXRlIGVuZCAtYWxpZ24gY2VudGVyIC1pbWFnZSAkYm0gLXBhZHggMSBcCisJCSAgICAtbmFtZSBhOiRpeAorCQkkdyBpbnNlcnQgZW5kICRkIFtoaWdobGlnaHRfdGFnICRwcmVmaXhdCisJCSR3IG1hcmsgc2V0IHM6JGl4ICJlbmQgLTFjIgorCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAorCSAgICB9CisJICAgIGluY3IgbGV2CisJfQorCWlmIHskdGFpbCBuZSB7fX0geworCSAgICBpZiB7JGxldiA8PSAkb3BlbmxldnN9IHsKKwkJaW5jciBodAorCQlzZXQgc3RyICJcbiIKKwkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQorCQkkdyBpbnNlcnQgZW5kICRzdHIKKwkJJHcgaW5zZXJ0IGVuZCAkdGFpbCBbaGlnaGxpZ2h0X3RhZyAkZl0KKwkgICAgfQorCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAorCX0KKyAgICB9CisgICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CisJc2V0IHRyZWVoZWlnaHQoJHByZWZpeCkgJGh0CisJaW5jciBodCBbbGluZGV4ICRodHN0YWNrIGVuZF0KKwlzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KKyAgICB9CisgICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKK30KKworcHJvYyBsaW5ldG9lbHQge2x9IHsKKyAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKKworICAgIHNldCB5IDIKKyAgICBzZXQgcHJlZml4IHt9CisgICAgd2hpbGUgezF9IHsKKwlmb3JlYWNoIGUgJHRyZWVjb250ZW50cygkcHJlZml4KSB7CisJICAgIGlmIHskeSA9PSAkbH0geworCQlyZXR1cm4gIiRwcmVmaXgkZSIKKwkgICAgfQorCSAgICBzZXQgbiAxCisJICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CisJCXNldCBuICR0cmVlaGVpZ2h0KCRwcmVmaXgkZSkKKwkJaWYgeyR5ICsgJG4gPiAkbH0geworCQkgICAgYXBwZW5kIHByZWZpeCAkZQorCQkgICAgaW5jciB5CisJCSAgICBicmVhaworCQl9CisJICAgIH0KKwkgICAgaW5jciB5ICRuCisJfQorICAgIH0KK30KKworcHJvYyBoaWdobGlnaHRfdHJlZSB7eSBwcmVmaXh9IHsKKyAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CisKKyAgICBmb3JlYWNoIGUgJHRyZWVjb250ZW50cygkcHJlZml4KSB7CisJc2V0IHBhdGggJHByZWZpeCRlCisJaWYge1toaWdobGlnaHRfdGFnICRwYXRoXSBuZSB7fX0geworCSAgICAkY2ZsaXN0IHRhZyBhZGQgYm9sZCAkeS4wICIkeS4wIGxpbmVlbmQiCisJfQorCWluY3IgeQorCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8iICYmICR0cmVlaGVpZ2h0KCRwYXRoKSA+IDF9IHsKKwkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQorCX0KKyAgICB9CisgICAgcmV0dXJuICR5Cit9CisKK3Byb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0geworICAgIGdsb2JhbCB0cmVlZGlyb3BlbiB0cmVlaGVpZ2h0IHRyZWVwYXJlbnQgdHJlZWluZGV4CisKKyAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQorICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgICR3IGRlbGV0ZSBzOiRpeCBlOiRpeAorICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCisgICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktcnQKKyAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAorICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQorICAgIHdoaWxlIHskZGlyIG5lIHt9fSB7CisJaW5jciB0cmVlaGVpZ2h0KCRkaXIpICRuCisJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQorICAgIH0KK30KKworcHJvYyB0cmVlb3BlbmRpciB7dyBkaXJ9IHsKKyAgICBnbG9iYWwgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVjb250ZW50cyB0cmVlaW5kZXgKKworICAgIHNldCBpeCAkdHJlZWluZGV4KCRkaXIpCisgICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCisgICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KKyAgICAkdyBtYXJrIHNldCBlOiRpeCBzOiRpeAorICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCByaWdodAorICAgIHNldCBsZXYgMAorICAgIHNldCBzdHIgIlxuIgorICAgIHNldCBuIFtsbGVuZ3RoICR0cmVlY29udGVudHMoJGRpcildCisgICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKKwlpbmNyIGxldgorCWFwcGVuZCBzdHIgIlx0IgorCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KKyAgICB9CisgICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJGRpcikgeworCXNldCBkZSAkZGlyJGUKKwlpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIn0geworCSAgICBzZXQgaXkgJHRyZWVpbmRleCgkZGUpCisJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CisJICAgICR3IG1hcmsgZ3Jhdml0eSBkOiRpeSBsZWZ0CisJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCisJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKKwkgICAgJHcgaW1hZ2UgY3JlYXRlIGU6JGl4IC1hbGlnbiBjZW50ZXIgLWltYWdlIHRyaS1ydCAtcGFkeCAxIFwKKwkJLW5hbWUgYTokaXkKKwkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KKwkgICAgJHcgbWFyayBzZXQgczokaXkgZTokaXgKKwkgICAgJHcgbWFyayBncmF2aXR5IHM6JGl5IGxlZnQKKwkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCisJfSBlbHNlIHsKKwkgICAgJHcgaW5zZXJ0IGU6JGl4ICRzdHIKKwkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KKwl9CisgICAgfQorICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CisgICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKKyAgICBzZXQgdHJlZWRpcm9wZW4oJGRpcikgMQorICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCisgICAgc2V0IGh0IFskdyBjZ2V0IC1oZWlnaHRdCisgICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IHM6JGl4XSAuXSAwXQorICAgIGlmIHskbCA8ICR0b3B9IHsKKwkkdyB5dmlldyAkbC4wCisgICAgfSBlbHNlaWYgeyRsICsgJG4gKyAxID4gJHRvcCArICRodH0geworCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KKwlpZiB7JGwgPCAkdG9wfSB7CisJICAgIHNldCB0b3AgJGwKKwl9CisJJHcgeXZpZXcgJHRvcC4wCisgICAgfQorfQorCitwcm9jIHRyZWVjbGljayB7dyB4IHl9IHsKKyAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKKworICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSByZXR1cm4KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCisgICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4ICJAJHgsJHkiXSAiLiJdIDBdCisgICAgJGNmbGlzdCB0YWcgcmVtb3ZlIGhpZ2hsaWdodCAkY2ZsaXN0X3RvcC4wICIkY2ZsaXN0X3RvcC4wIGxpbmVlbmQiCisgICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCisgICAgc2V0IGNmbGlzdF90b3AgJGwKKyAgICBpZiB7JGwgPT0gMX0geworCSRjdGV4dCB5dmlldyAxLjAKKwlyZXR1cm4KKyAgICB9CisgICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KKyAgICBpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIG5lICIvIn0geworCXNob3dmaWxlICRlCisgICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKKwl0cmVlY2xvc2VkaXIgJHcgJGUKKyAgICB9IGVsc2UgeworCXRyZWVvcGVuZGlyICR3ICRlCisgICAgfQorfQorCitwcm9jIHNldGZpbGVsaXN0IHtpZH0geworICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgY2ZsaXN0CisKKyAgICB0cmVldmlldyAkY2ZsaXN0ICR0cmVlZmlsZWxpc3QoJGlkKSAwCit9CisKK2ltYWdlIGNyZWF0ZSBiaXRtYXAgdHJpLXJ0IC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgeworICAgICNkZWZpbmUgdHJpLXJ0X3dpZHRoIDEzCisgICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLXJ0X2JpdHNbXSA9IHsKKyAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDMwLCAweDAwLCAweDcwLCAweDAwLCAweGYwLCAweDAwLAorICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgMHgwMCwgMHgwMH07Cit9IC1tYXNrZGF0YSB7CisgICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMworICAgICNkZWZpbmUgdHJpLXJ0LW1hc2tfaGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLXJ0LW1hc2tfYml0c1tdID0geworICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCisgICAgICAgMHhmOCwgMHgwMywgMHhmOCwgMHgwMSwgMHhmOCwgMHgwMCwgMHg3OCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxOCwgMHgwMCwKKyAgICAgICAweDA4LCAweDAwfTsKK30KK2ltYWdlIGNyZWF0ZSBiaXRtYXAgdHJpLWRuIC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgeworICAgICNkZWZpbmUgdHJpLWRuX3dpZHRoIDEzCisgICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLWRuX2JpdHNbXSA9IHsKKyAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAweDA3LCAweGY4LCAweDAzLAorICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgMHgwMCwgMHgwMH07Cit9IC1tYXNrZGF0YSB7CisgICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMworICAgICNkZWZpbmUgdHJpLWRuLW1hc2tfaGVpZ2h0IDEzCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLWRuLW1hc2tfYml0c1tdID0geworICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCisgICAgICAgMHhmOCwgMHgwMywgMHhmMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAweDAwLCAweDAwfTsKK30KKworcHJvYyBpbml0X2ZsaXN0IHtmaXJzdH0geworICAgIGdsb2JhbCBjZmxpc3QgY2ZsaXN0X3RvcCBzZWxlY3RlZGxpbmUgZGlmZmZpbGVzdGFydAorCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICAkY2ZsaXN0IGRlbGV0ZSAwLjAgZW5kCisgICAgaWYgeyRmaXJzdCBuZSB7fX0geworCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZmlyc3QKKwlzZXQgY2ZsaXN0X3RvcCAxCisJJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAxLjAgIjEuMCBsaW5lZW5kIgorICAgIH0gZWxzZSB7CisJY2F0Y2gge3Vuc2V0IGNmbGlzdF90b3B9CisgICAgfQorICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKKyAgICBzZXQgZGlmZmZpbGVzdGFydCB7fQorfQorCitwcm9jIGhpZ2hsaWdodF90YWcge2Z9IHsKKyAgICBnbG9iYWwgaGlnaGxpZ2h0X3BhdGhzCisKKyAgICBmb3JlYWNoIHAgJGhpZ2hsaWdodF9wYXRocyB7CisJaWYge1tzdHJpbmcgbWF0Y2ggJHAgJGZdfSB7CisJICAgIHJldHVybiAiYm9sZCIKKwl9CisgICAgfQorICAgIHJldHVybiB7fQorfQorCitwcm9jIGhpZ2hsaWdodF9maWxlbGlzdCB7fSB7CisgICAgZ2xvYmFsIGNtaXRtb2RlIGNmbGlzdAorCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0geworCXNldCBlbmQgW2xpbmRleCBbc3BsaXQgWyRjZmxpc3QgaW5kZXggZW5kXSAuXSAwXQorCWZvciB7c2V0IGwgMn0geyRsIDwgJGVuZH0ge2luY3IgbH0geworCSAgICBzZXQgbGluZSBbJGNmbGlzdCBnZXQgJGwuMCAiJGwuMCBsaW5lZW5kIl0KKwkgICAgaWYge1toaWdobGlnaHRfdGFnICRsaW5lXSBuZSB7fX0geworCQkkY2ZsaXN0IHRhZyBhZGQgYm9sZCAkbC4wICIkbC4wIGxpbmVlbmQiCisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwloaWdobGlnaHRfdHJlZSAyIHt9CisgICAgfQorICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKK30KKworcHJvYyB1bmhpZ2hsaWdodF9maWxlbGlzdCB7fSB7CisgICAgZ2xvYmFsIGNmbGlzdAorCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICAkY2ZsaXN0IHRhZyByZW1vdmUgYm9sZCAxLjAgZW5kCisgICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorfQorCitwcm9jIGFkZF9mbGlzdCB7Zmx9IHsKKyAgICBnbG9iYWwgY2ZsaXN0CisKKyAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGZvcmVhY2ggZiAkZmwgeworCSRjZmxpc3QgaW5zZXJ0IGVuZCAiXG4iCisJJGNmbGlzdCBpbnNlcnQgZW5kICRmIFtoaWdobGlnaHRfdGFnICRmXQorICAgIH0KKyAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCit9CisKK3Byb2Mgc2VsX2ZsaXN0IHt3IHggeX0geworICAgIGdsb2JhbCBjdGV4dCBkaWZmZmlsZXN0YXJ0IGNmbGlzdCBjZmxpc3RfdG9wIGNtaXRtb2RlCisKKyAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gcmV0dXJuCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY2ZsaXN0X3RvcF19IHJldHVybgorICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAiQCR4LCR5Il0gIi4iXSAwXQorICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgorICAgICRjZmxpc3QgdGFnIGFkZCBoaWdobGlnaHQgJGwuMCAiJGwuMCBsaW5lZW5kIgorICAgIHNldCBjZmxpc3RfdG9wICRsCisgICAgaWYgeyRsID09IDF9IHsKKwkkY3RleHQgeXZpZXcgMS4wCisgICAgfSBlbHNlIHsKKwljYXRjaCB7JGN0ZXh0IHl2aWV3IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgW2V4cHIgeyRsIC0gMn1dXX0KKyAgICB9Cit9CisKKyMgRnVuY3Rpb25zIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIHNoZWxsLXR5cGUgcXVvdGluZworCitwcm9jIHNoZWxscXVvdGUge3N0cn0geworICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFwgXHRdKiIgJHN0cl19IHsKKwlyZXR1cm4gJHN0cgorICAgIH0KKyAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIipcWydcIlxcXSoiICRzdHJdfSB7CisJcmV0dXJuICJcIiRzdHJcIiIKKyAgICB9CisgICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqJyoiICRzdHJdfSB7CisJcmV0dXJuICInJHN0ciciCisgICAgfQorICAgIHJldHVybiAiXCJbc3RyaW5nIG1hcCB7XCIgXFxcIiBcXCBcXFxcfSAkc3RyXVwiIgorfQorCitwcm9jIHNoZWxsYXJnbGlzdCB7bH0geworICAgIHNldCBzdHIge30KKyAgICBmb3JlYWNoIGEgJGwgeworCWlmIHskc3RyIG5lIHt9fSB7CisJICAgIGFwcGVuZCBzdHIgIiAiCisJfQorCWFwcGVuZCBzdHIgW3NoZWxscXVvdGUgJGFdCisgICAgfQorICAgIHJldHVybiAkc3RyCit9CisKK3Byb2Mgc2hlbGxkZXF1b3RlIHtzdHJ9IHsKKyAgICBzZXQgcmV0IHt9CisgICAgc2V0IHVzZWQgLTEKKyAgICB3aGlsZSB7MX0geworCWluY3IgdXNlZAorCWlmIHshW3JlZ2V4cCAtc3RhcnQgJHVzZWQgLWluZGljZXMgIlxbJ1wiXFxcXCBcdF0iICRzdHIgZmlyc3RdfSB7CisJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIGVuZF0KKwkgICAgc2V0IHVzZWQgW3N0cmluZyBsZW5ndGggJHN0cl0KKwkgICAgYnJlYWsKKwl9CisJc2V0IGZpcnN0IFtsaW5kZXggJGZpcnN0IDBdCisJc2V0IGNoIFtzdHJpbmcgaW5kZXggJHN0ciAkZmlyc3RdCisJaWYgeyRmaXJzdCA+ICR1c2VkfSB7CisJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCisJICAgIHNldCB1c2VkICRmaXJzdAorCX0KKwlpZiB7JGNoIGVxICIgIiB8fCAkY2ggZXEgIlx0In0gYnJlYWsKKwlpbmNyIHVzZWQKKwlpZiB7JGNoIGVxICInIn0geworCSAgICBzZXQgZmlyc3QgW3N0cmluZyBmaXJzdCAiJyIgJHN0ciAkdXNlZF0KKwkgICAgaWYgeyRmaXJzdCA8IDB9IHsKKwkJZXJyb3IgInVubWF0Y2hlZCBzaW5nbGUtcXVvdGUiCisJICAgIH0KKwkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KKwkgICAgc2V0IHVzZWQgJGZpcnN0CisJICAgIGNvbnRpbnVlCisJfQorCWlmIHskY2ggZXEgIlxcIn0geworCSAgICBpZiB7JHVzZWQgPj0gW3N0cmluZyBsZW5ndGggJHN0cl19IHsKKwkJZXJyb3IgInRyYWlsaW5nIGJhY2tzbGFzaCIKKwkgICAgfQorCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KKwkgICAgY29udGludWUKKwl9CisJIyBoZXJlIGNoID09ICJcIiIKKwl3aGlsZSB7MX0geworCSAgICBpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcW1wiXFxcXF0iICRzdHIgZmlyc3RdfSB7CisJCWVycm9yICJ1bm1hdGNoZWQgZG91YmxlLXF1b3RlIgorCSAgICB9CisJICAgIHNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQorCSAgICBzZXQgY2ggW3N0cmluZyBpbmRleCAkc3RyICRmaXJzdF0KKwkgICAgaWYgeyRmaXJzdCA+ICR1c2VkfSB7CisJCWFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCisJCXNldCB1c2VkICRmaXJzdAorCSAgICB9CisJICAgIGlmIHskY2ggZXEgIlwiIn0gYnJlYWsKKwkgICAgaW5jciB1c2VkCisJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQorCSAgICBpbmNyIHVzZWQKKwl9CisgICAgfQorICAgIHJldHVybiBbbGlzdCAkdXNlZCAkcmV0XQorfQorCitwcm9jIHNoZWxsc3BsaXQge3N0cn0geworICAgIHNldCBsIHt9CisgICAgd2hpbGUgezF9IHsKKwlzZXQgc3RyIFtzdHJpbmcgdHJpbWxlZnQgJHN0cl0KKwlpZiB7JHN0ciBlcSB7fX0gYnJlYWsKKwlzZXQgZHEgW3NoZWxsZGVxdW90ZSAkc3RyXQorCXNldCBuIFtsaW5kZXggJGRxIDBdCisJc2V0IHdvcmQgW2xpbmRleCAkZHEgMV0KKwlzZXQgc3RyIFtzdHJpbmcgcmFuZ2UgJHN0ciAkbiBlbmRdCisJbGFwcGVuZCBsICR3b3JkCisgICAgfQorICAgIHJldHVybiAkbAorfQorCisjIENvZGUgdG8gaW1wbGVtZW50IG11bHRpcGxlIHZpZXdzCisKK3Byb2MgbmV3dmlldyB7aXNoaWdobGlnaHR9IHsKKyAgICBnbG9iYWwgbmV4dHZpZXdudW0gbmV3dmlld25hbWUgbmV3dmlld3Blcm0gdWlmb250IG5ld2lzaGlnaGxpZ2h0CisgICAgZ2xvYmFsIG5ld3ZpZXdhcmdzIHJldnRyZWVhcmdzCisKKyAgICBzZXQgbmV3aXNoaWdobGlnaHQgJGlzaGlnaGxpZ2h0CisgICAgc2V0IHRvcCAuZ2l0a3ZpZXcKKyAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0geworCXJhaXNlICR0b3AKKwlyZXR1cm4KKyAgICB9CisgICAgc2V0IG5ld3ZpZXduYW1lKCRuZXh0dmlld251bSkgIlZpZXcgJG5leHR2aWV3bnVtIgorICAgIHNldCBuZXd2aWV3cGVybSgkbmV4dHZpZXdudW0pIDAKKyAgICBzZXQgbmV3dmlld2FyZ3MoJG5leHR2aWV3bnVtKSBbc2hlbGxhcmdsaXN0ICRyZXZ0cmVlYXJnc10KKyAgICB2aWV3ZWRpdG9yICR0b3AgJG5leHR2aWV3bnVtICJHaXRrIHZpZXcgZGVmaW5pdGlvbiIgCit9CisKK3Byb2MgZWRpdHZpZXcge30geworICAgIGdsb2JhbCBjdXJ2aWV3CisgICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdwZXJtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtCisgICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzCisKKyAgICBzZXQgdG9wIC5naXRrdmVkaXQtJGN1cnZpZXcKKyAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0geworCXJhaXNlICR0b3AKKwlyZXR1cm4KKyAgICB9CisgICAgc2V0IG5ld3ZpZXduYW1lKCRjdXJ2aWV3KSAkdmlld25hbWUoJGN1cnZpZXcpCisgICAgc2V0IG5ld3ZpZXdwZXJtKCRjdXJ2aWV3KSAkdmlld3Blcm0oJGN1cnZpZXcpCisgICAgc2V0IG5ld3ZpZXdhcmdzKCRjdXJ2aWV3KSBbc2hlbGxhcmdsaXN0ICR2aWV3YXJncygkY3VydmlldyldCisgICAgdmlld2VkaXRvciAkdG9wICRjdXJ2aWV3ICJHaXRrOiBlZGl0IHZpZXcgJHZpZXduYW1lKCRjdXJ2aWV3KSIKK30KKworcHJvYyB2aWV3ZWRpdG9yIHt0b3AgbiB0aXRsZX0geworICAgIGdsb2JhbCBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybSB2aWV3ZmlsZXMKKyAgICBnbG9iYWwgdWlmb250CisKKyAgICB0b3BsZXZlbCAkdG9wCisgICAgd20gdGl0bGUgJHRvcCAkdGl0bGUKKyAgICBsYWJlbCAkdG9wLm5sIC10ZXh0ICJOYW1lIiAtZm9udCAkdWlmb250CisgICAgZW50cnkgJHRvcC5uYW1lIC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIG5ld3ZpZXduYW1lKCRuKQorICAgIGdyaWQgJHRvcC5ubCAkdG9wLm5hbWUgLXN0aWNreSB3IC1wYWR5IDUKKyAgICBjaGVja2J1dHRvbiAkdG9wLnBlcm0gLXRleHQgIlJlbWVtYmVyIHRoaXMgdmlldyIgLXZhcmlhYmxlIG5ld3ZpZXdwZXJtKCRuKQorICAgIGdyaWQgJHRvcC5wZXJtIC0gLXBhZHkgNSAtc3RpY2t5IHcKKyAgICBtZXNzYWdlICR0b3AuYWwgLWFzcGVjdCAxMDAwIC1mb250ICR1aWZvbnQgXAorCS10ZXh0ICJDb21taXRzIHRvIGluY2x1ZGUgKGFyZ3VtZW50cyB0byBnaXQgcmV2LWxpc3QpOiIKKyAgICBncmlkICR0b3AuYWwgLSAtc3RpY2t5IHcgLXBhZHkgNQorICAgIGVudHJ5ICR0b3AuYXJncyAtd2lkdGggNTAgLXRleHR2YXJpYWJsZSBuZXd2aWV3YXJncygkbikgXAorCS1iYWNrZ3JvdW5kIHdoaXRlCisgICAgZ3JpZCAkdG9wLmFyZ3MgLSAtc3RpY2t5IGV3IC1wYWR4IDUKKyAgICBtZXNzYWdlICR0b3AubCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCisJLXRleHQgIkVudGVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBpbmNsdWRlLCBvbmUgcGVyIGxpbmU6IgorICAgIGdyaWQgJHRvcC5sIC0gLXN0aWNreSB3CisgICAgdGV4dCAkdG9wLnQgLXdpZHRoIDQwIC1oZWlnaHQgMTAgLWJhY2tncm91bmQgd2hpdGUKKyAgICBpZiB7W2luZm8gZXhpc3RzIHZpZXdmaWxlcygkbildfSB7CisJZm9yZWFjaCBmICR2aWV3ZmlsZXMoJG4pIHsKKwkgICAgJHRvcC50IGluc2VydCBlbmQgJGYKKwkgICAgJHRvcC50IGluc2VydCBlbmQgIlxuIgorCX0KKwkkdG9wLnQgZGVsZXRlIHtlbmQgLSAxY30gZW5kCisJJHRvcC50IG1hcmsgc2V0IGluc2VydCAwLjAKKyAgICB9CisgICAgZ3JpZCAkdG9wLnQgLSAtc3RpY2t5IGV3IC1wYWR4IDUKKyAgICBmcmFtZSAkdG9wLmJ1dHMKKyAgICBidXR0b24gJHRvcC5idXRzLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgW2xpc3QgbmV3dmlld29rICR0b3AgJG5dCisgICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkdG9wXQorICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KKyAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CisgICAgZm9jdXMgJHRvcC50Cit9CisKK3Byb2MgZG92aWV3bWVudSB7bSBmaXJzdCBjbWQgb3AgYXJndn0geworICAgIHNldCBubWVudSBbJG0gaW5kZXggZW5kXQorICAgIGZvciB7c2V0IGkgJGZpcnN0fSB7JGkgPD0gJG5tZW51fSB7aW5jciBpfSB7CisJaWYge1skbSBlbnRyeWNnZXQgJGkgLWNvbW1hbmRdIGVxICRjbWR9IHsKKwkgICAgZXZhbCAkbSAkb3AgJGkgJGFyZ3YKKwkgICAgYnJlYWsKKwl9CisgICAgfQorfQorCitwcm9jIGFsbHZpZXdtZW51cyB7biBvcCBhcmdzfSB7CisgICAgZ2xvYmFsIHZpZXdobG1lbnUKKworICAgIGRvdmlld21lbnUgLmJhci52aWV3IDcgW2xpc3Qgc2hvd3ZpZXcgJG5dICRvcCAkYXJncworICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSAkb3AgJGFyZ3MKK30KKworcHJvYyBuZXd2aWV3b2sge3RvcCBufSB7CisgICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXdwZXJtIG5ld3ZpZXduYW1lIG5ld2lzaGlnaGxpZ2h0CisgICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdmaWxlcyB2aWV3cGVybSBzZWxlY3RlZHZpZXcgY3VydmlldworICAgIGdsb2JhbCB2aWV3YXJncyBuZXd2aWV3YXJncyB2aWV3aGxtZW51CisKKyAgICBpZiB7W2NhdGNoIHsKKwlzZXQgbmV3YXJncyBbc2hlbGxzcGxpdCAkbmV3dmlld2FyZ3MoJG4pXQorICAgIH0gZXJyXX0geworCWVycm9yX3BvcHVwICJFcnJvciBpbiBjb21taXQgc2VsZWN0aW9uIGFyZ3VtZW50czogJGVyciIKKwl3bSByYWlzZSAkdG9wCisJZm9jdXMgJHRvcAorCXJldHVybgorICAgIH0KKyAgICBzZXQgZmlsZXMge30KKyAgICBmb3JlYWNoIGYgW3NwbGl0IFskdG9wLnQgZ2V0IDAuMCBlbmRdICJcbiJdIHsKKwlzZXQgZnQgW3N0cmluZyB0cmltICRmXQorCWlmIHskZnQgbmUge319IHsKKwkgICAgbGFwcGVuZCBmaWxlcyAkZnQKKwl9CisgICAgfQorICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdmaWxlcygkbildfSB7CisJIyBjcmVhdGluZyBhIG5ldyB2aWV3CisJaW5jciBuZXh0dmlld251bQorCXNldCB2aWV3bmFtZSgkbikgJG5ld3ZpZXduYW1lKCRuKQorCXNldCB2aWV3cGVybSgkbikgJG5ld3ZpZXdwZXJtKCRuKQorCXNldCB2aWV3ZmlsZXMoJG4pICRmaWxlcworCXNldCB2aWV3YXJncygkbikgJG5ld2FyZ3MKKwlhZGR2aWV3bWVudSAkbgorCWlmIHshJG5ld2lzaGlnaGxpZ2h0fSB7CisJICAgIGFmdGVyIGlkbGUgc2hvd3ZpZXcgJG4KKwl9IGVsc2UgeworCSAgICBhZnRlciBpZGxlIGFkZHZoaWdobGlnaHQgJG4KKwl9CisgICAgfSBlbHNlIHsKKwkjIGVkaXRpbmcgYW4gZXhpc3RpbmcgdmlldworCXNldCB2aWV3cGVybSgkbikgJG5ld3ZpZXdwZXJtKCRuKQorCWlmIHskbmV3dmlld25hbWUoJG4pIG5lICR2aWV3bmFtZSgkbil9IHsKKwkgICAgc2V0IHZpZXduYW1lKCRuKSAkbmV3dmlld25hbWUoJG4pCisJICAgIGRvdmlld21lbnUgLmJhci52aWV3IDcgW2xpc3Qgc2hvd3ZpZXcgJG5dIFwKKwkJZW50cnljb25mIFtsaXN0IC1sYWJlbCAkdmlld25hbWUoJG4pXQorCSAgICBkb3ZpZXdtZW51ICR2aWV3aGxtZW51IDEgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gXAorCQllbnRyeWNvbmYgW2xpc3QgLWxhYmVsICR2aWV3bmFtZSgkbikgLXZhbHVlICR2aWV3bmFtZSgkbildCisJfQorCWlmIHskZmlsZXMgbmUgJHZpZXdmaWxlcygkbikgfHwgJG5ld2FyZ3MgbmUgJHZpZXdhcmdzKCRuKX0geworCSAgICBzZXQgdmlld2ZpbGVzKCRuKSAkZmlsZXMKKwkgICAgc2V0IHZpZXdhcmdzKCRuKSAkbmV3YXJncworCSAgICBpZiB7JGN1cnZpZXcgPT0gJG59IHsKKwkJYWZ0ZXIgaWRsZSB1cGRhdGVjb21taXRzCisJICAgIH0KKwl9CisgICAgfQorICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9Cit9CisKK3Byb2MgZGVsdmlldyB7fSB7CisgICAgZ2xvYmFsIGN1cnZpZXcgdmlld2RhdGEgdmlld3Blcm0gaGx2aWV3IHNlbGVjdGVkaGx2aWV3CisKKyAgICBpZiB7JGN1cnZpZXcgPT0gMH0gcmV0dXJuCisgICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICRobHZpZXcgPT0gJGN1cnZpZXd9IHsKKwlzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQorCXVuc2V0IGhsdmlldworICAgIH0KKyAgICBhbGx2aWV3bWVudXMgJGN1cnZpZXcgZGVsZXRlCisgICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSB7fQorICAgIHNldCB2aWV3cGVybSgkY3VydmlldykgMAorICAgIHNob3d2aWV3IDAKK30KKworcHJvYyBhZGR2aWV3bWVudSB7bn0geworICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3aGxtZW51CisKKyAgICAuYmFyLnZpZXcgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkdmlld25hbWUoJG4pIFwKKwktY29tbWFuZCBbbGlzdCBzaG93dmlldyAkbl0gLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgJG4KKyAgICAkdmlld2hsbWVudSBhZGQgcmFkaW9idXR0b24gLWxhYmVsICR2aWV3bmFtZSgkbikgXAorCS1jb21tYW5kIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dIC12YXJpYWJsZSBzZWxlY3RlZGhsdmlldworfQorCitwcm9jIGZsYXR0ZW4ge3Zhcn0geworICAgIGdsb2JhbCAkdmFyCisKKyAgICBzZXQgcmV0IHt9CisgICAgZm9yZWFjaCBpIFthcnJheSBuYW1lcyAkdmFyXSB7CisJbGFwcGVuZCByZXQgJGkgW3NldCAkdmFyXCgkaVwpXQorICAgIH0KKyAgICByZXR1cm4gJHJldAorfQorCitwcm9jIHVuZmxhdHRlbiB7dmFyIGx9IHsKKyAgICBnbG9iYWwgJHZhcgorCisgICAgY2F0Y2gge3Vuc2V0ICR2YXJ9CisgICAgZm9yZWFjaCB7aSB2fSAkbCB7CisJc2V0ICR2YXJcKCRpXCkgJHYKKyAgICB9Cit9CisKK3Byb2Mgc2hvd3ZpZXcge259IHsKKyAgICBnbG9iYWwgY3VydmlldyB2aWV3ZGF0YSB2aWV3ZmlsZXMKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudGxpc3QgY2hpbGRsaXN0IHJvd2lkbGlzdCByb3dvZmZzZXRzCisgICAgZ2xvYmFsIGNvbG9ybWFwIHJvd3RleHR4IGNvbW1pdHJvdyBuZXh0Y29sb3IgY2FudnhtYXgKKyAgICBnbG9iYWwgbnVtY29tbWl0cyByb3dyYW5nZWxpc3QgY29tbWl0bGlzdGVkIGlkcm93cmFuZ2VzCisgICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgY2FudiBjYW52eTAKKyAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyB0cmVlZGlmZnMKKyAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QgcGhhc2UKKyAgICBnbG9iYWwgY29tbWl0aWR4IHJvd2xhaWRvdXQgcm93b3B0aW0gbGluZXNlZ2VuZHMKKyAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUKKyAgICBnbG9iYWwgc2VsZWN0ZWR2aWV3CisgICAgZ2xvYmFsIHZwYXJlbnRsaXN0IHZjaGlsZGxpc3QgdmRpc3BvcmRlciB2Y21pdGxpc3RlZAorICAgIGdsb2JhbCBobHZpZXcgc2VsZWN0ZWRobHZpZXcKKworICAgIGlmIHskbiA9PSAkY3Vydmlld30gcmV0dXJuCisgICAgc2V0IHNlbGlkIHt9CisgICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CisJc2V0IHNlbGlkICRjdXJyZW50aWQKKwlzZXQgeSBbeWMgJHNlbGVjdGVkbGluZV0KKwlzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisJc2V0IHNwYW4gWyRjYW52IHl2aWV3XQorCXNldCB5dG9wIFtleHByIHtbbGluZGV4ICRzcGFuIDBdICogJHltYXh9XQorCXNldCB5Ym90IFtleHByIHtbbGluZGV4ICRzcGFuIDFdICogJHltYXh9XQorCWlmIHskeXRvcCA8ICR5ICYmICR5IDwgJHlib3R9IHsKKwkgICAgc2V0IHlzY3JlZW4gW2V4cHIgeyR5IC0gJHl0b3B9XQorCX0gZWxzZSB7CisJICAgIHNldCB5c2NyZWVuIFtleHByIHsoJHlib3QgLSAkeXRvcCkgLyAyfV0KKwl9CisgICAgfQorICAgIHVuc2VsZWN0bGluZQorICAgIG5vcm1hbGxpbmUKKyAgICBzdG9wZmluZHByb2MKKyAgICBpZiB7JGN1cnZpZXcgPj0gMH0geworCXNldCB2cGFyZW50bGlzdCgkY3VydmlldykgJHBhcmVudGxpc3QKKwlzZXQgdmNoaWxkbGlzdCgkY3VydmlldykgJGNoaWxkbGlzdAorCXNldCB2ZGlzcG9yZGVyKCRjdXJ2aWV3KSAkZGlzcGxheW9yZGVyCisJc2V0IHZjbWl0bGlzdGVkKCRjdXJ2aWV3KSAkY29tbWl0bGlzdGVkCisJaWYgeyRwaGFzZSBuZSB7fX0geworCSAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIFwKKwkJW2xpc3QgJHBoYXNlICRyb3dpZGxpc3QgJHJvd29mZnNldHMgJHJvd3JhbmdlbGlzdCBcCisJCSAgICAgW2ZsYXR0ZW4gaWRyb3dyYW5nZXNdIFtmbGF0dGVuIGlkaW5saXN0XSBcCisJCSAgICAgJHJvd2xhaWRvdXQgJHJvd29wdGltICRudW1jb21taXRzICRsaW5lc2VnZW5kc10KKwl9IGVsc2VpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkY3VydmlldyldCisJCSAgfHwgW2xpbmRleCAkdmlld2RhdGEoJGN1cnZpZXcpIDBdIG5lIHt9fSB7CisJICAgIHNldCB2aWV3ZGF0YSgkY3VydmlldykgXAorCQlbbGlzdCB7fSAkcm93aWRsaXN0ICRyb3dvZmZzZXRzICRyb3dyYW5nZWxpc3RdCisJfQorICAgIH0KKyAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KKyAgICBjYXRjaCB7dW5zZXQgdHJlZWRpZmZzfQorICAgIGNsZWFyX2Rpc3BsYXkKKyAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJGhsdmlldyA9PSAkbn0geworCXVuc2V0IGhsdmlldworCXNldCBzZWxlY3RlZGhsdmlldyBOb25lCisgICAgfQorCisgICAgc2V0IGN1cnZpZXcgJG4KKyAgICBzZXQgc2VsZWN0ZWR2aWV3ICRuCisgICAgLmJhci52aWV3IGVudHJ5Y29uZiAyIC1zdGF0ZSBbZXhwciB7JG4gPT0gMD8gImRpc2FibGVkIjogIm5vcm1hbCJ9XQorICAgIC5iYXIudmlldyBlbnRyeWNvbmYgMyAtc3RhdGUgW2V4cHIgeyRuID09IDA/ICJkaXNhYmxlZCI6ICJub3JtYWwifV0KKworICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKKwlzZXQgcGVuZGluZ19zZWxlY3QgJHNlbGlkCisJZ2V0Y29tbWl0cworCXJldHVybgorICAgIH0KKworICAgIHNldCB2ICR2aWV3ZGF0YSgkbikKKyAgICBzZXQgcGhhc2UgW2xpbmRleCAkdiAwXQorICAgIHNldCBkaXNwbGF5b3JkZXIgJHZkaXNwb3JkZXIoJG4pCisgICAgc2V0IHBhcmVudGxpc3QgJHZwYXJlbnRsaXN0KCRuKQorICAgIHNldCBjaGlsZGxpc3QgJHZjaGlsZGxpc3QoJG4pCisgICAgc2V0IGNvbW1pdGxpc3RlZCAkdmNtaXRsaXN0ZWQoJG4pCisgICAgc2V0IHJvd2lkbGlzdCBbbGluZGV4ICR2IDFdCisgICAgc2V0IHJvd29mZnNldHMgW2xpbmRleCAkdiAyXQorICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbmRleCAkdiAzXQorICAgIGlmIHskcGhhc2UgZXEge319IHsKKwlzZXQgbnVtY29tbWl0cyBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQorCWNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KKyAgICB9IGVsc2UgeworCXVuZmxhdHRlbiBpZHJvd3JhbmdlcyBbbGluZGV4ICR2IDRdCisJdW5mbGF0dGVuIGlkaW5saXN0IFtsaW5kZXggJHYgNV0KKwlzZXQgcm93bGFpZG91dCBbbGluZGV4ICR2IDZdCisJc2V0IHJvd29wdGltIFtsaW5kZXggJHYgN10KKwlzZXQgbnVtY29tbWl0cyBbbGluZGV4ICR2IDhdCisJc2V0IGxpbmVzZWdlbmRzIFtsaW5kZXggJHYgOV0KKyAgICB9CisKKyAgICBjYXRjaCB7dW5zZXQgY29sb3JtYXB9CisgICAgY2F0Y2gge3Vuc2V0IHJvd3RleHR4fQorICAgIHNldCBuZXh0Y29sb3IgMAorICAgIHNldCBjYW52eG1heCBbJGNhbnYgY2dldCAtd2lkdGhdCisgICAgc2V0IGN1cnZpZXcgJG4KKyAgICBzZXQgcm93IDAKKyAgICBzZXRjYW52c2Nyb2xsCisgICAgc2V0IHlmIDAKKyAgICBzZXQgcm93IDAKKyAgICBpZiB7JHNlbGlkIG5lIHt9ICYmIFtpbmZvIGV4aXN0cyBjb21taXRyb3coJG4sJHNlbGlkKV19IHsKKwlzZXQgcm93ICRjb21taXRyb3coJG4sJHNlbGlkKQorCSMgdHJ5IHRvIGdldCB0aGUgc2VsZWN0ZWQgcm93IGluIHRoZSBzYW1lIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4KKwlzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisJc2V0IHl0b3AgW2V4cHIge1t5YyAkcm93XSAtICR5c2NyZWVufV0KKwlpZiB7JHl0b3AgPCAwfSB7CisJICAgIHNldCB5dG9wIDAKKwl9CisJc2V0IHlmIFtleHByIHskeXRvcCAqIDEuMCAvICR5bWF4fV0KKyAgICB9CisgICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvICR5ZgorICAgIGRyYXd2aXNpYmxlCisgICAgc2VsZWN0bGluZSAkcm93IDAKKyAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CisJaWYgeyRwaGFzZSBlcSAiZ2V0Y29tbWl0cyJ9IHsKKwkgICAgc2hvd19zdGF0dXMgIlJlYWRpbmcgY29tbWl0cy4uLiIKKwl9CisJaWYge1tpbmZvIGV4aXN0cyBjb21tZmQoJG4pXX0geworCSAgICBsYXlvdXRtb3JlCisJfSBlbHNlIHsKKwkgICAgZmluaXNoY29tbWl0cworCX0KKyAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPT0gMH0geworCXNob3dfc3RhdHVzICJObyBjb21taXRzIHNlbGVjdGVkIgorICAgIH0KK30KKworIyBTdHVmZiByZWxhdGluZyB0byB0aGUgaGlnaGxpZ2h0aW5nIGZhY2lsaXR5CisKK3Byb2MgaXNoaWdobGlnaHRlZCB7cm93fSB7CisgICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCisKKyAgICBpZiB7W2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXSAmJiAkbmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICRuaGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXSAmJiAkdmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICR2aGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXSAmJiAkZmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICRmaGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXSAmJiAkcmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CisJcmV0dXJuICRyaGlnaGxpZ2h0cygkcm93KQorICAgIH0KKyAgICByZXR1cm4gMAorfQorCitwcm9jIGJvbGRlbiB7cm93IGZvbnR9IHsKKyAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBzZWxlY3RlZGxpbmUgYm9sZHJvd3MKKworICAgIGxhcHBlbmQgYm9sZHJvd3MgJHJvdworICAgICRjYW52IGl0ZW1jb25mICRsaW5laHRhZygkcm93KSAtZm9udCAkZm9udAorICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKKwkkY2FudiBkZWxldGUgc2Vjc2VsCisJc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRyb3cpXSBcCisJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKKwkJICAgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQorCSRjYW52IGxvd2VyICR0CisgICAgfQorfQorCitwcm9jIGJvbGRlbl9uYW1lIHtyb3cgZm9udH0geworICAgIGdsb2JhbCBjYW52MiBsaW5lbnRhZyBzZWxlY3RlZGxpbmUgYm9sZG5hbWVyb3dzCisKKyAgICBsYXBwZW5kIGJvbGRuYW1lcm93cyAkcm93CisgICAgJGNhbnYyIGl0ZW1jb25mICRsaW5lbnRhZygkcm93KSAtZm9udCAkZm9udAorICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKKwkkY2FudjIgZGVsZXRlIHNlY3NlbAorCXNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRyb3cpXSBcCisJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKKwkJICAgLWZpbGwgWyRjYW52MiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KKwkkY2FudjIgbG93ZXIgJHQKKyAgICB9Cit9CisKK3Byb2MgdW5ib2xkZW4ge30geworICAgIGdsb2JhbCBtYWluZm9udCBib2xkcm93cworCisgICAgc2V0IHN0aWxsYm9sZCB7fQorICAgIGZvcmVhY2ggcm93ICRib2xkcm93cyB7CisJaWYgeyFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyAkbWFpbmZvbnQKKwl9IGVsc2UgeworCSAgICBsYXBwZW5kIHN0aWxsYm9sZCAkcm93CisJfQorICAgIH0KKyAgICBzZXQgYm9sZHJvd3MgJHN0aWxsYm9sZAorfQorCitwcm9jIGFkZHZoaWdobGlnaHQge259IHsKKyAgICBnbG9iYWwgaGx2aWV3IGN1cnZpZXcgdmlld2RhdGEgdmhsX2RvbmUgdmhpZ2hsaWdodHMgY29tbWl0aWR4CisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKKwlkZWx2aGlnaGxpZ2h0CisgICAgfQorICAgIHNldCBobHZpZXcgJG4KKyAgICBpZiB7JG4gIT0gJGN1cnZpZXcgJiYgIVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkbildfSB7CisJc2V0IHZpZXdkYXRhKCRuKSBbbGlzdCBnZXRjb21taXRzIHt7fX0ge3t9fSB7fSB7fSB7fSAwIDAgMCB7fV0KKwlzZXQgdnBhcmVudGxpc3QoJG4pIHt9CisJc2V0IHZjaGlsZGxpc3QoJG4pIHt9CisJc2V0IHZkaXNwb3JkZXIoJG4pIHt9CisJc2V0IHZjbWl0bGlzdGVkKCRuKSB7fQorCXN0YXJ0X3Jldl9saXN0ICRuCisgICAgfQorICAgIHNldCB2aGxfZG9uZSAkY29tbWl0aWR4KCRobHZpZXcpCisgICAgaWYgeyR2aGxfZG9uZSA+IDB9IHsKKwlkcmF3dmlzaWJsZQorICAgIH0KK30KKworcHJvYyBkZWx2aGlnaGxpZ2h0IHt9IHsKKyAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzCisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBobHZpZXddfSByZXR1cm4KKyAgICB1bnNldCBobHZpZXcKKyAgICBjYXRjaCB7dW5zZXQgdmhpZ2hsaWdodHN9CisgICAgdW5ib2xkZW4KK30KKworcHJvYyB2aGlnaGxpZ2h0bW9yZSB7fSB7CisgICAgZ2xvYmFsIGhsdmlldyB2aGxfZG9uZSBjb21taXRpZHggdmhpZ2hsaWdodHMKKyAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHZkaXNwb3JkZXIgY3VydmlldyBtYWluZm9udAorCisgICAgc2V0IGZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KKyAgICBzZXQgbWF4ICRjb21taXRpZHgoJGhsdmlldykKKyAgICBpZiB7JGhsdmlldyA9PSAkY3Vydmlld30geworCXNldCBkaXNwICRkaXNwbGF5b3JkZXIKKyAgICB9IGVsc2UgeworCXNldCBkaXNwICR2ZGlzcG9yZGVyKCRobHZpZXcpCisgICAgfQorICAgIHNldCB2ciBbdmlzaWJsZXJvd3NdCisgICAgc2V0IHIwIFtsaW5kZXggJHZyIDBdCisgICAgc2V0IHIxIFtsaW5kZXggJHZyIDFdCisgICAgZm9yIHtzZXQgaSAkdmhsX2RvbmV9IHskaSA8ICRtYXh9IHtpbmNyIGl9IHsKKwlzZXQgaWQgW2xpbmRleCAkZGlzcCAkaV0KKwlpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0geworCSAgICBzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQorCSAgICBpZiB7JHIwIDw9ICRyb3cgJiYgJHJvdyA8PSAkcjF9IHsKKwkJaWYgeyFbaGlnaGxpZ2h0ZWQgJHJvd119IHsKKwkJICAgIGJvbGRlbiAkcm93ICRmb250CisJCX0KKwkJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKKwkgICAgfQorCX0KKyAgICB9CisgICAgc2V0IHZobF9kb25lICRtYXgKK30KKworcHJvYyBhc2t2aGlnaGxpZ2h0IHtyb3cgaWR9IHsKKyAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzIGNvbW1pdHJvdyBpZGRyYXduIG1haW5mb250CisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkaGx2aWV3LCRpZCldfSB7CisJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKwlzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQorICAgIH0gZWxzZSB7CisJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDAKKyAgICB9Cit9CisKK3Byb2MgaGZpbGVzX2NoYW5nZSB7bmFtZSBpeCBvcH0geworICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaF9zZXJpYWwKKyAgICBnbG9iYWwgbWFpbmZvbnQgaGlnaGxpZ2h0X3BhdGhzCisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CisJIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cworCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KKwl1bnNldCBmaWxlaGlnaGxpZ2h0CisJY2F0Y2gge3Vuc2V0IGZoaWdobGlnaHRzfQorCXVuYm9sZGVuCisJdW5oaWdobGlnaHRfZmlsZWxpc3QKKyAgICB9CisgICAgc2V0IGhpZ2hsaWdodF9wYXRocyB7fQorICAgIGFmdGVyIGNhbmNlbCBkb19maWxlX2hsICRmaF9zZXJpYWwKKyAgICBpbmNyIGZoX3NlcmlhbAorICAgIGlmIHskaGlnaGxpZ2h0X2ZpbGVzIG5lIHt9fSB7CisJYWZ0ZXIgMzAwIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAorICAgIH0KK30KKworcHJvYyBtYWtlcGF0dGVybnMge2x9IHsKKyAgICBzZXQgcmV0IHt9CisgICAgZm9yZWFjaCBlICRsIHsKKwlzZXQgZWUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9ICRlXQorCWlmIHtbc3RyaW5nIGluZGV4ICRlZSBlbmRdIGVxICIvIn0geworCSAgICBsYXBwZW5kIHJldCAiJGVlKiIKKwl9IGVsc2UgeworCSAgICBsYXBwZW5kIHJldCAkZWUKKwkgICAgbGFwcGVuZCByZXQgIiRlZS8qIgorCX0KKyAgICB9CisgICAgcmV0dXJuICRyZXQKK30KKworcHJvYyBkb19maWxlX2hsIHtzZXJpYWx9IHsKKyAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGZpbGVoaWdobGlnaHQgaGlnaGxpZ2h0X3BhdGhzIGdkdHR5cGUgZmhsX2xpc3QKKworICAgIGlmIHskZ2R0dHlwZSBlcSAidG91Y2hpbmcgcGF0aHM6In0geworCWlmIHtbY2F0Y2gge3NldCBwYXRocyBbc2hlbGxzcGxpdCAkaGlnaGxpZ2h0X2ZpbGVzXX1dfSByZXR1cm4KKwlzZXQgaGlnaGxpZ2h0X3BhdGhzIFttYWtlcGF0dGVybnMgJHBhdGhzXQorCWhpZ2hsaWdodF9maWxlbGlzdAorCXNldCBnZHRhcmdzIFtjb25jYXQgLS0gJHBhdGhzXQorICAgIH0gZWxzZSB7CisJc2V0IGdkdGFyZ3MgW2xpc3QgIi1TJGhpZ2hsaWdodF9maWxlcyJdCisgICAgfQorICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLXIgLXMgLS1zdGRpbiAkZ2R0YXJnc10KKyAgICBzZXQgZmlsZWhpZ2hsaWdodCBbb3BlbiAkY21kIHIrXQorICAgIGZjb25maWd1cmUgJGZpbGVoaWdobGlnaHQgLWJsb2NraW5nIDAKKyAgICBmaWxlZXZlbnQgJGZpbGVoaWdobGlnaHQgcmVhZGFibGUgcmVhZGZoaWdobGlnaHQKKyAgICBzZXQgZmhsX2xpc3Qge30KKyAgICBkcmF3dmlzaWJsZQorICAgIGZsdXNoaGlnaGxpZ2h0cworfQorCitwcm9jIGZsdXNoaGlnaGxpZ2h0cyB7fSB7CisgICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhsX2xpc3QKKworICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKKwlsYXBwZW5kIGZobF9saXN0IHt9CisJcHV0cyAkZmlsZWhpZ2hsaWdodCAiIgorCWZsdXNoICRmaWxlaGlnaGxpZ2h0CisgICAgfQorfQorCitwcm9jIGFza2ZpbGVoaWdobGlnaHQge3JvdyBpZH0geworICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZobF9saXN0CisKKyAgICBsYXBwZW5kIGZobF9saXN0ICRpZAorICAgIHNldCBmaGlnaGxpZ2h0cygkcm93KSAtMQorICAgIHB1dHMgJGZpbGVoaWdobGlnaHQgJGlkCit9CisKK3Byb2MgcmVhZGZoaWdobGlnaHQge30geworICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGNvbW1pdHJvdyBjdXJ2aWV3IG1haW5mb250IGlkZHJhd24KKyAgICBnbG9iYWwgZmhsX2xpc3QKKworICAgIHdoaWxlIHtbZ2V0cyAkZmlsZWhpZ2hsaWdodCBsaW5lXSA+PSAwfSB7CisJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQorCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkZmhsX2xpc3QgJGxpbmVdCisJaWYgeyRpIDwgMH0gY29udGludWUKKwlmb3Ige3NldCBqIDB9IHskaiA8ICRpfSB7aW5jciBqfSB7CisJICAgIHNldCBpZCBbbGluZGV4ICRmaGxfbGlzdCAkal0KKwkgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKKwkJc2V0IGZoaWdobGlnaHRzKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgMAorCSAgICB9CisJfQorCXNldCBmaGxfbGlzdCBbbHJhbmdlICRmaGxfbGlzdCBbZXhwciB7JGkrMX1dIGVuZF0KKwlpZiB7JGxpbmUgZXEge319IGNvbnRpbnVlCisJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKV19IGNvbnRpbnVlCisJc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKQorCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkbGluZSldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKwlzZXQgZmhpZ2hsaWdodHMoJHJvdykgMQorICAgIH0KKyAgICBpZiB7W2VvZiAkZmlsZWhpZ2hsaWdodF19IHsKKwkjIHN0cmFuZ2UuLi4KKwlwdXRzICJvb3BzLCBnaXQtZGlmZi10cmVlIGRpZWQiCisJY2F0Y2gge2Nsb3NlICRmaWxlaGlnaGxpZ2h0fQorCXVuc2V0IGZpbGVoaWdobGlnaHQKKyAgICB9CisgICAgbmV4dF9obGNvbnQKK30KKworcHJvYyBmaW5kX2NoYW5nZSB7bmFtZSBpeCBvcH0geworICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBtYWluZm9udCBib2xkbmFtZXJvd3MKKyAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kcGF0dGVybiBmaW5kdHlwZQorCisgICAgIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cywgaWYgYW55CisgICAgZm9yZWFjaCByb3cgJGJvbGRuYW1lcm93cyB7CisJYm9sZGVuX25hbWUgJHJvdyAkbWFpbmZvbnQKKyAgICB9CisgICAgc2V0IGJvbGRuYW1lcm93cyB7fQorICAgIGNhdGNoIHt1bnNldCBuaGlnaGxpZ2h0c30KKyAgICB1bmJvbGRlbgorICAgIGlmIHskZmluZHR5cGUgbmUgIlJlZ2V4cCJ9IHsKKwlzZXQgZSBbc3RyaW5nIG1hcCB7IioiICJcXCoiICI/IiAiXFw/IiAiXFsiICJcXFxbIiAiXFwiICJcXFxcIn0gXAorCQkgICAkZmluZHN0cmluZ10KKwlzZXQgZmluZHBhdHRlcm4gIiokZSoiCisgICAgfQorICAgIGRyYXd2aXNpYmxlCit9CisKK3Byb2MgYXNrZmluZGhpZ2hsaWdodCB7cm93IGlkfSB7CisgICAgZ2xvYmFsIG5oaWdobGlnaHRzIGNvbW1pdGluZm8gaWRkcmF3biBtYWluZm9udAorICAgIGdsb2JhbCBmaW5kc3RyaW5nIGZpbmR0eXBlIGZpbmRsb2MgZmluZHBhdHRlcm4KKworICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKKwlnZXRjb21taXQgJGlkCisgICAgfQorICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKKyAgICBzZXQgaXNib2xkIDAKKyAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KKyAgICBmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKKwlpZiB7JGZpbmRsb2MgbmUgIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jIG5lICR0eX0geworCSAgICBjb250aW51ZQorCX0KKwlpZiB7JGZpbmR0eXBlIGVxICJSZWdleHAifSB7CisJICAgIHNldCBkb2VzbWF0Y2ggW3JlZ2V4cCAkZmluZHN0cmluZyAkZl0KKwl9IGVsc2VpZiB7JGZpbmR0eXBlIGVxICJJZ25DYXNlIn0geworCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkZmluZHBhdHRlcm4gJGZdCisJfSBlbHNlIHsKKwkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoICRmaW5kcGF0dGVybiAkZl0KKwl9CisJaWYgeyRkb2VzbWF0Y2h9IHsKKwkgICAgaWYgeyR0eSBlcSAiQXV0aG9yIn0geworCQlzZXQgaXNib2xkIDIKKwkgICAgfSBlbHNlIHsKKwkJc2V0IGlzYm9sZCAxCisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0geworCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKwlpZiB7JGlzYm9sZCA+PSAyfSB7CisJICAgIGJvbGRlbl9uYW1lICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KKwl9CisgICAgfQorICAgIHNldCBuaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCit9CisKK3Byb2MgdnJlbF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKKyAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQKKworICAgIHJoaWdobGlnaHRfbm9uZQorICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CisJYWZ0ZXIgaWRsZSBkcmF3dmlzaWJsZQorICAgIH0KK30KKworIyBwcmVwYXJlIGZvciB0ZXN0aW5nIHdoZXRoZXIgY29tbWl0cyBhcmUgZGVzY2VuZGVudHMgb3IgYW5jZXN0b3JzIG9mIGEKK3Byb2MgcmhpZ2hsaWdodF9zZWwge2F9IHsKKyAgICBnbG9iYWwgZGVzY2VuZGVudCBkZXNjX3RvZG8gYW5jZXN0b3IgYW5jX3RvZG8KKyAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQgcmhpZ2hsaWdodHMKKworICAgIGNhdGNoIHt1bnNldCBkZXNjZW5kZW50fQorICAgIHNldCBkZXNjX3RvZG8gW2xpc3QgJGFdCisgICAgY2F0Y2gge3Vuc2V0IGFuY2VzdG9yfQorICAgIHNldCBhbmNfdG9kbyBbbGlzdCAkYV0KKyAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0geworCXJoaWdobGlnaHRfbm9uZQorCWFmdGVyIGlkbGUgZHJhd3Zpc2libGUKKyAgICB9Cit9CisKK3Byb2MgcmhpZ2hsaWdodF9ub25lIHt9IHsKKyAgICBnbG9iYWwgcmhpZ2hsaWdodHMKKworICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KKyAgICB1bmJvbGRlbgorfQorCitwcm9jIGlzX2Rlc2NlbmRlbnQge2F9IHsKKyAgICBnbG9iYWwgY3VydmlldyBjaGlsZHJlbiBjb21taXRyb3cgZGVzY2VuZGVudCBkZXNjX3RvZG8KKworICAgIHNldCB2ICRjdXJ2aWV3CisgICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCisgICAgc2V0IHRvZG8gJGRlc2NfdG9kbworICAgIHNldCBsZWZ0b3ZlciB7fQorICAgIHNldCBkb25lIDAKKyAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0geworCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQorCWlmIHskY29tbWl0cm93KCR2LCRkbykgPCAkbGF9IHsKKwkgICAgbGFwcGVuZCBsZWZ0b3ZlciAkZG8KKwkgICAgY29udGludWUKKwl9CisJZm9yZWFjaCBuayAkY2hpbGRyZW4oJHYsJGRvKSB7CisJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlc2NlbmRlbnQoJG5rKV19IHsKKwkJc2V0IGRlc2NlbmRlbnQoJG5rKSAxCisJCWxhcHBlbmQgdG9kbyAkbmsKKwkJaWYgeyRuayBlcSAkYX0geworCQkgICAgc2V0IGRvbmUgMQorCQl9CisJICAgIH0KKwl9CisJaWYgeyRkb25lfSB7CisJICAgIHNldCBkZXNjX3RvZG8gW2NvbmNhdCAkbGVmdG92ZXIgW2xyYW5nZSAkdG9kbyBbZXhwciB7JGkrMX1dIGVuZF1dCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgc2V0IGRlc2NlbmRlbnQoJGEpIDAKKyAgICBzZXQgZGVzY190b2RvICRsZWZ0b3ZlcgorfQorCitwcm9jIGlzX2FuY2VzdG9yIHthfSB7CisgICAgZ2xvYmFsIGN1cnZpZXcgcGFyZW50bGlzdCBjb21taXRyb3cgYW5jZXN0b3IgYW5jX3RvZG8KKworICAgIHNldCB2ICRjdXJ2aWV3CisgICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCisgICAgc2V0IHRvZG8gJGFuY190b2RvCisgICAgc2V0IGxlZnRvdmVyIHt9CisgICAgc2V0IGRvbmUgMAorICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dfSB7aW5jciBpfSB7CisJc2V0IGRvIFtsaW5kZXggJHRvZG8gJGldCisJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCR2LCRkbyldIHx8ICRjb21taXRyb3coJHYsJGRvKSA+ICRsYX0geworCSAgICBsYXBwZW5kIGxlZnRvdmVyICRkbworCSAgICBjb250aW51ZQorCX0KKwlmb3JlYWNoIG5wIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkdiwkZG8pXSB7CisJICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRucCldfSB7CisJCXNldCBhbmNlc3RvcigkbnApIDEKKwkJbGFwcGVuZCB0b2RvICRucAorCQlpZiB7JG5wIGVxICRhfSB7CisJCSAgICBzZXQgZG9uZSAxCisJCX0KKwkgICAgfQorCX0KKwlpZiB7JGRvbmV9IHsKKwkgICAgc2V0IGFuY190b2RvIFtjb25jYXQgJGxlZnRvdmVyIFtscmFuZ2UgJHRvZG8gW2V4cHIgeyRpKzF9XSBlbmRdXQorCSAgICByZXR1cm4KKwl9CisgICAgfQorICAgIHNldCBhbmNlc3RvcigkYSkgMAorICAgIHNldCBhbmNfdG9kbyAkbGVmdG92ZXIKK30KKworcHJvYyBhc2tyZWxoaWdobGlnaHQge3JvdyBpZH0geworICAgIGdsb2JhbCBkZXNjZW5kZW50IGhpZ2hsaWdodF9yZWxhdGVkIGlkZHJhd24gbWFpbmZvbnQgcmhpZ2hsaWdodHMKKyAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGFuY2VzdG9yCisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KKyAgICBzZXQgaXNib2xkIDAKKyAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50IiB8fAorCSRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGRlc2NlbmRlbnQifSB7CisJaWYgeyFbaW5mbyBleGlzdHMgZGVzY2VuZGVudCgkaWQpXX0geworCSAgICBpc19kZXNjZW5kZW50ICRpZAorCX0KKwlpZiB7JGRlc2NlbmRlbnQoJGlkKSA9PSAoJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50Iil9IHsKKwkgICAgc2V0IGlzYm9sZCAxCisJfQorICAgIH0gZWxzZWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIiB8fAorCSAgICAgICRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGFuY2VzdG9yIn0geworCWlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRpZCldfSB7CisJICAgIGlzX2FuY2VzdG9yICRpZAorCX0KKwlpZiB7JGFuY2VzdG9yKCRpZCkgPT0gKCRoaWdobGlnaHRfcmVsYXRlZCBlcSAiQW5jZXN0b3IiKX0geworCSAgICBzZXQgaXNib2xkIDEKKwl9CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0geworCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0geworCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQorCX0KKyAgICB9CisgICAgc2V0IHJoaWdobGlnaHRzKCRyb3cpICRpc2JvbGQKK30KKworcHJvYyBuZXh0X2hsY29udCB7fSB7CisgICAgZ2xvYmFsIGZobF9yb3cgZmhsX2Rpcm4gZGlzcGxheW9yZGVyIG51bWNvbW1pdHMKKyAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKKyAgICBnbG9iYWwgaGx2aWV3IGZpbGVoaWdobGlnaHQgZmluZHN0cmluZyBoaWdobGlnaHRfcmVsYXRlZAorCisgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhsX2Rpcm5dIHx8ICRmaGxfZGlybiA9PSAwfSByZXR1cm4KKyAgICBzZXQgcm93ICRmaGxfcm93CisgICAgd2hpbGUgezF9IHsKKwlpZiB7JHJvdyA8IDAgfHwgJHJvdyA+PSAkbnVtY29tbWl0c30geworCSAgICBiZWxsCisJICAgIHNldCBmaGxfZGlybiAwCisJICAgIHJldHVybgorCX0KKwlzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCisJaWYge1tpbmZvIGV4aXN0cyBobHZpZXddfSB7CisJICAgIGlmIHshW2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXX0geworCQlhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCisJICAgIH0KKwkgICAgaWYgeyR2aGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCisJfQorCWlmIHskZmluZHN0cmluZyBuZSB7fX0geworCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV19IHsKKwkJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAorCSAgICB9CisJICAgIGlmIHskbmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhaworCX0KKwlpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0geworCSAgICBpZiB7IVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKKwkJYXNrcmVsaGlnaGxpZ2h0ICRyb3cgJGlkCisJICAgIH0KKwkgICAgaWYgeyRyaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCisJfQorCWlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKKwkgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHJvdyldfSB7CisJCSMgYXNrIGZvciBhIGZldyBtb3JlIHdoaWxlIHdlJ3JlIGF0IGl0Li4uCisJCXNldCByICRyb3cKKwkJZm9yIHtzZXQgbiAwfSB7JG4gPCAxMDB9IHtpbmNyIG59IHsKKwkJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyKV19IHsKKwkJCWFza2ZpbGVoaWdobGlnaHQgJHIgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQorCQkgICAgfQorCQkgICAgaW5jciByICRmaGxfZGlybgorCQkgICAgaWYgeyRyIDwgMCB8fCAkciA+PSAkbnVtY29tbWl0c30gYnJlYWsKKwkJfQorCQlmbHVzaGhpZ2hsaWdodHMKKwkgICAgfQorCSAgICBpZiB7JGZoaWdobGlnaHRzKCRyb3cpIDwgMH0geworCQlzZXQgZmhsX3JvdyAkcm93CisJCXJldHVybgorCSAgICB9CisJICAgIGlmIHskZmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhaworCX0KKwlpbmNyIHJvdyAkZmhsX2Rpcm4KKyAgICB9CisgICAgc2V0IGZobF9kaXJuIDAKKyAgICBzZWxlY3RsaW5lICRyb3cgMQorfQorCitwcm9jIG5leHRfaGlnaGxpZ2h0IHtkaXJufSB7CisgICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBmaGxfcm93IGZobF9kaXJuCisgICAgZ2xvYmFsIGhsdmlldyBmaWxlaGlnaGxpZ2h0IGZpbmRzdHJpbmcgaGlnaGxpZ2h0X3JlbGF0ZWQKKworICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgorICAgIGlmIHshKFtpbmZvIGV4aXN0cyBobHZpZXddIHx8ICRmaW5kc3RyaW5nIG5lIHt9IHx8CisJICAkaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUiIHx8IFtpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XSl9IHJldHVybgorICAgIHNldCBmaGxfcm93IFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpcm59XQorICAgIHNldCBmaGxfZGlybiAkZGlybgorICAgIG5leHRfaGxjb250Cit9CisKK3Byb2MgY2FuY2VsX25leHRfaGlnaGxpZ2h0IHt9IHsKKyAgICBnbG9iYWwgZmhsX2Rpcm4KKworICAgIHNldCBmaGxfZGlybiAwCit9CisKKyMgR3JhcGggbGF5b3V0IGZ1bmN0aW9ucworCitwcm9jIHNob3J0aWRzIHtpZHN9IHsKKyAgICBzZXQgcmVzIHt9CisgICAgZm9yZWFjaCBpZCAkaWRzIHsKKwlpZiB7W2xsZW5ndGggJGlkXSA+IDF9IHsKKwkgICAgbGFwcGVuZCByZXMgW3Nob3J0aWRzICRpZF0KKwl9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKKwkgICAgbGFwcGVuZCByZXMgW3N0cmluZyByYW5nZSAkaWQgMCA3XQorCX0gZWxzZSB7CisJICAgIGxhcHBlbmQgcmVzICRpZAorCX0KKyAgICB9CisgICAgcmV0dXJuICRyZXMKK30KKworcHJvYyBpbmNyYW5nZSB7bCB4IG99IHsKKyAgICBzZXQgbiBbbGxlbmd0aCAkbF0KKyAgICB3aGlsZSB7JHggPCAkbn0geworCXNldCBlIFtsaW5kZXggJGwgJHhdCisJaWYgeyRlIG5lIHt9fSB7CisJICAgIGxzZXQgbCAkeCBbZXhwciB7JGUgKyAkb31dCisJfQorCWluY3IgeAorICAgIH0KKyAgICByZXR1cm4gJGwKK30KKworcHJvYyBudGltZXMge24gb30geworICAgIHNldCByZXQge30KKyAgICBmb3Ige30geyRuID4gMH0ge2luY3IgbiAtMX0geworCWxhcHBlbmQgcmV0ICRvCisgICAgfQorICAgIHJldHVybiAkcmV0Cit9CisKK3Byb2MgdXNlZGlucmFuZ2Uge2lkIGwxIGwyfSB7CisgICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBjaGlsZGxpc3QgY3VydmlldworCisgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKKwlzZXQgciAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKKwlpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0geworCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCisJfQorCXNldCBraWRzIFtsaW5kZXggJGNoaWxkbGlzdCAkcl0KKyAgICB9IGVsc2UgeworCXNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCisgICAgfQorICAgIGZvcmVhY2ggYyAka2lkcyB7CisJc2V0IHIgJGNvbW1pdHJvdygkY3VydmlldywkYykKKwlpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0geworCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCisJfQorICAgIH0KKyAgICByZXR1cm4gMAorfQorCitwcm9jIHNhbml0eSB7cm93IHtmdWxsIDB9fSB7CisgICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCisKKyAgICBzZXQgY29sIC0xCisgICAgc2V0IGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KKyAgICBmb3JlYWNoIGlkICRpZHMgeworCWluY3IgY29sCisJaWYgeyRpZCBlcSB7fX0gY29udGludWUKKwlpZiB7JGNvbCA8IFtsbGVuZ3RoICRpZHNdIC0gMSAmJgorCSAgICBbbHNlYXJjaCAtZXhhY3QgLXN0YXJ0IFtleHByIHskY29sKzF9XSAkaWRzICRpZF0gPj0gMH0geworCSAgICBwdXRzICJvb3BzOiBbc2hvcnRpZHMgJGlkXSByZXBlYXRlZCBpbiByb3cgJHJvdyBjb2wgJGNvbDoge1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dfSIKKwl9CisJc2V0IG8gW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICRjb2xdCisJc2V0IHkgJHJvdworCXNldCB4ICRjb2wKKwl3aGlsZSB7JG8gbmUge319IHsKKwkgICAgaW5jciB5IC0xCisJICAgIGluY3IgeCAkbworCSAgICBpZiB7W2xpbmRleCAkcm93aWRsaXN0ICR5ICR4XSAhPSAkaWR9IHsKKwkJcHV0cyAib29wczogcm93b2Zmc2V0cyB3cm9uZyBhdCByb3cgW2V4cHIgeyR5KzF9XSBjb2wgW2V4cHIgeyR4LSRvfV0iCisJCXB1dHMgIiAgaWQ9W3Nob3J0aWRzICRpZF0gY2hlY2sgc3RhcnRlZCBhdCByb3cgJHJvdyIKKwkJZm9yIHtzZXQgaSAkcm93fSB7JGkgPj0gJHl9IHtpbmNyIGkgLTF9IHsKKwkJICAgIHB1dHMgIiAgcm93ICRpIGlkcz17W3Nob3J0aWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkaV1dfSBvZmZzPXtbbGluZGV4ICRyb3dvZmZzZXRzICRpXX0iCisJCX0KKwkJYnJlYWsKKwkgICAgfQorCSAgICBpZiB7ISRmdWxsfSBicmVhaworCSAgICBzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICR5ICR4XQorCX0KKyAgICB9Cit9CisKK3Byb2MgbWFrZXVwYXJyb3cge29pZCB4IHkgen0geworICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyB1cGFycm93bGVuIGlkcm93cmFuZ2VzCisKKyAgICBmb3Ige3NldCBpIDF9IHskaSA8ICR1cGFycm93bGVuICYmICR5ID4gMX0ge2luY3IgaX0geworCWluY3IgeSAtMQorCWluY3IgeCAkegorCXNldCBvZmYwIFtsaW5kZXggJHJvd29mZnNldHMgJHldCisJZm9yIHtzZXQgeDAgJHh9IHsxfSB7aW5jciB4MH0geworCSAgICBpZiB7JHgwID49IFtsbGVuZ3RoICRvZmYwXX0geworCQlzZXQgeDAgW2xsZW5ndGggW2xpbmRleCAkcm93b2Zmc2V0cyBbZXhwciB7JHktMX1dXV0KKwkJYnJlYWsKKwkgICAgfQorCSAgICBzZXQgeiBbbGluZGV4ICRvZmYwICR4MF0KKwkgICAgaWYgeyR6IG5lIHt9fSB7CisJCWluY3IgeDAgJHoKKwkJYnJlYWsKKwkgICAgfQorCX0KKwlzZXQgeiBbZXhwciB7JHgwIC0gJHh9XQorCWxzZXQgcm93aWRsaXN0ICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd2lkbGlzdCAkeV0gJHggJG9pZF0KKwlsc2V0IHJvd29mZnNldHMgJHkgW2xpbnNlcnQgW2xpbmRleCAkcm93b2Zmc2V0cyAkeV0gJHggJHpdCisgICAgfQorICAgIHNldCB0bXAgW2xyZXBsYWNlIFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR4IHt9XQorICAgIGxzZXQgcm93b2Zmc2V0cyAkeSBbaW5jcmFuZ2UgJHRtcCBbZXhwciB7JHgrMX1dIC0xXQorICAgIGxhcHBlbmQgaWRyb3dyYW5nZXMoJG9pZCkgJHkKK30KKworcHJvYyBpbml0bGF5b3V0IHt9IHsKKyAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyIGNvbW1pdGxpc3RlZAorICAgIGdsb2JhbCByb3dsYWlkb3V0IHJvd29wdGltCisgICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMKKyAgICBnbG9iYWwgbnVtY29tbWl0cyBjYW52eG1heCBjYW52CisgICAgZ2xvYmFsIG5leHRjb2xvcgorICAgIGdsb2JhbCBwYXJlbnRsaXN0IGNoaWxkbGlzdCBjaGlsZHJlbgorICAgIGdsb2JhbCBjb2xvcm1hcCByb3d0ZXh0eAorICAgIGdsb2JhbCBsaW5lc2VnZW5kcworCisgICAgc2V0IG51bWNvbW1pdHMgMAorICAgIHNldCBkaXNwbGF5b3JkZXIge30KKyAgICBzZXQgY29tbWl0bGlzdGVkIHt9CisgICAgc2V0IHBhcmVudGxpc3Qge30KKyAgICBzZXQgY2hpbGRsaXN0IHt9CisgICAgc2V0IHJvd3JhbmdlbGlzdCB7fQorICAgIHNldCBuZXh0Y29sb3IgMAorICAgIHNldCByb3dpZGxpc3Qge3t9fQorICAgIHNldCByb3dvZmZzZXRzIHt7fX0KKyAgICBjYXRjaCB7dW5zZXQgaWRpbmxpc3R9CisgICAgY2F0Y2gge3Vuc2V0IHJvd2Noa30KKyAgICBzZXQgcm93bGFpZG91dCAwCisgICAgc2V0IHJvd29wdGltIDAKKyAgICBzZXQgY2FudnhtYXggWyRjYW52IGNnZXQgLXdpZHRoXQorICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KKyAgICBjYXRjaCB7dW5zZXQgcm93dGV4dHh9CisgICAgY2F0Y2gge3Vuc2V0IGlkcm93cmFuZ2VzfQorICAgIHNldCBsaW5lc2VnZW5kcyB7fQorfQorCitwcm9jIHNldGNhbnZzY3JvbGwge30geworICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG51bWNvbW1pdHMgbGluZXNwYyBjYW52eG1heCBjYW52eTAKKworICAgIHNldCB5bWF4IFtleHByIHskY2FudnkwICsgKCRudW1jb21taXRzIC0gMC41KSAqICRsaW5lc3BjICsgMn1dCisgICAgJGNhbnYgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAkY2FudnhtYXggJHltYXhdCisgICAgJGNhbnYyIGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgMCAkeW1heF0KKyAgICAkY2FudjMgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQorfQorCitwcm9jIHZpc2libGVyb3dzIHt9IHsKKyAgICBnbG9iYWwgY2FudiBudW1jb21taXRzIGxpbmVzcGMKKworICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKyAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCisgICAgc2V0IGYgWyRjYW52IHl2aWV3XQorICAgIHNldCB5MCBbZXhwciB7aW50KFtsaW5kZXggJGYgMF0gKiAkeW1heCl9XQorICAgIHNldCByMCBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQorICAgIGlmIHskcjAgPCAwfSB7CisJc2V0IHIwIDAKKyAgICB9CisgICAgc2V0IHkxIFtleHByIHtpbnQoW2xpbmRleCAkZiAxXSAqICR5bWF4KX1dCisgICAgc2V0IHIxIFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCisgICAgaWYgeyRyMSA+PSAkbnVtY29tbWl0c30geworCXNldCByMSBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KKyAgICB9CisgICAgcmV0dXJuIFtsaXN0ICRyMCAkcjFdCit9CisKK3Byb2MgbGF5b3V0bW9yZSB7fSB7CisgICAgZ2xvYmFsIHJvd2xhaWRvdXQgcm93b3B0aW0gY29tbWl0aWR4IG51bWNvbW1pdHMgb3B0aW1fZGVsYXkKKyAgICBnbG9iYWwgdXBhcnJvd2xlbiBjdXJ2aWV3CisKKyAgICBzZXQgcm93ICRyb3dsYWlkb3V0CisgICAgc2V0IHJvd2xhaWRvdXQgW2xheW91dHJvd3MgJHJvdyAkY29tbWl0aWR4KCRjdXJ2aWV3KSAwXQorICAgIHNldCBvcm93IFtleHByIHskcm93bGFpZG91dCAtICR1cGFycm93bGVuIC0gMX1dCisgICAgaWYgeyRvcm93ID4gJHJvd29wdGltfSB7CisJb3B0aW1pemVfcm93cyAkcm93b3B0aW0gMCAkb3JvdworCXNldCByb3dvcHRpbSAkb3JvdworICAgIH0KKyAgICBzZXQgY2Fuc2hvdyBbZXhwciB7JHJvd29wdGltIC0gJG9wdGltX2RlbGF5fV0KKyAgICBpZiB7JGNhbnNob3cgPiAkbnVtY29tbWl0c30geworCXNob3dzdHVmZiAkY2Fuc2hvdworICAgIH0KK30KKworcHJvYyBzaG93c3R1ZmYge2NhbnNob3d9IHsKKyAgICBnbG9iYWwgbnVtY29tbWl0cyBjb21taXRyb3cgcGVuZGluZ19zZWxlY3Qgc2VsZWN0ZWRsaW5lCisgICAgZ2xvYmFsIGxpbmVzZWdlbmRzIGlkcm93cmFuZ2VzIGlkcmFuZ2VkcmF3biBjdXJ2aWV3CisKKyAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0geworCWdsb2JhbCBwaGFzZQorCXNldCBwaGFzZSAiaW5jcmRyYXciCisJYWxsY2FudnMgZGVsZXRlIGFsbAorICAgIH0KKyAgICBzZXQgcm93ICRudW1jb21taXRzCisgICAgc2V0IG51bWNvbW1pdHMgJGNhbnNob3cKKyAgICBzZXRjYW52c2Nyb2xsCisgICAgc2V0IHJvd3MgW3Zpc2libGVyb3dzXQorICAgIHNldCByMCBbbGluZGV4ICRyb3dzIDBdCisgICAgc2V0IHIxIFtsaW5kZXggJHJvd3MgMV0KKyAgICBzZXQgc2Vscm93IC0xCisgICAgZm9yIHtzZXQgciAkcm93fSB7JHIgPCAkY2Fuc2hvd30ge2luY3Igcn0geworCWZvcmVhY2ggaWQgW2xpbmRleCAkbGluZXNlZ2VuZHMgW2V4cHIgeyRyKzF9XV0geworCSAgICBzZXQgaSAtMQorCSAgICBmb3JlYWNoIHtzIGV9IFtyb3dyYW5nZXMgJGlkXSB7CisJCWluY3IgaQorCQlpZiB7JGUgbmUge30gJiYgJGUgPCAkbnVtY29tbWl0cyAmJiAkcyA8PSAkcjEgJiYgJGUgPj0gJHIwCisJCSAgICAmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0geworCQkgICAgZHJhd2xpbmVzZWcgJGlkICRpCisJCSAgICBzZXQgaWRyYW5nZWRyYXduKCRpZCwkaSkgMQorCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIHskY2Fuc2hvdyA+ICRyMX0geworCXNldCBjYW5zaG93ICRyMQorICAgIH0KKyAgICB3aGlsZSB7JHJvdyA8ICRjYW5zaG93fSB7CisJZHJhd2NtaXRyb3cgJHJvdworCWluY3Igcm93CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdICYmCisJW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpXSAmJgorCSRjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KSA8ICRudW1jb21taXRzfSB7CisJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCkgMQorICAgIH0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICFbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdfSB7CisJc2VsZWN0bGluZSAwIDEKKyAgICB9Cit9CisKK3Byb2MgbGF5b3V0cm93cyB7cm93IGVuZHJvdyBsYXN0fSB7CisgICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGRpc3BsYXlvcmRlcgorICAgIGdsb2JhbCB1cGFycm93bGVuIGRvd25hcnJvd2xlbiBtYXh3aWR0aCBtaW5nYXBsZW4KKyAgICBnbG9iYWwgY2hpbGRsaXN0IHBhcmVudGxpc3QKKyAgICBnbG9iYWwgaWRyb3dyYW5nZXMgbGluZXNlZ2VuZHMKKyAgICBnbG9iYWwgY29tbWl0aWR4IGN1cnZpZXcKKyAgICBnbG9iYWwgaWRpbmxpc3Qgcm93Y2hrIHJvd3JhbmdlbGlzdAorCisgICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KKyAgICBzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCisgICAgd2hpbGUgeyRyb3cgPCAkZW5kcm93fSB7CisJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQorCXNldCBvbGRvbGRzIHt9CisJc2V0IG5ld29sZHMge30KKwlmb3JlYWNoIHAgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XSB7CisJICAgIGlmIHshW2luZm8gZXhpc3RzIGlkaW5saXN0KCRwKV19IHsKKwkJbGFwcGVuZCBuZXdvbGRzICRwCisJICAgIH0gZWxzZWlmIHshJGlkaW5saXN0KCRwKX0geworCQlsYXBwZW5kIG9sZG9sZHMgJHAKKwkgICAgfQorCX0KKwlzZXQgbHNlIHt9CisJc2V0IG5ldiBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gKyBbbGxlbmd0aCAkbmV3b2xkc10KKwkJICAgICAgICsgW2xsZW5ndGggJG9sZG9sZHNdIC0gJG1heHdpZHRoICsgMX1dCisJaWYgeyRuZXYgPiAwfSB7CisJICAgIGlmIHshJGxhc3QgJiYKKwkJJHJvdyArICR1cGFycm93bGVuICsgJG1pbmdhcGxlbiA+PSAkY29tbWl0aWR4KCRjdXJ2aWV3KX0gYnJlYWsKKwkgICAgZm9yIHtzZXQgeCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIHggLTFdID49IDB9IHt9IHsKKwkJc2V0IGkgW2xpbmRleCAkaWRsaXN0ICR4XQorCQlpZiB7IVtpbmZvIGV4aXN0cyByb3djaGsoJGkpXSB8fCAkcm93ID49ICRyb3djaGsoJGkpfSB7CisJCSAgICBzZXQgciBbdXNlZGlucmFuZ2UgJGkgW2V4cHIgeyRyb3cgLSAkZG93bmFycm93bGVufV0gXAorCQkJICAgICAgIFtleHByIHskcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVufV1dCisJCSAgICBpZiB7JHIgPT0gMH0geworCQkJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkeCAkeF0KKwkJCXNldCBvZmZzIFtscmVwbGFjZSAkb2ZmcyAkeCAkeF0KKwkJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkeCAxXQorCQkJc2V0IGlkaW5saXN0KCRpKSAwCisJCQlzZXQgcm0xIFtleHByIHskcm93IC0gMX1dCisJCQlsYXBwZW5kIGxzZSAkaQorCQkJbGFwcGVuZCBpZHJvd3JhbmdlcygkaSkgJHJtMQorCQkJaWYge1tpbmNyIG5ldiAtMV0gPD0gMH0gYnJlYWsKKwkJCWNvbnRpbnVlCisJCSAgICB9CisJCSAgICBzZXQgcm93Y2hrKCRpZCkgW2V4cHIgeyRyb3cgKyAkcn1dCisJCX0KKwkgICAgfQorCSAgICBsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKKwkgICAgbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKKwl9CisJbGFwcGVuZCBsaW5lc2VnZW5kcyAkbHNlCisJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgJGlkbGlzdCAkaWRdCisJaWYgeyRjb2wgPCAwfSB7CisJICAgIHNldCBjb2wgW2xsZW5ndGggJGlkbGlzdF0KKwkgICAgbGFwcGVuZCBpZGxpc3QgJGlkCisJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAorCSAgICBzZXQgeiB7fQorCSAgICBpZiB7W2xpbmRleCAkY2hpbGRsaXN0ICRyb3ddIG5lIHt9fSB7CisJCXNldCB6IFtleHByIHtbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3ctMX1dXV0gLSAkY29sfV0KKwkJdW5zZXQgaWRpbmxpc3QoJGlkKQorCSAgICB9CisJICAgIGxhcHBlbmQgb2ZmcyAkegorCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcworCSAgICBpZiB7JHogbmUge319IHsKKwkJbWFrZXVwYXJyb3cgJGlkICRjb2wgJHJvdyAkegorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgdW5zZXQgaWRpbmxpc3QoJGlkKQorCX0KKwlzZXQgcmFuZ2VzIHt9CisJaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0geworCSAgICBzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCisJICAgIGxhcHBlbmQgcmFuZ2VzICRyb3cKKwkgICAgdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQorCX0KKwlsYXBwZW5kIHJvd3JhbmdlbGlzdCAkcmFuZ2VzCisJaW5jciByb3cKKwlzZXQgb2ZmcyBbbnRpbWVzIFtsbGVuZ3RoICRpZGxpc3RdIDBdCisJc2V0IGwgW2xsZW5ndGggJG5ld29sZHNdCisJc2V0IGlkbGlzdCBbZXZhbCBscmVwbGFjZSBcJGlkbGlzdCAkY29sICRjb2wgJG5ld29sZHNdCisJc2V0IG8gMAorCWlmIHskbCAhPSAxfSB7CisJICAgIHNldCBvZmZzIFtscmFuZ2UgJG9mZnMgMCBbZXhwciB7JGNvbCAtIDF9XV0KKwkgICAgZm9yZWFjaCB4ICRuZXdvbGRzIHsKKwkJbGFwcGVuZCBvZmZzIHt9CisJCWluY3IgbyAtMQorCSAgICB9CisJICAgIGluY3IgbworCSAgICBzZXQgdG1wIFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSAtIFtsbGVuZ3RoICRvZmZzXX1dCisJICAgIGlmIHskdG1wID4gMH0geworCQlzZXQgb2ZmcyBbY29uY2F0ICRvZmZzIFtudGltZXMgJHRtcCAkb11dCisJICAgIH0KKwl9IGVsc2UgeworCSAgICBsc2V0IG9mZnMgJGNvbCB7fQorCX0KKwlmb3JlYWNoIGkgJG5ld29sZHMgeworCSAgICBzZXQgaWRpbmxpc3QoJGkpIDEKKwkgICAgc2V0IGlkcm93cmFuZ2VzKCRpKSAkcm93CisJfQorCWluY3IgY29sICRsCisJZm9yZWFjaCBvaWQgJG9sZG9sZHMgeworCSAgICBzZXQgaWRpbmxpc3QoJG9pZCkgMQorCSAgICBzZXQgaWRsaXN0IFtsaW5zZXJ0ICRpZGxpc3QgJGNvbCAkb2lkXQorCSAgICBzZXQgb2ZmcyBbbGluc2VydCAkb2ZmcyAkY29sICRvXQorCSAgICBtYWtldXBhcnJvdyAkb2lkICRjb2wgJHJvdyAkbworCSAgICBpbmNyIGNvbAorCX0KKwlsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CisJbGFwcGVuZCByb3dvZmZzZXRzICRvZmZzCisgICAgfQorICAgIHJldHVybiAkcm93Cit9CisKK3Byb2MgYWRkZXh0cmFpZCB7aWQgcm93fSB7CisgICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBjb21taXRyb3cgY29tbWl0aW5mbworICAgIGdsb2JhbCBjb21taXRpZHggY29tbWl0bGlzdGVkCisgICAgZ2xvYmFsIHBhcmVudGxpc3QgY2hpbGRsaXN0IGNoaWxkcmVuIGN1cnZpZXcKKworICAgIGluY3IgY29tbWl0aWR4KCRjdXJ2aWV3KQorICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAorICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkIDAKKyAgICBsYXBwZW5kIHBhcmVudGxpc3Qge30KKyAgICBzZXQgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgJHJvdworICAgIHJlYWRjb21taXQgJGlkCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0geworCXNldCBjb21taXRpbmZvKCRpZCkgeyJObyBjb21taXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIn0KKyAgICB9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKV19IHsKKwlzZXQgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKSB7fQorICAgIH0KKyAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQorfQorCitwcm9jIGxheW91dHRhaWwge30geworICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZGlubGlzdCBjb21taXRpZHggY3VydmlldworICAgIGdsb2JhbCBpZHJvd3JhbmdlcyByb3dyYW5nZWxpc3QKKworICAgIHNldCByb3cgJGNvbW1pdGlkeCgkY3VydmlldykKKyAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQorICAgIHdoaWxlIHskaWRsaXN0IG5lIHt9fSB7CisJc2V0IGNvbCBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gLSAxfV0KKwlzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCisJYWRkZXh0cmFpZCAkaWQgJHJvdworCXVuc2V0IGlkaW5saXN0KCRpZCkKKwlsYXBwZW5kIGlkcm93cmFuZ2VzKCRpZCkgJHJvdworCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRpZHJvd3JhbmdlcygkaWQpCisJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQorCWluY3Igcm93CisJc2V0IG9mZnMgW250aW1lcyAkY29sIDBdCisJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkY29sICRjb2xdCisJbGFwcGVuZCByb3dpZGxpc3QgJGlkbGlzdAorCWxhcHBlbmQgcm93b2Zmc2V0cyAkb2ZmcworICAgIH0KKworICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIGlkaW5saXN0XSB7CisJYWRkZXh0cmFpZCAkaWQgJHJvdworCWxzZXQgcm93aWRsaXN0ICRyb3cgW2xpc3QgJGlkXQorCWxzZXQgcm93b2Zmc2V0cyAkcm93IDAKKwltYWtldXBhcnJvdyAkaWQgMCAkcm93IDAKKwlsYXBwZW5kIGlkcm93cmFuZ2VzKCRpZCkgJHJvdworCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRpZHJvd3JhbmdlcygkaWQpCisJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQorCWluY3Igcm93CisJbGFwcGVuZCByb3dpZGxpc3Qge30KKwlsYXBwZW5kIHJvd29mZnNldHMge30KKyAgICB9Cit9CisKK3Byb2MgaW5zZXJ0X3BhZCB7cm93IGNvbCBucGFkfSB7CisgICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCisKKyAgICBzZXQgcGFkIFtudGltZXMgJG5wYWQge31dCisgICAgbHNldCByb3dpZGxpc3QgJHJvdyBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV0gJGNvbCAkcGFkXQorICAgIHNldCB0bXAgW2V2YWwgbGluc2VydCBbbGlzdCBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddXSAkY29sICRwYWRdCisgICAgbHNldCByb3dvZmZzZXRzICRyb3cgW2luY3JhbmdlICR0bXAgW2V4cHIgeyRjb2wgKyAkbnBhZH1dIFtleHByIHstJG5wYWR9XV0KK30KKworcHJvYyBvcHRpbWl6ZV9yb3dzIHtyb3cgY29sIGVuZHJvd30geworICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZHJvd3JhbmdlcyBkaXNwbGF5b3JkZXIKKworICAgIGZvciB7fSB7JHJvdyA8ICRlbmRyb3d9IHtpbmNyIHJvd30geworCXNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCisJc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQorCXNldCBoYXNwYWQgMAorCWZvciB7fSB7JGNvbCA8IFtsbGVuZ3RoICRvZmZzXX0ge2luY3IgY29sfSB7CisJICAgIGlmIHtbbGluZGV4ICRpZGxpc3QgJGNvbF0gZXEge319IHsKKwkJc2V0IGhhc3BhZCAxCisJCWNvbnRpbnVlCisJICAgIH0KKwkgICAgc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQorCSAgICBpZiB7JHogZXEge319IGNvbnRpbnVlCisJICAgIHNldCBpc2Fycm93IDAKKwkgICAgc2V0IHgwIFtleHByIHskY29sICsgJHp9XQorCSAgICBzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KKwkgICAgc2V0IHowIFtsaW5kZXggJHJvd29mZnNldHMgJHkwICR4MF0KKwkgICAgaWYgeyR6MCBlcSB7fX0geworCQlzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCisJCXNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCisJCWlmIHskcmFuZ2VzIG5lIHt9ICYmICR5MCA+IFtsaW5kZXggJHJhbmdlcyAwXX0geworCQkgICAgc2V0IGlzYXJyb3cgMQorCQl9CisJICAgIH0KKwkgICAgaWYgeyR6IDwgLTEgfHwgKCR6IDwgMCAmJiAkaXNhcnJvdyl9IHsKKwkJc2V0IG5wYWQgW2V4cHIgey0xIC0gJHogKyAkaXNhcnJvd31dCisJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkY29sICRucGFkXQorCQlpbnNlcnRfcGFkICR5MCAkeDAgJG5wYWQKKwkJaWYgeyR5MCA+IDB9IHsKKwkJICAgIG9wdGltaXplX3Jvd3MgJHkwICR4MCAkcm93CisJCX0KKwkJc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQorCQlzZXQgeDAgW2V4cHIgeyRjb2wgKyAken1dCisJCXNldCB6MCBbbGluZGV4ICRyb3dvZmZzZXRzICR5MCAkeDBdCisJICAgIH0gZWxzZWlmIHskeiA+IDEgfHwgKCR6ID4gMCAmJiAkaXNhcnJvdyl9IHsKKwkJc2V0IG5wYWQgW2V4cHIgeyR6IC0gMSArICRpc2Fycm93fV0KKwkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCisJCXNldCBvZmZzMiBbbGluZGV4ICRyb3dvZmZzZXRzICR5MV0KKwkJc2V0IHgxIC0xCisJCWZvcmVhY2ggeiAkb2ZmczIgeworCQkgICAgaW5jciB4MQorCQkgICAgaWYgeyR6IGVxIHt9IHx8ICR4MSArICR6IDwgJGNvbH0gY29udGludWUKKwkJICAgIGlmIHskeDEgKyAkeiA+ICRjb2x9IHsKKwkJCWluY3IgbnBhZAorCQkgICAgfQorCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAkbnBhZF0KKwkJICAgIGJyZWFrCisJCX0KKwkJc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQorCQlzZXQgaWRsaXN0IFtldmFsIGxpbnNlcnQgXCRpZGxpc3QgJGNvbCAkcGFkXQorCQlzZXQgdG1wIFtldmFsIGxpbnNlcnQgXCRvZmZzICRjb2wgJHBhZF0KKwkJaW5jciBjb2wgJG5wYWQKKwkJc2V0IG9mZnMgW2luY3JhbmdlICR0bXAgJGNvbCBbZXhwciB7LSRucGFkfV1dCisJCXNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KKwkJc2V0IGhhc3BhZCAxCisJICAgIH0KKwkgICAgaWYgeyR6MCBlcSB7fSAmJiAhJGlzYXJyb3d9IHsKKwkJIyB0aGlzIGxpbmUgbGlua3MgdG8gaXRzIGZpcnN0IGNoaWxkIG9uIHJvdyAkcm93LTIKKwkJc2V0IHJtMiBbZXhwciB7JHJvdyAtIDJ9XQorCQlzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRybTJdCisJCXNldCB4YyBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRybTJdICRpZF0KKwkJaWYgeyR4YyA+PSAwfSB7CisJCSAgICBzZXQgejAgW2V4cHIgeyR4YyAtICR4MH1dCisJCX0KKwkgICAgfQorCSAgICBpZiB7JHowIG5lIHt9ICYmICR6IDwgMCAmJiAkejAgPiAwfSB7CisJCWluc2VydF9wYWQgJHkwICR4MCAxCisJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkY29sIDFdCisJCW9wdGltaXplX3Jvd3MgJHkwIFtleHByIHskeDAgKyAxfV0gJHJvdworCSAgICB9CisJfQorCWlmIHshJGhhc3BhZH0geworCSAgICBzZXQgbyB7fQorCSAgICBmb3Ige3NldCBjb2wgW2xsZW5ndGggJGlkbGlzdF19IHtbaW5jciBjb2wgLTFdID49IDB9IHt9IHsKKwkJc2V0IG8gW2xpbmRleCAkb2ZmcyAkY29sXQorCQlpZiB7JG8gZXEge319IHsKKwkJICAgICMgY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGluayB0byB0aGUgZmlyc3QgY2hpbGQKKwkJICAgIHNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KKwkJICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCisJCSAgICBpZiB7JHJhbmdlcyBuZSB7fSAmJiAkcm93ID09IFtsaW5kZXggJHJhbmdlcyAwXX0geworCQkJIyBpdCBpcywgd29yayBvdXQgb2Zmc2V0IHRvIGNoaWxkCisJCQlzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KKwkJCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHkwXQorCQkJc2V0IHgwIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHkwXSAkaWRdCisJCQlpZiB7JHgwID49IDB9IHsKKwkJCSAgICBzZXQgbyBbZXhwciB7JHgwIC0gJGNvbH1dCisJCQl9CisJCSAgICB9CisJCX0KKwkJaWYgeyRvIGVxIHt9IHx8ICRvIDw9IDB9IGJyZWFrCisJICAgIH0KKwkgICAgaWYgeyRvIG5lIHt9ICYmIFtpbmNyIGNvbF0gPCBbbGxlbmd0aCAkaWRsaXN0XX0geworCQlzZXQgeTEgW2V4cHIgeyRyb3cgKyAxfV0KKwkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQorCQlzZXQgeDEgLTEKKwkJZm9yZWFjaCB6ICRvZmZzMiB7CisJCSAgICBpbmNyIHgxCisJCSAgICBpZiB7JHogZXEge30gfHwgJHgxICsgJHogPCAkY29sfSBjb250aW51ZQorCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAxXQorCQkgICAgYnJlYWsKKwkJfQorCQlzZXQgaWRsaXN0IFtsaW5zZXJ0ICRpZGxpc3QgJGNvbCB7fV0KKwkJc2V0IHRtcCBbbGluc2VydCAkb2ZmcyAkY29sIHt9XQorCQlpbmNyIGNvbAorCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIC0xXQorCSAgICB9CisJfQorCWxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAorCWxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCisJc2V0IGNvbCAwCisgICAgfQorfQorCitwcm9jIHhjIHtyb3cgY29sfSB7CisgICAgZ2xvYmFsIGNhbnZ4MCBsaW5lc3BjCisgICAgcmV0dXJuIFtleHByIHskY2FudngwICsgJGNvbCAqICRsaW5lc3BjfV0KK30KKworcHJvYyB5YyB7cm93fSB7CisgICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjCisgICAgcmV0dXJuIFtleHByIHskY2FudnkwICsgJHJvdyAqICRsaW5lc3BjfV0KK30KKworcHJvYyBsaW5ld2lkdGgge2lkfSB7CisgICAgZ2xvYmFsIHRoaWNrZXJsaW5lIGx0aGlja25lc3MKKworICAgIHNldCB3aWQgJGx0aGlja25lc3MKKyAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXSAmJiAkaWQgZXEgJHRoaWNrZXJsaW5lfSB7CisJc2V0IHdpZCBbZXhwciB7MiAqICRsdGhpY2tuZXNzfV0KKyAgICB9CisgICAgcmV0dXJuICR3aWQKK30KKworcHJvYyByb3dyYW5nZXMge2lkfSB7CisgICAgZ2xvYmFsIHBoYXNlIGlkcm93cmFuZ2VzIGNvbW1pdHJvdyByb3dsYWlkb3V0IHJvd3JhbmdlbGlzdCBjdXJ2aWV3CisKKyAgICBzZXQgcmFuZ2VzIHt9CisgICAgaWYgeyRwaGFzZSBlcSB7fSB8fAorCShbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCisJICYmICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSA8ICRyb3dsYWlkb3V0KX0geworCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KKyAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGlkcm93cmFuZ2VzKCRpZCldfSB7CisJc2V0IHJhbmdlcyAkaWRyb3dyYW5nZXMoJGlkKQorICAgIH0KKyAgICByZXR1cm4gJHJhbmdlcworfQorCitwcm9jIGRyYXdsaW5lc2VnIHtpZCBpfSB7CisgICAgZ2xvYmFsIHJvd29mZnNldHMgcm93aWRsaXN0CisgICAgZ2xvYmFsIGRpc3BsYXlvcmRlcgorICAgIGdsb2JhbCBjYW52IGNvbG9ybWFwIGxpbmVzcGMKKyAgICBnbG9iYWwgbnVtY29tbWl0cyBjb21taXRyb3cgY3VydmlldworCisgICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KKyAgICBzZXQgZG93bmFycm93IDEKKyAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXQorCSYmICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSA8ICRudW1jb21taXRzfSB7CisJc2V0IGRvd25hcnJvdyBbZXhwciB7JGkgPCBbbGxlbmd0aCAkcmFuZ2VzXSAvIDIgLSAxfV0KKyAgICB9IGVsc2UgeworCXNldCBkb3duYXJyb3cgMQorICAgIH0KKyAgICBzZXQgc3RhcnRyb3cgW2xpbmRleCAkcmFuZ2VzIFtleHByIHsyICogJGl9XV0KKyAgICBzZXQgcm93IFtsaW5kZXggJHJhbmdlcyBbZXhwciB7MiAqICRpICsgMX1dXQorICAgIGlmIHskc3RhcnRyb3cgPT0gJHJvd30gcmV0dXJuCisgICAgYXNzaWduY29sb3IgJGlkCisgICAgc2V0IGNvb3JkcyB7fQorICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdCisgICAgaWYgeyRjb2wgPCAwfSB7CisJcHV0cyAib29wczogZHJhd2xpbmU6IGlkICRpZCBub3Qgb24gcm93ICRyb3ciCisJcmV0dXJuCisgICAgfQorICAgIHNldCBsYXN0byB7fQorICAgIHNldCBucyAwCisgICAgd2hpbGUgezF9IHsKKwlzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KKwlpZiB7JG8gZXEge319IGJyZWFrCisJaWYgeyRvIG5lICRsYXN0b30geworCSAgICAjIGNoYW5naW5nIGRpcmVjdGlvbgorCSAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQorCSAgICBzZXQgeSBbeWMgJHJvd10KKwkgICAgbGFwcGVuZCBjb29yZHMgJHggJHkKKwkgICAgc2V0IGxhc3RvICRvCisJfQorCWluY3IgY29sICRvCisJaW5jciByb3cgLTEKKyAgICB9CisgICAgc2V0IHggW3hjICRyb3cgJGNvbF0KKyAgICBzZXQgeSBbeWMgJHJvd10KKyAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQorICAgIGlmIHskaSA9PSAwfSB7CisJIyBkcmF3IHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZCBhcyBwYXJ0IG9mIHRoaXMgbGluZQorCWluY3Igcm93IC0xCisJc2V0IGNoaWxkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQorCXNldCBjY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGNoaWxkXQorCWlmIHskY2NvbCA+PSAwfSB7CisJICAgIHNldCB4IFt4YyAkcm93ICRjY29sXQorCSAgICBzZXQgeSBbeWMgJHJvd10KKwkgICAgaWYgeyRjY29sIDwgJGNvbCAtIDF9IHsKKwkJbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRjb2wgLSAxfV1dIFt5YyAkcm93XQorCSAgICB9IGVsc2VpZiB7JGNjb2wgPiAkY29sICsgMX0geworCQlsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGNvbCArIDF9XV0gW3ljICRyb3ddCisJICAgIH0KKwkgICAgbGFwcGVuZCBjb29yZHMgJHggJHkKKwl9CisgICAgfQorICAgIGlmIHtbbGxlbmd0aCAkY29vcmRzXSA8IDR9IHJldHVybgorICAgIGlmIHskZG93bmFycm93fSB7CisJIyBUaGlzIGxpbmUgaGFzIGFuIGFycm93IGF0IHRoZSBsb3dlciBlbmQ6IGNoZWNrIGlmIHRoZSBhcnJvdyBpcworCSMgb24gYSBkaWFnb25hbCBzZWdtZW50LCBhbmQgaWYgc28sIHdvcmsgYXJvdW5kIHRoZSBUayA4LjQKKwkjIHJlZnVzYWwgdG8gZHJhdyBhcnJvd3Mgb24gZGlhZ29uYWwgbGluZXMuCisJc2V0IHgwIFtsaW5kZXggJGNvb3JkcyAwXQorCXNldCB4MSBbbGluZGV4ICRjb29yZHMgMl0KKwlpZiB7JHgwICE9ICR4MX0geworCSAgICBzZXQgeTAgW2xpbmRleCAkY29vcmRzIDFdCisJICAgIHNldCB5MSBbbGluZGV4ICRjb29yZHMgM10KKwkgICAgaWYgeyR5MCAtICR5MSA8PSAyICogJGxpbmVzcGMgJiYgJHgxID09IFtsaW5kZXggJGNvb3JkcyA0XX0geworCQkjIHdlIGhhdmUgYSBuZWFyYnkgdmVydGljYWwgc2VnbWVudCwganVzdCB0cmltIG9mZiB0aGUgZGlhZyBiaXQKKwkJc2V0IGNvb3JkcyBbbHJhbmdlICRjb29yZHMgMiBlbmRdCisJICAgIH0gZWxzZSB7CisJCXNldCBzbG9wZSBbZXhwciB7KCR4MCAtICR4MSkgLyAoJHkwIC0gJHkxKX1dCisJCXNldCB4aSBbZXhwciB7JHgwIC0gJHNsb3BlICogJGxpbmVzcGMgLyAyfV0KKwkJc2V0IHlpIFtleHByIHskeTAgLSAkbGluZXNwYyAvIDJ9XQorCQlzZXQgY29vcmRzIFtscmVwbGFjZSAkY29vcmRzIDAgMSAkeGkgJHkwICR4aSAkeWldCisJICAgIH0KKwl9CisgICAgfQorICAgIHNldCBhcnJvdyBbZXhwciB7MiAqICgkaSA+IDApICsgJGRvd25hcnJvd31dCisgICAgc2V0IGFycm93IFtsaW5kZXgge25vbmUgZmlyc3QgbGFzdCBib3RofSAkYXJyb3ddCisgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLXdpZHRoIFtsaW5ld2lkdGggJGlkXSBcCisJICAgICAgIC1maWxsICRjb2xvcm1hcCgkaWQpIC10YWdzIGxpbmVzLiRpZCAtYXJyb3cgJGFycm93XQorICAgICRjYW52IGxvd2VyICR0CisgICAgYmluZGxpbmUgJHQgJGlkCit9CisKK3Byb2MgZHJhd3BhcmVudGxpbmtzIHtpZCByb3cgY29sIG9sZHN9IHsKKyAgICBnbG9iYWwgcm93aWRsaXN0IGNhbnYgY29sb3JtYXAKKworICAgIHNldCByb3cyIFtleHByIHskcm93ICsgMX1dCisgICAgc2V0IHggW3hjICRyb3cgJGNvbF0KKyAgICBzZXQgeSBbeWMgJHJvd10KKyAgICBzZXQgeTIgW3ljICRyb3cyXQorICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3cyXQorICAgICMgcm14ID0gcmlnaHQtbW9zdCBYIGNvb3JkIHVzZWQKKyAgICBzZXQgcm14IDAKKyAgICBmb3JlYWNoIHAgJG9sZHMgeworCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRzICRwXQorCWlmIHskaSA8IDB9IHsKKwkgICAgcHV0cyAib29wcywgcGFyZW50ICRwIG9mICRpZCBub3QgaW4gbGlzdCIKKwkgICAgY29udGludWUKKwl9CisJc2V0IHgyIFt4YyAkcm93MiAkaV0KKwlpZiB7JHgyID4gJHJteH0geworCSAgICBzZXQgcm14ICR4MgorCX0KKwlzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJHBdCisJaWYgeyRyYW5nZXMgbmUge30gJiYgJHJvdzIgPT0gW2xpbmRleCAkcmFuZ2VzIDBdCisJICAgICYmICRyb3cyIDwgW2xpbmRleCAkcmFuZ2VzIDFdfSB7CisJICAgICMgZHJhd2xpbmVzZWcgd2lsbCBkbyB0aGlzIG9uZSBmb3IgdXMKKwkgICAgY29udGludWUKKwl9CisJYXNzaWduY29sb3IgJHAKKwkjIHNob3VsZCBoYW5kbGUgZHVwbGljYXRlZCBwYXJlbnRzIGhlcmUuLi4KKwlzZXQgY29vcmRzIFtsaXN0ICR4ICR5XQorCWlmIHskaSA8ICRjb2wgLSAxfSB7CisJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSArIDF9XV0gJHkKKwl9IGVsc2VpZiB7JGkgPiAkY29sICsgMX0geworCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGkgLSAxfV1dICR5CisJfQorCWxhcHBlbmQgY29vcmRzICR4MiAkeTIKKwlzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtd2lkdGggW2xpbmV3aWR0aCAkcF0gXAorCQkgICAtZmlsbCAkY29sb3JtYXAoJHApIC10YWdzIGxpbmVzLiRwXQorCSRjYW52IGxvd2VyICR0CisJYmluZGxpbmUgJHQgJHAKKyAgICB9CisgICAgcmV0dXJuICRybXgKK30KKworcHJvYyBkcmF3bGluZXMge2lkfSB7CisgICAgZ2xvYmFsIGNvbG9ybWFwIGNhbnYKKyAgICBnbG9iYWwgaWRyYW5nZWRyYXduCisgICAgZ2xvYmFsIGNoaWxkcmVuIGlkZHJhd24gY29tbWl0cm93IHJvd2lkbGlzdCBjdXJ2aWV3CisKKyAgICAkY2FudiBkZWxldGUgbGluZXMuJGlkCisgICAgc2V0IG5yIFtleHByIHtbbGxlbmd0aCBbcm93cmFuZ2VzICRpZF1dIC8gMn1dCisgICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnJ9IHtpbmNyIGl9IHsKKwlpZiB7W2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0geworCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKKwl9CisgICAgfQorICAgIGZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkgeworCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkY2hpbGQpXX0geworCSAgICBzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKQorCSAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGNoaWxkXQorCSAgICBpZiB7JGNvbCA+PSAwfSB7CisJCWRyYXdwYXJlbnRsaW5rcyAkY2hpbGQgJHJvdyAkY29sIFtsaXN0ICRpZF0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3Byb2MgZHJhd2NtaXR0ZXh0IHtpZCByb3cgY29sIHJteH0geworICAgIGdsb2JhbCBsaW5lc3BjIGNhbnYgY2FudjIgY2FudjMgY2FudnkwCisgICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBjb21taXRpbmZvIHJvd2lkbGlzdAorICAgIGdsb2JhbCByb3d0ZXh0eCBpZHBvcyBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcworICAgIGdsb2JhbCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZworICAgIGdsb2JhbCBtYWluZm9udCBjYW52eG1heCBib2xkcm93cyBib2xkbmFtZXJvd3MKKworICAgIHNldCBvZmlsbCBbZXhwciB7W2xpbmRleCAkY29tbWl0bGlzdGVkICRyb3ddPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQorICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCisgICAgc2V0IHkgW3ljICRyb3ddCisgICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCisgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBvdmFsIFtleHByIHskeCAtICRvcmFkfV0gW2V4cHIgeyR5IC0gJG9yYWR9XSBcCisJICAgICAgIFtleHByIHskeCArICRvcmFkIC0gMX1dIFtleHByIHskeSArICRvcmFkIC0gMX1dIFwKKwkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxXQorICAgICRjYW52IHJhaXNlICR0CisgICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQorICAgIHNldCB4dCBbeGMgJHJvdyBbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dXQorICAgIGlmIHskeHQgPCAkcm14fSB7CisJc2V0IHh0ICRybXgKKyAgICB9CisgICAgc2V0IHJvd3RleHR4KCRyb3cpICR4dAorICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeV0KKyAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXQorCXx8IFtpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0geworCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeV0KKyAgICB9CisgICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQorICAgIHNldCBuYW1lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAxXQorICAgIHNldCBkYXRlIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAyXQorICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlICRkYXRlXQorICAgIHNldCBmb250ICRtYWluZm9udAorICAgIHNldCBuZm9udCAkbWFpbmZvbnQKKyAgICBzZXQgaXNib2xkIFtpc2hpZ2hsaWdodGVkICRyb3ddCisgICAgaWYgeyRpc2JvbGQgPiAwfSB7CisJbGFwcGVuZCBib2xkcm93cyAkcm93CisJbGFwcGVuZCBmb250IGJvbGQKKwlpZiB7JGlzYm9sZCA+IDF9IHsKKwkgICAgbGFwcGVuZCBib2xkbmFtZXJvd3MgJHJvdworCSAgICBsYXBwZW5kIG5mb250IGJvbGQKKwl9CisgICAgfQorICAgIHNldCBsaW5laHRhZygkcm93KSBbJGNhbnYgY3JlYXRlIHRleHQgJHh0ICR5IC1hbmNob3IgdyBcCisJCQkgICAgLXRleHQgJGhlYWRsaW5lIC1mb250ICRmb250XQorICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRyb3cpIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgorICAgIHNldCBsaW5lbnRhZygkcm93KSBbJGNhbnYyIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IFwKKwkJCSAgICAtdGV4dCAkbmFtZSAtZm9udCAkbmZvbnRdCisgICAgc2V0IGxpbmVkdGFnKCRyb3cpIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeSAtYW5jaG9yIHcgXAorCQkJICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udF0KKyAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICRoZWFkbGluZV19XQorICAgIGlmIHskeHIgPiAkY2FudnhtYXh9IHsKKwlzZXQgY2FudnhtYXggJHhyCisJc2V0Y2FudnNjcm9sbAorICAgIH0KK30KKworcHJvYyBkcmF3Y21pdHJvdyB7cm93fSB7CisgICAgZ2xvYmFsIGRpc3BsYXlvcmRlciByb3dpZGxpc3QKKyAgICBnbG9iYWwgaWRyYW5nZWRyYXduIGlkZHJhd24KKyAgICBnbG9iYWwgY29tbWl0aW5mbyBwYXJlbnRsaXN0IG51bWNvbW1pdHMKKyAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaW5kc3RyaW5nIG5oaWdobGlnaHRzCisgICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cworICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZCByaGlnaGxpZ2h0cworCisgICAgaWYgeyRyb3cgPj0gJG51bWNvbW1pdHN9IHJldHVybgorICAgIGZvcmVhY2ggaWQgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddIHsKKwlpZiB7JGlkIGVxIHt9fSBjb250aW51ZQorCXNldCBpIC0xCisJZm9yZWFjaCB7cyBlfSBbcm93cmFuZ2VzICRpZF0geworCSAgICBpbmNyIGkKKwkgICAgaWYgeyRyb3cgPCAkc30gY29udGludWUKKwkgICAgaWYgeyRlIGVxIHt9fSBicmVhaworCSAgICBpZiB7JHJvdyA8PSAkZX0geworCQlpZiB7JGUgPCAkbnVtY29tbWl0cyAmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0geworCQkgICAgZHJhd2xpbmVzZWcgJGlkICRpCisJCSAgICBzZXQgaWRyYW5nZWRyYXduKCRpZCwkaSkgMQorCQl9CisJCWJyZWFrCisJICAgIH0KKwl9CisgICAgfQorCisgICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQorICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAhW2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXX0geworCWFza3ZoaWdobGlnaHQgJHJvdyAkaWQKKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XSAmJiAhW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXX0geworCWFza2ZpbGVoaWdobGlnaHQgJHJvdyAkaWQKKyAgICB9CisgICAgaWYgeyRmaW5kc3RyaW5nIG5lIHt9ICYmICFbaW5mbyBleGlzdHMgbmhpZ2hsaWdodHMoJHJvdyldfSB7CisJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAorICAgIH0KKyAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIiAmJiAhW2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXX0geworCWFza3JlbGhpZ2hsaWdodCAkcm93ICRpZAorICAgIH0KKyAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHJldHVybgorICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdCisgICAgaWYgeyRjb2wgPCAwfSB7CisJcHV0cyAib29wcywgcm93ICRyb3cgaWQgJGlkIG5vdCBpbiBsaXN0IgorCXJldHVybgorICAgIH0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CisJZ2V0Y29tbWl0ICRpZAorICAgIH0KKyAgICBhc3NpZ25jb2xvciAkaWQKKyAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCisgICAgaWYgeyRvbGRzIG5lIHt9fSB7CisJc2V0IHJteCBbZHJhd3BhcmVudGxpbmtzICRpZCAkcm93ICRjb2wgJG9sZHNdCisgICAgfSBlbHNlIHsKKwlzZXQgcm14IDAKKyAgICB9CisgICAgZHJhd2NtaXR0ZXh0ICRpZCAkcm93ICRjb2wgJHJteAorICAgIHNldCBpZGRyYXduKCRpZCkgMQorfQorCitwcm9jIGRyYXdmcmFjIHtmMCBmMX0geworICAgIGdsb2JhbCBudW1jb21taXRzIGNhbnYKKyAgICBnbG9iYWwgbGluZXNwYworCisgICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQorICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KKyAgICBzZXQgeTAgW2V4cHIge2ludCgkZjAgKiAkeW1heCl9XQorICAgIHNldCByb3cgW2V4cHIge2ludCgoJHkwIC0gMykgLyAkbGluZXNwYykgLSAxfV0KKyAgICBpZiB7JHJvdyA8IDB9IHsKKwlzZXQgcm93IDAKKyAgICB9CisgICAgc2V0IHkxIFtleHByIHtpbnQoJGYxICogJHltYXgpfV0KKyAgICBzZXQgZW5kcm93IFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCisgICAgaWYgeyRlbmRyb3cgPj0gJG51bWNvbW1pdHN9IHsKKwlzZXQgZW5kcm93IFtleHByIHskbnVtY29tbWl0cyAtIDF9XQorICAgIH0KKyAgICBmb3Ige30geyRyb3cgPD0gJGVuZHJvd30ge2luY3Igcm93fSB7CisJZHJhd2NtaXRyb3cgJHJvdworICAgIH0KK30KKworcHJvYyBkcmF3dmlzaWJsZSB7fSB7CisgICAgZ2xvYmFsIGNhbnYKKyAgICBldmFsIGRyYXdmcmFjIFskY2FudiB5dmlld10KK30KKworcHJvYyBjbGVhcl9kaXNwbGF5IHt9IHsKKyAgICBnbG9iYWwgaWRkcmF3biBpZHJhbmdlZHJhd24KKyAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKKworICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKKyAgICBjYXRjaCB7dW5zZXQgaWRkcmF3bn0KKyAgICBjYXRjaCB7dW5zZXQgaWRyYW5nZWRyYXdufQorICAgIGNhdGNoIHt1bnNldCB2aGlnaGxpZ2h0c30KKyAgICBjYXRjaCB7dW5zZXQgZmhpZ2hsaWdodHN9CisgICAgY2F0Y2gge3Vuc2V0IG5oaWdobGlnaHRzfQorICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KK30KKworcHJvYyBmaW5kY3Jvc3NpbmdzIHtpZH0geworICAgIGdsb2JhbCByb3dpZGxpc3QgcGFyZW50bGlzdCBudW1jb21taXRzIHJvd29mZnNldHMgZGlzcGxheW9yZGVyCisKKyAgICBzZXQgY3Jvc3Mge30KKyAgICBzZXQgY2Nyb3NzIHt9CisgICAgZm9yZWFjaCB7cyBlfSBbcm93cmFuZ2VzICRpZF0geworCWlmIHskZSA+PSAkbnVtY29tbWl0c30geworCSAgICBzZXQgZSBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KKwl9CisJaWYgeyRlIDw9ICRzfSBjb250aW51ZQorCXNldCB4IFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJGVdICRpZF0KKwlpZiB7JHggPCAwfSB7CisJICAgIHB1dHMgImZpbmRjcm9zc2luZ3M6IG9vcHMsIG5vIFtzaG9ydGlkcyAkaWRdIGluIHJvdyAkZSIKKwkgICAgY29udGludWUKKwl9CisJZm9yIHtzZXQgcm93ICRlfSB7W2luY3Igcm93IC0xXSA+PSAkc30ge30geworCSAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCisJICAgIHNldCBraWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCisJICAgIHNldCBraWR4IFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGtpZF0KKwkgICAgaWYgeyRraWR4IDwgMH0gY29udGludWUKKwkgICAgc2V0IG5leHRyb3cgW2xpbmRleCAkcm93aWRsaXN0IFtleHByIHskcm93ICsgMX1dXQorCSAgICBmb3JlYWNoIHAgJG9sZHMgeworCQlzZXQgcHggW2xzZWFyY2ggLWV4YWN0ICRuZXh0cm93ICRwXQorCQlpZiB7JHB4IDwgMH0gY29udGludWUKKwkJaWYgeygka2lkeCA8ICR4ICYmICR4IDwgJHB4KSB8fCAoJHB4IDwgJHggJiYgJHggPCAka2lkeCl9IHsKKwkJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGNjcm9zcyAkcF0gPj0gMH0gY29udGludWUKKwkJICAgIGlmIHskeCA9PSAkcHggKyAoJGtpZHggPCAkcHg/IC0xOiAxKX0geworCQkJbGFwcGVuZCBjY3Jvc3MgJHAKKwkJICAgIH0gZWxzZWlmIHtbbHNlYXJjaCAtZXhhY3QgJGNyb3NzICRwXSA8IDB9IHsKKwkJCWxhcHBlbmQgY3Jvc3MgJHAKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIHNldCBpbmMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICR4XQorCSAgICBpZiB7JGluYyBlcSB7fX0gYnJlYWsKKwkgICAgaW5jciB4ICRpbmMKKwl9CisgICAgfQorICAgIHJldHVybiBbY29uY2F0ICRjY3Jvc3Mge3t9fSAkY3Jvc3NdCit9CisKK3Byb2MgYXNzaWduY29sb3Ige2lkfSB7CisgICAgZ2xvYmFsIGNvbG9ybWFwIGNvbG9ycyBuZXh0Y29sb3IKKyAgICBnbG9iYWwgY29tbWl0cm93IHBhcmVudGxpc3QgY2hpbGRyZW4gY2hpbGRyZW4gY3VydmlldworCisgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXX0gcmV0dXJuCisgICAgc2V0IG5jb2xvcnMgW2xsZW5ndGggJGNvbG9yc10KKyAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCldfSB7CisJc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKKyAgICB9IGVsc2UgeworCXNldCBraWRzIHt9CisgICAgfQorICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPT0gMX0geworCXNldCBjaGlsZCBbbGluZGV4ICRraWRzIDBdCisJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQorCSAgICAmJiBbbGxlbmd0aCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKV1dID09IDF9IHsKKwkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKyAgICBzZXQgYmFkY29sb3JzIHt9CisgICAgc2V0IG9yaWdiYWQge30KKyAgICBmb3JlYWNoIHggW2ZpbmRjcm9zc2luZ3MgJGlkXSB7CisJaWYgeyR4IGVxIHt9fSB7CisJICAgICMgZGVsaW1pdGVyIGJldHdlZW4gY29ybmVyIGNyb3NzaW5ncyBhbmQgb3RoZXIgY3Jvc3NpbmdzCisJICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9ycyAtIDF9IGJyZWFrCisJICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKKwl9CisJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCisJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkeCldIDwgMH0geworCSAgICBsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCisJfQorICAgIH0KKyAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKKwlzZXQgYmFkY29sb3JzICRvcmlnYmFkCisgICAgfQorICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKKyAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKKwlmb3JlYWNoIGNoaWxkICRraWRzIHsKKwkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQorCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKV0gPCAwfSB7CisJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpCisJICAgIH0KKwkgICAgZm9yZWFjaCBwIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpXSB7CisJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQorCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKV0gPCAwfSB7CisJCSAgICBsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHApCisJCX0KKwkgICAgfQorCX0KKwlpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKKwkgICAgc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAorCX0KKyAgICB9CisgICAgZm9yIHtzZXQgaSAwfSB7JGkgPD0gJG5jb2xvcnN9IHtpbmNyIGl9IHsKKwlzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KKwlpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30geworCSAgICBzZXQgbmV4dGNvbG9yIDAKKwl9CisJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKKyAgICB9CisgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKK30KKworcHJvYyBiaW5kbGluZSB7dCBpZH0geworICAgIGdsb2JhbCBjYW52CisKKyAgICAkY2FudiBiaW5kICR0IDxFbnRlcj4gImxpbmVlbnRlciAleCAleSAkaWQiCisgICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCisgICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgorICAgICRjYW52IGJpbmQgJHQgPEJ1dHRvbi0xPiAibGluZWNsaWNrICV4ICV5ICRpZCAxIgorfQorCitwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CisgICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCisgICAgZ2xvYmFsIGxpbmVzcGMgbHRoaWNrbmVzcworICAgIGdsb2JhbCBjYW52IG1haW5mb250IGNvbW1pdHJvdyByb3d0ZXh0eCBjdXJ2aWV3CisKKyAgICBzZXQgbWFya3Mge30KKyAgICBzZXQgbnRhZ3MgMAorICAgIHNldCBuaGVhZHMgMAorICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CisJc2V0IG1hcmtzICRpZHRhZ3MoJGlkKQorCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0geworCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQorCXNldCBuaGVhZHMgW2xsZW5ndGggJGlkaGVhZHMoJGlkKV0KKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0geworCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRvdGhlcnJlZnMoJGlkKV0KKyAgICB9CisgICAgaWYgeyRtYXJrcyBlcSB7fX0geworCXJldHVybiAkeHQKKyAgICB9CisKKyAgICBzZXQgZGVsdGEgW2V4cHIge2ludCgwLjUgKiAoJGxpbmVzcGMgLSAkbHRoaWNrbmVzcykpfV0KKyAgICBzZXQgeXQgW2V4cHIgeyR5MSAtIDAuNSAqICRsaW5lc3BjfV0KKyAgICBzZXQgeWIgW2V4cHIgeyR5dCArICRsaW5lc3BjIC0gMX1dCisgICAgc2V0IHh2YWxzIHt9CisgICAgc2V0IHd2YWxzIHt9CisgICAgZm9yZWFjaCB0YWcgJG1hcmtzIHsKKwlzZXQgd2lkIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0YWddCisJbGFwcGVuZCB4dmFscyAkeHQKKwlsYXBwZW5kIHd2YWxzICR3aWQKKwlzZXQgeHQgW2V4cHIgeyR4dCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzcyArICRsaW5lc3BjfV0KKyAgICB9CisgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICR4ICR5MSBbbGluZGV4ICR4dmFscyBlbmRdICR5MSBcCisJICAgICAgIC13aWR0aCAkbHRoaWNrbmVzcyAtZmlsbCBibGFjayAtdGFncyB0YWcuJGlkXQorICAgICRjYW52IGxvd2VyICR0CisgICAgZm9yZWFjaCB0YWcgJG1hcmtzIHggJHh2YWxzIHdpZCAkd3ZhbHMgeworCXNldCB4bCBbZXhwciB7JHggKyAkZGVsdGF9XQorCXNldCB4ciBbZXhwciB7JHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3N9XQorCWlmIHtbaW5jciBudGFncyAtMV0gPj0gMH0geworCSAgICAjIGRyYXcgYSB0YWcKKwkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBwb2x5Z29uICR4IFtleHByIHskeXQgKyAkZGVsdGF9XSAkeGwgJHl0IFwKKwkJICAgICAgICR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByIHskeWIgLSAkZGVsdGF9XSBcCisJCSAgICAgICAtd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCB5ZWxsb3cgLXRhZ3MgdGFnLiRpZF0KKwkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCisJICAgIHNldCByb3d0ZXh0eCgkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCisJfSBlbHNlIHsKKwkgICAgIyBkcmF3IGEgaGVhZCBvciBvdGhlciByZWYKKwkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0geworCQlzZXQgY29sIGdyZWVuCisJICAgIH0gZWxzZSB7CisJCXNldCBjb2wgIiNkZGRkZmYiCisJICAgIH0KKwkgICAgc2V0IHhsIFtleHByIHskeGwgLSAkZGVsdGEvMn1dCisJICAgICRjYW52IGNyZWF0ZSBwb2x5Z29uICR4ICR5dCAkeHIgJHl0ICR4ciAkeWIgJHggJHliIFwKKwkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCisJICAgIGlmIHtbcmVnZXhwIHteKHJlbW90ZXMvLiovfHJlbW90ZXMvKX0gJHRhZyBtYXRjaCByZW1vdGVwcmVmaXhdfSB7CisJICAgICAgICBzZXQgcndpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkcmVtb3RlcHJlZml4XQorCQlzZXQgeGkgW2V4cHIgeyR4ICsgMX1dCisJCXNldCB5dGkgW2V4cHIgeyR5dCArIDF9XQorCQlzZXQgeHJpIFtleHByIHskeCArICRyd2lkfV0KKwkJJGNhbnYgY3JlYXRlIHBvbHlnb24gJHhpICR5dGkgJHhyaSAkeXRpICR4cmkgJHliICR4aSAkeWIgXAorCQkJLXdpZHRoIDAgLWZpbGwgIiNmZmRkYWEiIC10YWdzIHRhZy4kaWQKKwkgICAgfQorCX0KKwlzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyBcCisJCSAgIC1mb250ICRtYWluZm9udCAtdGFncyB0YWcuJGlkXQorCWlmIHskbnRhZ3MgPj0gMH0geworCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KKwl9CisgICAgfQorICAgIHJldHVybiAkeHQKK30KKworcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKKyAgICBnbG9iYWwgY2FudngwIHhzcGMxIHhzcGMyCisKKyAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQorICAgIGlmIHskaSA+IDAgJiYgJGkgPT0gJGxldmVsfSB7CisJc2V0IHggW2V4cHIgeyR4ICsgMC41ICogKCR4c3BjMiAtICR4c3BjMSgkbG4pKX1dCisgICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CisJc2V0IHggW2V4cHIgeyR4ICsgJHhzcGMyIC0gJHhzcGMxKCRsbil9XQorICAgIH0KKyAgICByZXR1cm4gJHgKK30KKworcHJvYyBzaG93X3N0YXR1cyB7bXNnfSB7CisgICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQKKworICAgIGNsZWFyX2Rpc3BsYXkKKyAgICAkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAkbXNnIC1mb250ICRtYWluZm9udCAtdGFncyB0ZXh0aXRlbXMKK30KKworcHJvYyBmaW5pc2hjb21taXRzIHt9IHsKKyAgICBnbG9iYWwgY29tbWl0aWR4IHBoYXNlIGN1cnZpZXcKKyAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IKKyAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MgcGVuZGluZ19zZWxlY3QKKworICAgIGlmIHskY29tbWl0aWR4KCRjdXJ2aWV3KSA+IDB9IHsKKwlkcmF3cmVzdAorICAgIH0gZWxzZSB7CisJc2hvd19zdGF0dXMgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiCisgICAgfQorICAgIHNldCBwaGFzZSB7fQorICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KK30KKworIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKKyMgc2hvd2luZyB0aGF0IHdlIGFyZSBvdmVyIGEgc2hhMSBJRCBsaW5rLgorcHJvYyBzZXR0ZXh0Y3Vyc29yIHtjfSB7CisgICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKKworICAgIGlmIHtbJGN0ZXh0IGNnZXQgLWN1cnNvcl0gPT0gJGN1cnRleHRjdXJzb3J9IHsKKwkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKKyAgICB9CisgICAgc2V0IGN1cnRleHRjdXJzb3IgJGMKK30KKworcHJvYyBub3didXN5IHt3aGF0fSB7CisgICAgZ2xvYmFsIGlzYnVzeQorCisgICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CisJLiBjb25maWcgLWN1cnNvciB3YXRjaAorCXNldHRleHRjdXJzb3Igd2F0Y2gKKyAgICB9CisgICAgc2V0IGlzYnVzeSgkd2hhdCkgMQorfQorCitwcm9jIG5vdGJ1c3kge3doYXR9IHsKKyAgICBnbG9iYWwgaXNidXN5IG1haW5jdXJzb3IgdGV4dGN1cnNvcgorCisgICAgY2F0Y2gge3Vuc2V0IGlzYnVzeSgkd2hhdCl9CisgICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CisJLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgorCXNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKKyAgICB9Cit9CisKK3Byb2MgZHJhd3Jlc3Qge30geworICAgIGdsb2JhbCBudW1jb21taXRzCisgICAgZ2xvYmFsIHN0YXJ0bXNlY3MKKyAgICBnbG9iYWwgY2FudnkwIG51bWNvbW1pdHMgbGluZXNwYworICAgIGdsb2JhbCByb3dsYWlkb3V0IGNvbW1pdGlkeCBjdXJ2aWV3CisgICAgZ2xvYmFsIHBlbmRpbmdfc2VsZWN0CisKKyAgICBzZXQgcm93ICRyb3dsYWlkb3V0CisgICAgbGF5b3V0cm93cyAkcm93bGFpZG91dCAkY29tbWl0aWR4KCRjdXJ2aWV3KSAxCisgICAgbGF5b3V0dGFpbAorICAgIG9wdGltaXplX3Jvd3MgJHJvdyAwICRjb21taXRpZHgoJGN1cnZpZXcpCisgICAgc2hvd3N0dWZmICRjb21taXRpZHgoJGN1cnZpZXcpCisgICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKKwlzZWxlY3RsaW5lIDAgMQorICAgIH0KKworICAgIHNldCBkcmF3bXNlY3MgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc2Vjc31dCisgICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKK30KKworcHJvYyBmaW5kbWF0Y2hlcyB7Zn0geworICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgorICAgIGlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKKwlzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZm91bmRzdHJpbmcgJGZdCisgICAgfSBlbHNlIHsKKwlpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0geworCSAgICBzZXQgc3RyIFtzdHJpbmcgdG9sb3dlciAkZl0KKwl9IGVsc2UgeworCSAgICBzZXQgc3RyICRmCisJfQorCXNldCBtYXRjaGVzIHt9CisJc2V0IGkgMAorCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZm91bmRzdHJpbmcgJHN0ciAkaV1dID49IDB9IHsKKwkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByIHskaiskZm91bmRzdHJsZW4tMX1dXQorCSAgICBzZXQgaSBbZXhwciB7JGogKyAkZm91bmRzdHJsZW59XQorCX0KKyAgICB9CisgICAgcmV0dXJuICRtYXRjaGVzCit9CisKK3Byb2MgZG9maW5kIHt9IHsKKyAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbworICAgIGdsb2JhbCBudW1jb21taXRzIGRpc3BsYXlvcmRlciBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZworICAgIGdsb2JhbCBtYWluZm9udCBjYW52IGNhbnYyIGNhbnYzIHNlbGVjdGVkbGluZQorICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuIG1hdGNoc3RyaW5nCisgICAgZ2xvYmFsIGNvbW1pdGRhdGEKKworICAgIHN0b3BmaW5kcHJvYworICAgIHVubWFya21hdGNoZXMKKyAgICBjYW5jZWxfbmV4dF9oaWdobGlnaHQKKyAgICBmb2N1cyAuCisgICAgc2V0IG1hdGNoaW5nbGluZXMge30KKyAgICBpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0geworCXNldCBmb3VuZHN0cmluZyBbc3RyaW5nIHRvbG93ZXIgJGZpbmRzdHJpbmddCisgICAgfSBlbHNlIHsKKwlzZXQgZm91bmRzdHJpbmcgJGZpbmRzdHJpbmcKKyAgICB9CisgICAgc2V0IGZvdW5kc3RybGVuIFtzdHJpbmcgbGVuZ3RoICRmaW5kc3RyaW5nXQorICAgIGlmIHskZm91bmRzdHJsZW4gPT0gMH0gcmV0dXJuCisgICAgcmVnc3ViIC1hbGwge1sqP1xbXFxdfSAkZm91bmRzdHJpbmcge1xcJn0gbWF0Y2hzdHJpbmcKKyAgICBzZXQgbWF0Y2hzdHJpbmcgIiokbWF0Y2hzdHJpbmcqIgorICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKKwlzZXQgb2xkc2VsIC0xCisgICAgfSBlbHNlIHsKKwlzZXQgb2xkc2VsICRzZWxlY3RlZGxpbmUKKyAgICB9CisgICAgc2V0IGRpZHNlbCAwCisgICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudHN9CisgICAgc2V0IGwgLTEKKyAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgeworCXNldCBkICRjb21taXRkYXRhKCRpZCkKKwlpbmNyIGwKKwlpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CisJICAgIHNldCBkb2VzbWF0Y2ggW3JlZ2V4cCAkZm91bmRzdHJpbmcgJGRdCisJfSBlbHNlaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKKwkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoIC1ub2Nhc2UgJG1hdGNoc3RyaW5nICRkXQorCX0gZWxzZSB7CisJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAkbWF0Y2hzdHJpbmcgJGRdCisJfQorCWlmIHshJGRvZXNtYXRjaH0gY29udGludWUKKwlpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CisJICAgIGdldGNvbW1pdCAkaWQKKwl9CisJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQorCXNldCBkb2VzbWF0Y2ggMAorCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgeworCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0geworCQljb250aW51ZQorCSAgICB9CisJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KKwkgICAgaWYgeyRtYXRjaGVzID09IHt9fSBjb250aW51ZQorCSAgICBzZXQgZG9lc21hdGNoIDEKKwkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CisJCWRyYXdjbWl0cm93ICRsCisJCW1hcmttYXRjaGVzICRjYW52ICRsICRmICRsaW5laHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CisJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKKwkJZHJhd2NtaXRyb3cgJGwKKwkJbWFya21hdGNoZXMgJGNhbnYyICRsICRmICRsaW5lbnRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CisJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CisJCWRyYXdjbWl0cm93ICRsCisJCW1hcmttYXRjaGVzICRjYW52MyAkbCAkZiAkbGluZWR0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAorCSAgICB9CisJfQorCWlmIHskZG9lc21hdGNofSB7CisJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAorCSAgICBpZiB7ISRkaWRzZWwgJiYgJGwgPiAkb2xkc2VsfSB7CisJCWZpbmRzZWxlY3RsaW5lICRsCisJCXNldCBkaWRzZWwgMQorCSAgICB9CisJfQorICAgIH0KKyAgICBpZiB7JG1hdGNoaW5nbGluZXMgPT0ge319IHsKKwliZWxsCisgICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CisJZmluZHNlbGVjdGxpbmUgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXQorICAgIH0KK30KKworcHJvYyBmaW5kc2VsZWN0bGluZSB7bH0geworICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKKyAgICBzZWxlY3RsaW5lICRsIDEKKyAgICBpZiB7JGZpbmRsb2MgPT0gIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jID09ICJDb21tZW50cyJ9IHsKKwkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKKwlzZXQgZiBbJGN0ZXh0IGdldCAxLjAgJGNvbW1lbnRlbmRdCisJc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQorCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgeworCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KKwkgICAgc2V0IGVuZCBbZXhwciB7W2xpbmRleCAkbWF0Y2ggMV0gKyAxfV0KKwkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgorCX0KKyAgICB9Cit9CisKK3Byb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKKyAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0geworCWlmIHskcmVzdGFydH0geworCSAgICBkb2ZpbmQKKwl9CisJcmV0dXJuCisgICAgfQorICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgorICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CisJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0geworCSAgICBmaW5kc2VsZWN0bGluZSAkbAorCSAgICByZXR1cm4KKwl9CisgICAgfQorICAgIGJlbGwKK30KKworcHJvYyBmaW5kcHJldiB7fSB7CisgICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCisgICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKKwlkb2ZpbmQKKwlyZXR1cm4KKyAgICB9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCisgICAgc2V0IHByZXYge30KKyAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgeworCWlmIHskbCA+PSAkc2VsZWN0ZWRsaW5lfSBicmVhaworCXNldCBwcmV2ICRsCisgICAgfQorICAgIGlmIHskcHJldiAhPSB7fX0geworCWZpbmRzZWxlY3RsaW5lICRwcmV2CisgICAgfSBlbHNlIHsKKwliZWxsCisgICAgfQorfQorCitwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKKyAgICBnbG9iYWwgZmluZHByb2NwaWQgZmluZHByb2NmaWxlIGZpbmRpZHMKKyAgICBnbG9iYWwgY3RleHQgZmluZG9sZGN1cnNvciBwaGFzZSBtYWluY3Vyc29yIHRleHRjdXJzb3IKKyAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKKworICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQorICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CisJaWYgeyEkZG9uZX0geworCSAgICBjYXRjaCB7ZXhlYyBraWxsICRmaW5kcHJvY3BpZH0KKwl9CisJY2F0Y2gge2Nsb3NlICRmaW5kcHJvY2ZpbGV9CisJdW5zZXQgZmluZHByb2NwaWQKKyAgICB9CisgICAgY2F0Y2gge3Vuc2V0IGZpbmRpbnByb2dyZXNzfQorICAgIG5vdGJ1c3kgZmluZAorfQorCisjIG1hcmsgYSBjb21taXQgYXMgbWF0Y2hpbmcgYnkgcHV0dGluZyBhIHllbGxvdyBiYWNrZ3JvdW5kCisjIGJlaGluZCB0aGUgaGVhZGxpbmUKK3Byb2MgbWFya2hlYWRsaW5lIHtsIGlkfSB7CisgICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgbGluZWh0YWcKKworICAgIGRyYXdjbWl0cm93ICRsCisgICAgc2V0IGJib3ggWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0KKyAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCisgICAgJGNhbnYgbG93ZXIgJHQKK30KKworIyBtYXJrIHRoZSBiaXRzIG9mIGEgaGVhZGxpbmUsIGF1dGhvciBvciBkYXRlIHRoYXQgbWF0Y2ggYSBmaW5kIHN0cmluZworcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250fSB7CisgICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KKyAgICBzZXQgeDAgW2xpbmRleCAkYmJveCAwXQorICAgIHNldCB5MCBbbGluZGV4ICRiYm94IDFdCisgICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KKyAgICBmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKKwlzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KKwlzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCisJaWYgeyRzdGFydCA+ICRlbmR9IGNvbnRpbnVlCisJc2V0IHhvZmYgW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JHN0YXJ0LTF9XV1dCisJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JGVuZH1dXV0KKwlzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgW2V4cHIgeyR4MCskeG9mZn1dICR5MCBcCisJCSAgIFtleHByIHskeDArJHhsZW4rMn1dICR5MSBcCisJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQorCSRjYW52IGxvd2VyICR0CisgICAgfQorfQorCitwcm9jIHVubWFya21hdGNoZXMge30geworICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKKyAgICBhbGxjYW52cyBkZWxldGUgbWF0Y2hlcworICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQorICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQorfQorCitwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0geworICAgIGdsb2JhbCBjYW52IGNhbnZ5MCBjdGV4dCBsaW5lc3BjCisgICAgZ2xvYmFsIHJvd3RleHR4CisgICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQorICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCisgICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQorICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KKyAgICBzZXQgbCBbZXhwciB7aW50KCgkeSAtICRjYW52eTApIC8gJGxpbmVzcGMgKyAwLjUpfV0KKyAgICBpZiB7JGwgPCAwfSB7CisJc2V0IGwgMAorICAgIH0KKyAgICBpZiB7JHcgZXEgJGNhbnZ9IHsKKwlpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCisgICAgfQorICAgIHVubWFya21hdGNoZXMKKyAgICBzZWxlY3RsaW5lICRsIDEKK30KKworcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0geworICAgIGdsb2JhbCBjb21taXRpbmZvCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CisJZ2V0Y29tbWl0ICRwCisgICAgfQorICAgIHNldCBsICIuLi4iCisgICAgaWYge1tsbGVuZ3RoICRjb21taXRpbmZvKCRwKV0gPiAxfSB7CisJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KKyAgICB9CisgICAgcmV0dXJuICIkcCAoJGwpXG4iCit9CisKKyMgYXBwZW5kIHNvbWUgdGV4dCB0byB0aGUgY3RleHQgd2lkZ2V0LCBhbmQgbWFrZSBhbnkgU0hBMSBJRAorIyB0aGF0IHdlIGtub3cgYWJvdXQgYmUgYSBjbGlja2FibGUgbGluay4KK3Byb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0IHRhZ3N9IHsKKyAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0gY3VydmlldworCisgICAgc2V0IHN0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAkdGV4dCAkdGFncworICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KKyAgICBmb3JlYWNoIGwgJGxpbmtzIHsKKwlzZXQgcyBbbGluZGV4ICRsIDBdCisJc2V0IGUgW2xpbmRleCAkbCAxXQorCXNldCBsaW5raWQgW3N0cmluZyByYW5nZSAkdGV4dCAkcyAkZV0KKwlpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGxpbmtpZCldfSBjb250aW51ZQorCWluY3IgZQorCSRjdGV4dCB0YWcgYWRkIGxpbmsgIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgorCSRjdGV4dCB0YWcgYWRkIGxpbmskbGlua251bSAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCisJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gXAorCSAgICBbbGlzdCBzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGxpbmtpZCkgMV0KKwlpbmNyIGxpbmtudW0KKyAgICB9CisgICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKKyAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQorICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9Cit9CisKK3Byb2Mgdmlld25leHRsaW5lIHtkaXJ9IHsKKyAgICBnbG9iYWwgY2FudiBsaW5lc3BjCisKKyAgICAkY2FudiBkZWxldGUgaG92ZXIKKyAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisgICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQorICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQorICAgIHNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGRpciAqICRsaW5lc3BjfV0KKyAgICBpZiB7JG5ld3RvcCA8IDB9IHsKKwlzZXQgbmV3dG9wIDAKKyAgICB9IGVsc2VpZiB7JG5ld3RvcCA+ICR5bWF4fSB7CisJc2V0IG5ld3RvcCAkeW1heAorICAgIH0KKyAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgeyRuZXd0b3AgKiAxLjAgLyAkeW1heH1dCit9CisKKyMgYWRkIGEgbGlzdCBvZiB0YWcgb3IgYnJhbmNoIG5hbWVzIGF0IHBvc2l0aW9uIHBvcworIyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbmFtZXMgaW5zZXJ0ZWQKK3Byb2MgYXBwZW5kcmVmcyB7cG9zIGwgdmFyfSB7CisgICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdHJvdyBsaW5rbnVtIGN1cnZpZXcgaWR0YWdzICR2YXIKKworICAgIGlmIHtbY2F0Y2ggeyRjdGV4dCBpbmRleCAkcG9zfV19IHsKKwlyZXR1cm4gMAorICAgIH0KKyAgICBzZXQgdGFncyB7fQorICAgIGZvcmVhY2ggaWQgJGwgeworCWZvcmVhY2ggdGFnIFtzZXQgJHZhclwoJGlkXCldIHsKKwkgICAgbGFwcGVuZCB0YWdzIFtjb25jYXQgJHRhZyAkaWRdCisJfQorICAgIH0KKyAgICBzZXQgdGFncyBbbHNvcnQgLWluZGV4IDEgJHRhZ3NdCisgICAgc2V0IHNlcCB7fQorICAgIGZvcmVhY2ggdGFnICR0YWdzIHsKKwlzZXQgbmFtZSBbbGluZGV4ICR0YWcgMF0KKwlzZXQgaWQgW2xpbmRleCAkdGFnIDFdCisJc2V0IGxrIGxpbmskbGlua251bQorCWluY3IgbGlua251bQorCSRjdGV4dCBpbnNlcnQgJHBvcyAkc2VwCisJJGN0ZXh0IGluc2VydCAkcG9zICRuYW1lICRsaworCSRjdGV4dCB0YWcgY29uZiAkbGsgLWZvcmVncm91bmQgYmx1ZQorCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CisJICAgICRjdGV4dCB0YWcgYmluZCAkbGsgPDE+IFwKKwkJW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMV0KKwkgICAgJGN0ZXh0IHRhZyBjb25mICRsayAtdW5kZXJsaW5lIDEKKwkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQorCSAgICAkY3RleHQgdGFnIGJpbmQgJGxrIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CisJfQorCXNldCBzZXAgIiwgIgorICAgIH0KKyAgICByZXR1cm4gW2xsZW5ndGggJHRhZ3NdCit9CisKKyMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCBjb21wdXRpbmcgdGhlIG5lYXJieSB0YWdzCitwcm9jIGRpc3BuZWFydGFncyB7fSB7CisgICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgY3RleHQgYW5jX3RhZ3MgZGVzY190YWdzIHNob3duZWFydGFncworICAgIGdsb2JhbCBkZXNjX2hlYWRzCisKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICEkc2hvd25lYXJ0YWdzfSByZXR1cm4KKyAgICBzZXQgaWQgJGN1cnJlbnRpZAorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICBpZiB7W2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJGlkKV19IHsKKwlpZiB7W2FwcGVuZHJlZnMgYnJhbmNoICRkZXNjX2hlYWRzKCRpZCkgaWRoZWFkc10gPiAxfSB7CisJICAgICRjdGV4dCBpbnNlcnQgImJyYW5jaCAtMmMiICJlcyIKKwl9CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGlkKV19IHsKKwlhcHBlbmRyZWZzIGZvbGxvd3MgJGFuY190YWdzKCRpZCkgaWR0YWdzCisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSB7CisJYXBwZW5kcmVmcyBwcmVjZWRlcyAkZGVzY190YWdzKCRpZCkgaWR0YWdzCisgICAgfQorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorfQorCitwcm9jIHNlbGVjdGxpbmUge2wgaXNuZXd9IHsKKyAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQorICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKKyAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50bGlzdCBjaGlsZGxpc3QKKyAgICBnbG9iYWwgY3VycmVudGlkIHNoYTFlbnRyeQorICAgIGdsb2JhbCBjb21tZW50ZW5kIGlkdGFncyBsaW5rbnVtCisgICAgZ2xvYmFsIG1lcmdlbWF4IG51bWNvbW1pdHMgcGVuZGluZ19zZWxlY3QKKyAgICBnbG9iYWwgY21pdG1vZGUgZGVzY190YWdzIGFuY190YWdzIHNob3duZWFydGFncyBhbGxjb21taXRzIGRlc2NfaGVhZHMKKworICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KKyAgICAkY2FudiBkZWxldGUgaG92ZXIKKyAgICBub3JtYWxsaW5lCisgICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CisgICAgaWYgeyRsIDwgMCB8fCAkbCA+PSAkbnVtY29tbWl0c30gcmV0dXJuCisgICAgc2V0IHkgW2V4cHIgeyRjYW52eTAgKyAkbCAqICRsaW5lc3BjfV0KKyAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisgICAgc2V0IHl0b3AgW2V4cHIgeyR5IC0gJGxpbmVzcGMgLSAxfV0KKyAgICBzZXQgeWJvdCBbZXhwciB7JHkgKyAkbGluZXNwYyArIDF9XQorICAgIHNldCB3bm93IFskY2FudiB5dmlld10KKyAgICBzZXQgd3RvcCBbZXhwciB7W2xpbmRleCAkd25vdyAwXSAqICR5bWF4fV0KKyAgICBzZXQgd2JvdCBbZXhwciB7W2xpbmRleCAkd25vdyAxXSAqICR5bWF4fV0KKyAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQorICAgIHNldCBuZXd0b3AgJHd0b3AKKyAgICBpZiB7JHl0b3AgPCAkd3RvcH0geworCWlmIHskeWJvdCA8ICR3dG9wfSB7CisJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KKwl9IGVsc2UgeworCSAgICBzZXQgbmV3dG9wICR5dG9wCisJICAgIGlmIHskbmV3dG9wID4gJHd0b3AgLSAkbGluZXNwY30geworCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCAtICRsaW5lc3BjfV0KKwkgICAgfQorCX0KKyAgICB9IGVsc2VpZiB7JHlib3QgPiAkd2JvdH0geworCWlmIHskeXRvcCA+ICR3Ym90fSB7CisJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KKwl9IGVsc2UgeworCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCisJICAgIGlmIHskbmV3dG9wIDwgJHd0b3AgKyAkbGluZXNwY30geworCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRsaW5lc3BjfV0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKKwlpZiB7JG5ld3RvcCA8IDB9IHsKKwkgICAgc2V0IG5ld3RvcCAwCisJfQorCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciB7JG5ld3RvcCAqIDEuMCAvICR5bWF4fV0KKwlkcmF3dmlzaWJsZQorICAgIH0KKworICAgIGlmIHshW2luZm8gZXhpc3RzIGxpbmVodGFnKCRsKV19IHJldHVybgorICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKKyAgICBzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKKwkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KKyAgICAkY2FudiBsb3dlciAkdAorICAgICRjYW52MiBkZWxldGUgc2Vjc2VsCisgICAgc2V0IHQgW2V2YWwgJGNhbnYyIGNyZWF0ZSByZWN0IFskY2FudjIgYmJveCAkbGluZW50YWcoJGwpXSAtb3V0bGluZSB7e319IFwKKwkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCisgICAgJGNhbnYyIGxvd2VyICR0CisgICAgJGNhbnYzIGRlbGV0ZSBzZWNzZWwKKyAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAorCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MyBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KKyAgICAkY2FudjMgbG93ZXIgJHQKKworICAgIGlmIHskaXNuZXd9IHsKKwlhZGR0b2hpc3RvcnkgW2xpc3Qgc2VsZWN0bGluZSAkbCAwXQorICAgIH0KKworICAgIHNldCBzZWxlY3RlZGxpbmUgJGwKKworICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdCisgICAgc2V0IGN1cnJlbnRpZCAkaWQKKyAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAorICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCisgICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gZnJvbSAwCisgICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCisgICAgcmhpZ2hsaWdodF9zZWwgJGlkCisKKyAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCisgICAgY2xlYXJfY3RleHQKKyAgICBzZXQgbGlua251bSAwCisgICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQorICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCisgICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgJGRhdGVcbiIKKyAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDRdXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJDb21taXR0ZXI6IFtsaW5kZXggJGluZm8gM10gICRkYXRlXG4iCisgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKKwkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCisJZm9yZWFjaCB0YWcgJGlkdGFncygkaWQpIHsKKwkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgorCX0KKwkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCisgICAgfQorIAorICAgIHNldCBoZWFkZXJzIHt9CisgICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkbF0KKyAgICBpZiB7W2xsZW5ndGggJG9sZHNdID4gMX0geworCXNldCBucCAwCisJZm9yZWFjaCBwICRvbGRzIHsKKwkgICAgaWYgeyRucCA+PSAkbWVyZ2VtYXh9IHsKKwkJc2V0IHRhZyBtbWF4CisJICAgIH0gZWxzZSB7CisJCXNldCB0YWcgbSRucAorCSAgICB9CisJICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6ICIgJHRhZworCSAgICBhcHBlbmR3aXRobGlua3MgW2NvbW1pdF9kZXNjcmlwdG9yICRwXSB7fQorCSAgICBpbmNyIG5wCisJfQorICAgIH0gZWxzZSB7CisJZm9yZWFjaCBwICRvbGRzIHsKKwkgICAgYXBwZW5kIGhlYWRlcnMgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXSIKKwl9CisgICAgfQorCisgICAgZm9yZWFjaCBjIFtsaW5kZXggJGNoaWxkbGlzdCAkbF0geworCWFwcGVuZCBoZWFkZXJzICJDaGlsZDogIFtjb21taXRfZGVzY3JpcHRvciAkY10iCisgICAgfQorCisgICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluaworICAgIGFwcGVuZHdpdGhsaW5rcyAkaGVhZGVycyB7fQorICAgIGlmIHskc2hvd25lYXJ0YWdzfSB7CisJaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHsKKwkgICAgZ2V0YWxsY29tbWl0cworCX0KKwkkY3RleHQgaW5zZXJ0IGVuZCAiQnJhbmNoOiAiCisJJGN0ZXh0IG1hcmsgc2V0IGJyYW5jaCAiZW5kIC0xYyIKKwkkY3RleHQgbWFyayBncmF2aXR5IGJyYW5jaCBsZWZ0CisJaWYge1tpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRpZCldfSB7CisJICAgIGlmIHtbYXBwZW5kcmVmcyBicmFuY2ggJGRlc2NfaGVhZHMoJGlkKSBpZGhlYWRzXSA+IDF9IHsKKwkJIyB0dXJuICJCcmFuY2giIGludG8gIkJyYW5jaGVzIgorCQkkY3RleHQgaW5zZXJ0ICJicmFuY2ggLTJjIiAiZXMiCisJICAgIH0KKwl9CisJJGN0ZXh0IGluc2VydCBlbmQgIlxuRm9sbG93czogIgorCSRjdGV4dCBtYXJrIHNldCBmb2xsb3dzICJlbmQgLTFjIgorCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm9sbG93cyBsZWZ0CisJaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0geworCSAgICBhcHBlbmRyZWZzIGZvbGxvd3MgJGFuY190YWdzKCRpZCkgaWR0YWdzCisJfQorCSRjdGV4dCBpbnNlcnQgZW5kICJcblByZWNlZGVzOiAiCisJJGN0ZXh0IG1hcmsgc2V0IHByZWNlZGVzICJlbmQgLTFjIgorCSRjdGV4dCBtYXJrIGdyYXZpdHkgcHJlY2VkZXMgbGVmdAorCWlmIHtbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSB7CisJICAgIGFwcGVuZHJlZnMgcHJlY2VkZXMgJGRlc2NfdGFncygkaWQpIGlkdGFncworCX0KKwkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCisgICAgfQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKKyAgICBhcHBlbmR3aXRobGlua3MgW2xpbmRleCAkaW5mbyA1XSB7Y29tbWVudH0KKworICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCisgICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KKworICAgIGluaXRfZmxpc3QgIkNvbW1lbnRzIgorICAgIGlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CisJZ2V0dHJlZSAkaWQKKyAgICB9IGVsc2VpZiB7W2xsZW5ndGggJG9sZHNdIDw9IDF9IHsKKwlzdGFydGRpZmYgJGlkCisgICAgfSBlbHNlIHsKKwltZXJnZWRpZmYgJGlkICRsCisgICAgfQorfQorCitwcm9jIHNlbGZpcnN0bGluZSB7fSB7CisgICAgdW5tYXJrbWF0Y2hlcworICAgIHNlbGVjdGxpbmUgMCAxCit9CisKK3Byb2Mgc2VsbGFzdGxpbmUge30geworICAgIGdsb2JhbCBudW1jb21taXRzCisgICAgdW5tYXJrbWF0Y2hlcworICAgIHNldCBsIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQorICAgIHNlbGVjdGxpbmUgJGwgMQorfQorCitwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKKyAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCisgICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCisgICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyfV0KKyAgICB1bm1hcmttYXRjaGVzCisgICAgc2VsZWN0bGluZSAkbCAxCit9CisKK3Byb2Mgc2VsbmV4dHBhZ2Uge2Rpcn0geworICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKKworICAgIHNldCBscHAgW2V4cHIgeyhbd2luZm8gaGVpZ2h0ICRjYW52XSAtIDIpIC8gJGxpbmVzcGN9XQorICAgIGlmIHskbHBwIDwgMX0geworCXNldCBscHAgMQorICAgIH0KKyAgICBhbGxjYW52cyB5dmlldyBzY3JvbGwgW2V4cHIgeyRkaXIgKiAkbHBwfV0gdW5pdHMKKyAgICBkcmF3dmlzaWJsZQorICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgorICAgIHNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpciAqICRscHB9XQorICAgIGlmIHskbCA8IDB9IHsKKwlzZXQgbCAwCisgICAgfSBlbHNlaWYgeyRsID49ICRudW1jb21taXRzfSB7CisgICAgICAgIHNldCBsIFtleHByICRudW1jb21taXRzIC0gMV0KKyAgICB9CisgICAgdW5tYXJrbWF0Y2hlcworICAgIHNlbGVjdGxpbmUgJGwgMSAgICAKK30KKworcHJvYyB1bnNlbGVjdGxpbmUge30geworICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkCisKKyAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQorICAgIGNhdGNoIHt1bnNldCBjdXJyZW50aWR9CisgICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAorICAgIHJoaWdobGlnaHRfbm9uZQorICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAorfQorCitwcm9jIHJlc2VsZWN0bGluZSB7fSB7CisgICAgZ2xvYmFsIHNlbGVjdGVkbGluZQorCisgICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CisJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKKyAgICB9Cit9CisKK3Byb2MgYWRkdG9oaXN0b3J5IHtjbWR9IHsKKyAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXggY3VydmlldworCisgICAgc2V0IGVsdCBbbGlzdCAkY3VydmlldyAkY21kXQorICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMAorCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRlbHR9IHsKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0geworCXNldCBoaXN0b3J5IFtscmVwbGFjZSAkaGlzdG9yeSAkaGlzdG9yeWluZGV4IGVuZCAkZWx0XQorICAgIH0gZWxzZSB7CisJbGFwcGVuZCBoaXN0b3J5ICRlbHQKKyAgICB9CisgICAgaW5jciBoaXN0b3J5aW5kZXgKKyAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKKwkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCisgICAgfSBlbHNlIHsKKwkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKKyAgICB9CisgICAgLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorfQorCitwcm9jIGdvZG8ge2VsdH0geworICAgIGdsb2JhbCBjdXJ2aWV3CisKKyAgICBzZXQgdmlldyBbbGluZGV4ICRlbHQgMF0KKyAgICBzZXQgY21kIFtsaW5kZXggJGVsdCAxXQorICAgIGlmIHskY3VydmlldyAhPSAkdmlld30geworCXNob3d2aWV3ICR2aWV3CisgICAgfQorICAgIGV2YWwgJGNtZAorfQorCitwcm9jIGdvYmFjayB7fSB7CisgICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CisKKyAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKKwlpbmNyIGhpc3RvcnlpbmRleCAtMQorCWdvZG8gW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0KKwkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIH0KKyAgICBpZiB7JGhpc3RvcnlpbmRleCA8PSAxfSB7CisJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgfQorfQorCitwcm9jIGdvZm9ydyB7fSB7CisgICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CisKKyAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0geworCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSAkaGlzdG9yeWluZGV4XQorCWluY3IgaGlzdG9yeWluZGV4CisJZ29kbyAkY21kCisJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIH0KKyAgICBpZiB7JGhpc3RvcnlpbmRleCA+PSBbbGxlbmd0aCAkaGlzdG9yeV19IHsKKwkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgfQorfQorCitwcm9jIGdldHRyZWUge2lkfSB7CisgICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMgZGlmZm1lcmdlaWQgdHJlZXBlbmRpbmcKKworICAgIHNldCBkaWZmaWRzICRpZAorICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZmlsZWxpc3QoJGlkKV19IHsKKwlpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKKwkgICAgaWYge1tjYXRjaCB7c2V0IGd0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGxzLXRyZWUgLXIgJGlkXSByXX1dfSB7CisJCXJldHVybgorCSAgICB9CisJICAgIHNldCB0cmVlcGVuZGluZyAkaWQKKwkgICAgc2V0IHRyZWVmaWxlbGlzdCgkaWQpIHt9CisJICAgIHNldCB0cmVlaWRsaXN0KCRpZCkge30KKwkgICAgZmNvbmZpZ3VyZSAkZ3RmIC1ibG9ja2luZyAwCisJICAgIGZpbGVldmVudCAkZ3RmIHJlYWRhYmxlIFtsaXN0IGdldHRyZWVsaW5lICRndGYgJGlkXQorCX0KKyAgICB9IGVsc2UgeworCXNldGZpbGVsaXN0ICRpZAorICAgIH0KK30KKworcHJvYyBnZXR0cmVlbGluZSB7Z3RmIGlkfSB7CisgICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IHRyZWVwZW5kaW5nIGNtaXRtb2RlIGRpZmZpZHMKKworICAgIHdoaWxlIHtbZ2V0cyAkZ3RmIGxpbmVdID49IDB9IHsKKwlpZiB7W2xpbmRleCAkbGluZSAxXSBuZSAiYmxvYiJ9IGNvbnRpbnVlCisJc2V0IHNoYTEgW2xpbmRleCAkbGluZSAyXQorCXNldCBmbmFtZSBbbGluZGV4ICRsaW5lIDNdCisJbGFwcGVuZCB0cmVlZmlsZWxpc3QoJGlkKSAkZm5hbWUKKwlsYXBwZW5kIHRyZWVpZGxpc3QoJGlkKSAkc2hhMQorICAgIH0KKyAgICBpZiB7IVtlb2YgJGd0Zl19IHJldHVybgorICAgIGNsb3NlICRndGYKKyAgICB1bnNldCB0cmVlcGVuZGluZworICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSB7CisJaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CisJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcworCX0KKyAgICB9IGVsc2VpZiB7JGlkIG5lICRkaWZmaWRzfSB7CisJZ2V0dHJlZSAkZGlmZmlkcworICAgIH0gZWxzZSB7CisJc2V0ZmlsZWxpc3QgJGlkCisgICAgfQorfQorCitwcm9jIHNob3dmaWxlIHtmfSB7CisgICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMKKyAgICBnbG9iYWwgY3RleHQgY29tbWVudGVuZAorCisgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZmlsZWxpc3QoJGRpZmZpZHMpICRmXQorICAgIGlmIHskaSA8IDB9IHsKKwlwdXRzICJvb3BzLCAkZiBub3QgaW4gbGlzdCBmb3IgaWQgJGRpZmZpZHMiCisJcmV0dXJuCisgICAgfQorICAgIHNldCBibG9iIFtsaW5kZXggJHRyZWVpZGxpc3QoJGRpZmZpZHMpICRpXQorICAgIGlmIHtbY2F0Y2gge3NldCBiZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGNhdC1maWxlIGJsb2IgJGJsb2JdIHJdfSBlcnJdfSB7CisJcHV0cyAib29wcywgZXJyb3IgcmVhZGluZyBibG9iICRibG9iOiAkZXJyIgorCXJldHVybgorICAgIH0KKyAgICBmY29uZmlndXJlICRiZiAtYmxvY2tpbmcgMAorICAgIGZpbGVldmVudCAkYmYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmxpbmUgJGJmICRkaWZmaWRzXQorICAgICRjdGV4dCBjb25maWcgLXN0YXRlIG5vcm1hbAorICAgIGNsZWFyX2N0ZXh0ICRjb21tZW50ZW5kCisgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgorICAgICRjdGV4dCBpbnNlcnQgZW5kICIkZlxuIiBmaWxlc2VwCisgICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgZGlzYWJsZWQKKyAgICAkY3RleHQgeXZpZXcgJGNvbW1lbnRlbmQKK30KKworcHJvYyBnZXRibG9ibGluZSB7YmYgaWR9IHsKKyAgICBnbG9iYWwgZGlmZmlkcyBjbWl0bW9kZSBjdGV4dAorCisgICAgaWYgeyRpZCBuZSAkZGlmZmlkcyB8fCAkY21pdG1vZGUgbmUgInRyZWUifSB7CisJY2F0Y2gge2Nsb3NlICRiZn0KKwlyZXR1cm4KKyAgICB9CisgICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgbm9ybWFsCisgICAgd2hpbGUge1tnZXRzICRiZiBsaW5lXSA+PSAwfSB7CisJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCisgICAgfQorICAgIGlmIHtbZW9mICRiZl19IHsKKwkjIGRlbGV0ZSBsYXN0IG5ld2xpbmUKKwkkY3RleHQgZGVsZXRlICJlbmQgLSAyYyIgImVuZCAtIDFjIgorCWNsb3NlICRiZgorICAgIH0KKyAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAorfQorCitwcm9jIG1lcmdlZGlmZiB7aWQgbH0geworICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmb3B0cyBtZGlmZmZkCisgICAgZ2xvYmFsIGRpZmZpZHMKKyAgICBnbG9iYWwgcGFyZW50bGlzdAorCisgICAgc2V0IGRpZmZtZXJnZWlkICRpZAorICAgIHNldCBkaWZmaWRzICRpZAorICAgICMgdGhpcyBkb2Vzbid0IHNlZW0gdG8gYWN0dWFsbHkgYWZmZWN0IGFueXRoaW5nLi4uCisgICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKKyAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC0tY2MgJGlkXQorICAgIGlmIHtbY2F0Y2gge3NldCBtZGYgW29wZW4gJGNtZCByXX0gZXJyXX0geworCWVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIG1lcmdlIGRpZmZzOiAkZXJyIgorCXJldHVybgorICAgIH0KKyAgICBmY29uZmlndXJlICRtZGYgLWJsb2NraW5nIDAKKyAgICBzZXQgbWRpZmZmZCgkaWQpICRtZGYKKyAgICBzZXQgbnAgW2xsZW5ndGggW2xpbmRleCAkcGFyZW50bGlzdCAkbF1dCisgICAgZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWRmICRpZCAkbnBdCisgICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQorfQorCitwcm9jIGdldG1lcmdlZGlmZmxpbmUge21kZiBpZCBucH0geworICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBjdGV4dCBjZmxpc3QgbmV4dHVwZGF0ZSBtZXJnZW1heAorICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IG1kaWZmZmQKKworICAgIHNldCBuIFtnZXRzICRtZGYgbGluZV0KKyAgICBpZiB7JG4gPCAwfSB7CisJaWYge1tlb2YgJG1kZl19IHsKKwkgICAgY2xvc2UgJG1kZgorCX0KKwlyZXR1cm4KKyAgICB9CisgICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdIHx8ICRpZCAhPSAkZGlmZm1lcmdlaWQKKwl8fCAkbWRmICE9ICRtZGlmZmZkKCRpZCl9IHsKKwlyZXR1cm4KKyAgICB9CisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWNjICguKil9ICRsaW5lIG1hdGNoIGZuYW1lXX0geworCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQorCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKKwlzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCisJbGFwcGVuZCBkaWZmZmlsZXN0YXJ0ICRoZXJlCisJYWRkX2ZsaXN0IFtsaXN0ICRmbmFtZV0KKwlzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGZuYW1lXSkgLyAyfV0KKwlzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCisJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGZuYW1lICRwYWRcbiIgZmlsZXNlcAorICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteQEB9ICRsaW5lXX0geworCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCisgICAgfSBlbHNlaWYge1tyZWdleHAge15bMC05YS1mXXs0MH0kfSAkbGluZV0gfHwgW3JlZ2V4cCB7XmluZGV4fSAkbGluZV19IHsKKwkjIGRvIG5vdGhpbmcKKyAgICB9IGVsc2UgeworCSMgcGFyc2UgdGhlIHByZWZpeCAtIG9uZSAnICcsICctJyBvciAnKycgZm9yIGVhY2ggcGFyZW50CisJc2V0IHNwYWNlcyB7fQorCXNldCBtaW51c2VzIHt9CisJc2V0IHBsdXNlcyB7fQorCXNldCBpc2JhZCAwCisJZm9yIHtzZXQgaiAwfSB7JGogPCAkbnB9IHtpbmNyIGp9IHsKKwkgICAgc2V0IGMgW3N0cmluZyByYW5nZSAkbGluZSAkaiAkal0KKwkgICAgaWYgeyRjID09ICIgIn0geworCQlsYXBwZW5kIHNwYWNlcyAkagorCSAgICB9IGVsc2VpZiB7JGMgPT0gIi0ifSB7CisJCWxhcHBlbmQgbWludXNlcyAkagorCSAgICB9IGVsc2VpZiB7JGMgPT0gIisifSB7CisJCWxhcHBlbmQgcGx1c2VzICRqCisJICAgIH0gZWxzZSB7CisJCXNldCBpc2JhZCAxCisJCWJyZWFrCisJICAgIH0KKwl9CisJc2V0IHRhZ3Mge30KKwlzZXQgbnVtIHt9CisJaWYgeyEkaXNiYWQgJiYgJG1pbnVzZXMgbmUge30gJiYgJHBsdXNlcyBlcSB7fX0geworCSAgICAjIGxpbmUgZG9lc24ndCBhcHBlYXIgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRtaW51c2VzIGhhdmUgdGhlIGxpbmUKKwkgICAgc2V0IG51bSBbbGluZGV4ICRtaW51c2VzIDBdCisJfSBlbHNlaWYgeyEkaXNiYWQgJiYgJHBsdXNlcyBuZSB7fSAmJiAkbWludXNlcyBlcSB7fX0geworCSAgICAjIGxpbmUgYXBwZWFycyBpbiByZXN1bHQsIHBhcmVudHMgaW4gJHBsdXNlcyBkb24ndCBoYXZlIHRoZSBsaW5lCisJICAgIGxhcHBlbmQgdGFncyBtcmVzdWx0CisJICAgIHNldCBudW0gW2xpbmRleCAkc3BhY2VzIDBdCisJfQorCWlmIHskbnVtIG5lIHt9fSB7CisJICAgIGlmIHskbnVtID49ICRtZXJnZW1heH0geworCQlzZXQgbnVtICJtYXgiCisJICAgIH0KKwkgICAgbGFwcGVuZCB0YWdzIG0kbnVtCisJfQorCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiAkdGFncworICAgIH0KKyAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKKyAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0geworCWluY3IgbmV4dHVwZGF0ZSAxMDAKKwlmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSB7fQorCXVwZGF0ZQorCWZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWQgJG5wXQorICAgIH0KK30KKworcHJvYyBzdGFydGRpZmYge2lkc30geworICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZyBkaWZmbWVyZ2VpZAorCisgICAgc2V0IGRpZmZpZHMgJGlkcworICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KKyAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CisJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CisJICAgIGdldHRyZWVkaWZmcyAkaWRzCisJfQorICAgIH0gZWxzZSB7CisJYWRkdG9jZmxpc3QgJGlkcworICAgIH0KK30KKworcHJvYyBhZGR0b2NmbGlzdCB7aWRzfSB7CisgICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKKyAgICBhZGRfZmxpc3QgJHRyZWVkaWZmcygkaWRzKQorICAgIGdldGJsb2JkaWZmcyAkaWRzCit9CisKK3Byb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKKyAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZXBlbmRpbmcKKyAgICBzZXQgdHJlZXBlbmRpbmcgJGlkcworICAgIHNldCB0cmVlZGlmZiB7fQorICAgIGlmIHtbY2F0Y2ggXAorCSB7c2V0IGdkdGYgW29wZW4gW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgJGlkc10gcl19IFwKKwldfSByZXR1cm4KKyAgICBmY29uZmlndXJlICRnZHRmIC1ibG9ja2luZyAwCisgICAgZmlsZWV2ZW50ICRnZHRmIHJlYWRhYmxlIFtsaXN0IGdldHRyZWVkaWZmbGluZSAkZ2R0ZiAkaWRzXQorfQorCitwcm9jIGdldHRyZWVkaWZmbGluZSB7Z2R0ZiBpZHN9IHsKKyAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKKyAgICBnbG9iYWwgY21pdG1vZGUKKworICAgIHNldCBuIFtnZXRzICRnZHRmIGxpbmVdCisgICAgaWYgeyRuIDwgMH0geworCWlmIHshW2VvZiAkZ2R0Zl19IHJldHVybgorCWNsb3NlICRnZHRmCisJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKKwl1bnNldCB0cmVlcGVuZGluZworCWlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CisJICAgIGdldHRyZWUgJGRpZmZpZHMKKwl9IGVsc2VpZiB7JGlkcyAhPSAkZGlmZmlkc30geworCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKKwkJZ2V0dHJlZWRpZmZzICRkaWZmaWRzCisJICAgIH0KKwl9IGVsc2UgeworCSAgICBhZGR0b2NmbGlzdCAkaWRzCisJfQorCXJldHVybgorICAgIH0KKyAgICBzZXQgZmlsZSBbbGluZGV4ICRsaW5lIDVdCisgICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQorfQorCitwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CisgICAgZ2xvYmFsIGRpZmZvcHRzIGJsb2JkaWZmZmQgZGlmZmlkcyBlbnYgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAorICAgIGdsb2JhbCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKKworICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCisgICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0IGRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtciAtcCAtQyAkaWRzXQorICAgIGlmIHtbY2F0Y2gge3NldCBiZGYgW29wZW4gJGNtZCByXX0gZXJyXX0geworCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCisJcmV0dXJuCisgICAgfQorICAgIHNldCBkaWZmaW5oZHIgMAorICAgIGZjb25maWd1cmUgJGJkZiAtYmxvY2tpbmcgMAorICAgIHNldCBibG9iZGlmZmZkKCRpZHMpICRiZGYKKyAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cworICAgIHNldCBjdXJ0YWdzdGFydCAwLjAKKyAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KKyAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCit9CisKK3Byb2Mgc2V0aW5saXN0IHt2YXIgaSB2YWx9IHsKKyAgICBnbG9iYWwgJHZhcgorCisgICAgd2hpbGUge1tsbGVuZ3RoIFtzZXQgJHZhcl1dIDwgJGl9IHsKKwlsYXBwZW5kICR2YXIge30KKyAgICB9CisgICAgaWYge1tsbGVuZ3RoIFtzZXQgJHZhcl1dID09ICRpfSB7CisJbGFwcGVuZCAkdmFyICR2YWwKKyAgICB9IGVsc2UgeworCWxzZXQgJHZhciAkaSAkdmFsCisgICAgfQorfQorCitwcm9jIGdldGJsb2JkaWZmbGluZSB7YmRmIGlkc30geworICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAorICAgIGdsb2JhbCBkaWZmbmV4dGhlYWQgZGlmZm5leHRub3RlIGRpZmZmaWxlc3RhcnQKKyAgICBnbG9iYWwgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCisKKyAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCisgICAgaWYgeyRuIDwgMH0geworCWlmIHtbZW9mICRiZGZdfSB7CisJICAgIGNsb3NlICRiZGYKKwkgICAgaWYgeyRpZHMgPT0gJGRpZmZpZHMgJiYgJGJkZiA9PSAkYmxvYmRpZmZmZCgkaWRzKX0geworCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCisJICAgIH0KKwl9CisJcmV0dXJuCisgICAgfQorICAgIGlmIHskaWRzICE9ICRkaWZmaWRzIHx8ICRiZGYgIT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKKwlyZXR1cm4KKyAgICB9CisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0geworCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQorCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKKwkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCisJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQorCXNldCBjdXJ0YWdzdGFydCAkaGVyZQorCXNldCBoZWFkZXIgJG5ld25hbWUKKwlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkZm5hbWVdCisJaWYgeyRpID49IDB9IHsKKwkgICAgc2V0aW5saXN0IGRpZmZmaWxlc3RhcnQgJGkgJGhlcmUKKwl9CisJaWYgeyRuZXduYW1lIG5lICRmbmFtZX0geworCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkbmV3bmFtZV0KKwkgICAgaWYgeyRpID49IDB9IHsKKwkJc2V0aW5saXN0IGRpZmZmaWxlc3RhcnQgJGkgJGhlcmUKKwkgICAgfQorCX0KKwlzZXQgY3VyZGlmZnRhZyAiZjokZm5hbWUiCisJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKKwlzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGhlYWRlcl0pIC8gMn1dCisJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQorCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCisJc2V0IGRpZmZpbmhkciAxCisgICAgfSBlbHNlaWYgeyRkaWZmaW5oZHIgJiYgW3N0cmluZyBjb21wYXJlIC1sZW5ndGggMyAkbGluZSAiLS0tIl0gPT0gMH0geworCSMgZG8gbm90aGluZworICAgIH0gZWxzZWlmIHskZGlmZmluaGRyICYmIFtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIisrKyJdID09IDB9IHsKKwlzZXQgZGlmZmluaGRyIDAKKyAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAorCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKKwkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAorCXNldCBkaWZmaW5oZHIgMAorICAgIH0gZWxzZSB7CisJc2V0IHggW3N0cmluZyByYW5nZSAkbGluZSAwIDBdCisJaWYgeyR4ID09ICItIiB8fCAkeCA9PSAiKyJ9IHsKKwkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KKwkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGQkdGFnCisJfSBlbHNlaWYgeyR4ID09ICIgIn0geworCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKKwl9IGVsc2VpZiB7JGRpZmZpbmhkciB8fCAkeCA9PSAiXFwifSB7CisJICAgICMgZS5nLiAiXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIgorCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAorCX0gZWxzZSB7CisJICAgICMgU29tZXRoaW5nIGVsc2Ugd2UgZG9uJ3QgcmVjb2duaXplCisJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CisJCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKKwkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAorCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQorCQlzZXQgY3VyZGlmZnRhZyBDb21tZW50cworCSAgICB9CisJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCisJfQorICAgIH0KKyAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKKyAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0geworCWluY3IgbmV4dHVwZGF0ZSAxMDAKKwlmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQorCXVwZGF0ZQorCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlICJnZXRibG9iZGlmZmxpbmUgJGJkZiB7JGlkc30iCisgICAgfQorfQorCitwcm9jIG5leHRmaWxlIHt9IHsKKyAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAorICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KKyAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CisJaWYge1skY3RleHQgY29tcGFyZSAkbG9jID4gJGhlcmVdfSB7CisJICAgICRjdGV4dCB5dmlldyAkbG9jCisJfQorICAgIH0KK30KKworcHJvYyBjbGVhcl9jdGV4dCB7e2ZpcnN0IDEuMH19IHsKKyAgICBnbG9iYWwgY3RleHQgc21hcmt0b3Agc21hcmtib3QKKworICAgIHNldCBsIFtsaW5kZXggW3NwbGl0ICRmaXJzdCAuXSAwXQorICAgIGlmIHshW2luZm8gZXhpc3RzIHNtYXJrdG9wXSB8fCBbJGN0ZXh0IGNvbXBhcmUgJGZpcnN0IDwgJHNtYXJrdG9wLjBdfSB7CisJc2V0IHNtYXJrdG9wICRsCisgICAgfQorICAgIGlmIHshW2luZm8gZXhpc3RzIHNtYXJrYm90XSB8fCBbJGN0ZXh0IGNvbXBhcmUgJGZpcnN0IDwgJHNtYXJrYm90LjBdfSB7CisJc2V0IHNtYXJrYm90ICRsCisgICAgfQorICAgICRjdGV4dCBkZWxldGUgJGZpcnN0IGVuZAorfQorCitwcm9jIGluY3JzZWFyY2gge25hbWUgaXggb3B9IHsKKyAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KKworICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKKyAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggYW5jaG9yfV19IHsKKwkjIG5vIGFuY2hvciBzZXQsIHVzZSBzdGFydCBvZiBzZWxlY3Rpb24sIG9yIG9mIHZpc2libGUgYXJlYQorCXNldCBzZWwgWyRjdGV4dCB0YWcgcmFuZ2VzIHNlbF0KKwlpZiB7JHNlbCBuZSB7fX0geworCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIFtsaW5kZXggJHNlbCAwXQorCX0gZWxzZWlmIHskc2VhcmNoZGlybiBlcSAiLWZvcndhcmRzIn0geworCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIEAwLDAKKwl9IGVsc2UgeworCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIEAwLFt3aW5mbyBoZWlnaHQgJGN0ZXh0XQorCX0KKyAgICB9CisgICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKKwlzZXQgaGVyZSBbJGN0ZXh0IHNlYXJjaCAkc2VhcmNoZGlybiAtLSAkc2VhcmNoc3RyaW5nIGFuY2hvcl0KKwlpZiB7JGhlcmUgbmUge319IHsKKwkgICAgJGN0ZXh0IHNlZSAkaGVyZQorCX0KKwlzZWFyY2htYXJrdmlzaWJsZSAxCisgICAgfQorfQorCitwcm9jIGRvc2VhcmNoIHt9IHsKKyAgICBnbG9iYWwgc3N0cmluZyBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgorCisgICAgZm9jdXMgJHNzdHJpbmcKKyAgICAkc3N0cmluZyBpY3Vyc29yIGVuZAorICAgIHNldCBzZWFyY2hkaXJuIC1mb3J3YXJkcworICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CisJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQorCWlmIHskc2VsIG5lIHt9fSB7CisJICAgIHNldCBzdGFydCAiW2xpbmRleCAkc2VsIDBdICsgMWMiCisJfSBlbHNlaWYge1tjYXRjaCB7c2V0IHN0YXJ0IFskY3RleHQgaW5kZXggYW5jaG9yXX1dfSB7CisJICAgIHNldCBzdGFydCAiQDAsMCIKKwl9CisJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1jb3VudCBtbGVuIC0tICRzZWFyY2hzdHJpbmcgJHN0YXJ0XQorCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCisJaWYgeyRtYXRjaCBlcSB7fX0geworCSAgICBiZWxsCisJICAgIHJldHVybgorCX0KKwkkY3RleHQgc2VlICRtYXRjaAorCXNldCBtZW5kICIkbWF0Y2ggKyAkbWxlbiBjIgorCSRjdGV4dCB0YWcgYWRkIHNlbCAkbWF0Y2ggJG1lbmQKKwkkY3RleHQgbWFyayB1bnNldCBhbmNob3IKKyAgICB9Cit9CisKK3Byb2MgZG9zZWFyY2hiYWNrIHt9IHsKKyAgICBnbG9iYWwgc3N0cmluZyBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgorCisgICAgZm9jdXMgJHNzdHJpbmcKKyAgICAkc3N0cmluZyBpY3Vyc29yIGVuZAorICAgIHNldCBzZWFyY2hkaXJuIC1iYWNrd2FyZHMKKyAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0geworCXNldCBzZWwgWyRjdGV4dCB0YWcgcmFuZ2VzIHNlbF0KKwlpZiB7JHNlbCBuZSB7fX0geworCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkc2VsIDBdCisJfSBlbHNlaWYge1tjYXRjaCB7c2V0IHN0YXJ0IFskY3RleHQgaW5kZXggYW5jaG9yXX1dfSB7CisJICAgIHNldCBzdGFydCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KKwl9CisJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1iYWNrd2FyZHMgLWNvdW50IG1sIC0tICRzZWFyY2hzdHJpbmcgJHN0YXJ0XQorCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCisJaWYgeyRtYXRjaCBlcSB7fX0geworCSAgICBiZWxsCisJICAgIHJldHVybgorCX0KKwkkY3RleHQgc2VlICRtYXRjaAorCXNldCBtZW5kICIkbWF0Y2ggKyAkbWwgYyIKKwkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCisJJGN0ZXh0IG1hcmsgdW5zZXQgYW5jaG9yCisgICAgfQorfQorCitwcm9jIHNlYXJjaG1hcmsge2ZpcnN0IGxhc3R9IHsKKyAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nCisKKyAgICBzZXQgbWVuZCAkZmlyc3QuMAorICAgIHdoaWxlIHsxfSB7CisJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1jb3VudCBtbGVuIC0tICRzZWFyY2hzdHJpbmcgJG1lbmQgJGxhc3QuZW5kXQorCWlmIHskbWF0Y2ggZXEge319IGJyZWFrCisJc2V0IG1lbmQgIiRtYXRjaCArICRtbGVuIGMiCisJJGN0ZXh0IHRhZyBhZGQgZm91bmQgJG1hdGNoICRtZW5kCisgICAgfQorfQorCitwcm9jIHNlYXJjaG1hcmt2aXNpYmxlIHtkb2FsbH0geworICAgIGdsb2JhbCBjdGV4dCBzbWFya3RvcCBzbWFya2JvdAorCisgICAgc2V0IHRvcGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCwwXSAuXSAwXQorICAgIHNldCBib3RsaW5lIFtsaW5kZXggW3NwbGl0IFskY3RleHQgaW5kZXggQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdXSAuXSAwXQorICAgIGlmIHskZG9hbGwgfHwgJGJvdGxpbmUgPCAkc21hcmt0b3AgfHwgJHRvcGxpbmUgPiAkc21hcmtib3R9IHsKKwkjIG5vIG92ZXJsYXAgd2l0aCBwcmV2aW91cworCXNlYXJjaG1hcmsgJHRvcGxpbmUgJGJvdGxpbmUKKwlzZXQgc21hcmt0b3AgJHRvcGxpbmUKKwlzZXQgc21hcmtib3QgJGJvdGxpbmUKKyAgICB9IGVsc2UgeworCWlmIHskdG9wbGluZSA8ICRzbWFya3RvcH0geworCSAgICBzZWFyY2htYXJrICR0b3BsaW5lIFtleHByIHskc21hcmt0b3AtMX1dCisJICAgIHNldCBzbWFya3RvcCAkdG9wbGluZQorCX0KKwlpZiB7JGJvdGxpbmUgPiAkc21hcmtib3R9IHsKKwkgICAgc2VhcmNobWFyayBbZXhwciB7JHNtYXJrYm90KzF9XSAkYm90bGluZQorCSAgICBzZXQgc21hcmtib3QgJGJvdGxpbmUKKwl9CisgICAgfQorfQorCitwcm9jIHNjcm9sbHRleHQge2YwIGYxfSB7CisgICAgZ2xvYmFsIHNlYXJjaHN0cmluZworCisgICAgLmN0b3AuY2RldC5sZWZ0LnNiIHNldCAkZjAgJGYxCisgICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKKwlzZWFyY2htYXJrdmlzaWJsZSAwCisgICAgfQorfQorCitwcm9jIHNldGNvb3JkcyB7fSB7CisgICAgZ2xvYmFsIGxpbmVzcGMgY2hhcnNwYyBjYW52eDAgY2FudnkwIG1haW5mb250CisgICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKKworICAgIHNldCBsaW5lc3BjIFtmb250IG1ldHJpY3MgJG1haW5mb250IC1saW5lc3BhY2VdCisgICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQorICAgIHNldCBjYW52eTAgW2V4cHIge2ludCgzICsgMC41ICogJGxpbmVzcGMpfV0KKyAgICBzZXQgY2FudngwIFtleHByIHtpbnQoMyArIDAuNSAqICRsaW5lc3BjKX1dCisgICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCisgICAgc2V0IHhzcGMxKDApICRsaW5lc3BjCisgICAgc2V0IHhzcGMyICRsaW5lc3BjCit9CisKK3Byb2MgcmVkaXNwbGF5IHt9IHsKKyAgICBnbG9iYWwgY2FudgorICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKKworICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KKyAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCisgICAgc2V0IHNwYW4gWyRjYW52IHl2aWV3XQorICAgIGNsZWFyX2Rpc3BsYXkKKyAgICBzZXRjYW52c2Nyb2xsCisgICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtsaW5kZXggJHNwYW4gMF0KKyAgICBkcmF3dmlzaWJsZQorICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0geworCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCisgICAgfQorfQorCitwcm9jIGluY3Jmb250IHtpbmN9IHsKKyAgICBnbG9iYWwgbWFpbmZvbnQgdGV4dGZvbnQgY3RleHQgY2FudiBwaGFzZQorICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKKyAgICB1bm1hcmttYXRjaGVzCisgICAgc2V0IG1haW5mb250IFtscmVwbGFjZSAkbWFpbmZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRtYWluZm9udCAxXSArICRpbmN9XV0KKyAgICBzZXQgdGV4dGZvbnQgW2xyZXBsYWNlICR0ZXh0Zm9udCAxIDEgW2V4cHIge1tsaW5kZXggJHRleHRmb250IDFdICsgJGluY31dXQorICAgIHNldGNvb3JkcworICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAorICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCisgICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKKwkkZSBjb25mIC1mb250ICRtYWluZm9udAorICAgIH0KKyAgICBpZiB7JHBoYXNlIGVxICJnZXRjb21taXRzIn0geworCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKKyAgICB9CisgICAgcmVkaXNwbGF5Cit9CisKK3Byb2MgY2xlYXJzaGExIHt9IHsKKyAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKKyAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNoYTFzdHJpbmddID09IDQwfSB7CisJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKKyAgICB9Cit9CisKK3Byb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKKyAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgc2hhMWJ1dAorICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQorCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0geworCXNldCBzdGF0ZSBkaXNhYmxlZAorICAgIH0gZWxzZSB7CisJc2V0IHN0YXRlIG5vcm1hbAorICAgIH0KKyAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgorICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKKwkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBub3JtYWwgLXJlbGllZiByYWlzZWQgLXRleHQgIkdvdG86ICIKKyAgICB9IGVsc2UgeworCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgorICAgIH0KK30KKworcHJvYyBnb3RvY29tbWl0IHt9IHsKKyAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgY29tbWl0cm93IHRhZ2lkcyBoZWFkaWRzCisgICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIGN1cnZpZXcKKworICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQorCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gcmV0dXJuCisgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0geworCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQorICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkc2hhMXN0cmluZyldfSB7CisJc2V0IGlkICRoZWFkaWRzKCRzaGExc3RyaW5nKQorICAgIH0gZWxzZSB7CisJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KKwlpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0geworCSAgICBzZXQgbWF0Y2hlcyB7fQorCSAgICBmb3JlYWNoIGkgJGRpc3BsYXlvcmRlciB7CisJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGldfSB7CisJCSAgICBsYXBwZW5kIG1hdGNoZXMgJGkKKwkJfQorCSAgICB9CisJICAgIGlmIHskbWF0Y2hlcyBuZSB7fX0geworCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0geworCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKKwkJICAgIHJldHVybgorCQl9CisJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CisJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQorCXJldHVybgorICAgIH0KKyAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQsfSR9ICRzaGExc3RyaW5nXX0geworCXNldCB0eXBlICJTSEExIGlkIgorICAgIH0gZWxzZSB7CisJc2V0IHR5cGUgIlRhZy9IZWFkIgorICAgIH0KKyAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgorfQorCitwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CisgICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCisgICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgorCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXSAmJiAhW2dldGNvbW1pdCAkaWRdfSByZXR1cm4KKyAgICBzZXQgaG92ZXJ4ICR4CisgICAgc2V0IGhvdmVyeSAkeQorICAgIHNldCBob3ZlcmlkICRpZAorICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKKwlhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKKyAgICB9CisgICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCisgICAgJGNhbnYgZGVsZXRlIGhvdmVyCit9CisKK3Byb2MgbGluZW1vdGlvbiB7eCB5IGlkfSB7CisgICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCisKKyAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0geworCXNldCBob3ZlcnggJHgKKwlzZXQgaG92ZXJ5ICR5CisJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0geworCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKKwl9CisJc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCisgICAgfQorfQorCitwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKKyAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKKworICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CisJJGNhbnYgZGVsZXRlIGhvdmVyCisJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0geworCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKKwkgICAgdW5zZXQgaG92ZXJ0aW1lcgorCX0KKwl1bnNldCBob3ZlcmlkCisgICAgfQorfQorCitwcm9jIGxpbmVob3ZlciB7fSB7CisgICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCisgICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCisgICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKKworICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCisgICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQorICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCisgICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQorICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KKyAgICBzZXQgeSBbZXhwciB7JGhvdmVyeSArICR5ZnJhYyAqICR5bWF4IC0gJGxpbmVzcGMgLyAyfV0KKyAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KKyAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KKyAgICBzZXQgeDEgW2V4cHIgeyR4ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdICsgMiAqICRsdGhpY2tuZXNzfV0KKyAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQorICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCisJICAgICAgIC1maWxsIFwjZmZmZjgwIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxIC10YWdzIGhvdmVyXQorICAgICRjYW52IHJhaXNlICR0CisgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgLWZvbnQgJG1haW5mb250XQorICAgICRjYW52IHJhaXNlICR0Cit9CisKK3Byb2MgY2xpY2tpc29uYXJyb3cge2lkIHl9IHsKKyAgICBnbG9iYWwgbHRoaWNrbmVzcworCisgICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KKyAgICBzZXQgdGhyZXNoIFtleHByIHsyICogJGx0aGlja25lc3MgKyA2fV0KKyAgICBzZXQgbiBbZXhwciB7W2xsZW5ndGggJHJhbmdlc10gLSAxfV0KKyAgICBmb3Ige3NldCBpIDF9IHskaSA8ICRufSB7aW5jciBpfSB7CisJc2V0IHJvdyBbbGluZGV4ICRyYW5nZXMgJGldCisJaWYge2FicyhbeWMgJHJvd10gLSAkeSkgPCAkdGhyZXNofSB7CisJICAgIHJldHVybiAkaQorCX0KKyAgICB9CisgICAgcmV0dXJuIHt9Cit9CisKK3Byb2MgYXJyb3dqdW1wIHtpZCBuIHl9IHsKKyAgICBnbG9iYWwgY2FudgorCisgICAgIyAxIDwtPiAyLCAzIDwtPiA0LCBldGMuLi4KKyAgICBzZXQgbiBbZXhwciB7KCgkbiAtIDEpIF4gMSkgKyAxfV0KKyAgICBzZXQgcm93IFtsaW5kZXggW3Jvd3JhbmdlcyAkaWRdICRuXQorICAgIHNldCB5dCBbeWMgJHJvd10KKyAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisgICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4IDw9IDB9IHJldHVybgorICAgIHNldCB2aWV3IFskY2FudiB5dmlld10KKyAgICBzZXQgeXNwYW4gW2V4cHIge1tsaW5kZXggJHZpZXcgMV0gLSBbbGluZGV4ICR2aWV3IDBdfV0KKyAgICBzZXQgeWZyYWMgW2V4cHIgeyR5dCAvICR5bWF4IC0gJHlzcGFuIC8gMn1dCisgICAgaWYgeyR5ZnJhYyA8IDB9IHsKKwlzZXQgeWZyYWMgMAorICAgIH0KKyAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gJHlmcmFjCit9CisKK3Byb2MgbGluZWNsaWNrIHt4IHkgaWQgaXNuZXd9IHsKKyAgICBnbG9iYWwgY3RleHQgY29tbWl0aW5mbyBjaGlsZHJlbiBjYW52IHRoaWNrZXJsaW5lIGN1cnZpZXcKKworICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCisgICAgdW5tYXJrbWF0Y2hlcworICAgIHVuc2VsZWN0bGluZQorICAgIG5vcm1hbGxpbmUKKyAgICAkY2FudiBkZWxldGUgaG92ZXIKKyAgICAjIGRyYXcgdGhpcyBsaW5lIHRoaWNrZXIgdGhhbiBub3JtYWwKKyAgICBzZXQgdGhpY2tlcmxpbmUgJGlkCisgICAgZHJhd2xpbmVzICRpZAorICAgIGlmIHskaXNuZXd9IHsKKwlzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCisJaWYgeyR5bWF4IGVxIHt9fSByZXR1cm4KKwlzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCisJc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQorICAgIH0KKyAgICBzZXQgZGlybiBbY2xpY2tpc29uYXJyb3cgJGlkICR5XQorICAgIGlmIHskZGlybiBuZSB7fX0geworCWFycm93anVtcCAkaWQgJGRpcm4gJHkKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiB7JGlzbmV3fSB7CisJYWRkdG9oaXN0b3J5IFtsaXN0IGxpbmVjbGljayAkeCAkeSAkaWQgMF0KKyAgICB9CisgICAgIyBmaWxsIHRoZSBkZXRhaWxzIHBhbmUgd2l0aCBpbmZvIGFib3V0IHRoaXMgbGluZQorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKKyAgICBjbGVhcl9jdGV4dAorICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCisgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KKyAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCisgICAgJGN0ZXh0IGluc2VydCBlbmQgJGlkIFtsaXN0IGxpbmsgbGluazBdCisgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRpZF0KKyAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCisgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdXG4iCisgICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXVxuIgorICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCisgICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0RGF0ZTpcdCRkYXRlXG4iCisgICAgc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKKyAgICBpZiB7JGtpZHMgbmUge319IHsKKwkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCisJc2V0IGkgMAorCWZvcmVhY2ggY2hpbGQgJGtpZHMgeworCSAgICBpbmNyIGkKKwkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkY2hpbGQpXSAmJiAhW2dldGNvbW1pdCAkY2hpbGRdfSBjb250aW51ZQorCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCisJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0IgorCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAkY2hpbGQgW2xpc3QgbGluayBsaW5rJGldCisJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQorCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF0iCisJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXSIKKwkgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KKwkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHREYXRlOlx0JGRhdGVcbiIKKwl9CisgICAgfQorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorICAgIGluaXRfZmxpc3Qge30KK30KKworcHJvYyBub3JtYWxsaW5lIHt9IHsKKyAgICBnbG9iYWwgdGhpY2tlcmxpbmUKKyAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXX0geworCXNldCBpZCAkdGhpY2tlcmxpbmUKKwl1bnNldCB0aGlja2VybGluZQorCWRyYXdsaW5lcyAkaWQKKyAgICB9Cit9CisKK3Byb2Mgc2VsYnlpZCB7aWR9IHsKKyAgICBnbG9iYWwgY29tbWl0cm93IGN1cnZpZXcKKyAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0geworCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDEKKyAgICB9Cit9CisKK3Byb2MgbXN0aW1lIHt9IHsKKyAgICBnbG9iYWwgc3RhcnRtc3RpbWUKKyAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGFydG1zdGltZV19IHsKKwlzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQorICAgIH0KKyAgICByZXR1cm4gW2Zvcm1hdCAiJS4zZiIgW2V4cHIgeyhbY2xvY2sgY2xpY2sgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc3RpbWUpIC8gMTAwMC4wfV1dCit9CisKK3Byb2Mgcm93bWVudSB7eCB5IGlkfSB7CisgICAgZ2xvYmFsIHJvd2N0eG1lbnUgY29tbWl0cm93IHNlbGVjdGVkbGluZSByb3dtZW51aWQgY3VydmlldworCisgICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQorCXx8ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CisJc2V0IHN0YXRlIGRpc2FibGVkCisgICAgfSBlbHNlIHsKKwlzZXQgc3RhdGUgbm9ybWFsCisgICAgfQorICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDAgLXN0YXRlICRzdGF0ZQorICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQorICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDIgLXN0YXRlICRzdGF0ZQorICAgIHNldCByb3dtZW51aWQgJGlkCisgICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKK30KKworcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKKyAgICBnbG9iYWwgcm93bWVudWlkIHNlbGVjdGVkbGluZSBkaXNwbGF5b3JkZXIKKworICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgorICAgIGlmIHskZGlybn0geworCXNldCBvbGRpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KKwlzZXQgbmV3aWQgJHJvd21lbnVpZAorICAgIH0gZWxzZSB7CisJc2V0IG9sZGlkICRyb3dtZW51aWQKKwlzZXQgbmV3aWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCisgICAgfQorICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KKyAgICBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZAorfQorCitwcm9jIGRvc2VsZGlmZiB7b2xkaWQgbmV3aWR9IHsKKyAgICBnbG9iYWwgY3RleHQKKyAgICBnbG9iYWwgY29tbWl0aW5mbworCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGNsZWFyX2N0ZXh0CisgICAgaW5pdF9mbGlzdCAiVG9wIgorICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICIKKyAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQorICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CisgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KKyAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICRvbGRpZCBbbGlzdCBsaW5rIGxpbmswXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgorICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQorICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAiCisgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsxIDwxPiBbbGlzdCBzZWxieWlkICRuZXdpZF0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKKyAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KKyAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisgICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKKyAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCisgICAgc3RhcnRkaWZmIFtsaXN0ICRvbGRpZCAkbmV3aWRdCit9CisKK3Byb2MgbWtwYXRjaCB7fSB7CisgICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJyZW50aWQgY29tbWl0aW5mbyBwYXRjaHRvcCBwYXRjaG51bQorCisgICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCisgICAgc2V0IG9sZGlkICRjdXJyZW50aWQKKyAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KKyAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAorICAgIHNldCBuZXdoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQorICAgIHNldCB0b3AgLnBhdGNoCisgICAgc2V0IHBhdGNodG9wICR0b3AKKyAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQorICAgIHRvcGxldmVsICR0b3AKKyAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKKyAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAorICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCisgICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CisgICAgJHRvcC5mcm9tc2hhMSBpbnNlcnQgMCAkb2xkaWQKKyAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CisgICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKKyAgICBlbnRyeSAkdG9wLmZyb21oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKKyAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCisgICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQorICAgIGdyaWQgeCAkdG9wLmZyb21oZWFkIC1zdGlja3kgdworICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKKyAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CisgICAgJHRvcC50b3NoYTEgaW5zZXJ0IDAgJG5ld2lkCisgICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CisgICAgZW50cnkgJHRvcC50b2hlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAorICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCisgICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkIHggJHRvcC50b2hlYWQgLXN0aWNreSB3CisgICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKKyAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKKyAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAorICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCisgICAgaW5jciBwYXRjaG51bQorICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CisgICAgZnJhbWUgJHRvcC5idXRzCisgICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkdlbmVyYXRlIiAtY29tbWFuZCBta3BhdGNoZ28KKyAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCisgICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KKyAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CisgICAgZm9jdXMgJHRvcC5mbmFtZQorfQorCitwcm9jIG1rcGF0Y2hyZXYge30geworICAgIGdsb2JhbCBwYXRjaHRvcAorCisgICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQorICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQorICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCisgICAgc2V0IG5ld2hlYWQgWyRwYXRjaHRvcC50b2hlYWQgZ2V0XQorICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCisJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0geworCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSBub3JtYWwKKwkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCisJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CisJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIHJlYWRvbmx5CisgICAgfQorfQorCitwcm9jIG1rcGF0Y2hnbyB7fSB7CisgICAgZ2xvYmFsIHBhdGNodG9wCisKKyAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCisgICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KKyAgICBzZXQgZm5hbWUgWyRwYXRjaHRvcC5mbmFtZSBnZXRdCisgICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQgZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CisJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgorICAgIH0KKyAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CisgICAgdW5zZXQgcGF0Y2h0b3AKK30KKworcHJvYyBta3BhdGNoY2FuIHt9IHsKKyAgICBnbG9iYWwgcGF0Y2h0b3AKKworICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KKyAgICB1bnNldCBwYXRjaHRvcAorfQorCitwcm9jIG1rdGFnIHt9IHsKKyAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KKworICAgIHNldCB0b3AgLm1ha2V0YWcKKyAgICBzZXQgbWt0YWd0b3AgJHRvcAorICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CisgICAgdG9wbGV2ZWwgJHRvcAorICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCisgICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCisgICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKKyAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAorICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQorICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CisgICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKKyAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQorICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQorICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CisgICAgbGFiZWwgJHRvcC50bGFiIC10ZXh0ICJUYWcgbmFtZToiCisgICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCisgICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CisgICAgZnJhbWUgJHRvcC5idXRzCisgICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbworICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCisgICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KKyAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CisgICAgZm9jdXMgJHRvcC50YWcKK30KKworcHJvYyBkb21rdGFnIHt9IHsKKyAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKKworICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQorICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQorICAgIGlmIHskdGFnID09IHt9fSB7CisJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKKwlyZXR1cm4KKyAgICB9CisgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CisJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKKwlyZXR1cm4KKyAgICB9CisgICAgaWYge1tjYXRjaCB7CisJc2V0IGRpciBbZ2l0ZGlyXQorCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KKwlzZXQgZiBbb3BlbiAkZm5hbWUgd10KKwlwdXRzICRmICRpZAorCWNsb3NlICRmCisgICAgfSBlcnJdfSB7CisJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHRhZzogJGVyciIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAorICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZworICAgIHJlZHJhd3RhZ3MgJGlkCit9CisKK3Byb2MgcmVkcmF3dGFncyB7aWR9IHsKKyAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBjb21taXRyb3cgaWRwb3Mgc2VsZWN0ZWRsaW5lIGN1cnZpZXcKKyAgICBnbG9iYWwgbWFpbmZvbnQKKworICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gcmV0dXJuCisgICAgZHJhd2NtaXRyb3cgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCisgICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKKyAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQorICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQorICAgIHNldCB0ZXh0IFskY2FudiBpdGVtY2dldCAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAtdGV4dF0KKyAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XX1dCisgICAgaWYgeyR4ciA+ICRjYW52eG1heH0geworCXNldCBjYW52eG1heCAkeHIKKwlzZXRjYW52c2Nyb2xsCisgICAgfQorICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQorCSYmICRzZWxlY3RlZGxpbmUgPT0gJGNvbW1pdHJvdygkY3VydmlldywkaWQpfSB7CisJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKKyAgICB9Cit9CisKK3Byb2MgbWt0YWdjYW4ge30geworICAgIGdsb2JhbCBta3RhZ3RvcAorCisgICAgY2F0Y2gge2Rlc3Ryb3kgJG1rdGFndG9wfQorICAgIHVuc2V0IG1rdGFndG9wCit9CisKK3Byb2MgbWt0YWdnbyB7fSB7CisgICAgZG9ta3RhZworICAgIG1rdGFnY2FuCit9CisKK3Byb2Mgd3JpdGVjb21taXQge30geworICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAorCisgICAgc2V0IHRvcCAud3JpdGVjb21taXQKKyAgICBzZXQgd3Jjb210b3AgJHRvcAorICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CisgICAgdG9wbGV2ZWwgJHRvcAorICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgorICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCisgICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgorICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CisgICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKKyAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdworICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CisgICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KKyAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKKyAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdworICAgIGxhYmVsICR0b3AuY2xhYiAtdGV4dCAiQ29tbWFuZDoiCisgICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKKyAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKKyAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAorICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQorICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CisgICAgZnJhbWUgJHRvcC5idXRzCisgICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCisgICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgd3Jjb21jYW4KKyAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgorICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCisgICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKKyAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKKyAgICBmb2N1cyAkdG9wLmZuYW1lCit9CisKK3Byb2Mgd3Jjb21nbyB7fSB7CisgICAgZ2xvYmFsIHdyY29tdG9wCisKKyAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KKyAgICBzZXQgY21kICJlY2hvICRpZCB8IFskd3Jjb210b3AuY21kIGdldF0iCisgICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQorICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKKwllcnJvcl9wb3B1cCAiRXJyb3Igd3JpdGluZyBjb21taXQ6ICRlcnIiCisgICAgfQorICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KKyAgICB1bnNldCB3cmNvbXRvcAorfQorCitwcm9jIHdyY29tY2FuIHt9IHsKKyAgICBnbG9iYWwgd3Jjb210b3AKKworICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KKyAgICB1bnNldCB3cmNvbXRvcAorfQorCisjIFN0dWZmIGZvciBmaW5kaW5nIG5lYXJieSB0YWdzCitwcm9jIGdldGFsbGNvbW1pdHMge30geworICAgIGdsb2JhbCBhbGxjc3RhcnQgYWxsY29tbWl0cyBhbGxjZmQKKworICAgIHNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0tYWxsIC0tdG9wby1vcmRlciAtLXBhcmVudHNdIHJdCisgICAgc2V0IGFsbGNmZCAkZmQKKyAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMAorICAgIHNldCBhbGxjb21taXRzICJyZWFkaW5nIgorICAgIG5vd2J1c3kgYWxsY29tbWl0cworICAgIHJlc3RhcnRnZXRhbGwgJGZkCit9CisKK3Byb2MgZGlzY2FyZGFsbGNvbW1pdHMge30geworICAgIGdsb2JhbCBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMgYWxsY2ZkCisgICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBhbGxkdGFncyB0YWdpc2Rlc2MgYWxsaWRzIGRlc2NfaGVhZHMKKworICAgIGlmIHshW2luZm8gZXhpc3RzIGFsbGNvbW1pdHNdfSByZXR1cm4KKyAgICBpZiB7JGFsbGNvbW1pdHMgZXEgInJlYWRpbmcifSB7CisJY2F0Y2gge2Nsb3NlICRhbGxjZmR9CisgICAgfQorICAgIGZvcmVhY2ggdiB7YWxsY29tbWl0cyBhbGxjaGlsZHJlbiBhbGxwYXJlbnRzIGFsbGlkcyBkZXNjX3RhZ3MgYW5jX3RhZ3MKKwkJYWxsZHRhZ3MgdGFnaXNkZXNjIGRlc2NfaGVhZHN9IHsKKwljYXRjaCB7dW5zZXQgJHZ9CisgICAgfQorfQorCitwcm9jIHJlc3RhcnRnZXRhbGwge2ZkfSB7CisgICAgZ2xvYmFsIGFsbGNzdGFydAorCisgICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRhbGxjbGluZXMgJGZkXQorICAgIHNldCBhbGxjc3RhcnQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQorfQorCitwcm9jIGNvbWJpbmVfZHRhZ3Mge2wxIGwyfSB7CisgICAgZ2xvYmFsIHRhZ2lzZGVzYyBub3RmaXJzdGQKKworICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KKyAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICRyZXNdfSB7aW5jciBpfSB7CisJc2V0IHggW2xpbmRleCAkcmVzICRpXQorCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKKwkgICAgc2V0IHkgW2xpbmRleCAkcmVzICRqXQorCSAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lzZGVzYygkeCwkeSldfSB7CisJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA+IDB9IHsKKwkJICAgICMgeCBpcyBhIGRlc2NlbmRlbnQgb2YgeSwgZXhjbHVkZSB4CisJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRpICRpXQorCQkgICAgaW5jciBpIC0xCisJCSAgICBicmVhaworCQl9IGVsc2UgeworCQkgICAgIyB5IGlzIGEgZGVzY2VuZGVudCBvZiB4LCBleGNsdWRlIHkKKwkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGogJGpdCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJIyBubyByZWxhdGlvbiwga2VlcCBnb2luZworCQlpbmNyIGoKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuICRyZXMKK30KKworcHJvYyBjb21iaW5lX2F0YWdzIHtsMSBsMn0geworICAgIGdsb2JhbCB0YWdpc2Rlc2MKKworICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KKyAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICRyZXNdfSB7aW5jciBpfSB7CisJc2V0IHggW2xpbmRleCAkcmVzICRpXQorCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKKwkgICAgc2V0IHkgW2xpbmRleCAkcmVzICRqXQorCSAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lzZGVzYygkeCwkeSldfSB7CisJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA8IDB9IHsKKwkJICAgICMgeCBpcyBhbiBhbmNlc3RvciBvZiB5LCBleGNsdWRlIHgKKwkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGkgJGldCisJCSAgICBpbmNyIGkgLTEKKwkJICAgIGJyZWFrCisJCX0gZWxzZSB7CisJCSAgICAjIHkgaXMgYW4gYW5jZXN0b3Igb2YgeCwgZXhjbHVkZSB5CisJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRqICRqXQorCQl9CisJICAgIH0gZWxzZSB7CisJCSMgbm8gcmVsYXRpb24sIGtlZXAgZ29pbmcKKwkJaW5jciBqCisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiAkcmVzCit9CisKK3Byb2MgZ2V0YWxsY2xpbmVzIHtmZH0geworICAgIGdsb2JhbCBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMgYWxsY3N0YXJ0CisgICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBpZHRhZ3MgYWxsZHRhZ3MgdGFnaXNkZXNjIGFsbGlkcworICAgIGdsb2JhbCBkZXNjX2hlYWRzIGlkaGVhZHMKKworICAgIHdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0geworCXNldCBpZCBbbGluZGV4ICRsaW5lIDBdCisJbGFwcGVuZCBhbGxpZHMgJGlkCisJc2V0IG9sZHMgW2xyYW5nZSAkbGluZSAxIGVuZF0KKwlzZXQgYWxscGFyZW50cygkaWQpICRvbGRzCisJaWYgeyFbaW5mbyBleGlzdHMgYWxsY2hpbGRyZW4oJGlkKV19IHsKKwkgICAgc2V0IGFsbGNoaWxkcmVuKCRpZCkge30KKwl9CisJZm9yZWFjaCBwICRvbGRzIHsKKwkgICAgbGFwcGVuZCBhbGxjaGlsZHJlbigkcCkgJGlkCisJfQorCSMgY29tcHV0ZSBuZWFyZXN0IHRhZ2dlZCBkZXNjZW5kZW50cyBhcyB3ZSBnbworCSMgYWxzbyBjb21wdXRlIGRlc2NlbmRlbnQgaGVhZHMKKwlzZXQgZHRhZ3Mge30KKwlzZXQgZGhlYWRzIHt9CisJZm9yZWFjaCBjaGlsZCAkYWxsY2hpbGRyZW4oJGlkKSB7CisJICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRjaGlsZCldfSB7CisJCXNldCBjdGFncyBbbGlzdCAkY2hpbGRdCisJICAgIH0gZWxzZSB7CisJCXNldCBjdGFncyAkZGVzY190YWdzKCRjaGlsZCkKKwkgICAgfQorCSAgICBpZiB7JGR0YWdzIGVxIHt9fSB7CisJCXNldCBkdGFncyAkY3RhZ3MKKwkgICAgfSBlbHNlaWYgeyRjdGFncyBuZSAkZHRhZ3N9IHsKKwkJc2V0IGR0YWdzIFtjb21iaW5lX2R0YWdzICRkdGFncyAkY3RhZ3NdCisJICAgIH0KKwkgICAgc2V0IGNoZWFkcyAkZGVzY19oZWFkcygkY2hpbGQpCisJICAgIGlmIHskZGhlYWRzIGVxIHt9fSB7CisJCXNldCBkaGVhZHMgJGNoZWFkcworCSAgICB9IGVsc2VpZiB7JGNoZWFkcyBuZSAkZGhlYWRzfSB7CisJCXNldCBkaGVhZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkZGhlYWRzICRjaGVhZHNdXQorCSAgICB9CisJfQorCXNldCBkZXNjX3RhZ3MoJGlkKSAkZHRhZ3MKKwlpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0geworCSAgICBzZXQgYWR0ICRkdGFncworCSAgICBmb3JlYWNoIHRhZyAkZHRhZ3MgeworCQlzZXQgYWR0IFtjb25jYXQgJGFkdCAkYWxsZHRhZ3MoJHRhZyldCisJICAgIH0KKwkgICAgc2V0IGFkdCBbbHNvcnQgLXVuaXF1ZSAkYWR0XQorCSAgICBzZXQgYWxsZHRhZ3MoJGlkKSAkYWR0CisJICAgIGZvcmVhY2ggdGFnICRhZHQgeworCQlzZXQgdGFnaXNkZXNjKCRpZCwkdGFnKSAtMQorCQlzZXQgdGFnaXNkZXNjKCR0YWcsJGlkKSAxCisJICAgIH0KKwl9CisJaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CisJICAgIGxhcHBlbmQgZGhlYWRzICRpZAorCX0KKwlzZXQgZGVzY19oZWFkcygkaWQpICRkaGVhZHMKKwlpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRhbGxjc3RhcnQgPj0gNTB9IHsKKwkgICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSB7fQorCSAgICBhZnRlciBpZGxlIHJlc3RhcnRnZXRhbGwgJGZkCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgaWYge1tlb2YgJGZkXX0geworCWFmdGVyIGlkbGUgcmVzdGFydGF0YWdzIFtsbGVuZ3RoICRhbGxpZHNdCisJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CisJICAgIGVycm9yX3BvcHVwICJFcnJvciByZWFkaW5nIGZ1bGwgY29tbWl0IGdyYXBoOiAkZXJyLlxuXAorCQkJIFJlc3VsdHMgbWF5IGJlIGluY29tcGxldGUuIgorCX0KKyAgICB9Cit9CisKKyMgd2FsayBiYWNrd2FyZCB0aHJvdWdoIHRoZSB0cmVlIGFuZCBjb21wdXRlIG5lYXJlc3QgdGFnZ2VkIGFuY2VzdG9ycworcHJvYyByZXN0YXJ0YXRhZ3Mge2l9IHsKKyAgICBnbG9iYWwgYWxsaWRzIGFsbHBhcmVudHMgaWR0YWdzIGFuY190YWdzIHQwCisKKyAgICBzZXQgdDAgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQorICAgIHdoaWxlIHtbaW5jciBpIC0xXSA+PSAwfSB7CisJc2V0IGlkIFtsaW5kZXggJGFsbGlkcyAkaV0KKwlzZXQgYXRhZ3Mge30KKwlmb3JlYWNoIHAgJGFsbHBhcmVudHMoJGlkKSB7CisJICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRwKV19IHsKKwkJc2V0IHB0YWdzIFtsaXN0ICRwXQorCSAgICB9IGVsc2UgeworCQlzZXQgcHRhZ3MgJGFuY190YWdzKCRwKQorCSAgICB9CisJICAgIGlmIHskYXRhZ3MgZXEge319IHsKKwkJc2V0IGF0YWdzICRwdGFncworCSAgICB9IGVsc2VpZiB7JHB0YWdzIG5lICRhdGFnc30geworCQlzZXQgYXRhZ3MgW2NvbWJpbmVfYXRhZ3MgJGF0YWdzICRwdGFnc10KKwkgICAgfQorCX0KKwlzZXQgYW5jX3RhZ3MoJGlkKSAkYXRhZ3MKKwlpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICR0MCA+PSA1MH0geworCSAgICBhZnRlciBpZGxlIHJlc3RhcnRhdGFncyAkaQorCSAgICByZXR1cm4KKwl9CisgICAgfQorICAgIHNldCBhbGxjb21taXRzICJkb25lIgorICAgIG5vdGJ1c3kgYWxsY29tbWl0cworICAgIGRpc3BuZWFydGFncworfQorCitwcm9jIHJlcmVhZHJlZnMge30geworICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcworCisgICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKKwkJICAgIFthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXQorICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CisJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CisJICAgIHNldCByZWYoJGlkKSBbbGlzdHJlZnMgJGlkXQorCX0KKyAgICB9CisgICAgcmVhZHJlZnMKKyAgICBzZXQgcmVmaWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJHJlZmlkcyBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCisJCQlbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV1dCisgICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKKwlzZXQgdiBbbGlzdHJlZnMgJGlkXQorCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXSB8fCAkcmVmKCRpZCkgIT0gJHZ9IHsKKwkgICAgcmVkcmF3dGFncyAkaWQKKwl9CisgICAgfQorfQorCitwcm9jIHNob3d0YWcge3RhZyBpc25ld30geworICAgIGdsb2JhbCBjdGV4dCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bQorCisgICAgaWYgeyRpc25ld30geworCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KKyAgICB9CisgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorICAgIGNsZWFyX2N0ZXh0CisgICAgc2V0IGxpbmtudW0gMAorICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnY29udGVudHMoJHRhZyldfSB7CisJc2V0IHRleHQgJHRhZ2NvbnRlbnRzKCR0YWcpCisgICAgfSBlbHNlIHsKKwlzZXQgdGV4dCAiVGFnOiAkdGFnXG5JZDogICR0YWdpZHMoJHRhZykiCisgICAgfQorICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dCB7fQorICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorICAgIGluaXRfZmxpc3Qge30KK30KKworcHJvYyBkb3F1aXQge30geworICAgIGdsb2JhbCBzdG9wcGVkCisgICAgc2V0IHN0b3BwZWQgMTAwCisgICAgZGVzdHJveSAuCit9CisKK3Byb2MgZG9wcmVmcyB7fSB7CisgICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzCisgICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncworCisgICAgc2V0IHRvcCAuZ2l0a3ByZWZzCisgICAgc2V0IHByZWZzdG9wICR0b3AKKyAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0geworCXJhaXNlICR0b3AKKwlyZXR1cm4KKyAgICB9CisgICAgZm9yZWFjaCB2IHttYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBzaG93bmVhcnRhZ3N9IHsKKwlzZXQgb2xkcHJlZnMoJHYpIFtzZXQgJHZdCisgICAgfQorICAgIHRvcGxldmVsICR0b3AKKyAgICB3bSB0aXRsZSAkdG9wICJHaXRrIHByZWZlcmVuY2VzIgorICAgIGxhYmVsICR0b3AubGRpc3AgLXRleHQgIkNvbW1pdCBsaXN0IGRpc3BsYXkgb3B0aW9ucyIKKyAgICBncmlkICR0b3AubGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKKyAgICBsYWJlbCAkdG9wLnNwYWNlciAtdGV4dCAiICIKKyAgICBsYWJlbCAkdG9wLm1heHdpZHRobCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAobGluZXMpIiBcCisJLWZvbnQgb3B0aW9uZm9udAorICAgIHNwaW5ib3ggJHRvcC5tYXh3aWR0aCAtZnJvbSAwIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXh3aWR0aAorICAgIGdyaWQgJHRvcC5zcGFjZXIgJHRvcC5tYXh3aWR0aGwgJHRvcC5tYXh3aWR0aCAtc3RpY2t5IHcKKyAgICBsYWJlbCAkdG9wLm1heHBjdGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKCUgb2YgcGFuZSkiIFwKKwktZm9udCBvcHRpb25mb250CisgICAgc3BpbmJveCAkdG9wLm1heHBjdCAtZnJvbSAxIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXhncmFwaHBjdAorICAgIGdyaWQgeCAkdG9wLm1heHBjdGwgJHRvcC5tYXhwY3QgLXN0aWNreSB3CisgICAgbGFiZWwgJHRvcC5kZGlzcCAtdGV4dCAiRGlmZiBkaXNwbGF5IG9wdGlvbnMiCisgICAgZ3JpZCAkdG9wLmRkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCisgICAgbGFiZWwgJHRvcC5kaWZmb3B0bCAtdGV4dCAiT3B0aW9ucyBmb3IgZGlmZiBwcm9ncmFtIiBcCisJLWZvbnQgb3B0aW9uZm9udAorICAgIGVudHJ5ICR0b3AuZGlmZm9wdCAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBkaWZmb3B0cworICAgIGdyaWQgeCAkdG9wLmRpZmZvcHRsICR0b3AuZGlmZm9wdCAtc3RpY2t5IHcKKyAgICBmcmFtZSAkdG9wLm50YWcKKyAgICBsYWJlbCAkdG9wLm50YWcubCAtdGV4dCAiRGlzcGxheSBuZWFyYnkgdGFncyIgLWZvbnQgb3B0aW9uZm9udAorICAgIGNoZWNrYnV0dG9uICR0b3AubnRhZy5iIC12YXJpYWJsZSBzaG93bmVhcnRhZ3MKKyAgICBwYWNrICR0b3AubnRhZy5iICR0b3AubnRhZy5sIC1zaWRlIGxlZnQKKyAgICBncmlkIHggJHRvcC5udGFnIC1zdGlja3kgdworICAgIGZyYW1lICR0b3AuYnV0cworICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBwcmVmc29rCisgICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgcHJlZnNjYW4KKyAgICBncmlkICR0b3AuYnV0cy5vayAkdG9wLmJ1dHMuY2FuCisgICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKKyAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQorICAgIGdyaWQgJHRvcC5idXRzIC0gLSAtcGFkeSAxMCAtc3RpY2t5IGV3Cit9CisKK3Byb2MgcHJlZnNjYW4ge30geworICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cworICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKKworICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzfSB7CisJc2V0ICR2ICRvbGRwcmVmcygkdikKKyAgICB9CisgICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQorICAgIHVuc2V0IHByZWZzdG9wCit9CisKK3Byb2MgcHJlZnNvayB7fSB7CisgICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0CisgICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncworCisgICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQorICAgIHVuc2V0IHByZWZzdG9wCisgICAgaWYgeyRtYXh3aWR0aCAhPSAkb2xkcHJlZnMobWF4d2lkdGgpCisJfHwgJG1heGdyYXBocGN0ICE9ICRvbGRwcmVmcyhtYXhncmFwaHBjdCl9IHsKKwlyZWRpc3BsYXkKKyAgICB9IGVsc2VpZiB7JHNob3duZWFydGFncyAhPSAkb2xkcHJlZnMoc2hvd25lYXJ0YWdzKX0geworCXJlc2VsZWN0bGluZQorICAgIH0KK30KKworcHJvYyBmb3JtYXRkYXRlIHtkfSB7CisgICAgcmV0dXJuIFtjbG9jayBmb3JtYXQgJGQgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQorfQorCisjIFRoaXMgbGlzdCBvZiBlbmNvZGluZyBuYW1lcyBhbmQgYWxpYXNlcyBpcyBkaXN0aWxsZWQgZnJvbQorIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzLgorIyBOb3QgYWxsIG9mIHRoZW0gYXJlIHN1cHBvcnRlZCBieSBUY2wuCitzZXQgZW5jb2RpbmdfYWxpYXNlcyB7CisgICAgeyBBTlNJX1gzLjQtMTk2OCBpc28taXItNiBBTlNJX1gzLjQtMTk4NiBJU09fNjQ2LmlydjoxOTkxIEFTQ0lJCisgICAgICBJU082NDYtVVMgVVMtQVNDSUkgdXMgSUJNMzY3IGNwMzY3IGNzQVNDSUkgfQorICAgIHsgSVNPLTEwNjQ2LVVURi0xIGNzSVNPMTA2NDZVVEYxIH0KKyAgICB7IElTT182NDYuYmFzaWM6MTk4MyByZWYgY3NJU082NDZiYXNpYzE5ODMgfQorICAgIHsgSU5WQVJJQU5UIGNzSU5WQVJJQU5UIH0KKyAgICB7IElTT182NDYuaXJ2OjE5ODMgaXNvLWlyLTIgaXJ2IGNzSVNPMkludGxSZWZWZXJzaW9uIH0KKyAgICB7IEJTXzQ3MzAgaXNvLWlyLTQgSVNPNjQ2LUdCIGdiIHVrIGNzSVNPNFVuaXRlZEtpbmdkb20gfQorICAgIHsgTkFUUy1TRUZJIGlzby1pci04LTEgY3NOQVRTU0VGSSB9CisgICAgeyBOQVRTLVNFRkktQUREIGlzby1pci04LTIgY3NOQVRTU0VGSUFERCB9CisgICAgeyBOQVRTLURBTk8gaXNvLWlyLTktMSBjc05BVFNEQU5PIH0KKyAgICB7IE5BVFMtREFOTy1BREQgaXNvLWlyLTktMiBjc05BVFNEQU5PQUREIH0KKyAgICB7IFNFTl84NTAyMDBfQiBpc28taXItMTAgRkkgSVNPNjQ2LUZJIElTTzY0Ni1TRSBzZSBjc0lTTzEwU3dlZGlzaCB9CisgICAgeyBTRU5fODUwMjAwX0MgaXNvLWlyLTExIElTTzY0Ni1TRTIgc2UyIGNzSVNPMTFTd2VkaXNoRm9yTmFtZXMgfQorICAgIHsgS1NfQ181NjAxLTE5ODcgaXNvLWlyLTE0OSBLU19DXzU2MDEtMTk4OSBLU0NfNTYwMSBrb3JlYW4gY3NLU0M1NjAxMTk4NyB9CisgICAgeyBJU08tMjAyMi1LUiBjc0lTTzIwMjJLUiB9CisgICAgeyBFVUMtS1IgY3NFVUNLUiB9CisgICAgeyBJU08tMjAyMi1KUCBjc0lTTzIwMjJKUCB9CisgICAgeyBJU08tMjAyMi1KUC0yIGNzSVNPMjAyMkpQMiB9CisgICAgeyBKSVNfQzYyMjAtMTk2OS1qcCBKSVNfQzYyMjAtMTk2OSBpc28taXItMTMga2F0YWthbmEgeDAyMDEtNworICAgICAgY3NJU08xM0pJU0M2MjIwanAgfQorICAgIHsgSklTX0M2MjIwLTE5Njktcm8gaXNvLWlyLTE0IGpwIElTTzY0Ni1KUCBjc0lTTzE0SklTQzYyMjBybyB9CisgICAgeyBJVCBpc28taXItMTUgSVNPNjQ2LUlUIGNzSVNPMTVJdGFsaWFuIH0KKyAgICB7IFBUIGlzby1pci0xNiBJU082NDYtUFQgY3NJU08xNlBvcnR1Z3Vlc2UgfQorICAgIHsgRVMgaXNvLWlyLTE3IElTTzY0Ni1FUyBjc0lTTzE3U3BhbmlzaCB9CisgICAgeyBncmVlazctb2xkIGlzby1pci0xOCBjc0lTTzE4R3JlZWs3T2xkIH0KKyAgICB7IGxhdGluLWdyZWVrIGlzby1pci0xOSBjc0lTTzE5TGF0aW5HcmVlayB9CisgICAgeyBESU5fNjYwMDMgaXNvLWlyLTIxIGRlIElTTzY0Ni1ERSBjc0lTTzIxR2VybWFuIH0KKyAgICB7IE5GX1pfNjItMDEwXygxOTczKSBpc28taXItMjUgSVNPNjQ2LUZSMSBjc0lTTzI1RnJlbmNoIH0KKyAgICB7IExhdGluLWdyZWVrLTEgaXNvLWlyLTI3IGNzSVNPMjdMYXRpbkdyZWVrMSB9CisgICAgeyBJU09fNTQyNyBpc28taXItMzcgY3NJU081NDI3Q3lyaWxsaWMgfQorICAgIHsgSklTX0M2MjI2LTE5NzggaXNvLWlyLTQyIGNzSVNPNDJKSVNDNjIyNjE5NzggfQorICAgIHsgQlNfdmlld2RhdGEgaXNvLWlyLTQ3IGNzSVNPNDdCU1ZpZXdkYXRhIH0KKyAgICB7IElOSVMgaXNvLWlyLTQ5IGNzSVNPNDlJTklTIH0KKyAgICB7IElOSVMtOCBpc28taXItNTAgY3NJU081MElOSVM4IH0KKyAgICB7IElOSVMtY3lyaWxsaWMgaXNvLWlyLTUxIGNzSVNPNTFJTklTQ3lyaWxsaWMgfQorICAgIHsgSVNPXzU0Mjc6MTk4MSBpc28taXItNTQgSVNPNTQyN0N5cmlsbGljMTk4MSB9CisgICAgeyBJU09fNTQyODoxOTgwIGlzby1pci01NSBjc0lTTzU0MjhHcmVlayB9CisgICAgeyBHQl8xOTg4LTgwIGlzby1pci01NyBjbiBJU082NDYtQ04gY3NJU081N0dCMTk4OCB9CisgICAgeyBHQl8yMzEyLTgwIGlzby1pci01OCBjaGluZXNlIGNzSVNPNThHQjIzMTI4MCB9CisgICAgeyBOU180NTUxLTEgaXNvLWlyLTYwIElTTzY0Ni1OTyBubyBjc0lTTzYwRGFuaXNoTm9yd2VnaWFuCisgICAgICBjc0lTTzYwTm9yd2VnaWFuMSB9CisgICAgeyBOU180NTUxLTIgSVNPNjQ2LU5PMiBpc28taXItNjEgbm8yIGNzSVNPNjFOb3J3ZWdpYW4yIH0KKyAgICB7IE5GX1pfNjItMDEwIGlzby1pci02OSBJU082NDYtRlIgZnIgY3NJU082OUZyZW5jaCB9CisgICAgeyB2aWRlb3RleC1zdXBwbCBpc28taXItNzAgY3NJU083MFZpZGVvdGV4U3VwcDEgfQorICAgIHsgUFQyIGlzby1pci04NCBJU082NDYtUFQyIGNzSVNPODRQb3J0dWd1ZXNlMiB9CisgICAgeyBFUzIgaXNvLWlyLTg1IElTTzY0Ni1FUzIgY3NJU084NVNwYW5pc2gyIH0KKyAgICB7IE1TWl83Nzk1LjMgaXNvLWlyLTg2IElTTzY0Ni1IVSBodSBjc0lTTzg2SHVuZ2FyaWFuIH0KKyAgICB7IEpJU19DNjIyNi0xOTgzIGlzby1pci04NyB4MDIwOCBKSVNfWDAyMDgtMTk4MyBjc0lTTzg3SklTWDAyMDggfQorICAgIHsgZ3JlZWs3IGlzby1pci04OCBjc0lTTzg4R3JlZWs3IH0KKyAgICB7IEFTTU9fNDQ5IElTT185MDM2IGFyYWJpYzcgaXNvLWlyLTg5IGNzSVNPODlBU01PNDQ5IH0KKyAgICB7IGlzby1pci05MCBjc0lTTzkwIH0KKyAgICB7IEpJU19DNjIyOS0xOTg0LWEgaXNvLWlyLTkxIGpwLW9jci1hIGNzSVNPOTFKSVNDNjIyOTE5ODRhIH0KKyAgICB7IEpJU19DNjIyOS0xOTg0LWIgaXNvLWlyLTkyIElTTzY0Ni1KUC1PQ1ItQiBqcC1vY3ItYgorICAgICAgY3NJU085MkpJU0M2Mjk5MTk4NGIgfQorICAgIHsgSklTX0M2MjI5LTE5ODQtYi1hZGQgaXNvLWlyLTkzIGpwLW9jci1iLWFkZCBjc0lTTzkzSklTNjIyOTE5ODRiYWRkIH0KKyAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQgaXNvLWlyLTk0IGpwLW9jci1oYW5kIGNzSVNPOTRKSVM2MjI5MTk4NGhhbmQgfQorICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZC1hZGQgaXNvLWlyLTk1IGpwLW9jci1oYW5kLWFkZAorICAgICAgY3NJU085NUpJUzYyMjkxOTg0aGFuZGFkZCB9CisgICAgeyBKSVNfQzYyMjktMTk4NC1rYW5hIGlzby1pci05NiBjc0lTTzk2SklTQzYyMjkxOTg0a2FuYSB9CisgICAgeyBJU09fMjAzMy0xOTgzIGlzby1pci05OCBlMTNiIGNzSVNPMjAzMyB9CisgICAgeyBBTlNJX1gzLjExMC0xOTgzIGlzby1pci05OSBDU0FfVDUwMC0xOTgzIE5BUExQUyBjc0lTTzk5TkFQTFBTIH0KKyAgICB7IElTT184ODU5LTE6MTk4NyBpc28taXItMTAwIElTT184ODU5LTEgSVNPLTg4NTktMSBsYXRpbjEgbDEgSUJNODE5CisgICAgICBDUDgxOSBjc0lTT0xhdGluMSB9CisgICAgeyBJU09fODg1OS0yOjE5ODcgaXNvLWlyLTEwMSBJU09fODg1OS0yIElTTy04ODU5LTIgbGF0aW4yIGwyIGNzSVNPTGF0aW4yIH0KKyAgICB7IFQuNjEtN2JpdCBpc28taXItMTAyIGNzSVNPMTAyVDYxN2JpdCB9CisgICAgeyBULjYxLThiaXQgVC42MSBpc28taXItMTAzIGNzSVNPMTAzVDYxOGJpdCB9CisgICAgeyBJU09fODg1OS0zOjE5ODggaXNvLWlyLTEwOSBJU09fODg1OS0zIElTTy04ODU5LTMgbGF0aW4zIGwzIGNzSVNPTGF0aW4zIH0KKyAgICB7IElTT184ODU5LTQ6MTk4OCBpc28taXItMTEwIElTT184ODU5LTQgSVNPLTg4NTktNCBsYXRpbjQgbDQgY3NJU09MYXRpbjQgfQorICAgIHsgRUNNQS1jeXJpbGxpYyBpc28taXItMTExIEtPSTgtRSBjc0lTTzExMUVDTUFDeXJpbGxpYyB9CisgICAgeyBDU0FfWjI0My40LTE5ODUtMSBpc28taXItMTIxIElTTzY0Ni1DQSBjc2E3LTEgY2EgY3NJU08xMjFDYW5hZGlhbjEgfQorICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTIgaXNvLWlyLTEyMiBJU082NDYtQ0EyIGNzYTctMiBjc0lTTzEyMkNhbmFkaWFuMiB9CisgICAgeyBDU0FfWjI0My40LTE5ODUtZ3IgaXNvLWlyLTEyMyBjc0lTTzEyM0NTQVoyNDM0MTk4NWdyIH0KKyAgICB7IElTT184ODU5LTY6MTk4NyBpc28taXItMTI3IElTT184ODU5LTYgSVNPLTg4NTktNiBFQ01BLTExNCBBU01PLTcwOAorICAgICAgYXJhYmljIGNzSVNPTGF0aW5BcmFiaWMgfQorICAgIHsgSVNPXzg4NTktNi1FIGNzSVNPODg1OTZFIElTTy04ODU5LTYtRSB9CisgICAgeyBJU09fODg1OS02LUkgY3NJU084ODU5NkkgSVNPLTg4NTktNi1JIH0KKyAgICB7IElTT184ODU5LTc6MTk4NyBpc28taXItMTI2IElTT184ODU5LTcgSVNPLTg4NTktNyBFTE9UXzkyOCBFQ01BLTExOAorICAgICAgZ3JlZWsgZ3JlZWs4IGNzSVNPTGF0aW5HcmVlayB9CisgICAgeyBULjEwMS1HMiBpc28taXItMTI4IGNzSVNPMTI4VDEwMUcyIH0KKyAgICB7IElTT184ODU5LTg6MTk4OCBpc28taXItMTM4IElTT184ODU5LTggSVNPLTg4NTktOCBoZWJyZXcKKyAgICAgIGNzSVNPTGF0aW5IZWJyZXcgfQorICAgIHsgSVNPXzg4NTktOC1FIGNzSVNPODg1OThFIElTTy04ODU5LTgtRSB9CisgICAgeyBJU09fODg1OS04LUkgY3NJU084ODU5OEkgSVNPLTg4NTktOC1JIH0KKyAgICB7IENTTl8zNjkxMDMgaXNvLWlyLTEzOSBjc0lTTzEzOUNTTjM2OTEwMyB9CisgICAgeyBKVVNfSS5CMS4wMDIgaXNvLWlyLTE0MSBJU082NDYtWVUganMgeXUgY3NJU08xNDFKVVNJQjEwMDIgfQorICAgIHsgSVNPXzY5MzctMi1hZGQgaXNvLWlyLTE0MiBjc0lTT1RleHRDb21tIH0KKyAgICB7IElFQ19QMjctMSBpc28taXItMTQzIGNzSVNPMTQzSUVDUDI3MSB9CisgICAgeyBJU09fODg1OS01OjE5ODggaXNvLWlyLTE0NCBJU09fODg1OS01IElTTy04ODU5LTUgY3lyaWxsaWMKKyAgICAgIGNzSVNPTGF0aW5DeXJpbGxpYyB9CisgICAgeyBKVVNfSS5CMS4wMDMtc2VyYiBpc28taXItMTQ2IHNlcmJpYW4gY3NJU08xNDZTZXJiaWFuIH0KKyAgICB7IEpVU19JLkIxLjAwMy1tYWMgbWFjZWRvbmlhbiBpc28taXItMTQ3IGNzSVNPMTQ3TWFjZWRvbmlhbiB9CisgICAgeyBJU09fODg1OS05OjE5ODkgaXNvLWlyLTE0OCBJU09fODg1OS05IElTTy04ODU5LTkgbGF0aW41IGw1IGNzSVNPTGF0aW41IH0KKyAgICB7IGdyZWVrLWNjaXR0IGlzby1pci0xNTAgY3NJU08xNTAgY3NJU08xNTBHcmVla0NDSVRUIH0KKyAgICB7IE5DX05DMDAtMTA6ODEgY3ViYSBpc28taXItMTUxIElTTzY0Ni1DVSBjc0lTTzE1MUN1YmEgfQorICAgIHsgSVNPXzY5MzctMi0yNSBpc28taXItMTUyIGNzSVNPNjkzN0FkZCB9CisgICAgeyBHT1NUXzE5NzY4LTc0IFNUX1NFVl8zNTgtODggaXNvLWlyLTE1MyBjc0lTTzE1M0dPU1QxOTc2ODc0IH0KKyAgICB7IElTT184ODU5LXN1cHAgaXNvLWlyLTE1NCBsYXRpbjEtMi01IGNzSVNPODg1OVN1cHAgfQorICAgIHsgSVNPXzEwMzY3LWJveCBpc28taXItMTU1IGNzSVNPMTAzNjdCb3ggfQorICAgIHsgSVNPLTg4NTktMTAgaXNvLWlyLTE1NyBsNiBJU09fODg1OS0xMDoxOTkyIGNzSVNPTGF0aW42IGxhdGluNiB9CisgICAgeyBsYXRpbi1sYXAgbGFwIGlzby1pci0xNTggY3NJU08xNThMYXAgfQorICAgIHsgSklTX1gwMjEyLTE5OTAgeDAyMTIgaXNvLWlyLTE1OSBjc0lTTzE1OUpJU1gwMjEyMTk5MCB9CisgICAgeyBEU18yMDg5IERTMjA4OSBJU082NDYtREsgZGsgY3NJU082NDZEYW5pc2ggfQorICAgIHsgdXMtZGsgY3NVU0RLIH0KKyAgICB7IGRrLXVzIGNzREtVUyB9CisgICAgeyBKSVNfWDAyMDEgWDAyMDEgY3NIYWxmV2lkdGhLYXRha2FuYSB9CisgICAgeyBLU0M1NjM2IElTTzY0Ni1LUiBjc0tTQzU2MzYgfQorICAgIHsgSVNPLTEwNjQ2LVVDUy0yIGNzVW5pY29kZSB9CisgICAgeyBJU08tMTA2NDYtVUNTLTQgY3NVQ1M0IH0KKyAgICB7IERFQy1NQ1MgZGVjIGNzREVDTUNTIH0KKyAgICB7IGhwLXJvbWFuOCByb21hbjggcjggY3NIUFJvbWFuOCB9CisgICAgeyBtYWNpbnRvc2ggbWFjIGNzTWFjaW50b3NoIH0KKyAgICB7IElCTTAzNyBjcDAzNyBlYmNkaWMtY3AtdXMgZWJjZGljLWNwLWNhIGViY2RpYy1jcC13dCBlYmNkaWMtY3AtbmwKKyAgICAgIGNzSUJNMDM3IH0KKyAgICB7IElCTTAzOCBFQkNESUMtSU5UIGNwMDM4IGNzSUJNMDM4IH0KKyAgICB7IElCTTI3MyBDUDI3MyBjc0lCTTI3MyB9CisgICAgeyBJQk0yNzQgRUJDRElDLUJFIENQMjc0IGNzSUJNMjc0IH0KKyAgICB7IElCTTI3NSBFQkNESUMtQlIgY3AyNzUgY3NJQk0yNzUgfQorICAgIHsgSUJNMjc3IEVCQ0RJQy1DUC1ESyBFQkNESUMtQ1AtTk8gY3NJQk0yNzcgfQorICAgIHsgSUJNMjc4IENQMjc4IGViY2RpYy1jcC1maSBlYmNkaWMtY3Atc2UgY3NJQk0yNzggfQorICAgIHsgSUJNMjgwIENQMjgwIGViY2RpYy1jcC1pdCBjc0lCTTI4MCB9CisgICAgeyBJQk0yODEgRUJDRElDLUpQLUUgY3AyODEgY3NJQk0yODEgfQorICAgIHsgSUJNMjg0IENQMjg0IGViY2RpYy1jcC1lcyBjc0lCTTI4NCB9CisgICAgeyBJQk0yODUgQ1AyODUgZWJjZGljLWNwLWdiIGNzSUJNMjg1IH0KKyAgICB7IElCTTI5MCBjcDI5MCBFQkNESUMtSlAta2FuYSBjc0lCTTI5MCB9CisgICAgeyBJQk0yOTcgY3AyOTcgZWJjZGljLWNwLWZyIGNzSUJNMjk3IH0KKyAgICB7IElCTTQyMCBjcDQyMCBlYmNkaWMtY3AtYXIxIGNzSUJNNDIwIH0KKyAgICB7IElCTTQyMyBjcDQyMyBlYmNkaWMtY3AtZ3IgY3NJQk00MjMgfQorICAgIHsgSUJNNDI0IGNwNDI0IGViY2RpYy1jcC1oZSBjc0lCTTQyNCB9CisgICAgeyBJQk00MzcgY3A0MzcgNDM3IGNzUEM4Q29kZVBhZ2U0MzcgfQorICAgIHsgSUJNNTAwIENQNTAwIGViY2RpYy1jcC1iZSBlYmNkaWMtY3AtY2ggY3NJQk01MDAgfQorICAgIHsgSUJNNzc1IGNwNzc1IGNzUEM3NzVCYWx0aWMgfQorICAgIHsgSUJNODUwIGNwODUwIDg1MCBjc1BDODUwTXVsdGlsaW5ndWFsIH0KKyAgICB7IElCTTg1MSBjcDg1MSA4NTEgY3NJQk04NTEgfQorICAgIHsgSUJNODUyIGNwODUyIDg1MiBjc1BDcDg1MiB9CisgICAgeyBJQk04NTUgY3A4NTUgODU1IGNzSUJNODU1IH0KKyAgICB7IElCTTg1NyBjcDg1NyA4NTcgY3NJQk04NTcgfQorICAgIHsgSUJNODYwIGNwODYwIDg2MCBjc0lCTTg2MCB9CisgICAgeyBJQk04NjEgY3A4NjEgODYxIGNwLWlzIGNzSUJNODYxIH0KKyAgICB7IElCTTg2MiBjcDg2MiA4NjIgY3NQQzg2MkxhdGluSGVicmV3IH0KKyAgICB7IElCTTg2MyBjcDg2MyA4NjMgY3NJQk04NjMgfQorICAgIHsgSUJNODY0IGNwODY0IGNzSUJNODY0IH0KKyAgICB7IElCTTg2NSBjcDg2NSA4NjUgY3NJQk04NjUgfQorICAgIHsgSUJNODY2IGNwODY2IDg2NiBjc0lCTTg2NiB9CisgICAgeyBJQk04NjggQ1A4NjggY3AtYXIgY3NJQk04NjggfQorICAgIHsgSUJNODY5IGNwODY5IDg2OSBjcC1nciBjc0lCTTg2OSB9CisgICAgeyBJQk04NzAgQ1A4NzAgZWJjZGljLWNwLXJvZWNlIGViY2RpYy1jcC15dSBjc0lCTTg3MCB9CisgICAgeyBJQk04NzEgQ1A4NzEgZWJjZGljLWNwLWlzIGNzSUJNODcxIH0KKyAgICB7IElCTTg4MCBjcDg4MCBFQkNESUMtQ3lyaWxsaWMgY3NJQk04ODAgfQorICAgIHsgSUJNODkxIGNwODkxIGNzSUJNODkxIH0KKyAgICB7IElCTTkwMyBjcDkwMyBjc0lCTTkwMyB9CisgICAgeyBJQk05MDQgY3A5MDQgOTA0IGNzSUJCTTkwNCB9CisgICAgeyBJQk05MDUgQ1A5MDUgZWJjZGljLWNwLXRyIGNzSUJNOTA1IH0KKyAgICB7IElCTTkxOCBDUDkxOCBlYmNkaWMtY3AtYXIyIGNzSUJNOTE4IH0KKyAgICB7IElCTTEwMjYgQ1AxMDI2IGNzSUJNMTAyNiB9CisgICAgeyBFQkNESUMtQVQtREUgY3NJQk1FQkNESUNBVERFIH0KKyAgICB7IEVCQ0RJQy1BVC1ERS1BIGNzRUJDRElDQVRERUEgfQorICAgIHsgRUJDRElDLUNBLUZSIGNzRUJDRElDQ0FGUiB9CisgICAgeyBFQkNESUMtREstTk8gY3NFQkNESUNES05PIH0KKyAgICB7IEVCQ0RJQy1ESy1OTy1BIGNzRUJDRElDREtOT0EgfQorICAgIHsgRUJDRElDLUZJLVNFIGNzRUJDRElDRklTRSB9CisgICAgeyBFQkNESUMtRkktU0UtQSBjc0VCQ0RJQ0ZJU0VBIH0KKyAgICB7IEVCQ0RJQy1GUiBjc0VCQ0RJQ0ZSIH0KKyAgICB7IEVCQ0RJQy1JVCBjc0VCQ0RJQ0lUIH0KKyAgICB7IEVCQ0RJQy1QVCBjc0VCQ0RJQ1BUIH0KKyAgICB7IEVCQ0RJQy1FUyBjc0VCQ0RJQ0VTIH0KKyAgICB7IEVCQ0RJQy1FUy1BIGNzRUJDRElDRVNBIH0KKyAgICB7IEVCQ0RJQy1FUy1TIGNzRUJDRElDRVNTIH0KKyAgICB7IEVCQ0RJQy1VSyBjc0VCQ0RJQ1VLIH0KKyAgICB7IEVCQ0RJQy1VUyBjc0VCQ0RJQ1VTIH0KKyAgICB7IFVOS05PV04tOEJJVCBjc1Vua25vd244QmlUIH0KKyAgICB7IE1ORU1PTklDIGNzTW5lbW9uaWMgfQorICAgIHsgTU5FTSBjc01uZW0gfQorICAgIHsgVklTQ0lJIGNzVklTQ0lJIH0KKyAgICB7IFZJUVIgY3NWSVFSIH0KKyAgICB7IEtPSTgtUiBjc0tPSThSIH0KKyAgICB7IElCTTAwODU4IENDU0lEMDA4NTggQ1AwMDg1OCBQQy1NdWx0aWxpbmd1YWwtODUwK2V1cm8gfQorICAgIHsgSUJNMDA5MjQgQ0NTSUQwMDkyNCBDUDAwOTI0IGViY2RpYy1MYXRpbjktLWV1cm8gfQorICAgIHsgSUJNMDExNDAgQ0NTSUQwMTE0MCBDUDAxMTQwIGViY2RpYy11cy0zNytldXJvIH0KKyAgICB7IElCTTAxMTQxIENDU0lEMDExNDEgQ1AwMTE0MSBlYmNkaWMtZGUtMjczK2V1cm8gfQorICAgIHsgSUJNMDExNDIgQ0NTSUQwMTE0MiBDUDAxMTQyIGViY2RpYy1kay0yNzcrZXVybyBlYmNkaWMtbm8tMjc3K2V1cm8gfQorICAgIHsgSUJNMDExNDMgQ0NTSUQwMTE0MyBDUDAxMTQzIGViY2RpYy1maS0yNzgrZXVybyBlYmNkaWMtc2UtMjc4K2V1cm8gfQorICAgIHsgSUJNMDExNDQgQ0NTSUQwMTE0NCBDUDAxMTQ0IGViY2RpYy1pdC0yODArZXVybyB9CisgICAgeyBJQk0wMTE0NSBDQ1NJRDAxMTQ1IENQMDExNDUgZWJjZGljLWVzLTI4NCtldXJvIH0KKyAgICB7IElCTTAxMTQ2IENDU0lEMDExNDYgQ1AwMTE0NiBlYmNkaWMtZ2ItMjg1K2V1cm8gfQorICAgIHsgSUJNMDExNDcgQ0NTSUQwMTE0NyBDUDAxMTQ3IGViY2RpYy1mci0yOTcrZXVybyB9CisgICAgeyBJQk0wMTE0OCBDQ1NJRDAxMTQ4IENQMDExNDggZWJjZGljLWludGVybmF0aW9uYWwtNTAwK2V1cm8gfQorICAgIHsgSUJNMDExNDkgQ0NTSUQwMTE0OSBDUDAxMTQ5IGViY2RpYy1pcy04NzErZXVybyB9CisgICAgeyBJQk0xMDQ3IElCTS0xMDQ3IH0KKyAgICB7IFBUQ1AxNTQgY3NQVENQMTU0IFBUMTU0IENQMTU0IEN5cmlsbGljLUFzaWFuIH0KKyAgICB7IEFtaWdhLTEyNTEgQW1pMTI1MSBBbWlnYTEyNTEgQW1pLTEyNTEgfQorICAgIHsgVU5JQ09ERS0xLTEgY3NVbmljb2RlMTEgfQorICAgIHsgQ0VTVS04IGNzQ0VTVS04IH0KKyAgICB7IEJPQ1UtMSBjc0JPQ1UtMSB9CisgICAgeyBVTklDT0RFLTEtMS1VVEYtNyBjc1VuaWNvZGUxMVVURjcgfQorICAgIHsgSVNPLTg4NTktMTQgaXNvLWlyLTE5OSBJU09fODg1OS0xNDoxOTk4IElTT184ODU5LTE0IGxhdGluOCBpc28tY2VsdGljCisgICAgICBsOCB9CisgICAgeyBJU08tODg1OS0xNSBJU09fODg1OS0xNSBMYXRpbi05IH0KKyAgICB7IElTTy04ODU5LTE2IGlzby1pci0yMjYgSVNPXzg4NTktMTY6MjAwMSBJU09fODg1OS0xNiBsYXRpbjEwIGwxMCB9CisgICAgeyBHQksgQ1A5MzYgTVM5MzYgd2luZG93cy05MzYgfQorICAgIHsgSklTX0VuY29kaW5nIGNzSklTRW5jb2RpbmcgfQorICAgIHsgU2hpZnRfSklTIE1TX0thbmppIGNzU2hpZnRKSVMgfQorICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlIGNzRVVDUGtkRm10SmFwYW5lc2UKKyAgICAgIEVVQy1KUCB9CisgICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfRml4ZWRfV2lkdGhfZm9yX0phcGFuZXNlIGNzRVVDRml4V2lkSmFwYW5lc2UgfQorICAgIHsgSVNPLTEwNjQ2LVVDUy1CYXNpYyBjc1VuaWNvZGVBU0NJSSB9CisgICAgeyBJU08tMTA2NDYtVW5pY29kZS1MYXRpbjEgY3NVbmljb2RlTGF0aW4xIElTTy0xMDY0NiB9CisgICAgeyBJU08tVW5pY29kZS1JQk0tMTI2MSBjc1VuaWNvZGVJQk0xMjYxIH0KKyAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY4IGNzVW5pY29kZUlCTTEyNjggfQorICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNzYgY3NVbmljb2RlSUJNMTI3NiB9CisgICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NCBjc1VuaWNvZGVJQk0xMjY0IH0KKyAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY1IGNzVW5pY29kZUlCTTEyNjUgfQorICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMC1MYXRpbi0xIGNzV2luZG93czMwTGF0aW4xIH0KKyAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjEtTGF0aW4tMSBjc1dpbmRvd3MzMUxhdGluMSB9CisgICAgeyBJU08tODg1OS0yLVdpbmRvd3MtTGF0aW4tMiBjc1dpbmRvd3MzMUxhdGluMiB9CisgICAgeyBJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNSBjc1dpbmRvd3MzMUxhdGluNSB9CisgICAgeyBBZG9iZS1TdGFuZGFyZC1FbmNvZGluZyBjc0Fkb2JlU3RhbmRhcmRFbmNvZGluZyB9CisgICAgeyBWZW50dXJhLVVTIGNzVmVudHVyYVVTIH0KKyAgICB7IFZlbnR1cmEtSW50ZXJuYXRpb25hbCBjc1ZlbnR1cmFJbnRlcm5hdGlvbmFsIH0KKyAgICB7IFBDOC1EYW5pc2gtTm9yd2VnaWFuIGNzUEM4RGFuaXNoTm9yd2VnaWFuIH0KKyAgICB7IFBDOC1UdXJraXNoIGNzUEM4VHVya2lzaCB9CisgICAgeyBJQk0tU3ltYm9scyBjc0lCTVN5bWJvbHMgfQorICAgIHsgSUJNLVRoYWkgY3NJQk1UaGFpIH0KKyAgICB7IEhQLUxlZ2FsIGNzSFBMZWdhbCB9CisgICAgeyBIUC1QaS1mb250IGNzSFBQaUZvbnQgfQorICAgIHsgSFAtTWF0aDggY3NIUE1hdGg4IH0KKyAgICB7IEFkb2JlLVN5bWJvbC1FbmNvZGluZyBjc0hQUFNNYXRoIH0KKyAgICB7IEhQLURlc2tUb3AgY3NIUERlc2t0b3AgfQorICAgIHsgVmVudHVyYS1NYXRoIGNzVmVudHVyYU1hdGggfQorICAgIHsgTWljcm9zb2Z0LVB1Ymxpc2hpbmcgY3NNaWNyb3NvZnRQdWJsaXNoaW5nIH0KKyAgICB7IFdpbmRvd3MtMzFKIGNzV2luZG93czMxSiB9CisgICAgeyBHQjIzMTIgY3NHQjIzMTIgfQorICAgIHsgQmlnNSBjc0JpZzUgfQorfQorCitwcm9jIHRjbF9lbmNvZGluZyB7ZW5jfSB7CisgICAgZ2xvYmFsIGVuY29kaW5nX2FsaWFzZXMKKyAgICBzZXQgbmFtZXMgW2VuY29kaW5nIG5hbWVzXQorICAgIHNldCBsY25hbWVzIFtzdHJpbmcgdG9sb3dlciAkbmFtZXNdCisgICAgc2V0IGVuYyBbc3RyaW5nIHRvbG93ZXIgJGVuY10KKyAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY10KKyAgICBpZiB7JGkgPCAwfSB7CisJIyBsb29rIGZvciAiaXNvbm5uIiBpbnN0ZWFkIG9mICJpc28tbm5uIiBvciAiaXNvX25ubiIKKwlpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlbmMgaXNvIGVuY3hdfSB7CisJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jeF0KKwl9CisgICAgfQorICAgIGlmIHskaSA8IDB9IHsKKwlmb3JlYWNoIGwgJGVuY29kaW5nX2FsaWFzZXMgeworCSAgICBzZXQgbGwgW3N0cmluZyB0b2xvd2VyICRsXQorCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRsbCAkZW5jXSA8IDB9IGNvbnRpbnVlCisJICAgICMgbG9vayB0aHJvdWdoIHRoZSBhbGlhc2VzIGZvciBvbmUgdGhhdCB0Y2wga25vd3MgYWJvdXQKKwkgICAgZm9yZWFjaCBlICRsbCB7CisJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZV0KKwkJaWYgeyRpIDwgMH0geworCQkgICAgaWYge1tyZWdzdWIge15pc29bLV9dfSAkZSBpc28gZXhdfSB7CisJCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGV4XQorCQkgICAgfQorCQl9CisJCWlmIHskaSA+PSAwfSBicmVhaworCSAgICB9CisJICAgIGJyZWFrCisJfQorICAgIH0KKyAgICBpZiB7JGkgPj0gMH0geworCXJldHVybiBbbGluZGV4ICRuYW1lcyAkaV0KKyAgICB9CisgICAgcmV0dXJuIHt9Cit9CisKKyMgZGVmYXVsdHMuLi4KK3NldCBkYXRlbW9kZSAwCitzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCitzZXQgd3Jjb21jbWQgImdpdCBkaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKKworc2V0IGdpdGVuY29kaW5nIHt9CitjYXRjaCB7CisgICAgc2V0IGdpdGVuY29kaW5nIFtleGVjIGdpdCByZXBvLWNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nXQorfQoraWYgeyRnaXRlbmNvZGluZyA9PSAiIn0geworICAgIHNldCBnaXRlbmNvZGluZyAidXRmLTgiCit9CitzZXQgdGNsZW5jb2RpbmcgW3RjbF9lbmNvZGluZyAkZ2l0ZW5jb2RpbmddCitpZiB7JHRjbGVuY29kaW5nID09IHt9fSB7CisgICAgcHV0cyBzdGRlcnIgIldhcm5pbmc6IGVuY29kaW5nICRnaXRlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IFRjbC9UayIKK30KKworc2V0IG1haW5mb250IHtIZWx2ZXRpY2EgOX0KK3NldCB0ZXh0Zm9udCB7Q291cmllciA5fQorc2V0IHVpZm9udCB7SGVsdmV0aWNhIDkgYm9sZH0KK3NldCBmaW5kbWVyZ2VmaWxlcyAwCitzZXQgbWF4Z3JhcGhwY3QgNTAKK3NldCBtYXh3aWR0aCAxNgorc2V0IHJldmxpc3RvcmRlciAwCitzZXQgZmFzdGRhdGUgMAorc2V0IHVwYXJyb3dsZW4gNworc2V0IGRvd25hcnJvd2xlbiA3CitzZXQgbWluZ2FwbGVuIDMwCitzZXQgY21pdG1vZGUgInBhdGNoIgorc2V0IHdyYXBjb21tZW50ICJub25lIgorc2V0IHNob3duZWFydGFncyAxCisKK3NldCBjb2xvcnMge2dyZWVuIHJlZCBibHVlIG1hZ2VudGEgZGFya2dyZXkgYnJvd24gb3JhbmdlfQorCitjYXRjaCB7c291cmNlIH4vLmdpdGt9CisKK2ZvbnQgY3JlYXRlIG9wdGlvbmZvbnQgLWZhbWlseSBzYW5zLXNlcmlmIC1zaXplIC0xMgorCitzZXQgcmV2dHJlZWFyZ3Mge30KK2ZvcmVhY2ggYXJnICRhcmd2IHsKKyAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkYXJnIHsKKwkiXiQiIHsgfQorCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQorCWRlZmF1bHQgeworCSAgICBsYXBwZW5kIHJldnRyZWVhcmdzICRhcmcKKwl9CisgICAgfQorfQorCisjIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4KK3NldCBnaXRkaXIgW2dpdGRpcl0KK2lmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKKyAgICBzaG93X2Vycm9yIHt9IC4gIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKKyAgICBleGl0IDEKK30KKworc2V0IGNtZGxpbmVfZmlsZXMge30KK3NldCBpIFtsc2VhcmNoIC1leGFjdCAkcmV2dHJlZWFyZ3MgIi0tIl0KK2lmIHskaSA+PSAwfSB7CisgICAgc2V0IGNtZGxpbmVfZmlsZXMgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgW2V4cHIgeyRpICsgMX1dIGVuZF0KKyAgICBzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBbZXhwciB7JGkgLSAxfV1dCit9IGVsc2VpZiB7JHJldnRyZWVhcmdzIG5lIHt9fSB7CisgICAgaWYge1tjYXRjaCB7CisJc2V0IGYgW2V2YWwgZXhlYyBnaXQgcmV2LXBhcnNlIC0tbm8tcmV2cyAtLW5vLWZsYWdzICRyZXZ0cmVlYXJnc10KKwlzZXQgY21kbGluZV9maWxlcyBbc3BsaXQgJGYgIlxuIl0KKwlzZXQgbiBbbGxlbmd0aCAkY21kbGluZV9maWxlc10KKwlzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBlbmQtJG5dCisgICAgfSBlcnJdfSB7CisJIyB1bmZvcnR1bmF0ZWx5IHdlIGdldCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIGluICRlcnIsCisJIyBzbyBsb29rIGZvciAiZmF0YWw6Ii4KKwlzZXQgaSBbc3RyaW5nIGZpcnN0ICJmYXRhbDoiICRlcnJdCisJaWYgeyRpID4gMH0geworCSAgICBzZXQgZXJyIFtzdHJpbmcgcmFuZ2UgJGVyciBbZXhwciB7JGkgKyA2fV0gZW5kXQorCX0KKwlzaG93X2Vycm9yIHt9IC4gIkJhZCBhcmd1bWVudHMgdG8gZ2l0azpcbiRlcnIiCisJZXhpdCAxCisgICAgfQorfQorCitzZXQgaGlzdG9yeSB7fQorc2V0IGhpc3RvcnlpbmRleCAwCitzZXQgZmhfc2VyaWFsIDAKK3NldCBuaGxfbmFtZXMge30KK3NldCBoaWdobGlnaHRfcGF0aHMge30KK3NldCBzZWFyY2hkaXJuIC1mb3J3YXJkcworc2V0IGJvbGRyb3dzIHt9CitzZXQgYm9sZG5hbWVyb3dzIHt9CisKK3NldCBvcHRpbV9kZWxheSAxNgorCitzZXQgbmV4dHZpZXdudW0gMQorc2V0IGN1cnZpZXcgMAorc2V0IHNlbGVjdGVkdmlldyAwCitzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQorc2V0IHZpZXdmaWxlcygwKSB7fQorc2V0IHZpZXdwZXJtKDApIDAKK3NldCB2aWV3YXJncygwKSB7fQorCitzZXQgY21kbGluZW9rIDAKK3NldCBzdG9wcGVkIDAKK3NldCBzdHVmZnNhdmVkIDAKK3NldCBwYXRjaG51bSAwCitzZXRjb29yZHMKK21ha2V3aW5kb3cKK3JlYWRyZWZzCisKK2lmIHskY21kbGluZV9maWxlcyBuZSB7fSB8fCAkcmV2dHJlZWFyZ3MgbmUge319IHsKKyAgICAjIGNyZWF0ZSBhIHZpZXcgZm9yIHRoZSBmaWxlcy9kaXJzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgc2V0IGN1cnZpZXcgMQorICAgIHNldCBzZWxlY3RlZHZpZXcgMQorICAgIHNldCBuZXh0dmlld251bSAyCisgICAgc2V0IHZpZXduYW1lKDEpICJDb21tYW5kIGxpbmUiCisgICAgc2V0IHZpZXdmaWxlcygxKSAkY21kbGluZV9maWxlcworICAgIHNldCB2aWV3YXJncygxKSAkcmV2dHJlZWFyZ3MKKyAgICBzZXQgdmlld3Blcm0oMSkgMAorICAgIGFkZHZpZXdtZW51IDEKKyAgICAuYmFyLnZpZXcgZW50cnljb25mIDIgLXN0YXRlIG5vcm1hbAorICAgIC5iYXIudmlldyBlbnRyeWNvbmYgMyAtc3RhdGUgbm9ybWFsCit9CisKK2lmIHtbaW5mbyBleGlzdHMgcGVybXZpZXdzXX0geworICAgIGZvcmVhY2ggdiAkcGVybXZpZXdzIHsKKwlzZXQgbiAkbmV4dHZpZXdudW0KKwlpbmNyIG5leHR2aWV3bnVtCisJc2V0IHZpZXduYW1lKCRuKSBbbGluZGV4ICR2IDBdCisJc2V0IHZpZXdmaWxlcygkbikgW2xpbmRleCAkdiAxXQorCXNldCB2aWV3YXJncygkbikgW2xpbmRleCAkdiAyXQorCXNldCB2aWV3cGVybSgkbikgMQorCWFkZHZpZXdtZW51ICRuCisgICAgfQorfQorZ2V0Y29tbWl0cwpkaWZmIC0tZ2l0IGEvZ2l0d2ViL1JFQURNRSBiL2dpdHdlYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxNGQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdHdlYi9SRUFETUUKQEAgLTAsMCArMSwxNiBAQAorR0lUIHdlYiBJbnRlcmZhY2UKKworVGhlIG9uZSB3b3JraW5nIG9uOgorICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZ2l0LworCitHZXQgdGhlIGdpdHdlYi5jZ2kgYnkgZnRwOgorICBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdHdlYi8KKworSXQgcmVxaXJlcyB0aGUgZ2l0LWNvcmUgYmluYXJpZXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW06CisgIGh0dHA6Ly93d3cua2VybmVsLm9yZy9naXQvP3A9Z2l0L2dpdC5naXQ7YT1zdW1tYXJ5CisKK1RoZSBnaXR3ZWIgcmVwb3NpdG9yeSBpcyBoZXJlOgorICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZ2l0Lz9wPWdpdC9naXR3ZWIuZ2l0O2E9c3VtbWFyeQorCitBbnkgY29tbWVudC9xdWVzdGlvbi9jb25jZXJuIHRvOgorICBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CmRpZmYgLS1naXQgYS9naXR3ZWIuY2dpIGIvZ2l0d2ViL2dpdHdlYi5jZ2kKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdHdlYi5jZ2kKcmVuYW1lIHRvIGdpdHdlYi9naXR3ZWIuY2dpCmRpZmYgLS1naXQgImEvdGVzdC9NXDMwM1wyNDRyY2hlbiIgImIvZ2l0d2ViL3Rlc3QvTVwzMDNcMjQ0cmNoZW4iCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAidGVzdC9NXDMwM1wyNDRyY2hlbiIKcmVuYW1lIHRvICJnaXR3ZWIvdGVzdC9NXDMwM1wyNDRyY2hlbiIKZGlmZiAtLWdpdCBhL3Rlc3QvZmlsZSB3aXRoIHNwYWNlcyBiL2dpdHdlYi90ZXN0L2ZpbGUgd2l0aCBzcGFjZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvZmlsZSB3aXRoIHNwYWNlcwpyZW5hbWUgdG8gZ2l0d2ViL3Rlc3QvZmlsZSB3aXRoIHNwYWNlcwpkaWZmIC0tZ2l0IGEvdGVzdC9maWxlK3BsdXMrc2lnbiBiL2dpdHdlYi90ZXN0L2ZpbGUrcGx1cytzaWduCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L2ZpbGUrcGx1cytzaWduCnJlbmFtZSB0byBnaXR3ZWIvdGVzdC9maWxlK3BsdXMrc2lnbgpkaWZmIC0tZ2l0IGEvaGFzaC1vYmplY3QuYyBiL2hhc2gtb2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiZDkzYgotLS0gL2Rldi9udWxsCisrKyBiL2hhc2gtb2JqZWN0LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqIENvcHlyaWdodCAoQykgSnVuaW8gQyBIYW1hbm8sIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgdm9pZCBoYXNoX29iamVjdChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCB8fAorCSAgICBmc3RhdChmZCwgJnN0KSA8IDAgfHwKKwkgICAgaW5kZXhfZmQoc2hhMSwgZmQsICZzdCwgd3JpdGVfb2JqZWN0LCB0eXBlKSkKKwkJZGllKHdyaXRlX29iamVjdAorCQkgICAgPyAiVW5hYmxlIHRvIGFkZCAlcyB0byBkYXRhYmFzZSIKKwkJICAgIDogIlVuYWJsZSB0byBoYXNoICVzIiwgcGF0aCk7CisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworfQorCitzdGF0aWMgdm9pZCBoYXNoX3N0ZGluKGNvbnN0IGNoYXIgKnR5cGUsIGludCB3cml0ZV9vYmplY3QpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpZiAoaW5kZXhfcGlwZShzaGExLCAwLCB0eXBlLCB3cml0ZV9vYmplY3QpKQorCQlkaWUoIlVuYWJsZSB0byBhZGQgc3RkaW4gdG8gZGF0YWJhc2UiKTsKKwlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGhhc2hfb2JqZWN0X3VzYWdlW10gPQorImdpdC1oYXNoLW9iamVjdCBbLXQgPHR5cGU+XSBbLXddIFstLXN0ZGluXSA8ZmlsZT4uLi4iOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqdHlwZSA9IGJsb2JfdHlwZTsKKwlpbnQgd3JpdGVfb2JqZWN0ID0gMDsKKwljb25zdCBjaGFyICpwcmVmaXggPSBOVUxMOworCWludCBwcmVmaXhfbGVuZ3RoID0gLTE7CisJaW50IG5vX21vcmVfZmxhZ3MgPSAwOworCisJZm9yIChpID0gMSA7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKCFub19tb3JlX2ZsYWdzICYmIGFyZ3ZbaV1bMF0gPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXQiKSkgeworCQkJCWlmIChhcmdjIDw9ICsraSkKKwkJCQkJZGllKGhhc2hfb2JqZWN0X3VzYWdlKTsKKwkJCQl0eXBlID0gYXJndltpXTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi13IikpIHsKKwkJCQlpZiAocHJlZml4X2xlbmd0aCA8IDApIHsKKwkJCQkJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCQkJCQlwcmVmaXhfbGVuZ3RoID0KKwkJCQkJCXByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKwkJCQl9CisJCQkJd3JpdGVfb2JqZWN0ID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tIikpIHsKKwkJCQlub19tb3JlX2ZsYWdzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0taGVscCIpKQorCQkJCXVzYWdlKGhhc2hfb2JqZWN0X3VzYWdlKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tc3RkaW4iKSkgeworCQkJCWhhc2hfc3RkaW4odHlwZSwgd3JpdGVfb2JqZWN0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlkaWUoaGFzaF9vYmplY3RfdXNhZ2UpOworCQl9IAorCQllbHNlIHsKKwkJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCQlpZiAoMCA8PSBwcmVmaXhfbGVuZ3RoKQorCQkJCWFyZyA9IHByZWZpeF9maWxlbmFtZShwcmVmaXgsIHByZWZpeF9sZW5ndGgsCisJCQkJCQkgICAgICBhcmcpOworCQkJaGFzaF9vYmplY3QoYXJnLCB0eXBlLCB3cml0ZV9vYmplY3QpOworCQkJbm9fbW9yZV9mbGFncyA9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9odHRwLWZldGNoLmMgYi9odHRwLWZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2MDJiNwotLS0gL2Rldi9udWxsCisrKyBiL2h0dHAtZmV0Y2guYwpAQCAtMCwwICsxLDEyODYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJmZXRjaC5oIgorI2luY2x1ZGUgImh0dHAuaCIKKworI2lmbmRlZiBOT19FWFBBVAorI2luY2x1ZGUgPGV4cGF0Lmg+CisKKy8qIERlZmluaXRpb25zIGZvciBEQVYgcmVxdWVzdHMgKi8KKyNkZWZpbmUgREFWX1BST1BGSU5EICJQUk9QRklORCIKKyNkZWZpbmUgREFWX1BST1BGSU5EX1JFU1AgIi5tdWx0aXN0YXR1cy5yZXNwb25zZSIKKyNkZWZpbmUgREFWX1BST1BGSU5EX05BTUUgIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5ocmVmIgorI2RlZmluZSBEQVZfUFJPUEZJTkRfQ09MTEVDVElPTiAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3AucmVzb3VyY2V0eXBlLmNvbGxlY3Rpb24iCisjZGVmaW5lIFBST1BGSU5EX0FMTF9SRVFVRVNUICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiID8+XG48RDpwcm9wZmluZCB4bWxuczpEPVwiREFWOlwiPlxuPEQ6YWxscHJvcC8+XG48L0Q6cHJvcGZpbmQ+IgorCisvKiBEZWZpbml0aW9ucyBmb3IgcHJvY2Vzc2luZyBYTUwgREFWIHJlc3BvbnNlcyAqLworI2lmbmRlZiBYTUxfU1RBVFVTX09LCitlbnVtIFhNTF9TdGF0dXMgeworICBYTUxfU1RBVFVTX09LID0gMSwKKyAgWE1MX1NUQVRVU19FUlJPUiA9IDAKK307CisjZGVmaW5lIFhNTF9TVEFUVVNfT0sgICAgMQorI2RlZmluZSBYTUxfU1RBVFVTX0VSUk9SIDAKKyNlbmRpZgorCisvKiBGbGFncyB0aGF0IGNvbnRyb2wgcmVtb3RlX2xzIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgUFJPQ0VTU19GSUxFUyAoMXUgPDwgMCkKKyNkZWZpbmUgUFJPQ0VTU19ESVJTICAoMXUgPDwgMSkKKyNkZWZpbmUgUkVDVVJTSVZFICAgICAoMXUgPDwgMikKKworLyogRmxhZ3MgdGhhdCByZW1vdGVfbHMgcGFzc2VzIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworI2RlZmluZSBJU19ESVIgKDF1IDw8IDApCisjZW5kaWYKKworI2RlZmluZSBQUkVWX0JVRl9TSVpFIDQwOTYKKyNkZWZpbmUgUkFOR0VfSEVBREVSX1NJWkUgMzAKKworc3RhdGljIGludCBnb3RfYWx0ZXJuYXRlcyA9IC0xOworc3RhdGljIGludCBjb3JydXB0X29iamVjdF9mb3VuZCA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqbm9fcHJhZ21hX2hlYWRlcjsKKworc3RydWN0IGFsdF9iYXNlCit7CisJY2hhciAqYmFzZTsKKwlpbnQgcGF0aF9sZW47CisJaW50IGdvdF9pbmRpY2VzOworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrczsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGFsdF9iYXNlICphbHQgPSBOVUxMOworCitlbnVtIG9iamVjdF9yZXF1ZXN0X3N0YXRlIHsKKwlXQUlUSU5HLAorCUFCT1JURUQsCisJQUNUSVZFLAorCUNPTVBMRVRFLAorfTsKKworc3RydWN0IG9iamVjdF9yZXF1ZXN0Cit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG87CisJY2hhciAqdXJsOworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJaW50IGxvY2FsOworCWVudW0gb2JqZWN0X3JlcXVlc3Rfc3RhdGUgc3RhdGU7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJY2hhciBlcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCWxvbmcgaHR0cF9jb2RlOworCXVuc2lnbmVkIGNoYXIgcmVhbF9zaGExWzIwXTsKKwlTSEFfQ1RYIGM7CisJel9zdHJlYW0gc3RyZWFtOworCWludCB6cmV0OworCWludCByZW5hbWU7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpuZXh0OworfTsKKworc3RydWN0IGFsdGVybmF0ZXNfcmVxdWVzdCB7CisJY2hhciAqYmFzZTsKKwljaGFyICp1cmw7CisJc3RydWN0IGJ1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCWludCBodHRwX3NwZWNpZmljOworfTsKKworI2lmbmRlZiBOT19FWFBBVAorc3RydWN0IHhtbF9jdHgKK3sKKwljaGFyICpuYW1lOworCWludCBsZW47CisJY2hhciAqY2RhdGE7CisJdm9pZCAoKnVzZXJGdW5jKShzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCk7CisJdm9pZCAqdXNlckRhdGE7Cit9OworCitzdHJ1Y3QgcmVtb3RlX2xzX2N0eAoreworCXN0cnVjdCBhbHRfYmFzZSAqcmVwbzsKKwljaGFyICpwYXRoOworCXZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKTsKKwl2b2lkICp1c2VyRGF0YTsKKwlpbnQgZmxhZ3M7CisJY2hhciAqZGVudHJ5X25hbWU7CisJaW50IGRlbnRyeV9mbGFnczsKKwlpbnQgcmM7CisJc3RydWN0IHJlbW90ZV9sc19jdHggKnBhcmVudDsKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqZWN0X3F1ZXVlX2hlYWQgPSBOVUxMOworCitzdGF0aWMgc2l6ZV90IGZ3cml0ZV9zaGExX2ZpbGUodm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwgc2l6ZV90IG5tZW1iLAorCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBleHBuWzQwOTZdOworCXNpemVfdCBzaXplID0gZWx0c2l6ZSAqIG5tZW1iOworCWludCBwb3NuID0gMDsKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEgPSAoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICopZGF0YTsKKwlkbyB7CisJCXNzaXplX3QgcmV0dmFsID0gd3JpdGUob2JqX3JlcS0+bG9jYWwsCisJCQkJICAgICAgIHB0ciArIHBvc24sIHNpemUgLSBwb3NuKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcG9zbjsKKwkJcG9zbiArPSByZXR2YWw7CisJfSB3aGlsZSAocG9zbiA8IHNpemUpOworCisJb2JqX3JlcS0+c3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwlvYmpfcmVxLT5zdHJlYW0ubmV4dF9pbiA9IHB0cjsKKwlkbyB7CisJCW9ial9yZXEtPnN0cmVhbS5uZXh0X291dCA9IGV4cG47CisJCW9ial9yZXEtPnN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZXhwbik7CisJCW9ial9yZXEtPnpyZXQgPSBpbmZsYXRlKCZvYmpfcmVxLT5zdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisJCVNIQTFfVXBkYXRlKCZvYmpfcmVxLT5jLCBleHBuLAorCQkJICAgIHNpemVvZihleHBuKSAtIG9ial9yZXEtPnN0cmVhbS5hdmFpbF9vdXQpOworCX0gd2hpbGUgKG9ial9yZXEtPnN0cmVhbS5hdmFpbF9pbiAmJiBvYmpfcmVxLT56cmV0ID09IFpfT0spOworCWRhdGFfcmVjZWl2ZWQrKzsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgZmV0Y2hfYWx0ZXJuYXRlcyhjaGFyICpiYXNlKTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19vYmplY3RfcmVzcG9uc2Uodm9pZCAqY2FsbGJhY2tfZGF0YSk7CisKK3N0YXRpYyB2b2lkIHN0YXJ0X29iamVjdF9yZXF1ZXN0KHN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChvYmpfcmVxLT5zaGExKTsKKwljaGFyIHByZXZmaWxlW1BBVEhfTUFYXTsKKwljaGFyICp1cmw7CisJY2hhciAqcG9zbjsKKwlpbnQgcHJldmxvY2FsOworCXVuc2lnbmVkIGNoYXIgcHJldl9idWZbUFJFVl9CVUZfU0laRV07CisJc3NpemVfdCBwcmV2X3JlYWQgPSAwOworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKworCXNucHJpbnRmKHByZXZmaWxlLCBzaXplb2YocHJldmZpbGUpLCAiJXMucHJldiIsIG9ial9yZXEtPmZpbGVuYW1lKTsKKwl1bmxpbmsocHJldmZpbGUpOworCXJlbmFtZShvYmpfcmVxLT50bXBmaWxlLCBwcmV2ZmlsZSk7CisJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCisJaWYgKG9ial9yZXEtPmxvY2FsICE9IC0xKQorCQllcnJvcigiZmQgbGVha2FnZSBpbiBzdGFydDogJWQiLCBvYmpfcmVxLT5sb2NhbCk7CisJb2JqX3JlcS0+bG9jYWwgPSBvcGVuKG9ial9yZXEtPnRtcGZpbGUsCisJCQkgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NjYpOworCS8qIFRoaXMgY291bGQgaGF2ZSBmYWlsZWQgZHVlIHRvIHRoZSAibGF6eSBkaXJlY3RvcnkgY3JlYXRpb24iOworCSAqIHRyeSB0byBta2RpciB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudC4KKwkgKi8KKwlpZiAob2JqX3JlcS0+bG9jYWwgPCAwICYmIGVycm5vID09IEVOT0VOVCkgeworCQljaGFyICpkaXIgPSBzdHJyY2hyKG9ial9yZXEtPnRtcGZpbGUsICcvJyk7CisJCWlmIChkaXIpIHsKKwkJCSpkaXIgPSAwOworCQkJbWtkaXIob2JqX3JlcS0+dG1wZmlsZSwgMDc3Nyk7CisJCQkqZGlyID0gJy8nOworCQl9CisJCW9ial9yZXEtPmxvY2FsID0gb3BlbihvYmpfcmVxLT50bXBmaWxlLAorCQkJCSAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJfQorCisJaWYgKG9ial9yZXEtPmxvY2FsIDwgMCkgeworCQlvYmpfcmVxLT5zdGF0ZSA9IEFCT1JURUQ7CisJCWVycm9yKCJDb3VsZG4ndCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUgJXMgZm9yICVzOiAlcyIsCisJCSAgICAgIG9ial9yZXEtPnRtcGZpbGUsIG9ial9yZXEtPmZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KCZvYmpfcmVxLT5zdHJlYW0sIDAsIHNpemVvZihvYmpfcmVxLT5zdHJlYW0pKTsKKworCWluZmxhdGVJbml0KCZvYmpfcmVxLT5zdHJlYW0pOworCisJU0hBMV9Jbml0KCZvYmpfcmVxLT5jKTsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKG9ial9yZXEtPnJlcG8tPmJhc2UpICsgNTApOworCW9ial9yZXEtPnVybCA9IHhtYWxsb2Moc3RybGVuKG9ial9yZXEtPnJlcG8tPmJhc2UpICsgNTApOworCXN0cmNweSh1cmwsIG9ial9yZXEtPnJlcG8tPmJhc2UpOworCXBvc24gPSB1cmwgKyBzdHJsZW4ob2JqX3JlcS0+cmVwby0+YmFzZSk7CisJc3RyY3B5KHBvc24sICJvYmplY3RzLyIpOworCXBvc24gKz0gODsKKwltZW1jcHkocG9zbiwgaGV4LCAyKTsKKwlwb3NuICs9IDI7CisJKihwb3NuKyspID0gJy8nOworCXN0cmNweShwb3NuLCBoZXggKyAyKTsKKwlzdHJjcHkob2JqX3JlcS0+dXJsLCB1cmwpOworCisJLyogSWYgYSBwcmV2aW91cyB0ZW1wIGZpbGUgaXMgcHJlc2VudCwgcHJvY2VzcyB3aGF0IHdhcyBhbHJlYWR5CisJICAgZmV0Y2hlZC4gKi8KKwlwcmV2bG9jYWwgPSBvcGVuKHByZXZmaWxlLCBPX1JET05MWSk7CisJaWYgKHByZXZsb2NhbCAhPSAtMSkgeworCQlkbyB7CisJCQlwcmV2X3JlYWQgPSByZWFkKHByZXZsb2NhbCwgcHJldl9idWYsIFBSRVZfQlVGX1NJWkUpOworCQkJaWYgKHByZXZfcmVhZD4wKSB7CisJCQkJaWYgKGZ3cml0ZV9zaGExX2ZpbGUocHJldl9idWYsCisJCQkJCQkgICAgIDEsCisJCQkJCQkgICAgIHByZXZfcmVhZCwKKwkJCQkJCSAgICAgb2JqX3JlcSkgPT0gcHJldl9yZWFkKSB7CisJCQkJCXByZXZfcG9zbiArPSBwcmV2X3JlYWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJldl9yZWFkID0gLTE7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChwcmV2X3JlYWQgPiAwKTsKKwkJY2xvc2UocHJldmxvY2FsKTsKKwl9CisJdW5saW5rKHByZXZmaWxlKTsKKworCS8qIFJlc2V0IGluZmxhdGUvU0hBMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgcHJldmlvdXMgdGVtcAorCSAgIGZpbGU7IGFsc28gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvY2FsIGZpbGUuICovCisJaWYgKHByZXZfcmVhZCA9PSAtMSkgeworCQltZW1zZXQoJm9ial9yZXEtPnN0cmVhbSwgMCwgc2l6ZW9mKG9ial9yZXEtPnN0cmVhbSkpOworCQlpbmZsYXRlSW5pdCgmb2JqX3JlcS0+c3RyZWFtKTsKKwkJU0hBMV9Jbml0KCZvYmpfcmVxLT5jKTsKKwkJaWYgKHByZXZfcG9zbj4wKSB7CisJCQlwcmV2X3Bvc24gPSAwOworCQkJbHNlZWsob2JqX3JlcS0+bG9jYWwsIFNFRUtfU0VULCAwKTsKKwkJCWZ0cnVuY2F0ZShvYmpfcmVxLT5sb2NhbCwgMCk7CisJCX0KKwl9CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3Nfb2JqZWN0X3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSBvYmpfcmVxOworCW9ial9yZXEtPnNsb3QgPSBzbG90OworCisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIG9ial9yZXEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfc2hhMV9maWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRVJST1JCVUZGRVIsIG9ial9yZXEtPmVycm9yc3RyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKworCS8qIElmIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBkYXRhIGZyb20gYSBwcmV2aW91cyBmZXRjaAorCSAgIGF0dGVtcHQsIG9ubHkgZmV0Y2ggdGhlIGRhdGEgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlLiAqLworCWlmIChwcmV2X3Bvc24+MCkgeworCQlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJSZXN1bWluZyBmZXRjaCBvZiBvYmplY3QgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJaGV4LCBwcmV2X3Bvc24pOworCQlzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVsZC0iLCBwcmV2X3Bvc24pOworCQlyYW5nZV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChyYW5nZV9oZWFkZXIsIHJhbmdlKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLAorCQkJCSBDVVJMT1BUX0hUVFBIRUFERVIsIHJhbmdlX2hlYWRlcik7CisJfQorCisJLyogVHJ5IHRvIGdldCB0aGUgcmVxdWVzdCBzdGFydGVkLCBhYm9ydCB0aGUgcmVxdWVzdCBvbiBlcnJvciAqLworCW9ial9yZXEtPnN0YXRlID0gQUNUSVZFOworCWlmICghc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJb2JqX3JlcS0+c3RhdGUgPSBBQk9SVEVEOworCQlvYmpfcmVxLT5zbG90ID0gTlVMTDsKKwkJY2xvc2Uob2JqX3JlcS0+bG9jYWwpOyBvYmpfcmVxLT5sb2NhbCA9IC0xOworCQlmcmVlKG9ial9yZXEtPnVybCk7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9vYmplY3RfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlmY2htb2Qob2JqX3JlcS0+bG9jYWwsIDA0NDQpOworCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsgb2JqX3JlcS0+bG9jYWwgPSAtMTsKKworCWlmIChvYmpfcmVxLT5odHRwX2NvZGUgPT0gNDE2KSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogcmVxdWVzdGVkIHJhbmdlIGludmFsaWQ7IHdlIG1heSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBkYXRhLlxuIik7CisJfSBlbHNlIGlmIChvYmpfcmVxLT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQlpZiAoc3RhdChvYmpfcmVxLT50bXBmaWxlLCAmc3QpID09IDApCisJCQlpZiAoc3Quc3Rfc2l6ZSA9PSAwKQorCQkJCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKwkJcmV0dXJuOworCX0KKworCWluZmxhdGVFbmQoJm9ial9yZXEtPnN0cmVhbSk7CisJU0hBMV9GaW5hbChvYmpfcmVxLT5yZWFsX3NoYTEsICZvYmpfcmVxLT5jKTsKKwlpZiAob2JqX3JlcS0+enJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCQlyZXR1cm47CisJfQorCWlmIChtZW1jbXAob2JqX3JlcS0+c2hhMSwgb2JqX3JlcS0+cmVhbF9zaGExLCAyMCkpIHsKKwkJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCQlyZXR1cm47CisJfQorCW9ial9yZXEtPnJlbmFtZSA9CisJCW1vdmVfdGVtcF90b19maWxlKG9ial9yZXEtPnRtcGZpbGUsIG9ial9yZXEtPmZpbGVuYW1lKTsKKworCWlmIChvYmpfcmVxLT5yZW5hbWUgPT0gMCkKKwkJcHVsbF9zYXkoImdvdCAlc1xuIiwgc2hhMV90b19oZXgob2JqX3JlcS0+c2hhMSkpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX29iamVjdF9yZXNwb25zZSh2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSA9CisJCShzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKiljYWxsYmFja19kYXRhOworCisJb2JqX3JlcS0+Y3VybF9yZXN1bHQgPSBvYmpfcmVxLT5zbG90LT5jdXJsX3Jlc3VsdDsKKwlvYmpfcmVxLT5odHRwX2NvZGUgPSBvYmpfcmVxLT5zbG90LT5odHRwX2NvZGU7CisJb2JqX3JlcS0+c2xvdCA9IE5VTEw7CisJb2JqX3JlcS0+c3RhdGUgPSBDT01QTEVURTsKKworCS8qIFVzZSBhbHRlcm5hdGVzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChvYmpfcmVxLT5odHRwX2NvZGUgPT0gNDA0IHx8CisJICAgIG9ial9yZXEtPmN1cmxfcmVzdWx0ID09IENVUkxFX0ZJTEVfQ09VTEROVF9SRUFEX0ZJTEUpIHsKKwkJZmV0Y2hfYWx0ZXJuYXRlcyhhbHQtPmJhc2UpOworCQlpZiAob2JqX3JlcS0+cmVwby0+bmV4dCAhPSBOVUxMKSB7CisJCQlvYmpfcmVxLT5yZXBvID0KKwkJCQlvYmpfcmVxLT5yZXBvLT5uZXh0OworCQkJY2xvc2Uob2JqX3JlcS0+bG9jYWwpOworCQkJb2JqX3JlcS0+bG9jYWwgPSAtMTsKKwkJCXN0YXJ0X29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJZmluaXNoX29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX29iamVjdF9yZXF1ZXN0KHN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKmVudHJ5ID0gb2JqZWN0X3F1ZXVlX2hlYWQ7CisKKwlpZiAob2JqX3JlcS0+bG9jYWwgIT0gLTEpCisJCWVycm9yKCJmZCBsZWFrYWdlIGluIHJlbGVhc2U6ICVkIiwgb2JqX3JlcS0+bG9jYWwpOworCWlmIChvYmpfcmVxID09IG9iamVjdF9xdWV1ZV9oZWFkKSB7CisJCW9iamVjdF9xdWV1ZV9oZWFkID0gb2JqX3JlcS0+bmV4dDsKKwl9IGVsc2UgeworCQl3aGlsZSAoZW50cnktPm5leHQgIT0gTlVMTCAmJiBlbnRyeS0+bmV4dCAhPSBvYmpfcmVxKQorCQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJaWYgKGVudHJ5LT5uZXh0ID09IG9ial9yZXEpCisJCQllbnRyeS0+bmV4dCA9IGVudHJ5LT5uZXh0LT5uZXh0OworCX0KKworCWZyZWUob2JqX3JlcS0+dXJsKTsKKwlmcmVlKG9ial9yZXEpOworfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK3ZvaWQgZmlsbF9hY3RpdmVfc2xvdHModm9pZCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEgPSBvYmplY3RfcXVldWVfaGVhZDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCWludCBudW1fdHJhbnNmZXJzOworCisJd2hpbGUgKGFjdGl2ZV9yZXF1ZXN0cyA8IG1heF9yZXF1ZXN0cyAmJiBvYmpfcmVxICE9IE5VTEwpIHsKKwkJaWYgKG9ial9yZXEtPnN0YXRlID09IFdBSVRJTkcpIHsKKwkJCWlmIChoYXNfc2hhMV9maWxlKG9ial9yZXEtPnNoYTEpKQorCQkJCW9ial9yZXEtPnN0YXRlID0gQ09NUExFVEU7CisJCQllbHNlCisJCQkJc3RhcnRfb2JqZWN0X3JlcXVlc3Qob2JqX3JlcSk7CisJCQljdXJsX211bHRpX3BlcmZvcm0oY3VybG0sICZudW1fdHJhbnNmZXJzKTsKKwkJfQorCQlvYmpfcmVxID0gb2JqX3JlcS0+bmV4dDsKKwl9CisKKwl3aGlsZSAoc2xvdCAhPSBOVUxMKSB7CisJCWlmICghc2xvdC0+aW5fdXNlICYmIHNsb3QtPmN1cmwgIT0gTlVMTCkgeworCQkJY3VybF9lYXN5X2NsZWFudXAoc2xvdC0+Y3VybCk7CisJCQlzbG90LT5jdXJsID0gTlVMTDsKKwkJfQorCQlzbG90ID0gc2xvdC0+bmV4dDsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBwcmVmZXRjaCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqbmV3cmVxOworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqdGFpbDsKKwljaGFyICpmaWxlbmFtZSA9IHNoYTFfZmlsZV9uYW1lKHNoYTEpOworCisJbmV3cmVxID0geG1hbGxvYyhzaXplb2YoKm5ld3JlcSkpOworCW1lbWNweShuZXdyZXEtPnNoYTEsIHNoYTEsIDIwKTsKKwluZXdyZXEtPnJlcG8gPSBhbHQ7CisJbmV3cmVxLT51cmwgPSBOVUxMOworCW5ld3JlcS0+bG9jYWwgPSAtMTsKKwluZXdyZXEtPnN0YXRlID0gV0FJVElORzsKKwlzbnByaW50ZihuZXdyZXEtPmZpbGVuYW1lLCBzaXplb2YobmV3cmVxLT5maWxlbmFtZSksICIlcyIsIGZpbGVuYW1lKTsKKwlzbnByaW50ZihuZXdyZXEtPnRtcGZpbGUsIHNpemVvZihuZXdyZXEtPnRtcGZpbGUpLAorCQkgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisJbmV3cmVxLT5zbG90ID0gTlVMTDsKKwluZXdyZXEtPm5leHQgPSBOVUxMOworCisJaWYgKG9iamVjdF9xdWV1ZV9oZWFkID09IE5VTEwpIHsKKwkJb2JqZWN0X3F1ZXVlX2hlYWQgPSBuZXdyZXE7CisJfSBlbHNlIHsKKwkJdGFpbCA9IG9iamVjdF9xdWV1ZV9oZWFkOworCQl3aGlsZSAodGFpbC0+bmV4dCAhPSBOVUxMKSB7CisJCQl0YWlsID0gdGFpbC0+bmV4dDsKKwkJfQorCQl0YWlsLT5uZXh0ID0gbmV3cmVxOworCX0KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKwlzdGVwX2FjdGl2ZV9zbG90cygpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfaW5kZXgoc3RydWN0IGFsdF9iYXNlICpyZXBvLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKmhleCA9IHNoYTFfdG9faGV4KHNoYTEpOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgKnVybDsKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKworCUZJTEUgKmluZGV4ZmlsZTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwlpZiAoaGFzX3BhY2tfaW5kZXgoc2hhMSkpCisJCXJldHVybiAwOworCisJaWYgKGdldF92ZXJib3NlbHkpCisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBpbmRleCBmb3IgcGFjayAlc1xuIiwgaGV4KTsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlcG8tPmJhc2UpICsgNjQpOworCXNwcmludGYodXJsLCAiJXMvb2JqZWN0cy9wYWNrL3BhY2stJXMuaWR4IiwgcmVwby0+YmFzZSwgaGV4KTsKKworCWZpbGVuYW1lID0gc2hhMV9wYWNrX2luZGV4X25hbWUoc2hhMSk7CisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMudGVtcCIsIGZpbGVuYW1lKTsKKwlpbmRleGZpbGUgPSBmb3Blbih0bXBmaWxlLCAiYSIpOworCWlmICghaW5kZXhmaWxlKQorCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBvcGVuIGxvY2FsIGZpbGUgJXMgZm9yIHBhY2sgaW5kZXgiLAorCQkJICAgICBmaWxlbmFtZSk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCBpbmRleGZpbGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIG5vX3ByYWdtYV9oZWFkZXIpOworCXNsb3QtPmxvY2FsID0gaW5kZXhmaWxlOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSBwcmVzZW50IGZyb20gYSBwcmV2aW91cyB0cmFuc2ZlciBhdHRlbXB0LAorCSAgIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiAqLworCXByZXZfcG9zbiA9IGZ0ZWxsKGluZGV4ZmlsZSk7CisJaWYgKHByZXZfcG9zbj4wKSB7CisJCWlmIChnZXRfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIGluZGV4IGZvciBwYWNrICVzIGF0IGJ5dGUgJWxkXG4iLAorCQkJCWhleCwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmY2xvc2UoaW5kZXhmaWxlKTsKKwkJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGdldCBwYWNrIGluZGV4ICVzXG4lcyIsIHVybCwKKwkJCQkgICAgIGN1cmxfZXJyb3JzdHIpOworCQl9CisJfSBlbHNlIHsKKwkJZmNsb3NlKGluZGV4ZmlsZSk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwlmY2xvc2UoaW5kZXhmaWxlKTsKKworCXJldHVybiBtb3ZlX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfaW5kZXgoc3RydWN0IGFsdF9iYXNlICpyZXBvLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpuZXdfcGFjazsKKwlpZiAoaGFzX3BhY2tfZmlsZShzaGExKSkKKwkJcmV0dXJuIDA7IC8vIGRvbid0IGxpc3QgdGhpcyBhcyBzb21ldGhpbmcgd2UgY2FuIGdldAorCisJaWYgKGZldGNoX2luZGV4KHJlcG8sIHNoYTEpKQorCQlyZXR1cm4gLTE7CisKKwluZXdfcGFjayA9IHBhcnNlX3BhY2tfaW5kZXgoc2hhMSk7CisJbmV3X3BhY2stPm5leHQgPSByZXBvLT5wYWNrczsKKwlyZXBvLT5wYWNrcyA9IG5ld19wYWNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2FsdGVybmF0ZXNfcmVzcG9uc2Uodm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlzdHJ1Y3QgYWx0ZXJuYXRlc19yZXF1ZXN0ICphbHRfcmVxID0KKwkJKHN0cnVjdCBhbHRlcm5hdGVzX3JlcXVlc3QgKiljYWxsYmFja19kYXRhOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWx0X3JlcS0+c2xvdDsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKnRhaWwgPSBhbHQ7CisJY2hhciAqYmFzZSA9IGFsdF9yZXEtPmJhc2U7CisJc3RhdGljIGNvbnN0IGNoYXIgbnVsbF9ieXRlID0gJ1wwJzsKKwljaGFyICpkYXRhOworCWludCBpID0gMDsKKworCWlmIChhbHRfcmVxLT5odHRwX3NwZWNpZmljKSB7CisJCWlmIChzbG90LT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSyB8fAorCQkgICAgIWFsdF9yZXEtPmJ1ZmZlci0+cG9zbikgeworCisJCQkvKiBUcnkgcmV1c2luZyB0aGUgc2xvdCB0byBnZXQgbm9uLWh0dHAgYWx0ZXJuYXRlcyAqLworCQkJYWx0X3JlcS0+aHR0cF9zcGVjaWZpYyA9IDA7CisJCQlzcHJpbnRmKGFsdF9yZXEtPnVybCwgIiVzL29iamVjdHMvaW5mby9hbHRlcm5hdGVzIiwKKwkJCQliYXNlKTsKKwkJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsCisJCQkJCSBhbHRfcmVxLT51cmwpOworCQkJYWN0aXZlX3JlcXVlc3RzKys7CisJCQlzbG90LT5pbl91c2UgPSAxOworCQkJaWYgKHNsb3QtPmZpbmlzaGVkICE9IE5VTEwpCisJCQkJKCpzbG90LT5maW5pc2hlZCkgPSAwOworCQkJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQkJCWdvdF9hbHRlcm5hdGVzID0gLTE7CisJCQkJc2xvdC0+aW5fdXNlID0gMDsKKwkJCQlpZiAoc2xvdC0+ZmluaXNoZWQgIT0gTlVMTCkKKwkJCQkJKCpzbG90LT5maW5pc2hlZCkgPSAxOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChzbG90LT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQlpZiAoc2xvdC0+aHR0cF9jb2RlICE9IDQwNCAmJgorCQkgICAgc2xvdC0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfRklMRV9DT1VMRE5UX1JFQURfRklMRSkgeworCQkJZ290X2FsdGVybmF0ZXMgPSAtMTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZ3cml0ZV9idWZmZXIoJm51bGxfYnl0ZSwgMSwgMSwgYWx0X3JlcS0+YnVmZmVyKTsKKwlhbHRfcmVxLT5idWZmZXItPnBvc24tLTsKKwlkYXRhID0gYWx0X3JlcS0+YnVmZmVyLT5idWZmZXI7CisKKwl3aGlsZSAoaSA8IGFsdF9yZXEtPmJ1ZmZlci0+cG9zbikgeworCQlpbnQgcG9zbiA9IGk7CisJCXdoaWxlIChwb3NuIDwgYWx0X3JlcS0+YnVmZmVyLT5wb3NuICYmIGRhdGFbcG9zbl0gIT0gJ1xuJykKKwkJCXBvc24rKzsKKwkJaWYgKGRhdGFbcG9zbl0gPT0gJ1xuJykgeworCQkJaW50IG9rYXkgPSAwOworCQkJaW50IHNlcnZlcmxlbiA9IDA7CisJCQlzdHJ1Y3QgYWx0X2Jhc2UgKm5ld2FsdDsKKwkJCWNoYXIgKnRhcmdldCA9IE5VTEw7CisJCQljaGFyICpwYXRoOworCQkJaWYgKGRhdGFbaV0gPT0gJy8nKSB7CisJCQkJc2VydmVybGVuID0gc3RyY2hyKGJhc2UgKyA4LCAnLycpIC0gYmFzZTsKKwkJCQlva2F5ID0gMTsKKwkJCX0gZWxzZSBpZiAoIW1lbWNtcChkYXRhICsgaSwgIi4uLyIsIDMpKSB7CisJCQkJaSArPSAzOworCQkJCXNlcnZlcmxlbiA9IHN0cmxlbihiYXNlKTsKKwkJCQl3aGlsZSAoaSArIDIgPCBwb3NuICYmCisJCQkJICAgICAgICFtZW1jbXAoZGF0YSArIGksICIuLi8iLCAzKSkgeworCQkJCQlkbyB7CisJCQkJCQlzZXJ2ZXJsZW4tLTsKKwkJCQkJfSB3aGlsZSAoc2VydmVybGVuICYmCisJCQkJCQkgYmFzZVtzZXJ2ZXJsZW4gLSAxXSAhPSAnLycpOworCQkJCQlpICs9IDM7CisJCQkJfQorCQkJCS8vIElmIHRoZSBzZXJ2ZXIgZ290IHJlbW92ZWQsIGdpdmUgdXAuCisJCQkJb2theSA9IHN0cmNocihiYXNlLCAnOicpIC0gYmFzZSArIDMgPAorCQkJCQlzZXJ2ZXJsZW47CisJCQl9IGVsc2UgaWYgKGFsdF9yZXEtPmh0dHBfc3BlY2lmaWMpIHsKKwkJCQljaGFyICpjb2xvbiA9IHN0cmNocihkYXRhICsgaSwgJzonKTsKKwkJCQljaGFyICpzbGFzaCA9IHN0cmNocihkYXRhICsgaSwgJy8nKTsKKwkJCQlpZiAoY29sb24gJiYgc2xhc2ggJiYgY29sb24gPCBkYXRhICsgcG9zbiAmJgorCQkJCSAgICBzbGFzaCA8IGRhdGEgKyBwb3NuICYmIGNvbG9uIDwgc2xhc2gpIHsKKwkJCQkJb2theSA9IDE7CisJCQkJfQorCQkJfQorCQkJLy8gc2tpcCAnb2JqZWN0cycgYXQgZW5kCisJCQlpZiAob2theSkgeworCQkJCXRhcmdldCA9IHhtYWxsb2Moc2VydmVybGVuICsgcG9zbiAtIGkgLSA2KTsKKwkJCQlzdHJuY3B5KHRhcmdldCwgYmFzZSwgc2VydmVybGVuKTsKKwkJCQlzdHJuY3B5KHRhcmdldCArIHNlcnZlcmxlbiwgZGF0YSArIGksCisJCQkJCXBvc24gLSBpIC0gNyk7CisJCQkJdGFyZ2V0W3NlcnZlcmxlbiArIHBvc24gLSBpIC0gN10gPSAnXDAnOworCQkJCWlmIChnZXRfdmVyYm9zZWx5KQorCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJBbHNvIGxvb2sgYXQgJXNcbiIsIHRhcmdldCk7CisJCQkJbmV3YWx0ID0geG1hbGxvYyhzaXplb2YoKm5ld2FsdCkpOworCQkJCW5ld2FsdC0+bmV4dCA9IE5VTEw7CisJCQkJbmV3YWx0LT5iYXNlID0gdGFyZ2V0OworCQkJCW5ld2FsdC0+Z290X2luZGljZXMgPSAwOworCQkJCW5ld2FsdC0+cGFja3MgPSBOVUxMOworCQkJCXBhdGggPSBzdHJzdHIodGFyZ2V0LCAiLy8iKTsKKwkJCQlpZiAocGF0aCkgeworCQkJCQlwYXRoID0gc3RyY2hyKHBhdGgrMiwgJy8nKTsKKwkJCQkJaWYgKHBhdGgpCisJCQkJCQluZXdhbHQtPnBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCQkJCX0KKworCQkJCXdoaWxlICh0YWlsLT5uZXh0ICE9IE5VTEwpCisJCQkJCXRhaWwgPSB0YWlsLT5uZXh0OworCQkJCXRhaWwtPm5leHQgPSBuZXdhbHQ7CisJCQl9CisJCX0KKwkJaSA9IHBvc24gKyAxOworCX0KKworCWdvdF9hbHRlcm5hdGVzID0gMTsKK30KKworc3RhdGljIHZvaWQgZmV0Y2hfYWx0ZXJuYXRlcyhjaGFyICpiYXNlKQoreworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCWNoYXIgKnVybDsKKwljaGFyICpkYXRhOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBhbHRlcm5hdGVzX3JlcXVlc3QgYWx0X3JlcTsKKworCS8qIElmIGFub3RoZXIgcmVxdWVzdCBoYXMgYWxyZWFkeSBzdGFydGVkIGZldGNoaW5nIGFsdGVybmF0ZXMsCisJICAgd2FpdCBmb3IgdGhlbSB0byBhcnJpdmUgYW5kIHJldHVybiB0byBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdCdzCisJICAgY3VybCBtZXNzYWdlICovCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwl3aGlsZSAoZ290X2FsdGVybmF0ZXMgPT0gMCkgeworCQlzdGVwX2FjdGl2ZV9zbG90cygpOworCX0KKyNlbmRpZgorCisJLyogTm90aGluZyB0byBkbyBpZiB0aGV5J3ZlIGFscmVhZHkgYmVlbiBmZXRjaGVkICovCisJaWYgKGdvdF9hbHRlcm5hdGVzID09IDEpCisJCXJldHVybjsKKworCS8qIFN0YXJ0IHRoZSBmZXRjaCAqLworCWdvdF9hbHRlcm5hdGVzID0gMDsKKworCWRhdGEgPSB4bWFsbG9jKDQwOTYpOworCWJ1ZmZlci5zaXplID0gNDA5NjsKKwlidWZmZXIucG9zbiA9IDA7CisJYnVmZmVyLmJ1ZmZlciA9IGRhdGE7CisKKwlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIGFsdGVybmF0ZXMgbGlzdCBmb3IgJXNcbiIsIGJhc2UpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4oYmFzZSkgKyAzMSk7CisJc3ByaW50Zih1cmwsICIlcy9vYmplY3RzL2luZm8vaHR0cC1hbHRlcm5hdGVzIiwgYmFzZSk7CisKKwkvKiBVc2UgYSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZSByZXN1bHQsIHNpbmNlIGFub3RoZXIgcmVxdWVzdAorCSAgIG1heSBmYWlsIGFuZCBuZWVkIHRvIGhhdmUgYWx0ZXJuYXRlcyBsb2FkZWQgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfYWx0ZXJuYXRlc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gJmFsdF9yZXE7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisKKwlhbHRfcmVxLmJhc2UgPSBiYXNlOworCWFsdF9yZXEudXJsID0gdXJsOworCWFsdF9yZXEuYnVmZmVyID0gJmJ1ZmZlcjsKKwlhbHRfcmVxLmh0dHBfc3BlY2lmaWMgPSAxOworCWFsdF9yZXEuc2xvdCA9IHNsb3Q7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpCisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwllbHNlCisJCWdvdF9hbHRlcm5hdGVzID0gLTE7CisKKwlmcmVlKGRhdGEpOworCWZyZWUodXJsKTsKK30KKworI2lmbmRlZiBOT19FWFBBVAorc3RhdGljIHZvaWQKK3htbF9zdGFydF90YWcodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRzKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwljb25zdCBjaGFyICpjID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJaW50IG5ld19sZW47CisKKwlpZiAoYyA9PSBOVUxMKQorCQljID0gbmFtZTsKKwllbHNlCisJCWMrKzsKKworCW5ld19sZW4gPSBzdHJsZW4oY3R4LT5uYW1lKSArIHN0cmxlbihjKSArIDI7CisKKwlpZiAobmV3X2xlbiA+IGN0eC0+bGVuKSB7CisJCWN0eC0+bmFtZSA9IHhyZWFsbG9jKGN0eC0+bmFtZSwgbmV3X2xlbik7CisJCWN0eC0+bGVuID0gbmV3X2xlbjsKKwl9CisJc3RyY2F0KGN0eC0+bmFtZSwgIi4iKTsKKwlzdHJjYXQoY3R4LT5uYW1lLCBjKTsKKworCWlmIChjdHgtPmNkYXRhKSB7CisJCWZyZWUoY3R4LT5jZGF0YSk7CisJCWN0eC0+Y2RhdGEgPSBOVUxMOworCX0KKworCWN0eC0+dXNlckZ1bmMoY3R4LCAwKTsKK30KKworc3RhdGljIHZvaWQKK3htbF9lbmRfdGFnKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwljb25zdCBjaGFyICpjID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJY2hhciAqZXA7CisKKwljdHgtPnVzZXJGdW5jKGN0eCwgMSk7CisKKwlpZiAoYyA9PSBOVUxMKQorCQljID0gbmFtZTsKKwllbHNlCisJCWMrKzsKKworCWVwID0gY3R4LT5uYW1lICsgc3RybGVuKGN0eC0+bmFtZSkgLSBzdHJsZW4oYykgLSAxOworCSplcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCit4bWxfY2RhdGEodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwlpZiAoY3R4LT5jZGF0YSkKKwkJZnJlZShjdHgtPmNkYXRhKTsKKwljdHgtPmNkYXRhID0geGNhbGxvYyhsZW4rMSwgMSk7CisJc3RybmNweShjdHgtPmNkYXRhLCBzLCBsZW4pOworfQorCitzdGF0aWMgaW50IHJlbW90ZV9scyhzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywKKwkJICAgICB2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyksCisJCSAgICAgdm9pZCAqdXNlckRhdGEpOworCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVtb3RlX2xzX2N0eChzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCkKK3sKKwlzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMgPSAoc3RydWN0IHJlbW90ZV9sc19jdHggKiljdHgtPnVzZXJEYXRhOworCisJaWYgKHRhZ19jbG9zZWQpIHsKKwkJaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfUkVTUCkgJiYgbHMtPmRlbnRyeV9uYW1lKSB7CisJCQlpZiAobHMtPmRlbnRyeV9mbGFncyAmIElTX0RJUikgeworCQkJCWlmIChscy0+ZmxhZ3MgJiBQUk9DRVNTX0RJUlMpIHsKKwkJCQkJbHMtPnVzZXJGdW5jKGxzKTsKKwkJCQl9CisJCQkJaWYgKHN0cmNtcChscy0+ZGVudHJ5X25hbWUsIGxzLT5wYXRoKSAmJgorCQkJCSAgICBscy0+ZmxhZ3MgJiBSRUNVUlNJVkUpIHsKKwkJCQkJbHMtPnJjID0gcmVtb3RlX2xzKGxzLT5yZXBvLAorCQkJCQkJCSAgIGxzLT5kZW50cnlfbmFtZSwKKwkJCQkJCQkgICBscy0+ZmxhZ3MsCisJCQkJCQkJICAgbHMtPnVzZXJGdW5jLAorCQkJCQkJCSAgIGxzLT51c2VyRGF0YSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChscy0+ZmxhZ3MgJiBQUk9DRVNTX0ZJTEVTKSB7CisJCQkJbHMtPnVzZXJGdW5jKGxzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX05BTUUpICYmIGN0eC0+Y2RhdGEpIHsKKwkJCWxzLT5kZW50cnlfbmFtZSA9IHhtYWxsb2Moc3RybGVuKGN0eC0+Y2RhdGEpIC0KKwkJCQkJCSAgbHMtPnJlcG8tPnBhdGhfbGVuICsgMSk7CisJCQlzdHJjcHkobHMtPmRlbnRyeV9uYW1lLCBjdHgtPmNkYXRhICsgbHMtPnJlcG8tPnBhdGhfbGVuKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX0NPTExFQ1RJT04pKSB7CisJCQlscy0+ZGVudHJ5X2ZsYWdzIHw9IElTX0RJUjsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9SRVNQKSkgeworCQlpZiAobHMtPmRlbnRyeV9uYW1lKSB7CisJCQlmcmVlKGxzLT5kZW50cnlfbmFtZSk7CisJCX0KKwkJbHMtPmRlbnRyeV9uYW1lID0gTlVMTDsKKwkJbHMtPmRlbnRyeV9mbGFncyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHJlbW90ZV9scyhzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywKKwkJICAgICB2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyksCisJCSAgICAgdm9pZCAqdXNlckRhdGEpCit7CisJY2hhciAqdXJsID0geG1hbGxvYyhzdHJsZW4ocmVwby0+YmFzZSkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IGJ1ZmZlciBpbl9idWZmZXI7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyOworCWNoYXIgKmluX2RhdGE7CisJY2hhciAqb3V0X2RhdGE7CisJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisJc3RydWN0IHJlbW90ZV9sc19jdHggbHM7CisKKwlscy5mbGFncyA9IGZsYWdzOworCWxzLnJlcG8gPSByZXBvOworCWxzLnBhdGggPSBzdHJkdXAocGF0aCk7CisJbHMuZGVudHJ5X25hbWUgPSBOVUxMOworCWxzLmRlbnRyeV9mbGFncyA9IDA7CisJbHMudXNlckRhdGEgPSB1c2VyRGF0YTsKKwlscy51c2VyRnVuYyA9IHVzZXJGdW5jOworCWxzLnJjID0gMDsKKworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlcG8tPmJhc2UsIHBhdGgpOworCisJb3V0X2J1ZmZlci5zaXplID0gc3RybGVuKFBST1BGSU5EX0FMTF9SRVFVRVNUKTsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsIFBST1BGSU5EX0FMTF9SRVFVRVNUKTsKKwlvdXRfYnVmZmVyLnBvc24gPSAwOworCW91dF9idWZmZXIuYnVmZmVyID0gb3V0X2RhdGE7CisKKwlpbl9idWZmZXIuc2l6ZSA9IDQwOTY7CisJaW5fZGF0YSA9IHhtYWxsb2MoaW5fYnVmZmVyLnNpemUpOworCWluX2J1ZmZlci5wb3NuID0gMDsKKwlpbl9idWZmZXIuYnVmZmVyID0gaW5fZGF0YTsKKworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJEZXB0aDogMSIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5zaXplKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BST1BGSU5EKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCWN0eC5uYW1lID0geGNhbGxvYygxMCwgMSk7CisJCQljdHgubGVuID0gMDsKKwkJCWN0eC5jZGF0YSA9IE5VTEw7CisJCQljdHgudXNlckZ1bmMgPSBoYW5kbGVfcmVtb3RlX2xzX2N0eDsKKwkJCWN0eC51c2VyRGF0YSA9ICZsczsKKwkJCVhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZjdHgpOworCQkJWE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgeG1sX3N0YXJ0X3RhZywKKwkJCQkJICAgICAgeG1sX2VuZF90YWcpOworCQkJWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgeG1sX2NkYXRhKTsKKwkJCXJlc3VsdCA9IFhNTF9QYXJzZShwYXJzZXIsIGluX2J1ZmZlci5idWZmZXIsCisJCQkJCSAgIGluX2J1ZmZlci5wb3NuLCAxKTsKKwkJCWZyZWUoY3R4Lm5hbWUpOworCisJCQlpZiAocmVzdWx0ICE9IFhNTF9TVEFUVVNfT0spIHsKKwkJCQlscy5yYyA9IGVycm9yKCJYTUwgZXJyb3I6ICVzIiwKKwkJCQkJICAgICAgWE1MX0Vycm9yU3RyaW5nKAorCQkJCQkJICAgICAgWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlscy5yYyA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJbHMucmMgPSBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IFBST1BGSU5EIHJlcXVlc3QiKTsKKwl9CisKKwlmcmVlKGxzLnBhdGgpOworCWZyZWUodXJsKTsKKwlmcmVlKG91dF9kYXRhKTsKKwlmcmVlKGluX2J1ZmZlci5idWZmZXIpOworCWN1cmxfc2xpc3RfZnJlZV9hbGwoZGF2X2hlYWRlcnMpOworCisJcmV0dXJuIGxzLnJjOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2xzX3BhY2soc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoc3RybGVuKGxzLT5kZW50cnlfbmFtZSkgPT0gNjMgJiYKKwkgICAgIXN0cm5jbXAobHMtPmRlbnRyeV9uYW1lLCAib2JqZWN0cy9wYWNrL3BhY2stIiwgMTgpICYmCisJICAgICFzdHJuY21wKGxzLT5kZW50cnlfbmFtZSs1OCwgIi5wYWNrIiwgNSkpIHsKKwkJZ2V0X3NoYTFfaGV4KGxzLT5kZW50cnlfbmFtZSArIDE4LCBzaGExKTsKKwkJc2V0dXBfaW5kZXgobHMtPnJlcG8sIHNoYTEpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGZldGNoX2luZGljZXMoc3RydWN0IGFsdF9iYXNlICpyZXBvKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqdXJsOworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCWNoYXIgKmRhdGE7CisJaW50IGkgPSAwOworCisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJaWYgKHJlcG8tPmdvdF9pbmRpY2VzKQorCQlyZXR1cm4gMDsKKworCWRhdGEgPSB4bWFsbG9jKDQwOTYpOworCWJ1ZmZlci5zaXplID0gNDA5NjsKKwlidWZmZXIucG9zbiA9IDA7CisJYnVmZmVyLmJ1ZmZlciA9IGRhdGE7CisKKwlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIHBhY2sgbGlzdCBmb3IgJXNcbiIsIHJlcG8tPmJhc2UpOworCisjaWZuZGVmIE5PX0VYUEFUCisJaWYgKHJlbW90ZV9scyhyZXBvLCAib2JqZWN0cy9wYWNrLyIsIFBST0NFU1NfRklMRVMsCisJCSAgICAgIHByb2Nlc3NfbHNfcGFjaywgTlVMTCkgPT0gMCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlcG8tPmJhc2UpICsgMjEpOworCXNwcmludGYodXJsLCAiJXMvb2JqZWN0cy9pbmZvL3BhY2tzIiwgcmVwby0+YmFzZSk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgTlVMTCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWlmIChyZXN1bHRzLmh0dHBfY29kZSA9PSA0MDQgfHwKKwkJCSAgICByZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX0ZJTEVfQ09VTEROVF9SRUFEX0ZJTEUpIHsKKwkJCQlyZXBvLT5nb3RfaW5kaWNlcyA9IDE7CisJCQkJZnJlZShidWZmZXIuYnVmZmVyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJcmVwby0+Z290X2luZGljZXMgPSAwOworCQkJCWZyZWUoYnVmZmVyLmJ1ZmZlcik7CisJCQkJcmV0dXJuIGVycm9yKCIlcyIsIGN1cmxfZXJyb3JzdHIpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmVwby0+Z290X2luZGljZXMgPSAwOworCQlmcmVlKGJ1ZmZlci5idWZmZXIpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJZGF0YSA9IGJ1ZmZlci5idWZmZXI7CisJd2hpbGUgKGkgPCBidWZmZXIucG9zbikgeworCQlzd2l0Y2ggKGRhdGFbaV0pIHsKKwkJY2FzZSAnUCc6CisJCQlpKys7CisJCQlpZiAoaSArIDUyIDw9IGJ1ZmZlci5wb3NuICYmCisJCQkgICAgIXN0cm5jbXAoZGF0YSArIGksICIgcGFjay0iLCA2KSAmJgorCQkJICAgICFzdHJuY21wKGRhdGEgKyBpICsgNDYsICIucGFja1xuIiwgNikpIHsKKwkJCQlnZXRfc2hhMV9oZXgoZGF0YSArIGkgKyA2LCBzaGExKTsKKwkJCQlzZXR1cF9pbmRleChyZXBvLCBzaGExKTsKKwkJCQlpICs9IDUxOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJd2hpbGUgKGkgPCBidWZmZXIucG9zbiAmJiBkYXRhW2ldICE9ICdcbicpCisJCQkJaSsrOworCQl9CisJCWkrKzsKKwl9CisKKwlmcmVlKGJ1ZmZlci5idWZmZXIpOworCXJlcG8tPmdvdF9pbmRpY2VzID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZXRjaF9wYWNrKHN0cnVjdCBhbHRfYmFzZSAqcmVwbywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICp1cmw7CisJc3RydWN0IHBhY2tlZF9naXQgKnRhcmdldDsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqKmxzdDsKKwlGSUxFICpwYWNrZmlsZTsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCByZXQ7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJaWYgKGZldGNoX2luZGljZXMocmVwbykpCisJCXJldHVybiAtMTsKKwl0YXJnZXQgPSBmaW5kX3NoYTFfcGFjayhzaGExLCByZXBvLT5wYWNrcyk7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiAtMTsKKworCWlmIChnZXRfdmVyYm9zZWx5KSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBwYWNrICVzXG4iLAorCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJCWZwcmludGYoc3RkZXJyLCAiIHdoaWNoIGNvbnRhaW5zICVzXG4iLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCX0KKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlcG8tPmJhc2UpICsgNjUpOworCXNwcmludGYodXJsLCAiJXMvb2JqZWN0cy9wYWNrL3BhY2stJXMucGFjayIsCisJCXJlcG8tPmJhc2UsIHNoYTFfdG9faGV4KHRhcmdldC0+c2hhMSkpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfbmFtZSh0YXJnZXQtPnNoYTEpOworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisJcGFja2ZpbGUgPSBmb3Blbih0bXBmaWxlLCAiYSIpOworCWlmICghcGFja2ZpbGUpCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayIsCisJCQkgICAgIGZpbGVuYW1lKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIHBhY2tmaWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKwlzbG90LT5sb2NhbCA9IHBhY2tmaWxlOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSBwcmVzZW50IGZyb20gYSBwcmV2aW91cyB0cmFuc2ZlciBhdHRlbXB0LAorCSAgIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiAqLworCXByZXZfcG9zbiA9IGZ0ZWxsKHBhY2tmaWxlKTsKKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKGdldF92ZXJib3NlbHkpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiUmVzdW1pbmcgZmV0Y2ggb2YgcGFjayAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQlzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpLCBwcmV2X3Bvc24pOworCQlzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVsZC0iLCBwcmV2X3Bvc24pOworCQlyYW5nZV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChyYW5nZV9oZWFkZXIsIHJhbmdlKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIHJhbmdlX2hlYWRlcik7CisJfQorCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZjbG9zZShwYWNrZmlsZSk7CisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBnZXQgcGFjayBmaWxlICVzXG4lcyIsIHVybCwKKwkJCQkgICAgIGN1cmxfZXJyb3JzdHIpOworCQl9CisJfSBlbHNlIHsKKwkJZmNsb3NlKHBhY2tmaWxlKTsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCX0KKworCWZjbG9zZShwYWNrZmlsZSk7CisKKwlyZXQgPSBtb3ZlX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWxzdCA9ICZyZXBvLT5wYWNrczsKKwl3aGlsZSAoKmxzdCAhPSB0YXJnZXQpCisJCWxzdCA9ICYoKCpsc3QpLT5uZXh0KTsKKwkqbHN0ID0gKCpsc3QpLT5uZXh0OworCisJaWYgKHZlcmlmeV9wYWNrKHRhcmdldCwgMCkpCisJCXJldHVybiAtMTsKKwlpbnN0YWxsX3BhY2tlZF9naXQodGFyZ2V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhYm9ydF9vYmplY3RfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEpCit7CisJaWYgKG9ial9yZXEtPmxvY2FsID49IDApIHsKKwkJY2xvc2Uob2JqX3JlcS0+bG9jYWwpOworCQlvYmpfcmVxLT5sb2NhbCA9IC0xOworCX0KKwl1bmxpbmsob2JqX3JlcS0+dG1wZmlsZSk7CisJaWYgKG9ial9yZXEtPnNsb3QpIHsKKyAJCXJlbGVhc2VfYWN0aXZlX3Nsb3Qob2JqX3JlcS0+c2xvdCk7CisJCW9ial9yZXEtPnNsb3QgPSBOVUxMOworCX0KKwlyZWxlYXNlX29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworfQorCitzdGF0aWMgaW50IGZldGNoX29iamVjdChzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgoc2hhMSk7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxID0gb2JqZWN0X3F1ZXVlX2hlYWQ7CisKKwl3aGlsZSAob2JqX3JlcSAhPSBOVUxMICYmIG1lbWNtcChvYmpfcmVxLT5zaGExLCBzaGExLCAyMCkpCisJCW9ial9yZXEgPSBvYmpfcmVxLT5uZXh0OworCWlmIChvYmpfcmVxID09IE5VTEwpCisJCXJldHVybiBlcnJvcigiQ291bGRuJ3QgZmluZCByZXF1ZXN0IGZvciAlcyBpbiB0aGUgcXVldWUiLCBoZXgpOworCisJaWYgKGhhc19zaGExX2ZpbGUob2JqX3JlcS0+c2hhMSkpIHsKKwkJYWJvcnRfb2JqZWN0X3JlcXVlc3Qob2JqX3JlcSk7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJd2hpbGUgKG9ial9yZXEtPnN0YXRlID09IFdBSVRJTkcpIHsKKwkJc3RlcF9hY3RpdmVfc2xvdHMoKTsKKwl9CisjZWxzZQorCXN0YXJ0X29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworI2VuZGlmCisKKwl3aGlsZSAob2JqX3JlcS0+c3RhdGUgPT0gQUNUSVZFKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChvYmpfcmVxLT5zbG90KTsKKwl9CisJaWYgKG9ial9yZXEtPmxvY2FsICE9IC0xKSB7CisJCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsgb2JqX3JlcS0+bG9jYWwgPSAtMTsKKwl9CisKKwlpZiAob2JqX3JlcS0+c3RhdGUgPT0gQUJPUlRFRCkgeworCQlyZXQgPSBlcnJvcigiUmVxdWVzdCBmb3IgJXMgYWJvcnRlZCIsIGhleCk7CisJfSBlbHNlIGlmIChvYmpfcmVxLT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSyAmJgorCQkgICBvYmpfcmVxLT5odHRwX2NvZGUgIT0gNDE2KSB7CisJCWlmIChvYmpfcmVxLT5odHRwX2NvZGUgPT0gNDA0IHx8CisJCSAgICBvYmpfcmVxLT5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9GSUxFX0NPVUxETlRfUkVBRF9GSUxFKQorCQkJcmV0ID0gLTE7IC8qIEJlIHNpbGVudCwgaXQgaXMgcHJvYmFibHkgaW4gYSBwYWNrLiAqLworCQllbHNlCisJCQlyZXQgPSBlcnJvcigiJXMgKGN1cmxfcmVzdWx0ID0gJWQsIGh0dHBfY29kZSA9ICVsZCwgc2hhMSA9ICVzKSIsCisJCQkJICAgIG9ial9yZXEtPmVycm9yc3RyLCBvYmpfcmVxLT5jdXJsX3Jlc3VsdCwKKwkJCQkgICAgb2JqX3JlcS0+aHR0cF9jb2RlLCBoZXgpOworCX0gZWxzZSBpZiAob2JqX3JlcS0+enJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJY29ycnVwdF9vYmplY3RfZm91bmQrKzsKKwkJcmV0ID0gZXJyb3IoIkZpbGUgJXMgKCVzKSBjb3JydXB0IiwgaGV4LCBvYmpfcmVxLT51cmwpOworCX0gZWxzZSBpZiAobWVtY21wKG9ial9yZXEtPnNoYTEsIG9ial9yZXEtPnJlYWxfc2hhMSwgMjApKSB7CisJCXJldCA9IGVycm9yKCJGaWxlICVzIGhhcyBiYWQgaGFzaCIsIGhleCk7CisJfSBlbHNlIGlmIChvYmpfcmVxLT5yZW5hbWUgPCAwKSB7CisJCXJldCA9IGVycm9yKCJ1bmFibGUgdG8gd3JpdGUgc2hhMSBmaWxlbmFtZSAlcyIsCisJCQkgICAgb2JqX3JlcS0+ZmlsZW5hbWUpOworCX0KKworCXJlbGVhc2Vfb2JqZWN0X3JlcXVlc3Qob2JqX3JlcSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGFsdF9iYXNlICphbHRiYXNlID0gYWx0OworCisJaWYgKCFmZXRjaF9vYmplY3QoYWx0YmFzZSwgc2hhMSkpCisJCXJldHVybiAwOworCXdoaWxlIChhbHRiYXNlKSB7CisJCWlmICghZmV0Y2hfcGFjayhhbHRiYXNlLCBzaGExKSkKKwkJCXJldHVybiAwOworCQlmZXRjaF9hbHRlcm5hdGVzKGFsdC0+YmFzZSk7CisJCWFsdGJhc2UgPSBhbHRiYXNlLT5uZXh0OworCX0KKwlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBmaW5kICVzIHVuZGVyICVzIiwgc2hhMV90b19oZXgoc2hhMSksCisJCSAgICAgYWx0LT5iYXNlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmVlZHNfcXVvdGUoaW50IGNoKQoreworCXN3aXRjaCAoY2gpIHsKKwljYXNlICcvJzogY2FzZSAnLSc6IGNhc2UgJy4nOgorCWNhc2UgJ0EnLi4uJ1onOgljYXNlICdhJy4uLid6JzoJY2FzZSAnMCcuLi4nOSc6CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaGV4KGludCB2KQoreworCWlmICh2IDwgMTApIHJldHVybiAnMCcgKyB2OworCWVsc2UgcmV0dXJuICdBJyArIHYgLSAxMDsKK30KKworc3RhdGljIGNoYXIgKnF1b3RlX3JlZl91cmwoY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcmVmKQoreworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKmRwLCAqcXJlZjsKKwlpbnQgbGVuLCBiYXNlbGVuLCBjaDsKKworCWJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJbGVuID0gYmFzZWxlbiArIDY7IC8qICJyZWZzLyIgKyBOVUwgKi8KKwlmb3IgKGNwID0gcmVmOyAoY2ggPSAqY3ApICE9IDA7IGNwKyssIGxlbisrKQorCQlpZiAobmVlZHNfcXVvdGUoY2gpKQorCQkJbGVuICs9IDI7IC8qIGV4dHJhIHR3byBoZXggcGx1cyByZXBsYWNlbWVudCAlICovCisJcXJlZiA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkocXJlZiwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KHFyZWYgKyBiYXNlbGVuLCAicmVmcy8iLCA1KTsKKwlmb3IgKGNwID0gcmVmLCBkcCA9IHFyZWYgKyBiYXNlbGVuICsgNTsgKGNoID0gKmNwKSAhPSAwOyBjcCsrKSB7CisJCWlmIChuZWVkc19xdW90ZShjaCkpIHsKKwkJCSpkcCsrID0gJyUnOworCQkJKmRwKysgPSBoZXgoKGNoID4+IDQpICYgMHhGKTsKKwkJCSpkcCsrID0gaGV4KGNoICYgMHhGKTsKKwkJfQorCQllbHNlCisJCQkqZHArKyA9IGNoOworCX0KKwkqZHAgPSAwOworCisJcmV0dXJuIHFyZWY7Cit9CisKK2ludCBmZXRjaF9yZWYoY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworICAgICAgICBjaGFyICp1cmw7CisgICAgICAgIGNoYXIgaGV4WzQyXTsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJY2hhciAqYmFzZSA9IGFsdC0+YmFzZTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisgICAgICAgIGJ1ZmZlci5zaXplID0gNDE7CisgICAgICAgIGJ1ZmZlci5wb3NuID0gMDsKKyAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IGhleDsKKyAgICAgICAgaGV4WzQxXSA9ICdcMCc7CisKKwl1cmwgPSBxdW90ZV9yZWZfdXJsKGJhc2UsIHJlZik7CisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKQorCQkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBnZXQgJXMgZm9yICVzXG4lcyIsCisJCQkJICAgICB1cmwsIHJlZiwgY3VybF9lcnJvcnN0cik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCX0KKworICAgICAgICBoZXhbNDBdID0gJ1wwJzsKKyAgICAgICAgZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSk7CisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqY29tbWl0X2lkOworCWNoYXIgKnVybDsKKwljaGFyICpwYXRoOworCWludCBhcmcgPSAxOworCWludCByYyA9IDA7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworCQlpZiAoYXJndlthcmddWzFdID09ICd0JykgeworCQkJZ2V0X3RyZWUgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYycpIHsKKwkJCWdldF9oaXN0b3J5ID0gMTsKKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2EnKSB7CisJCQlnZXRfYWxsID0gMTsKKwkJCWdldF90cmVlID0gMTsKKwkJCWdldF9oaXN0b3J5ID0gMTsKKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3YnKSB7CisJCQlnZXRfdmVyYm9zZWx5ID0gMTsKKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3cnKSB7CisJCQl3cml0ZV9yZWYgPSBhcmd2W2FyZyArIDFdOworCQkJYXJnKys7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworCQkJZ2V0X3JlY292ZXIgPSAxOworCQl9CisJCWFyZysrOworCX0KKwlpZiAoYXJnYyA8IGFyZyArIDIpIHsKKwkJdXNhZ2UoImdpdC1odHRwLWZldGNoIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLS1yZWNvdmVyXSBbLXcgcmVmXSBjb21taXQtaWQgdXJsIik7CisJCXJldHVybiAxOworCX0KKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisJdXJsID0gYXJndlthcmcgKyAxXTsKKwl3cml0ZV9yZWZfbG9nX2RldGFpbHMgPSB1cmw7CisKKwlodHRwX2luaXQoKTsKKworCW5vX3ByYWdtYV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChub19wcmFnbWFfaGVhZGVyLCAiUHJhZ21hOiIpOworCisJYWx0ID0geG1hbGxvYyhzaXplb2YoKmFsdCkpOworCWFsdC0+YmFzZSA9IHVybDsKKwlhbHQtPmdvdF9pbmRpY2VzID0gMDsKKwlhbHQtPnBhY2tzID0gTlVMTDsKKwlhbHQtPm5leHQgPSBOVUxMOworCXBhdGggPSBzdHJzdHIodXJsLCAiLy8iKTsKKwlpZiAocGF0aCkgeworCQlwYXRoID0gc3RyY2hyKHBhdGgrMiwgJy8nKTsKKwkJaWYgKHBhdGgpCisJCQlhbHQtPnBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCX0KKworCWlmIChwdWxsKGNvbW1pdF9pZCkpCisJCXJjID0gMTsKKworCWh0dHBfY2xlYW51cCgpOworCisJY3VybF9zbGlzdF9mcmVlX2FsbChub19wcmFnbWFfaGVhZGVyKTsKKworCWlmIChjb3JydXB0X29iamVjdF9mb3VuZCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKyJTb21lIGxvb3NlIG9iamVjdCB3ZXJlIGZvdW5kIHRvIGJlIGNvcnJ1cHQsIGJ1dCB0aGV5IG1pZ2h0IGJlIGp1c3RcbiIKKyJhIGZhbHNlICc0MDQgTm90IEZvdW5kJyBlcnJvciBtZXNzYWdlIHNlbnQgd2l0aCBpbmNvcnJlY3QgSFRUUFxuIgorInN0YXR1cyBjb2RlLiAgU3VnZ2VzdCBydW5uaW5nIGdpdCBmc2NrLW9iamVjdHMuXG4iKTsKKwl9CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvaHR0cC1wdXNoLmMgYi9odHRwLXB1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzliMzZiCi0tLSAvZGV2L251bGwKKysrIGIvaHR0cC1wdXNoLmMKQEAgLTAsMCArMSwyNTgwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiaHR0cC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCisjaW5jbHVkZSA8ZXhwYXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgaHR0cF9wdXNoX3VzYWdlW10gPQorImdpdC1odHRwLXB1c2ggWy0tYWxsXSBbLS1mb3JjZV0gWy0tdmVyYm9zZV0gPHJlbW90ZT4gWzxoZWFkPi4uLl1cbiI7CisKKyNpZm5kZWYgWE1MX1NUQVRVU19PSworZW51bSBYTUxfU3RhdHVzIHsKKyAgWE1MX1NUQVRVU19PSyA9IDEsCisgIFhNTF9TVEFUVVNfRVJST1IgPSAwCit9OworI2RlZmluZSBYTUxfU1RBVFVTX09LICAgIDEKKyNkZWZpbmUgWE1MX1NUQVRVU19FUlJPUiAwCisjZW5kaWYKKworI2RlZmluZSBQUkVWX0JVRl9TSVpFIDQwOTYKKyNkZWZpbmUgUkFOR0VfSEVBREVSX1NJWkUgMzAKKworLyogREFWIG1ldGhvZHMgKi8KKyNkZWZpbmUgREFWX0xPQ0sgIkxPQ0siCisjZGVmaW5lIERBVl9NS0NPTCAiTUtDT0wiCisjZGVmaW5lIERBVl9NT1ZFICJNT1ZFIgorI2RlZmluZSBEQVZfUFJPUEZJTkQgIlBST1BGSU5EIgorI2RlZmluZSBEQVZfUFVUICJQVVQiCisjZGVmaW5lIERBVl9VTkxPQ0sgIlVOTE9DSyIKKyNkZWZpbmUgREFWX0RFTEVURSAiREVMRVRFIgorCisvKiBEQVYgbG9jayBmbGFncyAqLworI2RlZmluZSBEQVZfUFJPUF9MT0NLV1IgKDF1IDw8IDApCisjZGVmaW5lIERBVl9QUk9QX0xPQ0tFWCAoMXUgPDwgMSkKKyNkZWZpbmUgREFWX0xPQ0tfT0sgKDF1IDw8IDIpCisKKy8qIERBViBYTUwgcHJvcGVydGllcyAqLworI2RlZmluZSBEQVZfQ1RYX0xPQ0tFTlRSWSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3Auc3VwcG9ydGVkbG9jay5sb2NrZW50cnkiCisjZGVmaW5lIERBVl9DVFhfTE9DS1RZUEVfV1JJVEUgIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5wcm9wc3RhdC5wcm9wLnN1cHBvcnRlZGxvY2subG9ja2VudHJ5LmxvY2t0eXBlLndyaXRlIgorI2RlZmluZSBEQVZfQ1RYX0xPQ0tUWVBFX0VYQ0xVU0lWRSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3Auc3VwcG9ydGVkbG9jay5sb2NrZW50cnkubG9ja3Njb3BlLmV4Y2x1c2l2ZSIKKyNkZWZpbmUgREFWX0FDVElWRUxPQ0tfT1dORVIgIi5wcm9wLmxvY2tkaXNjb3ZlcnkuYWN0aXZlbG9jay5vd25lci5ocmVmIgorI2RlZmluZSBEQVZfQUNUSVZFTE9DS19USU1FT1VUICIucHJvcC5sb2NrZGlzY292ZXJ5LmFjdGl2ZWxvY2sudGltZW91dCIKKyNkZWZpbmUgREFWX0FDVElWRUxPQ0tfVE9LRU4gIi5wcm9wLmxvY2tkaXNjb3ZlcnkuYWN0aXZlbG9jay5sb2NrdG9rZW4uaHJlZiIKKyNkZWZpbmUgREFWX1BST1BGSU5EX1JFU1AgIi5tdWx0aXN0YXR1cy5yZXNwb25zZSIKKyNkZWZpbmUgREFWX1BST1BGSU5EX05BTUUgIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5ocmVmIgorI2RlZmluZSBEQVZfUFJPUEZJTkRfQ09MTEVDVElPTiAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3AucmVzb3VyY2V0eXBlLmNvbGxlY3Rpb24iCisKKy8qIERBViByZXF1ZXN0IGJvZHkgdGVtcGxhdGVzICovCisjZGVmaW5lIFBST1BGSU5EX1NVUFBPUlRFRExPQ0tfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6cHJvcGZpbmQgeG1sbnM6RD1cIkRBVjpcIj5cbjxEOnByb3AgeG1sbnM6Uj1cIiVzXCI+XG48RDpzdXBwb3J0ZWRsb2NrLz5cbjwvRDpwcm9wPlxuPC9EOnByb3BmaW5kPiIKKyNkZWZpbmUgUFJPUEZJTkRfQUxMX1JFUVVFU1QgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCIgPz5cbjxEOnByb3BmaW5kIHhtbG5zOkQ9XCJEQVY6XCI+XG48RDphbGxwcm9wLz5cbjwvRDpwcm9wZmluZD4iCisjZGVmaW5lIExPQ0tfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6bG9ja2luZm8geG1sbnM6RD1cIkRBVjpcIj5cbjxEOmxvY2tzY29wZT48RDpleGNsdXNpdmUvPjwvRDpsb2Nrc2NvcGU+XG48RDpsb2NrdHlwZT48RDp3cml0ZS8+PC9EOmxvY2t0eXBlPlxuPEQ6b3duZXI+XG48RDpocmVmPm1haWx0bzolczwvRDpocmVmPlxuPC9EOm93bmVyPlxuPC9EOmxvY2tpbmZvPiIKKworI2RlZmluZSBMT0NLX1RJTUUgNjAwCisjZGVmaW5lIExPQ0tfUkVGUkVTSCAzMAorCisvKiBiaXRzICMwLTE1IGluIHJldmlzaW9uLmggKi8KKworI2RlZmluZSBMT0NBTCAgICAoMXU8PDE2KQorI2RlZmluZSBSRU1PVEUgICAoMXU8PDE3KQorI2RlZmluZSBGRVRDSElORyAoMXU8PDE4KQorI2RlZmluZSBQVVNISU5HICAoMXU8PDE5KQorCisvKiBXZSBhbGxvdyAicmVjdXJzaXZlIiBzeW1ib2xpYyByZWZzLiBPbmx5IHdpdGhpbiByZWFzb24sIHRob3VnaCAqLworI2RlZmluZSBNQVhERVBUSCA1CisKK3N0YXRpYyBpbnQgcHVzaGluZyA9IDA7CitzdGF0aWMgaW50IGFib3J0ZWQgPSAwOworc3RhdGljIHNpZ25lZCBjaGFyIHJlbW90ZV9kaXJfZXhpc3RzWzI1Nl07CisKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqbm9fcHJhZ21hX2hlYWRlcjsKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqZGVmYXVsdF9oZWFkZXJzOworCitzdGF0aWMgaW50IHB1c2hfdmVyYm9zZWx5ID0gMDsKK3N0YXRpYyBpbnQgcHVzaF9hbGwgPSAwOworc3RhdGljIGludCBmb3JjZV9hbGwgPSAwOworCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICpvYmplY3RzID0gTlVMTDsKKworc3RydWN0IHJlcG8KK3sKKwljaGFyICp1cmw7CisJaW50IHBhdGhfbGVuOworCWludCBoYXNfaW5mb19yZWZzOworCWludCBjYW5fdXBkYXRlX2luZm9fcmVmczsKKwlpbnQgaGFzX2luZm9fcGFja3M7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2tzOworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9ja3M7Cit9OworCitzdGF0aWMgc3RydWN0IHJlcG8gKnJlbW90ZSA9IE5VTEw7CisKK2VudW0gdHJhbnNmZXJfc3RhdGUgeworCU5FRURfRkVUQ0gsCisJUlVOX0ZFVENIX0xPT1NFLAorCVJVTl9GRVRDSF9QQUNLRUQsCisJTkVFRF9QVVNILAorCVJVTl9NS0NPTCwKKwlSVU5fUFVULAorCVJVTl9NT1ZFLAorCUFCT1JURUQsCisJQ09NUExFVEUsCit9OworCitzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdAoreworCXN0cnVjdCBvYmplY3QgKm9iajsKKwljaGFyICp1cmw7CisJY2hhciAqZGVzdDsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2s7CisJc3RydWN0IGN1cmxfc2xpc3QgKmhlYWRlcnM7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwlpbnQgbG9jYWxfZmlsZW5vOworCUZJTEUgKmxvY2FsX3N0cmVhbTsKKwllbnVtIHRyYW5zZmVyX3N0YXRlIHN0YXRlOworCUNVUkxjb2RlIGN1cmxfcmVzdWx0OworCWNoYXIgZXJyb3JzdHJbQ1VSTF9FUlJPUl9TSVpFXTsKKwlsb25nIGh0dHBfY29kZTsKKwl1bnNpZ25lZCBjaGFyIHJlYWxfc2hhMVsyMF07CisJU0hBX0NUWCBjOworCXpfc3RyZWFtIHN0cmVhbTsKKwlpbnQgenJldDsKKwlpbnQgcmVuYW1lOworCXZvaWQgKnVzZXJEYXRhOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0X3F1ZXVlX2hlYWQgPSBOVUxMOworCitzdHJ1Y3QgeG1sX2N0eAoreworCWNoYXIgKm5hbWU7CisJaW50IGxlbjsKKwljaGFyICpjZGF0YTsKKwl2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCB4bWxfY3R4ICpjdHgsIGludCB0YWdfY2xvc2VkKTsKKwl2b2lkICp1c2VyRGF0YTsKK307CisKK3N0cnVjdCByZW1vdGVfbG9jaworeworCWNoYXIgKnVybDsKKwljaGFyICpvd25lcjsKKwljaGFyICp0b2tlbjsKKwl0aW1lX3Qgc3RhcnRfdGltZTsKKwlsb25nIHRpbWVvdXQ7CisJaW50IHJlZnJlc2hpbmc7CisJc3RydWN0IHJlbW90ZV9sb2NrICpuZXh0OworfTsKKworLyogRmxhZ3MgdGhhdCBjb250cm9sIHJlbW90ZV9scyBwcm9jZXNzaW5nICovCisjZGVmaW5lIFBST0NFU1NfRklMRVMgKDF1IDw8IDApCisjZGVmaW5lIFBST0NFU1NfRElSUyAgKDF1IDw8IDEpCisjZGVmaW5lIFJFQ1VSU0lWRSAgICAgKDF1IDw8IDIpCisKKy8qIEZsYWdzIHRoYXQgcmVtb3RlX2xzIHBhc3NlcyB0byBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgSVNfRElSICgxdSA8PCAwKQorCitzdHJ1Y3QgcmVtb3RlX2xzX2N0eAoreworCWNoYXIgKnBhdGg7CisJdm9pZCAoKnVzZXJGdW5jKShzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpOworCXZvaWQgKnVzZXJEYXRhOworCWludCBmbGFnczsKKwljaGFyICpkZW50cnlfbmFtZTsKKwlpbnQgZGVudHJ5X2ZsYWdzOworCXN0cnVjdCByZW1vdGVfbHNfY3R4ICpwYXJlbnQ7Cit9OworCitzdGF0aWMgdm9pZCBmaW5pc2hfcmVxdWVzdChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCk7CitzdGF0aWMgdm9pZCByZWxlYXNlX3JlcXVlc3Qoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Jlc3BvbnNlKHZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QgPQorCQkoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKiljYWxsYmFja19kYXRhOworCisJZmluaXNoX3JlcXVlc3QocmVxdWVzdCk7Cit9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorc3RhdGljIHNpemVfdCBmd3JpdGVfc2hhMV9maWxlKHZvaWQgKnB0ciwgc2l6ZV90IGVsdHNpemUsIHNpemVfdCBubWVtYiwKKwkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgZXhwbls0MDk2XTsKKwlzaXplX3Qgc2l6ZSA9IGVsdHNpemUgKiBubWVtYjsKKwlpbnQgcG9zbiA9IDA7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QgPSAoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKilkYXRhOworCWRvIHsKKwkJc3NpemVfdCByZXR2YWwgPSB3cml0ZShyZXF1ZXN0LT5sb2NhbF9maWxlbm8sCisJCQkJICAgICAgIHB0ciArIHBvc24sIHNpemUgLSBwb3NuKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcG9zbjsKKwkJcG9zbiArPSByZXR2YWw7CisJfSB3aGlsZSAocG9zbiA8IHNpemUpOworCisJcmVxdWVzdC0+c3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwlyZXF1ZXN0LT5zdHJlYW0ubmV4dF9pbiA9IHB0cjsKKwlkbyB7CisJCXJlcXVlc3QtPnN0cmVhbS5uZXh0X291dCA9IGV4cG47CisJCXJlcXVlc3QtPnN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZXhwbik7CisJCXJlcXVlc3QtPnpyZXQgPSBpbmZsYXRlKCZyZXF1ZXN0LT5zdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisJCVNIQTFfVXBkYXRlKCZyZXF1ZXN0LT5jLCBleHBuLAorCQkJICAgIHNpemVvZihleHBuKSAtIHJlcXVlc3QtPnN0cmVhbS5hdmFpbF9vdXQpOworCX0gd2hpbGUgKHJlcXVlc3QtPnN0cmVhbS5hdmFpbF9pbiAmJiByZXF1ZXN0LT56cmV0ID09IFpfT0spOworCWRhdGFfcmVjZWl2ZWQrKzsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZmV0Y2hfbG9vc2Uoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKTsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyIHByZXZmaWxlW1BBVEhfTUFYXTsKKwljaGFyICp1cmw7CisJY2hhciAqcG9zbjsKKwlpbnQgcHJldmxvY2FsOworCXVuc2lnbmVkIGNoYXIgcHJldl9idWZbUFJFVl9CVUZfU0laRV07CisJc3NpemVfdCBwcmV2X3JlYWQgPSAwOworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKworCWZpbGVuYW1lID0gc2hhMV9maWxlX25hbWUocmVxdWVzdC0+b2JqLT5zaGExKTsKKwlzbnByaW50ZihyZXF1ZXN0LT5maWxlbmFtZSwgc2l6ZW9mKHJlcXVlc3QtPmZpbGVuYW1lKSwgIiVzIiwgZmlsZW5hbWUpOworCXNucHJpbnRmKHJlcXVlc3QtPnRtcGZpbGUsIHNpemVvZihyZXF1ZXN0LT50bXBmaWxlKSwKKwkJICIlcy50ZW1wIiwgZmlsZW5hbWUpOworCisJc25wcmludGYocHJldmZpbGUsIHNpemVvZihwcmV2ZmlsZSksICIlcy5wcmV2IiwgcmVxdWVzdC0+ZmlsZW5hbWUpOworCXVubGluayhwcmV2ZmlsZSk7CisJcmVuYW1lKHJlcXVlc3QtPnRtcGZpbGUsIHByZXZmaWxlKTsKKwl1bmxpbmsocmVxdWVzdC0+dG1wZmlsZSk7CisKKwlpZiAocmVxdWVzdC0+bG9jYWxfZmlsZW5vICE9IC0xKQorCQllcnJvcigiZmQgbGVha2FnZSBpbiBzdGFydDogJWQiLCByZXF1ZXN0LT5sb2NhbF9maWxlbm8pOworCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IG9wZW4ocmVxdWVzdC0+dG1wZmlsZSwKKwkJCQkgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJLyogVGhpcyBjb3VsZCBoYXZlIGZhaWxlZCBkdWUgdG8gdGhlICJsYXp5IGRpcmVjdG9yeSBjcmVhdGlvbiI7CisJICogdHJ5IHRvIG1rZGlyIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LgorCSAqLworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gPCAwICYmIGVycm5vID09IEVOT0VOVCkgeworCQljaGFyICpkaXIgPSBzdHJyY2hyKHJlcXVlc3QtPnRtcGZpbGUsICcvJyk7CisJCWlmIChkaXIpIHsKKwkJCSpkaXIgPSAwOworCQkJbWtkaXIocmVxdWVzdC0+dG1wZmlsZSwgMDc3Nyk7CisJCQkqZGlyID0gJy8nOworCQl9CisJCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IG9wZW4ocmVxdWVzdC0+dG1wZmlsZSwKKwkJCQkJICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NjYpOworCX0KKworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gPCAwKSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSAlcyBmb3IgJXM6ICVzIiwKKwkJICAgICAgcmVxdWVzdC0+dG1wZmlsZSwgcmVxdWVzdC0+ZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoJnJlcXVlc3QtPnN0cmVhbSwgMCwgc2l6ZW9mKHJlcXVlc3QtPnN0cmVhbSkpOworCisJaW5mbGF0ZUluaXQoJnJlcXVlc3QtPnN0cmVhbSk7CisKKwlTSEExX0luaXQoJnJlcXVlc3QtPmMpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgNTApOworCXJlcXVlc3QtPnVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIDUwKTsKKwlzdHJjcHkodXJsLCByZW1vdGUtPnVybCk7CisJcG9zbiA9IHVybCArIHN0cmxlbihyZW1vdGUtPnVybCk7CisJc3RyY3B5KHBvc24sICJvYmplY3RzLyIpOworCXBvc24gKz0gODsKKwltZW1jcHkocG9zbiwgaGV4LCAyKTsKKwlwb3NuICs9IDI7CisJKihwb3NuKyspID0gJy8nOworCXN0cmNweShwb3NuLCBoZXggKyAyKTsKKwlzdHJjcHkocmVxdWVzdC0+dXJsLCB1cmwpOworCisJLyogSWYgYSBwcmV2aW91cyB0ZW1wIGZpbGUgaXMgcHJlc2VudCwgcHJvY2VzcyB3aGF0IHdhcyBhbHJlYWR5CisJICAgZmV0Y2hlZC4gKi8KKwlwcmV2bG9jYWwgPSBvcGVuKHByZXZmaWxlLCBPX1JET05MWSk7CisJaWYgKHByZXZsb2NhbCAhPSAtMSkgeworCQlkbyB7CisJCQlwcmV2X3JlYWQgPSByZWFkKHByZXZsb2NhbCwgcHJldl9idWYsIFBSRVZfQlVGX1NJWkUpOworCQkJaWYgKHByZXZfcmVhZD4wKSB7CisJCQkJaWYgKGZ3cml0ZV9zaGExX2ZpbGUocHJldl9idWYsCisJCQkJCQkgICAgIDEsCisJCQkJCQkgICAgIHByZXZfcmVhZCwKKwkJCQkJCSAgICAgcmVxdWVzdCkgPT0gcHJldl9yZWFkKSB7CisJCQkJCXByZXZfcG9zbiArPSBwcmV2X3JlYWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJldl9yZWFkID0gLTE7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChwcmV2X3JlYWQgPiAwKTsKKwkJY2xvc2UocHJldmxvY2FsKTsKKwl9CisJdW5saW5rKHByZXZmaWxlKTsKKworCS8qIFJlc2V0IGluZmxhdGUvU0hBMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgcHJldmlvdXMgdGVtcAorCSAgIGZpbGU7IGFsc28gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvY2FsIGZpbGUuICovCisJaWYgKHByZXZfcmVhZCA9PSAtMSkgeworCQltZW1zZXQoJnJlcXVlc3QtPnN0cmVhbSwgMCwgc2l6ZW9mKHJlcXVlc3QtPnN0cmVhbSkpOworCQlpbmZsYXRlSW5pdCgmcmVxdWVzdC0+c3RyZWFtKTsKKwkJU0hBMV9Jbml0KCZyZXF1ZXN0LT5jKTsKKwkJaWYgKHByZXZfcG9zbj4wKSB7CisJCQlwcmV2X3Bvc24gPSAwOworCQkJbHNlZWsocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCBTRUVLX1NFVCwgMCk7CisJCQlmdHJ1bmNhdGUocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCAwKTsKKwkJfQorCX0KKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCByZXF1ZXN0KTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX3NoYTFfZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0VSUk9SQlVGRkVSLCByZXF1ZXN0LT5lcnJvcnN0cik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisKKwkvKiBJZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgZGF0YSBmcm9tIGEgcHJldmlvdXMgZmV0Y2gKKwkgICBhdHRlbXB0LCBvbmx5IGZldGNoIHRoZSBkYXRhIHdlIGRvbid0IGFscmVhZHkgaGF2ZS4gKi8KKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIG9iamVjdCAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsCisJCQkJIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwkvKiBUcnkgdG8gZ2V0IHRoZSByZXF1ZXN0IHN0YXJ0ZWQsIGFib3J0IHRoZSByZXF1ZXN0IG9uIGVycm9yICovCisJcmVxdWVzdC0+c3RhdGUgPSBSVU5fRkVUQ0hfTE9PU0U7CisJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBHRVQgcmVxdWVzdFxuIik7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9ta2NvbChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCWNoYXIgKnBvc247CisKKwlyZXF1ZXN0LT51cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyAxMyk7CisJc3RyY3B5KHJlcXVlc3QtPnVybCwgcmVtb3RlLT51cmwpOworCXBvc24gPSByZXF1ZXN0LT51cmwgKyBzdHJsZW4ocmVtb3RlLT51cmwpOworCXN0cmNweShwb3NuLCAib2JqZWN0cy8iKTsKKwlwb3NuICs9IDg7CisJbWVtY3B5KHBvc24sIGhleCwgMik7CisJcG9zbiArPSAyOworCXN0cmNweShwb3NuLCAiLyIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSByZXF1ZXN0OworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsgLyogdW5kbyBQVVQgc2V0dXAgKi8KKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCByZXF1ZXN0LT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9FUlJPUkJVRkZFUiwgcmVxdWVzdC0+ZXJyb3JzdHIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTUtDT0wpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJCXJlcXVlc3QtPnN0YXRlID0gUlVOX01LQ09MOworCX0gZWxzZSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzdGFydF9mZXRjaF9wYWNrZWQoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJRklMRSAqcGFja2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKmNoZWNrX3JlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisKKwl0YXJnZXQgPSBmaW5kX3NoYTFfcGFjayhyZXF1ZXN0LT5vYmotPnNoYTEsIHJlbW90ZS0+cGFja3MpOworCWlmICghdGFyZ2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZldGNoICVzLCB3aWxsIG5vdCBiZSBhYmxlIHRvIHVwZGF0ZSBzZXJ2ZXIgaW5mbyByZWZzXG4iLCBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpKTsKKwkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwkJcmV0dXJuOworCX0KKworCWZwcmludGYoc3RkZXJyLAkiRmV0Y2hpbmcgcGFjayAlc1xuIiwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJZnByaW50ZihzdGRlcnIsICIgd2hpY2ggY29udGFpbnMgJXNcbiIsIHNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSkpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfbmFtZSh0YXJnZXQtPnNoYTEpOworCXNucHJpbnRmKHJlcXVlc3QtPmZpbGVuYW1lLCBzaXplb2YocmVxdWVzdC0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYocmVxdWVzdC0+dG1wZmlsZSwgc2l6ZW9mKHJlcXVlc3QtPnRtcGZpbGUpLAorCQkgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA2NCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvcGFjay9wYWNrLSVzLnBhY2siLAorCQlyZW1vdGUtPnVybCwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXNuJ3QgYW5vdGhlciBvcGVuIHJlcXVlc3QgZm9yIHRoaXMgcGFjayAqLworCXdoaWxlIChjaGVja19yZXF1ZXN0KSB7CisJCWlmIChjaGVja19yZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fRkVUQ0hfUEFDS0VEICYmCisJCSAgICAhc3RyY21wKGNoZWNrX3JlcXVlc3QtPnVybCwgdXJsKSkgeworCQkJZnJlZSh1cmwpOworCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQkJcmV0dXJuOworCQl9CisJCWNoZWNrX3JlcXVlc3QgPSBjaGVja19yZXF1ZXN0LT5uZXh0OworCX0KKworCXBhY2tmaWxlID0gZm9wZW4ocmVxdWVzdC0+dG1wZmlsZSwgImEiKTsKKwlpZiAoIXBhY2tmaWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayIsCisJCQlmaWxlbmFtZSk7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlmcmVlKHVybCk7CisJCXJldHVybjsKKwl9CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfcmVzcG9uc2U7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9IHJlcXVlc3Q7CisJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJcmVxdWVzdC0+bG9jYWxfc3RyZWFtID0gcGFja2ZpbGU7CisJcmVxdWVzdC0+dXNlckRhdGEgPSB0YXJnZXQ7CisKKwlyZXF1ZXN0LT51cmwgPSB1cmw7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIHBhY2tmaWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKwlzbG90LT5sb2NhbCA9IHBhY2tmaWxlOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSBwcmVzZW50IGZyb20gYSBwcmV2aW91cyB0cmFuc2ZlciBhdHRlbXB0LAorCSAgIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiAqLworCXByZXZfcG9zbiA9IGZ0ZWxsKHBhY2tmaWxlKTsKKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIHBhY2sgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCS8qIFRyeSB0byBnZXQgdGhlIHJlcXVlc3Qgc3RhcnRlZCwgYWJvcnQgdGhlIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlyZXF1ZXN0LT5zdGF0ZSA9IFJVTl9GRVRDSF9QQUNLRUQ7CisJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBHRVQgcmVxdWVzdFxuIik7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wdXQoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwljaGFyICpwb3NuOworCWNoYXIgdHlwZVsyMF07CisJY2hhciBoZHJbNTBdOworCXZvaWQgKnVucGFja2VkOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWludCBoZHJsZW47CisJc3NpemVfdCBzaXplOworCXpfc3RyZWFtIHN0cmVhbTsKKworCXVucGFja2VkID0gcmVhZF9zaGExX2ZpbGUocmVxdWVzdC0+b2JqLT5zaGExLCB0eXBlLCAmbGVuKTsKKwloZHJsZW4gPSBzcHJpbnRmKGhkciwgIiVzICVsdSIsIHR5cGUsIGxlbikgKyAxOworCisJLyogU2V0IGl0IHVwICovCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04pOworCXNpemUgPSBkZWZsYXRlQm91bmQoJnN0cmVhbSwgbGVuICsgaGRybGVuKTsKKwlyZXF1ZXN0LT5idWZmZXIuYnVmZmVyID0geG1hbGxvYyhzaXplKTsKKworCS8qIENvbXByZXNzIGl0ICovCisJc3RyZWFtLm5leHRfb3V0ID0gcmVxdWVzdC0+YnVmZmVyLmJ1ZmZlcjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKworCS8qIEZpcnN0IGhlYWRlci4uICovCisJc3RyZWFtLm5leHRfaW4gPSAodm9pZCAqKWhkcjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBoZHJsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgMCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKworCS8qIFRoZW4gdGhlIGRhdGEgaXRzZWxmLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9IHVucGFja2VkOworCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKwlkZWZsYXRlRW5kKCZzdHJlYW0pOworCWZyZWUodW5wYWNrZWQpOworCisJcmVxdWVzdC0+YnVmZmVyLnNpemUgPSBzdHJlYW0udG90YWxfb3V0OworCXJlcXVlc3QtPmJ1ZmZlci5wb3NuID0gMDsKKworCXJlcXVlc3QtPnVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIAorCQkJICAgICAgIHN0cmxlbihyZXF1ZXN0LT5sb2NrLT50b2tlbikgKyA1MSk7CisJc3RyY3B5KHJlcXVlc3QtPnVybCwgcmVtb3RlLT51cmwpOworCXBvc24gPSByZXF1ZXN0LT51cmwgKyBzdHJsZW4ocmVtb3RlLT51cmwpOworCXN0cmNweShwb3NuLCAib2JqZWN0cy8iKTsKKwlwb3NuICs9IDg7CisJbWVtY3B5KHBvc24sIGhleCwgMik7CisJcG9zbiArPSAyOworCSoocG9zbisrKSA9ICcvJzsKKwlzdHJjcHkocG9zbiwgaGV4ICsgMik7CisJcmVxdWVzdC0+ZGVzdCA9IHhtYWxsb2Moc3RybGVuKHJlcXVlc3QtPnVybCkgKyAxNCk7CisJc3ByaW50ZihyZXF1ZXN0LT5kZXN0LCAiRGVzdGluYXRpb246ICVzIiwgcmVxdWVzdC0+dXJsKTsKKwlwb3NuICs9IDM4OworCSoocG9zbisrKSA9ICcuJzsKKwlzdHJjcHkocG9zbiwgcmVxdWVzdC0+bG9jay0+dG9rZW4pOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSByZXF1ZXN0OworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZyZXF1ZXN0LT5idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCByZXF1ZXN0LT5idWZmZXIuc2l6ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgZnJlYWRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfUFVUKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUFVULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfTk9CT0RZLCAwKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCByZXF1ZXN0LT51cmwpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJlcXVlc3QtPnNsb3QgPSBzbG90OworCQlyZXF1ZXN0LT5zdGF0ZSA9IFJVTl9QVVQ7CisJfSBlbHNlIHsKKwkJcmVxdWVzdC0+c3RhdGUgPSBBQk9SVEVEOworCQlmcmVlKHJlcXVlc3QtPnVybCk7CisJCXJlcXVlc3QtPnVybCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9tb3ZlKHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfcmVzcG9uc2U7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9IHJlcXVlc3Q7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOyAvKiB1bmRvIFBVVCBzZXR1cCAqLworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTU9WRSk7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgcmVxdWVzdC0+ZGVzdCk7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgIk92ZXJ3cml0ZTogVCIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCByZXF1ZXN0LT51cmwpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJlcXVlc3QtPnNsb3QgPSBzbG90OworCQlyZXF1ZXN0LT5zdGF0ZSA9IFJVTl9NT1ZFOworCX0gZWxzZSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCByZWZyZXNoX2xvY2soc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKwljaGFyICppZl9oZWFkZXI7CisJY2hhciB0aW1lb3V0X2hlYWRlclsyNV07CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCisJbG9jay0+cmVmcmVzaGluZyA9IDE7CisKKwlpZl9oZWFkZXIgPSB4bWFsbG9jKHN0cmxlbihsb2NrLT50b2tlbikgKyAyNSk7CisJc3ByaW50ZihpZl9oZWFkZXIsICJJZjogKDxvcGFxdWVsb2NrdG9rZW46JXM+KSIsIGxvY2stPnRva2VuKTsKKwlzcHJpbnRmKHRpbWVvdXRfaGVhZGVyLCAiVGltZW91dDogU2Vjb25kLSVsZCIsIGxvY2stPnRpbWVvdXQpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIGlmX2hlYWRlcik7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgdGltZW91dF9oZWFkZXIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEdFVCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCBsb2NrLT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTE9DSyk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkxPQ0sgSFRUUCBlcnJvciAlbGRcbiIsCisJCQkJcmVzdWx0cy5odHRwX2NvZGUpOworCQl9IGVsc2UgeworCQkJbG9jay0+c3RhcnRfdGltZSA9IHRpbWUoTlVMTCk7CisJCQlyYyA9IDE7CisJCX0KKwl9CisKKwlsb2NrLT5yZWZyZXNoaW5nID0gMDsKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdl9oZWFkZXJzKTsKKwlmcmVlKGlmX2hlYWRlcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2xvY2tzKHZvaWQpCit7CisJc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrID0gcmVtb3RlLT5sb2NrczsKKwl0aW1lX3QgY3VycmVudF90aW1lID0gdGltZShOVUxMKTsKKwlpbnQgdGltZV9yZW1haW5pbmc7CisKKwl3aGlsZSAobG9jaykgeworCQl0aW1lX3JlbWFpbmluZyA9IGxvY2stPnN0YXJ0X3RpbWUgKyBsb2NrLT50aW1lb3V0IC0KKwkJCWN1cnJlbnRfdGltZTsKKwkJaWYgKCFsb2NrLT5yZWZyZXNoaW5nICYmIHRpbWVfcmVtYWluaW5nIDwgTE9DS19SRUZSRVNIKSB7CisJCQlpZiAoIXJlZnJlc2hfbG9jayhsb2NrKSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiVW5hYmxlIHRvIHJlZnJlc2ggbG9jayBmb3IgJXNcbiIsCisJCQkJCWxvY2stPnVybCk7CisJCQkJYWJvcnRlZCA9IDE7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWxvY2sgPSBsb2NrLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICplbnRyeSA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKworCWlmIChyZXF1ZXN0ID09IHJlcXVlc3RfcXVldWVfaGVhZCkgeworCQlyZXF1ZXN0X3F1ZXVlX2hlYWQgPSByZXF1ZXN0LT5uZXh0OworCX0gZWxzZSB7CisJCXdoaWxlIChlbnRyeS0+bmV4dCAhPSBOVUxMICYmIGVudHJ5LT5uZXh0ICE9IHJlcXVlc3QpCisJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQlpZiAoZW50cnktPm5leHQgPT0gcmVxdWVzdCkKKwkJCWVudHJ5LT5uZXh0ID0gZW50cnktPm5leHQtPm5leHQ7CisJfQorCisJaWYgKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyAhPSAtMSkKKwkJY2xvc2UocmVxdWVzdC0+bG9jYWxfZmlsZW5vKTsKKwlpZiAocmVxdWVzdC0+bG9jYWxfc3RyZWFtKQorCQlmY2xvc2UocmVxdWVzdC0+bG9jYWxfc3RyZWFtKTsKKwlpZiAocmVxdWVzdC0+dXJsICE9IE5VTEwpCisJCWZyZWUocmVxdWVzdC0+dXJsKTsKKwlmcmVlKHJlcXVlc3QpOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfcmVxdWVzdChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqdGFyZ2V0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICoqbHN0OworCisJcmVxdWVzdC0+Y3VybF9yZXN1bHQgPSByZXF1ZXN0LT5zbG90LT5jdXJsX3Jlc3VsdDsKKwlyZXF1ZXN0LT5odHRwX2NvZGUgPSByZXF1ZXN0LT5zbG90LT5odHRwX2NvZGU7CisJcmVxdWVzdC0+c2xvdCA9IE5VTEw7CisKKwkvKiBLZWVwIGxvY2tzIGFjdGl2ZSAqLworCWNoZWNrX2xvY2tzKCk7CisKKwlpZiAocmVxdWVzdC0+aGVhZGVycyAhPSBOVUxMKQorCQljdXJsX3NsaXN0X2ZyZWVfYWxsKHJlcXVlc3QtPmhlYWRlcnMpOworCisJLyogVVJMIGlzIHJldXNlZCBmb3IgTU9WRSBhZnRlciBQVVQgKi8KKwlpZiAocmVxdWVzdC0+c3RhdGUgIT0gUlVOX1BVVCkgeworCQlmcmVlKHJlcXVlc3QtPnVybCk7CisJCXJlcXVlc3QtPnVybCA9IE5VTEw7CisJfQorCisJaWYgKHJlcXVlc3QtPnN0YXRlID09IFJVTl9NS0NPTCkgeworCQlpZiAocmVxdWVzdC0+Y3VybF9yZXN1bHQgPT0gQ1VSTEVfT0sgfHwKKwkJICAgIHJlcXVlc3QtPmh0dHBfY29kZSA9PSA0MDUpIHsKKwkJCXJlbW90ZV9kaXJfZXhpc3RzW3JlcXVlc3QtPm9iai0+c2hhMVswXV0gPSAxOworCQkJc3RhcnRfcHV0KHJlcXVlc3QpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJNS0NPTCAlcyBmYWlsZWQsIGFib3J0aW5nICglZC8lbGQpXG4iLAorCQkJCXNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSksCisJCQkJcmVxdWVzdC0+Y3VybF9yZXN1bHQsIHJlcXVlc3QtPmh0dHBfY29kZSk7CisJCQlyZXF1ZXN0LT5zdGF0ZSA9IEFCT1JURUQ7CisJCQlhYm9ydGVkID0gMTsKKwkJfQorCX0gZWxzZSBpZiAocmVxdWVzdC0+c3RhdGUgPT0gUlVOX1BVVCkgeworCQlpZiAocmVxdWVzdC0+Y3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCXN0YXJ0X21vdmUocmVxdWVzdCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwJIlBVVCAlcyBmYWlsZWQsIGFib3J0aW5nICglZC8lbGQpXG4iLAorCQkJCXNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSksCisJCQkJcmVxdWVzdC0+Y3VybF9yZXN1bHQsIHJlcXVlc3QtPmh0dHBfY29kZSk7CisJCQlyZXF1ZXN0LT5zdGF0ZSA9IEFCT1JURUQ7CisJCQlhYm9ydGVkID0gMTsKKwkJfQorCX0gZWxzZSBpZiAocmVxdWVzdC0+c3RhdGUgPT0gUlVOX01PVkUpIHsKKwkJaWYgKHJlcXVlc3QtPmN1cmxfcmVzdWx0ID09IENVUkxFX09LKSB7CisJCQlpZiAocHVzaF92ZXJib3NlbHkpCisJCQkJZnByaW50ZihzdGRlcnIsICIgICAgc2VudCAlc1xuIiwKKwkJCQkJc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKSk7CisJCQlyZXF1ZXN0LT5vYmotPmZsYWdzIHw9IFJFTU9URTsKKwkJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTU9WRSAlcyBmYWlsZWQsIGFib3J0aW5nICglZC8lbGQpXG4iLAorCQkJCXNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSksCisJCQkJcmVxdWVzdC0+Y3VybF9yZXN1bHQsIHJlcXVlc3QtPmh0dHBfY29kZSk7CisJCQlyZXF1ZXN0LT5zdGF0ZSA9IEFCT1JURUQ7CisJCQlhYm9ydGVkID0gMTsKKwkJfQorCX0gZWxzZSBpZiAocmVxdWVzdC0+c3RhdGUgPT0gUlVOX0ZFVENIX0xPT1NFKSB7CisJCWZjaG1vZChyZXF1ZXN0LT5sb2NhbF9maWxlbm8sIDA0NDQpOworCQljbG9zZShyZXF1ZXN0LT5sb2NhbF9maWxlbm8pOyByZXF1ZXN0LT5sb2NhbF9maWxlbm8gPSAtMTsKKworCQlpZiAocmVxdWVzdC0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0sgJiYKKwkJICAgIHJlcXVlc3QtPmh0dHBfY29kZSAhPSA0MTYpIHsKKwkJCWlmIChzdGF0KHJlcXVlc3QtPnRtcGZpbGUsICZzdCkgPT0gMCkgeworCQkJCWlmIChzdC5zdF9zaXplID09IDApCisJCQkJCXVubGluayhyZXF1ZXN0LT50bXBmaWxlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChyZXF1ZXN0LT5odHRwX2NvZGUgPT0gNDE2KQorCQkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogcmVxdWVzdGVkIHJhbmdlIGludmFsaWQ7IHdlIG1heSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBkYXRhLlxuIik7CisKKwkJCWluZmxhdGVFbmQoJnJlcXVlc3QtPnN0cmVhbSk7CisJCQlTSEExX0ZpbmFsKHJlcXVlc3QtPnJlYWxfc2hhMSwgJnJlcXVlc3QtPmMpOworCQkJaWYgKHJlcXVlc3QtPnpyZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisJCQkJdW5saW5rKHJlcXVlc3QtPnRtcGZpbGUpOworCQkJfSBlbHNlIGlmIChtZW1jbXAocmVxdWVzdC0+b2JqLT5zaGExLCByZXF1ZXN0LT5yZWFsX3NoYTEsIDIwKSkgeworCQkJCXVubGluayhyZXF1ZXN0LT50bXBmaWxlKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVxdWVzdC0+cmVuYW1lID0KKwkJCQkJbW92ZV90ZW1wX3RvX2ZpbGUoCisJCQkJCQlyZXF1ZXN0LT50bXBmaWxlLAorCQkJCQkJcmVxdWVzdC0+ZmlsZW5hbWUpOworCQkJCWlmIChyZXF1ZXN0LT5yZW5hbWUgPT0gMCkgeworCQkJCQlyZXF1ZXN0LT5vYmotPmZsYWdzIHw9IChMT0NBTCB8IFJFTU9URSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogVHJ5IGZldGNoaW5nIHBhY2tlZCBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKHJlcXVlc3QtPm9iai0+ZmxhZ3MgJiBMT0NBTCkKKwkJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwkJZWxzZQorCQkJc3RhcnRfZmV0Y2hfcGFja2VkKHJlcXVlc3QpOworCisJfSBlbHNlIGlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fRkVUQ0hfUEFDS0VEKSB7CisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZ2V0IHBhY2sgZmlsZSAlc1xuJXMiLAorCQkJCXJlcXVlc3QtPnVybCwgY3VybF9lcnJvcnN0cik7CisJCQlyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZjbG9zZShyZXF1ZXN0LT5sb2NhbF9zdHJlYW0pOworCQkJcmVxdWVzdC0+bG9jYWxfc3RyZWFtID0gTlVMTDsKKwkJCWlmICghbW92ZV90ZW1wX3RvX2ZpbGUocmVxdWVzdC0+dG1wZmlsZSwKKwkJCQkJICAgICAgIHJlcXVlc3QtPmZpbGVuYW1lKSkgeworCQkJCXRhcmdldCA9IChzdHJ1Y3QgcGFja2VkX2dpdCAqKXJlcXVlc3QtPnVzZXJEYXRhOworCQkJCWxzdCA9ICZyZW1vdGUtPnBhY2tzOworCQkJCXdoaWxlICgqbHN0ICE9IHRhcmdldCkKKwkJCQkJbHN0ID0gJigoKmxzdCktPm5leHQpOworCQkJCSpsc3QgPSAoKmxzdCktPm5leHQ7CisKKwkJCQlpZiAoIXZlcmlmeV9wYWNrKHRhcmdldCwgMCkpCisJCQkJCWluc3RhbGxfcGFja2VkX2dpdCh0YXJnZXQpOworCQkJCWVsc2UKKwkJCQkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCQl9CisJCX0KKwkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCX0KK30KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCit2b2lkIGZpbGxfYWN0aXZlX3Nsb3RzKHZvaWQpCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKm5leHQ7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwlpbnQgbnVtX3RyYW5zZmVyczsKKworCWlmIChhYm9ydGVkKQorCQlyZXR1cm47CisKKwl3aGlsZSAoYWN0aXZlX3JlcXVlc3RzIDwgbWF4X3JlcXVlc3RzICYmIHJlcXVlc3QgIT0gTlVMTCkgeworCQluZXh0ID0gcmVxdWVzdC0+bmV4dDsKKwkJaWYgKHJlcXVlc3QtPnN0YXRlID09IE5FRURfRkVUQ0gpIHsKKwkJCXN0YXJ0X2ZldGNoX2xvb3NlKHJlcXVlc3QpOworCQl9IGVsc2UgaWYgKHB1c2hpbmcgJiYgcmVxdWVzdC0+c3RhdGUgPT0gTkVFRF9QVVNIKSB7CisJCQlpZiAocmVtb3RlX2Rpcl9leGlzdHNbcmVxdWVzdC0+b2JqLT5zaGExWzBdXSA9PSAxKSB7CisJCQkJc3RhcnRfcHV0KHJlcXVlc3QpOworCQkJfSBlbHNlIHsKKwkJCQlzdGFydF9ta2NvbChyZXF1ZXN0KTsKKwkJCX0KKwkJCWN1cmxfbXVsdGlfcGVyZm9ybShjdXJsbSwgJm51bV90cmFuc2ZlcnMpOworCQl9CisJCXJlcXVlc3QgPSBuZXh0OworCX0KKworCXdoaWxlIChzbG90ICE9IE5VTEwpIHsKKwkJaWYgKCFzbG90LT5pbl91c2UgJiYgc2xvdC0+Y3VybCAhPSBOVUxMKSB7CisJCQljdXJsX2Vhc3lfY2xlYW51cChzbG90LT5jdXJsKTsKKwkJCXNsb3QtPmN1cmwgPSBOVUxMOworCQl9CisJCXNsb3QgPSBzbG90LT5uZXh0OworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZXRfcmVtb3RlX29iamVjdF9saXN0KHVuc2lnbmVkIGNoYXIgcGFyZW50KTsKKworc3RhdGljIHZvaWQgYWRkX2ZldGNoX3JlcXVlc3Qoc3RydWN0IG9iamVjdCAqb2JqKQoreworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0OworCisJY2hlY2tfbG9ja3MoKTsKKworCS8qCisJICogRG9uJ3QgZmV0Y2ggdGhlIG9iamVjdCBpZiBpdCdzIGtub3duIHRvIGV4aXN0IGxvY2FsbHkKKwkgKiBvciBpcyBhbHJlYWR5IGluIHRoZSByZXF1ZXN0IHF1ZXVlCisJICovCisJaWYgKHJlbW90ZV9kaXJfZXhpc3RzW29iai0+c2hhMVswXV0gPT0gLTEpCisJCWdldF9yZW1vdGVfb2JqZWN0X2xpc3Qob2JqLT5zaGExWzBdKTsKKwlpZiAob2JqLT5mbGFncyAmIChMT0NBTCB8IEZFVENISU5HKSkKKwkJcmV0dXJuOworCisJb2JqLT5mbGFncyB8PSBGRVRDSElORzsKKwlyZXF1ZXN0ID0geG1hbGxvYyhzaXplb2YoKnJlcXVlc3QpKTsKKwlyZXF1ZXN0LT5vYmogPSBvYmo7CisJcmVxdWVzdC0+dXJsID0gTlVMTDsKKwlyZXF1ZXN0LT5sb2NrID0gTlVMTDsKKwlyZXF1ZXN0LT5oZWFkZXJzID0gTlVMTDsKKwlyZXF1ZXN0LT5sb2NhbF9maWxlbm8gPSAtMTsKKwlyZXF1ZXN0LT5sb2NhbF9zdHJlYW0gPSBOVUxMOworCXJlcXVlc3QtPnN0YXRlID0gTkVFRF9GRVRDSDsKKwlyZXF1ZXN0LT5uZXh0ID0gcmVxdWVzdF9xdWV1ZV9oZWFkOworCXJlcXVlc3RfcXVldWVfaGVhZCA9IHJlcXVlc3Q7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWZpbGxfYWN0aXZlX3Nsb3RzKCk7CisJc3RlcF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGFkZF9zZW5kX3JlcXVlc3Qoc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJc3RydWN0IHBhY2tlZF9naXQgKnRhcmdldDsKKworCS8qIEtlZXAgbG9ja3MgYWN0aXZlICovCisJY2hlY2tfbG9ja3MoKTsKKworCS8qCisJICogRG9uJ3QgcHVzaCB0aGUgb2JqZWN0IGlmIGl0J3Mga25vd24gdG8gZXhpc3Qgb24gdGhlIHJlbW90ZQorCSAqIG9yIGlzIGFscmVhZHkgaW4gdGhlIHJlcXVlc3QgcXVldWUKKwkgKi8KKwlpZiAocmVtb3RlX2Rpcl9leGlzdHNbb2JqLT5zaGExWzBdXSA9PSAtMSkKKwkJZ2V0X3JlbW90ZV9vYmplY3RfbGlzdChvYmotPnNoYTFbMF0pOworCWlmIChvYmotPmZsYWdzICYgKFJFTU9URSB8IFBVU0hJTkcpKQorCQlyZXR1cm4gMDsKKwl0YXJnZXQgPSBmaW5kX3NoYTFfcGFjayhvYmotPnNoYTEsIHJlbW90ZS0+cGFja3MpOworCWlmICh0YXJnZXQpIHsKKwkJb2JqLT5mbGFncyB8PSBSRU1PVEU7CisJCXJldHVybiAwOworCX0KKworCW9iai0+ZmxhZ3MgfD0gUFVTSElORzsKKwlyZXF1ZXN0ID0geG1hbGxvYyhzaXplb2YoKnJlcXVlc3QpKTsKKwlyZXF1ZXN0LT5vYmogPSBvYmo7CisJcmVxdWVzdC0+dXJsID0gTlVMTDsKKwlyZXF1ZXN0LT5sb2NrID0gbG9jazsKKwlyZXF1ZXN0LT5oZWFkZXJzID0gTlVMTDsKKwlyZXF1ZXN0LT5sb2NhbF9maWxlbm8gPSAtMTsKKwlyZXF1ZXN0LT5sb2NhbF9zdHJlYW0gPSBOVUxMOworCXJlcXVlc3QtPnN0YXRlID0gTkVFRF9QVVNIOworCXJlcXVlc3QtPm5leHQgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJcmVxdWVzdF9xdWV1ZV9oZWFkID0gcmVxdWVzdDsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKwlzdGVwX2FjdGl2ZV9zbG90cygpOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmZXRjaF9pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKmhleCA9IHNoYTFfdG9faGV4KHNoYTEpOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgKnVybDsKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKworCUZJTEUgKmluZGV4ZmlsZTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwkvKiBEb24ndCB1c2UgdGhlIGluZGV4IGlmIHRoZSBwYWNrIGlzbid0IHRoZXJlICovCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgNjQpOworCXNwcmludGYodXJsLCAiJXNvYmplY3RzL3BhY2svcGFjay0lcy5wYWNrIiwgcmVtb3RlLT51cmwsIGhleCk7CisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9OT0JPRFksIDEpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmcmVlKHVybCk7CisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byB2ZXJpZnkgcGFjayAlcyBpcyBhdmFpbGFibGUiLAorCQkJCSAgICAgaGV4KTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwlpZiAoaGFzX3BhY2tfaW5kZXgoc2hhMSkpCisJCXJldHVybiAwOworCisJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQlmcHJpbnRmKHN0ZGVyciwgIkdldHRpbmcgaW5kZXggZm9yIHBhY2sgJXNcbiIsIGhleCk7CisKKwlzcHJpbnRmKHVybCwgIiVzb2JqZWN0cy9wYWNrL3BhY2stJXMuaWR4IiwgcmVtb3RlLT51cmwsIGhleCk7CisKKwlmaWxlbmFtZSA9IHNoYTFfcGFja19pbmRleF9uYW1lKHNoYTEpOworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisJaW5kZXhmaWxlID0gZm9wZW4odG1wZmlsZSwgImEiKTsKKwlpZiAoIWluZGV4ZmlsZSkKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gb3BlbiBsb2NhbCBmaWxlICVzIGZvciBwYWNrIGluZGV4IiwKKwkJCSAgICAgZmlsZW5hbWUpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfTk9CT0RZLCAwKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEdFVCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIGluZGV4ZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisJc2xvdC0+bG9jYWwgPSBpbmRleGZpbGU7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHByZXNlbnQgZnJvbSBhIHByZXZpb3VzIHRyYW5zZmVyIGF0dGVtcHQsCisJICAgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmICovCisJcHJldl9wb3NuID0gZnRlbGwoaW5kZXhmaWxlKTsKKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIGluZGV4IGZvciBwYWNrICVzIGF0IGJ5dGUgJWxkXG4iLAorCQkJCWhleCwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmcmVlKHVybCk7CisJCQlmY2xvc2UoaW5kZXhmaWxlKTsKKwkJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGdldCBwYWNrIGluZGV4ICVzXG4lcyIsIHVybCwKKwkJCQkgICAgIGN1cmxfZXJyb3JzdHIpOworCQl9CisJfSBlbHNlIHsKKwkJZnJlZSh1cmwpOworCQlmY2xvc2UoaW5kZXhmaWxlKTsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCX0KKworCWZyZWUodXJsKTsKKwlmY2xvc2UoaW5kZXhmaWxlKTsKKworCXJldHVybiBtb3ZlX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfaW5kZXgodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqbmV3X3BhY2s7CisKKwlpZiAoZmV0Y2hfaW5kZXgoc2hhMSkpCisJCXJldHVybiAtMTsKKworCW5ld19wYWNrID0gcGFyc2VfcGFja19pbmRleChzaGExKTsKKwluZXdfcGFjay0+bmV4dCA9IHJlbW90ZS0+cGFja3M7CisJcmVtb3RlLT5wYWNrcyA9IG5ld19wYWNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZldGNoX2luZGljZXModm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgKnVybDsKKwlzdHJ1Y3QgYnVmZmVyIGJ1ZmZlcjsKKwljaGFyICpkYXRhOworCWludCBpID0gMDsKKworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCWRhdGEgPSB4Y2FsbG9jKDEsIDQwOTYpOworCWJ1ZmZlci5zaXplID0gNDA5NjsKKwlidWZmZXIucG9zbiA9IDA7CisJYnVmZmVyLmJ1ZmZlciA9IGRhdGE7CisKKwlpZiAocHVzaF92ZXJib3NlbHkpCisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBwYWNrIGxpc3RcbiIpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgMjApOworCXNwcmludGYodXJsLCAiJXNvYmplY3RzL2luZm8vcGFja3MiLCByZW1vdGUtPnVybCk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgTlVMTCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZyZWUoYnVmZmVyLmJ1ZmZlcik7CisJCQlmcmVlKHVybCk7CisJCQlpZiAocmVzdWx0cy5odHRwX2NvZGUgPT0gNDA0KQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiBlcnJvcigiJXMiLCBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZyZWUoYnVmZmVyLmJ1ZmZlcik7CisJCWZyZWUodXJsKTsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCX0KKwlmcmVlKHVybCk7CisKKwlkYXRhID0gYnVmZmVyLmJ1ZmZlcjsKKwl3aGlsZSAoaSA8IGJ1ZmZlci5wb3NuKSB7CisJCXN3aXRjaCAoZGF0YVtpXSkgeworCQljYXNlICdQJzoKKwkJCWkrKzsKKwkJCWlmIChpICsgNTIgPCBidWZmZXIucG9zbiAmJgorCQkJICAgICFzdHJuY21wKGRhdGEgKyBpLCAiIHBhY2stIiwgNikgJiYKKwkJCSAgICAhc3RybmNtcChkYXRhICsgaSArIDQ2LCAiLnBhY2tcbiIsIDYpKSB7CisJCQkJZ2V0X3NoYTFfaGV4KGRhdGEgKyBpICsgNiwgc2hhMSk7CisJCQkJc2V0dXBfaW5kZXgoc2hhMSk7CisJCQkJaSArPSA1MTsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXdoaWxlIChkYXRhW2ldICE9ICdcbicpCisJCQkJaSsrOworCQl9CisJCWkrKzsKKwl9CisKKwlmcmVlKGJ1ZmZlci5idWZmZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZWVkc19xdW90ZShpbnQgY2gpCit7CisJc3dpdGNoIChjaCkgeworCWNhc2UgJy8nOiBjYXNlICctJzogY2FzZSAnLic6CisJY2FzZSAnQScuLi4nWic6CWNhc2UgJ2EnLi4uJ3onOgljYXNlICcwJy4uLic5JzoKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBoZXgoaW50IHYpCit7CisJaWYgKHYgPCAxMCkgcmV0dXJuICcwJyArIHY7CisJZWxzZSByZXR1cm4gJ0EnICsgdiAtIDEwOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfcmVmX3VybChjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpyZWYpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZHAsICpxcmVmOworCWludCBsZW4sIGJhc2VsZW4sIGNoOworCisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlsZW4gPSBiYXNlbGVuICsgMTsKKwlmb3IgKGNwID0gcmVmOyAoY2ggPSAqY3ApICE9IDA7IGNwKyssIGxlbisrKQorCQlpZiAobmVlZHNfcXVvdGUoY2gpKQorCQkJbGVuICs9IDI7IC8qIGV4dHJhIHR3byBoZXggcGx1cyByZXBsYWNlbWVudCAlICovCisJcXJlZiA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkocXJlZiwgYmFzZSwgYmFzZWxlbik7CisJZm9yIChjcCA9IHJlZiwgZHAgPSBxcmVmICsgYmFzZWxlbjsgKGNoID0gKmNwKSAhPSAwOyBjcCsrKSB7CisJCWlmIChuZWVkc19xdW90ZShjaCkpIHsKKwkJCSpkcCsrID0gJyUnOworCQkJKmRwKysgPSBoZXgoKGNoID4+IDQpICYgMHhGKTsKKwkJCSpkcCsrID0gaGV4KGNoICYgMHhGKTsKKwkJfQorCQllbHNlCisJCQkqZHArKyA9IGNoOworCX0KKwkqZHAgPSAwOworCisJcmV0dXJuIHFyZWY7Cit9CisKK2ludCBmZXRjaF9yZWYoY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworICAgICAgICBjaGFyICp1cmw7CisgICAgICAgIGNoYXIgaGV4WzQyXTsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJY2hhciAqYmFzZSA9IHJlbW90ZS0+dXJsOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKyAgICAgICAgYnVmZmVyLnNpemUgPSA0MTsKKyAgICAgICAgYnVmZmVyLnBvc24gPSAwOworICAgICAgICBidWZmZXIuYnVmZmVyID0gaGV4OworICAgICAgICBoZXhbNDFdID0gJ1wwJzsKKworCXVybCA9IHF1b3RlX3JlZl91cmwoYmFzZSwgcmVmKTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spCisJCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IGdldCAlcyBmb3IgJXNcbiVzIiwKKwkJCQkgICAgIHVybCwgcmVmLCBjdXJsX2Vycm9yc3RyKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisgICAgICAgIGhleFs0MF0gPSAnXDAnOworICAgICAgICBnZXRfc2hhMV9oZXgoaGV4LCBzaGExKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9uZV9yZW1vdGVfb2JqZWN0KGNvbnN0IGNoYXIgKmhleCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm9iajsKKworCWlmIChnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSAhPSAwKQorCQlyZXR1cm47CisKKwlvYmogPSBsb29rdXBfb2JqZWN0KHNoYTEpOworCWlmICghb2JqKQorCQlvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisKKwkvKiBJZ25vcmUgcmVtb3RlIG9iamVjdHMgdGhhdCBkb24ndCBleGlzdCBsb2NhbGx5ICovCisJaWYgKCFvYmopCisJCXJldHVybjsKKworCW9iai0+ZmxhZ3MgfD0gUkVNT1RFOworCWlmICghb2JqZWN0X2xpc3RfY29udGFpbnMob2JqZWN0cywgb2JqKSkKKwkJYWRkX29iamVjdChvYmosICZvYmplY3RzLCBOVUxMLCAiIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9sb2NrcHJvcF9jdHgoc3RydWN0IHhtbF9jdHggKmN0eCwgaW50IHRhZ19jbG9zZWQpCit7CisJaW50ICpsb2NrX2ZsYWdzID0gKGludCAqKWN0eC0+dXNlckRhdGE7CisKKwlpZiAodGFnX2Nsb3NlZCkgeworCQlpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9DVFhfTE9DS0VOVFJZKSkgeworCQkJaWYgKCgqbG9ja19mbGFncyAmIERBVl9QUk9QX0xPQ0tFWCkgJiYKKwkJCSAgICAoKmxvY2tfZmxhZ3MgJiBEQVZfUFJPUF9MT0NLV1IpKSB7CisJCQkJKmxvY2tfZmxhZ3MgfD0gREFWX0xPQ0tfT0s7CisJCQl9CisJCQkqbG9ja19mbGFncyAmPSBEQVZfTE9DS19PSzsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0NUWF9MT0NLVFlQRV9XUklURSkpIHsKKwkJCSpsb2NrX2ZsYWdzIHw9IERBVl9QUk9QX0xPQ0tXUjsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0NUWF9MT0NLVFlQRV9FWENMVVNJVkUpKSB7CisJCQkqbG9ja19mbGFncyB8PSBEQVZfUFJPUF9MT0NLRVg7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9uZXdfbG9ja19jdHgoc3RydWN0IHhtbF9jdHggKmN0eCwgaW50IHRhZ19jbG9zZWQpCit7CisJc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrID0gKHN0cnVjdCByZW1vdGVfbG9jayAqKWN0eC0+dXNlckRhdGE7CisKKwlpZiAodGFnX2Nsb3NlZCAmJiBjdHgtPmNkYXRhKSB7CisJCWlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0FDVElWRUxPQ0tfT1dORVIpKSB7CisJCQlsb2NrLT5vd25lciA9IHhtYWxsb2Moc3RybGVuKGN0eC0+Y2RhdGEpICsgMSk7CisJCQlzdHJjcHkobG9jay0+b3duZXIsIGN0eC0+Y2RhdGEpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQUNUSVZFTE9DS19USU1FT1VUKSkgeworCQkJaWYgKCFzdHJuY21wKGN0eC0+Y2RhdGEsICJTZWNvbmQtIiwgNykpCisJCQkJbG9jay0+dGltZW91dCA9CisJCQkJCXN0cnRvbChjdHgtPmNkYXRhICsgNywgTlVMTCwgMTApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQUNUSVZFTE9DS19UT0tFTikpIHsKKwkJCWlmICghc3RybmNtcChjdHgtPmNkYXRhLCAib3BhcXVlbG9ja3Rva2VuOiIsIDE2KSkgeworCQkJCWxvY2stPnRva2VuID0geG1hbGxvYyhzdHJsZW4oY3R4LT5jZGF0YSkgLSAxNSk7CisJCQkJc3RyY3B5KGxvY2stPnRva2VuLCBjdHgtPmNkYXRhICsgMTYpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvbmVfcmVtb3RlX3JlZihjaGFyICpyZWZuYW1lKTsKKworc3RhdGljIHZvaWQKK3htbF9zdGFydF90YWcodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRzKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwljb25zdCBjaGFyICpjID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJaW50IG5ld19sZW47CisKKwlpZiAoYyA9PSBOVUxMKQorCQljID0gbmFtZTsKKwllbHNlCisJCWMrKzsKKworCW5ld19sZW4gPSBzdHJsZW4oY3R4LT5uYW1lKSArIHN0cmxlbihjKSArIDI7CisKKwlpZiAobmV3X2xlbiA+IGN0eC0+bGVuKSB7CisJCWN0eC0+bmFtZSA9IHhyZWFsbG9jKGN0eC0+bmFtZSwgbmV3X2xlbik7CisJCWN0eC0+bGVuID0gbmV3X2xlbjsKKwl9CisJc3RyY2F0KGN0eC0+bmFtZSwgIi4iKTsKKwlzdHJjYXQoY3R4LT5uYW1lLCBjKTsKKworCWlmIChjdHgtPmNkYXRhKSB7CisJCWZyZWUoY3R4LT5jZGF0YSk7CisJCWN0eC0+Y2RhdGEgPSBOVUxMOworCX0KKworCWN0eC0+dXNlckZ1bmMoY3R4LCAwKTsKK30KKworc3RhdGljIHZvaWQKK3htbF9lbmRfdGFnKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwljb25zdCBjaGFyICpjID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJY2hhciAqZXA7CisKKwljdHgtPnVzZXJGdW5jKGN0eCwgMSk7CisKKwlpZiAoYyA9PSBOVUxMKQorCQljID0gbmFtZTsKKwllbHNlCisJCWMrKzsKKworCWVwID0gY3R4LT5uYW1lICsgc3RybGVuKGN0eC0+bmFtZSkgLSBzdHJsZW4oYykgLSAxOworCSplcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCit4bWxfY2RhdGEodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwlpZiAoY3R4LT5jZGF0YSkKKwkJZnJlZShjdHgtPmNkYXRhKTsKKwljdHgtPmNkYXRhID0geGNhbGxvYyhsZW4rMSwgMSk7CisJc3RybmNweShjdHgtPmNkYXRhLCBzLCBsZW4pOworfQorCitzdGF0aWMgc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrX3JlbW90ZShjaGFyICpwYXRoLCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCXN0cnVjdCBidWZmZXIgb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgYnVmZmVyIGluX2J1ZmZlcjsKKwljaGFyICpvdXRfZGF0YTsKKwljaGFyICppbl9kYXRhOworCWNoYXIgKnVybDsKKwljaGFyICplcDsKKwljaGFyIHRpbWVvdXRfaGVhZGVyWzI1XTsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2sgPSBOVUxMOworCVhNTF9QYXJzZXIgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKwllbnVtIFhNTF9TdGF0dXMgcmVzdWx0OworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJc3RydWN0IHhtbF9jdHggY3R4OworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHBhdGgpICsgMSk7CisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHBhdGgpOworCisJLyogTWFrZSBzdXJlIGxlYWRpbmcgZGlyZWN0b3JpZXMgZXhpc3QgZm9yIHRoZSByZW1vdGUgcmVmICovCisJZXAgPSBzdHJjaHIodXJsICsgc3RybGVuKHJlbW90ZS0+dXJsKSArIDExLCAnLycpOworCXdoaWxlIChlcCkgeworCQkqZXAgPSAwOworCQlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX01LQ09MKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwkJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSyAmJgorCQkJICAgIHJlc3VsdHMuaHR0cF9jb2RlICE9IDQwNSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBicmFuY2ggcGF0aCAlc1xuIiwKKwkJCQkJdXJsKTsKKwkJCQlmcmVlKHVybCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBNS0NPTCByZXF1ZXN0XG4iKTsKKwkJCWZyZWUodXJsKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSplcCA9ICcvJzsKKwkJZXAgPSBzdHJjaHIoZXAgKyAxLCAnLycpOworCX0KKworCW91dF9idWZmZXIuc2l6ZSA9IHN0cmxlbihMT0NLX1JFUVVFU1QpICsgc3RybGVuKGdpdF9kZWZhdWx0X2VtYWlsKSAtIDI7CisJb3V0X2RhdGEgPSB4bWFsbG9jKG91dF9idWZmZXIuc2l6ZSArIDEpOworCXNucHJpbnRmKG91dF9kYXRhLCBvdXRfYnVmZmVyLnNpemUgKyAxLCBMT0NLX1JFUVVFU1QsIGdpdF9kZWZhdWx0X2VtYWlsKTsKKwlvdXRfYnVmZmVyLnBvc24gPSAwOworCW91dF9idWZmZXIuYnVmZmVyID0gb3V0X2RhdGE7CisKKwlpbl9idWZmZXIuc2l6ZSA9IDQwOTY7CisJaW5fZGF0YSA9IHhtYWxsb2MoaW5fYnVmZmVyLnNpemUpOworCWluX2J1ZmZlci5wb3NuID0gMDsKKwlpbl9idWZmZXIuYnVmZmVyID0gaW5fZGF0YTsKKworCXNwcmludGYodGltZW91dF9oZWFkZXIsICJUaW1lb3V0OiBTZWNvbmQtJWxkIiwgdGltZW91dCk7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgdGltZW91dF9oZWFkZXIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5zaXplKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX0xPQ0spOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisKKwlsb2NrID0geGNhbGxvYygxLCBzaXplb2YoKmxvY2spKTsKKwlsb2NrLT50aW1lb3V0ID0gLTE7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJY3R4Lm5hbWUgPSB4Y2FsbG9jKDEwLCAxKTsKKwkJCWN0eC5sZW4gPSAwOworCQkJY3R4LmNkYXRhID0gTlVMTDsKKwkJCWN0eC51c2VyRnVuYyA9IGhhbmRsZV9uZXdfbG9ja19jdHg7CisJCQljdHgudXNlckRhdGEgPSBsb2NrOworCQkJWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgJmN0eCk7CisJCQlYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCB4bWxfc3RhcnRfdGFnLAorCQkJCQkgICAgICB4bWxfZW5kX3RhZyk7CisJCQlYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCB4bWxfY2RhdGEpOworCQkJcmVzdWx0ID0gWE1MX1BhcnNlKHBhcnNlciwgaW5fYnVmZmVyLmJ1ZmZlciwKKwkJCQkJICAgaW5fYnVmZmVyLnBvc24sIDEpOworCQkJZnJlZShjdHgubmFtZSk7CisJCQlpZiAocmVzdWx0ICE9IFhNTF9TVEFUVVNfT0spIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlhNTCBlcnJvcjogJXNcbiIsCisJCQkJCVhNTF9FcnJvclN0cmluZygKKwkJCQkJCVhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOworCQkJCWxvY2stPnRpbWVvdXQgPSAtMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IExPQ0sgcmVxdWVzdFxuIik7CisJfQorCisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7CisJZnJlZShvdXRfZGF0YSk7CisJZnJlZShpbl9kYXRhKTsKKworCWlmIChsb2NrLT50b2tlbiA9PSBOVUxMIHx8IGxvY2stPnRpbWVvdXQgPD0gMCkgeworCQlpZiAobG9jay0+dG9rZW4gIT0gTlVMTCkKKwkJCWZyZWUobG9jay0+dG9rZW4pOworCQlpZiAobG9jay0+b3duZXIgIT0gTlVMTCkKKwkJCWZyZWUobG9jay0+b3duZXIpOworCQlmcmVlKHVybCk7CisJCWZyZWUobG9jayk7CisJCWxvY2sgPSBOVUxMOworCX0gZWxzZSB7CisJCWxvY2stPnVybCA9IHVybDsKKwkJbG9jay0+c3RhcnRfdGltZSA9IHRpbWUoTlVMTCk7CisJCWxvY2stPm5leHQgPSByZW1vdGUtPmxvY2tzOworCQlyZW1vdGUtPmxvY2tzID0gbG9jazsKKwl9CisKKwlyZXR1cm4gbG9jazsKK30KKworc3RhdGljIGludCB1bmxvY2tfcmVtb3RlKHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IHJlbW90ZV9sb2NrICpwcmV2ID0gcmVtb3RlLT5sb2NrczsKKwljaGFyICpsb2NrX3Rva2VuX2hlYWRlcjsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCWludCByYyA9IDA7CisKKwlsb2NrX3Rva2VuX2hlYWRlciA9IHhtYWxsb2Moc3RybGVuKGxvY2stPnRva2VuKSArIDMxKTsKKwlzcHJpbnRmKGxvY2tfdG9rZW5faGVhZGVyLCAiTG9jay1Ub2tlbjogPG9wYXF1ZWxvY2t0b2tlbjolcz4iLAorCQlsb2NrLT50b2tlbik7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgbG9ja190b2tlbl9oZWFkZXIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIGxvY2stPnVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9VTkxPQ0spOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykKKwkJCXJjID0gMTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJVTkxPQ0sgSFRUUCBlcnJvciAlbGRcbiIsCisJCQkJcmVzdWx0cy5odHRwX2NvZGUpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IFVOTE9DSyByZXF1ZXN0XG4iKTsKKwl9CisKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdl9oZWFkZXJzKTsKKwlmcmVlKGxvY2tfdG9rZW5faGVhZGVyKTsKKworCWlmIChyZW1vdGUtPmxvY2tzID09IGxvY2spIHsKKwkJcmVtb3RlLT5sb2NrcyA9IGxvY2stPm5leHQ7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHByZXYgJiYgcHJldi0+bmV4dCAhPSBsb2NrKQorCQkJcHJldiA9IHByZXYtPm5leHQ7CisJCWlmIChwcmV2KQorCQkJcHJldi0+bmV4dCA9IHByZXYtPm5leHQtPm5leHQ7CisJfQorCisJaWYgKGxvY2stPm93bmVyICE9IE5VTEwpCisJCWZyZWUobG9jay0+b3duZXIpOworCWZyZWUobG9jay0+dXJsKTsKKwlmcmVlKGxvY2stPnRva2VuKTsKKwlmcmVlKGxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCByZW1vdGVfbHMoY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWdzLAorCQkgICAgICB2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyksCisJCSAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19sc19vYmplY3Qoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKQoreworCXVuc2lnbmVkIGludCAqcGFyZW50ID0gKHVuc2lnbmVkIGludCAqKWxzLT51c2VyRGF0YTsKKwljaGFyICpwYXRoID0gbHMtPmRlbnRyeV9uYW1lOworCWNoYXIgKm9ial9oZXg7CisKKwlpZiAoIXN0cmNtcChscy0+cGF0aCwgbHMtPmRlbnRyeV9uYW1lKSAmJiAobHMtPmZsYWdzICYgSVNfRElSKSkgeworCQlyZW1vdGVfZGlyX2V4aXN0c1sqcGFyZW50XSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RybGVuKHBhdGgpICE9IDQ5KQorCQlyZXR1cm47CisJcGF0aCArPSA4OworCW9ial9oZXggPSB4bWFsbG9jKHN0cmxlbihwYXRoKSk7CisJc3RybmNweShvYmpfaGV4LCBwYXRoLCAyKTsKKwlzdHJjcHkob2JqX2hleCArIDIsIHBhdGggKyAzKTsKKwlvbmVfcmVtb3RlX29iamVjdChvYmpfaGV4KTsKKwlmcmVlKG9ial9oZXgpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2xzX3JlZihzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpCit7CisJaWYgKCFzdHJjbXAobHMtPnBhdGgsIGxzLT5kZW50cnlfbmFtZSkgJiYgKGxzLT5kZW50cnlfZmxhZ3MgJiBJU19ESVIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiICAlc1xuIiwgbHMtPmRlbnRyeV9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKGxzLT5kZW50cnlfZmxhZ3MgJiBJU19ESVIpKQorCQlvbmVfcmVtb3RlX3JlZihscy0+ZGVudHJ5X25hbWUpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVtb3RlX2xzX2N0eChzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCkKK3sKKwlzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMgPSAoc3RydWN0IHJlbW90ZV9sc19jdHggKiljdHgtPnVzZXJEYXRhOworCisJaWYgKHRhZ19jbG9zZWQpIHsKKwkJaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfUkVTUCkgJiYgbHMtPmRlbnRyeV9uYW1lKSB7CisJCQlpZiAobHMtPmRlbnRyeV9mbGFncyAmIElTX0RJUikgeworCQkJCWlmIChscy0+ZmxhZ3MgJiBQUk9DRVNTX0RJUlMpIHsKKwkJCQkJbHMtPnVzZXJGdW5jKGxzKTsKKwkJCQl9CisJCQkJaWYgKHN0cmNtcChscy0+ZGVudHJ5X25hbWUsIGxzLT5wYXRoKSAmJgorCQkJCSAgICBscy0+ZmxhZ3MgJiBSRUNVUlNJVkUpIHsKKwkJCQkJcmVtb3RlX2xzKGxzLT5kZW50cnlfbmFtZSwKKwkJCQkJCSAgbHMtPmZsYWdzLAorCQkJCQkJICBscy0+dXNlckZ1bmMsCisJCQkJCQkgIGxzLT51c2VyRGF0YSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChscy0+ZmxhZ3MgJiBQUk9DRVNTX0ZJTEVTKSB7CisJCQkJbHMtPnVzZXJGdW5jKGxzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX05BTUUpICYmIGN0eC0+Y2RhdGEpIHsKKwkJCWxzLT5kZW50cnlfbmFtZSA9IHhtYWxsb2Moc3RybGVuKGN0eC0+Y2RhdGEpIC0KKwkJCQkJCSAgcmVtb3RlLT5wYXRoX2xlbiArIDEpOworCQkJc3RyY3B5KGxzLT5kZW50cnlfbmFtZSwgY3R4LT5jZGF0YSArIHJlbW90ZS0+cGF0aF9sZW4pOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfQ09MTEVDVElPTikpIHsKKwkJCWxzLT5kZW50cnlfZmxhZ3MgfD0gSVNfRElSOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX1JFU1ApKSB7CisJCWlmIChscy0+ZGVudHJ5X25hbWUpIHsKKwkJCWZyZWUobHMtPmRlbnRyeV9uYW1lKTsKKwkJfQorCQlscy0+ZGVudHJ5X25hbWUgPSBOVUxMOworCQlscy0+ZGVudHJ5X2ZsYWdzID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9scyhjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsCisJCSAgICAgIHZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKSwKKwkJICAgICAgdm9pZCAqdXNlckRhdGEpCit7CisJY2hhciAqdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHBhdGgpICsgMSk7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCXN0cnVjdCBidWZmZXIgaW5fYnVmZmVyOworCXN0cnVjdCBidWZmZXIgb3V0X2J1ZmZlcjsKKwljaGFyICppbl9kYXRhOworCWNoYXIgKm91dF9kYXRhOworCVhNTF9QYXJzZXIgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKwllbnVtIFhNTF9TdGF0dXMgcmVzdWx0OworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJc3RydWN0IHhtbF9jdHggY3R4OworCXN0cnVjdCByZW1vdGVfbHNfY3R4IGxzOworCisJbHMuZmxhZ3MgPSBmbGFnczsKKwlscy5wYXRoID0gc3RyZHVwKHBhdGgpOworCWxzLmRlbnRyeV9uYW1lID0gTlVMTDsKKwlscy5kZW50cnlfZmxhZ3MgPSAwOworCWxzLnVzZXJEYXRhID0gdXNlckRhdGE7CisJbHMudXNlckZ1bmMgPSB1c2VyRnVuYzsKKworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCBwYXRoKTsKKworCW91dF9idWZmZXIuc2l6ZSA9IHN0cmxlbihQUk9QRklORF9BTExfUkVRVUVTVCk7CisJb3V0X2RhdGEgPSB4bWFsbG9jKG91dF9idWZmZXIuc2l6ZSArIDEpOworCXNucHJpbnRmKG91dF9kYXRhLCBvdXRfYnVmZmVyLnNpemUgKyAxLCBQUk9QRklORF9BTExfUkVRVUVTVCk7CisJb3V0X2J1ZmZlci5wb3NuID0gMDsKKwlvdXRfYnVmZmVyLmJ1ZmZlciA9IG91dF9kYXRhOworCisJaW5fYnVmZmVyLnNpemUgPSA0MDk2OworCWluX2RhdGEgPSB4bWFsbG9jKGluX2J1ZmZlci5zaXplKTsKKwlpbl9idWZmZXIucG9zbiA9IDA7CisJaW5fYnVmZmVyLmJ1ZmZlciA9IGluX2RhdGE7CisKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCAiRGVwdGg6IDEiKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCAiQ29udGVudC1UeXBlOiB0ZXh0L3htbCIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmb3V0X2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRVNJWkUsIG91dF9idWZmZXIuc2l6ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgZnJlYWRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmluX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9QUk9QRklORCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKSB7CisJCQljdHgubmFtZSA9IHhjYWxsb2MoMTAsIDEpOworCQkJY3R4LmxlbiA9IDA7CisJCQljdHguY2RhdGEgPSBOVUxMOworCQkJY3R4LnVzZXJGdW5jID0gaGFuZGxlX3JlbW90ZV9sc19jdHg7CisJCQljdHgudXNlckRhdGEgPSAmbHM7CisJCQlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmY3R4KTsKKwkJCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHhtbF9zdGFydF90YWcsCisJCQkJCSAgICAgIHhtbF9lbmRfdGFnKTsKKwkJCVhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIHhtbF9jZGF0YSk7CisJCQlyZXN1bHQgPSBYTUxfUGFyc2UocGFyc2VyLCBpbl9idWZmZXIuYnVmZmVyLAorCQkJCQkgICBpbl9idWZmZXIucG9zbiwgMSk7CisJCQlmcmVlKGN0eC5uYW1lKTsKKworCQkJaWYgKHJlc3VsdCAhPSBYTUxfU1RBVFVTX09LKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJYTUwgZXJyb3I6ICVzXG4iLAorCQkJCQlYTUxfRXJyb3JTdHJpbmcoCisJCQkJCQlYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IFBST1BGSU5EIHJlcXVlc3RcbiIpOworCX0KKworCWZyZWUobHMucGF0aCk7CisJZnJlZSh1cmwpOworCWZyZWUob3V0X2RhdGEpOworCWZyZWUoaW5fYnVmZmVyLmJ1ZmZlcik7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9yZW1vdGVfb2JqZWN0X2xpc3QodW5zaWduZWQgY2hhciBwYXJlbnQpCit7CisJY2hhciBwYXRoW10gPSAib2JqZWN0cy9YWC8iOworCXN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXVuc2lnbmVkIGludCB2YWwgPSBwYXJlbnQ7CisKKwlwYXRoWzhdID0gaGV4W3ZhbCA+PiA0XTsKKwlwYXRoWzldID0gaGV4W3ZhbCAmIDB4Zl07CisJcmVtb3RlX2Rpcl9leGlzdHNbdmFsXSA9IDA7CisJcmVtb3RlX2xzKHBhdGgsIChQUk9DRVNTX0ZJTEVTIHwgUFJPQ0VTU19ESVJTKSwKKwkJICBwcm9jZXNzX2xzX29iamVjdCwgJnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbG9ja2luZ19hdmFpbGFibGUodm9pZCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IGJ1ZmZlciBpbl9idWZmZXI7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyOworCWNoYXIgKmluX2RhdGE7CisJY2hhciAqb3V0X2RhdGE7CisJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisJaW50IGxvY2tfZmxhZ3MgPSAwOworCisJb3V0X2J1ZmZlci5zaXplID0KKwkJc3RybGVuKFBST1BGSU5EX1NVUFBPUlRFRExPQ0tfUkVRVUVTVCkgKworCQlzdHJsZW4ocmVtb3RlLT51cmwpIC0gMjsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsCisJCSBQUk9QRklORF9TVVBQT1JURURMT0NLX1JFUVVFU1QsIHJlbW90ZS0+dXJsKTsKKwlvdXRfYnVmZmVyLnBvc24gPSAwOworCW91dF9idWZmZXIuYnVmZmVyID0gb3V0X2RhdGE7CisKKwlpbl9idWZmZXIuc2l6ZSA9IDQwOTY7CisJaW5fZGF0YSA9IHhtYWxsb2MoaW5fYnVmZmVyLnNpemUpOworCWluX2J1ZmZlci5wb3NuID0gMDsKKwlpbl9idWZmZXIuYnVmZmVyID0gaW5fZGF0YTsKKworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJEZXB0aDogMCIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5zaXplKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVtb3RlLT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfUFJPUEZJTkQpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJY3R4Lm5hbWUgPSB4Y2FsbG9jKDEwLCAxKTsKKwkJCWN0eC5sZW4gPSAwOworCQkJY3R4LmNkYXRhID0gTlVMTDsKKwkJCWN0eC51c2VyRnVuYyA9IGhhbmRsZV9sb2NrcHJvcF9jdHg7CisJCQljdHgudXNlckRhdGEgPSAmbG9ja19mbGFnczsKKwkJCVhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZjdHgpOworCQkJWE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgeG1sX3N0YXJ0X3RhZywKKwkJCQkJICAgICAgeG1sX2VuZF90YWcpOworCQkJcmVzdWx0ID0gWE1MX1BhcnNlKHBhcnNlciwgaW5fYnVmZmVyLmJ1ZmZlciwKKwkJCQkJICAgaW5fYnVmZmVyLnBvc24sIDEpOworCQkJZnJlZShjdHgubmFtZSk7CisKKwkJCWlmIChyZXN1bHQgIT0gWE1MX1NUQVRVU19PSykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiWE1MIGVycm9yOiAlc1xuIiwKKwkJCQkJWE1MX0Vycm9yU3RyaW5nKAorCQkJCQkJWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisJCQkJbG9ja19mbGFncyA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBQUk9QRklORCByZXF1ZXN0XG4iKTsKKwl9CisKKwlmcmVlKG91dF9kYXRhKTsKKwlmcmVlKGluX2J1ZmZlci5idWZmZXIpOworCWN1cmxfc2xpc3RfZnJlZV9hbGwoZGF2X2hlYWRlcnMpOworCisJcmV0dXJuIGxvY2tfZmxhZ3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwcm9jZXNzX2Jsb2Ioc3RydWN0IGJsb2IgKmJsb2IsCisJCQkJCSBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwLAorCQkJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gJmJsb2ItPm9iamVjdDsKKworCW9iai0+ZmxhZ3MgfD0gTE9DQUw7CisKKwlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCXJldHVybiBwOworCisJb2JqLT5mbGFncyB8PSBTRUVOOworCW5hbWUgPSBzdHJkdXAobmFtZSk7CisJcmV0dXJuIGFkZF9vYmplY3Qob2JqLCBwLCBwYXRoLCBuYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKnByb2Nlc3NfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCQkJIHN0cnVjdCBvYmplY3RfbGlzdCAqKnAsCisJCQkJCSBzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmdHJlZS0+b2JqZWN0OworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgbmFtZV9wYXRoIG1lOworCisJb2JqLT5mbGFncyB8PSBMT0NBTDsKKworCWlmIChvYmotPmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBTRUVOKSkKKwkJcmV0dXJuIHA7CisJaWYgKHBhcnNlX3RyZWUodHJlZSkgPCAwKQorCQlkaWUoImJhZCB0cmVlIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCisJb2JqLT5mbGFncyB8PSBTRUVOOworCW5hbWUgPSBzdHJkdXAobmFtZSk7CisJcCA9IGFkZF9vYmplY3Qob2JqLCBwLCBOVUxMLCBuYW1lKTsKKwltZS51cCA9IHBhdGg7CisJbWUuZWxlbSA9IG5hbWU7CisJbWUuZWxlbV9sZW4gPSBzdHJsZW4obmFtZSk7CisKKwlkZXNjLmJ1ZiA9IHRyZWUtPmJ1ZmZlcjsKKwlkZXNjLnNpemUgPSB0cmVlLT5zaXplOworCisJd2hpbGUgKHRyZWVfZW50cnkoJmRlc2MsICZlbnRyeSkpIHsKKwkJaWYgKFNfSVNESVIoZW50cnkubW9kZSkpCisJCQlwID0gcHJvY2Vzc190cmVlKGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLCBwLCAmbWUsIG5hbWUpOworCQllbHNlCisJCQlwID0gcHJvY2Vzc19ibG9iKGxvb2t1cF9ibG9iKGVudHJ5LnNoYTEpLCBwLCAmbWUsIG5hbWUpOworCX0KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBnZXRfZGVsdGEoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBvYmplY3RfbGlzdCAqKnAgPSAmb2JqZWN0cywgKnBlbmRpbmc7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldnMpKSAhPSBOVUxMKSB7CisJCXAgPSBwcm9jZXNzX3RyZWUoY29tbWl0LT50cmVlLCBwLCBOVUxMLCAiIik7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IExPQ0FMOworCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJY291bnQgKz0gYWRkX3NlbmRfcmVxdWVzdCgmY29tbWl0LT5vYmplY3QsIGxvY2spOworCX0KKworCWZvciAocGVuZGluZyA9IHJldnMtPnBlbmRpbmdfb2JqZWN0czsgcGVuZGluZzsgcGVuZGluZyA9IHBlbmRpbmctPm5leHQpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gcGVuZGluZy0+aXRlbTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHBlbmRpbmctPm5hbWU7CisKKwkJaWYgKG9iai0+ZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IFNFRU4pKQorCQkJY29udGludWU7CisJCWlmIChvYmotPnR5cGUgPT0gdGFnX3R5cGUpIHsKKwkJCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKwkJCXAgPSBhZGRfb2JqZWN0KG9iaiwgcCwgTlVMTCwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2JqLT50eXBlID09IHRyZWVfdHlwZSkgeworCQkJcCA9IHByb2Nlc3NfdHJlZSgoc3RydWN0IHRyZWUgKilvYmosIHAsIE5VTEwsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBibG9iX3R5cGUpIHsKKwkJCXAgPSBwcm9jZXNzX2Jsb2IoKHN0cnVjdCBibG9iICopb2JqLCBwLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgidW5rbm93biBwZW5kaW5nIG9iamVjdCAlcyAoJXMpIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSwgbmFtZSk7CisJfQorCisJd2hpbGUgKG9iamVjdHMpIHsKKwkJaWYgKCEob2JqZWN0cy0+aXRlbS0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCWNvdW50ICs9IGFkZF9zZW5kX3JlcXVlc3Qob2JqZWN0cy0+aXRlbSwgbG9jayk7CisJCW9iamVjdHMgPSBvYmplY3RzLT5uZXh0OworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB1cGRhdGVfcmVtb3RlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqb3V0X2RhdGE7CisJY2hhciAqaWZfaGVhZGVyOworCXN0cnVjdCBidWZmZXIgb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCWludCBpOworCisJaWZfaGVhZGVyID0geG1hbGxvYyhzdHJsZW4obG9jay0+dG9rZW4pICsgMjUpOworCXNwcmludGYoaWZfaGVhZGVyLCAiSWY6ICg8b3BhcXVlbG9ja3Rva2VuOiVzPikiLCBsb2NrLT50b2tlbik7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgaWZfaGVhZGVyKTsKKworCW91dF9idWZmZXIuc2l6ZSA9IDQxOworCW91dF9kYXRhID0geG1hbGxvYyhvdXRfYnVmZmVyLnNpemUgKyAxKTsKKwlpID0gc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsICIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCWlmIChpICE9IG91dF9idWZmZXIuc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBpbml0aWFsaXplIFBVVCByZXF1ZXN0IGJvZHlcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0X2J1ZmZlci5wb3NuID0gMDsKKwlvdXRfYnVmZmVyLmJ1ZmZlciA9IG91dF9kYXRhOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmb3V0X2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRVNJWkUsIG91dF9idWZmZXIuc2l6ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgZnJlYWRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfUFVUKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9QVVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIGxvY2stPnVybCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlmcmVlKG91dF9kYXRhKTsKKwkJZnJlZShpZl9oZWFkZXIpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlBVVCBlcnJvcjogY3VybCByZXN1bHQ9JWQsIEhUVFAgY29kZT0lbGRcbiIsCisJCQkJcmVzdWx0cy5jdXJsX3Jlc3VsdCwgcmVzdWx0cy5odHRwX2NvZGUpOworCQkJLyogV2Ugc2hvdWxkIGF0dGVtcHQgcmVjb3Zlcnk/ICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWZyZWUob3V0X2RhdGEpOworCQlmcmVlKGlmX2hlYWRlcik7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IFBVVCByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpsb2NhbF9yZWZzLCAqKmxvY2FsX3RhaWw7CitzdGF0aWMgc3RydWN0IHJlZiAqcmVtb3RlX3JlZnMsICoqcmVtb3RlX3RhaWw7CisKK3N0YXRpYyBpbnQgb25lX2xvY2FsX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgbGVuID0gc3RybGVuKHJlZm5hbWUpICsgMTsKKwlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbik7CisJbWVtY3B5KHJlZi0+bmV3X3NoYTEsIHNoYTEsIDIwKTsKKwltZW1jcHkocmVmLT5uYW1lLCByZWZuYW1lLCBsZW4pOworCSpsb2NhbF90YWlsID0gcmVmOworCWxvY2FsX3RhaWwgPSAmcmVmLT5uZXh0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbmVfcmVtb3RlX3JlZihjaGFyICpyZWZuYW1lKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwl1bnNpZ25lZCBjaGFyIHJlbW90ZV9zaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJaW50IGxlbiA9IHN0cmxlbihyZWZuYW1lKSArIDE7CisKKwlpZiAoZmV0Y2hfcmVmKHJlZm5hbWUsIHJlbW90ZV9zaGExKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVuYWJsZSB0byBmZXRjaCByZWYgJXMgZnJvbSAlc1xuIiwKKwkJCXJlZm5hbWUsIHJlbW90ZS0+dXJsKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRmV0Y2ggYSBjb3B5IG9mIHRoZSBvYmplY3QgaWYgaXQgZG9lc24ndCBleGlzdCBsb2NhbGx5IC0gaXQKKwkgKiBtYXkgYmUgcmVxdWlyZWQgZm9yIHVwZGF0aW5nIHNlcnZlciBpbmZvIGxhdGVyLgorCSAqLworCWlmIChyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzICYmICFoYXNfc2hhMV9maWxlKHJlbW90ZV9zaGExKSkgeworCQlvYmogPSBsb29rdXBfdW5rbm93bl9vYmplY3QocmVtb3RlX3NoYTEpOworCQlpZiAob2JqKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwJIiAgZmV0Y2ggJXMgZm9yICVzXG4iLAorCQkJCXNoYTFfdG9faGV4KHJlbW90ZV9zaGExKSwgcmVmbmFtZSk7CisJCQlhZGRfZmV0Y2hfcmVxdWVzdChvYmopOworCQl9CisJfQorCisJcmVmID0geGNhbGxvYygxLCBzaXplb2YoKnJlZikgKyBsZW4pOworCW1lbWNweShyZWYtPm9sZF9zaGExLCByZW1vdGVfc2hhMSwgMjApOworCW1lbWNweShyZWYtPm5hbWUsIHJlZm5hbWUsIGxlbik7CisJKnJlbW90ZV90YWlsID0gcmVmOworCXJlbW90ZV90YWlsID0gJnJlZi0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2xvY2FsX2hlYWRzKHZvaWQpCit7CisJbG9jYWxfdGFpbCA9ICZsb2NhbF9yZWZzOworCWZvcl9lYWNoX3JlZihvbmVfbG9jYWxfcmVmKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2Rhdl9yZW1vdGVfaGVhZHModm9pZCkKK3sKKwlyZW1vdGVfdGFpbCA9ICZyZW1vdGVfcmVmczsKKwlyZW1vdGVfbHMoInJlZnMvIiwgKFBST0NFU1NfRklMRVMgfCBQUk9DRVNTX0RJUlMgfCBSRUNVUlNJVkUpLCBwcm9jZXNzX2xzX3JlZiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaXNfemVyb19zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQlpZiAoKnNoYTErKykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdW5tYXJrX2FuZF9mcmVlKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgdW5zaWduZWQgaW50IG1hcmspCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICp0ZW1wID0gbGlzdDsKKwkJdGVtcC0+aXRlbS0+b2JqZWN0LmZsYWdzICY9IH5tYXJrOworCQlsaXN0ID0gdGVtcC0+bmV4dDsKKwkJZnJlZSh0ZW1wKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVmX25ld2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKQoreworCXN0cnVjdCBvYmplY3QgKm87CisJc3RydWN0IGNvbW1pdCAqb2xkLCAqbmV3OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgKnVzZWQ7CisJaW50IGZvdW5kID0gMDsKKworCS8qIEJvdGggbmV3IGFuZCBvbGQgbXVzdCBiZSBjb21taXQtaXNoIGFuZCBuZXcgaXMgZGVzY2VuZGFudCBvZgorCSAqIG9sZC4gIE90aGVyd2lzZSB3ZSByZXF1aXJlIC0tZm9yY2UuCisJICovCisJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qob2xkX3NoYTEpLCBOVUxMLCAwKTsKKwlpZiAoIW8gfHwgby0+dHlwZSAhPSBjb21taXRfdHlwZSkKKwkJcmV0dXJuIDA7CisJb2xkID0gKHN0cnVjdCBjb21taXQgKikgbzsKKworCW8gPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KG5ld19zaGExKSwgTlVMTCwgMCk7CisJaWYgKCFvIHx8IG8tPnR5cGUgIT0gY29tbWl0X3R5cGUpCisJCXJldHVybiAwOworCW5ldyA9IChzdHJ1Y3QgY29tbWl0ICopIG87CisKKwlpZiAocGFyc2VfY29tbWl0KG5ldykgPCAwKQorCQlyZXR1cm4gMDsKKworCXVzZWQgPSBsaXN0ID0gTlVMTDsKKwljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmbGlzdCk7CisJd2hpbGUgKGxpc3QpIHsKKwkJbmV3ID0gcG9wX21vc3RfcmVjZW50X2NvbW1pdCgmbGlzdCwgVE1QX01BUkspOworCQljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmdXNlZCk7CisJCWlmIChuZXcgPT0gb2xkKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwl1bm1hcmtfYW5kX2ZyZWUobGlzdCwgVE1QX01BUkspOworCXVubWFya19hbmRfZnJlZSh1c2VkLCBUTVBfTUFSSyk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgdm9pZCBtYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7IHBhcmVudHM7IHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisJCWlmICghKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQljb250aW51ZTsKKwkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcocGFyZW50LT50cmVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QpCit7CisJZm9yICggOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKGNvbW1pdC0+dHJlZSk7CisJCQljb250aW51ZTsKKwkJfQorCQltYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcmVtb3RlX2luZm9fcmVmKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscykKK3sKKwlzdHJ1Y3QgYnVmZmVyICpidWYgPSAoc3RydWN0IGJ1ZmZlciAqKWxzLT51c2VyRGF0YTsKKwl1bnNpZ25lZCBjaGFyIHJlbW90ZV9zaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCWludCBsZW47CisJY2hhciAqcmVmX2luZm87CisKKwlpZiAoZmV0Y2hfcmVmKGxzLT5kZW50cnlfbmFtZSwgcmVtb3RlX3NoYTEpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiVW5hYmxlIHRvIGZldGNoIHJlZiAlcyBmcm9tICVzXG4iLAorCQkJbHMtPmRlbnRyeV9uYW1lLCByZW1vdGUtPnVybCk7CisJCWFib3J0ZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJbyA9IHBhcnNlX29iamVjdChyZW1vdGVfc2hhMSk7CisJaWYgKCFvKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVuYWJsZSB0byBwYXJzZSBvYmplY3QgJXMgZm9yIHJlbW90ZSByZWYgJXNcbiIsCisJCQlzaGExX3RvX2hleChyZW1vdGVfc2hhMSksIGxzLT5kZW50cnlfbmFtZSk7CisJCWFib3J0ZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJbGVuID0gc3RybGVuKGxzLT5kZW50cnlfbmFtZSkgKyA0MjsKKwlyZWZfaW5mbyA9IHhjYWxsb2MobGVuICsgMSwgMSk7CisJc3ByaW50ZihyZWZfaW5mbywgIiVzCSVzXG4iLAorCQlzaGExX3RvX2hleChyZW1vdGVfc2hhMSksIGxzLT5kZW50cnlfbmFtZSk7CisJZndyaXRlX2J1ZmZlcihyZWZfaW5mbywgMSwgbGVuLCBidWYpOworCWZyZWUocmVmX2luZm8pOworCisJaWYgKG8tPnR5cGUgPT0gdGFnX3R5cGUpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCBscy0+ZGVudHJ5X25hbWUsIDApOworCQlpZiAobykgeworCQkJbGVuID0gc3RybGVuKGxzLT5kZW50cnlfbmFtZSkgKyA0NTsKKwkJCXJlZl9pbmZvID0geGNhbGxvYyhsZW4gKyAxLCAxKTsKKwkJCXNwcmludGYocmVmX2luZm8sICIlcwklc157fVxuIiwKKwkJCQlzaGExX3RvX2hleChvLT5zaGExKSwgbHMtPmRlbnRyeV9uYW1lKTsKKwkJCWZ3cml0ZV9idWZmZXIocmVmX2luZm8sIDEsIGxlbiwgYnVmKTsKKwkJCWZyZWUocmVmX2luZm8pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcmVtb3RlX2luZm9fcmVmcyhzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCWNoYXIgKmlmX2hlYWRlcjsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCisJYnVmZmVyLmJ1ZmZlciA9IHhjYWxsb2MoMSwgNDA5Nik7CisJYnVmZmVyLnNpemUgPSA0MDk2OworCWJ1ZmZlci5wb3NuID0gMDsKKwlyZW1vdGVfbHMoInJlZnMvIiwgKFBST0NFU1NfRklMRVMgfCBSRUNVUlNJVkUpLAorCQkgIGFkZF9yZW1vdGVfaW5mb19yZWYsICZidWZmZXIpOworCWlmICghYWJvcnRlZCkgeworCQlpZl9oZWFkZXIgPSB4bWFsbG9jKHN0cmxlbihsb2NrLT50b2tlbikgKyAyNSk7CisJCXNwcmludGYoaWZfaGVhZGVyLCAiSWY6ICg8b3BhcXVlbG9ja3Rva2VuOiVzPikiLCBsb2NrLT50b2tlbik7CisJCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIGlmX2hlYWRlcik7CisKKwkJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCQlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZidWZmZXIpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgYnVmZmVyLnBvc24pOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BVVCk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUFVULCAxKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgbG9jay0+dXJsKTsKKworCQlidWZmZXIucG9zbiA9IDA7CisKKwkJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiUFVUIGVycm9yOiBjdXJsIHJlc3VsdD0lZCwgSFRUUCBjb2RlPSVsZFxuIiwKKwkJCQkJcmVzdWx0cy5jdXJsX3Jlc3VsdCwgcmVzdWx0cy5odHRwX2NvZGUpOworCQkJfQorCQl9CisJCWZyZWUoaWZfaGVhZGVyKTsKKwl9CisJZnJlZShidWZmZXIuYnVmZmVyKTsKK30KKworc3RhdGljIGludCByZW1vdGVfZXhpc3RzKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciAqdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHBhdGgpICsgMSk7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHBhdGgpOworCisgICAgICAgIHNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9OT0JPRFksIDEpOworCisgICAgICAgIGlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmh0dHBfY29kZSA9PSA0MDQpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIkhFQUQgSFRUUCBlcnJvciAlbGRcbiIsIHJlc3VsdHMuaHR0cF9jb2RlKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBIRUFEIHJlcXVlc3RcbiIpOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZmV0Y2hfc3ltcmVmKGNoYXIgKnBhdGgsIGNoYXIgKipzeW1yZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIHN0cmxlbihwYXRoKSArIDEpOworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCBwYXRoKTsKKworCWJ1ZmZlci5zaXplID0gNDA5NjsKKwlidWZmZXIucG9zbiA9IDA7CisJYnVmZmVyLmJ1ZmZlciA9IHhtYWxsb2MoYnVmZmVyLnNpemUpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlkaWUoIkNvdWxkbid0IGdldCAlcyBmb3IgcmVtb3RlIHN5bXJlZlxuJXMiLAorCQkJICAgIHVybCwgY3VybF9lcnJvcnN0cik7CisJCX0KKwl9IGVsc2UgeworCQlkaWUoIlVuYWJsZSB0byBzdGFydCByZW1vdGUgc3ltcmVmIHJlcXVlc3QiKTsKKwl9CisJZnJlZSh1cmwpOworCisJaWYgKCpzeW1yZWYgIT0gTlVMTCkKKwkJZnJlZSgqc3ltcmVmKTsKKwkqc3ltcmVmID0gTlVMTDsKKwltZW1zZXQoc2hhMSwgMCwgMjApOworCisJaWYgKGJ1ZmZlci5wb3NuID09IDApCisJCXJldHVybjsKKworCS8qIElmIGl0J3MgYSBzeW1yZWYsIHNldCB0aGUgcmVmbmFtZTsgb3RoZXJ3aXNlIHRyeSBmb3IgYSBzaGExICovCisJaWYgKCFzdHJuY21wKChjaGFyICopYnVmZmVyLmJ1ZmZlciwgInJlZjogIiwgNSkpIHsKKwkJKnN5bXJlZiA9IHhjYWxsb2MoYnVmZmVyLnBvc24gLSA1LCAxKTsKKwkJc3RybmNweSgqc3ltcmVmLCAoY2hhciAqKWJ1ZmZlci5idWZmZXIgKyA1LCBidWZmZXIucG9zbiAtIDYpOworCX0gZWxzZSB7CisJCWdldF9zaGExX2hleChidWZmZXIuYnVmZmVyLCBzaGExKTsKKwl9CisKKwlmcmVlKGJ1ZmZlci5idWZmZXIpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9tZXJnZV9iYXNlKHVuc2lnbmVkIGNoYXIgKmhlYWRfc2hhMSwgdW5zaWduZWQgY2hhciAqYnJhbmNoX3NoYTEpCit7CisJaW50IHBpcGVfZmRbMl07CisJcGlkX3QgbWVyZ2VfYmFzZV9waWQ7CisJY2hhciBsaW5lW1BBVEhfTUFYICsgMjBdOworCXVuc2lnbmVkIGNoYXIgbWVyZ2Vfc2hhMVsyMF07CisJaW50IHZlcmlmaWVkID0gMDsKKworCWlmIChwaXBlKHBpcGVfZmQpIDwgMCkKKwkJZGllKCJWZXJpZnkgbWVyZ2UgYmFzZTogcGlwZSBmYWlsZWQiKTsKKworCW1lcmdlX2Jhc2VfcGlkID0gZm9yaygpOworCWlmICghbWVyZ2VfYmFzZV9waWQpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsKKwkJCSJtZXJnZS1iYXNlIiwKKwkJCSItYSIsCisJCQlOVUxMLAorCQkJTlVMTCwKKwkJCU5VTEwKKwkJfTsKKwkJYXJnc1syXSA9IHN0cmR1cChzaGExX3RvX2hleChoZWFkX3NoYTEpKTsKKwkJYXJnc1szXSA9IHNoYTFfdG9faGV4KGJyYW5jaF9zaGExKTsKKworCQlkdXAyKHBpcGVfZmRbMV0sIDEpOworCQljbG9zZShwaXBlX2ZkWzBdKTsKKwkJY2xvc2UocGlwZV9mZFsxXSk7CisJCWV4ZWN2X2dpdF9jbWQoYXJncyk7CisJCWRpZSgibWVyZ2UtYmFzZSBzZXR1cCBmYWlsZWQiKTsKKwl9CisJaWYgKG1lcmdlX2Jhc2VfcGlkIDwgMCkKKwkJZGllKCJtZXJnZS1iYXNlIGZvcmsgZmFpbGVkIik7CisKKwlkdXAyKHBpcGVfZmRbMF0sIDApOworCWNsb3NlKHBpcGVfZmRbMF0pOworCWNsb3NlKHBpcGVfZmRbMV0pOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKSB7CisJCWlmIChnZXRfc2hhMV9oZXgobGluZSwgbWVyZ2Vfc2hhMSkpCisJCQlkaWUoImV4cGVjdGVkIHNoYTEsIGdvdCBnYXJiYWdlOlxuICVzIiwgbGluZSk7CisJCWlmICghbWVtY21wKGJyYW5jaF9zaGExLCBtZXJnZV9zaGExLCAyMCkpIHsKKwkJCXZlcmlmaWVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHZlcmlmaWVkOworfQorCitzdGF0aWMgaW50IGRlbGV0ZV9yZW1vdGVfYnJhbmNoKGNoYXIgKnBhdHRlcm4sIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgcmVmICpyZWZzID0gcmVtb3RlX3JlZnM7CisJc3RydWN0IHJlZiAqcmVtb3RlX3JlZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBoZWFkX3NoYTFbMjBdOworCWNoYXIgKnN5bXJlZiA9IE5VTEw7CisJaW50IG1hdGNoOworCWludCBwYXRsZW4gPSBzdHJsZW4ocGF0dGVybik7CisJaW50IGk7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCWNoYXIgKnVybDsKKworCS8qIEZpbmQgdGhlIHJlbW90ZSBicmFuY2goZXMpIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgYnJhbmNoIG5hbWUgKi8KKwlmb3IgKG1hdGNoID0gMDsgcmVmczsgcmVmcyA9IHJlZnMtPm5leHQpIHsKKwkJY2hhciAqbmFtZSA9IHJlZnMtPm5hbWU7CisJCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworCQlpZiAobmFtZWxlbiA8IHBhdGxlbiB8fAorCQkgICAgbWVtY21wKG5hbWUgKyBuYW1lbGVuIC0gcGF0bGVuLCBwYXR0ZXJuLCBwYXRsZW4pKQorCQkJY29udGludWU7CisJCWlmIChuYW1lbGVuICE9IHBhdGxlbiAmJiBuYW1lW25hbWVsZW4gLSBwYXRsZW4gLSAxXSAhPSAnLycpCisJCQljb250aW51ZTsKKwkJbWF0Y2grKzsKKwkJcmVtb3RlX3JlZiA9IHJlZnM7CisJfQorCWlmIChtYXRjaCA9PSAwKQorCQlyZXR1cm4gZXJyb3IoIk5vIHJlbW90ZSBicmFuY2ggbWF0Y2hlcyAlcyIsIHBhdHRlcm4pOworCWlmIChtYXRjaCAhPSAxKQorCQlyZXR1cm4gZXJyb3IoIk1vcmUgdGhhbiBvbmUgcmVtb3RlIGJyYW5jaCBtYXRjaGVzICVzIiwKKwkJCSAgICAgcGF0dGVybik7CisKKwkvKgorCSAqIFJlbW90ZSBIRUFEIG11c3QgYmUgYSBzeW1yZWYgKG5vdCBleGFjdGx5IGZvb2xwcm9vZjsgYSByZW1vdGUKKwkgKiBzeW1saW5rIHRvIGEgc3ltcmVmIHdpbGwgbG9vayBsaWtlIGEgc3ltcmVmKQorCSAqLworCWZldGNoX3N5bXJlZigiSEVBRCIsICZzeW1yZWYsIGhlYWRfc2hhMSk7CisJaWYgKCFzeW1yZWYpCisJCXJldHVybiBlcnJvcigiUmVtb3RlIEhFQUQgaXMgbm90IGEgc3ltcmVmIik7CisKKwkvKiBSZW1vdGUgYnJhbmNoIG11c3Qgbm90IGJlIHRoZSByZW1vdGUgSEVBRCAqLworCWZvciAoaT0wOyBzeW1yZWYgJiYgaTxNQVhERVBUSDsgaSsrKSB7CisJCWlmICghc3RyY21wKHJlbW90ZV9yZWYtPm5hbWUsIHN5bXJlZikpCisJCQlyZXR1cm4gZXJyb3IoIlJlbW90ZSBicmFuY2ggJXMgaXMgdGhlIGN1cnJlbnQgSEVBRCIsCisJCQkJICAgICByZW1vdGVfcmVmLT5uYW1lKTsKKwkJZmV0Y2hfc3ltcmVmKHN5bXJlZiwgJnN5bXJlZiwgaGVhZF9zaGExKTsKKwl9CisKKwkvKiBSdW4gZXh0cmEgc2FuaXR5IGNoZWNrcyBpZiBkZWxldGUgaXMgbm90IGZvcmNlZCAqLworCWlmICghZm9yY2UpIHsKKwkJLyogUmVtb3RlIEhFQUQgbXVzdCByZXNvbHZlIHRvIGEga25vd24gb2JqZWN0ICovCisJCWlmIChzeW1yZWYpCisJCQlyZXR1cm4gZXJyb3IoIlJlbW90ZSBIRUFEIHN5bXJlZnMgdG9vIGRlZXAiKTsKKwkJaWYgKGlzX3plcm9fc2hhMShoZWFkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSByZW1vdGUgSEVBRCIpOworCQlpZiAoIWhhc19zaGExX2ZpbGUoaGVhZF9zaGExKSkKKwkJCXJldHVybiBlcnJvcigiUmVtb3RlIEhFQUQgcmVzb2x2ZXMgdG8gb2JqZWN0ICVzXG53aGljaCBkb2VzIG5vdCBleGlzdCBsb2NhbGx5LCBwZXJoYXBzIHlvdSBuZWVkIHRvIGZldGNoPyIsIHNoYTFfdG9faGV4KGhlYWRfc2hhMSkpOworCisJCS8qIFJlbW90ZSBicmFuY2ggbXVzdCByZXNvbHZlIHRvIGEga25vd24gb2JqZWN0ICovCisJCWlmIChpc196ZXJvX3NoYTEocmVtb3RlX3JlZi0+b2xkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSByZW1vdGUgYnJhbmNoICVzIiwKKwkJCQkgICAgIHJlbW90ZV9yZWYtPm5hbWUpOworCQlpZiAoIWhhc19zaGExX2ZpbGUocmVtb3RlX3JlZi0+b2xkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJSZW1vdGUgYnJhbmNoICVzIHJlc29sdmVzIHRvIG9iamVjdCAlc1xud2hpY2ggZG9lcyBub3QgZXhpc3QgbG9jYWxseSwgcGVyaGFwcyB5b3UgbmVlZCB0byBmZXRjaD8iLCByZW1vdGVfcmVmLT5uYW1lLCBzaGExX3RvX2hleChyZW1vdGVfcmVmLT5vbGRfc2hhMSkpOworCisJCS8qIFJlbW90ZSBicmFuY2ggbXVzdCBiZSBhbiBhbmNlc3RvciBvZiByZW1vdGUgSEVBRCAqLworCQlpZiAoIXZlcmlmeV9tZXJnZV9iYXNlKGhlYWRfc2hhMSwgcmVtb3RlX3JlZi0+b2xkX3NoYTEpKSB7CisJCQlyZXR1cm4gZXJyb3IoIlRoZSBicmFuY2ggJyVzJyBpcyBub3QgYSBzdHJpY3Qgc3Vic2V0IG9mIHlvdXIgY3VycmVudCBIRUFELlxuSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBpdCwgcnVuOlxuXHQnZ2l0IGh0dHAtcHVzaCAtRCAlcyAlcyciLCByZW1vdGVfcmVmLT5uYW1lLCByZW1vdGUtPnVybCwgcGF0dGVybik7CisJCX0KKwl9CisKKwkvKiBTZW5kIGRlbGV0ZSByZXF1ZXN0ICovCisJZnByaW50ZihzdGRlcnIsICJSZW1vdmluZyByZW1vdGUgYnJhbmNoICclcydcbiIsIHJlbW90ZV9yZWYtPm5hbWUpOworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIHN0cmxlbihyZW1vdGVfcmVmLT5uYW1lKSArIDEpOworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCByZW1vdGVfcmVmLT5uYW1lKTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9ERUxFVEUpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWZyZWUodXJsKTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spCisJCQlyZXR1cm4gZXJyb3IoIkRFTEVURSByZXF1ZXN0IGZhaWxlZCAoJWQvJWxkKVxuIiwKKwkJCQkgICAgIHJlc3VsdHMuY3VybF9yZXN1bHQsIHJlc3VsdHMuaHR0cF9jb2RlKTsKKwl9IGVsc2UgeworCQlmcmVlKHVybCk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IERFTEVURSByZXF1ZXN0Iik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqbmV4dF9yZXF1ZXN0OworCWludCBucl9yZWZzcGVjID0gMDsKKwljaGFyICoqcmVmc3BlYyA9IE5VTEw7CisJc3RydWN0IHJlbW90ZV9sb2NrICpyZWZfbG9jayA9IE5VTEw7CisJc3RydWN0IHJlbW90ZV9sb2NrICppbmZvX3JlZl9sb2NrID0gTlVMTDsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwlpbnQgZGVsZXRlX2JyYW5jaCA9IDA7CisJaW50IGZvcmNlX2RlbGV0ZSA9IDA7CisJaW50IG9iamVjdHNfdG9fc2VuZDsKKwlpbnQgcmMgPSAwOworCWludCBpOworCWludCBuZXdfcmVmczsKKwlzdHJ1Y3QgcmVmICpyZWY7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJc2V0dXBfaWRlbnQoKTsKKworCXJlbW90ZSA9IHhjYWxsb2Moc2l6ZW9mKCpyZW1vdGUpLCAxKTsKKworCWFyZ3YrKzsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrLCBhcmd2KyspIHsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJcHVzaF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mb3JjZSIpKSB7CisJCQkJZm9yY2VfYWxsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQkJcHVzaF92ZXJib3NlbHkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLWQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLUQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWZvcmNlX2RlbGV0ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKCFyZW1vdGUtPnVybCkgeworCQkJY2hhciAqcGF0aCA9IHN0cnN0cihhcmcsICIvLyIpOworCQkJcmVtb3RlLT51cmwgPSBhcmc7CisJCQlpZiAocGF0aCkgeworCQkJCXBhdGggPSBzdHJjaHIocGF0aCsyLCAnLycpOworCQkJCWlmIChwYXRoKQorCQkJCQlyZW1vdGUtPnBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJcmVmc3BlYyA9IGFyZ3Y7CisJCW5yX3JlZnNwZWMgPSBhcmdjIC0gaTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZW1vdGUtPnVybCkKKwkJdXNhZ2UoaHR0cF9wdXNoX3VzYWdlKTsKKworCWlmIChkZWxldGVfYnJhbmNoICYmIG5yX3JlZnNwZWMgIT0gMSkKKwkJZGllKCJZb3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIGJyYW5jaCBuYW1lIHdoZW4gZGVsZXRpbmcgYSByZW1vdGUgYnJhbmNoIik7CisKKwltZW1zZXQocmVtb3RlX2Rpcl9leGlzdHMsIC0xLCAyNTYpOworCisJaHR0cF9pbml0KCk7CisKKwlub19wcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQobm9fcHJhZ21hX2hlYWRlciwgIlByYWdtYToiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJSYW5nZToiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJEZXN0aW5hdGlvbjoiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJJZjoiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsCisJCQkJCSAgICAiUHJhZ21hOiBuby1jYWNoZSIpOworCisJLyogVmVyaWZ5IERBViBjb21wbGlhbmNlL2xvY2sgc3VwcG9ydCAqLworCWlmICghbG9ja2luZ19hdmFpbGFibGUoKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyBEQVYgbG9ja2luZyBzdXBwb3J0IG9uIHJlbW90ZSByZXBvICVzXG4iLCByZW1vdGUtPnVybCk7CisJCXJjID0gMTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHJlbW90ZSBoYXMgc2VydmVyIGluZm8gZmlsZXMgKi8KKwlyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzID0gMDsKKwlyZW1vdGUtPmhhc19pbmZvX3JlZnMgPSByZW1vdGVfZXhpc3RzKCJpbmZvL3JlZnMiKTsKKwlyZW1vdGUtPmhhc19pbmZvX3BhY2tzID0gcmVtb3RlX2V4aXN0cygib2JqZWN0cy9pbmZvL3BhY2tzIik7CisJaWYgKHJlbW90ZS0+aGFzX2luZm9fcmVmcykgeworCQlpbmZvX3JlZl9sb2NrID0gbG9ja19yZW1vdGUoImluZm8vcmVmcyIsIExPQ0tfVElNRSk7CisJCWlmIChpbmZvX3JlZl9sb2NrKQorCQkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDE7CisJfQorCWlmIChyZW1vdGUtPmhhc19pbmZvX3BhY2tzKQorCQlmZXRjaF9pbmRpY2VzKCk7CisKKwkvKiBHZXQgYSBsaXN0IG9mIGFsbCBsb2NhbCBhbmQgcmVtb3RlIGhlYWRzIHRvIHZhbGlkYXRlIHJlZnNwZWNzICovCisJZ2V0X2xvY2FsX2hlYWRzKCk7CisJZnByaW50ZihzdGRlcnIsICJGZXRjaGluZyByZW1vdGUgaGVhZHMuLi5cbiIpOworCWdldF9kYXZfcmVtb3RlX2hlYWRzKCk7CisKKwkvKiBSZW1vdmUgYSByZW1vdGUgYnJhbmNoIGlmIC1kIG9yIC1EIHdhcyBzcGVjaWZpZWQgKi8KKwlpZiAoZGVsZXRlX2JyYW5jaCkgeworCQlpZiAoZGVsZXRlX3JlbW90ZV9icmFuY2gocmVmc3BlY1swXSwgZm9yY2VfZGVsZXRlKSA9PSAtMSkKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGRlbGV0ZSByZW1vdGUgYnJhbmNoICVzXG4iLAorCQkJCXJlZnNwZWNbMF0pOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogbWF0Y2ggdGhlbSB1cCAqLworCWlmICghcmVtb3RlX3RhaWwpCisJCXJlbW90ZV90YWlsID0gJnJlbW90ZV9yZWZzOworCWlmIChtYXRjaF9yZWZzKGxvY2FsX3JlZnMsIHJlbW90ZV9yZWZzLCAmcmVtb3RlX3RhaWwsCisJCSAgICAgICBucl9yZWZzcGVjLCByZWZzcGVjLCBwdXNoX2FsbCkpCisJCXJldHVybiAtMTsKKwlpZiAoIXJlbW90ZV9yZWZzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gcmVmcyBpbiBjb21tb24gYW5kIG5vbmUgc3BlY2lmaWVkOyBkb2luZyBub3RoaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKworCW5ld19yZWZzID0gMDsKKwlmb3IgKHJlZiA9IHJlbW90ZV9yZWZzOyByZWY7IHJlZiA9IHJlZi0+bmV4dCkgeworCQljaGFyIG9sZF9oZXhbNjBdLCAqbmV3X2hleDsKKwkJY29uc3QgY2hhciAqY29tbWl0X2FyZ3ZbNF07CisJCWludCBjb21taXRfYXJnYzsKKwkJY2hhciAqbmV3X3NoYTFfaGV4LCAqb2xkX3NoYTFfaGV4OworCisJCWlmICghcmVmLT5wZWVyX3JlZikKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1lbWNtcChyZWYtPm9sZF9zaGExLCByZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwgMjApKSB7CisJCQlpZiAocHVzaF92ZXJib3NlbHkgfHwgMSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiclcyc6IHVwLXRvLWRhdGVcbiIsIHJlZi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZm9yY2VfYWxsICYmCisJCSAgICAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpICYmCisJCSAgICAhcmVmLT5mb3JjZSkgeworCQkJaWYgKCFoYXNfc2hhMV9maWxlKHJlZi0+b2xkX3NoYTEpIHx8CisJCQkgICAgIXJlZl9uZXdlcihyZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwKKwkJCQkgICAgICAgcmVmLT5vbGRfc2hhMSkpIHsKKwkJCQkvKiBXZSBkbyBub3QgaGF2ZSB0aGUgcmVtb3RlIHJlZiwgb3IKKwkJCQkgKiB3ZSBrbm93IHRoYXQgdGhlIHJlbW90ZSByZWYgaXMgbm90CisJCQkJICogYW4gYW5jZXN0b3Igb2Ygd2hhdCB3ZSBhcmUgdHJ5aW5nIHRvCisJCQkJICogcHVzaC4gIEVpdGhlciB3YXkgdGhpcyBjYW4gYmUgbG9zaW5nCisJCQkJICogY29tbWl0cyBhdCB0aGUgcmVtb3RlIGVuZCBhbmQgbGlrZWx5CisJCQkJICogd2Ugd2VyZSBub3QgdXAgdG8gZGF0ZSB0byBiZWdpbiB3aXRoLgorCQkJCSAqLworCQkJCWVycm9yKCJyZW1vdGUgJyVzJyBpcyBub3QgYSBzdHJpY3QgIgorCQkJCSAgICAgICJzdWJzZXQgb2YgbG9jYWwgcmVmICclcycuICIKKwkJCQkgICAgICAibWF5YmUgeW91IGFyZSBub3QgdXAtdG8tZGF0ZSBhbmQgIgorCQkJCSAgICAgICJuZWVkIHRvIHB1bGwgZmlyc3Q/IiwKKwkJCQkgICAgICByZWYtPm5hbWUsCisJCQkJICAgICAgcmVmLT5wZWVyX3JlZi0+bmFtZSk7CisJCQkJcmMgPSAtMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQltZW1jcHkocmVmLT5uZXdfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEsIDIwKTsKKwkJaWYgKGlzX3plcm9fc2hhMShyZWYtPm5ld19zaGExKSkgeworCQkJZXJyb3IoImNhbm5vdCBoYXBwZW4gYW55bW9yZSIpOworCQkJcmMgPSAtMzsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5ld19yZWZzKys7CisJCXN0cmNweShvbGRfaGV4LCBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSk7CisJCW5ld19oZXggPSBzaGExX3RvX2hleChyZWYtPm5ld19zaGExKTsKKworCQlmcHJpbnRmKHN0ZGVyciwgInVwZGF0aW5nICclcyciLCByZWYtPm5hbWUpOworCQlpZiAoc3RyY21wKHJlZi0+bmFtZSwgcmVmLT5wZWVyX3JlZi0+bmFtZSkpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiB1c2luZyAnJXMnIiwgcmVmLT5wZWVyX3JlZi0+bmFtZSk7CisJCWZwcmludGYoc3RkZXJyLCAiXG4gIGZyb20gJXNcbiAgdG8gICAlc1xuIiwgb2xkX2hleCwgbmV3X2hleCk7CisKKworCQkvKiBMb2NrIHJlbW90ZSBicmFuY2ggcmVmICovCisJCXJlZl9sb2NrID0gbG9ja19yZW1vdGUocmVmLT5uYW1lLCBMT0NLX1RJTUUpOworCQlpZiAocmVmX2xvY2sgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9jayByZW1vdGUgYnJhbmNoICVzXG4iLAorCQkJCXJlZi0+bmFtZSk7CisJCQlyYyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFNldCB1cCByZXZpc2lvbiBpbmZvIGZvciB0aGlzIHJlZnNwZWMgKi8KKwkJY29tbWl0X2FyZ2MgPSAzOworCQluZXdfc2hhMV9oZXggPSBzdHJkdXAoc2hhMV90b19oZXgocmVmLT5uZXdfc2hhMSkpOworCQlvbGRfc2hhMV9oZXggPSBOVUxMOworCQljb21taXRfYXJndlsxXSA9ICItLW9iamVjdHMiOworCQljb21taXRfYXJndlsyXSA9IG5ld19zaGExX2hleDsKKwkJaWYgKCFwdXNoX2FsbCAmJiAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpKSB7CisJCQlvbGRfc2hhMV9oZXggPSB4bWFsbG9jKDQyKTsKKwkJCXNwcmludGYob2xkX3NoYTFfaGV4LCAiXiVzIiwKKwkJCQlzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSk7CisJCQljb21taXRfYXJndlszXSA9IG9sZF9zaGExX2hleDsKKwkJCWNvbW1pdF9hcmdjKys7CisJCX0KKwkJaW5pdF9yZXZpc2lvbnMoJnJldnMpOworCQlzZXR1cF9yZXZpc2lvbnMoY29tbWl0X2FyZ2MsIGNvbW1pdF9hcmd2LCAmcmV2cywgTlVMTCk7CisJCWZyZWUobmV3X3NoYTFfaGV4KTsKKwkJaWYgKG9sZF9zaGExX2hleCkgeworCQkJZnJlZShvbGRfc2hhMV9oZXgpOworCQkJY29tbWl0X2FyZ3ZbMV0gPSBOVUxMOworCQl9CisKKwkJLyogR2VuZXJhdGUgYSBsaXN0IG9mIG9iamVjdHMgdGhhdCBuZWVkIHRvIGJlIHB1c2hlZCAqLworCQlwdXNoaW5nID0gMDsKKwkJcHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKTsKKwkJbWFya19lZGdlc191bmludGVyZXN0aW5nKHJldnMuY29tbWl0cyk7CisJCW9iamVjdHNfdG9fc2VuZCA9IGdldF9kZWx0YSgmcmV2cywgcmVmX2xvY2spOworCQlmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cygpOworCisJCS8qIFB1c2ggbWlzc2luZyBvYmplY3RzIHRvIHJlbW90ZSwgdGhpcyB3b3VsZCBiZSBhCisJCSAgIGNvbnZlbmllbnQgdGltZSB0byBwYWNrIHRoZW0gZmlyc3QgaWYgYXBwcm9wcmlhdGUuICovCisJCXB1c2hpbmcgPSAxOworCQlpZiAob2JqZWN0c190b19zZW5kKQorCQkJZnByaW50ZihzdGRlcnIsICIgICAgc2VuZGluZyAlZCBvYmplY3RzXG4iLAorCQkJCW9iamVjdHNfdG9fc2VuZCk7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwkJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorCQlmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cygpOworCisJCS8qIFVwZGF0ZSB0aGUgcmVtb3RlIGJyYW5jaCBpZiBhbGwgd2VudCB3ZWxsICovCisJCWlmIChhYm9ydGVkIHx8ICF1cGRhdGVfcmVtb3RlKHJlZi0+bmV3X3NoYTEsIHJlZl9sb2NrKSkgeworCQkJcmMgPSAxOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCXVubG9jazoKKwkJaWYgKCFyYykKKwkJCWZwcmludGYoc3RkZXJyLCAiICAgIGRvbmVcbiIpOworCQl1bmxvY2tfcmVtb3RlKHJlZl9sb2NrKTsKKwkJY2hlY2tfbG9ja3MoKTsKKwl9CisKKwkvKiBVcGRhdGUgcmVtb3RlIHNlcnZlciBpbmZvIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKHJlbW90ZS0+aGFzX2luZm9fcmVmcyAmJiBuZXdfcmVmcykgeworCQlpZiAoaW5mb19yZWZfbG9jayAmJiByZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVwZGF0aW5nIHJlbW90ZSBzZXJ2ZXIgaW5mb1xuIik7CisJCQl1cGRhdGVfcmVtb3RlX2luZm9fcmVmcyhpbmZvX3JlZl9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHVwZGF0ZSBzZXJ2ZXIgaW5mb1xuIik7CisJCX0KKwl9CisJaWYgKGluZm9fcmVmX2xvY2spCisJCXVubG9ja19yZW1vdGUoaW5mb19yZWZfbG9jayk7CisKKyBjbGVhbnVwOgorCWZyZWUocmVtb3RlKTsKKworCWN1cmxfc2xpc3RfZnJlZV9hbGwobm9fcHJhZ21hX2hlYWRlcik7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkZWZhdWx0X2hlYWRlcnMpOworCisJaHR0cF9jbGVhbnVwKCk7CisKKwlyZXF1ZXN0ID0gcmVxdWVzdF9xdWV1ZV9oZWFkOworCXdoaWxlIChyZXF1ZXN0ICE9IE5VTEwpIHsKKwkJbmV4dF9yZXF1ZXN0ID0gcmVxdWVzdC0+bmV4dDsKKwkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQlyZXF1ZXN0ID0gbmV4dF9yZXF1ZXN0OworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2h0dHAuYyBiL2h0dHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc2OWNjCi0tLSAvZGV2L251bGwKKysrIGIvaHR0cC5jCkBAIC0wLDAgKzEsNDg0IEBACisjaW5jbHVkZSAiaHR0cC5oIgorCitpbnQgZGF0YV9yZWNlaXZlZDsKK2ludCBhY3RpdmVfcmVxdWVzdHMgPSAwOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK2ludCBtYXhfcmVxdWVzdHMgPSAtMTsKK0NVUkxNICpjdXJsbTsKKyNlbmRpZgorI2lmbmRlZiBOT19DVVJMX0VBU1lfRFVQSEFORExFCitDVVJMICpjdXJsX2RlZmF1bHQ7CisjZW5kaWYKK2NoYXIgY3VybF9lcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCitpbnQgY3VybF9zc2xfdmVyaWZ5ID0gLTE7CitjaGFyICpzc2xfY2VydCA9IE5VTEw7CisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwMgorY2hhciAqc3NsX2tleSA9IE5VTEw7CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CitjaGFyICpzc2xfY2FwYXRoID0gTlVMTDsKKyNlbmRpZgorY2hhciAqc3NsX2NhaW5mbyA9IE5VTEw7Citsb25nIGN1cmxfbG93X3NwZWVkX2xpbWl0ID0gLTE7Citsb25nIGN1cmxfbG93X3NwZWVkX3RpbWUgPSAtMTsKKworc3RydWN0IGN1cmxfc2xpc3QgKnByYWdtYV9oZWFkZXI7CisKK3N0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICphY3RpdmVfcXVldWVfaGVhZCA9IE5VTEw7CisKK3NpemVfdCBmcmVhZF9idWZmZXIodm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwgc2l6ZV90IG5tZW1iLAorCQkJICAgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQoreworCXNpemVfdCBzaXplID0gZWx0c2l6ZSAqIG5tZW1iOworCWlmIChzaXplID4gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5wb3NuKQorCQlzaXplID0gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5wb3NuOworCW1lbWNweShwdHIsIGJ1ZmZlci0+YnVmZmVyICsgYnVmZmVyLT5wb3NuLCBzaXplKTsKKwlidWZmZXItPnBvc24gKz0gc2l6ZTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc2l6ZV90IGZ3cml0ZV9idWZmZXIoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwKKwkJCSAgICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcikKK3sKKwlzaXplX3Qgc2l6ZSA9IGVsdHNpemUgKiBubWVtYjsKKwlpZiAoc2l6ZSA+IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+cG9zbikgeworCQlidWZmZXItPnNpemUgPSBidWZmZXItPnNpemUgKiAzIC8gMjsKKwkJaWYgKGJ1ZmZlci0+c2l6ZSA8IGJ1ZmZlci0+cG9zbiArIHNpemUpCisJCQlidWZmZXItPnNpemUgPSBidWZmZXItPnBvc24gKyBzaXplOworCQlidWZmZXItPmJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlci0+YnVmZmVyLCBidWZmZXItPnNpemUpOworCX0KKwltZW1jcHkoYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPnBvc24sIHB0ciwgc2l6ZSk7CisJYnVmZmVyLT5wb3NuICs9IHNpemU7CisJZGF0YV9yZWNlaXZlZCsrOworCXJldHVybiBzaXplOworfQorCitzaXplX3QgZndyaXRlX251bGwoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwKKwkJCSAgc2l6ZV90IG5tZW1iLCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCit7CisJZGF0YV9yZWNlaXZlZCsrOworCXJldHVybiBlbHRzaXplICogbm1lbWI7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCk7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorc3RhdGljIHZvaWQgcHJvY2Vzc19jdXJsX21lc3NhZ2VzKHZvaWQpCit7CisJaW50IG51bV9tZXNzYWdlczsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlDVVJMTXNnICpjdXJsX21lc3NhZ2UgPSBjdXJsX211bHRpX2luZm9fcmVhZChjdXJsbSwgJm51bV9tZXNzYWdlcyk7CisKKwl3aGlsZSAoY3VybF9tZXNzYWdlICE9IE5VTEwpIHsKKwkJaWYgKGN1cmxfbWVzc2FnZS0+bXNnID09IENVUkxNU0dfRE9ORSkgeworCQkJaW50IGN1cmxfcmVzdWx0ID0gY3VybF9tZXNzYWdlLT5kYXRhLnJlc3VsdDsKKwkJCXNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwkJCXdoaWxlIChzbG90ICE9IE5VTEwgJiYKKwkJCSAgICAgICBzbG90LT5jdXJsICE9IGN1cmxfbWVzc2FnZS0+ZWFzeV9oYW5kbGUpCisJCQkJc2xvdCA9IHNsb3QtPm5leHQ7CisJCQlpZiAoc2xvdCAhPSBOVUxMKSB7CisJCQkJY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKGN1cmxtLCBzbG90LT5jdXJsKTsKKwkJCQlzbG90LT5jdXJsX3Jlc3VsdCA9IGN1cmxfcmVzdWx0OworCQkJCWZpbmlzaF9hY3RpdmVfc2xvdChzbG90KTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJSZWNlaXZlZCBET05FIG1lc3NhZ2UgZm9yIHVua25vd24gcmVxdWVzdCFcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIENVUkwgbWVzc2FnZSByZWNlaXZlZDogJWRcbiIsCisJCQkJKGludCljdXJsX21lc3NhZ2UtPm1zZyk7CisJCX0KKwkJY3VybF9tZXNzYWdlID0gY3VybF9tdWx0aV9pbmZvX3JlYWQoY3VybG0sICZudW1fbWVzc2FnZXMpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGh0dHBfb3B0aW9ucyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKCJodHRwLnNzbHZlcmlmeSIsIHZhcikpIHsKKwkJaWYgKGN1cmxfc3NsX3ZlcmlmeSA9PSAtMSkgeworCQkJY3VybF9zc2xfdmVyaWZ5ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKCJodHRwLnNzbGNlcnQiLCB2YXIpKSB7CisJCWlmIChzc2xfY2VydCA9PSBOVUxMKSB7CisJCQlzc2xfY2VydCA9IHhtYWxsb2Moc3RybGVuKHZhbHVlKSsxKTsKKwkJCXN0cmNweShzc2xfY2VydCwgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTAyCisJaWYgKCFzdHJjbXAoImh0dHAuc3Nsa2V5IiwgdmFyKSkgeworCQlpZiAoc3NsX2tleSA9PSBOVUxMKSB7CisJCQlzc2xfa2V5ID0geG1hbGxvYyhzdHJsZW4odmFsdWUpKzEpOworCQkJc3RyY3B5KHNzbF9rZXksIHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CisJaWYgKCFzdHJjbXAoImh0dHAuc3NsY2FwYXRoIiwgdmFyKSkgeworCQlpZiAoc3NsX2NhcGF0aCA9PSBOVUxMKSB7CisJCQlzc2xfY2FwYXRoID0geG1hbGxvYyhzdHJsZW4odmFsdWUpKzEpOworCQkJc3RyY3B5KHNzbF9jYXBhdGgsIHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwlpZiAoIXN0cmNtcCgiaHR0cC5zc2xjYWluZm8iLCB2YXIpKSB7CisJCWlmIChzc2xfY2FpbmZvID09IE5VTEwpIHsKKwkJCXNzbF9jYWluZm8gPSB4bWFsbG9jKHN0cmxlbih2YWx1ZSkrMSk7CisJCQlzdHJjcHkoc3NsX2NhaW5mbywgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCQorCWlmICghc3RyY21wKCJodHRwLm1heHJlcXVlc3RzIiwgdmFyKSkgeworCQlpZiAobWF4X3JlcXVlc3RzID09IC0xKQorCQkJbWF4X3JlcXVlc3RzID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJaWYgKCFzdHJjbXAoImh0dHAubG93c3BlZWRsaW1pdCIsIHZhcikpIHsKKwkJaWYgKGN1cmxfbG93X3NwZWVkX2xpbWl0ID09IC0xKQorCQkJY3VybF9sb3dfc3BlZWRfbGltaXQgPSAobG9uZylnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKCJodHRwLmxvd3NwZWVkdGltZSIsIHZhcikpIHsKKwkJaWYgKGN1cmxfbG93X3NwZWVkX3RpbWUgPT0gLTEpCisJCQljdXJsX2xvd19zcGVlZF90aW1lID0gKGxvbmcpZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZhbGwgYmFjayBvbiB0aGUgZGVmYXVsdCBvbmVzICovCisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIENVUkwqIGdldF9jdXJsX2hhbmRsZSh2b2lkKQoreworCUNVUkwqIHJlc3VsdCA9IGN1cmxfZWFzeV9pbml0KCk7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgY3VybF9zc2xfdmVyaWZ5KTsKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA3CisJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfTkVUUkMsIENVUkxfTkVUUkNfT1BUSU9OQUwpOworI2VuZGlmCisKKwlpZiAoc3NsX2NlcnQgIT0gTlVMTCkKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfU1NMQ0VSVCwgc3NsX2NlcnQpOworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDIKKwlpZiAoc3NsX2tleSAhPSBOVUxMKQorCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9TU0xLRVksIHNzbF9rZXkpOworI2VuZGlmCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwOAorCWlmIChzc2xfY2FwYXRoICE9IE5VTEwpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0NBUEFUSCwgc3NsX2NhcGF0aCk7CisjZW5kaWYKKwlpZiAoc3NsX2NhaW5mbyAhPSBOVUxMKQorCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9DQUlORk8sIHNzbF9jYWluZm8pOworCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0ZBSUxPTkVSUk9SLCAxKTsKKworCWlmIChjdXJsX2xvd19zcGVlZF9saW1pdCA+IDAgJiYgY3VybF9sb3dfc3BlZWRfdGltZSA+IDApIHsKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfTE9XX1NQRUVEX0xJTUlULAorCQkJCSBjdXJsX2xvd19zcGVlZF9saW1pdCk7CisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0xPV19TUEVFRF9USU1FLAorCQkJCSBjdXJsX2xvd19zcGVlZF90aW1lKTsKKwl9CisKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7CisKKwlpZiAoZ2V0ZW52KCJHSVRfQ1VSTF9WRVJCT1NFIikpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX1ZFUkJPU0UsIDEpOworCisJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfVVNFUkFHRU5ULCBHSVRfVVNFUl9BR0VOVCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGh0dHBfaW5pdCh2b2lkKQoreworCWNoYXIgKmxvd19zcGVlZF9saW1pdDsKKwljaGFyICpsb3dfc3BlZWRfdGltZTsKKworCWN1cmxfZ2xvYmFsX2luaXQoQ1VSTF9HTE9CQUxfQUxMKTsKKworCXByYWdtYV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChwcmFnbWFfaGVhZGVyLCAiUHJhZ21hOiBuby1jYWNoZSIpOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwl7CisJCWNoYXIgKmh0dHBfbWF4X3JlcXVlc3RzID0gZ2V0ZW52KCJHSVRfSFRUUF9NQVhfUkVRVUVTVFMiKTsKKwkJaWYgKGh0dHBfbWF4X3JlcXVlc3RzICE9IE5VTEwpCisJCQltYXhfcmVxdWVzdHMgPSBhdG9pKGh0dHBfbWF4X3JlcXVlc3RzKTsKKwl9CisKKwljdXJsbSA9IGN1cmxfbXVsdGlfaW5pdCgpOworCWlmIChjdXJsbSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgY3VybCBtdWx0aSBoYW5kbGUuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisjZW5kaWYKKworCWlmIChnZXRlbnYoIkdJVF9TU0xfTk9fVkVSSUZZIikpCisJCWN1cmxfc3NsX3ZlcmlmeSA9IDA7CisKKwlzc2xfY2VydCA9IGdldGVudigiR0lUX1NTTF9DRVJUIik7CisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwMgorCXNzbF9rZXkgPSBnZXRlbnYoIkdJVF9TU0xfS0VZIik7CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CisJc3NsX2NhcGF0aCA9IGdldGVudigiR0lUX1NTTF9DQVBBVEgiKTsKKyNlbmRpZgorCXNzbF9jYWluZm8gPSBnZXRlbnYoIkdJVF9TU0xfQ0FJTkZPIik7CisKKwlsb3dfc3BlZWRfbGltaXQgPSBnZXRlbnYoIkdJVF9IVFRQX0xPV19TUEVFRF9MSU1JVCIpOworCWlmIChsb3dfc3BlZWRfbGltaXQgIT0gTlVMTCkKKwkJY3VybF9sb3dfc3BlZWRfbGltaXQgPSBzdHJ0b2wobG93X3NwZWVkX2xpbWl0LCBOVUxMLCAxMCk7CisJbG93X3NwZWVkX3RpbWUgPSBnZXRlbnYoIkdJVF9IVFRQX0xPV19TUEVFRF9USU1FIik7CisJaWYgKGxvd19zcGVlZF90aW1lICE9IE5VTEwpCisJCWN1cmxfbG93X3NwZWVkX3RpbWUgPSBzdHJ0b2wobG93X3NwZWVkX3RpbWUsIE5VTEwsIDEwKTsKKworCWdpdF9jb25maWcoaHR0cF9vcHRpb25zKTsKKworCWlmIChjdXJsX3NzbF92ZXJpZnkgPT0gLTEpCisJCWN1cmxfc3NsX3ZlcmlmeSA9IDE7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWlmIChtYXhfcmVxdWVzdHMgPCAxKQorCQltYXhfcmVxdWVzdHMgPSBERUZBVUxUX01BWF9SRVFVRVNUUzsKKyNlbmRpZgorCisjaWZuZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKKwljdXJsX2RlZmF1bHQgPSBnZXRfY3VybF9oYW5kbGUoKTsKKyNlbmRpZgorfQorCit2b2lkIGh0dHBfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwljaGFyICp3YWl0X3VybDsKKyNlbmRpZgorCisJd2hpbGUgKHNsb3QgIT0gTlVMTCkgeworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJCWlmIChzbG90LT5pbl91c2UpIHsKKwkJCWN1cmxfZWFzeV9nZXRpbmZvKHNsb3QtPmN1cmwsCisJCQkJCSAgQ1VSTElORk9fRUZGRUNUSVZFX1VSTCwKKwkJCQkJICAmd2FpdF91cmwpOworCQkJZnByaW50ZihzdGRlcnIsICJXYWl0aW5nIGZvciAlc1xuIiwgd2FpdF91cmwpOworCQkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQl9CisjZW5kaWYKKwkJaWYgKHNsb3QtPmN1cmwgIT0gTlVMTCkKKwkJCWN1cmxfZWFzeV9jbGVhbnVwKHNsb3QtPmN1cmwpOworCQlzbG90ID0gc2xvdC0+bmV4dDsKKwl9CisKKyNpZm5kZWYgTk9fQ1VSTF9FQVNZX0RVUEhBTkRMRQorCWN1cmxfZWFzeV9jbGVhbnVwKGN1cmxfZGVmYXVsdCk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJY3VybF9tdWx0aV9jbGVhbnVwKGN1cmxtKTsKKyNlbmRpZgorCWN1cmxfZ2xvYmFsX2NsZWFudXAoKTsKKworCWN1cmxfc2xpc3RfZnJlZV9hbGwocHJhZ21hX2hlYWRlcik7Cit9CisKK3N0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpnZXRfYWN0aXZlX3Nsb3Qodm9pZCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpuZXdzbG90OworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlpbnQgbnVtX3RyYW5zZmVyczsKKworCS8qIFdhaXQgZm9yIGEgc2xvdCB0byBvcGVuIHVwIGlmIHRoZSBxdWV1ZSBpcyBmdWxsICovCisJd2hpbGUgKGFjdGl2ZV9yZXF1ZXN0cyA+PSBtYXhfcmVxdWVzdHMpIHsKKwkJY3VybF9tdWx0aV9wZXJmb3JtKGN1cmxtLCAmbnVtX3RyYW5zZmVycyk7CisJCWlmIChudW1fdHJhbnNmZXJzIDwgYWN0aXZlX3JlcXVlc3RzKSB7CisJCQlwcm9jZXNzX2N1cmxfbWVzc2FnZXMoKTsKKwkJfQorCX0KKyNlbmRpZgorCisJd2hpbGUgKHNsb3QgIT0gTlVMTCAmJiBzbG90LT5pbl91c2UpIHsKKwkJc2xvdCA9IHNsb3QtPm5leHQ7CisJfQorCWlmIChzbG90ID09IE5VTEwpIHsKKwkJbmV3c2xvdCA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdzbG90KSk7CisJCW5ld3Nsb3QtPmN1cmwgPSBOVUxMOworCQluZXdzbG90LT5pbl91c2UgPSAwOworCQluZXdzbG90LT5uZXh0ID0gTlVMTDsKKworCQlzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisJCWlmIChzbG90ID09IE5VTEwpIHsKKwkJCWFjdGl2ZV9xdWV1ZV9oZWFkID0gbmV3c2xvdDsKKwkJfSBlbHNlIHsKKwkJCXdoaWxlIChzbG90LT5uZXh0ICE9IE5VTEwpIHsKKwkJCQlzbG90ID0gc2xvdC0+bmV4dDsKKwkJCX0KKwkJCXNsb3QtPm5leHQgPSBuZXdzbG90OworCQl9CisJCXNsb3QgPSBuZXdzbG90OworCX0KKworCWlmIChzbG90LT5jdXJsID09IE5VTEwpIHsKKyNpZmRlZiBOT19DVVJMX0VBU1lfRFVQSEFORExFCisJCXNsb3QtPmN1cmwgPSBnZXRfY3VybF9oYW5kbGUoKTsKKyNlbHNlCisJCXNsb3QtPmN1cmwgPSBjdXJsX2Vhc3lfZHVwaGFuZGxlKGN1cmxfZGVmYXVsdCk7CisjZW5kaWYKKwl9CisKKwlhY3RpdmVfcmVxdWVzdHMrKzsKKwlzbG90LT5pbl91c2UgPSAxOworCXNsb3QtPmxvY2FsID0gTlVMTDsKKwlzbG90LT5yZXN1bHRzID0gTlVMTDsKKwlzbG90LT5maW5pc2hlZCA9IE5VTEw7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9IE5VTEw7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IE5VTEw7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBwcmFnbWFfaGVhZGVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRVJST1JCVUZGRVIsIGN1cmxfZXJyb3JzdHIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgTlVMTCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCisJcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBzdGFydF9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCkKK3sKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCUNVUkxNY29kZSBjdXJsbV9yZXN1bHQgPSBjdXJsX211bHRpX2FkZF9oYW5kbGUoY3VybG0sIHNsb3QtPmN1cmwpOworCisJaWYgKGN1cmxtX3Jlc3VsdCAhPSBDVVJMTV9PSyAmJgorCSAgICBjdXJsbV9yZXN1bHQgIT0gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNKSB7CisJCWFjdGl2ZV9yZXF1ZXN0cy0tOworCQlzbG90LT5pbl91c2UgPSAwOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCit2b2lkIHN0ZXBfYWN0aXZlX3Nsb3RzKHZvaWQpCit7CisJaW50IG51bV90cmFuc2ZlcnM7CisJQ1VSTE1jb2RlIGN1cmxtX3Jlc3VsdDsKKworCWRvIHsKKwkJY3VybG1fcmVzdWx0ID0gY3VybF9tdWx0aV9wZXJmb3JtKGN1cmxtLCAmbnVtX3RyYW5zZmVycyk7CisJfSB3aGlsZSAoY3VybG1fcmVzdWx0ID09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSk7CisJaWYgKG51bV90cmFuc2ZlcnMgPCBhY3RpdmVfcmVxdWVzdHMpIHsKKwkJcHJvY2Vzc19jdXJsX21lc3NhZ2VzKCk7CisJCWZpbGxfYWN0aXZlX3Nsb3RzKCk7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgcnVuX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KQoreworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJbG9uZyBsYXN0X3BvcyA9IDA7CisJbG9uZyBjdXJyZW50X3BvczsKKwlmZF9zZXQgcmVhZGZkczsKKwlmZF9zZXQgd3JpdGVmZHM7CisJZmRfc2V0IGV4Y2ZkczsKKwlpbnQgbWF4X2ZkOworCXN0cnVjdCB0aW1ldmFsIHNlbGVjdF90aW1lb3V0OworCWludCBmaW5pc2hlZCA9IDA7CisKKwlzbG90LT5maW5pc2hlZCA9ICZmaW5pc2hlZDsKKwl3aGlsZSAoIWZpbmlzaGVkKSB7CisJCWRhdGFfcmVjZWl2ZWQgPSAwOworCQlzdGVwX2FjdGl2ZV9zbG90cygpOworCisJCWlmICghZGF0YV9yZWNlaXZlZCAmJiBzbG90LT5sb2NhbCAhPSBOVUxMKSB7CisJCQljdXJyZW50X3BvcyA9IGZ0ZWxsKHNsb3QtPmxvY2FsKTsKKwkJCWlmIChjdXJyZW50X3BvcyA+IGxhc3RfcG9zKQorCQkJCWRhdGFfcmVjZWl2ZWQrKzsKKwkJCWxhc3RfcG9zID0gY3VycmVudF9wb3M7CisJCX0KKworCQlpZiAoc2xvdC0+aW5fdXNlICYmICFkYXRhX3JlY2VpdmVkKSB7CisJCQltYXhfZmQgPSAwOworCQkJRkRfWkVSTygmcmVhZGZkcyk7CisJCQlGRF9aRVJPKCZ3cml0ZWZkcyk7CisJCQlGRF9aRVJPKCZleGNmZHMpOworCQkJc2VsZWN0X3RpbWVvdXQudHZfc2VjID0gMDsKKwkJCXNlbGVjdF90aW1lb3V0LnR2X3VzZWMgPSA1MDAwMDsKKwkJCXNlbGVjdChtYXhfZmQsICZyZWFkZmRzLCAmd3JpdGVmZHMsCisJCQkgICAgICAgJmV4Y2ZkcywgJnNlbGVjdF90aW1lb3V0KTsKKwkJfQorCX0KKyNlbHNlCisJd2hpbGUgKHNsb3QtPmluX3VzZSkgeworCQlzbG90LT5jdXJsX3Jlc3VsdCA9IGN1cmxfZWFzeV9wZXJmb3JtKHNsb3QtPmN1cmwpOworCQlmaW5pc2hfYWN0aXZlX3Nsb3Qoc2xvdCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGNsb3NlZG93bl9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCkKK3sKKyAgICAgICAgYWN0aXZlX3JlcXVlc3RzLS07CisgICAgICAgIHNsb3QtPmluX3VzZSA9IDA7Cit9CisKK3ZvaWQgcmVsZWFzZV9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCkKK3sKKwljbG9zZWRvd25fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJaWYgKHNsb3QtPmN1cmwpIHsKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCQljdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoY3VybG0sIHNsb3QtPmN1cmwpOworI2VuZGlmCisJCWN1cmxfZWFzeV9jbGVhbnVwKHNsb3QtPmN1cmwpOworCQlzbG90LT5jdXJsID0gTlVMTDsKKwl9CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlmaWxsX2FjdGl2ZV9zbG90cygpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCkKK3sKKwljbG9zZWRvd25fYWN0aXZlX3Nsb3Qoc2xvdCk7CisgICAgICAgIGN1cmxfZWFzeV9nZXRpbmZvKHNsb3QtPmN1cmwsIENVUkxJTkZPX0hUVFBfQ09ERSwgJnNsb3QtPmh0dHBfY29kZSk7CisKKwlpZiAoc2xvdC0+ZmluaXNoZWQgIT0gTlVMTCkKKwkJKCpzbG90LT5maW5pc2hlZCkgPSAxOworCisJLyogU3RvcmUgc2xvdCByZXN1bHRzIHNvIHRoZXkgY2FuIGJlIHJlYWQgYWZ0ZXIgdGhlIHNsb3QgaXMgcmV1c2VkICovCisJaWYgKHNsb3QtPnJlc3VsdHMgIT0gTlVMTCkgeworCQlzbG90LT5yZXN1bHRzLT5jdXJsX3Jlc3VsdCA9IHNsb3QtPmN1cmxfcmVzdWx0OworCQlzbG90LT5yZXN1bHRzLT5odHRwX2NvZGUgPSBzbG90LT5odHRwX2NvZGU7CisJfQorCisgICAgICAgIC8qIFJ1biBjYWxsYmFjayBpZiBhcHByb3ByaWF0ZSAqLworICAgICAgICBpZiAoc2xvdC0+Y2FsbGJhY2tfZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2xvdC0+Y2FsbGJhY2tfZnVuYyhzbG90LT5jYWxsYmFja19kYXRhKTsKKyAgICAgICAgfQorfQorCit2b2lkIGZpbmlzaF9hbGxfYWN0aXZlX3Nsb3RzKHZvaWQpCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKworCXdoaWxlIChzbG90ICE9IE5VTEwpCisJCWlmIChzbG90LT5pbl91c2UpIHsKKwkJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJCXNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwkJfSBlbHNlIHsKKwkJCXNsb3QgPSBzbG90LT5uZXh0OworCQl9Cit9CmRpZmYgLS1naXQgYS9odHRwLmggYi9odHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMTZhYwotLS0gL2Rldi9udWxsCisrKyBiL2h0dHAuaApAQCAtMCwwICsxLDEwNCBAQAorI2lmbmRlZiBIVFRQX0gKKyNkZWZpbmUgSFRUUF9ICisKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjaW5jbHVkZSA8Y3VybC9jdXJsLmg+CisjaW5jbHVkZSA8Y3VybC9lYXN5Lmg+CisKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CisjZGVmaW5lIFVTRV9DVVJMX01VTFRJCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFUVVFU1RTIDUKKyNlbmRpZgorCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA8IDB4MDcwNzA0CisjZGVmaW5lIGN1cmxfZ2xvYmFsX2NsZWFudXAoKSBkbyB7IC8qIG5vdGhpbmcgKi8gfSB3aGlsZSgwKQorI2VuZGlmCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA8IDB4MDcwODAwCisjZGVmaW5lIGN1cmxfZ2xvYmFsX2luaXQoYSkgZG8geyAvKiBub3RoaW5nICovIH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA8IDB4MDcwYzA0CisjZGVmaW5lIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKKyNlbmRpZgorCitzdHJ1Y3Qgc2xvdF9yZXN1bHRzCit7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJbG9uZyBodHRwX2NvZGU7Cit9OworCitzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdAoreworCUNVUkwgKmN1cmw7CisJRklMRSAqbG9jYWw7CisJaW50IGluX3VzZTsKKwlDVVJMY29kZSBjdXJsX3Jlc3VsdDsKKwlsb25nIGh0dHBfY29kZTsKKwlpbnQgKmZpbmlzaGVkOworCXN0cnVjdCBzbG90X3Jlc3VsdHMgKnJlc3VsdHM7CisJdm9pZCAqY2FsbGJhY2tfZGF0YTsKKwl2b2lkICgqY2FsbGJhY2tfZnVuYykodm9pZCAqZGF0YSk7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKm5leHQ7Cit9OworCitzdHJ1Y3QgYnVmZmVyCit7CisgICAgICAgIHNpemVfdCBwb3NuOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgdm9pZCAqYnVmZmVyOworfTsKKworLyogQ3VybCByZXF1ZXN0IHJlYWQvd3JpdGUgY2FsbGJhY2tzICovCitleHRlcm4gc2l6ZV90IGZyZWFkX2J1ZmZlcih2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLCBzaXplX3Qgbm1lbWIsCisJCQkgICBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpOworZXh0ZXJuIHNpemVfdCBmd3JpdGVfYnVmZmVyKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGVsdHNpemUsCisJCQkgICAgc2l6ZV90IG5tZW1iLCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpOworZXh0ZXJuIHNpemVfdCBmd3JpdGVfbnVsbChjb25zdCB2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLAorCQkJICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcik7CisKKy8qIFNsb3QgbGlmZWN5Y2xlIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpnZXRfYWN0aXZlX3Nsb3Qodm9pZCk7CitleHRlcm4gaW50IHN0YXJ0X2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KTsKK2V4dGVybiB2b2lkIHJ1bl9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCk7CitleHRlcm4gdm9pZCBmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cyh2b2lkKTsKK2V4dGVybiB2b2lkIHJlbGVhc2VfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK2V4dGVybiB2b2lkIGZpbGxfYWN0aXZlX3Nsb3RzKHZvaWQpOworZXh0ZXJuIHZvaWQgc3RlcF9hY3RpdmVfc2xvdHModm9pZCk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgaHR0cF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaHR0cF9jbGVhbnVwKHZvaWQpOworCitleHRlcm4gaW50IGRhdGFfcmVjZWl2ZWQ7CitleHRlcm4gaW50IGFjdGl2ZV9yZXF1ZXN0czsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCitleHRlcm4gaW50IG1heF9yZXF1ZXN0czsKK2V4dGVybiBDVVJMTSAqY3VybG07CisjZW5kaWYKKyNpZm5kZWYgTk9fQ1VSTF9FQVNZX0RVUEhBTkRMRQorZXh0ZXJuIENVUkwgKmN1cmxfZGVmYXVsdDsKKyNlbmRpZgorZXh0ZXJuIGNoYXIgY3VybF9lcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCitleHRlcm4gaW50IGN1cmxfc3NsX3ZlcmlmeTsKK2V4dGVybiBjaGFyICpzc2xfY2VydDsKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTAyCitleHRlcm4gY2hhciAqc3NsX2tleTsKKyNlbmRpZgorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDgKK2V4dGVybiBjaGFyICpzc2xfY2FwYXRoOworI2VuZGlmCitleHRlcm4gY2hhciAqc3NsX2NhaW5mbzsKK2V4dGVybiBsb25nIGN1cmxfbG93X3NwZWVkX2xpbWl0OworZXh0ZXJuIGxvbmcgY3VybF9sb3dfc3BlZWRfdGltZTsKKworZXh0ZXJuIHN0cnVjdCBjdXJsX3NsaXN0ICpwcmFnbWFfaGVhZGVyOworZXh0ZXJuIHN0cnVjdCBjdXJsX3NsaXN0ICpub19yYW5nZV9oZWFkZXI7CisKK2V4dGVybiBzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqYWN0aXZlX3F1ZXVlX2hlYWQ7CisKKyNlbmRpZiAvKiBIVFRQX0ggKi8KZGlmZiAtLWdpdCBhL2lkZW50LmMgYi9pZGVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODFmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9pZGVudC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogaWRlbnQuYworICoKKyAqIGNyZWF0ZSBnaXQgaWRlbnRpZmllciBsaW5lcyBvZiB0aGUgZm9ybSAibmFtZSA8ZW1haWw+IGRhdGUiCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IExpbnVzIFRvcnZhbGRzCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworc3RhdGljIGNoYXIgZ2l0X2RlZmF1bHRfZGF0ZVs1MF07CisKK3N0YXRpYyB2b2lkIGNvcHlfZ2Vjb3Moc3RydWN0IHBhc3N3ZCAqdywgY2hhciAqbmFtZSwgaW50IHN6KQoreworCWNoYXIgKnNyYywgKmRzdDsKKwlpbnQgbGVuLCBubGVuOworCisJbmxlbiA9IHN0cmxlbih3LT5wd19uYW1lKTsKKworCS8qIFRyYWRpdGlvbmFsbHkgR0VDT1MgZmllbGQgaGFkIG9mZmljZSBwaG9uZSBudW1iZXJzIGV0Yywgc2VwYXJhdGVkCisJICogd2l0aCBjb21tYXMuICBBbHNvICYgc3RhbmRzIGZvciBjYXBpdGFsaXplZCBmb3JtIG9mIHRoZSBsb2dpbiBuYW1lLgorCSAqLworCisJZm9yIChsZW4gPSAwLCBkc3QgPSBuYW1lLCBzcmMgPSB3LT5wd19nZWNvczsgbGVuIDwgc3o7IHNyYysrKSB7CisJCWludCBjaCA9ICpzcmM7CisJCWlmIChjaCAhPSAnJicpIHsKKwkJCSpkc3QrKyA9IGNoOworCQkJaWYgKGNoID09IDAgfHwgY2ggPT0gJywnKQorCQkJCWJyZWFrOworCQkJbGVuKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGVuICsgbmxlbiA8IHN6KSB7CisJCQkvKiBTb3JyeSwgTXIuIE1jRG9uYWxkLi4uICovCisJCQkqZHN0KysgPSB0b3VwcGVyKCp3LT5wd19uYW1lKTsKKwkJCW1lbWNweShkc3QsIHctPnB3X25hbWUgKyAxLCBubGVuIC0gMSk7CisJCQlkc3QgKz0gbmxlbiAtIDE7CisJCX0KKwl9CisJaWYgKGxlbiA8IHN6KQorCQluYW1lW2xlbl0gPSAwOworCWVsc2UKKwkJZGllKCJZb3VyIHBhcmVudHMgbXVzdCBoYXZlIGhhdGVkIHlvdSEiKTsKKworfQorCitpbnQgc2V0dXBfaWRlbnQodm9pZCkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCisJaWYgKCFwdykKKwkJZGllKCJZb3UgZG9uJ3QgZXhpc3QuIEdvIGF3YXkhIik7CisKKwkvKiBHZXQgdGhlIG5hbWUgKCJnZWNvcyIpICovCisJY29weV9nZWNvcyhwdywgZ2l0X2RlZmF1bHRfbmFtZSwgc2l6ZW9mKGdpdF9kZWZhdWx0X25hbWUpKTsKKworCS8qIE1ha2UgdXAgYSBmYWtlIGVtYWlsIGFkZHJlc3MgKG5hbWUgKyAnQCcgKyBob3N0bmFtZSBbKyAnLicgKyBkb21haW5uYW1lXSkgKi8KKwlsZW4gPSBzdHJsZW4ocHctPnB3X25hbWUpOworCWlmIChsZW4gPiBzaXplb2YoZ2l0X2RlZmF1bHRfZW1haWwpLzIpCisJCWRpZSgiWW91ciBzeXNhZG1pbiBtdXN0IGhhdGUgeW91ISIpOworCW1lbWNweShnaXRfZGVmYXVsdF9lbWFpbCwgcHctPnB3X25hbWUsIGxlbik7CisJZ2l0X2RlZmF1bHRfZW1haWxbbGVuKytdID0gJ0AnOworCWdldGhvc3RuYW1lKGdpdF9kZWZhdWx0X2VtYWlsICsgbGVuLCBzaXplb2YoZ2l0X2RlZmF1bHRfZW1haWwpIC0gbGVuKTsKKwlpZiAoIXN0cmNocihnaXRfZGVmYXVsdF9lbWFpbCtsZW4sICcuJykpIHsKKwkJc3RydWN0IGhvc3RlbnQgKmhlID0gZ2V0aG9zdGJ5bmFtZShnaXRfZGVmYXVsdF9lbWFpbCArIGxlbik7CisJCWNoYXIgKmRvbWFpbm5hbWU7CisKKwkJbGVuID0gc3RybGVuKGdpdF9kZWZhdWx0X2VtYWlsKTsKKwkJZ2l0X2RlZmF1bHRfZW1haWxbbGVuKytdID0gJy4nOworCQlpZiAoaGUgJiYgKGRvbWFpbm5hbWUgPSBzdHJjaHIoaGUtPmhfbmFtZSwgJy4nKSkpCisJCQlzdHJuY3B5KGdpdF9kZWZhdWx0X2VtYWlsICsgbGVuLCBkb21haW5uYW1lICsgMSwgc2l6ZW9mKGdpdF9kZWZhdWx0X2VtYWlsKSAtIGxlbik7CisJCWVsc2UKKwkJCXN0cm5jcHkoZ2l0X2RlZmF1bHRfZW1haWwgKyBsZW4sICIobm9uZSkiLCBzaXplb2YoZ2l0X2RlZmF1bHRfZW1haWwpIC0gbGVuKTsKKwkJZ2l0X2RlZmF1bHRfZW1haWxbc2l6ZW9mKGdpdF9kZWZhdWx0X2VtYWlsKSAtIDFdID0gMDsKKwl9CisJLyogQW5kIHNldCB0aGUgZGVmYXVsdCBkYXRlICovCisJZGF0ZXN0YW1wKGdpdF9kZWZhdWx0X2RhdGUsIHNpemVvZihnaXRfZGVmYXVsdF9kYXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JhdyhjaGFyICpidWYsIGludCBzaXplLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGxlbiA9IHN0cmxlbihzdHIpOworCWlmIChvZmZzZXQgKyBsZW4gPiBzaXplKQorCQlyZXR1cm4gc2l6ZTsKKwltZW1jcHkoYnVmICsgb2Zmc2V0LCBzdHIsIGxlbik7CisJcmV0dXJuIG9mZnNldCArIGxlbjsKK30KKworc3RhdGljIGludCBjcnVkKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlzdGF0aWMgY2hhciBjcnVkX2FycmF5WzI1Nl07CisJc3RhdGljIGludCBjcnVkX2FycmF5X2luaXRpYWxpemVkID0gMDsKKworCWlmICghY3J1ZF9hcnJheV9pbml0aWFsaXplZCkgeworCQlpbnQgazsKKworCQlmb3IgKGsgPSAwOyBrIDw9IDMxOyArK2spIGNydWRfYXJyYXlba10gPSAxOworCQljcnVkX2FycmF5WycgJ10gPSAxOworCQljcnVkX2FycmF5WycuJ10gPSAxOworCQljcnVkX2FycmF5WycsJ10gPSAxOworCQljcnVkX2FycmF5Wyc6J10gPSAxOworCQljcnVkX2FycmF5Wyc7J10gPSAxOworCQljcnVkX2FycmF5Wyc8J10gPSAxOworCQljcnVkX2FycmF5Wyc+J10gPSAxOworCQljcnVkX2FycmF5WyciJ10gPSAxOworCQljcnVkX2FycmF5WydcJyddID0gMTsKKwkJY3J1ZF9hcnJheV9pbml0aWFsaXplZCA9IDE7CisJfQorCXJldHVybiBjcnVkX2FycmF5W2NdOworfQorCisvKgorICogQ29weSBvdmVyIGEgc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiwgYnV0IGF2b2lkIHNwZWNpYWwKKyAqIGNoYXJhY3RlcnMgKCdcbicsICc8JyBhbmQgJz4nKSBhbmQgcmVtb3ZlIGNydWQgYXQgdGhlIGVuZAorICovCitzdGF0aWMgaW50IGNvcHkoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IG9mZnNldCwgY29uc3QgY2hhciAqc3JjKQoreworCWludCBpLCBsZW47CisJdW5zaWduZWQgY2hhciBjOworCisJLyogUmVtb3ZlIGNydWQgZnJvbSB0aGUgYmVnaW5uaW5nLi4gKi8KKwl3aGlsZSAoKGMgPSAqc3JjKSAhPSAwKSB7CisJCWlmICghY3J1ZChjKSkKKwkJCWJyZWFrOworCQlzcmMrKzsKKwl9CisKKwkvKiBSZW1vdmUgY3J1ZCBmcm9tIHRoZSBlbmQuLiAqLworCWxlbiA9IHN0cmxlbihzcmMpOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWMgPSBzcmNbbGVuLTFdOworCQlpZiAoIWNydWQoYykpCisJCQlicmVhazsKKwkJLS1sZW47CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSByZXN0IHRvIHRoZSBidWZmZXIsIGJ1dCBhdm9pZCB0aGUgc3BlY2lhbAorCSAqIGNoYXJhY3RlcnMgJ1xuJyAnPCcgYW5kICc+JyB0aGF0IGFjdCBhcyBkZWxpbWl0ZXJzIG9uCisJICogYSBpZGVudGlmaWNhdGlvbiBsaW5lCisJICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWMgPSAqc3JjKys7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdcbic6IGNhc2UgJzwnOiBjYXNlICc+JzoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJCXJldHVybiBzaXplOworCQlidWZbb2Zmc2V0KytdID0gYzsKKwl9CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgYXVfZW52W10gPSAiR0lUX0FVVEhPUl9OQU1FIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNvX2VudltdID0gIkdJVF9DT01NSVRURVJfTkFNRSI7CitzdGF0aWMgY29uc3QgY2hhciAqZW52X2hpbnQgPQorIlxuKioqIEVudmlyb25tZW50IHByb2JsZW06XG4iCisiKioqIFlvdXIgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIHlvdXIgc3lzdGVtIHNlcnZpY2VzIChnZWNvcykuXG4iCisiKioqIFlvdSB3b3VsZCBuZWVkIHRvIHNldCAlcyBhbmQgJXNcbiIKKyIqKiogZW52aXJvbm1lbnQgdmFyaWFibGVzOyBvdGhlcndpc2UgeW91IHdvbid0IGJlIGFibGUgdG8gcGVyZm9ybVxuIgorIioqKiBjZXJ0YWluIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiBcImVtcHR5IGlkZW50XCIgZXJyb3JzLlxuIgorIioqKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB1c2VyLm5hbWUgY29uZmlndXJhdGlvbiB2YXJpYWJsZS5cblxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9pZGVudChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICplbWFpbCwKKwkJCSAgICAgY29uc3QgY2hhciAqZGF0ZV9zdHIsIGludCBlcnJvcl9vbl9ub19uYW1lKQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDAwXTsKKwljaGFyIGRhdGVbNTBdOworCWludCBpOworCisJaWYgKCFuYW1lKQorCQluYW1lID0gZ2l0X2RlZmF1bHRfbmFtZTsKKwlpZiAoIWVtYWlsKQorCQllbWFpbCA9IGdpdF9kZWZhdWx0X2VtYWlsOworCisJaWYgKCEqbmFtZSkgeworCQlpZiAobmFtZSA9PSBnaXRfZGVmYXVsdF9uYW1lICYmIGVudl9oaW50KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgZW52X2hpbnQsIGF1X2VudiwgY29fZW52KTsKKwkJCWVudl9oaW50ID0gTlVMTDsgLyogd2FybiBvbmx5IG9uY2UsIGZvciAiZ2l0LXZhciAtbCIgKi8KKwkJfQorCQlpZiAoZXJyb3Jfb25fbm9fbmFtZSkKKwkJCWRpZSgiZW1wdHkgaWRlbnQgJXMgPCVzPiBub3QgYWxsb3dlZCIsIG5hbWUsIGVtYWlsKTsKKwl9CisKKwlzdHJjcHkoZGF0ZSwgZ2l0X2RlZmF1bHRfZGF0ZSk7CisJaWYgKGRhdGVfc3RyKQorCQlwYXJzZV9kYXRlKGRhdGVfc3RyLCBkYXRlLCBzaXplb2YoZGF0ZSkpOworCisJaSA9IGNvcHkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCwgbmFtZSk7CisJaSA9IGFkZF9yYXcoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgaSwgIiA8Iik7CisJaSA9IGNvcHkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgaSwgZW1haWwpOworCWkgPSBhZGRfcmF3KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGksICI+ICIpOworCWkgPSBjb3B5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGksIGRhdGUpOworCWlmIChpID49IHNpemVvZihidWZmZXIpKQorCQlkaWUoIkltcG9zc2libHkgbG9uZyBwZXJzb25hbCBpZGVudGlmaWVyIik7CisJYnVmZmVyW2ldID0gMDsKKwlyZXR1cm4gYnVmZmVyOworfQorCitjb25zdCBjaGFyICpnaXRfYXV0aG9yX2luZm8oaW50IGVycm9yX29uX25vX25hbWUpCit7CisJcmV0dXJuIGdldF9pZGVudChnZXRlbnYoIkdJVF9BVVRIT1JfTkFNRSIpLAorCQkJIGdldGVudigiR0lUX0FVVEhPUl9FTUFJTCIpLAorCQkJIGdldGVudigiR0lUX0FVVEhPUl9EQVRFIiksCisJCQkgZXJyb3Jfb25fbm9fbmFtZSk7Cit9CisKK2NvbnN0IGNoYXIgKmdpdF9jb21taXR0ZXJfaW5mbyhpbnQgZXJyb3Jfb25fbm9fbmFtZSkKK3sKKwlyZXR1cm4gZ2V0X2lkZW50KGdldGVudigiR0lUX0NPTU1JVFRFUl9OQU1FIiksCisJCQkgZ2V0ZW52KCJHSVRfQ09NTUlUVEVSX0VNQUlMIiksCisJCQkgZ2V0ZW52KCJHSVRfQ09NTUlUVEVSX0RBVEUiKSwKKwkJCSBlcnJvcl9vbl9ub19uYW1lKTsKK30KZGlmZiAtLWdpdCBhL2ltYXAtc2VuZC5jIGIvaW1hcC1zZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YWQyOQotLS0gL2Rldi9udWxsCisrKyBiL2ltYXAtc2VuZC5jCkBAIC0wLDAgKzEsMTM2OSBAQAorLyoKKyAqIGdpdC1pbWFwLXNlbmQgLSBkcm9wcyBwYXRjaGVzIGludG8gYW4gaW1hcCBEcmFmdHMgZm9sZGVyCisgKiAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tIGlzeW5jL21ic3luYyAtIG1haWxib3ggc3luY2hyb25pemVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgTWljaGFlbCBSLiBFbGtpbnMgPG1lQG11dHQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgT3N3YWxkIEJ1ZGRlbmhhZ2VuIDxvc3NpQHVzZXJzLnNmLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pa2UgTWNDb3JtYWNrCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKwordHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfY29uZiB7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpwYXRoOyAvKiBzaG91bGQgdGhpcyBiZSBoZXJlPyBpdHMgaW50ZXJwcmV0YXRpb24gaXMgZHJpdmVyLXNwZWNpZmljICovCisJY2hhciAqbWFwX2luYm94OworCWNoYXIgKnRyYXNoOworCXVuc2lnbmVkIG1heF9zaXplOyAvKiBvZmZfdCBpcyBvdmVya2lsbCAqLworCXVuc2lnbmVkIHRyYXNoX3JlbW90ZV9uZXc6MSwgdHJhc2hfb25seV9uZXc6MTsKK30gc3RvcmVfY29uZl90OworCit0eXBlZGVmIHN0cnVjdCBzdHJpbmdfbGlzdCB7CisJc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OworCWNoYXIgc3RyaW5nWzFdOworfSBzdHJpbmdfbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCBjaGFubmVsX2NvbmYgeworCXN0cnVjdCBjaGFubmVsX2NvbmYgKm5leHQ7CisJY2hhciAqbmFtZTsKKwlzdG9yZV9jb25mX3QgKm1hc3RlciwgKnNsYXZlOworCWNoYXIgKm1hc3Rlcl9uYW1lLCAqc2xhdmVfbmFtZTsKKwljaGFyICpzeW5jX3N0YXRlOworCXN0cmluZ19saXN0X3QgKnBhdHRlcm5zOworCWludCBtb3BzLCBzb3BzOworCXVuc2lnbmVkIG1heF9tZXNzYWdlczsgLyogZm9yIHNsYXZlIG9ubHkgKi8KK30gY2hhbm5lbF9jb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IGdyb3VwX2NvbmYgeworCXN0cnVjdCBncm91cF9jb25mICpuZXh0OworCWNoYXIgKm5hbWU7CisJc3RyaW5nX2xpc3RfdCAqY2hhbm5lbHM7Cit9IGdyb3VwX2NvbmZfdDsKKworLyogRm9yIG1lc3NhZ2UtPnN0YXR1cyAqLworI2RlZmluZSBNX1JFQ0VOVCAgICAgICAoMTw8MCkgLyogdW5zeW5jYWJsZSBmbGFnOyBtYWlsZGlyXyogZGVwZW5kIG9uIHRoaXMgYmVpbmcgMTw8MCAqLworI2RlZmluZSBNX0RFQUQgICAgICAgICAoMTw8MSkgLyogZXhwdW5nZWQgKi8KKyNkZWZpbmUgTV9GTEFHUyAgICAgICAgKDE8PDIpIC8qIGZsYWdzIGZldGNoZWQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWVzc2FnZSB7CisJc3RydWN0IG1lc3NhZ2UgKm5leHQ7CisJLyogc3RyaW5nX2xpc3RfdCAqa2V5d29yZHM7ICovCisJc2l6ZV90IHNpemU7IC8qIHplcm8gaW1wbGllcyAibm90IGZldGNoZWQiICovCisJaW50IHVpZDsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzLCBzdGF0dXM7Cit9IG1lc3NhZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RvcmUgeworCXN0b3JlX2NvbmZfdCAqY29uZjsgLyogZm9yZWlnbiAqLworCisJLyogY3VycmVudGx5IG9wZW4gbWFpbGJveCAqLworCWNvbnN0IGNoYXIgKm5hbWU7IC8qIGZvcmVpZ24hIG1heWJlIHByZXNldD8gKi8KKwljaGFyICpwYXRoOyAvKiBvd24gKi8KKwltZXNzYWdlX3QgKm1zZ3M7IC8qIG93biAqLworCWludCB1aWR2YWxpZGl0eTsKKwl1bnNpZ25lZCBjaGFyIG9wdHM7IC8qIG1heWJlIHByZXNldD8gKi8KKwkvKiBub3RlIHRoYXQgdGhlIGZvbGxvd2luZyBkbyBfbm90XyByZWZsZWN0IHN0YXRzIGZyb20gbXNncywgYnV0IG1haWxib3ggdG90YWxzICovCisJaW50IGNvdW50OyAvKiAjIG9mIG1lc3NhZ2VzICovCisJaW50IHJlY2VudDsgLyogIyBvZiByZWNlbnQgbWVzc2FnZXMgLSBkb24ndCB0cnVzdCB0aGlzIGJleW9uZCB0aGUgaW5pdGlhbCByZWFkICovCit9IHN0b3JlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpkYXRhOworCWludCBsZW47CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGNybGY6MTsKK30gbXNnX2RhdGFfdDsKKworI2RlZmluZSBEUlZfT0sgICAgICAgICAgMAorI2RlZmluZSBEUlZfTVNHX0JBRCAgICAgLTEKKyNkZWZpbmUgRFJWX0JPWF9CQUQgICAgIC0yCisjZGVmaW5lIERSVl9TVE9SRV9CQUQgICAtMworCitzdGF0aWMgaW50IFZlcmJvc2UsIFF1aWV0OworCitzdGF0aWMgdm9pZCBpbmZvKCBjb25zdCBjaGFyICosIC4uLiApOworc3RhdGljIHZvaWQgd2FybiggY29uc3QgY2hhciAqLCAuLi4gKTsKKworc3RhdGljIGNoYXIgKm5leHRfYXJnKCBjaGFyICoqICk7CisKK3N0YXRpYyB2b2lkIGZyZWVfZ2VuZXJpY19tZXNzYWdlcyggbWVzc2FnZV90ICogKTsKKworc3RhdGljIGludCBuZnZhc3ByaW50ZiggY2hhciAqKnN0ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhICk7CitzdGF0aWMgaW50IG5mc25wcmludGYoIGNoYXIgKmJ1ZiwgaW50IGJsZW4sIGNvbnN0IGNoYXIgKmZtdCwgLi4uICk7CisKKworc3RhdGljIHZvaWQgYXJjNF9pbml0KCB2b2lkICk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBhcmM0X2dldGJ5dGUoIHZvaWQgKTsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hcF9zZXJ2ZXJfY29uZiB7CisJY2hhciAqbmFtZTsKKwljaGFyICp0dW5uZWw7CisJY2hhciAqaG9zdDsKKwlpbnQgcG9ydDsKKwljaGFyICp1c2VyOworCWNoYXIgKnBhc3M7Cit9IGltYXBfc2VydmVyX2NvbmZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hcF9zdG9yZV9jb25mIHsKKwlzdG9yZV9jb25mX3QgZ2VuOworCWltYXBfc2VydmVyX2NvbmZfdCAqc2VydmVyOworCXVuc2lnbmVkIHVzZV9uYW1lc3BhY2U6MTsKK30gaW1hcF9zdG9yZV9jb25mX3Q7CisKKyNkZWZpbmUgTklMCSh2b2lkKikweDEKKyNkZWZpbmUgTElTVAkodm9pZCopMHgyCisKK3R5cGVkZWYgc3RydWN0IF9saXN0IHsKKwlzdHJ1Y3QgX2xpc3QgKm5leHQsICpjaGlsZDsKKwljaGFyICp2YWw7CisJaW50IGxlbjsKK30gbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGZkOworfSBTb2NrZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVNvY2tldF90IHNvY2s7CisJaW50IGJ5dGVzOworCWludCBvZmZzZXQ7CisJY2hhciBidWZbMTAyNF07Cit9IGJ1ZmZlcl90OworCitzdHJ1Y3QgaW1hcF9jbWQ7CisKK3R5cGVkZWYgc3RydWN0IGltYXAgeworCWludCB1aWRuZXh0OyAvKiBmcm9tIFNFTEVDVCByZXNwb25zZXMgKi8KKwlsaXN0X3QgKm5zX3BlcnNvbmFsLCAqbnNfb3RoZXIsICpuc19zaGFyZWQ7IC8qIE5BTUVTUEFDRSBpbmZvICovCisJdW5zaWduZWQgY2FwcywgcmNhcHM7IC8qIENBUEFCSUxJVFkgcmVzdWx0cyAqLworCS8qIGNvbW1hbmQgcXVldWUgKi8KKwlpbnQgbmV4dHRhZywgbnVtX2luX3Byb2dyZXNzLCBsaXRlcmFsX3BlbmRpbmc7CisJc3RydWN0IGltYXBfY21kICppbl9wcm9ncmVzcywgKippbl9wcm9ncmVzc19hcHBlbmQ7CisJYnVmZmVyX3QgYnVmOyAvKiB0aGlzIGlzIEJJRywgc28gcHV0IGl0IGxhc3QgKi8KK30gaW1hcF90OworCit0eXBlZGVmIHN0cnVjdCBpbWFwX3N0b3JlIHsKKwlzdG9yZV90IGdlbjsKKwlpbnQgdWlkdmFsaWRpdHk7CisJaW1hcF90ICppbWFwOworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwl1bnNpZ25lZCAvKmN1cnJlbnRuYzoxLCovIHRyYXNobmM6MTsKK30gaW1hcF9zdG9yZV90OworCitzdHJ1Y3QgaW1hcF9jbWRfY2IgeworCWludCAoKmNvbnQpKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kICpjbWQsIGNvbnN0IGNoYXIgKnByb21wdCApOworCXZvaWQgKCpkb25lKSggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZCAqY21kLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKmN0eDsKKwljaGFyICpkYXRhOworCWludCBkbGVuOworCWludCB1aWQ7CisJdW5zaWduZWQgY3JlYXRlOjEsIHRyeWNyZWF0ZToxOworfTsKKworc3RydWN0IGltYXBfY21kIHsKKwlzdHJ1Y3QgaW1hcF9jbWQgKm5leHQ7CisJc3RydWN0IGltYXBfY21kX2NiIGNiOworCWNoYXIgKmNtZDsKKwlpbnQgdGFnOworfTsKKworI2RlZmluZSBDQVAoY2FwKSAoaW1hcC0+Y2FwcyAmICgxIDw8IChjYXApKSkKKworZW51bSBDQVBBQklMSVRZIHsKKwlOT0xPR0lOID0gMCwKKwlVSURQTFVTLAorCUxJVEVSQUxQTFVTLAorCU5BTUVTUEFDRSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXBfbGlzdFtdID0geworCSJMT0dJTkRJU0FCTEVEIiwKKwkiVUlEUExVUyIsCisJIkxJVEVSQUwrIiwKKwkiTkFNRVNQQUNFIiwKK307CisKKyNkZWZpbmUgUkVTUF9PSyAgICAwCisjZGVmaW5lIFJFU1BfTk8gICAgMQorI2RlZmluZSBSRVNQX0JBRCAgIDIKKworc3RhdGljIGludCBnZXRfY21kX3Jlc3VsdCggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZCAqdGNtZCApOworCisKK3N0YXRpYyBjb25zdCBjaGFyICpGbGFnc1tdID0geworCSJEcmFmdCIsCisJIkZsYWdnZWQiLAorCSJBbnN3ZXJlZCIsCisJIlNlZW4iLAorCSJEZWxldGVkIiwKK307CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfcGVycm9yKCBjb25zdCBjaGFyICpmdW5jLCBTb2NrZXRfdCAqc29jaywgaW50IHJldCApCit7CisJaWYgKHJldCA8IDApCisJCXBlcnJvciggZnVuYyApOworCWVsc2UKKwkJZnByaW50Ziggc3RkZXJyLCAiJXM6IHVuZXhwZWN0ZWQgRU9GXG4iLCBmdW5jICk7Cit9CisKK3N0YXRpYyBpbnQKK3NvY2tldF9yZWFkKCBTb2NrZXRfdCAqc29jaywgY2hhciAqYnVmLCBpbnQgbGVuICkKK3sKKwlpbnQgbiA9IHJlYWQoIHNvY2stPmZkLCBidWYsIGxlbiApOworCWlmIChuIDw9IDApIHsKKwkJc29ja2V0X3BlcnJvciggInJlYWQiLCBzb2NrLCBuICk7CisJCWNsb3NlKCBzb2NrLT5mZCApOworCQlzb2NrLT5mZCA9IC0xOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludAorc29ja2V0X3dyaXRlKCBTb2NrZXRfdCAqc29jaywgY2hhciAqYnVmLCBpbnQgbGVuICkKK3sKKwlpbnQgbiA9IHdyaXRlKCBzb2NrLT5mZCwgYnVmLCBsZW4gKTsKKwlpZiAobiAhPSBsZW4pIHsKKwkJc29ja2V0X3BlcnJvciggIndyaXRlIiwgc29jaywgbiApOworCQljbG9zZSggc29jay0+ZmQgKTsKKwkJc29jay0+ZmQgPSAtMTsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qIHNpbXBsZSBsaW5lIGJ1ZmZlcmluZyAqLworc3RhdGljIGludAorYnVmZmVyX2dldHMoIGJ1ZmZlcl90ICogYiwgY2hhciAqKnMgKQoreworCWludCBuOworCWludCBzdGFydCA9IGItPm9mZnNldDsKKworCSpzID0gYi0+YnVmICsgc3RhcnQ7CisKKwlmb3IgKDs7KSB7CisJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHJlYWQgdGhlIFxyXG4gc2VxdWVuY2UgKi8KKwkJaWYgKGItPm9mZnNldCArIDEgPj0gYi0+Ynl0ZXMpIHsKKwkJCWlmIChzdGFydCkgeworCQkJCS8qIHNoaWZ0IGRvd24gdXNlZCBieXRlcyAqLworCQkJCSpzID0gYi0+YnVmOworCisJCQkJYXNzZXJ0KCBzdGFydCA8PSBiLT5ieXRlcyApOworCQkJCW4gPSBiLT5ieXRlcyAtIHN0YXJ0OworCisJCQkJaWYgKG4pCisJCQkJCW1lbWNweSggYi0+YnVmLCBiLT5idWYgKyBzdGFydCwgbiApOworCQkJCWItPm9mZnNldCAtPSBzdGFydDsKKwkJCQliLT5ieXRlcyA9IG47CisJCQkJc3RhcnQgPSAwOworCQkJfQorCisJCQluID0gc29ja2V0X3JlYWQoICZiLT5zb2NrLCBiLT5idWYgKyBiLT5ieXRlcywKKwkJCQkJIHNpemVvZihiLT5idWYpIC0gYi0+Ynl0ZXMgKTsKKworCQkJaWYgKG4gPD0gMCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWItPmJ5dGVzICs9IG47CisJCX0KKworCQlpZiAoYi0+YnVmW2ItPm9mZnNldF0gPT0gJ1xyJykgeworCQkJYXNzZXJ0KCBiLT5vZmZzZXQgKyAxIDwgYi0+Ynl0ZXMgKTsKKwkJCWlmIChiLT5idWZbYi0+b2Zmc2V0ICsgMV0gPT0gJ1xuJykgeworCQkJCWItPmJ1ZltiLT5vZmZzZXRdID0gMDsgIC8qIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJYi0+b2Zmc2V0ICs9IDI7IC8qIG5leHQgbGluZSAqLworCQkJCWlmIChWZXJib3NlKQorCQkJCQlwdXRzKCAqcyApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJYi0+b2Zmc2V0Kys7CisJfQorCS8qIG5vdCByZWFjaGVkICovCit9CisKK3N0YXRpYyB2b2lkCitpbmZvKCBjb25zdCBjaGFyICptc2csIC4uLiApCit7CisJdmFfbGlzdCB2YTsKKworCWlmICghUXVpZXQpIHsKKwkJdmFfc3RhcnQoIHZhLCBtc2cgKTsKKwkJdnByaW50ZiggbXNnLCB2YSApOworCQl2YV9lbmQoIHZhICk7CisJCWZmbHVzaCggc3Rkb3V0ICk7CisJfQorfQorCitzdGF0aWMgdm9pZAord2FybiggY29uc3QgY2hhciAqbXNnLCAuLi4gKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoUXVpZXQgPCAyKSB7CisJCXZhX3N0YXJ0KCB2YSwgbXNnICk7CisJCXZmcHJpbnRmKCBzdGRlcnIsIG1zZywgdmEgKTsKKwkJdmFfZW5kKCB2YSApOworCX0KK30KKworc3RhdGljIGNoYXIgKgorbmV4dF9hcmcoIGNoYXIgKipzICkKK3sKKwljaGFyICpyZXQ7CisKKwlpZiAoIXMgfHwgISpzKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAoaXNzcGFjZSggKHVuc2lnbmVkIGNoYXIpICoqcyApKQorCQkoKnMpKys7CisJaWYgKCEqKnMpIHsKKwkJKnMgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCoqcyA9PSAnIicpIHsKKwkJKysqczsKKwkJcmV0ID0gKnM7CisJCSpzID0gc3RyY2hyKCAqcywgJyInICk7CisJfSBlbHNlIHsKKwkJcmV0ID0gKnM7CisJCXdoaWxlICgqKnMgJiYgIWlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSAqKnMgKSkKKwkJCSgqcykrKzsKKwl9CisJaWYgKCpzKSB7CisJCWlmICgqKnMpCisJCQkqKCpzKSsrID0gMDsKKwkJaWYgKCEqKnMpCisJCQkqcyA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2dlbmVyaWNfbWVzc2FnZXMoIG1lc3NhZ2VfdCAqbXNncyApCit7CisJbWVzc2FnZV90ICp0bXNnOworCisJZm9yICg7IG1zZ3M7IG1zZ3MgPSB0bXNnKSB7CisJCXRtc2cgPSBtc2dzLT5uZXh0OworCQlmcmVlKCBtc2dzICk7CisJfQorfQorCitzdGF0aWMgaW50CitnaXRfdmFzcHJpbnRmKCBjaGFyICoqc3RycCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwICkKK3sKKwlpbnQgbGVuOworCWNoYXIgdG1wWzEwMjRdOworCisJaWYgKChsZW4gPSB2c25wcmludGYoIHRtcCwgc2l6ZW9mKHRtcCksIGZtdCwgYXAgKSkgPCAwIHx8ICEoKnN0cnAgPSB4bWFsbG9jKCBsZW4gKyAxICkpKQorCQlyZXR1cm4gLTE7CisJaWYgKGxlbiA+PSAoaW50KXNpemVvZih0bXApKQorCQl2c3ByaW50ZiggKnN0cnAsIGZtdCwgYXAgKTsKKwllbHNlCisJCW1lbWNweSggKnN0cnAsIHRtcCwgbGVuICsgMSApOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQKK25mc25wcmludGYoIGNoYXIgKmJ1ZiwgaW50IGJsZW4sIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKwlpbnQgcmV0OworCXZhX2xpc3QgdmE7CisKKwl2YV9zdGFydCggdmEsIGZtdCApOworCWlmIChibGVuIDw9IDAgfHwgKHVuc2lnbmVkKShyZXQgPSB2c25wcmludGYoIGJ1ZiwgYmxlbiwgZm10LCB2YSApKSA+PSAodW5zaWduZWQpYmxlbikKKwkJZGllKCAiRmF0YWw6IGJ1ZmZlciB0b28gc21hbGwuIFBsZWFzZSByZXBvcnQgYSBidWcuXG4iKTsKKwl2YV9lbmQoIHZhICk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbmZ2YXNwcmludGYoIGNoYXIgKipzdHIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSApCit7CisJaW50IHJldCA9IGdpdF92YXNwcmludGYoIHN0ciwgZm10LCB2YSApOworCWlmIChyZXQgPCAwKQorCQlkaWUoICJGYXRhbDogT3V0IG9mIG1lbW9yeVxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBpLCBqLCBzWzI1Nl07Cit9IHJzOworCitzdGF0aWMgdm9pZAorYXJjNF9pbml0KCB2b2lkICkKK3sKKwlpbnQgaSwgZmQ7CisJdW5zaWduZWQgY2hhciBqLCBzaSwgZGF0WzEyOF07CisKKwlpZiAoKGZkID0gb3BlbiggIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZICkpIDwgMCAmJiAoZmQgPSBvcGVuKCAiL2Rldi9yYW5kb20iLCBPX1JET05MWSApKSA8IDApIHsKKwkJZnByaW50Ziggc3RkZXJyLCAiRmF0YWw6IG5vIHJhbmRvbSBudW1iZXIgc291cmNlIGF2YWlsYWJsZS5cbiIgKTsKKwkJZXhpdCggMyApOworCX0KKwlpZiAocmVhZCggZmQsIGRhdCwgMTI4ICkgIT0gMTI4KSB7CisJCWZwcmludGYoIHN0ZGVyciwgIkZhdGFsOiBjYW5ub3QgcmVhZCByYW5kb20gbnVtYmVyIHNvdXJjZS5cbiIgKTsKKwkJZXhpdCggMyApOworCX0KKwljbG9zZSggZmQgKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJcnMuc1tpXSA9IGk7CisJZm9yIChpID0gaiA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzaSA9IHJzLnNbaV07CisJCWogKz0gc2kgKyBkYXRbaSAmIDEyN107CisJCXJzLnNbaV0gPSBycy5zW2pdOworCQlycy5zW2pdID0gc2k7CisJfQorCXJzLmkgPSBycy5qID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJYXJjNF9nZXRieXRlKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCithcmM0X2dldGJ5dGUoIHZvaWQgKQoreworCXVuc2lnbmVkIGNoYXIgc2ksIHNqOworCisJcnMuaSsrOworCXNpID0gcnMuc1tycy5pXTsKKwlycy5qICs9IHNpOworCXNqID0gcnMuc1tycy5qXTsKKwlycy5zW3JzLmldID0gc2o7CisJcnMuc1tycy5qXSA9IHNpOworCXJldHVybiBycy5zWyhzaSArIHNqKSAmIDB4ZmZdOworfQorCitzdGF0aWMgc3RydWN0IGltYXBfY21kICoKK3ZfaXNzdWVfaW1hcF9jbWQoIGltYXBfc3RvcmVfdCAqY3R4LCBzdHJ1Y3QgaW1hcF9jbWRfY2IgKmNiLAorCQkgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCApCit7CisJaW1hcF90ICppbWFwID0gY3R4LT5pbWFwOworCXN0cnVjdCBpbWFwX2NtZCAqY21kOworCWludCBuLCBidWZsOworCWNoYXIgYnVmWzEwMjRdOworCisJY21kID0geG1hbGxvYyggc2l6ZW9mKHN0cnVjdCBpbWFwX2NtZCkgKTsKKwluZnZhc3ByaW50ZiggJmNtZC0+Y21kLCBmbXQsIGFwICk7CisJY21kLT50YWcgPSArK2ltYXAtPm5leHR0YWc7CisKKwlpZiAoY2IpCisJCWNtZC0+Y2IgPSAqY2I7CisJZWxzZQorCQltZW1zZXQoICZjbWQtPmNiLCAwLCBzaXplb2YoY21kLT5jYikgKTsKKworCXdoaWxlIChpbWFwLT5saXRlcmFsX3BlbmRpbmcpCisJCWdldF9jbWRfcmVzdWx0KCBjdHgsIE5VTEwgKTsKKworCWJ1ZmwgPSBuZnNucHJpbnRmKCBidWYsIHNpemVvZihidWYpLCBjbWQtPmNiLmRhdGEgPyBDQVAoTElURVJBTFBMVVMpID8KKwkJCSAgICIlZCAlc3slZCt9XHJcbiIgOiAiJWQgJXN7JWR9XHJcbiIgOiAiJWQgJXNcclxuIiwKKwkJCSAgIGNtZC0+dGFnLCBjbWQtPmNtZCwgY21kLT5jYi5kbGVuICk7CisJaWYgKFZlcmJvc2UpIHsKKwkJaWYgKGltYXAtPm51bV9pbl9wcm9ncmVzcykKKwkJCXByaW50ZiggIiglZCBpbiBwcm9ncmVzcykgIiwgaW1hcC0+bnVtX2luX3Byb2dyZXNzICk7CisJCWlmIChtZW1jbXAoIGNtZC0+Y21kLCAiTE9HSU4iLCA1ICkpCisJCQlwcmludGYoICI+Pj4gJXMiLCBidWYgKTsKKwkJZWxzZQorCQkJcHJpbnRmKCAiPj4+ICVkIExPR0lOIDx1c2VyPiA8cGFzcz5cbiIsIGNtZC0+dGFnICk7CisJfQorCWlmIChzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgYnVmLCBidWZsICkgIT0gYnVmbCkgeworCQlmcmVlKCBjbWQtPmNtZCApOworCQlmcmVlKCBjbWQgKTsKKwkJaWYgKGNiICYmIGNiLT5kYXRhKQorCQkJZnJlZSggY2ItPmRhdGEgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChjbWQtPmNiLmRhdGEpIHsKKwkJaWYgKENBUChMSVRFUkFMUExVUykpIHsKKwkJCW4gPSBzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgY21kLT5jYi5kYXRhLCBjbWQtPmNiLmRsZW4gKTsKKwkJCWZyZWUoIGNtZC0+Y2IuZGF0YSApOworCQkJaWYgKG4gIT0gY21kLT5jYi5kbGVuIHx8CisJCQkgICAgKG4gPSBzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgIlxyXG4iLCAyICkpICE9IDIpCisJCQl7CisJCQkJZnJlZSggY21kLT5jbWQgKTsKKwkJCQlmcmVlKCBjbWQgKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWNtZC0+Y2IuZGF0YSA9IE5VTEw7CisJCX0gZWxzZQorCQkJaW1hcC0+bGl0ZXJhbF9wZW5kaW5nID0gMTsKKwl9IGVsc2UgaWYgKGNtZC0+Y2IuY29udCkKKwkJaW1hcC0+bGl0ZXJhbF9wZW5kaW5nID0gMTsKKwljbWQtPm5leHQgPSBOVUxMOworCSppbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgPSBjbWQ7CisJaW1hcC0+aW5fcHJvZ3Jlc3NfYXBwZW5kID0gJmNtZC0+bmV4dDsKKwlpbWFwLT5udW1faW5fcHJvZ3Jlc3MrKzsKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgc3RydWN0IGltYXBfY21kICoKK2lzc3VlX2ltYXBfY21kKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworCXN0cnVjdCBpbWFwX2NtZCAqcmV0OworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydCggYXAsIGZtdCApOworCXJldCA9IHZfaXNzdWVfaW1hcF9jbWQoIGN0eCwgY2IsIGZtdCwgYXAgKTsKKwl2YV9lbmQoIGFwICk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraW1hcF9leGVjKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworCXZhX2xpc3QgYXA7CisJc3RydWN0IGltYXBfY21kICpjbWRwOworCisJdmFfc3RhcnQoIGFwLCBmbXQgKTsKKwljbWRwID0gdl9pc3N1ZV9pbWFwX2NtZCggY3R4LCBjYiwgZm10LCBhcCApOworCXZhX2VuZCggYXAgKTsKKwlpZiAoIWNtZHApCisJCXJldHVybiBSRVNQX0JBRDsKKworCXJldHVybiBnZXRfY21kX3Jlc3VsdCggY3R4LCBjbWRwICk7Cit9CisKK3N0YXRpYyBpbnQKK2ltYXBfZXhlY19tKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworCXZhX2xpc3QgYXA7CisJc3RydWN0IGltYXBfY21kICpjbWRwOworCisJdmFfc3RhcnQoIGFwLCBmbXQgKTsKKwljbWRwID0gdl9pc3N1ZV9pbWFwX2NtZCggY3R4LCBjYiwgZm10LCBhcCApOworCXZhX2VuZCggYXAgKTsKKwlpZiAoIWNtZHApCisJCXJldHVybiBEUlZfU1RPUkVfQkFEOworCisJc3dpdGNoIChnZXRfY21kX3Jlc3VsdCggY3R4LCBjbWRwICkpIHsKKwljYXNlIFJFU1BfQkFEOiByZXR1cm4gRFJWX1NUT1JFX0JBRDsKKwljYXNlIFJFU1BfTk86IHJldHVybiBEUlZfTVNHX0JBRDsKKwlkZWZhdWx0OiByZXR1cm4gRFJWX09LOworCX0KK30KKworc3RhdGljIGludAoraXNfYXRvbSggbGlzdF90ICpsaXN0ICkKK3sKKwlyZXR1cm4gbGlzdCAmJiBsaXN0LT52YWwgJiYgbGlzdC0+dmFsICE9IE5JTCAmJiBsaXN0LT52YWwgIT0gTElTVDsKK30KKworc3RhdGljIGludAoraXNfbGlzdCggbGlzdF90ICpsaXN0ICkKK3sKKwlyZXR1cm4gbGlzdCAmJiBsaXN0LT52YWwgPT0gTElTVDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfbGlzdCggbGlzdF90ICpsaXN0ICkKK3sKKwlsaXN0X3QgKnRtcDsKKworCWZvciAoOyBsaXN0OyBsaXN0ID0gdG1wKSB7CisJCXRtcCA9IGxpc3QtPm5leHQ7CisJCWlmIChpc19saXN0KCBsaXN0ICkpCisJCQlmcmVlX2xpc3QoIGxpc3QtPmNoaWxkICk7CisJCWVsc2UgaWYgKGlzX2F0b20oIGxpc3QgKSkKKwkJCWZyZWUoIGxpc3QtPnZhbCApOworCQlmcmVlKCBsaXN0ICk7CisJfQorfQorCitzdGF0aWMgaW50CitwYXJzZV9pbWFwX2xpc3RfbCggaW1hcF90ICppbWFwLCBjaGFyICoqc3AsIGxpc3RfdCAqKmN1cnAsIGludCBsZXZlbCApCit7CisJbGlzdF90ICpjdXI7CisJY2hhciAqcyA9ICpzcCwgKnA7CisJaW50IG4sIGJ5dGVzOworCisJZm9yICg7OykgeworCQl3aGlsZSAoaXNzcGFjZSggKHVuc2lnbmVkIGNoYXIpKnMgKSkKKwkJCXMrKzsKKwkJaWYgKGxldmVsICYmICpzID09ICcpJykgeworCQkJcysrOworCQkJYnJlYWs7CisJCX0KKwkJKmN1cnAgPSBjdXIgPSB4bWFsbG9jKCBzaXplb2YoKmN1cikgKTsKKwkJY3VycCA9ICZjdXItPm5leHQ7CisJCWN1ci0+dmFsID0gTlVMTDsgLyogZm9yIGNsZWFuIGJhaWwgKi8KKwkJaWYgKCpzID09ICcoJykgeworCQkJLyogc3VibGlzdCAqLworCQkJcysrOworCQkJY3VyLT52YWwgPSBMSVNUOworCQkJaWYgKHBhcnNlX2ltYXBfbGlzdF9sKCBpbWFwLCAmcywgJmN1ci0+Y2hpbGQsIGxldmVsICsgMSApKQorCQkJCWdvdG8gYmFpbDsKKwkJfSBlbHNlIGlmIChpbWFwICYmICpzID09ICd7JykgeworCQkJLyogbGl0ZXJhbCAqLworCQkJYnl0ZXMgPSBjdXItPmxlbiA9IHN0cnRvbCggcyArIDEsICZzLCAxMCApOworCQkJaWYgKCpzICE9ICd9JykKKwkJCQlnb3RvIGJhaWw7CisKKwkJCXMgPSBjdXItPnZhbCA9IHhtYWxsb2MoIGN1ci0+bGVuICk7CisKKwkJCS8qIGR1bXAgd2hhdHMgbGVmdCBvdmVyIGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKwkJCW4gPSBpbWFwLT5idWYuYnl0ZXMgLSBpbWFwLT5idWYub2Zmc2V0OworCisJCQlpZiAobiA+IGJ5dGVzKQorCQkJCS8qIHRoZSBlbnRpcmUgbWVzc2FnZSBmaXQgaW4gdGhlIGJ1ZmZlciAqLworCQkJCW4gPSBieXRlczsKKworCQkJbWVtY3B5KCBzLCBpbWFwLT5idWYuYnVmICsgaW1hcC0+YnVmLm9mZnNldCwgbiApOworCQkJcyArPSBuOworCQkJYnl0ZXMgLT0gbjsKKworCQkJLyogbWFyayB0aGF0IHdlIHVzZWQgcGFydCBvZiB0aGUgYnVmZmVyICovCisJCQlpbWFwLT5idWYub2Zmc2V0ICs9IG47CisKKwkJCS8qIG5vdyByZWFkIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlICovCisJCQl3aGlsZSAoYnl0ZXMgPiAwKSB7CisJCQkJaWYgKChuID0gc29ja2V0X3JlYWQgKCZpbWFwLT5idWYuc29jaywgcywgYnl0ZXMpKSA8PSAwKQorCQkJCQlnb3RvIGJhaWw7CisJCQkJcyArPSBuOworCQkJCWJ5dGVzIC09IG47CisJCQl9CisKKwkJCWlmIChidWZmZXJfZ2V0cyggJmltYXAtPmJ1ZiwgJnMgKSkKKwkJCQlnb3RvIGJhaWw7CisJCX0gZWxzZSBpZiAoKnMgPT0gJyInKSB7CisJCQkvKiBxdW90ZWQgc3RyaW5nICovCisJCQlzKys7CisJCQlwID0gczsKKwkJCWZvciAoOyAqcyAhPSAnIic7IHMrKykKKwkJCQlpZiAoISpzKQorCQkJCQlnb3RvIGJhaWw7CisJCQljdXItPmxlbiA9IHMgLSBwOworCQkJcysrOworCQkJY3VyLT52YWwgPSB4bWFsbG9jKCBjdXItPmxlbiArIDEgKTsKKwkJCW1lbWNweSggY3VyLT52YWwsIHAsIGN1ci0+bGVuICk7CisJCQljdXItPnZhbFtjdXItPmxlbl0gPSAwOworCQl9IGVsc2UgeworCQkJLyogYXRvbSAqLworCQkJcCA9IHM7CisJCQlmb3IgKDsgKnMgJiYgIWlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSpzICk7IHMrKykKKwkJCQlpZiAobGV2ZWwgJiYgKnMgPT0gJyknKQorCQkJCQlicmVhazsKKwkJCWN1ci0+bGVuID0gcyAtIHA7CisJCQlpZiAoY3VyLT5sZW4gPT0gMyAmJiAhbWVtY21wICgiTklMIiwgcCwgMykpCisJCQkJY3VyLT52YWwgPSBOSUw7CisJCQllbHNlIHsKKwkJCQljdXItPnZhbCA9IHhtYWxsb2MoIGN1ci0+bGVuICsgMSApOworCQkJCW1lbWNweSggY3VyLT52YWwsIHAsIGN1ci0+bGVuICk7CisJCQkJY3VyLT52YWxbY3VyLT5sZW5dID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICghbGV2ZWwpCisJCQlicmVhazsKKwkJaWYgKCEqcykKKwkJCWdvdG8gYmFpbDsKKwl9CisJKnNwID0gczsKKwkqY3VycCA9IE5VTEw7CisJcmV0dXJuIDA7CisKKyAgYmFpbDoKKwkqY3VycCA9IE5VTEw7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgbGlzdF90ICoKK3BhcnNlX2ltYXBfbGlzdCggaW1hcF90ICppbWFwLCBjaGFyICoqc3AgKQoreworCWxpc3RfdCAqaGVhZDsKKworCWlmICghcGFyc2VfaW1hcF9saXN0X2woIGltYXAsIHNwLCAmaGVhZCwgMCApKQorCQlyZXR1cm4gaGVhZDsKKwlmcmVlX2xpc3QoIGhlYWQgKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGxpc3RfdCAqCitwYXJzZV9saXN0KCBjaGFyICoqc3AgKQoreworCXJldHVybiBwYXJzZV9pbWFwX2xpc3QoIE5VTEwsIHNwICk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9jYXBhYmlsaXR5KCBpbWFwX3QgKmltYXAsIGNoYXIgKmNtZCApCit7CisJY2hhciAqYXJnOworCXVuc2lnbmVkIGk7CisKKwlpbWFwLT5jYXBzID0gMHg4MDAwMDAwMDsKKwl3aGlsZSAoKGFyZyA9IG5leHRfYXJnKCAmY21kICkpKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYXBfbGlzdCk7IGkrKykKKwkJCWlmICghc3RyY21wKCBjYXBfbGlzdFtpXSwgYXJnICkpCisJCQkJaW1hcC0+Y2FwcyB8PSAxIDw8IGk7CisJaW1hcC0+cmNhcHMgPSBpbWFwLT5jYXBzOworfQorCitzdGF0aWMgaW50CitwYXJzZV9yZXNwb25zZV9jb2RlKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwgY2hhciAqcyApCit7CisJaW1hcF90ICppbWFwID0gY3R4LT5pbWFwOworCWNoYXIgKmFyZywgKnA7CisKKwlpZiAoKnMgIT0gJ1snKQorCQlyZXR1cm4gUkVTUF9PSzsJCS8qIG5vIHJlc3BvbnNlIGNvZGUgKi8KKwlzKys7CisJaWYgKCEocCA9IHN0cmNociggcywgJ10nICkpKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG1hbGZvcm1lZCByZXNwb25zZSBjb2RlXG4iICk7CisJCXJldHVybiBSRVNQX0JBRDsKKwl9CisJKnArKyA9IDA7CisJYXJnID0gbmV4dF9hcmcoICZzICk7CisJaWYgKCFzdHJjbXAoICJVSURWQUxJRElUWSIsIGFyZyApKSB7CisJCWlmICghKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKGN0eC0+Z2VuLnVpZHZhbGlkaXR5ID0gYXRvaSggYXJnICkpKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiBtYWxmb3JtZWQgVUlEVkFMSURJVFkgc3RhdHVzXG4iICk7CisJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJVSURORVhUIiwgYXJnICkpIHsKKwkJaWYgKCEoYXJnID0gbmV4dF9hcmcoICZzICkpIHx8ICEoaW1hcC0+dWlkbmV4dCA9IGF0b2koIGFyZyApKSkgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbWFsZm9ybWVkIE5FWFRVSUQgc3RhdHVzXG4iICk7CisJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJDQVBBQklMSVRZIiwgYXJnICkpIHsKKwkJcGFyc2VfY2FwYWJpbGl0eSggaW1hcCwgcyApOworCX0gZWxzZSBpZiAoIXN0cmNtcCggIkFMRVJUIiwgYXJnICkpIHsKKwkJLyogUkZDMjA2MCBzYXlzIHRoYXQgdGhlc2UgbWVzc2FnZXMgTVVTVCBiZSBkaXNwbGF5ZWQKKwkJICogdG8gdGhlIHVzZXIKKwkJICovCisJCWZvciAoOyBpc3NwYWNlKCAodW5zaWduZWQgY2hhcikqcCApOyBwKyspOworCQlmcHJpbnRmKCBzdGRlcnIsICIqKiogSU1BUCBBTEVSVCAqKiogJXNcbiIsIHAgKTsKKwl9IGVsc2UgaWYgKGNiICYmIGNiLT5jdHggJiYgIXN0cmNtcCggIkFQUEVORFVJRCIsIGFyZyApKSB7CisJCWlmICghKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKGN0eC0+Z2VuLnVpZHZhbGlkaXR5ID0gYXRvaSggYXJnICkpIHx8CisJCSAgICAhKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKCooaW50ICopY2ItPmN0eCA9IGF0b2koIGFyZyApKSkKKwkJeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbWFsZm9ybWVkIEFQUEVORFVJRCBzdGF0dXNcbiIgKTsKKwkJCXJldHVybiBSRVNQX0JBRDsKKwkJfQorCX0KKwlyZXR1cm4gUkVTUF9PSzsKK30KKworc3RhdGljIGludAorZ2V0X2NtZF9yZXN1bHQoIGltYXBfc3RvcmVfdCAqY3R4LCBzdHJ1Y3QgaW1hcF9jbWQgKnRjbWQgKQoreworCWltYXBfdCAqaW1hcCA9IGN0eC0+aW1hcDsKKwlzdHJ1Y3QgaW1hcF9jbWQgKmNtZHAsICoqcGNtZHAsICpuY21kcDsKKwljaGFyICpjbWQsICphcmcsICphcmcxLCAqcDsKKwlpbnQgbiwgcmVzcCwgcmVzcDIsIHRhZzsKKworCWZvciAoOzspIHsKKwkJaWYgKGJ1ZmZlcl9nZXRzKCAmaW1hcC0+YnVmLCAmY21kICkpCisJCQlyZXR1cm4gUkVTUF9CQUQ7CisKKwkJYXJnID0gbmV4dF9hcmcoICZjbWQgKTsKKwkJaWYgKCphcmcgPT0gJyonKSB7CisJCQlhcmcgPSBuZXh0X2FyZyggJmNtZCApOworCQkJaWYgKCFhcmcpIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmFibGUgdG8gcGFyc2UgdW50YWdnZWQgcmVzcG9uc2VcbiIgKTsKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9CisKKwkJCWlmICghc3RyY21wKCAiTkFNRVNQQUNFIiwgYXJnICkpIHsKKwkJCQlpbWFwLT5uc19wZXJzb25hbCA9IHBhcnNlX2xpc3QoICZjbWQgKTsKKwkJCQlpbWFwLT5uc19vdGhlciA9IHBhcnNlX2xpc3QoICZjbWQgKTsKKwkJCQlpbWFwLT5uc19zaGFyZWQgPSBwYXJzZV9saXN0KCAmY21kICk7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoICJPSyIsIGFyZyApIHx8ICFzdHJjbXAoICJCQUQiLCBhcmcgKSB8fAorCQkJCSAgICFzdHJjbXAoICJOTyIsIGFyZyApIHx8ICFzdHJjbXAoICJCWUUiLCBhcmcgKSkgeworCQkJCWlmICgocmVzcCA9IHBhcnNlX3Jlc3BvbnNlX2NvZGUoIGN0eCwgTlVMTCwgY21kICkpICE9IFJFU1BfT0spCisJCQkJCXJldHVybiByZXNwOworCQkJfSBlbHNlIGlmICghc3RyY21wKCAiQ0FQQUJJTElUWSIsIGFyZyApKQorCQkJCXBhcnNlX2NhcGFiaWxpdHkoIGltYXAsIGNtZCApOworCQkJZWxzZSBpZiAoKGFyZzEgPSBuZXh0X2FyZyggJmNtZCApKSkgeworCQkJCWlmICghc3RyY21wKCAiRVhJU1RTIiwgYXJnMSApKQorCQkJCQljdHgtPmdlbi5jb3VudCA9IGF0b2koIGFyZyApOworCQkJCWVsc2UgaWYgKCFzdHJjbXAoICJSRUNFTlQiLCBhcmcxICkpCisJCQkJCWN0eC0+Z2VuLnJlY2VudCA9IGF0b2koIGFyZyApOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmFibGUgdG8gcGFyc2UgdW50YWdnZWQgcmVzcG9uc2VcbiIgKTsKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9CisJCX0gZWxzZSBpZiAoIWltYXAtPmluX3Byb2dyZXNzKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmV4cGVjdGVkIHJlcGx5OiAlcyAlc1xuIiwgYXJnLCBjbWQgPyBjbWQgOiAiIiApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQl9IGVsc2UgaWYgKCphcmcgPT0gJysnKSB7CisJCQkvKiBUaGlzIGNhbiBoYXBwZW4gb25seSB3aXRoIHRoZSBsYXN0IGNvbW1hbmQgdW5kZXJ3YXksIGFzCisJCQkgICBpdCBlbmZvcmNlcyBhIHJvdW5kLXRyaXAuICovCisJCQljbWRwID0gKHN0cnVjdCBpbWFwX2NtZCAqKSgoY2hhciAqKWltYXAtPmluX3Byb2dyZXNzX2FwcGVuZCAtCisJCQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGltYXBfY21kLCBuZXh0KSk7CisJCQlpZiAoY21kcC0+Y2IuZGF0YSkgeworCQkJCW4gPSBzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgY21kcC0+Y2IuZGF0YSwgY21kcC0+Y2IuZGxlbiApOworCQkJCWZyZWUoIGNtZHAtPmNiLmRhdGEgKTsKKwkJCQljbWRwLT5jYi5kYXRhID0gTlVMTDsKKwkJCQlpZiAobiAhPSAoaW50KWNtZHAtPmNiLmRsZW4pCisJCQkJCXJldHVybiBSRVNQX0JBRDsKKwkJCX0gZWxzZSBpZiAoY21kcC0+Y2IuY29udCkgeworCQkJCWlmIChjbWRwLT5jYi5jb250KCBjdHgsIGNtZHAsIGNtZCApKQorCQkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IHVuZXhwZWN0ZWQgY29tbWFuZCBjb250aW51YXRpb24gcmVxdWVzdFxuIiApOworCQkJCXJldHVybiBSRVNQX0JBRDsKKwkJCX0KKwkJCWlmIChzb2NrZXRfd3JpdGUoICZpbWFwLT5idWYuc29jaywgIlxyXG4iLCAyICkgIT0gMikKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQlpZiAoIWNtZHAtPmNiLmNvbnQpCisJCQkJaW1hcC0+bGl0ZXJhbF9wZW5kaW5nID0gMDsKKwkJCWlmICghdGNtZCkKKwkJCQlyZXR1cm4gRFJWX09LOworCQl9IGVsc2UgeworCQkJdGFnID0gYXRvaSggYXJnICk7CisJCQlmb3IgKHBjbWRwID0gJmltYXAtPmluX3Byb2dyZXNzOyAoY21kcCA9ICpwY21kcCk7IHBjbWRwID0gJmNtZHAtPm5leHQpCisJCQkJaWYgKGNtZHAtPnRhZyA9PSB0YWcpCisJCQkJCWdvdG8gZ290dGFnOworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5leHBlY3RlZCB0YWcgJXNcbiIsIGFyZyApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQkgIGdvdHRhZzoKKwkJCWlmICghKCpwY21kcCA9IGNtZHAtPm5leHQpKQorCQkJCWltYXAtPmluX3Byb2dyZXNzX2FwcGVuZCA9IHBjbWRwOworCQkJaW1hcC0+bnVtX2luX3Byb2dyZXNzLS07CisJCQlpZiAoY21kcC0+Y2IuY29udCB8fCBjbWRwLT5jYi5kYXRhKQorCQkJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDA7CisJCQlhcmcgPSBuZXh0X2FyZyggJmNtZCApOworCQkJaWYgKCFzdHJjbXAoICJPSyIsIGFyZyApKQorCQkJCXJlc3AgPSBEUlZfT0s7CisJCQllbHNlIHsKKwkJCQlpZiAoIXN0cmNtcCggIk5PIiwgYXJnICkpIHsKKwkJCQkJaWYgKGNtZHAtPmNiLmNyZWF0ZSAmJiBjbWQgJiYgKGNtZHAtPmNiLnRyeWNyZWF0ZSB8fCAhbWVtY21wKCBjbWQsICJbVFJZQ1JFQVRFXSIsIDExICkpKSB7IC8qIFNFTEVDVCwgQVBQRU5EIG9yIFVJRCBDT1BZICovCisJCQkJCQlwID0gc3RyY2hyKCBjbWRwLT5jbWQsICciJyApOworCQkJCQkJaWYgKCFpc3N1ZV9pbWFwX2NtZCggY3R4LCBOVUxMLCAiQ1JFQVRFIFwiJS4qc1wiIiwgc3RyY2hyKCBwICsgMSwgJyInICkgLSBwICsgMSwgcCApKSB7CisJCQkJCQkJcmVzcCA9IFJFU1BfQkFEOworCQkJCQkJCWdvdG8gbm9ybWFsOworCQkJCQkJfQorCQkJCQkJLyogbm90IHdhaXRpbmcgaGVyZSB2aW9sYXRlcyB0aGUgc3BlYywgYnV0IGEgc2VydmVyIHRoYXQgZG9lcyBub3QKKwkJCQkJCSAgIGdyb2sgdGhpcyBub25ldGhlbGVzcyB2aW9sYXRlcyBpdCB0b28uICovCisJCQkJCQljbWRwLT5jYi5jcmVhdGUgPSAwOworCQkJCQkJaWYgKCEobmNtZHAgPSBpc3N1ZV9pbWFwX2NtZCggY3R4LCAmY21kcC0+Y2IsICIlcyIsIGNtZHAtPmNtZCApKSkgeworCQkJCQkJCXJlc3AgPSBSRVNQX0JBRDsKKwkJCQkJCQlnb3RvIG5vcm1hbDsKKwkJCQkJCX0KKwkJCQkJCWZyZWUoIGNtZHAtPmNtZCApOworCQkJCQkJZnJlZSggY21kcCApOworCQkJCQkJaWYgKCF0Y21kKQorCQkJCQkJCXJldHVybiAwOwkvKiBpZ25vcmVkICovCisJCQkJCQlpZiAoY21kcCA9PSB0Y21kKQorCQkJCQkJCXRjbWQgPSBuY21kcDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXJlc3AgPSBSRVNQX05POworCQkJCX0gZWxzZSAvKmlmICghc3RyY21wKCAiQkFEIiwgYXJnICkpKi8KKwkJCQkJcmVzcCA9IFJFU1BfQkFEOworCQkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgY29tbWFuZCAnJXMnIHJldHVybmVkIHJlc3BvbnNlICglcykgLSAlc1xuIiwKKwkJCQkJIG1lbWNtcCAoY21kcC0+Y21kLCAiTE9HSU4iLCA1KSA/CisJCQkJCQkJY21kcC0+Y21kIDogIkxPR0lOIDx1c2VyPiA8cGFzcz4iLAorCQkJCQkJCWFyZywgY21kID8gY21kIDogIiIpOworCQkJfQorCQkJaWYgKChyZXNwMiA9IHBhcnNlX3Jlc3BvbnNlX2NvZGUoIGN0eCwgJmNtZHAtPmNiLCBjbWQgKSkgPiByZXNwKQorCQkJCXJlc3AgPSByZXNwMjsKKwkJICBub3JtYWw6CisJCQlpZiAoY21kcC0+Y2IuZG9uZSkKKwkJCQljbWRwLT5jYi5kb25lKCBjdHgsIGNtZHAsIHJlc3AgKTsKKwkJCWlmIChjbWRwLT5jYi5kYXRhKQorCQkJCWZyZWUoIGNtZHAtPmNiLmRhdGEgKTsKKwkJCWZyZWUoIGNtZHAtPmNtZCApOworCQkJZnJlZSggY21kcCApOworCQkJaWYgKCF0Y21kIHx8IHRjbWQgPT0gY21kcCkKKwkJCQlyZXR1cm4gcmVzcDsKKwkJfQorCX0KKwkvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgdm9pZAoraW1hcF9jbG9zZV9zZXJ2ZXIoIGltYXBfc3RvcmVfdCAqaWN0eCApCit7CisJaW1hcF90ICppbWFwID0gaWN0eC0+aW1hcDsKKworCWlmIChpbWFwLT5idWYuc29jay5mZCAhPSAtMSkgeworCQlpbWFwX2V4ZWMoIGljdHgsIE5VTEwsICJMT0dPVVQiICk7CisJCWNsb3NlKCBpbWFwLT5idWYuc29jay5mZCApOworCX0KKwlmcmVlX2xpc3QoIGltYXAtPm5zX3BlcnNvbmFsICk7CisJZnJlZV9saXN0KCBpbWFwLT5uc19vdGhlciApOworCWZyZWVfbGlzdCggaW1hcC0+bnNfc2hhcmVkICk7CisJZnJlZSggaW1hcCApOworfQorCitzdGF0aWMgdm9pZAoraW1hcF9jbG9zZV9zdG9yZSggc3RvcmVfdCAqY3R4ICkKK3sKKwlpbWFwX2Nsb3NlX3NlcnZlciggKGltYXBfc3RvcmVfdCAqKWN0eCApOworCWZyZWVfZ2VuZXJpY19tZXNzYWdlcyggY3R4LT5tc2dzICk7CisJZnJlZSggY3R4ICk7Cit9CisKK3N0YXRpYyBzdG9yZV90ICoKK2ltYXBfb3Blbl9zdG9yZSggaW1hcF9zZXJ2ZXJfY29uZl90ICpzcnZjICkKK3sKKwlpbWFwX3N0b3JlX3QgKmN0eDsKKwlpbWFwX3QgKmltYXA7CisJY2hhciAqYXJnLCAqcnNwOworCXN0cnVjdCBob3N0ZW50ICpoZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcywgYVsyXSwgcHJlYXV0aDsKKwlwaWRfdCBwaWQ7CisKKwljdHggPSB4Y2FsbG9jKCBzaXplb2YoKmN0eCksIDEgKTsKKworCWN0eC0+aW1hcCA9IGltYXAgPSB4Y2FsbG9jKCBzaXplb2YoKmltYXApLCAxICk7CisJaW1hcC0+YnVmLnNvY2suZmQgPSAtMTsKKwlpbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgPSAmaW1hcC0+aW5fcHJvZ3Jlc3M7CisKKwkvKiBvcGVuIGNvbm5lY3Rpb24gdG8gSU1BUCBzZXJ2ZXIgKi8KKworCWlmIChzcnZjLT50dW5uZWwpIHsKKwkJaW5mbyggIlN0YXJ0aW5nIHR1bm5lbCAnJXMnLi4uICIsIHNydmMtPnR1bm5lbCApOworCisJCWlmIChzb2NrZXRwYWlyKCBQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgYSApKSB7CisJCQlwZXJyb3IoICJzb2NrZXRwYWlyIiApOworCQkJZXhpdCggMSApOworCQl9CisKKwkJcGlkID0gZm9yaygpOworCQlpZiAocGlkIDwgMCkKKwkJCV9leGl0KCAxMjcgKTsKKwkJaWYgKCFwaWQpIHsKKwkJCWlmIChkdXAyKCBhWzBdLCAwICkgPT0gLTEgfHwgZHVwMiggYVswXSwgMSApID09IC0xKQorCQkJCV9leGl0KCAxMjcgKTsKKwkJCWNsb3NlKCBhWzBdICk7CisJCQljbG9zZSggYVsxXSApOworCQkJZXhlY2woICIvYmluL3NoIiwgInNoIiwgIi1jIiwgc3J2Yy0+dHVubmVsLCBOVUxMICk7CisJCQlfZXhpdCggMTI3ICk7CisJCX0KKworCQljbG9zZSAoYVswXSk7CisKKwkJaW1hcC0+YnVmLnNvY2suZmQgPSBhWzFdOworCisJCWluZm8oICJva1xuIiApOworCX0gZWxzZSB7CisJCW1lbXNldCggJmFkZHIsIDAsIHNpemVvZihhZGRyKSApOworCQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMoIHNydmMtPnBvcnQgKTsKKwkJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworCQlpbmZvKCAiUmVzb2x2aW5nICVzLi4uICIsIHNydmMtPmhvc3QgKTsKKwkJaGUgPSBnZXRob3N0YnluYW1lKCBzcnZjLT5ob3N0ICk7CisJCWlmICghaGUpIHsKKwkJCXBlcnJvciggImdldGhvc3RieW5hbWUiICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJaW5mbyggIm9rXG4iICk7CisKKwkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKChpbnQgKikgaGUtPmhfYWRkcl9saXN0WzBdKTsKKworCQlzID0gc29ja2V0KCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCApOworCisJCWluZm8oICJDb25uZWN0aW5nIHRvICVzOiVodS4uLiAiLCBpbmV0X250b2EoIGFkZHIuc2luX2FkZHIgKSwgbnRvaHMoIGFkZHIuc2luX3BvcnQgKSApOworCQlpZiAoY29ubmVjdCggcywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikgKSkgeworCQkJY2xvc2UoIHMgKTsKKwkJCXBlcnJvciggImNvbm5lY3QiICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJaW5mbyggIm9rXG4iICk7CisKKwkJaW1hcC0+YnVmLnNvY2suZmQgPSBzOworCisJfQorCisJLyogcmVhZCB0aGUgZ3JlZXRpbmcgc3RyaW5nICovCisJaWYgKGJ1ZmZlcl9nZXRzKCAmaW1hcC0+YnVmLCAmcnNwICkpIHsKKwkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbm8gZ3JlZXRpbmcgcmVzcG9uc2VcbiIgKTsKKwkJZ290byBiYWlsOworCX0KKwlhcmcgPSBuZXh0X2FyZyggJnJzcCApOworCWlmICghYXJnIHx8ICphcmcgIT0gJyonIHx8IChhcmcgPSBuZXh0X2FyZyggJnJzcCApKSA9PSBOVUxMKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IGludmFsaWQgZ3JlZXRpbmcgcmVzcG9uc2VcbiIgKTsKKwkJZ290byBiYWlsOworCX0KKwlwcmVhdXRoID0gMDsKKwlpZiAoIXN0cmNtcCggIlBSRUFVVEgiLCBhcmcgKSkKKwkJcHJlYXV0aCA9IDE7CisJZWxzZSBpZiAoc3RyY21wKCAiT0siLCBhcmcgKSAhPSAwKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IHVua25vd24gZ3JlZXRpbmcgcmVzcG9uc2VcbiIgKTsKKwkJZ290byBiYWlsOworCX0KKwlwYXJzZV9yZXNwb25zZV9jb2RlKCBjdHgsIE5VTEwsIHJzcCApOworCWlmICghaW1hcC0+Y2FwcyAmJiBpbWFwX2V4ZWMoIGN0eCwgTlVMTCwgIkNBUEFCSUxJVFkiICkgIT0gUkVTUF9PSykKKwkJZ290byBiYWlsOworCisJaWYgKCFwcmVhdXRoKSB7CisKKwkJaW5mbyAoIkxvZ2dpbmcgaW4uLi5cbiIpOworCQlpZiAoIXNydmMtPnVzZXIpIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIlNraXBwaW5nIHNlcnZlciAlcywgbm8gdXNlclxuIiwgc3J2Yy0+aG9zdCApOworCQkJZ290byBiYWlsOworCQl9CisJCWlmICghc3J2Yy0+cGFzcykgeworCQkJY2hhciBwcm9tcHRbODBdOworCQkJc3ByaW50ZiggcHJvbXB0LCAiUGFzc3dvcmQgKCVzQCVzKTogIiwgc3J2Yy0+dXNlciwgc3J2Yy0+aG9zdCApOworCQkJYXJnID0gZ2V0cGFzcyggcHJvbXB0ICk7CisJCQlpZiAoIWFyZykgeworCQkJCXBlcnJvciggImdldHBhc3MiICk7CisJCQkJZXhpdCggMSApOworCQkJfQorCQkJaWYgKCEqYXJnKSB7CisJCQkJZnByaW50Ziggc3RkZXJyLCAiU2tpcHBpbmcgYWNjb3VudCAlc0Alcywgbm8gcGFzc3dvcmRcbiIsIHNydmMtPnVzZXIsIHNydmMtPmhvc3QgKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQkvKgorCQkJICogZ2V0cGFzcygpIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlci4gIG1ha2UgYSBjb3B5CisJCQkgKiBmb3IgbG9uZyB0ZXJtIHN0b3JhZ2UuCisJCQkgKi8KKwkJCXNydmMtPnBhc3MgPSBzdHJkdXAoIGFyZyApOworCQl9CisJCWlmIChDQVAoTk9MT0dJTikpIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIlNraXBwaW5nIGFjY291bnQgJXNAJXMsIHNlcnZlciBmb3JiaWRzIExPR0lOXG4iLCBzcnZjLT51c2VyLCBzcnZjLT5ob3N0ICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJd2FybiggIioqKiBJTUFQIFdhcm5pbmcgKioqIFBhc3N3b3JkIGlzIGJlaW5nIHNlbnQgaW4gdGhlIGNsZWFyXG4iICk7CisJCWlmIChpbWFwX2V4ZWMoIGN0eCwgTlVMTCwgIkxPR0lOIFwiJXNcIiBcIiVzXCIiLCBzcnZjLT51c2VyLCBzcnZjLT5wYXNzICkgIT0gUkVTUF9PSykgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogTE9HSU4gZmFpbGVkXG4iICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwl9IC8qICFwcmVhdXRoICovCisKKwljdHgtPnByZWZpeCA9ICIiOworCWN0eC0+dHJhc2huYyA9IDE7CisJcmV0dXJuIChzdG9yZV90ICopY3R4OworCisgIGJhaWw6CisJaW1hcF9jbG9zZV9zdG9yZSggJmN0eC0+Z2VuICk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2ltYXBfbWFrZV9mbGFncyggaW50IGZsYWdzLCBjaGFyICpidWYgKQoreworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgaSwgZDsKKworCWZvciAoaSA9IGQgPSAwOyBpIDwgQVJSQVlfU0laRShGbGFncyk7IGkrKykKKwkJaWYgKGZsYWdzICYgKDEgPDwgaSkpIHsKKwkJCWJ1ZltkKytdID0gJyAnOworCQkJYnVmW2QrK10gPSAnXFwnOworCQkJZm9yIChzID0gRmxhZ3NbaV07ICpzOyBzKyspCisJCQkJYnVmW2QrK10gPSAqczsKKwkJfQorCWJ1ZlswXSA9ICcoJzsKKwlidWZbZCsrXSA9ICcpJzsKKwlyZXR1cm4gZDsKK30KKworI2RlZmluZSBUVUlETCA4CisKK3N0YXRpYyBpbnQKK2ltYXBfc3RvcmVfbXNnKCBzdG9yZV90ICpnY3R4LCBtc2dfZGF0YV90ICpkYXRhLCBpbnQgKnVpZCApCit7CisJaW1hcF9zdG9yZV90ICpjdHggPSAoaW1hcF9zdG9yZV90ICopZ2N0eDsKKwlpbWFwX3QgKmltYXAgPSBjdHgtPmltYXA7CisJc3RydWN0IGltYXBfY21kX2NiIGNiOworCWNoYXIgKmZtYXAsICpidWY7CisJY29uc3QgY2hhciAqcHJlZml4LCAqYm94OworCWludCByZXQsIGksIGosIGQsIGxlbiwgZXh0cmEsIG5vY3I7CisJaW50IHN0YXJ0LCBzYnJlYWsgPSAwLCBlYnJlYWsgPSAwOworCWNoYXIgZmxhZ3N0clsxMjhdLCB0dWlkW1RVSURMICogMiArIDFdOworCisJbWVtc2V0KCAmY2IsIDAsIHNpemVvZihjYikgKTsKKworCWZtYXAgPSBkYXRhLT5kYXRhOworCWxlbiA9IGRhdGEtPmxlbjsKKwlub2NyID0gIWRhdGEtPmNybGY7CisJZXh0cmEgPSAwLCBpID0gMDsKKwlpZiAoIUNBUChVSURQTFVTKSAmJiB1aWQpIHsKKwkgIG5sb29wOgorCQlzdGFydCA9IGk7CisJCXdoaWxlIChpIDwgbGVuKQorCQkJaWYgKGZtYXBbaSsrXSA9PSAnXG4nKSB7CisJCQkJZXh0cmEgKz0gbm9jcjsKKwkJCQlpZiAoaSAtIDIgKyBub2NyID09IHN0YXJ0KSB7CisJCQkJCXNicmVhayA9IGVicmVhayA9IGkgLSAyICsgbm9jcjsKKwkJCQkJZ290byBta3RpZDsKKwkJCQl9CisJCQkJaWYgKCFtZW1jbXAoIGZtYXAgKyBzdGFydCwgIlgtVFVJRDogIiwgOCApKSB7CisJCQkJCWV4dHJhIC09IChlYnJlYWsgPSBpKSAtIChzYnJlYWsgPSBzdGFydCkgKyBub2NyOworCQkJCQlnb3RvIG1rdGlkOworCQkJCX0KKwkJCQlnb3RvIG5sb29wOworCQkJfQorCQkvKiBpbnZhbGlkIG1lc3NhZ2UgKi8KKwkJZnJlZSggZm1hcCApOworCQlyZXR1cm4gRFJWX01TR19CQUQ7CisJIG1rdGlkOgorCQlmb3IgKGogPSAwOyBqIDwgVFVJREw7IGorKykKKwkJCXNwcmludGYoIHR1aWQgKyBqICogMiwgIiUwMngiLCBhcmM0X2dldGJ5dGUoKSApOworCQlleHRyYSArPSA4ICsgVFVJREwgKiAyICsgMjsKKwl9CisJaWYgKG5vY3IpCisJCWZvciAoOyBpIDwgbGVuOyBpKyspCisJCQlpZiAoZm1hcFtpXSA9PSAnXG4nKQorCQkJCWV4dHJhKys7CisKKwljYi5kbGVuID0gbGVuICsgZXh0cmE7CisJYnVmID0gY2IuZGF0YSA9IHhtYWxsb2MoIGNiLmRsZW4gKTsKKwlpID0gMDsKKwlpZiAoIUNBUChVSURQTFVTKSAmJiB1aWQpIHsKKwkJaWYgKG5vY3IpIHsKKwkJCWZvciAoOyBpIDwgc2JyZWFrOyBpKyspCisJCQkJaWYgKGZtYXBbaV0gPT0gJ1xuJykgeworCQkJCQkqYnVmKysgPSAnXHInOworCQkJCQkqYnVmKysgPSAnXG4nOworCQkJCX0gZWxzZQorCQkJCQkqYnVmKysgPSBmbWFwW2ldOworCQl9IGVsc2UgeworCQkJbWVtY3B5KCBidWYsIGZtYXAsIHNicmVhayApOworCQkJYnVmICs9IHNicmVhazsKKwkJfQorCQltZW1jcHkoIGJ1ZiwgIlgtVFVJRDogIiwgOCApOworCQlidWYgKz0gODsKKwkJbWVtY3B5KCBidWYsIHR1aWQsIFRVSURMICogMiApOworCQlidWYgKz0gVFVJREwgKiAyOworCQkqYnVmKysgPSAnXHInOworCQkqYnVmKysgPSAnXG4nOworCQlpID0gZWJyZWFrOworCX0KKwlpZiAobm9jcikgeworCQlmb3IgKDsgaSA8IGxlbjsgaSsrKQorCQkJaWYgKGZtYXBbaV0gPT0gJ1xuJykgeworCQkJCSpidWYrKyA9ICdccic7CisJCQkJKmJ1ZisrID0gJ1xuJzsKKwkJCX0gZWxzZQorCQkJCSpidWYrKyA9IGZtYXBbaV07CisJfSBlbHNlCisJCW1lbWNweSggYnVmLCBmbWFwICsgaSwgbGVuIC0gaSApOworCisJZnJlZSggZm1hcCApOworCisJZCA9IDA7CisJaWYgKGRhdGEtPmZsYWdzKSB7CisJCWQgPSBpbWFwX21ha2VfZmxhZ3MoIGRhdGEtPmZsYWdzLCBmbGFnc3RyICk7CisJCWZsYWdzdHJbZCsrXSA9ICcgJzsKKwl9CisJZmxhZ3N0cltkXSA9IDA7CisKKwlpZiAoIXVpZCkgeworCQlib3ggPSBnY3R4LT5jb25mLT50cmFzaDsKKwkJcHJlZml4ID0gY3R4LT5wcmVmaXg7CisJCWNiLmNyZWF0ZSA9IDE7CisJCWlmIChjdHgtPnRyYXNobmMpCisJCQlpbWFwLT5jYXBzID0gaW1hcC0+cmNhcHMgJiB+KDEgPDwgTElURVJBTFBMVVMpOworCX0gZWxzZSB7CisJCWJveCA9IGdjdHgtPm5hbWU7CisJCXByZWZpeCA9ICFzdHJjbXAoIGJveCwgIklOQk9YIiApID8gIiIgOiBjdHgtPnByZWZpeDsKKwkJY2IuY3JlYXRlID0gMDsKKwl9CisJY2IuY3R4ID0gdWlkOworCXJldCA9IGltYXBfZXhlY19tKCBjdHgsICZjYiwgIkFQUEVORCBcIiVzJXNcIiAlcyIsIHByZWZpeCwgYm94LCBmbGFnc3RyICk7CisJaW1hcC0+Y2FwcyA9IGltYXAtPnJjYXBzOworCWlmIChyZXQgIT0gRFJWX09LKQorCQlyZXR1cm4gcmV0OworCWlmICghdWlkKQorCQljdHgtPnRyYXNobmMgPSAwOworCWVsc2UKKwkJZ2N0eC0+Y291bnQrKzsKKworCXJldHVybiBEUlZfT0s7Cit9CisKKyNkZWZpbmUgQ0hVTktTSVpFIDB4MTAwMAorCitzdGF0aWMgaW50CityZWFkX21lc3NhZ2UoIEZJTEUgKmYsIG1zZ19kYXRhX3QgKm1zZyApCit7CisJaW50IGxlbiwgcjsKKworCW1lbXNldCggbXNnLCAwLCBzaXplb2YgKm1zZyApOworCWxlbiA9IENIVU5LU0laRTsKKwltc2ctPmRhdGEgPSB4bWFsbG9jKCBsZW4rMSApOworCW1zZy0+ZGF0YVswXSA9IDA7CisKKwl3aGlsZSghZmVvZiggZiApKSB7CisJCWlmIChtc2ctPmxlbiA+PSBsZW4pIHsKKwkJCXZvaWQgKnA7CisJCQlsZW4gKz0gQ0hVTktTSVpFOworCQkJcCA9IHhyZWFsbG9jKG1zZy0+ZGF0YSwgbGVuKzEpOworCQkJaWYgKCFwKQorCQkJCWJyZWFrOworCQkJbXNnLT5kYXRhID0gcDsKKwkJfQorCQlyID0gZnJlYWQoICZtc2ctPmRhdGFbbXNnLT5sZW5dLCAxLCBsZW4gLSBtc2ctPmxlbiwgZiApOworCQlpZiAociA8PSAwKQorCQkJYnJlYWs7CisJCW1zZy0+bGVuICs9IHI7CisJfQorCW1zZy0+ZGF0YVttc2ctPmxlbl0gPSAwOworCXJldHVybiBtc2ctPmxlbjsKK30KKworc3RhdGljIGludAorY291bnRfbWVzc2FnZXMoIG1zZ19kYXRhX3QgKm1zZyApCit7CisJaW50IGNvdW50ID0gMDsKKwljaGFyICpwID0gbXNnLT5kYXRhOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFzdHJuY21wKCAiRnJvbSAiLCBwLCA1ICkpIHsKKwkJCWNvdW50Kys7CisJCQlwICs9IDU7CisJCX0KKwkJcCA9IHN0cnN0ciggcCs1LCAiXG5Gcm9tICIpOworCQlpZiAoIXApCisJCQlicmVhazsKKwkJcCsrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK3NwbGl0X21zZyggbXNnX2RhdGFfdCAqYWxsX21zZ3MsIG1zZ19kYXRhX3QgKm1zZywgaW50ICpvZnMgKQoreworCWNoYXIgKnAsICpkYXRhOworCisJbWVtc2V0KCBtc2csIDAsIHNpemVvZiAqbXNnICk7CisJaWYgKCpvZnMgPj0gYWxsX21zZ3MtPmxlbikKKwkJcmV0dXJuIDA7CisKKwlkYXRhID0gJmFsbF9tc2dzLT5kYXRhWyAqb2ZzIF07CisJbXNnLT5sZW4gPSBhbGxfbXNncy0+bGVuIC0gKm9mczsKKworCWlmIChtc2ctPmxlbiA8IDUgfHwgc3RybmNtcCggZGF0YSwgIkZyb20gIiwgNSApKQorCQlyZXR1cm4gMDsKKworCXAgPSBzdHJzdHIoIGRhdGEsICJcbkZyb20gIiApOworCWlmIChwKQorCQltc2ctPmxlbiA9ICZwWzFdIC0gZGF0YTsKKworCW1zZy0+ZGF0YSA9IHhtYWxsb2MoIG1zZy0+bGVuICsgMSApOworCWlmICghbXNnLT5kYXRhKQorCQlyZXR1cm4gMDsKKworCW1lbWNweSggbXNnLT5kYXRhLCBkYXRhLCBtc2ctPmxlbiApOworCW1zZy0+ZGF0YVsgbXNnLT5sZW4gXSA9IDA7CisKKwkqb2ZzICs9IG1zZy0+bGVuOworIAlyZXR1cm4gMTsKK30KKworc3RhdGljIGltYXBfc2VydmVyX2NvbmZfdCBzZXJ2ZXIgPQoreworCU5VTEwsCS8qIG5hbWUgKi8KKwlOVUxMLAkvKiB0dW5uZWwgKi8KKwlOVUxMLAkvKiBob3N0ICovCisJMCwJLyogcG9ydCAqLworCU5VTEwsCS8qIHVzZXIgKi8KKwlOVUxMLAkvKiBwYXNzICovCit9OworCitzdGF0aWMgY2hhciAqaW1hcF9mb2xkZXI7CisKK3N0YXRpYyBpbnQKK2dpdF9pbWFwX2NvbmZpZyhjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwljaGFyIGltYXBfa2V5W10gPSAiaW1hcC4iOworCisJaWYgKHN0cm5jbXAoIGtleSwgaW1hcF9rZXksIHNpemVvZiBpbWFwX2tleSAtIDEgKSkKKwkJcmV0dXJuIDA7CisJa2V5ICs9IHNpemVvZiBpbWFwX2tleSAtIDE7CisKKwlpZiAoIXN0cmNtcCggImZvbGRlciIsIGtleSApKSB7CisJCWltYXBfZm9sZGVyID0gc3RyZHVwKCB2YWwgKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJob3N0Iiwga2V5ICkpIHsKKwkJeworCQkJaWYgKCFzdHJuY21wKCAiaW1hcDoiLCB2YWwsIDUgKSkKKwkJCQl2YWwgKz0gNTsKKwkJCWlmICghc2VydmVyLnBvcnQpCisJCQkJc2VydmVyLnBvcnQgPSAxNDM7CisJCX0KKwkJaWYgKCFzdHJuY21wKCAiLy8iLCB2YWwsIDIgKSkKKwkJCXZhbCArPSAyOworCQlzZXJ2ZXIuaG9zdCA9IHN0cmR1cCggdmFsICk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoICJ1c2VyIiwga2V5ICkpCisJCXNlcnZlci51c2VyID0gc3RyZHVwKCB2YWwgKTsKKwllbHNlIGlmICghc3RyY21wKCAicGFzcyIsIGtleSApKQorCQlzZXJ2ZXIucGFzcyA9IHN0cmR1cCggdmFsICk7CisJZWxzZSBpZiAoIXN0cmNtcCggInBvcnQiLCBrZXkgKSkKKwkJc2VydmVyLnBvcnQgPSBnaXRfY29uZmlnX2ludCgga2V5LCB2YWwgKTsKKwllbHNlIGlmICghc3RyY21wKCAidHVubmVsIiwga2V5ICkpCisJCXNlcnZlci50dW5uZWwgPSBzdHJkdXAoIHZhbCApOworCXJldHVybiAwOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCW1zZ19kYXRhX3QgYWxsX21zZ3MsIG1zZzsKKwlzdG9yZV90ICpjdHggPSBOVUxMOworCWludCB1aWQgPSAwOworCWludCBvZnMgPSAwOworCWludCByOworCWludCB0b3RhbCwgbiA9IDA7CisKKwkvKiBpbml0IHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqLworCWFyYzRfaW5pdCgpOworCisJZ2l0X2NvbmZpZyggZ2l0X2ltYXBfY29uZmlnICk7CisKKwlpZiAoIWltYXBfZm9sZGVyKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIm5vIGltYXAgc3RvcmUgc3BlY2lmaWVkXG4iICk7CisJCXJldHVybiAxOworCX0KKworCS8qIHJlYWQgdGhlIG1lc3NhZ2VzICovCisJaWYgKCFyZWFkX21lc3NhZ2UoIHN0ZGluLCAmYWxsX21zZ3MgKSkgeworCQlmcHJpbnRmKHN0ZGVyciwibm90aGluZyB0byBzZW5kXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdG90YWwgPSBjb3VudF9tZXNzYWdlcyggJmFsbF9tc2dzICk7CisJaWYgKCF0b3RhbCkgeworCQlmcHJpbnRmKHN0ZGVyciwibm8gbWVzc2FnZXMgdG8gc2VuZFxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIHdyaXRlIGl0IHRvIHRoZSBpbWFwIHNlcnZlciAqLworCWN0eCA9IGltYXBfb3Blbl9zdG9yZSggJnNlcnZlciApOworCWlmICghY3R4KSB7CisJCWZwcmludGYoIHN0ZGVyciwiZmFpbGVkIHRvIG9wZW4gc3RvcmVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmcHJpbnRmKCBzdGRlcnIsICJzZW5kaW5nICVkIG1lc3NhZ2Ulc1xuIiwgdG90YWwsICh0b3RhbCE9MSk/InMiOiIiICk7CisJY3R4LT5uYW1lID0gaW1hcF9mb2xkZXI7CisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcGVyY2VudCA9IG4gKiAxMDAgLyB0b3RhbDsKKwkJZnByaW50Ziggc3RkZXJyLCAiJTR1JSUgKCVkLyVkKSBkb25lXHIiLCBwZXJjZW50LCBuLCB0b3RhbCApOworCQlpZiAoIXNwbGl0X21zZyggJmFsbF9tc2dzLCAmbXNnLCAmb2ZzICkpCisJCQlicmVhazsKKwkJciA9IGltYXBfc3RvcmVfbXNnKCBjdHgsICZtc2csICZ1aWQgKTsKKwkJaWYgKHIgIT0gRFJWX09LKSBicmVhazsKKwkJbisrOworCX0KKwlmcHJpbnRmKCBzdGRlcnIsIlxuIiApOworCisJaW1hcF9jbG9zZV9zdG9yZSggY3R4ICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2luZGV4LXBhY2suYyBiL2luZGV4LXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk5NTNkCi0tLSAvZGV2L251bGwKKysrIGIvaW5kZXgtcGFjay5jCkBAIC0wLDAgKzEsNDcyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJjc3VtLWZpbGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBpbmRleF9wYWNrX3VzYWdlW10gPQorImdpdC1pbmRleC1wYWNrIFstbyBpbmRleC1maWxlXSBwYWNrLWZpbGUiOworCitzdHJ1Y3Qgb2JqZWN0X2VudHJ5Cit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWVudW0gb2JqZWN0X3R5cGUgcmVhbF90eXBlOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdHJ1Y3QgZGVsdGFfZW50cnkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmo7CisJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBhY2tfbmFtZTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWNrX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWNrX3NpemU7CitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqZWN0czsKK3N0YXRpYyBzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhczsKK3N0YXRpYyBpbnQgbnJfb2JqZWN0czsKK3N0YXRpYyBpbnQgbnJfZGVsdGFzOworCitzdGF0aWMgdm9pZCBvcGVuX3BhY2tfZmlsZSh2b2lkKQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWZkID0gb3BlbihwYWNrX25hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlkaWUoImNhbm5vdCBvcGVuIHBhY2tmaWxlICclcyc6ICVzIiwgcGFja19uYW1lLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZnN0YXQoZmQsICZzdCkpIHsKKwkJaW50IGVyciA9IGVycm5vOworCQljbG9zZShmZCk7CisJCWRpZSgiY2Fubm90IGZzdGF0IHBhY2tmaWxlICclcyc6ICVzIiwgcGFja19uYW1lLAorCQkgICAgc3RyZXJyb3IoZXJyKSk7CisJfQorCXBhY2tfc2l6ZSA9IHN0LnN0X3NpemU7CisJcGFja19iYXNlID0gbW1hcChOVUxMLCBwYWNrX3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAocGFja19iYXNlID09IE1BUF9GQUlMRUQpIHsKKwkJaW50IGVyciA9IGVycm5vOworCQljbG9zZShmZCk7CisJCWRpZSgiY2Fubm90IG1tYXAgcGFja2ZpbGUgJyVzJzogJXMiLCBwYWNrX25hbWUsCisJCSAgICBzdHJlcnJvcihlcnIpKTsKKwl9CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9wYWNrX2hlYWRlcih2b2lkKQoreworCWNvbnN0IHN0cnVjdCBwYWNrX2hlYWRlciAqaGRyOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJU0hBX0NUWCBjdHg7CisKKwkvKiBFbnN1cmUgdGhlcmUgYXJlIGVub3VnaCBieXRlcyBmb3IgdGhlIGhlYWRlciBhbmQgZmluYWwgU0hBMSAqLworCWlmIChwYWNrX3NpemUgPCBzaXplb2Yoc3RydWN0IHBhY2tfaGVhZGVyKSArIDIwKQorCQlkaWUoInBhY2tmaWxlICclcycgaXMgdG9vIHNtYWxsIiwgcGFja19uYW1lKTsKKworCS8qIEhlYWRlciBjb25zaXN0ZW5jeSBjaGVjayAqLworCWhkciA9ICh2b2lkICopcGFja19iYXNlOworCWlmIChoZHItPmhkcl9zaWduYXR1cmUgIT0gaHRvbmwoUEFDS19TSUdOQVRVUkUpKQorCQlkaWUoInBhY2tmaWxlICclcycgc2lnbmF0dXJlIG1pc21hdGNoIiwgcGFja19uYW1lKTsKKwlpZiAoIXBhY2tfdmVyc2lvbl9vayhoZHItPmhkcl92ZXJzaW9uKSkKKwkJZGllKCJwYWNrZmlsZSAnJXMnIHZlcnNpb24gJWQgdW5zdXBwb3J0ZWQiLAorCQkgICAgcGFja19uYW1lLCBudG9obChoZHItPmhkcl92ZXJzaW9uKSk7CisKKwlucl9vYmplY3RzID0gbnRvaGwoaGRyLT5oZHJfZW50cmllcyk7CisKKwkvKiBDaGVjayBwYWNrZmlsZSBpbnRlZ3JpdHkgKi8KKwlTSEExX0luaXQoJmN0eCk7CisJU0hBMV9VcGRhdGUoJmN0eCwgcGFja19iYXNlLCBwYWNrX3NpemUgLSAyMCk7CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlpZiAobWVtY21wKHNoYTEsIHBhY2tfYmFzZSArIHBhY2tfc2l6ZSAtIDIwLCAyMCkpCisJCWRpZSgicGFja2ZpbGUgJyVzJyBTSEExIG1pc21hdGNoIiwgcGFja19uYW1lKTsKK30KKworc3RhdGljIHZvaWQgYmFkX29iamVjdCh1bnNpZ25lZCBsb25nIG9mZnNldCwgY29uc3QgY2hhciAqZm9ybWF0LAorCQkgICAgICAgLi4uKSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKworc3RhdGljIHZvaWQgYmFkX29iamVjdCh1bnNpZ25lZCBsb25nIG9mZnNldCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJY2hhciBidWZbMTAyNF07CisKKwl2YV9zdGFydChwYXJhbXMsIGZvcm1hdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlkaWUoInBhY2tmaWxlICclcyc6IGJhZCBvYmplY3QgYXQgb2Zmc2V0ICVsdTogJXMiLAorCSAgICBwYWNrX25hbWUsIG9mZnNldCwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgKnVucGFja19lbnRyeV9kYXRhKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmN1cnJlbnRfcG9zLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBwYWNrX2xpbWl0ID0gcGFja19zaXplIC0gMjA7CisJdW5zaWduZWQgbG9uZyBwb3MgPSAqY3VycmVudF9wb3M7CisJel9zdHJlYW0gc3RyZWFtOworCXZvaWQgKmJ1ZiA9IHhtYWxsb2Moc2l6ZSk7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCXN0cmVhbS5uZXh0X291dCA9IGJ1ZjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKwlzdHJlYW0ubmV4dF9pbiA9IHBhY2tfYmFzZSArIHBvczsKKwlzdHJlYW0uYXZhaWxfaW4gPSBwYWNrX2xpbWl0IC0gcG9zOworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCisJZm9yICg7OykgeworCQlpbnQgcmV0ID0gaW5mbGF0ZSgmc3RyZWFtLCAwKTsKKwkJaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCisJCQlicmVhazsKKwkJaWYgKHJldCAhPSBaX09LKQorCQkJYmFkX29iamVjdChvZmZzZXQsICJpbmZsYXRlIHJldHVybmVkICVkIiwgcmV0KTsKKwl9CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlpZiAoc3RyZWFtLnRvdGFsX291dCAhPSBzaXplKQorCQliYWRfb2JqZWN0KG9mZnNldCwgInNpemUgbWlzbWF0Y2ggKGV4cGVjdGVkICVsdSwgZ290ICVsdSkiLAorCQkJICAgc2l6ZSwgc3RyZWFtLnRvdGFsX291dCk7CisJKmN1cnJlbnRfcG9zID0gcGFja19saW1pdCAtIHN0cmVhbS5hdmFpbF9pbjsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCAqdW5wYWNrX3Jhd19lbnRyeSh1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgIGVudW0gb2JqZWN0X3R5cGUgKm9ial90eXBlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqb2JqX3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICpkZWx0YV9iYXNlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbmV4dF9vYmpfb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgcGFja19saW1pdCA9IHBhY2tfc2l6ZSAtIDIwOworCXVuc2lnbmVkIGxvbmcgcG9zID0gb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgc2hpZnQ7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXZvaWQgKmRhdGE7CisKKwljID0gcGFja19iYXNlW3BvcysrXTsKKwl0eXBlID0gKGMgPj4gNCkgJiA3OworCXNpemUgPSAoYyAmIDE1KTsKKwlzaGlmdCA9IDQ7CisJd2hpbGUgKGMgJiAweDgwKSB7CisJCWlmIChwb3MgPj0gcGFja19saW1pdCkKKwkJCWJhZF9vYmplY3Qob2Zmc2V0LCAib2JqZWN0IGV4dGVuZHMgcGFzdCBlbmQgb2YgcGFjayIpOworCQljID0gcGFja19iYXNlW3BvcysrXTsKKwkJc2l6ZSArPSAoYyAmIDB4N2ZVTCkgPDwgc2hpZnQ7CisJCXNoaWZ0ICs9IDc7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPQkpfREVMVEE6CisJCWlmIChwb3MgKyAyMCA+PSBwYWNrX2xpbWl0KQorCQkJYmFkX29iamVjdChvZmZzZXQsICJvYmplY3QgZXh0ZW5kcyBwYXN0IGVuZCBvZiBwYWNrIik7CisJCW1lbWNweShkZWx0YV9iYXNlLCBwYWNrX2Jhc2UgKyBwb3MsIDIwKTsKKwkJcG9zICs9IDIwOworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgT0JKX0NPTU1JVDoKKwljYXNlIE9CSl9UUkVFOgorCWNhc2UgT0JKX0JMT0I6CisJY2FzZSBPQkpfVEFHOgorCQlkYXRhID0gdW5wYWNrX2VudHJ5X2RhdGEob2Zmc2V0LCAmcG9zLCBzaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmFkX29iamVjdChvZmZzZXQsICJiYWQgb2JqZWN0IHR5cGUgJWQiLCB0eXBlKTsKKwl9CisKKwkqb2JqX3R5cGUgPSB0eXBlOworCSpvYmpfc2l6ZSA9IHNpemU7CisJKm5leHRfb2JqX29mZnNldCA9IHBvczsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBmaW5kX2RlbHRhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2Vfc2hhMSkKK3sKKwlpbnQgZmlyc3QgPSAwLCBsYXN0ID0gbnJfZGVsdGFzOworCisgICAgICAgIHdoaWxlIChmaXJzdCA8IGxhc3QpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dCA9IChmaXJzdCArIGxhc3QpIC8gMjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhID0gJmRlbHRhc1tuZXh0XTsKKyAgICAgICAgICAgICAgICBpbnQgY21wOworCisgICAgICAgICAgICAgICAgY21wID0gbWVtY21wKGJhc2Vfc2hhMSwgZGVsdGEtPmJhc2Vfc2hhMSwgMjApOworICAgICAgICAgICAgICAgIGlmICghY21wKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcnN0ID0gbmV4dCsxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtZmlyc3QtMTsKK30KKworc3RhdGljIGludCBmaW5kX2RlbHRhc19iYXNlZF9vbl9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2Vfc2hhMSwKKwkJCQkgICAgIGludCAqZmlyc3RfaW5kZXgsIGludCAqbGFzdF9pbmRleCkKK3sKKwlpbnQgZmlyc3QgPSBmaW5kX2RlbHRhKGJhc2Vfc2hhMSk7CisJaW50IGxhc3QgPSBmaXJzdDsKKwlpbnQgZW5kID0gbnJfZGVsdGFzIC0gMTsKKworCWlmIChmaXJzdCA8IDApCisJCXJldHVybiAtMTsKKwl3aGlsZSAoZmlyc3QgPiAwICYmICFtZW1jbXAoZGVsdGFzW2ZpcnN0LTFdLmJhc2Vfc2hhMSwgYmFzZV9zaGExLCAyMCkpCisJCS0tZmlyc3Q7CisJd2hpbGUgKGxhc3QgPCBlbmQgJiYgIW1lbWNtcChkZWx0YXNbbGFzdCsxXS5iYXNlX3NoYTEsIGJhc2Vfc2hhMSwgMjApKQorCQkrK2xhc3Q7CisJKmZpcnN0X2luZGV4ID0gZmlyc3Q7CisJKmxhc3RfaW5kZXggPSBsYXN0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaGExX29iamVjdChjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQllbnVtIG9iamVjdF90eXBlIHR5cGUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJU0hBX0NUWCBjdHg7CisJY2hhciBoZWFkZXJbNTBdOworCWludCBoZWFkZXJfc2l6ZTsKKwljb25zdCBjaGFyICp0eXBlX3N0cjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0JKX0NPTU1JVDogdHlwZV9zdHIgPSBjb21taXRfdHlwZTsgYnJlYWs7CisJY2FzZSBPQkpfVFJFRTogICB0eXBlX3N0ciA9IHRyZWVfdHlwZTsgYnJlYWs7CisJY2FzZSBPQkpfQkxPQjogICB0eXBlX3N0ciA9IGJsb2JfdHlwZTsgYnJlYWs7CisJY2FzZSBPQkpfVEFHOiAgICB0eXBlX3N0ciA9IHRhZ190eXBlOyBicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoImJhZCB0eXBlICVkIiwgdHlwZSk7CisJfQorCisJaGVhZGVyX3NpemUgPSBzcHJpbnRmKGhlYWRlciwgIiVzICVsdSIsIHR5cGVfc3RyLCBzaXplKSArIDE7CisKKwlTSEExX0luaXQoJmN0eCk7CisJU0hBMV9VcGRhdGUoJmN0eCwgaGVhZGVyLCBoZWFkZXJfc2l6ZSk7CisJU0hBMV9VcGRhdGUoJmN0eCwgZGF0YSwgc2l6ZSk7CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKK30KKworc3RhdGljIHZvaWQgcmVzb2x2ZV9kZWx0YShzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhLCB2b2lkICpiYXNlX2RhdGEsCisJCQkgIHVuc2lnbmVkIGxvbmcgYmFzZV9zaXplLCBlbnVtIG9iamVjdF90eXBlIHR5cGUpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gZGVsdGEtPm9iajsKKwl2b2lkICpkZWx0YV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZTsKKwl2b2lkICpyZXN1bHQ7CisJdW5zaWduZWQgbG9uZyByZXN1bHRfc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIGRlbHRhX3R5cGU7CisJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCXVuc2lnbmVkIGxvbmcgbmV4dF9vYmpfb2Zmc2V0OworCWludCBqLCBmaXJzdCwgbGFzdDsKKworCW9iai0+cmVhbF90eXBlID0gdHlwZTsKKwlkZWx0YV9kYXRhID0gdW5wYWNrX3Jhd19lbnRyeShvYmotPm9mZnNldCwgJmRlbHRhX3R5cGUsCisJCQkJICAgICAgJmRlbHRhX3NpemUsIGJhc2Vfc2hhMSwKKwkJCQkgICAgICAmbmV4dF9vYmpfb2Zmc2V0KTsKKwlyZXN1bHQgPSBwYXRjaF9kZWx0YShiYXNlX2RhdGEsIGJhc2Vfc2l6ZSwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSwKKwkJCSAgICAgJnJlc3VsdF9zaXplKTsKKwlmcmVlKGRlbHRhX2RhdGEpOworCWlmICghcmVzdWx0KQorCQliYWRfb2JqZWN0KG9iai0+b2Zmc2V0LCAiZmFpbGVkIHRvIGFwcGx5IGRlbHRhIik7CisJc2hhMV9vYmplY3QocmVzdWx0LCByZXN1bHRfc2l6ZSwgdHlwZSwgb2JqLT5zaGExKTsKKwlpZiAoIWZpbmRfZGVsdGFzX2Jhc2VkX29uX3NoYTEob2JqLT5zaGExLCAmZmlyc3QsICZsYXN0KSkgeworCQlmb3IgKGogPSBmaXJzdDsgaiA8PSBsYXN0OyBqKyspCisJCQlyZXNvbHZlX2RlbHRhKCZkZWx0YXNbal0sIHJlc3VsdCwgcmVzdWx0X3NpemUsIHR5cGUpOworCX0KKwlmcmVlKHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9kZWx0YV9lbnRyeShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBkZWx0YV9lbnRyeSAqZGVsdGFfYSA9IGE7CisJY29uc3Qgc3RydWN0IGRlbHRhX2VudHJ5ICpkZWx0YV9iID0gYjsKKwlyZXR1cm4gbWVtY21wKGRlbHRhX2EtPmJhc2Vfc2hhMSwgZGVsdGFfYi0+YmFzZV9zaGExLCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3BhY2tfb2JqZWN0cyh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBwYWNrX2hlYWRlcik7CisJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhX3NpemU7CisKKwkvKgorCSAqIEZpcnN0IHBhc3M6CisJICogLSBmaW5kIGxvY2F0aW9ucyBvZiBhbGwgb2JqZWN0czsKKwkgKiAtIGNhbGN1bGF0ZSBTSEExIG9mIGFsbCBub24tZGVsdGEgb2JqZWN0czsKKwkgKiAtIHJlbWVtYmVyIGJhc2UgU0hBMSBmb3IgYWxsIGRlbHRhcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKm9iaiA9ICZvYmplY3RzW2ldOworCQlvYmotPm9mZnNldCA9IG9mZnNldDsKKwkJZGF0YSA9IHVucGFja19yYXdfZW50cnkob2Zmc2V0LCAmb2JqLT50eXBlLCAmZGF0YV9zaXplLAorCQkJCQliYXNlX3NoYTEsICZvZmZzZXQpOworCQlvYmotPnJlYWxfdHlwZSA9IG9iai0+dHlwZTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfREVMVEEpIHsKKwkJCXN0cnVjdCBkZWx0YV9lbnRyeSAqZGVsdGEgPSAmZGVsdGFzW25yX2RlbHRhcysrXTsKKwkJCWRlbHRhLT5vYmogPSBvYmo7CisJCQltZW1jcHkoZGVsdGEtPmJhc2Vfc2hhMSwgYmFzZV9zaGExLCAyMCk7CisJCX0gZWxzZQorCQkJc2hhMV9vYmplY3QoZGF0YSwgZGF0YV9zaXplLCBvYmotPnR5cGUsIG9iai0+c2hhMSk7CisJCWZyZWUoZGF0YSk7CisJfQorCWlmIChvZmZzZXQgIT0gcGFja19zaXplIC0gMjApCisJCWRpZSgicGFja2ZpbGUgJyVzJyBoYXMganVuayBhdCB0aGUgZW5kIiwgcGFja19uYW1lKTsKKworCS8qIFNvcnQgZGVsdGFzIGJ5IGJhc2UgU0hBMSBmb3IgZmFzdCBzZWFyY2hpbmcgKi8KKwlxc29ydChkZWx0YXMsIG5yX2RlbHRhcywgc2l6ZW9mKHN0cnVjdCBkZWx0YV9lbnRyeSksCisJICAgICAgY29tcGFyZV9kZWx0YV9lbnRyeSk7CisKKwkvKgorCSAqIFNlY29uZCBwYXNzOgorCSAqIC0gZm9yIGFsbCBub24tZGVsdGEgb2JqZWN0cywgbG9vayBpZiBpdCBpcyB1c2VkIGFzIGEgYmFzZSBmb3IKKwkgKiAgIGRlbHRhczsKKwkgKiAtIGlmIHVzZWQgYXMgYSBiYXNlLCB1bmNvbXByZXNzIHRoZSBvYmplY3QgYW5kIGFwcGx5IGFsbCBkZWx0YXMsCisJICogICByZWN1cnNpdmVseSBjaGVja2luZyBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBpcyB1c2VkIGFzIGEgYmFzZQorCSAqICAgZm9yIHNvbWUgbW9yZSBkZWx0YXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmogPSAmb2JqZWN0c1tpXTsKKwkJaW50IGosIGZpcnN0LCBsYXN0OworCisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0RFTFRBKQorCQkJY29udGludWU7CisJCWlmIChmaW5kX2RlbHRhc19iYXNlZF9vbl9zaGExKG9iai0+c2hhMSwgJmZpcnN0LCAmbGFzdCkpCisJCQljb250aW51ZTsKKwkJZGF0YSA9IHVucGFja19yYXdfZW50cnkob2JqLT5vZmZzZXQsICZvYmotPnR5cGUsICZkYXRhX3NpemUsCisJCQkJCWJhc2Vfc2hhMSwgJm9mZnNldCk7CisJCWZvciAoaiA9IGZpcnN0OyBqIDw9IGxhc3Q7IGorKykKKwkJCXJlc29sdmVfZGVsdGEoJmRlbHRhc1tqXSwgZGF0YSwgZGF0YV9zaXplLCBvYmotPnR5cGUpOworCQlmcmVlKGRhdGEpOworCX0KKworCS8qIENoZWNrIGZvciB1bnJlc29sdmVkIGRlbHRhcyAqLworCWZvciAoaSA9IDA7IGkgPCBucl9kZWx0YXM7IGkrKykgeworCQlpZiAoZGVsdGFzW2ldLm9iai0+cmVhbF90eXBlID09IE9CSl9ERUxUQSkKKwkJCWRpZSgicGFja2ZpbGUgJyVzJyBoYXMgdW5yZXNvbHZlZCBkZWx0YXMiLCAgcGFja19uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2hhMV9jb21wYXJlKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9hOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmIgPSAqKHN0cnVjdCBvYmplY3RfZW50cnkgKiopX2I7CisJcmV0dXJuIG1lbWNtcChhLT5zaGExLCBiLT5zaGExLCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2luZGV4X2ZpbGUoY29uc3QgY2hhciAqaW5kZXhfbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc2hhMWZpbGUgKmY7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKnNvcnRlZF9ieV9zaGEsICoqbGlzdCwgKipsYXN0OworCXVuc2lnbmVkIGludCBhcnJheVsyNTZdOworCWludCBpOworCVNIQV9DVFggY3R4OworCisJaWYgKG5yX29iamVjdHMpIHsKKwkJc29ydGVkX2J5X3NoYSA9CisJCQl4Y2FsbG9jKG5yX29iamVjdHMsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICopKTsKKwkJbGlzdCA9IHNvcnRlZF9ieV9zaGE7CisJCWxhc3QgPSBzb3J0ZWRfYnlfc2hhICsgbnJfb2JqZWN0czsKKwkJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7ICsraSkKKwkJCXNvcnRlZF9ieV9zaGFbaV0gPSAmb2JqZWN0c1tpXTsKKwkJcXNvcnQoc29ydGVkX2J5X3NoYSwgbnJfb2JqZWN0cywgc2l6ZW9mKHNvcnRlZF9ieV9zaGFbMF0pLAorCQkgICAgICBzaGExX2NvbXBhcmUpOworCisJfQorCWVsc2UKKwkJc29ydGVkX2J5X3NoYSA9IGxpc3QgPSBsYXN0ID0gTlVMTDsKKworCXVubGluayhpbmRleF9uYW1lKTsKKwlmID0gc2hhMWNyZWF0ZSgiJXMiLCBpbmRleF9uYW1lKTsKKworCS8qCisJICogV3JpdGUgdGhlIGZpcnN0LWxldmVsIHRhYmxlICh0aGUgbGlzdCBpcyBzb3J0ZWQsCisJICogYnV0IHdlIHVzZSBhIDI1Ni1lbnRyeSBsb29rdXAgdG8gYmUgYWJsZSB0byBhdm9pZAorCSAqIGhhdmluZyB0byBkbyBlaWdodCBleHRyYSBiaW5hcnkgc2VhcmNoIGl0ZXJhdGlvbnMpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbmV4dCA9IGxpc3Q7CisJCXdoaWxlIChuZXh0IDwgbGFzdCkgeworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gKm5leHQ7CisJCQlpZiAob2JqLT5zaGExWzBdICE9IGkpCisJCQkJYnJlYWs7CisJCQluZXh0Kys7CisJCX0KKwkJYXJyYXlbaV0gPSBodG9ubChuZXh0IC0gc29ydGVkX2J5X3NoYSk7CisJCWxpc3QgPSBuZXh0OworCX0KKwlzaGExd3JpdGUoZiwgYXJyYXksIDI1NiAqIHNpemVvZihpbnQpKTsKKworCS8qIHJlY29tcHV0ZSB0aGUgU0hBMSBoYXNoIG9mIHNvcnRlZCBvYmplY3QgbmFtZXMuCisJICogY3VycmVudGx5IHBhY2stb2JqZWN0cyBkb2VzIG5vdCBkbyB0aGlzLCBidXQgdGhhdAorCSAqIGNhbiBiZSBmaXhlZC4KKwkgKi8KKwlTSEExX0luaXQoJmN0eCk7CisJLyoKKwkgKiBXcml0ZSB0aGUgYWN0dWFsIFNIQTEgZW50cmllcy4uCisJICovCisJbGlzdCA9IHNvcnRlZF9ieV9zaGE7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmogPSAqbGlzdCsrOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gaHRvbmwob2JqLT5vZmZzZXQpOworCQlzaGExd3JpdGUoZiwgJm9mZnNldCwgNCk7CisJCXNoYTF3cml0ZShmLCBvYmotPnNoYTEsIDIwKTsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgb2JqLT5zaGExLCAyMCk7CisJfQorCXNoYTF3cml0ZShmLCBwYWNrX2Jhc2UgKyBwYWNrX3NpemUgLSAyMCwgMjApOworCXNoYTFjbG9zZShmLCBOVUxMLCAxKTsKKwlmcmVlKHNvcnRlZF9ieV9zaGEpOworCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwljaGFyICppbmRleF9uYW1lID0gTlVMTDsKKwljaGFyICppbmRleF9uYW1lX2J1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGFyZywgIi1vIikpIHsKKwkJCQlpZiAoaW5kZXhfbmFtZSB8fCAoaSsxKSA+PSBhcmdjKQorCQkJCQl1c2FnZShpbmRleF9wYWNrX3VzYWdlKTsKKwkJCQlpbmRleF9uYW1lID0gYXJndlsrK2ldOworCQkJfSBlbHNlCisJCQkJdXNhZ2UoaW5kZXhfcGFja191c2FnZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwYWNrX25hbWUpCisJCQl1c2FnZShpbmRleF9wYWNrX3VzYWdlKTsKKwkJcGFja19uYW1lID0gYXJnOworCX0KKworCWlmICghcGFja19uYW1lKQorCQl1c2FnZShpbmRleF9wYWNrX3VzYWdlKTsKKwlpZiAoIWluZGV4X25hbWUpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihwYWNrX25hbWUpOworCQlpZiAobGVuIDwgNSB8fCBzdHJjbXAocGFja19uYW1lICsgbGVuIC0gNSwgIi5wYWNrIikpCisJCQlkaWUoInBhY2tmaWxlIG5hbWUgJyVzJyBkb2VzIG5vdCBlbmQgd2l0aCAnLnBhY2snIiwKKwkJCSAgICBwYWNrX25hbWUpOworCQlpbmRleF9uYW1lX2J1ZiA9IHhtYWxsb2MobGVuKTsKKwkJbWVtY3B5KGluZGV4X25hbWVfYnVmLCBwYWNrX25hbWUsIGxlbiAtIDUpOworCQlzdHJjcHkoaW5kZXhfbmFtZV9idWYgKyBsZW4gLSA1LCAiLmlkeCIpOworCQlpbmRleF9uYW1lID0gaW5kZXhfbmFtZV9idWY7CisJfQorCisJb3Blbl9wYWNrX2ZpbGUoKTsKKwlwYXJzZV9wYWNrX2hlYWRlcigpOworCW9iamVjdHMgPSB4Y2FsbG9jKG5yX29iamVjdHMsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KSk7CisJZGVsdGFzID0geGNhbGxvYyhucl9vYmplY3RzLCBzaXplb2Yoc3RydWN0IGRlbHRhX2VudHJ5KSk7CisJcGFyc2VfcGFja19vYmplY3RzKCk7CisJZnJlZShkZWx0YXMpOworCXdyaXRlX2luZGV4X2ZpbGUoaW5kZXhfbmFtZSwgc2hhMSk7CisJZnJlZShvYmplY3RzKTsKKwlmcmVlKGluZGV4X25hbWVfYnVmKTsKKworCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbG9jYWwtZmV0Y2guYyBiL2xvY2FsLWZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhNDg4NwotLS0gL2Rldi9udWxsCisrKyBiL2xvY2FsLWZldGNoLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKworc3RhdGljIGludCB1c2VfbGluayA9IDA7CitzdGF0aWMgaW50IHVzZV9zeW1saW5rID0gMDsKK3N0YXRpYyBpbnQgdXNlX2ZpbGVjb3B5ID0gMTsKKworc3RhdGljIGNoYXIgKnBhdGg7IC8qICJSZW1vdGUiIGdpdCByZXBvc2l0b3J5ICovCisKK3ZvaWQgcHJlZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKK30KKworc3RhdGljIHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHNldHVwX2luZGV4KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKm5ld19wYWNrOworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCXN0cmNweShmaWxlbmFtZSwgcGF0aCk7CisJc3RyY2F0KGZpbGVuYW1lLCAiL29iamVjdHMvcGFjay9wYWNrLSIpOworCXN0cmNhdChmaWxlbmFtZSwgc2hhMV90b19oZXgoc2hhMSkpOworCXN0cmNhdChmaWxlbmFtZSwgIi5pZHgiKTsKKwluZXdfcGFjayA9IHBhcnNlX3BhY2tfaW5kZXhfZmlsZShzaGExLCBmaWxlbmFtZSk7CisJbmV3X3BhY2stPm5leHQgPSBwYWNrczsKKwlwYWNrcyA9IG5ld19wYWNrOworfQorCitzdGF0aWMgaW50IHNldHVwX2luZGljZXModm9pZCkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXNwcmludGYoZmlsZW5hbWUsICIlcy9vYmplY3RzL3BhY2svIiwgcGF0aCk7CisJZGlyID0gb3BlbmRpcihmaWxlbmFtZSk7CisJaWYgKCFkaXIpCisJCXJldHVybiAtMTsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWludCBuYW1lbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCQlpZiAobmFtZWxlbiAhPSA1MCB8fCAKKwkJICAgIHN0cmNtcChkZS0+ZF9uYW1lICsgbmFtZWxlbiAtIDUsICIucGFjayIpKQorCQkJY29udGludWU7CisJCWdldF9zaGExX2hleChkZS0+ZF9uYW1lICsgNSwgc2hhMSk7CisJCXNldHVwX2luZGV4KHNoYTEpOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfZmlsZShjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKmhleCwKKwkJICAgICBpbnQgd2Fybl9pZl9ub3RfZXhpc3RzKQoreworCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoZGVzdCk7CisJaWYgKHVzZV9saW5rKSB7CisJCWlmICghbGluayhzb3VyY2UsIGRlc3QpKSB7CisJCQlwdWxsX3NheSgibGluayAlc1xuIiwgaGV4KTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIElmIHdlIGdvdCBFTk9FTlQgdGhlcmUgaXMgbm8gcG9pbnQgY29udGludWluZy4gKi8KKwkJaWYgKGVycm5vID09IEVOT0VOVCkgeworCQkJaWYgKHdhcm5faWZfbm90X2V4aXN0cykKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImRvZXMgbm90IGV4aXN0ICVzXG4iLCBzb3VyY2UpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmICh1c2Vfc3ltbGluaykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaWYgKHN0YXQoc291cmNlLCAmc3QpKSB7CisJCQlpZiAoIXdhcm5faWZfbm90X2V4aXN0cyAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQkJcmV0dXJuIC0xOworCQkJZnByaW50ZihzdGRlcnIsICJjYW5ub3Qgc3RhdCAlczogJXNcbiIsIHNvdXJjZSwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghc3ltbGluayhzb3VyY2UsIGRlc3QpKSB7CisJCQlwdWxsX3NheSgic3ltbGluayAlc1xuIiwgaGV4KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmICh1c2VfZmlsZWNvcHkpIHsKKwkJaW50IGlmZCwgb2ZkLCBzdGF0dXMgPSAwOworCisJCWlmZCA9IG9wZW4oc291cmNlLCBPX1JET05MWSk7CisJCWlmIChpZmQgPCAwKSB7CisJCQlpZiAoIXdhcm5faWZfbm90X2V4aXN0cyAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQkJcmV0dXJuIC0xOworCQkJZnByaW50ZihzdGRlcnIsICJjYW5ub3Qgb3BlbiAlc1xuIiwgc291cmNlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlvZmQgPSBvcGVuKGRlc3QsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJCWlmIChvZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBvcGVuICVzXG4iLCBkZXN0KTsKKwkJCWNsb3NlKGlmZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RhdHVzID0gY29weV9mZChpZmQsIG9mZCk7CisJCWNsb3NlKG9mZCk7CisJCWlmIChzdGF0dXMpCisJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCB3cml0ZSAlc1xuIiwgZGVzdCk7CisJCWVsc2UKKwkJCXB1bGxfc2F5KCJjb3B5ICVzXG4iLCBoZXgpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBjb3B5ICVzIHdpdGggZ2l2ZW4gY29weSBtZXRob2RzLlxuIiwgaGV4KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJaWYgKHNldHVwX2luZGljZXMoKSkKKwkJcmV0dXJuIC0xOworCXRhcmdldCA9IGZpbmRfc2hhMV9wYWNrKHNoYTEsIHBhY2tzKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBmaW5kICVzOiBub3Qgc2VwYXJhdGUgb3IgaW4gYW55IHBhY2siLCAKKwkJCSAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCWlmIChnZXRfdmVyYm9zZWx5KSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBwYWNrICVzXG4iLAorCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJCWZwcmludGYoc3RkZXJyLCAiIHdoaWNoIGNvbnRhaW5zICVzXG4iLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwlzcHJpbnRmKGZpbGVuYW1lLCAiJXMvb2JqZWN0cy9wYWNrL3BhY2stJXMucGFjayIsIAorCQlwYXRoLCBzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpKTsKKwljb3B5X2ZpbGUoZmlsZW5hbWUsIHNoYTFfcGFja19uYW1lKHRhcmdldC0+c2hhMSksCisJCSAgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgMSk7CisJc3ByaW50ZihmaWxlbmFtZSwgIiVzL29iamVjdHMvcGFjay9wYWNrLSVzLmlkeCIsIAorCQlwYXRoLCBzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpKTsKKwljb3B5X2ZpbGUoZmlsZW5hbWUsIHNoYTFfcGFja19pbmRleF9uYW1lKHRhcmdldC0+c2hhMSksCisJCSAgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgMSk7CisJaW5zdGFsbF9wYWNrZWRfZ2l0KHRhcmdldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBpbnQgb2JqZWN0X25hbWVfc3RhcnQgPSAtMTsKKwlzdGF0aWMgY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgoc2hhMSk7CisJY2hhciAqZGVzdF9maWxlbmFtZSA9IHNoYTFfZmlsZV9uYW1lKHNoYTEpOworCisgCWlmIChvYmplY3RfbmFtZV9zdGFydCA8IDApIHsKKwkJc3RyY3B5KGZpbGVuYW1lLCBwYXRoKTsgLyogZS5nLiBnaXQuZ2l0ICovCisJCXN0cmNhdChmaWxlbmFtZSwgIi9vYmplY3RzLyIpOworCQlvYmplY3RfbmFtZV9zdGFydCA9IHN0cmxlbihmaWxlbmFtZSk7CisJfQorCWZpbGVuYW1lW29iamVjdF9uYW1lX3N0YXJ0KzBdID0gaGV4WzBdOworCWZpbGVuYW1lW29iamVjdF9uYW1lX3N0YXJ0KzFdID0gaGV4WzFdOworCWZpbGVuYW1lW29iamVjdF9uYW1lX3N0YXJ0KzJdID0gJy8nOworCXN0cmNweShmaWxlbmFtZSArIG9iamVjdF9uYW1lX3N0YXJ0ICsgMywgaGV4ICsgMik7CisJcmV0dXJuIGNvcHlfZmlsZShmaWxlbmFtZSwgZGVzdF9maWxlbmFtZSwgaGV4LCAwKTsKK30KKworaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIGZldGNoX2ZpbGUoc2hhMSkgJiYgZmV0Y2hfcGFjayhzaGExKTsKK30KKworaW50IGZldGNoX3JlZihjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGludCByZWZfbmFtZV9zdGFydCA9IC0xOworCXN0YXRpYyBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwlzdGF0aWMgY2hhciBoZXhbNDFdOworCWludCBpZmQ7CisKKwlpZiAocmVmX25hbWVfc3RhcnQgPCAwKSB7CisJCXNwcmludGYoZmlsZW5hbWUsICIlcy9yZWZzLyIsIHBhdGgpOworCQlyZWZfbmFtZV9zdGFydCA9IHN0cmxlbihmaWxlbmFtZSk7CisJfQorCXN0cmNweShmaWxlbmFtZSArIHJlZl9uYW1lX3N0YXJ0LCByZWYpOworCWlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoaWZkIDwgMCkgeworCQljbG9zZShpZmQpOworCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHJlYWQoaWZkLCBoZXgsIDQwKSAhPSA0MCB8fCBnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSkgeworCQljbG9zZShpZmQpOworCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCByZWFkIGZyb20gJXNcbiIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShpZmQpOworCXB1bGxfc2F5KCJyZWYgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbG9jYWxfcHVsbF91c2FnZVtdID0KKyJnaXQtbG9jYWwtZmV0Y2ggWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstdyBmaWxlbmFtZV0gWy0tcmVjb3Zlcl0gWy1sXSBbLXNdIFstbl0gY29tbWl0LWlkIHBhdGgiOworCisvKiAKKyAqIEJ5IGRlZmF1bHQgd2Ugb25seSB1c2UgZmlsZSBjb3B5LgorICogSWYgLWwgaXMgc3BlY2lmaWVkLCBhIGhhcmQgbGluayBpcyBhdHRlbXB0ZWQuCisgKiBJZiAtcyBpcyBzcGVjaWZpZWQsIHRoZW4gYSBzeW1saW5rIGlzIGF0dGVtcHRlZC4KKyAqIElmIC1uIGlzIF9ub3RfIHNwZWNpZmllZCwgdGhlbiBhIHJlZ3VsYXIgZmlsZS10by1maWxlIGNvcHkgaXMgZG9uZS4KKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmNvbW1pdF9pZDsKKwlpbnQgYXJnID0gMTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKQorCQkJZ2V0X3RyZWUgPSAxOworCQllbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2MnKQorCQkJZ2V0X2hpc3RvcnkgPSAxOworCQllbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2EnKSB7CisJCQlnZXRfYWxsID0gMTsKKwkJCWdldF90cmVlID0gMTsKKwkJCWdldF9oaXN0b3J5ID0gMTsKKwkJfQorCQllbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2wnKQorCQkJdXNlX2xpbmsgPSAxOworCQllbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3MnKQorCQkJdXNlX3N5bWxpbmsgPSAxOworCQllbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ24nKQorCQkJdXNlX2ZpbGVjb3B5ID0gMDsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd2JykKKwkJCWdldF92ZXJib3NlbHkgPSAxOworCQllbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3cnKQorCQkJd3JpdGVfcmVmID0gYXJndlsrK2FyZ107CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1yZWNvdmVyIikpCisJCQlnZXRfcmVjb3ZlciA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKGxvY2FsX3B1bGxfdXNhZ2UpOworCQlhcmcrKzsKKwl9CisJaWYgKGFyZ2MgPCBhcmcgKyAyKQorCQl1c2FnZShsb2NhbF9wdWxsX3VzYWdlKTsKKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisJcGF0aCA9IGFyZ3ZbYXJnICsgMV07CisJd3JpdGVfcmVmX2xvZ19kZXRhaWxzID0gcGF0aDsKKworCWlmIChwdWxsKGNvbW1pdF9pZCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9sb2NrZmlsZS5jIGIvbG9ja2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ2ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvbG9ja2ZpbGUuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgKmxvY2tfZmlsZV9saXN0OworCitzdGF0aWMgdm9pZCByZW1vdmVfbG9ja19maWxlKHZvaWQpCit7CisJd2hpbGUgKGxvY2tfZmlsZV9saXN0KSB7CisJCWlmIChsb2NrX2ZpbGVfbGlzdC0+ZmlsZW5hbWVbMF0pCisJCQl1bmxpbmsobG9ja19maWxlX2xpc3QtPmZpbGVuYW1lKTsKKwkJbG9ja19maWxlX2xpc3QgPSBsb2NrX2ZpbGVfbGlzdC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9sb2NrX2ZpbGVfb25fc2lnbmFsKGludCBzaWdubykKK3sKKwlyZW1vdmVfbG9ja19maWxlKCk7CisJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisJcmFpc2Uoc2lnbm8pOworfQorCitpbnQgaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZShzdHJ1Y3QgbG9ja19maWxlICpsaywgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgZmQ7CisJc3ByaW50Zihsay0+ZmlsZW5hbWUsICIlcy5sb2NrIiwgcGF0aCk7CisJZmQgPSBvcGVuKGxrLT5maWxlbmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJaWYgKDAgPD0gZmQpIHsKKwkJaWYgKCFsay0+bmV4dCkgeworCQkJbGstPm5leHQgPSBsb2NrX2ZpbGVfbGlzdDsKKwkJCWxvY2tfZmlsZV9saXN0ID0gbGs7CisJCQlzaWduYWwoU0lHSU5ULCByZW1vdmVfbG9ja19maWxlX29uX3NpZ25hbCk7CisJCQlhdGV4aXQocmVtb3ZlX2xvY2tfZmlsZSk7CisJCX0KKwkJaWYgKGFkanVzdF9zaGFyZWRfcGVybShsay0+ZmlsZW5hbWUpKQorCQkJcmV0dXJuIGVycm9yKCJjYW5ub3QgZml4IHBlcm1pc3Npb24gYml0cyBvbiAlcyIsCisJCQkJICAgICBsay0+ZmlsZW5hbWUpOworCX0KKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBjb21taXRfbG9ja19maWxlKHN0cnVjdCBsb2NrX2ZpbGUgKmxrKQoreworCWNoYXIgcmVzdWx0X2ZpbGVbUEFUSF9NQVhdOworCWludCBpOworCXN0cmNweShyZXN1bHRfZmlsZSwgbGstPmZpbGVuYW1lKTsKKwlpID0gc3RybGVuKHJlc3VsdF9maWxlKSAtIDU7IC8qIC5sb2NrICovCisJcmVzdWx0X2ZpbGVbaV0gPSAwOworCWkgPSByZW5hbWUobGstPmZpbGVuYW1lLCByZXN1bHRfZmlsZSk7CisJbGstPmZpbGVuYW1lWzBdID0gMDsKKwlyZXR1cm4gaTsKK30KKwordm9pZCByb2xsYmFja19sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqbGspCit7CisJaWYgKGxrLT5maWxlbmFtZVswXSkKKwkJdW5saW5rKGxrLT5maWxlbmFtZSk7CisJbGstPmZpbGVuYW1lWzBdID0gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbG9nLXRyZWUuYyBiL2xvZy10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiNDlmMgotLS0gL2Rldi9udWxsCisrKyBiL2xvZy10cmVlLmMKQEAgLTAsMCArMSwyNjkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorCitzdGF0aWMgdm9pZCBzaG93X3BhcmVudHMoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgYWJicmV2KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwlmb3IgKHAgPSBjb21taXQtPnBhcmVudHM7IHAgOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwLT5pdGVtOworCQlwcmludGYoIiAlcyIsIGRpZmZfdW5pcXVlX2FiYnJldihwYXJlbnQtPm9iamVjdC5zaGExLCBhYmJyZXYpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3NpZ25vZmYoY2hhciAqYnVmLCBpbnQgYnVmX3N6LCBpbnQgYXQsIGNvbnN0IGNoYXIgKnNpZ25vZmYpCit7CisJaW50IHNpZ25vZmZfbGVuID0gc3RybGVuKHNpZ25vZmYpOworCXN0YXRpYyBjb25zdCBjaGFyIHNpZ25lZF9vZmZfYnlbXSA9ICJTaWduZWQtb2ZmLWJ5OiAiOworCWNoYXIgKmNwID0gYnVmOworCisJLyogRG8gd2UgaGF2ZSBlbm91Z2ggc3BhY2UgdG8gYWRkIGl0PyAqLworCWlmIChidWZfc3ogLSBhdCA8PSBzdHJsZW4oc2lnbmVkX29mZl9ieSkgKyBzaWdub2ZmX2xlbiArIDIpCisJCXJldHVybiBhdDsKKworCS8qIEZpcnN0IHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNpZ24tb2ZmIGJ5IHRoZSBzaWduZXIgKi8KKwl3aGlsZSAoMSkgeworCQljcCA9IHN0cnN0cihjcCwgc2lnbmVkX29mZl9ieSk7CisJCWlmICghY3ApCisJCQlicmVhazsKKwkJY3AgKz0gc3RybGVuKHNpZ25lZF9vZmZfYnkpOworCQlpZiAoKGNwICsgc2lnbm9mZl9sZW4gPCBidWYgKyBhdCkgJiYKKwkJICAgICFzdHJuY21wKGNwLCBzaWdub2ZmLCBzaWdub2ZmX2xlbikgJiYKKwkJICAgIGlzc3BhY2UoY3Bbc2lnbm9mZl9sZW5dKSkKKwkJCXJldHVybiBhdDsgLyogd2UgYWxyZWFkeSBoYXZlIGhpbSAqLworCX0KKworCXN0cmNweShidWYgKyBhdCwgc2lnbmVkX29mZl9ieSk7CisJYXQgKz0gc3RybGVuKHNpZ25lZF9vZmZfYnkpOworCXN0cmNweShidWYgKyBhdCwgc2lnbm9mZik7CisJYXQgKz0gc2lnbm9mZl9sZW47CisJYnVmW2F0KytdID0gJ1xuJzsKKwlidWZbYXRdID0gMDsKKwlyZXR1cm4gYXQ7Cit9CisKK3ZvaWQgc2hvd19sb2coc3RydWN0IHJldl9pbmZvICpvcHQsIHN0cnVjdCBsb2dfaW5mbyAqbG9nLCBjb25zdCBjaGFyICpzZXApCit7CisJc3RhdGljIGNoYXIgdGhpc19oZWFkZXJbMTYzODRdOworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvZy0+Y29tbWl0LCAqcGFyZW50ID0gbG9nLT5wYXJlbnQ7CisJaW50IGFiYnJldiA9IG9wdC0+ZGlmZm9wdC5hYmJyZXY7CisJaW50IGFiYnJldl9jb21taXQgPSBvcHQtPmFiYnJldl9jb21taXQgPyBvcHQtPmFiYnJldiA6IDQwOworCWNvbnN0IGNoYXIgKmV4dHJhOworCWludCBsZW47CisJY29uc3QgY2hhciAqc3ViamVjdCA9IE5VTEwsICpleHRyYV9oZWFkZXJzID0gb3B0LT5leHRyYV9oZWFkZXJzOworCisJb3B0LT5sb2dpbmZvID0gTlVMTDsKKwlpZiAoIW9wdC0+dmVyYm9zZV9oZWFkZXIpIHsKKwkJZnB1dHMoZGlmZl91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIGFiYnJldl9jb21taXQpLCBzdGRvdXQpOworCQlpZiAob3B0LT5wYXJlbnRzKQorCQkJc2hvd19wYXJlbnRzKGNvbW1pdCwgYWJicmV2X2NvbW1pdCk7CisJCXB1dGNoYXIoJ1xuJyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRoZSAib25lbGluZSIgZm9ybWF0IGhhcyBzZXZlcmFsIHNwZWNpYWwgY2FzZXM6CisJICogIC0gVGhlIHByZXR0eS1wcmludGVkIGNvbW1pdCBsYWNrcyBhIG5ld2xpbmUgYXQgdGhlIGVuZAorCSAqICAgIG9mIHRoZSBidWZmZXIsIGJ1dCB3ZSBkbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlCisJICogICAgaGF2ZSBhIG5ld2xpbmUgdGhlcmUuIElmIHRoZSBzZXBhcmF0b3IgaXNuJ3QgYWxyZWFkeQorCSAqICAgIGEgbmV3bGluZSwgYWRkIGFuIGV4dHJhIG9uZS4KKwkgKiAgLSB1bmxpa2Ugb3RoZXIgbG9nIG1lc3NhZ2VzLCB0aGUgb25lLWxpbmUgZm9ybWF0IGRvZXMKKwkgKiAgICBub3QgaGF2ZSBhbiBlbXB0eSBsaW5lIGJldHdlZW4gZW50cmllcy4KKwkgKi8KKwlleHRyYSA9ICIiOworCWlmICgqc2VwICE9ICdcbicgJiYgb3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCWV4dHJhID0gIlxuIjsKKwlpZiAob3B0LT5zaG93bl9vbmUgJiYgb3B0LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX09ORUxJTkUpCisJCXB1dGNoYXIoJ1xuJyk7CisJb3B0LT5zaG93bl9vbmUgPSAxOworCisJLyoKKwkgKiBQcmludCBoZWFkZXIgbGluZSBvZiBoZWFkZXIuLgorCSAqLworCisJaWYgKG9wdC0+Y29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9FTUFJTCkgeworCQljaGFyICpzaGExID0gc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSk7CisJCWlmIChvcHQtPnRvdGFsID4gMCkgeworCQkJc3RhdGljIGNoYXIgYnVmZmVyWzY0XTsKKwkJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCSJTdWJqZWN0OiBbUEFUQ0ggJWQvJWRdICIsCisJCQkJCW9wdC0+bnIsIG9wdC0+dG90YWwpOworCQkJc3ViamVjdCA9IGJ1ZmZlcjsKKwkJfSBlbHNlIGlmIChvcHQtPnRvdGFsID09IDApCisJCQlzdWJqZWN0ID0gIlN1YmplY3Q6IFtQQVRDSF0gIjsKKwkJZWxzZQorCQkJc3ViamVjdCA9ICJTdWJqZWN0OiAiOworCisJCXByaW50ZigiRnJvbSAlcyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDFcbiIsIHNoYTEpOworCQlpZiAob3B0LT5taW1lX2JvdW5kYXJ5KSB7CisJCQlzdGF0aWMgY2hhciBzdWJqZWN0X2J1ZmZlclsxMDI0XTsKKwkJCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKKwkJCXNucHJpbnRmKHN1YmplY3RfYnVmZmVyLCBzaXplb2Yoc3ViamVjdF9idWZmZXIpIC0gMSwKKwkJCQkgIiVzIgorCQkJCSAiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKwkJCQkgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO1xuIgorCQkJCSAiIGJvdW5kYXJ5PVwiJXMlc1wiXG4iCisJCQkJICJcbiIKKwkJCQkgIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSAiCisJCQkJICJmb3JtYXQuXG4iCisJCQkJICItLSVzJXNcbiIKKwkJCQkgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgIgorCQkJCSAiY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkXG4iCisJCQkJICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG5cbiIsCisJCQkJIGV4dHJhX2hlYWRlcnMgPyBleHRyYV9oZWFkZXJzIDogIiIsCisJCQkJIG1pbWVfYm91bmRhcnlfbGVhZGVyLCBvcHQtPm1pbWVfYm91bmRhcnksCisJCQkJIG1pbWVfYm91bmRhcnlfbGVhZGVyLCBvcHQtPm1pbWVfYm91bmRhcnkpOworCQkJZXh0cmFfaGVhZGVycyA9IHN1YmplY3RfYnVmZmVyOworCisJCQlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpIC0gMSwKKwkJCQkgIi0tJXMlc1xuIgorCQkJCSAiQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7XG4iCisJCQkJICIgbmFtZT1cIiVzLmRpZmZcIlxuIgorCQkJCSAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCQkJCSAiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lO1xuIgorCQkJCSAiIGZpbGVuYW1lPVwiJXMuZGlmZlwiXG5cbiIsCisJCQkJIG1pbWVfYm91bmRhcnlfbGVhZGVyLCBvcHQtPm1pbWVfYm91bmRhcnksCisJCQkJIHNoYTEsIHNoYTEpOworCQkJb3B0LT5kaWZmb3B0LnN0YXRfc2VwID0gYnVmZmVyOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlcyVzIiwKKwkJICAgICAgIG9wdC0+Y29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9PTkVMSU5FID8gIiIgOiAiY29tbWl0ICIsCisJCSAgICAgICBkaWZmX3VuaXF1ZV9hYmJyZXYoY29tbWl0LT5vYmplY3Quc2hhMSwgYWJicmV2X2NvbW1pdCkpOworCQlpZiAob3B0LT5wYXJlbnRzKQorCQkJc2hvd19wYXJlbnRzKGNvbW1pdCwgYWJicmV2X2NvbW1pdCk7CisJCWlmIChwYXJlbnQpCisJCQlwcmludGYoIiAoZnJvbSAlcykiLAorCQkJICAgICAgIGRpZmZfdW5pcXVlX2FiYnJldihwYXJlbnQtPm9iamVjdC5zaGExLAorCQkJCQkJICBhYmJyZXZfY29tbWl0KSk7CisJCXB1dGNoYXIob3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUgPyAnICcgOiAnXG4nKTsKKwl9CisKKwkvKgorCSAqIEFuZCB0aGVuIHRoZSBwcmV0dHktcHJpbnRlZCBtZXNzYWdlIGl0c2VsZgorCSAqLworCWxlbiA9IHByZXR0eV9wcmludF9jb21taXQob3B0LT5jb21taXRfZm9ybWF0LCBjb21taXQsIH4wdSwgdGhpc19oZWFkZXIsIHNpemVvZih0aGlzX2hlYWRlciksIGFiYnJldiwgc3ViamVjdCwgZXh0cmFfaGVhZGVycyk7CisKKwlpZiAob3B0LT5hZGRfc2lnbm9mZikKKwkJbGVuID0gYXBwZW5kX3NpZ25vZmYodGhpc19oZWFkZXIsIHNpemVvZih0aGlzX2hlYWRlciksIGxlbiwKKwkJCQkgICAgIG9wdC0+YWRkX3NpZ25vZmYpOworCXByaW50ZigiJXMlcyVzIiwgdGhpc19oZWFkZXIsIGV4dHJhLCBzZXApOworfQorCitpbnQgbG9nX3RyZWVfZGlmZl9mbHVzaChzdHJ1Y3QgcmV2X2luZm8gKm9wdCkKK3sKKwlkaWZmY29yZV9zdGQoJm9wdC0+ZGlmZm9wdCk7CisKKwlpZiAoZGlmZl9xdWV1ZV9pc19lbXB0eSgpKSB7CisJCWludCBzYXZlZF9mbXQgPSBvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdDsKKwkJb3B0LT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJCWRpZmZfZmx1c2goJm9wdC0+ZGlmZm9wdCk7CisJCW9wdC0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gc2F2ZWRfZm10OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3B0LT5sb2dpbmZvICYmICFvcHQtPm5vX2NvbW1pdF9pZCkKKwkJc2hvd19sb2cob3B0LCBvcHQtPmxvZ2luZm8sIG9wdC0+ZGlmZm9wdC53aXRoX3N0YXQgPyAiLS0tXG4iIDogIlxuIik7CisJZGlmZl9mbHVzaCgmb3B0LT5kaWZmb3B0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkaWZmX3Jvb3RfdHJlZShzdHJ1Y3QgcmV2X2luZm8gKm9wdCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3LCBjb25zdCBjaGFyICpiYXNlKQoreworCWludCByZXR2YWw7CisJdm9pZCAqdHJlZTsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGVtcHR5LCByZWFsOworCisJdHJlZSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG5ldywgdHJlZV90eXBlLCAmcmVhbC5zaXplLCBOVUxMKTsKKwlpZiAoIXRyZWUpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgcm9vdCB0cmVlICglcykiLCBzaGExX3RvX2hleChuZXcpKTsKKwlyZWFsLmJ1ZiA9IHRyZWU7CisKKwllbXB0eS5idWYgPSAiIjsKKwllbXB0eS5zaXplID0gMDsKKwlyZXR2YWwgPSBkaWZmX3RyZWUoJmVtcHR5LCAmcmVhbCwgYmFzZSwgJm9wdC0+ZGlmZm9wdCk7CisJZnJlZSh0cmVlKTsKKwlsb2dfdHJlZV9kaWZmX2ZsdXNoKG9wdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkb19kaWZmX2NvbWJpbmVkKHN0cnVjdCByZXZfaW5mbyAqb3B0LCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJdW5zaWduZWQgY29uc3QgY2hhciAqc2hhMSA9IGNvbW1pdC0+b2JqZWN0LnNoYTE7CisKKwlkaWZmX3RyZWVfY29tYmluZWRfbWVyZ2Uoc2hhMSwgb3B0LT5kZW5zZV9jb21iaW5lZF9tZXJnZXMsIG9wdCk7CisJcmV0dXJuICFvcHQtPmxvZ2luZm87Cit9CisKKy8qCisgKiBTaG93IHRoZSBkaWZmIG9mIGEgY29tbWl0LgorICoKKyAqIFJldHVybiB0cnVlIGlmIHdlIHByaW50ZWQgYW55IGxvZyBpbmZvIG1lc3NhZ2VzCisgKi8KK3N0YXRpYyBpbnQgbG9nX3RyZWVfZGlmZihzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgc3RydWN0IGNvbW1pdCAqY29tbWl0LCBzdHJ1Y3QgbG9nX2luZm8gKmxvZykKK3sKKwlpbnQgc2hvd2VkX2xvZzsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJdW5zaWduZWQgY29uc3QgY2hhciAqc2hhMSA9IGNvbW1pdC0+b2JqZWN0LnNoYTE7CisKKwlpZiAoIW9wdC0+ZGlmZikKKwkJcmV0dXJuIDA7CisKKwkvKiBSb290IGNvbW1pdD8gKi8KKwlwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCWlmICghcGFyZW50cykgeworCQlpZiAob3B0LT5zaG93X3Jvb3RfZGlmZikKKwkJCWRpZmZfcm9vdF90cmVlKG9wdCwgc2hhMSwgIiIpOworCQlyZXR1cm4gIW9wdC0+bG9naW5mbzsKKwl9CisKKwkvKiBNb3JlIHRoYW4gb25lIHBhcmVudD8gKi8KKwlpZiAocGFyZW50cyAmJiBwYXJlbnRzLT5uZXh0KSB7CisJCWlmIChvcHQtPmlnbm9yZV9tZXJnZXMpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAob3B0LT5jb21iaW5lX21lcmdlcykKKwkJCXJldHVybiBkb19kaWZmX2NvbWJpbmVkKG9wdCwgY29tbWl0KTsKKworCQkvKiBJZiB3ZSBzaG93IGluZGl2aWR1YWwgZGlmZnMsIHNob3cgdGhlIHBhcmVudCBpbmZvICovCisJCWxvZy0+cGFyZW50ID0gcGFyZW50cy0+aXRlbTsKKwl9CisKKwlzaG93ZWRfbG9nID0gMDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisKKwkJZGlmZl90cmVlX3NoYTEocGFyZW50LT5vYmplY3Quc2hhMSwgc2hhMSwgIiIsICZvcHQtPmRpZmZvcHQpOworCQlsb2dfdHJlZV9kaWZmX2ZsdXNoKG9wdCk7CisKKwkJc2hvd2VkX2xvZyB8PSAhb3B0LT5sb2dpbmZvOworCisJCS8qIFNldCB1cCB0aGUgbG9nIGluZm8gZm9yIHRoZSBuZXh0IHBhcmVudCwgaWYgYW55Li4gKi8KKwkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCWlmICghcGFyZW50cykKKwkJCWJyZWFrOworCQlsb2ctPnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisJCW9wdC0+bG9naW5mbyA9IGxvZzsKKwl9CisJcmV0dXJuIHNob3dlZF9sb2c7Cit9CisKK2ludCBsb2dfdHJlZV9jb21taXQoc3RydWN0IHJldl9pbmZvICpvcHQsIHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgbG9nX2luZm8gbG9nOworCWludCBzaG93bjsKKworCWxvZy5jb21taXQgPSBjb21taXQ7CisJbG9nLnBhcmVudCA9IE5VTEw7CisJb3B0LT5sb2dpbmZvID0gJmxvZzsKKworCXNob3duID0gbG9nX3RyZWVfZGlmZihvcHQsIGNvbW1pdCwgJmxvZyk7CisJaWYgKCFzaG93biAmJiBvcHQtPmxvZ2luZm8gJiYgb3B0LT5hbHdheXNfc2hvd19oZWFkZXIpIHsKKwkJbG9nLnBhcmVudCA9IE5VTEw7CisJCXNob3dfbG9nKG9wdCwgb3B0LT5sb2dpbmZvLCAiIik7CisJCXNob3duID0gMTsKKwl9CisJb3B0LT5sb2dpbmZvID0gTlVMTDsKKwlyZXR1cm4gc2hvd247Cit9CmRpZmYgLS1naXQgYS9sb2ctdHJlZS5oIGIvbG9nLXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZlNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbG9nLXRyZWUuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIExPR19UUkVFX0gKKyNkZWZpbmUgTE9HX1RSRUVfSAorCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKworc3RydWN0IGxvZ19pbmZvIHsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQsICpwYXJlbnQ7Cit9OworCit2b2lkIGluaXRfbG9nX3RyZWVfb3B0KHN0cnVjdCByZXZfaW5mbyAqKTsKK2ludCBsb2dfdHJlZV9kaWZmX2ZsdXNoKHN0cnVjdCByZXZfaW5mbyAqKTsKK2ludCBsb2dfdHJlZV9jb21taXQoc3RydWN0IHJldl9pbmZvICosIHN0cnVjdCBjb21taXQgKik7CitpbnQgbG9nX3RyZWVfb3B0X3BhcnNlKHN0cnVjdCByZXZfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBpbnQpOwordm9pZCBzaG93X2xvZyhzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgc3RydWN0IGxvZ19pbmZvICpsb2csIGNvbnN0IGNoYXIgKnNlcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWFpbGluZm8uYyBiL21haWxpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2YzIxNQotLS0gL2Rldi9udWxsCisrKyBiL21haWxpbmZvLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8qCisgKiBBbm90aGVyIHN0dXBpZCBwcm9ncmFtLCB0aGlzIG9uZSBwYXJzaW5nIHRoZSBoZWFkZXJzIG9mIGFuCisgKiBlbWFpbCB0byBmaWd1cmUgb3V0IGF1dGhvcnNoaXAgYW5kIHN1YmplY3QKKyAqLworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZm5kZWYgTk9fSUNPTlYKKyNpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIEZJTEUgKmNtaXRtc2csICpwYXRjaGZpbGU7CisKK3N0YXRpYyBpbnQga2VlcF9zdWJqZWN0ID0gMDsKK3N0YXRpYyBjaGFyICptZXRhaW5mb19jaGFyc2V0ID0gTlVMTDsKK3N0YXRpYyBjaGFyIGxpbmVbMTAwMF07CitzdGF0aWMgY2hhciBkYXRlWzEwMDBdOworc3RhdGljIGNoYXIgbmFtZVsxMDAwXTsKK3N0YXRpYyBjaGFyIGVtYWlsWzEwMDBdOworc3RhdGljIGNoYXIgc3ViamVjdFsxMDAwXTsKKworc3RhdGljIGVudW0gIHsKKwlURV9ET05UQ0FSRSwgVEVfUVAsIFRFX0JBU0U2NCwKK30gdHJhbnNmZXJfZW5jb2Rpbmc7CitzdGF0aWMgY2hhciBjaGFyc2V0WzI1Nl07CisKK3N0YXRpYyBjaGFyIG11bHRpcGFydF9ib3VuZGFyeVsxMDAwXTsKK3N0YXRpYyBpbnQgbXVsdGlwYXJ0X2JvdW5kYXJ5X2xlbjsKK3N0YXRpYyBpbnQgcGF0Y2hfbGluZXMgPSAwOworCitzdGF0aWMgY2hhciAqc2FuaXR5X2NoZWNrKGNoYXIgKm5hbWUsIGNoYXIgKmVtYWlsKQoreworCWludCBsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKGxlbiA8IDMgfHwgbGVuID4gNjApCisJCXJldHVybiBlbWFpbDsKKwlpZiAoc3RyY2hyKG5hbWUsICdAJykgfHwgc3RyY2hyKG5hbWUsICc8JykgfHwgc3RyY2hyKG5hbWUsICc+JykpCisJCXJldHVybiBlbWFpbDsKKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGludCBib2d1c19mcm9tKGNoYXIgKmxpbmUpCit7CisJLyogSm9obiBEb2UgPGpvaG5kb2U+ICovCisJY2hhciAqYnJhLCAqa2V0LCAqZHN0LCAqY3A7CisKKwkvKiBUaGlzIGlzIGZhbGxiYWNrLCBzbyBkbyBub3QgYm90aGVyIGlmIHdlIGFscmVhZHkgaGF2ZSBhbgorCSAqIGUtbWFpbCBhZGRyZXNzLgorCSAqLyAKKwlpZiAoKmVtYWlsKQorCQlyZXR1cm4gMDsKKworCWJyYSA9IHN0cmNocihsaW5lLCAnPCcpOworCWlmICghYnJhKQorCQlyZXR1cm4gMDsKKwlrZXQgPSBzdHJjaHIoYnJhLCAnPicpOworCWlmICgha2V0KQorCQlyZXR1cm4gMDsKKworCWZvciAoZHN0ID0gZW1haWwsIGNwID0gYnJhKzE7IGNwIDwga2V0OyApCisJCSpkc3QrKyA9ICpjcCsrOworCSpkc3QgPSAwOworCWZvciAoY3AgPSBsaW5lOyBpc3NwYWNlKCpjcCk7IGNwKyspCisJCTsKKwlmb3IgKGJyYS0tOyBpc3NwYWNlKCpicmEpOyBicmEtLSkKKwkJKmJyYSA9IDA7CisJY3AgPSBzYW5pdHlfY2hlY2soY3AsIGVtYWlsKTsKKwlzdHJjcHkobmFtZSwgY3ApOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9mcm9tKGNoYXIgKmluX2xpbmUpCit7CisJY2hhciBsaW5lWzEwMDBdOworCWNoYXIgKmF0OworCWNoYXIgKmRzdDsKKworCXN0cmNweShsaW5lLCBpbl9saW5lKTsKKwlhdCA9IHN0cmNocihsaW5lLCAnQCcpOworCWlmICghYXQpCisJCXJldHVybiBib2d1c19mcm9tKGxpbmUpOworCisJLyoKKwkgKiBJZiB3ZSBhbHJlYWR5IGhhdmUgb25lIGVtYWlsLCBkb24ndCB0YWtlIGFueSBjb25mdXNpbmcgbGluZXMKKwkgKi8KKwlpZiAoKmVtYWlsICYmIHN0cmNocihhdCsxLCAnQCcpKQorCQlyZXR1cm4gMDsKKworCS8qIFBpY2sgdXAgdGhlIHN0cmluZyBhcm91bmQgJ0AnLCBwb3NzaWJseSBkZWxpbWl0ZWQgd2l0aCA8PgorCSAqIHBhaXI7IHRoYXQgaXMgdGhlIGVtYWlsIHBhcnQuICBXaGl0ZSB0aGVtIG91dCB3aGlsZSBjb3B5aW5nLgorCSAqLworCXdoaWxlIChhdCA+IGxpbmUpIHsKKwkJY2hhciBjID0gYXRbLTFdOworCQlpZiAoaXNzcGFjZShjKSkKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnPCcpIHsKKwkJCWF0Wy0xXSA9ICcgJzsKKwkJCWJyZWFrOworCQl9CisJCWF0LS07CisJfQorCWRzdCA9IGVtYWlsOworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKmF0OworCQlpZiAoIWMgfHwgYyA9PSAnPicgfHwgaXNzcGFjZShjKSkgeworCQkJaWYgKGMgPT0gJz4nKQorCQkJCSphdCA9ICcgJzsKKwkJCWJyZWFrOworCQl9CisJCSphdCsrID0gJyAnOworCQkqZHN0KysgPSBjOworCX0KKwkqZHN0KysgPSAwOworCisJLyogVGhlIHJlbWFpbmRlciBpcyBuYW1lLiAgSXQgY291bGQgYmUgIkpvaG4gRG9lIDxqb2huLmRvZUB4ej4iCisJICogb3IgImpvaG4uZG9lQHh6IChKb2huIERvZSkiLCBidXQgd2UgaGF2ZSB3aGl0ZWQgb3V0IHRoZQorCSAqIGVtYWlsIHBhcnQsIHNvIHRyaW0gZnJvbSBib3RoIGVuZHMsIHBvc3NpYmx5IHJlbW92aW5nCisJICogdGhlICgpIHBhaXIgYXQgdGhlIGVuZC4KKwkgKi8KKwlhdCA9IGxpbmUgKyBzdHJsZW4obGluZSk7CisJd2hpbGUgKGF0ID4gbGluZSkgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqLS1hdDsKKwkJaWYgKCFpc3NwYWNlKGMpKSB7CisJCQlhdFsoYyA9PSAnKScpID8gMCA6IDFdID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYXQgPSBsaW5lOworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKmF0OworCQlpZiAoIWMgfHwgIWlzc3BhY2UoYykpIHsKKwkJCWlmIChjID09ICcoJykKKwkJCQlhdCsrOworCQkJYnJlYWs7CisJCX0KKwkJYXQrKzsKKwl9CisJYXQgPSBzYW5pdHlfY2hlY2soYXQsIGVtYWlsKTsKKwlzdHJjcHkobmFtZSwgYXQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9kYXRlKGNoYXIgKmxpbmUpCit7CisJc3RyY3B5KGRhdGUsIGxpbmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9zdWJqZWN0KGNoYXIgKmxpbmUpCit7CisJc3RyY3B5KHN1YmplY3QsIGxpbmUpOworCXJldHVybiAwOworfQorCisvKiBOT1RFIE5PVEUgTk9URS4gIFdlIGRvIG5vdCBjbGFpbSB3ZSBkbyBmdWxsIE1JTUUuICBXZSBqdXN0IGF0dGVtcHQKKyAqIHRvIGhhdmUgZW5vdWdoIGhldXJpc3RpY3MgdG8gZ3JvayBNSU1FIGVuY29kZWQgcGF0Y2hlcyBvZnRlbiBmb3VuZAorICogb24gb3VyIG1haWxpbmcgbGlzdHMuICBGb3IgZXhhbXBsZSwgd2UgZG8gbm90IGV2ZW4gdHJlYXQgaGVhZGVyIGxpbmVzCisgKiBjYXNlIGluc2Vuc2l0aXZlbHkuCisgKi8KKworc3RhdGljIGludCBzbHVycF9hdHRyKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmF0dHIpCit7CisJY2hhciAqZW5kcywgKmFwID0gc3RyY2FzZXN0cihsaW5lLCBuYW1lKTsKKwlzaXplX3Qgc3o7CisKKwlpZiAoIWFwKSB7CisJCSphdHRyID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWFwICs9IHN0cmxlbihuYW1lKTsKKwlpZiAoKmFwID09ICciJykgeworCQlhcCsrOworCQllbmRzID0gIlwiIjsKKwl9CisJZWxzZQorCQllbmRzID0gIjsgXHQiOworCXN6ID0gc3RyY3NwbihhcCwgZW5kcyk7CisJbWVtY3B5KGF0dHIsIGFwLCBzeik7CisJYXR0cltzel0gPSAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9zdWJjb250ZW50X3R5cGUoY2hhciAqbGluZSkKK3sKKwkvKiBXZSBkbyBub3Qgd2FudCB0byBtZXNzIHdpdGggYm91bmRhcnkuICBOb3RlIHRoYXQgd2UgZG8gbm90CisJICogaGFuZGxlIG5lc3RlZCBtdWx0aXBhcnQuCisJICovCisJaWYgKHN0cmNhc2VzdHIobGluZSwgImJvdW5kYXJ5PSIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGhhbmRsaW5nIG5lc3RlZCBtdWx0aXBhcnQgbWVzc2FnZS5cbiIpOworCQlleGl0KDEpOworCX0KKwlzbHVycF9hdHRyKGxpbmUsICJjaGFyc2V0PSIsIGNoYXJzZXQpOworCWlmICgqY2hhcnNldCkgeworCQlpbnQgaSwgYzsKKwkJZm9yIChpID0gMDsgKGMgPSBjaGFyc2V0W2ldKSAhPSAwOyBpKyspCisJCQljaGFyc2V0W2ldID0gdG9sb3dlcihjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2NvbnRlbnRfdHlwZShjaGFyICpsaW5lKQoreworCSptdWx0aXBhcnRfYm91bmRhcnkgPSAwOworCWlmIChzbHVycF9hdHRyKGxpbmUsICJib3VuZGFyeT0iLCBtdWx0aXBhcnRfYm91bmRhcnkgKyAyKSkgeworCQltZW1jcHkobXVsdGlwYXJ0X2JvdW5kYXJ5LCAiLS0iLCAyKTsKKwkJbXVsdGlwYXJ0X2JvdW5kYXJ5X2xlbiA9IHN0cmxlbihtdWx0aXBhcnRfYm91bmRhcnkpOworCX0KKwlzbHVycF9hdHRyKGxpbmUsICJjaGFyc2V0PSIsIGNoYXJzZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9jb250ZW50X3RyYW5zZmVyX2VuY29kaW5nKGNoYXIgKmxpbmUpCit7CisJaWYgKHN0cmNhc2VzdHIobGluZSwgImJhc2U2NCIpKQorCQl0cmFuc2Zlcl9lbmNvZGluZyA9IFRFX0JBU0U2NDsKKwllbHNlIGlmIChzdHJjYXNlc3RyKGxpbmUsICJxdW90ZWQtcHJpbnRhYmxlIikpCisJCXRyYW5zZmVyX2VuY29kaW5nID0gVEVfUVA7CisJZWxzZQorCQl0cmFuc2Zlcl9lbmNvZGluZyA9IFRFX0RPTlRDQVJFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX211bHRpcGFydF9ib3VuZGFyeShjb25zdCBjaGFyICpsaW5lKQoreworCXJldHVybiAoIW1lbWNtcChsaW5lLCBtdWx0aXBhcnRfYm91bmRhcnksIG11bHRpcGFydF9ib3VuZGFyeV9sZW4pKTsKK30KKworc3RhdGljIGludCBlYXRzcGFjZShjaGFyICpsaW5lKQoreworCWludCBsZW4gPSBzdHJsZW4obGluZSk7CisJd2hpbGUgKGxlbiA+IDAgJiYgaXNzcGFjZShsaW5lW2xlbi0xXSkpCisJCWxpbmVbLS1sZW5dID0gMDsKKwlyZXR1cm4gbGVuOworfQorCisjZGVmaW5lIFNFRU5fRlJPTSAwMQorI2RlZmluZSBTRUVOX0RBVEUgMDIKKyNkZWZpbmUgU0VFTl9TVUJKRUNUIDA0CisjZGVmaW5lIFNFRU5fQk9HVVNfVU5JWF9GUk9NIDAxMAorI2RlZmluZSBTRUVOX1BSRUZJWCAgMDIwCisKKy8qIEZpcnN0IGxpbmVzIG9mIGJvZHkgY2FuIGhhdmUgRnJvbTosIERhdGU6LCBhbmQgU3ViamVjdDogKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9pbmJvZHlfaGVhZGVyKGludCAqc2VlbiwgY2hhciAqbGluZSkKK3sKKwlpZiAoIW1lbWNtcCgiPkZyb20iLCBsaW5lLCA1KSAmJiBpc3NwYWNlKGxpbmVbNV0pKSB7CisJCWlmICghKCpzZWVuICYgU0VFTl9CT0dVU19VTklYX0ZST00pKSB7CisJCQkqc2VlbiB8PSBTRUVOX0JPR1VTX1VOSVhfRlJPTTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoIW1lbWNtcCgiRnJvbToiLCBsaW5lLCA1KSAmJiBpc3NwYWNlKGxpbmVbNV0pKSB7CisJCWlmICghKCpzZWVuICYgU0VFTl9GUk9NKSAmJiBoYW5kbGVfZnJvbShsaW5lKzYpKSB7CisJCQkqc2VlbiB8PSBTRUVOX0ZST007CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKCFtZW1jbXAoIkRhdGU6IiwgbGluZSwgNSkgJiYgaXNzcGFjZShsaW5lWzVdKSkgeworCQlpZiAoISgqc2VlbiAmIFNFRU5fREFURSkpIHsKKwkJCWhhbmRsZV9kYXRlKGxpbmUrNik7CisJCQkqc2VlbiB8PSBTRUVOX0RBVEU7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKCFtZW1jbXAoIlN1YmplY3Q6IiwgbGluZSwgOCkgJiYgaXNzcGFjZShsaW5lWzhdKSkgeworCQlpZiAoISgqc2VlbiAmIFNFRU5fU1VCSkVDVCkpIHsKKwkJCWhhbmRsZV9zdWJqZWN0KGxpbmUrOSk7CisJCQkqc2VlbiB8PSBTRUVOX1NVQkpFQ1Q7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKCFtZW1jbXAoIltQQVRDSF0iLCBsaW5lLCA3KSAmJiBpc3NwYWNlKGxpbmVbN10pKSB7CisJCWlmICghKCpzZWVuICYgU0VFTl9TVUJKRUNUKSkgeworCQkJaGFuZGxlX3N1YmplY3QobGluZSk7CisJCQkqc2VlbiB8PSBTRUVOX1NVQkpFQ1Q7CisJCQlyZXR1cm47CisJCX0KKwl9CisJKnNlZW4gfD0gU0VFTl9QUkVGSVg7Cit9CisKK3N0YXRpYyBjaGFyICpjbGVhbnVwX3N1YmplY3QoY2hhciAqc3ViamVjdCkKK3sKKwlpZiAoa2VlcF9zdWJqZWN0KQorCQlyZXR1cm4gc3ViamVjdDsKKwlmb3IgKDs7KSB7CisJCWNoYXIgKnA7CisJCWludCBsZW4sIHJlbW92ZTsKKwkJc3dpdGNoICgqc3ViamVjdCkgeworCQljYXNlICdyJzogY2FzZSAnUic6CisJCQlpZiAoIW1lbWNtcCgiZToiLCBzdWJqZWN0KzEsIDIpKSB7CisJCQkJc3ViamVjdCArPTM7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnICc6IGNhc2UgJ1x0JzogY2FzZSAnOic6CisJCQlzdWJqZWN0Kys7CisJCQljb250aW51ZTsKKworCQljYXNlICdbJzoKKwkJCXAgPSBzdHJjaHIoc3ViamVjdCwgJ10nKTsKKwkJCWlmICghcCkgeworCQkJCXN1YmplY3QrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxlbiA9IHN0cmxlbihwKTsKKwkJCXJlbW92ZSA9IHAgLSBzdWJqZWN0OworCQkJaWYgKHJlbW92ZSA8PSBsZW4gKjIpIHsKKwkJCQlzdWJqZWN0ID0gcCsxOworCQkJCWNvbnRpbnVlOworCQkJfQkKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBzdWJqZWN0OworCX0KK30JCQkKKworc3RhdGljIHZvaWQgY2xlYW51cF9zcGFjZShjaGFyICpidWYpCit7CisJdW5zaWduZWQgY2hhciBjOworCXdoaWxlICgoYyA9ICpidWYpICE9IDApIHsKKwkJYnVmKys7CisJCWlmIChpc3NwYWNlKGMpKSB7CisJCQlidWZbLTFdID0gJyAnOworCQkJYyA9ICpidWY7CisJCQl3aGlsZSAoaXNzcGFjZShjKSkgeworCQkJCWludCBsZW4gPSBzdHJsZW4oYnVmKTsKKwkJCQltZW1tb3ZlKGJ1ZiwgYnVmKzEsIGxlbik7CisJCQkJYyA9ICpidWY7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9oZWFkZXJfYnEoY2hhciAqaXQpOwordHlwZWRlZiBpbnQgKCpoZWFkZXJfZm5fdCkoY2hhciAqKTsKK3N0cnVjdCBoZWFkZXJfZGVmIHsKKwljb25zdCBjaGFyICpuYW1lOworCWhlYWRlcl9mbl90IGZ1bmM7CisJaW50IG5hbWVsZW47Cit9OworCitzdGF0aWMgdm9pZCBjaGVja19oZWFkZXIoY2hhciAqbGluZSwgc3RydWN0IGhlYWRlcl9kZWYgKmhlYWRlcikKK3sKKwlpbnQgaTsKKworCWlmIChoZWFkZXJbMF0ubmFtZWxlbiA8PSAwKSB7CisJCWZvciAoaSA9IDA7IGhlYWRlcltpXS5uYW1lOyBpKyspCisJCQloZWFkZXJbaV0ubmFtZWxlbiA9IHN0cmxlbihoZWFkZXJbaV0ubmFtZSk7CisJfQorCWZvciAoaSA9IDA7IGhlYWRlcltpXS5uYW1lOyBpKyspIHsKKwkJaW50IGxlbiA9IGhlYWRlcltpXS5uYW1lbGVuOworCQlpZiAoIXN0cm5jYXNlY21wKGxpbmUsIGhlYWRlcltpXS5uYW1lLCBsZW4pICYmCisJCSAgICBsaW5lW2xlbl0gPT0gJzonICYmIGlzc3BhY2UobGluZVtsZW4gKyAxXSkpIHsKKwkJCS8qIFVud3JhcCBpbmxpbmUgQiBhbmQgUSBlbmNvZGluZywgYW5kIG9wdGlvbmFsbHkKKwkJCSAqIG5vcm1hbGl6ZSB0aGUgbWV0YSBpbmZvcm1hdGlvbiB0byB1dGY4LgorCQkJICovCisJCQlkZWNvZGVfaGVhZGVyX2JxKGxpbmUgKyBsZW4gKyAyKTsKKwkJCWhlYWRlcltpXS5mdW5jKGxpbmUgKyBsZW4gKyAyKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19zdWJoZWFkZXJfbGluZShjaGFyICpsaW5lKQoreworCXN0YXRpYyBzdHJ1Y3QgaGVhZGVyX2RlZiBoZWFkZXJbXSA9IHsKKwkJeyAiQ29udGVudC1UeXBlIiwgaGFuZGxlX3N1YmNvbnRlbnRfdHlwZSB9LAorCQl7ICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIiwKKwkJICBoYW5kbGVfY29udGVudF90cmFuc2Zlcl9lbmNvZGluZyB9LAorCQl7IE5VTEwgfSwKKwl9OworCWNoZWNrX2hlYWRlcihsaW5lLCBoZWFkZXIpOworfQorc3RhdGljIHZvaWQgY2hlY2tfaGVhZGVyX2xpbmUoY2hhciAqbGluZSkKK3sKKwlzdGF0aWMgc3RydWN0IGhlYWRlcl9kZWYgaGVhZGVyW10gPSB7CisJCXsgIkZyb20iLCBoYW5kbGVfZnJvbSB9LAorCQl7ICJEYXRlIiwgaGFuZGxlX2RhdGUgfSwKKwkJeyAiU3ViamVjdCIsIGhhbmRsZV9zdWJqZWN0IH0sCisJCXsgIkNvbnRlbnQtVHlwZSIsIGhhbmRsZV9jb250ZW50X3R5cGUgfSwKKwkJeyAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIsCisJCSAgaGFuZGxlX2NvbnRlbnRfdHJhbnNmZXJfZW5jb2RpbmcgfSwKKwkJeyBOVUxMIH0sCisJfTsKKwljaGVja19oZWFkZXIobGluZSwgaGVhZGVyKTsKK30KKworc3RhdGljIGludCBpc19yZmMyODIyX2hlYWRlcihjaGFyICpsaW5lKQoreworCS8qCisJICogVGhlIHNlY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBsb29zZXN0IHBvc3NpYmxlCisJICogZmllbGQgbmFtZSBpcyAiMy42LjggT3B0aW9uYWwgZmllbGRzIi4KKwkgKgorCSAqIG9wdGlvbmFsLWZpZWxkID0gZmllbGQtbmFtZSAiOiIgdW5zdHJ1Y3R1cmVkIENSTEYKKwkgKiBmaWVsZC1uYW1lID0gMSpmdGV4dAorCSAqIGZ0ZXh0ID0gJWQzMy01NyAvICU1OS0xMjYKKwkgKi8KKwlpbnQgY2g7CisJY2hhciAqY3AgPSBsaW5lOworCXdoaWxlICgoY2ggPSAqY3ArKykpIHsKKwkJaWYgKGNoID09ICc6JykKKwkJCXJldHVybiBjcCAhPSBsaW5lOworCQlpZiAoKDMzIDw9IGNoICYmIGNoIDw9IDU3KSB8fAorCQkgICAgKDU5IDw9IGNoICYmIGNoIDw9IDEyNikpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfb25lX2hlYWRlcl9saW5lKGNoYXIgKmxpbmUsIGludCBzeiwgRklMRSAqaW4pCit7CisJaW50IG9mcyA9IDA7CisJd2hpbGUgKG9mcyA8IHN6KSB7CisJCWludCBwZWVrLCBsZW47CisJCWlmIChmZ2V0cyhsaW5lICsgb2ZzLCBzeiAtIG9mcywgaW4pID09IE5VTEwpCisJCQlicmVhazsKKwkJbGVuID0gZWF0c3BhY2UobGluZSArIG9mcyk7CisJCWlmIChsZW4gPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoIWlzX3JmYzI4MjJfaGVhZGVyKGxpbmUpKSB7CisJCQkvKiBSZS1hZGQgdGhlIG5ld2xpbmUgKi8KKwkJCWxpbmVbb2ZzICsgbGVuXSA9ICdcbic7CisJCQlsaW5lW29mcyArIGxlbiArIDFdID0gJ1wwJzsKKwkJCWJyZWFrOworCQl9CisJCW9mcyArPSBsZW47CisJCS8qIFl1Y2ssIDI4MjIgaGVhZGVyICJmb2xkaW5nIiAqLworCQlwZWVrID0gZmdldGMoaW4pOyB1bmdldGMocGVlaywgaW4pOworCQlpZiAocGVlayAhPSAnICcgJiYgcGVlayAhPSAnXHQnKQorCQkJYnJlYWs7CisJfQorCS8qIENvdW50IG1ib3ggRnJvbSBoZWFkZXJzIGFzIGhlYWRlcnMgKi8KKwlpZiAoIW9mcyAmJiAhbWVtY21wKGxpbmUsICJGcm9tICIsIDUpKQorCQlvZnMgPSAxOworCXJldHVybiBvZnM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBoZXh2YWwoaW50IGMpCit7CisJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQlyZXR1cm4gYyAtICcwJzsKKwlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCXJldHVybiBjIC0gJ2EnICsgMTA7CisJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQlyZXR1cm4gYyAtICdBJyArIDEwOworCXJldHVybiB+MDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcV9zZWdtZW50KGNoYXIgKmluLCBjaGFyICpvdCwgY2hhciAqZXAsIGludCByZmMyMDQ3KQoreworCWludCBjOworCXdoaWxlICgoYyA9ICppbisrKSAhPSAwICYmIChpbiA8PSBlcCkpIHsKKwkJaWYgKGMgPT0gJz0nKSB7CisJCQlpbnQgZCA9ICppbisrOworCQkJaWYgKGQgPT0gJ1xuJyB8fCAhZCkKKwkJCQlicmVhazsgLyogZHJvcCB0cmFpbGluZyBuZXdsaW5lICovCisJCQkqb3QrKyA9ICgoaGV4dmFsKGQpIDw8IDQpIHwgaGV4dmFsKCppbisrKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmZjMjA0NyAmJiBjID09ICdfJykgLyogcmZjMjA0NyA0LjIgKDIpICovCisJCQljID0gMHgyMDsKKwkJKm90KysgPSBjOworCX0KKwkqb3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9iX3NlZ21lbnQoY2hhciAqaW4sIGNoYXIgKm90LCBjaGFyICplcCkKK3sKKwkvKiBEZWNvZGUgaW4uLmVwLCBwb3NzaWJseSBpbi1wbGFjZSB0byBvdCAqLworCWludCBjLCBwb3MgPSAwLCBhY2MgPSAwOworCisJd2hpbGUgKChjID0gKmluKyspICE9IDAgJiYgKGluIDw9IGVwKSkgeworCQlpZiAoYyA9PSAnKycpCisJCQljID0gNjI7CisJCWVsc2UgaWYgKGMgPT0gJy8nKQorCQkJYyA9IDYzOworCQllbHNlIGlmICgnQScgPD0gYyAmJiBjIDw9ICdaJykKKwkJCWMgLT0gJ0EnOworCQllbHNlIGlmICgnYScgPD0gYyAmJiBjIDw9ICd6JykKKwkJCWMgLT0gJ2EnIC0gMjY7CisJCWVsc2UgaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKQorCQkJYyAtPSAnMCcgLSA1MjsKKwkJZWxzZSBpZiAoYyA9PSAnPScpIHsKKwkJCS8qIHBhZGRpbmcgaXMgYWxtb3N0IGxpa2UgKGMgPT0gMCksIGV4Y2VwdCB3ZSBkbworCQkJICogbm90IG91dHB1dCBOVUwgcmVzdWx0aW5nIG9ubHkgZnJvbSBpdDsKKwkJCSAqIGZvciBub3cgd2UganVzdCB0cnVzdCB0aGUgZGF0YS4KKwkJCSAqLworCQkJYyA9IDA7CisJCX0KKwkJZWxzZQorCQkJY29udGludWU7IC8qIGdhcmJhZ2UgKi8KKwkJc3dpdGNoIChwb3MrKykgeworCQljYXNlIDA6CisJCQlhY2MgPSAoYyA8PCAyKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqb3QrKyA9IChhY2MgfCAoYyA+PiA0KSk7CisJCQlhY2MgPSAoYyAmIDE1KSA8PCA0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCSpvdCsrID0gKGFjYyB8IChjID4+IDIpKTsKKwkJCWFjYyA9IChjICYgMykgPDwgNjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkqb3QrKyA9IChhY2MgfCBjKTsKKwkJCWFjYyA9IHBvcyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwkqb3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X3RvX3V0ZjgoY2hhciAqbGluZSwgY2hhciAqY2hhcnNldCkKK3sKKyNpZm5kZWYgTk9fSUNPTlYKKwljaGFyICppbiwgKm91dDsKKwlzaXplX3QgaW5zaXplLCBvdXRzaXplLCBucmM7CisJY2hhciBvdXRidWZbNDA5Nl07IC8qIGNoZWF0ICovCisJc3RhdGljIGNoYXIgbGF0aW5fb25lW10gPSAibGF0aW4xIjsKKwljaGFyICppbnB1dF9jaGFyc2V0ID0gKmNoYXJzZXQgPyBjaGFyc2V0IDogbGF0aW5fb25lOworCWljb252X3QgY29udiA9IGljb252X29wZW4obWV0YWluZm9fY2hhcnNldCwgaW5wdXRfY2hhcnNldCk7CisKKwlpZiAoY29udiA9PSAoaWNvbnZfdCkgLTEpIHsKKwkJc3RhdGljIGludCB3YXJuZWRfbGF0aW4xX29uY2UgPSAwOworCQlpZiAoaW5wdXRfY2hhcnNldCAhPSBsYXRpbl9vbmUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY2Fubm90IGNvbnZlcnQgZnJvbSAlcyB0byAlc1xuIiwKKwkJCQlpbnB1dF9jaGFyc2V0LCBtZXRhaW5mb19jaGFyc2V0KTsKKwkJCSpjaGFyc2V0ID0gMDsKKwkJfQorCQllbHNlIGlmICghd2FybmVkX2xhdGluMV9vbmNlKSB7CisJCQl3YXJuZWRfbGF0aW4xX29uY2UgPSAxOworCQkJZnByaW50ZihzdGRlcnIsICJ0cmllZCB0byBjb252ZXJ0IGZyb20gJXMgdG8gJXMsICIKKwkJCQkiYnV0IHlvdXIgaWNvbnYgZG9lcyBub3Qgd29yayB3aXRoIGl0LlxuIiwKKwkJCQlpbnB1dF9jaGFyc2V0LCBtZXRhaW5mb19jaGFyc2V0KTsKKwkJfQorCQlyZXR1cm47CisJfQorCWluID0gbGluZTsKKwlpbnNpemUgPSBzdHJsZW4oaW4pOworCW91dCA9IG91dGJ1ZjsKKwlvdXRzaXplID0gc2l6ZW9mKG91dGJ1Zik7CisJbnJjID0gaWNvbnYoY29udiwgJmluLCAmaW5zaXplLCAmb3V0LCAmb3V0c2l6ZSk7CisJaWNvbnZfY2xvc2UoY29udik7CisJaWYgKG5yYyA9PSAoc2l6ZV90KSAtMSkKKwkJcmV0dXJuOworCSpvdXQgPSAwOworCXN0cmNweShsaW5lLCBvdXRidWYpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9oZWFkZXJfYnEoY2hhciAqaXQpCit7CisJY2hhciAqaW4sICpvdXQsICplcCwgKmNwLCAqc3A7CisJY2hhciBvdXRidWZbMTAwMF07CisKKwlpbiA9IGl0OworCW91dCA9IG91dGJ1ZjsKKwl3aGlsZSAoKGVwID0gc3Ryc3RyKGluLCAiPT8iKSkgIT0gTlVMTCkgeworCQlpbnQgc3osIGVuY29kaW5nOworCQljaGFyIGNoYXJzZXRfcVsyNTZdLCBwaWVjZWJ1ZlsyNTZdOworCQlpZiAoaW4gIT0gZXApIHsKKwkJCXN6ID0gZXAgLSBpbjsKKwkJCW1lbWNweShvdXQsIGluLCBzeik7CisJCQlvdXQgKz0gc3o7CisJCQlpbiArPSBzejsKKwkJfQorCQkvKiBFLmcuCisJCSAqIGVwIDogIj0/aXNvLTIwMjItanA/Qj9HeVIuLi4/PSBmb28iCisJCSAqIGVwIDogIj0/SVNPLTg4NTktMT9RP0Zvbz1GQ2Jhcj89IGJheiIKKwkJICovCisJCWVwICs9IDI7CisJCWNwID0gc3RyY2hyKGVwLCAnPycpOworCQlpZiAoIWNwKQorCQkJcmV0dXJuOyAvKiBubyBtdW5naW5nICovCisJCWZvciAoc3AgPSBlcDsgc3AgPCBjcDsgc3ArKykKKwkJCWNoYXJzZXRfcVtzcCAtIGVwXSA9IHRvbG93ZXIoKnNwKTsKKwkJY2hhcnNldF9xW2NwIC0gZXBdID0gMDsKKwkJZW5jb2RpbmcgPSBjcFsxXTsKKwkJaWYgKCFlbmNvZGluZyB8fCBjcFsyXSAhPSAnPycpCisJCQlyZXR1cm47IC8qIG5vIG11bmdpbmcgKi8KKwkJZXAgPSBzdHJzdHIoY3AgKyAzLCAiPz0iKTsKKwkJaWYgKCFlcCkKKwkJCXJldHVybjsgLyogbm8gbXVuZ2luZyAqLworCQlzd2l0Y2ggKHRvbG93ZXIoZW5jb2RpbmcpKSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47IC8qIG5vIG11bmdpbmcgKi8KKwkJY2FzZSAnYic6CisJCQlzeiA9IGRlY29kZV9iX3NlZ21lbnQoY3AgKyAzLCBwaWVjZWJ1ZiwgZXApOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJc3ogPSBkZWNvZGVfcV9zZWdtZW50KGNwICsgMywgcGllY2VidWYsIGVwLCAxKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzeiA8IDApCisJCQlyZXR1cm47CisJCWlmIChtZXRhaW5mb19jaGFyc2V0KQorCQkJY29udmVydF90b191dGY4KHBpZWNlYnVmLCBjaGFyc2V0X3EpOworCQlzdHJjcHkob3V0LCBwaWVjZWJ1Zik7CisJCW91dCArPSBzdHJsZW4ob3V0KTsKKwkJaW4gPSBlcCArIDI7CisJfQorCXN0cmNweShvdXQsIGluKTsKKwlzdHJjcHkoaXQsIG91dGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV90cmFuc2Zlcl9lbmNvZGluZyhjaGFyICpsaW5lKQoreworCWNoYXIgKmVwOworCisJc3dpdGNoICh0cmFuc2Zlcl9lbmNvZGluZykgeworCWNhc2UgVEVfUVA6CisJCWVwID0gbGluZSArIHN0cmxlbihsaW5lKTsKKwkJZGVjb2RlX3Ffc2VnbWVudChsaW5lLCBsaW5lLCBlcCwgMCk7CisJCWJyZWFrOworCWNhc2UgVEVfQkFTRTY0OgorCQllcCA9IGxpbmUgKyBzdHJsZW4obGluZSk7CisJCWRlY29kZV9iX3NlZ21lbnQobGluZSwgbGluZSwgZXApOworCQlicmVhazsKKwljYXNlIFRFX0RPTlRDQVJFOgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9pbmZvKHZvaWQpCit7CisJY2hhciAqc3ViOworCisJc3ViID0gY2xlYW51cF9zdWJqZWN0KHN1YmplY3QpOworCWNsZWFudXBfc3BhY2UobmFtZSk7CisJY2xlYW51cF9zcGFjZShkYXRlKTsKKwljbGVhbnVwX3NwYWNlKGVtYWlsKTsKKwljbGVhbnVwX3NwYWNlKHN1Yik7CisKKwlwcmludGYoIkF1dGhvcjogJXNcbkVtYWlsOiAlc1xuU3ViamVjdDogJXNcbkRhdGU6ICVzXG5cbiIsCisJICAgICAgIG5hbWUsIGVtYWlsLCBzdWIsIGRhdGUpOworfQorCisvKiBXZSBhcmUgaW5zaWRlIG1lc3NhZ2UgYm9keSBhbmQgaGF2ZSByZWFkIGxpbmVbXSBhbHJlYWR5LgorICogU3BpdCBvdXQgdGhlIGNvbW1pdCBsb2cuCisgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2NvbW1pdF9tc2coaW50ICpzZWVuKQoreworCWlmICghY21pdG1zZykKKwkJcmV0dXJuIDA7CisJZG8geworCQlpZiAoIW1lbWNtcCgiZGlmZiAtIiwgbGluZSwgNikgfHwKKwkJICAgICFtZW1jbXAoIi0tLSIsIGxpbmUsIDMpIHx8CisJCSAgICAhbWVtY21wKCJJbmRleDogIiwgbGluZSwgNykpCisJCQlicmVhazsKKwkJaWYgKChtdWx0aXBhcnRfYm91bmRhcnlbMF0gJiYgaXNfbXVsdGlwYXJ0X2JvdW5kYXJ5KGxpbmUpKSkgeworCQkJLyogV2UgY29tZSBoZXJlIHdoZW4gdGhlIGZpcnN0IHBhcnQgaGFkIG9ubHkKKwkJCSAqIHRoZSBjb21taXQgbWVzc2FnZSB3aXRob3V0IGFueSBwYXRjaC4gIFdlCisJCQkgKiBwcmV0ZW5kIHdlIGhhdmUgbm90IHNlZW4gdGhpcyBsaW5lIHlldCwgYW5kCisJCQkgKiBnbyBiYWNrIHRvIHRoZSBsb29wLgorCQkJICovCisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIFVud3JhcCB0cmFuc2ZlciBlbmNvZGluZyBhbmQgb3B0aW9uYWxseQorCQkgKiBub3JtYWxpemUgdGhlIGxvZyBtZXNzYWdlIHRvIFVURi04LgorCQkgKi8KKwkJZGVjb2RlX3RyYW5zZmVyX2VuY29kaW5nKGxpbmUpOworCQlpZiAobWV0YWluZm9fY2hhcnNldCkKKwkJCWNvbnZlcnRfdG9fdXRmOChsaW5lLCBjaGFyc2V0KTsKKworCQloYW5kbGVfaW5ib2R5X2hlYWRlcihzZWVuLCBsaW5lKTsKKwkJaWYgKCEoKnNlZW4gJiBTRUVOX1BSRUZJWCkpCisJCQljb250aW51ZTsKKworCQlmcHV0cyhsaW5lLCBjbWl0bXNnKTsKKwl9IHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKTsKKwlmY2xvc2UoY21pdG1zZyk7CisJY21pdG1zZyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdlIGhhdmUgZG9uZSB0aGUgY29tbWl0IG1lc3NhZ2UgYW5kIGhhdmUgdGhlIGZpcnN0CisgKiBsaW5lIG9mIHRoZSBwYXRjaCBpbiBsaW5lW10uCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9wYXRjaCh2b2lkKQoreworCWRvIHsKKwkJaWYgKG11bHRpcGFydF9ib3VuZGFyeVswXSAmJiBpc19tdWx0aXBhcnRfYm91bmRhcnkobGluZSkpCisJCQlicmVhazsKKwkJLyogT25seSB1bndyYXAgdHJhbnNmZXIgZW5jb2RpbmcgYnV0IG90aGVyd2lzZSBkbyBub3QKKwkJICogZG8gYW55dGhpbmcuICBXZSBkbyAqTk9UKiB3YW50IFVURi04IGNvbnZlcnNpb24KKwkJICogaGVyZTsgd2UgYXJlIGRlYWxpbmcgd2l0aCB0aGUgdXNlciBwYXlsb2FkLgorCQkgKi8KKwkJZGVjb2RlX3RyYW5zZmVyX2VuY29kaW5nKGxpbmUpOworCQlmcHV0cyhsaW5lLCBwYXRjaGZpbGUpOworCQlwYXRjaF9saW5lcysrOworCX0gd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pICE9IE5VTEwpOworfQorCisvKiBtdWx0aXBhcnQgYm91bmRhcnkgYW5kIHRyYW5zZmVyIGVuY29kaW5nIGFyZSBzZXQgdXAgZm9yIHVzLCBhbmQgd2UKKyAqIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdWIgaGVhZGVyLiAgZG8gZXF1aXZhbGVudCBvZiBoYW5kbGVfYm9keSB1cAorICogdG8gdGhlIG5leHQgYm91bmRhcnkgd2l0aG91dCBjbG9zaW5nIHBhdGNoZmlsZSAtLS0gd2Ugd2lsbCBleHBlY3QKKyAqIHRoYXQgdGhlIGZpcnN0IHBhcnQgdG8gY29udGFpbiBjb21taXQgbWVzc2FnZSBhbmQgYSBwYXRjaCwgYW5kCisgKiBoYW5kbGUgb3RoZXIgcGFydHMgYXMgcHVyZSBwYXRjaGVzLgorICovCitzdGF0aWMgaW50IGhhbmRsZV9tdWx0aXBhcnRfb25lX3BhcnQoaW50ICpzZWVuKQoreworCWludCBuID0gMDsKKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKSB7CisJYWdhaW46CisJCW4rKzsKKwkJaWYgKGlzX211bHRpcGFydF9ib3VuZGFyeShsaW5lKSkKKwkJCWJyZWFrOworCQlpZiAoaGFuZGxlX2NvbW1pdF9tc2coc2VlbikpCisJCQlnb3RvIGFnYWluOworCQloYW5kbGVfcGF0Y2goKTsKKwkJYnJlYWs7CisJfQorCWlmIChuID09IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX211bHRpcGFydF9ib2R5KHZvaWQpCit7CisJaW50IHNlZW4gPSAwOworCWludCBwYXJ0X251bSA9IDA7CisKKwkvKiBTa2lwIHVwIHRvIHRoZSBmaXJzdCBib3VuZGFyeSAqLworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKQorCQlpZiAoaXNfbXVsdGlwYXJ0X2JvdW5kYXJ5KGxpbmUpKSB7CisJCQlwYXJ0X251bSA9IDE7CisJCQlicmVhazsKKwkJfQorCWlmICghcGFydF9udW0pCisJCXJldHVybjsKKwkvKiBXZSBhcmUgb24gYm91bmRhcnkgbGluZS4gIFN0YXJ0IHNsdXJwaW5nIHRoZSBzdWJoZWFkLiAqLworCXdoaWxlICgxKSB7CisJCWludCBoZHIgPSByZWFkX29uZV9oZWFkZXJfbGluZShsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKTsKKwkJaWYgKCFoZHIpIHsKKwkJCWlmIChoYW5kbGVfbXVsdGlwYXJ0X29uZV9wYXJ0KCZzZWVuKSA8IDApCisJCQkJcmV0dXJuOworCQkJLyogUmVzZXQgcGVyIHBhcnQgaGVhZGVycyAqLworCQkJdHJhbnNmZXJfZW5jb2RpbmcgPSBURV9ET05UQ0FSRTsKKwkJCWNoYXJzZXRbMF0gPSAwOworCQl9CisJCWVsc2UKKwkJCWNoZWNrX3N1YmhlYWRlcl9saW5lKGxpbmUpOworCX0KKwlmY2xvc2UocGF0Y2hmaWxlKTsKKwlpZiAoIXBhdGNoX2xpbmVzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gcGF0Y2ggZm91bmRcbiIpOworCQlleGl0KDEpOworCX0KK30KKworLyogTm9uIG11bHRpcGFydCBtZXNzYWdlICovCitzdGF0aWMgdm9pZCBoYW5kbGVfYm9keSh2b2lkKQoreworCWludCBzZWVuID0gMDsKKworCWlmIChsaW5lWzBdIHx8IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pICE9IE5VTEwpIHsKKwkJaGFuZGxlX2NvbW1pdF9tc2coJnNlZW4pOworCQloYW5kbGVfcGF0Y2goKTsKKwl9CisJZmNsb3NlKHBhdGNoZmlsZSk7CisJaWYgKCFwYXRjaF9saW5lcykgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHBhdGNoIGZvdW5kXG4iKTsKKwkJZXhpdCgxKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG1haWxpbmZvX3VzYWdlW10gPQorCSJnaXQtbWFpbGluZm8gWy1rXSBbLXUgfCAtLWVuY29kaW5nPTxlbmNvZGluZz5dIG1zZyBwYXRjaCA8bWFpbCA+aW5mbyI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKiBORUVEU1dPUks6IG1pZ2h0IHdhbnQgdG8gZG8gdGhlIG9wdGlvbmFsIC5naXQvIGRpcmVjdG9yeQorCSAqIGRpc2NvdmVyeQorCSAqLworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLWsiKSkKKwkJCWtlZXBfc3ViamVjdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi11IikpCisJCQltZXRhaW5mb19jaGFyc2V0ID0gZ2l0X2NvbW1pdF9lbmNvZGluZzsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoYXJndlsxXSwgIi0tZW5jb2Rpbmc9IiwgMTEpKQorCQkJbWV0YWluZm9fY2hhcnNldCA9IGFyZ3ZbMV0gKyAxMTsKKwkJZWxzZQorCQkJdXNhZ2UobWFpbGluZm9fdXNhZ2UpOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoYXJnYyAhPSAzKQorCQl1c2FnZShtYWlsaW5mb191c2FnZSk7CisJY21pdG1zZyA9IGZvcGVuKGFyZ3ZbMV0sICJ3Iik7CisJaWYgKCFjbWl0bXNnKSB7CisJCXBlcnJvcihhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisJcGF0Y2hmaWxlID0gZm9wZW4oYXJndlsyXSwgInciKTsKKwlpZiAoIXBhdGNoZmlsZSkgeworCQlwZXJyb3IoYXJndlsyXSk7CisJCWV4aXQoMSk7CisJfQorCXdoaWxlICgxKSB7CisJCWludCBoZHIgPSByZWFkX29uZV9oZWFkZXJfbGluZShsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKTsKKwkJaWYgKCFoZHIpIHsKKwkJCWlmIChtdWx0aXBhcnRfYm91bmRhcnlbMF0pCisJCQkJaGFuZGxlX211bHRpcGFydF9ib2R5KCk7CisJCQllbHNlCisJCQkJaGFuZGxlX2JvZHkoKTsKKwkJCWhhbmRsZV9pbmZvKCk7CisJCQlicmVhazsKKwkJfQorCQljaGVja19oZWFkZXJfbGluZShsaW5lKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tYWlsc3BsaXQuYyBiL21haWxzcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTU2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWlsc3BsaXQuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIFRvdGFsbHkgYnJhaW5kYW1hZ2VkIG1ib3ggc3BsaXR0ZXIgcHJvZ3JhbS4KKyAqCisgKiBJdCBqdXN0IHNwbGl0cyBhIG1ib3ggaW50byBhIGxpc3Qgb2YgZmlsZXM6ICIwMDAxIiAiMDAwMiIgLi4KKyAqIHNvIHlvdSBjYW4gcHJvY2VzcyB0aGVtIGZ1cnRoZXIgZnJvbSB0aGVyZS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF9tYWlsc3BsaXRfdXNhZ2VbXSA9CisiZ2l0LW1haWxzcGxpdCBbLWQ8cHJlYz5dIFstZjxuPl0gWy1iXSAtbzxkaXJlY3Rvcnk+IDxtYm94Pi4uLiI7CisKK3N0YXRpYyBpbnQgaXNfZnJvbV9saW5lKGNvbnN0IGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqY29sb247CisKKwlpZiAobGVuIDwgMjAgfHwgbWVtY21wKCJGcm9tICIsIGxpbmUsIDUpKQorCQlyZXR1cm4gMDsKKworCWNvbG9uID0gbGluZSArIGxlbiAtIDI7CisJbGluZSArPSA1OworCWZvciAoOzspIHsKKwkJaWYgKGNvbG9uIDwgbGluZSkKKwkJCXJldHVybiAwOworCQlpZiAoKi0tY29sb24gPT0gJzonKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFpc2RpZ2l0KGNvbG9uWy00XSkgfHwKKwkgICAgIWlzZGlnaXQoY29sb25bLTJdKSB8fAorCSAgICAhaXNkaWdpdChjb2xvblstMV0pIHx8CisJICAgICFpc2RpZ2l0KGNvbG9uWyAxXSkgfHwKKwkgICAgIWlzZGlnaXQoY29sb25bIDJdKSkKKwkJcmV0dXJuIDA7CisKKwkvKiB5ZWFyICovCisJaWYgKHN0cnRvbChjb2xvbiszLCBOVUxMLCAxMCkgPD0gOTApCisJCXJldHVybiAwOworCisJLyogT2ssIGNsb3NlIGVub3VnaCAqLworCXJldHVybiAxOworfQorCisvKiBDb3VsZCBiZSBhcyBzbWFsbCBhcyA2NCwgZW5vdWdoIHRvIGhvbGQgYSBVbml4ICJGcm9tICIgbGluZS4gKi8KK3N0YXRpYyBjaGFyIGJ1Zls0MDk2XTsKKworLyogQ2FsbGVkIHdpdGggdGhlIGZpcnN0IGxpbmUgKHBvdGVudGlhbGx5IHBhcnRpYWwpCisgKiBhbHJlYWR5IGluIGJ1ZltdIC0tIG5vcm1hbGx5IHRoYXQgc2hvdWxkIGJlZ2luIHdpdGgKKyAqIHRoZSBVbml4ICJGcm9tICIgbGluZS4gIFdyaXRlIGl0IGludG8gdGhlIHNwZWNpZmllZAorICogZmlsZS4KKyAqLworc3RhdGljIGludCBzcGxpdF9vbmUoRklMRSAqbWJveCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGFsbG93X2JhcmUpCit7CisJRklMRSAqb3V0cHV0ID0gTlVMTDsKKwlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJaW50IGZkOworCWludCBzdGF0dXMgPSAwOworCWludCBpc19iYXJlID0gIWlzX2Zyb21fbGluZShidWYsIGxlbik7CisKKwlpZiAoaXNfYmFyZSAmJiAhYWxsb3dfYmFyZSkKKwkJZ290byBjb3JydXB0OworCisJZmQgPSBvcGVuKG5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG5hbWUpOworCW91dHB1dCA9IGZkb3BlbihmZCwgInciKTsKKworCS8qIENvcHkgaXQgb3V0LCB3aGlsZSBzZWFyY2hpbmcgZm9yIGEgbGluZSB0aGF0IGJlZ2lucyB3aXRoCisJICogIkZyb20gIiBhbmQgaGF2aW5nIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBkYXRlIGZvcm1hdC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWludCBpc19wYXJ0aWFsID0gKGJ1ZltsZW4tMV0gIT0gJ1xuJyk7CisKKwkJaWYgKGZwdXRzKGJ1Ziwgb3V0cHV0KSA9PSBFT0YpCisJCQlkaWUoImNhbm5vdCB3cml0ZSBvdXRwdXQiKTsKKworCQlpZiAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgbWJveCkgPT0gTlVMTCkgeworCQkJaWYgKGZlb2YobWJveCkpIHsKKwkJCQlzdGF0dXMgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJZGllKCJjYW5ub3QgcmVhZCBtYm94Iik7CisJCX0KKwkJbGVuID0gc3RybGVuKGJ1Zik7CisJCWlmICghaXNfcGFydGlhbCAmJiAhaXNfYmFyZSAmJiBpc19mcm9tX2xpbmUoYnVmLCBsZW4pKQorCQkJYnJlYWs7IC8qIGRvbmUgd2l0aCBvbmUgbWVzc2FnZSAqLworCX0KKwlmY2xvc2Uob3V0cHV0KTsKKwlyZXR1cm4gc3RhdHVzOworCisgY29ycnVwdDoKKwlpZiAob3V0cHV0KQorCQlmY2xvc2Uob3V0cHV0KTsKKwl1bmxpbmsobmFtZSk7CisJZnByaW50ZihzdGRlcnIsICJjb3JydXB0IG1haWxib3hcbiIpOworCWV4aXQoMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgbnIgPSAwLCBucl9wcmVjID0gNDsKKwlpbnQgYWxsb3dfYmFyZSA9IDA7CisJY29uc3QgY2hhciAqZGlyID0gTlVMTDsKKwljb25zdCBjaGFyICoqYXJncDsKKwlzdGF0aWMgY29uc3QgY2hhciAqc3RkaW5fb25seVtdID0geyAiLSIsIE5VTEwgfTsKKwljaGFyICpuYW1lOworCisJZm9yIChhcmdwID0gYXJndisxOyAqYXJncDsgYXJncCsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9ICphcmdwOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCS8qIGRvIGZsYWdzIGhlcmUgKi8KKwkJaWYgKCBhcmdbMV0gPT0gJ2QnICkgeworCQkJbnJfcHJlYyA9IHN0cnRvbChhcmcrMiwgTlVMTCwgMTApOworCQkJaWYgKG5yX3ByZWMgPCAzIHx8IDEwIDw9IG5yX3ByZWMpCisJCQkJdXNhZ2UoZ2l0X21haWxzcGxpdF91c2FnZSk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICggYXJnWzFdID09ICdmJyApIHsKKwkJCW5yID0gc3RydG9sKGFyZysyLCBOVUxMLCAxMCk7CisJCX0gZWxzZSBpZiAoIGFyZ1sxXSA9PSAnYicgJiYgIWFyZ1syXSApIHsKKwkJCWFsbG93X2JhcmUgPSAxOworCQl9IGVsc2UgaWYgKCBhcmdbMV0gPT0gJ28nICYmIGFyZ1syXSApIHsKKwkJCWRpciA9IGFyZysyOworCQl9IGVsc2UgaWYgKCBhcmdbMV0gPT0gJy0nICYmICFhcmdbMl0gKSB7CisJCQlhcmdwKys7CS8qIC0tIG1hcmtzIGVuZCBvZiBvcHRpb25zICovCisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWRpZSgidW5rbm93biBvcHRpb246ICVzIiwgYXJnKTsKKwkJfQorCX0KKworCWlmICggIWRpciApIHsKKwkJLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IGlmIG5vIC1vIHNwZWNpZmllZCwgYWNjZXB0CisJCSAgIDxtYm94PiA8ZGlyPiBvciBqdXN0IDxkaXI+ICovCisJCXN3aXRjaCAoYXJnYyAtIChhcmdwLWFyZ3YpKSB7CisJCWNhc2UgMToKKwkJCWRpciA9IGFyZ3BbMF07CisJCQlhcmdwID0gc3RkaW5fb25seTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzdGRpbl9vbmx5WzBdID0gYXJncFswXTsKKwkJCWRpciA9IGFyZ3BbMV07CisJCQlhcmdwID0gc3RkaW5fb25seTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoZ2l0X21haWxzcGxpdF91c2FnZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBOZXcgdXNhZ2U6IGlmIG5vIG1vcmUgYXJndW1lbnQsIHBhcnNlIHN0ZGluICovCisJCWlmICggISphcmdwICkKKwkJCWFyZ3AgPSBzdGRpbl9vbmx5OworCX0KKworCW5hbWUgPSB4bWFsbG9jKHN0cmxlbihkaXIpICsgMiArIDMgKiBzaXplb2YobnIpKTsKKworCXdoaWxlICgqYXJncCkgeworCQljb25zdCBjaGFyICpmaWxlID0gKmFyZ3ArKzsKKwkJRklMRSAqZiA9ICFzdHJjbXAoZmlsZSwgIi0iKSA/IHN0ZGluIDogZm9wZW4oZmlsZSwgInIiKTsKKwkJaW50IGZpbGVfZG9uZSA9IDA7CisKKwkJaWYgKCAhZiApCisJCQlkaWUgKCJjYW5ub3Qgb3BlbiBtYm94ICVzIiwgZmlsZSk7CisKKwkJaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpID09IE5VTEwpIHsKKwkJCWlmIChmID09IHN0ZGluKQorCQkJCWJyZWFrOyAvKiBlbXB0eSBzdGRpbiBpcyBPSyAqLworCQkJZGllKCJjYW5ub3QgcmVhZCBtYm94ICVzIiwgZmlsZSk7CisJCX0KKworCQl3aGlsZSAoIWZpbGVfZG9uZSkgeworCQkJc3ByaW50ZihuYW1lLCAiJXMvJTAqZCIsIGRpciwgbnJfcHJlYywgKytucik7CisJCQlmaWxlX2RvbmUgPSBzcGxpdF9vbmUoZiwgbmFtZSwgYWxsb3dfYmFyZSk7CisJCX0KKworCQlpZiAoZiAhPSBzdGRpbikKKwkJCWZjbG9zZShmKTsKKwl9CisKKwlwcmludGYoIiVkXG4iLCBucik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZXJnZS1iYXNlLmMgYi9tZXJnZS1iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1NmNhMAotLS0gL2Rldi9udWxsCisrKyBiL21lcmdlLWJhc2UuYwpAQCAtMCwwICsxLDI2NCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisKKyNkZWZpbmUgUEFSRU5UMSAxCisjZGVmaW5lIFBBUkVOVDIgMgorI2RlZmluZSBVTklOVEVSRVNUSU5HIDQKKworc3RhdGljIHN0cnVjdCBjb21taXQgKmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gY29tbWl0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEEgcGF0aG9sb2dpY2FsIGV4YW1wbGUgb2YgaG93IHRoaXMgdGhpbmcgd29ya3MuCisgKgorICogU3VwcG9zZSB3ZSBoYWQgdGhpcyBjb21taXQgZ3JhcGgsIHdoZXJlIGNocm9ub2xvZ2ljYWxseQorICogdGhlIHRpbWVzdGFtcCBvbiB0aGUgY29tbWl0IGFyZSBBIDw9IEIgPD0gQyA8PSBEIDw9IEUgPD0gRgorICogYW5kIHdlIGFyZSB0cnlpbmcgdG8gZmlndXJlIG91dCB0aGUgbWVyZ2UgYmFzZSBmb3IgRSBhbmQgRgorICogY29tbWl0cy4KKyAqCisgKiAgICAgICAgICAgICAgICAgIEYKKyAqICAgICAgICAgICAgICAgICAvIFwKKyAqICAgICAgICAgICAgRSAgIEEgICBECisgKiAgICAgICAgICAgICBcIC8gICAvICAKKyAqICAgICAgICAgICAgICBCICAgLworICogICAgICAgICAgICAgICBcIC8KKyAqICAgICAgICAgICAgICAgIEMKKyAqCisgKiBGaXJzdCB3ZSBwdXNoIEUgYW5kIEYgdG8gbGlzdCB0byBiZSBwcm9jZXNzZWQuICBFIGdldHMgYml0IDEKKyAqIGFuZCBGIGdldHMgYml0IDIuICBUaGUgbGlzdCBiZWNvbWVzOgorICoKKyAqICAgICBsaXN0PUYoMikgRSgxKSwgcmVzdWx0PWVtcHR5CisgKgorICogVGhlbiB3ZSBwb3AgRiwgdGhlIG5ld2VzdCBjb21taXQsIGZyb20gdGhlIGxpc3QuICBJdHMgZmxhZyBpcyAyLgorICogV2Ugc2NhbiBpdHMgcGFyZW50cywgbWFyayB0aGVtIHJlYWNoYWJsZSBmcm9tIHRoZSBzaWRlIHRoYXQgRiBpcworICogcmVhY2hhYmxlIGZyb20sIGFuZCBwdXNoIHRoZW0gdG8gdGhlIGxpc3Q6CisgKgorICogICAgIGxpc3Q9RSgxKSBEKDIpIEEoMiksIHJlc3VsdD1lbXB0eQorICoKKyAqIE5leHQgcG9wIEUgYW5kIGRvIHRoZSBzYW1lLgorICoKKyAqICAgICBsaXN0PUQoMikgQigxKSBBKDIpLCByZXN1bHQ9ZW1wdHkKKyAqCisgKiBOZXh0IHBvcCBEIGFuZCBkbyB0aGUgc2FtZS4KKyAqCisgKiAgICAgbGlzdD1DKDIpIEIoMSkgQSgyKSwgcmVzdWx0PWVtcHR5CisgKgorICogTmV4dCBwb3AgQyBhbmQgZG8gdGhlIHNhbWUuCisgKgorICogICAgIGxpc3Q9QigxKSBBKDIpLCByZXN1bHQ9ZW1wdHkKKyAqCisgKiBOb3cgaXQgaXMgQidzIHR1cm4uICBXZSBtYXJrIGl0cyBwYXJlbnQsIEMsIHJlYWNoYWJsZSBmcm9tIEIncyBzaWRlLAorICogYW5kIHB1c2ggaXQgdG8gdGhlIGxpc3Q6CisgKgorICogICAgIGxpc3Q9QygzKSBBKDIpLCByZXN1bHQ9ZW1wdHkKKyAqCisgKiBOb3cgcG9wIEMgYW5kIG5vdGljZSBpdCBoYXMgZmxhZ3M9PTMuICBJdCBpcyBwbGFjZWQgb24gdGhlIHJlc3VsdCBsaXN0LAorICogYW5kIHRoZSBsaXN0IG5vdyBjb250YWluczoKKyAqCisgKiAgICAgbGlzdD1BKDIpLCByZXN1bHQ9QygzKQorICoKKyAqIFdlIHBvcCBBIGFuZCBkbyB0aGUgc2FtZS4KKyAqIAorICogICAgIGxpc3Q9QigzKSwgcmVzdWx0PUMoMykKKyAqCisgKiBOZXh0LCB3ZSBwb3AgQiBhbmQgc29tZXRoaW5nIHZlcnkgaW50ZXJlc3RpbmcgaGFwcGVucy4gIEl0IGhhcyBmbGFncz09MworICogc28gaXQgaXMgYWxzbyBwbGFjZWQgb24gdGhlIHJlc3VsdCBsaXN0LCBhbmQgaXRzIHBhcmVudHMgYXJlIG1hcmtlZAorICogdW5pbnRlcmVzdGluZywgcmV0cm9hY3RpdmVseSwgYW5kIHBsYWNlZCBiYWNrIG9uIHRoZSBsaXN0OgorICoKKyAqICAgIGxpc3Q9Qyg3KSwgcmVzdWx0PUMoNykgQigzKQorICogCisgKiBOb3csIGxpc3QgZG9lcyBub3QgaGF2ZSBhbnkgaW50ZXJlc3RpbmcgY29tbWl0LiAgU28gd2UgZmluZCB0aGUgbmV3ZXN0CisgKiBjb21taXQgZnJvbSB0aGUgcmVzdWx0IGxpc3QgdGhhdCBpcyBub3QgbWFya2VkIHVuaW50ZXJlc3RpbmcuICBXaGljaCBpcworICogY29tbWl0IEIuCisgKgorICoKKyAqIEFub3RoZXIgcGF0aG9sb2dpY2FsIGV4YW1wbGUgaG93IHRoaXMgdGhpbmcgdXNlZCB0byBmYWlsIHRvIG1hcmsgYW4KKyAqIGFuY2VzdG9yIG9mIGEgbWVyZ2UgYmFzZSBhcyBVTklOVEVSRVNUSU5HIGJlZm9yZSB3ZSBpbnRyb2R1Y2VkIHRoZQorICogcG9zdHByb2Nlc3NpbmcgcGhhc2UgKG1hcmtfcmVhY2hhYmxlX2NvbW1pdHMpLgorICoKKyAqCQkgIDIKKyAqCQkgIEgKKyAqCSAgICAxICAgIC8gXAorICoJICAgIEcgICBBICAgXAorICoJICAgIHxcIC8gICAgIFwgCisgKgkgICAgfCBCICAgICAgIFwKKyAqCSAgICB8ICBcICAgICAgIFwKKyAqCSAgICAgXCAgQyAgICAgICBGCisgKgkgICAgICBcICBcICAgICAvIAorICoJICAgICAgIFwgIEQgICAvICAgCisgKgkJXCB8ICAvCisgKgkJIFx8IC8KKyAqCQkgIEUKKyAqCisgKgkgbGlzdAkJCUEgQiBDIEQgRSBGIEcgSAorICoJIEcxIEgyCQkJLSAtIC0gLSAtIC0gMSAyCisgKgkgSDIgRTEgQjEJCS0gMSAtIC0gMSAtIDEgMgorICoJIEYyIEUxIEIxIEEyCQkyIDEgLSAtIDEgMiAxIDIKKyAqCSBFMyBCMSBBMgkJMiAxIC0gLSAzIDIgMSAyCisgKgkgQjEgQTIJCQkyIDEgLSAtIDMgMiAxIDIKKyAqCSBDMSBBMgkJCTIgMSAxIC0gMyAyIDEgMgorICoJIEQxIEEyCQkJMiAxIDEgMSAzIDIgMSAyCisgKgkgQTIJCQkyIDEgMSAxIDMgMiAxIDIKKyAqCSBCMwkJCTIgMyAxIDEgMyAyIDEgMgorICoJIEM3CQkJMiAzIDcgMSAzIDIgMSAyCisgKgorICogQXQgdGhpcyBwb2ludCwgdW5mb3J0dW5hdGVseSwgZXZlcnlib2R5IGluIHRoZSBsaXN0IGlzCisgKiB1bmludGVyZXN0aW5nLCBzbyB3ZSBmYWlsIHRvIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgdHdvCisgKiBzdGVwcyB0byBmdWxseSBtYXJraW5nIHVuaW50ZXJlc3RpbmcgY29tbWl0cy4KKyAqCisgKgkgRDcJCQkyIDMgNyA3IDMgMiAxIDIKKyAqCSBFNwkJCTIgMyA3IDcgNyAyIDEgMgorICoKKyAqIGFuZCB3ZSBlbmRlZCB1cCBzaG93aW5nIEUgYXMgYW4gaW50ZXJlc3RpbmcgbWVyZ2UgYmFzZS4KKyAqIFRoZSBwb3N0cHJvY2Vzc2luZyBwaGFzZSByZS1pbmplY3RzIEMgYW5kIGNvbnRpbnVlcyB0cmF2ZXJzYWwKKyAqIHRvIGNvbnRhbWluYXRlIEQgYW5kIEUuCisgKi8KKworc3RhdGljIGludCBzaG93X2FsbCA9IDA7CisKK3N0YXRpYyB2b2lkIG1hcmtfcmVhY2hhYmxlX2NvbW1pdHMoc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQsCisJCQkJICAgc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqdG1wOworCisJLyoKKwkgKiBQb3N0cHJvY2VzcyB0byBmdWxseSBjb250YW1pbmF0ZSB0aGUgd2VsbC4KKwkgKi8KKwlmb3IgKHRtcCA9IHJlc3VsdDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqYyA9IHRtcC0+aXRlbTsKKwkJLyogUmVpbmplY3QgdW5pbnRlcmVzdGluZyBvbmVzIHRvIGxpc3QsCisJCSAqIHNvIHdlIGNhbiBzY2FuIHRoZWlyIHBhcmVudHMuCisJCSAqLworCQlpZiAoYy0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCWNvbW1pdF9saXN0X2luc2VydChjLCAmbGlzdCk7CisJfQorCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmMgPSBsaXN0LT5pdGVtOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisKKwkJdG1wID0gbGlzdDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWZyZWUodG1wKTsKKworCQkvKiBBbnl0aGluZyB0YWtlbiBvdXQgb2YgdGhlIGxpc3QgaXMgdW5pbnRlcmVzdGluZywgc28KKwkJICogbWFyayBhbGwgaXRzIHBhcmVudHMgdW5pbnRlcmVzdGluZy4gIFdlIGRvIG5vdAorCQkgKiBwYXJzZSBuZXcgb25lcyAod2UgYWxyZWFkeSBwYXJzZWQgYWxsIHRoZSByZWxldmFudAorCQkgKiBvbmVzKS4KKwkJICovCisJCXBhcmVudHMgPSBjLT5wYXJlbnRzOworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJCWlmICghKHAtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKSB7CisJCQkJcC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCQkJY29tbWl0X2xpc3RfaW5zZXJ0KHAsICZsaXN0KTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBtZXJnZV9iYXNlKHN0cnVjdCBjb21taXQgKnJldjEsIHN0cnVjdCBjb21taXQgKnJldjIpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gTlVMTDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnJlc3VsdCA9IE5VTEw7CisJc3RydWN0IGNvbW1pdF9saXN0ICp0bXAgPSBOVUxMOworCisJaWYgKHJldjEgPT0gcmV2MikgeworCQlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChyZXYxLT5vYmplY3Quc2hhMSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXJzZV9jb21taXQocmV2MSk7CisJcGFyc2VfY29tbWl0KHJldjIpOworCisJcmV2MS0+b2JqZWN0LmZsYWdzIHw9IDE7CisJcmV2Mi0+b2JqZWN0LmZsYWdzIHw9IDI7CisJaW5zZXJ0X2J5X2RhdGUocmV2MSwgJmxpc3QpOworCWluc2VydF9ieV9kYXRlKHJldjIsICZsaXN0KTsKKworCXdoaWxlIChpbnRlcmVzdGluZyhsaXN0KSkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCWludCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgNzsKKworCQl0bXAgPSBsaXN0OworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJZnJlZSh0bXApOworCQlpZiAoZmxhZ3MgPT0gMykgeworCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmcmVzdWx0KTsKKworCQkJLyogTWFyayBwYXJlbnRzIG9mIGEgZm91bmQgbWVyZ2UgdW5pbnRlcmVzdGluZyAqLworCQkJZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJfQorCQlwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJCWlmICgocC0+b2JqZWN0LmZsYWdzICYgZmxhZ3MpID09IGZsYWdzKQorCQkJCWNvbnRpbnVlOworCQkJcGFyc2VfY29tbWl0KHApOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IGZsYWdzOworCQkJaW5zZXJ0X2J5X2RhdGUocCwgJmxpc3QpOworCQl9CisJfQorCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAxOworCisJaWYgKHJlc3VsdC0+bmV4dCAmJiBsaXN0KQorCQltYXJrX3JlYWNoYWJsZV9jb21taXRzKHJlc3VsdCwgbGlzdCk7CisKKwl3aGlsZSAocmVzdWx0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHJlc3VsdC0+aXRlbTsKKwkJcmVzdWx0ID0gcmVzdWx0LT5uZXh0OworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJaWYgKCFzaG93X2FsbCkKKwkJCXJldHVybiAwOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbWVyZ2VfYmFzZV91c2FnZVtdID0KKyJnaXQtbWVyZ2UtYmFzZSBbLS1hbGxdIDxjb21taXQtaWQ+IDxjb21taXQtaWQ+IjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBjb21taXQgKnJldjEsICpyZXYyOworCXVuc2lnbmVkIGNoYXIgcmV2MWtleVsyMF0sIHJldjJrZXlbMjBdOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQljaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXN0cmNtcChhcmcsICItYSIpIHx8ICFzdHJjbXAoYXJnLCAiLS1hbGwiKSkKKwkJCXNob3dfYWxsID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UobWVyZ2VfYmFzZV91c2FnZSk7CisJCWFyZ2MtLTsgYXJndisrOworCX0KKwlpZiAoYXJnYyAhPSAzKQorCQl1c2FnZShtZXJnZV9iYXNlX3VzYWdlKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgcmV2MWtleSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsyXSwgcmV2MmtleSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzJdKTsKKwlyZXYxID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UocmV2MWtleSk7CisJcmV2MiA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHJldjJrZXkpOworCWlmICghcmV2MSB8fCAhcmV2MikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIG1lcmdlX2Jhc2UocmV2MSwgcmV2Mik7Cit9CmRpZmYgLS1naXQgYS9tZXJnZS1pbmRleC5jIGIvbWVyZ2UtaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQxOTZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVyZ2UtaW5kZXguYwpAQCAtMCwwICsxLDEzNiBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqcGdtID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd1bWVudHNbOF07CitzdGF0aWMgaW50IG9uZV9zaG90LCBxdWlldDsKK3N0YXRpYyBpbnQgZXJyOworCitzdGF0aWMgdm9pZCBydW5fcHJvZ3JhbSh2b2lkKQoreworCWludCBwaWQgPSBmb3JrKCksIHN0YXR1czsKKworCWlmIChwaWQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBmb3JrIik7CisJaWYgKCFwaWQpIHsKKwkJZXhlY2xwKHBnbSwgYXJndW1lbnRzWzBdLAorCQkJICAgIGFyZ3VtZW50c1sxXSwKKwkJCSAgICBhcmd1bWVudHNbMl0sCisJCQkgICAgYXJndW1lbnRzWzNdLAorCQkJICAgIGFyZ3VtZW50c1s0XSwKKwkJCSAgICBhcmd1bWVudHNbNV0sCisJCQkgICAgYXJndW1lbnRzWzZdLAorCQkJICAgIGFyZ3VtZW50c1s3XSwKKwkJCSAgICBOVUxMKTsKKwkJZGllKCJ1bmFibGUgdG8gZXhlY3V0ZSAnJXMnIiwgcGdtKTsKKwl9CisJaWYgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA8IDAgfHwgIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykpIHsKKwkJaWYgKG9uZV9zaG90KSB7CisJCQllcnIrKzsKKwkJfSBlbHNlIHsKKwkJCWlmICghcXVpZXQpCisJCQkJZGllKCJtZXJnZSBwcm9ncmFtIGZhaWxlZCIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtZXJnZV9lbnRyeShpbnQgcG9zLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBmb3VuZDsKKwkKKwlpZiAocG9zID49IGFjdGl2ZV9ucikKKwkJZGllKCJnaXQtbWVyZ2UtaW5kZXg6ICVzIG5vdCBpbiB0aGUgY2FjaGUiLCBwYXRoKTsKKwlhcmd1bWVudHNbMF0gPSBwZ207CisJYXJndW1lbnRzWzFdID0gIiI7CisJYXJndW1lbnRzWzJdID0gIiI7CisJYXJndW1lbnRzWzNdID0gIiI7CisJYXJndW1lbnRzWzRdID0gcGF0aDsKKwlhcmd1bWVudHNbNV0gPSAiIjsKKwlhcmd1bWVudHNbNl0gPSAiIjsKKwlhcmd1bWVudHNbN10gPSAiIjsKKwlmb3VuZCA9IDA7CisJZG8geworCQlzdGF0aWMgY2hhciBoZXhidWZbNF1bNjBdOworCQlzdGF0aWMgY2hhciBvd25idWZbNF1bNjBdOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCWludCBzdGFnZSA9IGNlX3N0YWdlKGNlKTsKKworCQlpZiAoc3RyY21wKGNlLT5uYW1lLCBwYXRoKSkKKwkJCWJyZWFrOworCQlmb3VuZCsrOworCQlzdHJjcHkoaGV4YnVmW3N0YWdlXSwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKwkJc3ByaW50Zihvd25idWZbc3RhZ2VdLCAiJW8iLCBudG9obChjZS0+Y2VfbW9kZSkgJiAoflNfSUZNVCkpOworCQlhcmd1bWVudHNbc3RhZ2VdID0gaGV4YnVmW3N0YWdlXTsKKwkJYXJndW1lbnRzW3N0YWdlICsgNF0gPSBvd25idWZbc3RhZ2VdOworCX0gd2hpbGUgKCsrcG9zIDwgYWN0aXZlX25yKTsKKwlpZiAoIWZvdW5kKQorCQlkaWUoImdpdC1tZXJnZS1pbmRleDogJXMgbm90IGluIHRoZSBjYWNoZSIsIHBhdGgpOworCXJ1bl9wcm9ncmFtKCk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIHN0cmxlbihwYXRoKSk7CisKKwkvKgorCSAqIElmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjYWNoZSBhcyBzdGFnZTAsIGl0J3MKKwkgKiBhbHJlYWR5IG1lcmdlZCBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBkby4KKwkgKi8KKwlpZiAocG9zIDwgMCkKKwkJbWVyZ2VfZW50cnkoLXBvcy0xLCBwYXRoKTsKK30KKworc3RhdGljIHZvaWQgbWVyZ2VfYWxsKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghY2Vfc3RhZ2UoY2UpKQorCQkJY29udGludWU7CisJCWkgKz0gbWVyZ2VfZW50cnkoaSwgY2UtPm5hbWUpLTE7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGZvcmNlX2ZpbGUgPSAwOworCisJaWYgKGFyZ2MgPCAzKQorCQl1c2FnZSgiZ2l0LW1lcmdlLWluZGV4IFstb10gWy1xXSA8bWVyZ2UtcHJvZ3JhbT4gKC1hIHwgPGZpbGVuYW1lPiopIik7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJcmVhZF9jYWNoZSgpOworCisJaSA9IDE7CisJaWYgKCFzdHJjbXAoYXJndltpXSwgIi1vIikpIHsKKwkJb25lX3Nob3QgPSAxOworCQlpKys7CisJfQorCWlmICghc3RyY21wKGFyZ3ZbaV0sICItcSIpKSB7CisJCXF1aWV0ID0gMTsKKwkJaSsrOworCX0KKwlwZ20gPSBhcmd2W2krK107CisJZm9yICg7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKCFmb3JjZV9maWxlICYmICphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQkJZm9yY2VfZmlsZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItYSIpKSB7CisJCQkJbWVyZ2VfYWxsKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkaWUoImdpdC1tZXJnZS1pbmRleDogdW5rbm93biBvcHRpb24gJXMiLCBhcmcpOworCQl9CisJCW1lcmdlX2ZpbGUoYXJnKTsKKwl9CisJaWYgKGVyciAmJiAhcXVpZXQpCisJCWRpZSgibWVyZ2UgcHJvZ3JhbSBmYWlsZWQiKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbWVyZ2UtdHJlZS5jIGIvbWVyZ2UtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2FhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZXJnZS10cmVlLmMKQEAgLTAsMCArMSwxNzYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorCitzdGF0aWMgY29uc3QgY2hhciBtZXJnZV90cmVlX3VzYWdlW10gPSAiZ2l0LW1lcmdlLXRyZWUgPGJhc2UtdHJlZT4gPGJyYW5jaDE+IDxicmFuY2gyPiI7CitzdGF0aWMgaW50IHJlc29sdmVfZGlyZWN0b3JpZXMgPSAxOworCitzdGF0aWMgdm9pZCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZV9kZXNjIHRbM10sIGNvbnN0IGNoYXIgKmJhc2UpOworCisvKiBBbiBlbXB0eSBlbnRyeSBuZXZlciBjb21wYXJlcyBzYW1lLCBub3QgZXZlbiB0byBhbm90aGVyIGVtcHR5IGVudHJ5ICovCitzdGF0aWMgaW50IHNhbWVfZW50cnkoc3RydWN0IG5hbWVfZW50cnkgKmEsIHN0cnVjdCBuYW1lX2VudHJ5ICpiKQoreworCXJldHVybglhLT5zaGExICYmCisJCWItPnNoYTEgJiYKKwkJIW1lbWNtcChhLT5zaGExLCBiLT5zaGExLCAyMCkgJiYKKwkJYS0+bW9kZSA9PSBiLT5tb2RlOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2hhMV90b19oZXhfemVybyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmIChzaGExKQorCQlyZXR1cm4gc2hhMV90b19oZXgoc2hhMSk7CisJcmV0dXJuICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIjsKK30KKworc3RhdGljIHZvaWQgcmVzb2x2ZShjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqYnJhbmNoMSwgc3RydWN0IG5hbWVfZW50cnkgKnJlc3VsdCkKK3sKKwkvKiBJZiBpdCdzIGFscmVhZHkgYnJhbmNoMSwgZG9uJ3QgYm90aGVyIHNob3dpbmcgaXQgKi8KKwlpZiAoIWJyYW5jaDEpCisJCXJldHVybjsKKworCXByaW50ZigiMCAlMDZvLT4lMDZvICVzLT4lcyAlcyVzXG4iLAorCQlicmFuY2gxLT5tb2RlLCByZXN1bHQtPm1vZGUsCisJCXNoYTFfdG9faGV4X3plcm8oYnJhbmNoMS0+c2hhMSksCisJCXNoYTFfdG9faGV4X3plcm8ocmVzdWx0LT5zaGExKSwKKwkJYmFzZSwgcmVzdWx0LT5wYXRoKTsKK30KKworc3RhdGljIGludCB1bnJlc29sdmVkX2RpcmVjdG9yeShjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgbmFtZV9lbnRyeSBuWzNdKQoreworCWludCBiYXNlbGVuOworCWNoYXIgKm5ld2Jhc2U7CisJc3RydWN0IG5hbWVfZW50cnkgKnA7CisJc3RydWN0IHRyZWVfZGVzYyB0WzNdOworCXZvaWQgKmJ1ZjAsICpidWYxLCAqYnVmMjsKKworCWlmICghcmVzb2x2ZV9kaXJlY3RvcmllcykKKwkJcmV0dXJuIDA7CisJcCA9IG47CisJaWYgKCFwLT5tb2RlKSB7CisJCXArKzsKKwkJaWYgKCFwLT5tb2RlKQorCQkJcCsrOworCX0KKwlpZiAoIVNfSVNESVIocC0+bW9kZSkpCisJCXJldHVybiAwOworCWJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIHAtPnBhdGhsZW4gKyAyKTsKKwltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBwLT5wYXRoLCBwLT5wYXRobGVuKTsKKwltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4gKyBwLT5wYXRobGVuLCAiLyIsIDIpOworCisJYnVmMCA9IGZpbGxfdHJlZV9kZXNjcmlwdG9yKHQrMCwgblswXS5zaGExKTsKKwlidWYxID0gZmlsbF90cmVlX2Rlc2NyaXB0b3IodCsxLCBuWzFdLnNoYTEpOworCWJ1ZjIgPSBmaWxsX3RyZWVfZGVzY3JpcHRvcih0KzIsIG5bMl0uc2hhMSk7CisJbWVyZ2VfdHJlZXModCwgbmV3YmFzZSk7CisKKwlmcmVlKGJ1ZjApOworCWZyZWUoYnVmMSk7CisJZnJlZShidWYyKTsKKwlmcmVlKG5ld2Jhc2UpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB1bnJlc29sdmVkKGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBuYW1lX2VudHJ5IG5bM10pCit7CisJaWYgKHVucmVzb2x2ZWRfZGlyZWN0b3J5KGJhc2UsIG4pKQorCQlyZXR1cm47CisJaWYgKG5bMF0uc2hhMSkKKwkJcHJpbnRmKCIxICUwNm8gJXMgJXMlc1xuIiwgblswXS5tb2RlLCBzaGExX3RvX2hleChuWzBdLnNoYTEpLCBiYXNlLCBuWzBdLnBhdGgpOworCWlmIChuWzFdLnNoYTEpCisJCXByaW50ZigiMiAlMDZvICVzICVzJXNcbiIsIG5bMV0ubW9kZSwgc2hhMV90b19oZXgoblsxXS5zaGExKSwgYmFzZSwgblsxXS5wYXRoKTsKKwlpZiAoblsyXS5zaGExKQorCQlwcmludGYoIjMgJTA2byAlcyAlcyVzXG4iLCBuWzJdLm1vZGUsIHNoYTFfdG9faGV4KG5bMl0uc2hhMSksIGJhc2UsIG5bMl0ucGF0aCk7Cit9CisKKy8qCisgKiBNZXJnZSB0d28gdHJlZXMgdG9nZXRoZXIgKHRbMV0gYW5kIHRbMl0pLCB1c2luZyBhIGNvbW1vbiBiYXNlICh0WzBdKQorICogYXMgdGhlIG9yaWdpbi4KKyAqCisgKiBUaGlzIHdhbGtzIHRoZSAoc29ydGVkKSB0cmVlcyBpbiBsb2NrLXN0ZXAsIGNoZWNraW5nIGV2ZXJ5IHBvc3NpYmxlCisgKiBuYW1lLiBOb3RlIHRoYXQgZGlyZWN0b3JpZXMgYXV0b21hdGljYWxseSBzb3J0IGRpZmZlcmVudGx5IGZyb20gb3RoZXIKKyAqIGZpbGVzIChzZWUgImJhc2VfbmFtZV9jb21wYXJlIiksIHNvIHlvdSdsbCBuZXZlciBzZWUgZmlsZS9kaXJlY3RvcnkKKyAqIGNvbmZsaWN0cywgYmVjYXVzZSB0aGV5IHdvbid0IGV2ZXIgY29tcGFyZSB0aGUgc2FtZS4KKyAqCisgKiBJT1csIGlmIGEgZGlyZWN0b3J5IGNoYW5nZXMgdG8gYSBmaWxlbmFtZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCisgKiBzZWVuIGFzIHRoZSBkaXJlY3RvcnkgZ29pbmcgYXdheSwgYW5kIHRoZSBmaWxlbmFtZSBiZWluZyBjcmVhdGVkLgorICoKKyAqIFRoaW5rIG9mIHRoaXMgYXMgYSB0aHJlZS13YXkgZGlmZi4KKyAqCisgKiBUaGUgb3V0cHV0IHdpbGwgYmUgZWl0aGVyOgorICogIC0gc3VjY2Vzc2Z1bCBtZXJnZQorICoJICIwIG1vZGUgc2hhMSBmaWxlbmFtZSIKKyAqICAgIE5PVEUgTk9URSBOT1RFISBGSVhNRSEgV2UgcmVhbGx5IHJlYWxseSBuZWVkIHRvIHdhbGsgdGhlIGluZGV4CisgKiAgICBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgdG9vIQorICoKKyAqICAtIGNvbmZsaWN0OgorICoJIjEgbW9kZSBzaGExIGZpbGVuYW1lIgorICoJIjIgbW9kZSBzaGExIGZpbGVuYW1lIgorICoJIjMgbW9kZSBzaGExIGZpbGVuYW1lIgorICogICAgd2hlcmUgbm90IGFsbCBvZiB0aGUgMS8yLzMgbGluZXMgbWF5IGV4aXN0LCBvZiBjb3Vyc2UuCisgKgorICogVGhlIHN1Y2Nlc3NmdWwgbWVyZ2UgcnVsZXMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgdGhyZWUtd2F5IG1lcmdlCisgKiBpbiBnaXQtcmVhZC10cmVlLgorICovCitzdGF0aWMgdm9pZCB0aHJlZXdheV9jYWxsYmFjayhpbnQgbiwgdW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqZW50cnksIGNvbnN0IGNoYXIgKmJhc2UpCit7CisJLyogU2FtZSBpbiBib3RoPyAqLworCWlmIChzYW1lX2VudHJ5KGVudHJ5KzEsIGVudHJ5KzIpKSB7CisJCWlmIChlbnRyeVswXS5zaGExKSB7CisJCQlyZXNvbHZlKGJhc2UsIE5VTEwsIGVudHJ5KzEpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHNhbWVfZW50cnkoZW50cnkrMCwgZW50cnkrMSkpIHsKKwkJaWYgKGVudHJ5WzJdLnNoYTEgJiYgIVNfSVNESVIoZW50cnlbMl0ubW9kZSkpIHsKKwkJCXJlc29sdmUoYmFzZSwgZW50cnkrMSwgZW50cnkrMik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoc2FtZV9lbnRyeShlbnRyeSswLCBlbnRyeSsyKSkgeworCQlpZiAoZW50cnlbMV0uc2hhMSAmJiAhU19JU0RJUihlbnRyeVsxXS5tb2RlKSkgeworCQkJcmVzb2x2ZShiYXNlLCBOVUxMLCBlbnRyeSsxKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXVucmVzb2x2ZWQoYmFzZSwgZW50cnkpOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZV9kZXNjIHRbM10sIGNvbnN0IGNoYXIgKmJhc2UpCit7CisJdHJhdmVyc2VfdHJlZXMoMywgdCwgYmFzZSwgdGhyZWV3YXlfY2FsbGJhY2spOworfQorCitzdGF0aWMgdm9pZCAqZ2V0X3RyZWVfZGVzY3JpcHRvcihzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpyZXYpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl2b2lkICpidWY7CisKKwlpZiAoZ2V0X3NoYTEocmV2LCBzaGExKSkKKwkJZGllKCJ1bmtub3duIHJldiAlcyIsIHJldik7CisJYnVmID0gZmlsbF90cmVlX2Rlc2NyaXB0b3IoZGVzYywgc2hhMSk7CisJaWYgKCFidWYpCisJCWRpZSgiJXMgaXMgbm90IGEgdHJlZSIsIHJldik7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0cmVlX2Rlc2MgdFszXTsKKwl2b2lkICpidWYxLCAqYnVmMiwgKmJ1ZjM7CisKKwlpZiAoYXJnYyA8IDQpCisJCXVzYWdlKG1lcmdlX3RyZWVfdXNhZ2UpOworCisJYnVmMSA9IGdldF90cmVlX2Rlc2NyaXB0b3IodCswLCBhcmd2WzFdKTsKKwlidWYyID0gZ2V0X3RyZWVfZGVzY3JpcHRvcih0KzEsIGFyZ3ZbMl0pOworCWJ1ZjMgPSBnZXRfdHJlZV9kZXNjcmlwdG9yKHQrMiwgYXJndlszXSk7CisJbWVyZ2VfdHJlZXModCwgIiIpOworCWZyZWUoYnVmMSk7CisJZnJlZShidWYyKTsKKwlmcmVlKGJ1ZjMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWt0YWcuYyBiL21rdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmZTUyOAotLS0gL2Rldi9udWxsCisrKyBiL21rdGFnLmMKQEAgLTAsMCArMSwxMzcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorCisvKgorICogQSBzaWduYXR1cmUgZmlsZSBoYXMgYSB2ZXJ5IHNpbXBsZSBmaXhlZCBmb3JtYXQ6IHRocmVlIGxpbmVzCisgKiBvZiAib2JqZWN0IDxzaGExPiIgKyAidHlwZSA8dHlwZW5hbWU+IiArICJ0YWcgPHRhZ25hbWU+IiwKKyAqIGZvbGxvd2VkIGJ5IHNvbWUgZnJlZS1mb3JtIHNpZ25hdHVyZSB0aGF0IGdpdCBpdHNlbGYgZG9lc24ndAorICogY2FyZSBhYm91dCwgYnV0IHRoYXQgY2FuIGJlIHZlcmlmaWVkIHdpdGggZ3BnIG9yIHNpbWlsYXIuCisgKgorICogVGhlIGZpcnN0IHRocmVlIGxpbmVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IDYzIGJ5dGVzOgorICogIm9iamVjdCA8c2hhMT5cbiIgaXMgNDggYnl0ZXMsICJ0eXBlIHRhZ1xuIiBhdCA5IGJ5dGVzIGlzIHRoZQorICogc2hvcnRlc3QgcG9zc2libGUgdHlwZS1saW5lLCBhbmQgInRhZyAuXG4iIGF0IDYgYnl0ZXMgaXMgdGhlCisgKiBzaG9ydGVzdCBzaW5nbGUtY2hhcmFjdGVyLXRhZyBsaW5lLiAKKyAqCisgKiBXZSBhbHNvIGFydGlmaWNpYWxseSBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgZnVsbCBvYmplY3QgdG8gOGtCLgorICogSnVzdCBiZWNhdXNlIEknbSBhIGxhenkgYmFzdGFyZCwgYW5kIGlmIHlvdSBjYW4ndCBmaXQgYSBzaWduYXR1cmUKKyAqIGluIHRoYXQgc2l6ZSwgeW91J3JlIGRvaW5nIHNvbWV0aGluZyB3cm9uZy4KKyAqLworCisvLyBTb21lIHJhbmRvbSBzaXplCisjZGVmaW5lIE1BWFNJWkUgKDgxOTIpCisKKy8qCisgKiBXZSByZWZ1c2UgdG8gdGFnIHNvbWV0aGluZyB3ZSBjYW4ndCB2ZXJpZnkuIEp1c3QgYmVjYXVzZS4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX3R5cGUpCit7CisJaW50IHJldCA9IC0xOworCWNoYXIgdHlwZVsxMDBdOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl2b2lkICpidWZmZXIgPSByZWFkX3NoYTFfZmlsZShzaGExLCB0eXBlLCAmc2l6ZSk7CisKKwlpZiAoYnVmZmVyKSB7CisJCWlmICghc3RyY21wKHR5cGUsIGV4cGVjdGVkX3R5cGUpKQorCQkJcmV0ID0gY2hlY2tfc2hhMV9zaWduYXR1cmUoc2hhMSwgYnVmZmVyLCBzaXplLCB0eXBlKTsKKwkJZnJlZShidWZmZXIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZlcmlmeV90YWcoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHR5cGVsZW47CisJY2hhciB0eXBlWzIwXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKm9iamVjdCwgKnR5cGVfbGluZSwgKnRhZ19saW5lLCAqdGFnZ2VyX2xpbmU7CisKKwlpZiAoc2l6ZSA8IDY0KQorCQlyZXR1cm4gZXJyb3IoIndhbm5hIGZvb2wgbWUgPyB5b3Ugb2J2aW91c2x5IGdvdCB0aGUgc2l6ZSB3cm9uZyAhXG4iKTsKKworCWJ1ZmZlcltzaXplXSA9IDA7CisKKwkvKiBWZXJpZnkgb2JqZWN0IGxpbmUgKi8KKwlvYmplY3QgPSBidWZmZXI7CisJaWYgKG1lbWNtcChvYmplY3QsICJvYmplY3QgIiwgNykpCisJCXJldHVybiBlcnJvcigiY2hhciVkOiBkb2VzIG5vdCBzdGFydCB3aXRoIFwib2JqZWN0IFwiXG4iLCAwKTsKKworCWlmIChnZXRfc2hhMV9oZXgob2JqZWN0ICsgNywgc2hhMSkpCisJCXJldHVybiBlcnJvcigiY2hhciVkOiBjb3VsZCBub3QgZ2V0IFNIQTEgaGFzaFxuIiwgNyk7CisKKwkvKiBWZXJpZnkgdHlwZSBsaW5lICovCisJdHlwZV9saW5lID0gb2JqZWN0ICsgNDg7CisJaWYgKG1lbWNtcCh0eXBlX2xpbmUgLSAxLCAiXG50eXBlICIsIDYpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIlZDogY291bGQgbm90IGZpbmQgXCJcXG50eXBlIFwiXG4iLCA0Nyk7CisKKwkvKiBWZXJpZnkgdGFnLWxpbmUgKi8KKwl0YWdfbGluZSA9IHN0cmNocih0eXBlX2xpbmUsICdcbicpOworCWlmICghdGFnX2xpbmUpCisJCXJldHVybiBlcnJvcigiY2hhciV0ZDogY291bGQgbm90IGZpbmQgbmV4dCBcIlxcblwiXG4iLCB0eXBlX2xpbmUgLSBidWZmZXIpOworCXRhZ19saW5lKys7CisJaWYgKG1lbWNtcCh0YWdfbGluZSwgInRhZyAiLCA0KSB8fCB0YWdfbGluZVs0XSA9PSAnXG4nKQorCQlyZXR1cm4gZXJyb3IoImNoYXIldGQ6IG5vIFwidGFnIFwiIGZvdW5kXG4iLCB0YWdfbGluZSAtIGJ1ZmZlcik7CisKKwkvKiBHZXQgdGhlIGFjdHVhbCB0eXBlICovCisJdHlwZWxlbiA9IHRhZ19saW5lIC0gdHlwZV9saW5lIC0gc3RybGVuKCJ0eXBlIFxuIik7CisJaWYgKHR5cGVsZW4gPj0gc2l6ZW9mKHR5cGUpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIldGQ6IHR5cGUgdG9vIGxvbmdcbiIsIHR5cGVfbGluZSs1IC0gYnVmZmVyKTsKKworCW1lbWNweSh0eXBlLCB0eXBlX2xpbmUrNSwgdHlwZWxlbik7CisJdHlwZVt0eXBlbGVuXSA9IDA7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgb2JqZWN0IG1hdGNoZXMgKi8KKwlpZiAoZ2V0X3NoYTFfaGV4KG9iamVjdCArIDcsIHNoYTEpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIlZDogY291bGQgbm90IGdldCBTSEExIGhhc2ggYnV0IHRoaXMgaXMgcmVhbGx5IG9kZCBzaW5jZSBpIGdvdCBpdCBiZWZvcmUgIVxuIiwgNyk7CisKKwlpZiAodmVyaWZ5X29iamVjdChzaGExLCB0eXBlKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyJWQ6IGNvdWxkIG5vdCB2ZXJpZnkgb2JqZWN0ICVzXG4iLCA3LCBzaGExKTsKKworCS8qIFZlcmlmeSB0aGUgdGFnLW5hbWU6IHdlIGRvbid0IGFsbG93IGNvbnRyb2wgY2hhcmFjdGVycyBvciBzcGFjZXMgaW4gaXQgKi8KKwl0YWdfbGluZSArPSA0OworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKnRhZ19saW5lKys7CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKwkJaWYgKGMgPiAnICcpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIGVycm9yKCJjaGFyJXRkOiBjb3VsZCBub3QgdmVyaWZ5IHRhZyBuYW1lXG4iLCB0YWdfbGluZSAtIGJ1ZmZlcik7CisJfQorCisJLyogVmVyaWZ5IHRoZSB0YWdnZXIgbGluZSAqLworCXRhZ2dlcl9saW5lID0gdGFnX2xpbmU7CisKKwlpZiAobWVtY21wKHRhZ2dlcl9saW5lLCAidGFnZ2VyIiwgNikgfHwgKHRhZ2dlcl9saW5lWzZdID09ICdcbicpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIldGQ6IGNvdWxkIG5vdCBmaW5kIFwidGFnZ2VyXCJcbiIsIHRhZ2dlcl9saW5lIC0gYnVmZmVyKTsKKworCS8qIFRoZSBhY3R1YWwgc3R1ZmYgYWZ0ZXJ3YXJkcyB3ZSBkb24ndCBjYXJlIGFib3V0Li4gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDQwOTY7CisJY2hhciAqYnVmZmVyID0gbWFsbG9jKHNpemUpOworCXVuc2lnbmVkIGNoYXIgcmVzdWx0X3NoYTFbMjBdOworCisJaWYgKGFyZ2MgIT0gMSkKKwkJdXNhZ2UoImNhdCA8c2lnbmF0dXJlZmlsZT4gfCBnaXQtbWt0YWciKTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCWlmIChyZWFkX3BpcGUoMCwgJmJ1ZmZlciwgJnNpemUpKSB7CisJCWZyZWUoYnVmZmVyKTsKKwkJZGllKCJjb3VsZCBub3QgcmVhZCBmcm9tIHN0ZGluIik7CisJfQorCisJLy8gVmVyaWZ5IGl0IGZvciBzb21lIGJhc2ljIHNhbml0eTogaXQgbmVlZHMgdG8gc3RhcnQgd2l0aCAib2JqZWN0IDxzaGExPlxudHlwZVxudGFnZ2VyICIKKwlpZiAodmVyaWZ5X3RhZyhidWZmZXIsIHNpemUpIDwgMCkKKwkJZGllKCJpbnZhbGlkIHRhZyBzaWduYXR1cmUgZmlsZSIpOworCisJaWYgKHdyaXRlX3NoYTFfZmlsZShidWZmZXIsIHNpemUsIHRhZ190eXBlLCByZXN1bHRfc2hhMSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSB0YWcgZmlsZSIpOworCisJZnJlZShidWZmZXIpOworCisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgocmVzdWx0X3NoYTEpKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21rdHJlZS5jIGIvbWt0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2M2NkOQotLS0gL2Rldi9udWxsCisrKyBiL21rdHJlZS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogR0lUIC0gdGhlIHN0dXBpZCBjb250ZW50IHRyYWNrZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIEp1bmlvIEMgSGFtYW5vLCAyMDA2CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdGF0aWMgc3RydWN0IHRyZWVlbnQgeworCXVuc2lnbmVkIG1vZGU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgbGVuOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsKK30gKiplbnRyaWVzOworc3RhdGljIGludCBhbGxvYywgdXNlZDsKKworc3RhdGljIHZvaWQgYXBwZW5kX3RvX3RyZWUodW5zaWduZWQgbW9kZSwgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgdHJlZWVudCAqZW50OworCWludCBsZW4gPSBzdHJsZW4ocGF0aCk7CisJaWYgKHN0cmNocihwYXRoLCAnLycpKQorCQlkaWUoInBhdGggJXMgY29udGFpbnMgc2xhc2giLCBwYXRoKTsKKworCWlmIChhbGxvYyA8PSB1c2VkKSB7CisJCWFsbG9jID0gYWxsb2NfbnIodXNlZCk7CisJCWVudHJpZXMgPSB4cmVhbGxvYyhlbnRyaWVzLCBzaXplb2YoKmVudHJpZXMpICogYWxsb2MpOworCX0KKwllbnQgPSBlbnRyaWVzW3VzZWQrK10gPSB4bWFsbG9jKHNpemVvZigqKmVudHJpZXMpICsgbGVuICsgMSk7CisJZW50LT5tb2RlID0gbW9kZTsKKwllbnQtPmxlbiA9IGxlbjsKKwltZW1jcHkoZW50LT5zaGExLCBzaGExLCAyMCk7CisJbWVtY3B5KGVudC0+bmFtZSwgcGF0aCwgbGVuKzEpOworfQorCitzdGF0aWMgaW50IGVudF9jb21wYXJlKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgdHJlZWVudCAqYSA9ICooc3RydWN0IHRyZWVlbnQgKiopYV87CisJc3RydWN0IHRyZWVlbnQgKmIgPSAqKHN0cnVjdCB0cmVlZW50ICoqKWJfOworCXJldHVybiBiYXNlX25hbWVfY29tcGFyZShhLT5uYW1lLCBhLT5sZW4sIGEtPm1vZGUsCisJCQkJIGItPm5hbWUsIGItPmxlbiwgYi0+bW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RyZWUodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJaW50IGk7CisKKwlxc29ydChlbnRyaWVzLCB1c2VkLCBzaXplb2YoKmVudHJpZXMpLCBlbnRfY29tcGFyZSk7CisJc2l6ZSA9IDEwMDsKKwlmb3IgKHNpemUgPSBpID0gMDsgaSA8IHVzZWQ7IGkrKykKKwkJc2l6ZSArPSAzMiArIGVudHJpZXNbaV0tPmxlbjsKKwlidWZmZXIgPSB4bWFsbG9jKHNpemUpOworCW9mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZDsgaSsrKSB7CisJCXN0cnVjdCB0cmVlZW50ICplbnQgPSBlbnRyaWVzW2ldOworCisJCWlmIChvZmZzZXQgKyBlbnQtPmxlbiArIDEwMCA8IHNpemUpIHsKKwkJCXNpemUgPSBhbGxvY19ucihvZmZzZXQgKyBlbnQtPmxlbiArIDEwMCk7CisJCQlidWZmZXIgPSB4cmVhbGxvYyhidWZmZXIsIHNpemUpOworCQl9CisJCW9mZnNldCArPSBzcHJpbnRmKGJ1ZmZlciArIG9mZnNldCwgIiVvICIsIGVudC0+bW9kZSk7CisJCW9mZnNldCArPSBzcHJpbnRmKGJ1ZmZlciArIG9mZnNldCwgIiVzIiwgZW50LT5uYW1lKTsKKwkJYnVmZmVyW29mZnNldCsrXSA9IDA7CisJCW1lbWNweShidWZmZXIgKyBvZmZzZXQsIGVudC0+c2hhMSwgMjApOworCQlvZmZzZXQgKz0gMjA7CisJfQorCXdyaXRlX3NoYTFfZmlsZShidWZmZXIsIG9mZnNldCwgdHJlZV90eXBlLCBzaGExKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbWt0cmVlX3VzYWdlW10gPSAibWt0cmVlIFstel0iOworCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlzdHJ1Y3Qgc3RyYnVmIHNiOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJd2hpbGUgKCgxIDwgYWMpICYmIGF2WzFdWzBdID09ICctJykgeworCQljaGFyICphcmcgPSBhdlsxXTsKKwkJaWYgKCFzdHJjbXAoIi16IiwgYXJnKSkKKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQllbHNlCisJCQl1c2FnZShta3RyZWVfdXNhZ2UpOworCQlhYy0tOworCQlhdisrOworCX0KKworCXN0cmJ1Zl9pbml0KCZzYik7CisJd2hpbGUgKDEpIHsKKwkJaW50IGxlbjsKKwkJY2hhciAqcHRyLCAqbnRyOworCQl1bnNpZ25lZCBtb2RlOworCQljaGFyIHR5cGVbMjBdOworCQljaGFyICpwYXRoOworCisJCXJlYWRfbGluZSgmc2IsIHN0ZGluLCBsaW5lX3Rlcm1pbmF0aW9uKTsKKwkJaWYgKHNiLmVvZikKKwkJCWJyZWFrOworCQlsZW4gPSBzYi5sZW47CisJCXB0ciA9IHNiLmJ1ZjsKKwkJLyogSW5wdXQgaXMgbm9uLXJlY3Vyc2l2ZSBscy10cmVlIG91dHB1dCBmb3JtYXQKKwkJICogbW9kZSBTUCB0eXBlIFNQIHNoYTEgVEFCIG5hbWUKKwkJICovCisJCW1vZGUgPSBzdHJ0b3VsKHB0ciwgJm50ciwgOCk7CisJCWlmIChwdHIgPT0gbnRyIHx8ICFudHIgfHwgKm50ciAhPSAnICcpCisJCQlkaWUoImlucHV0IGZvcm1hdCBlcnJvcjogJXMiLCBzYi5idWYpOworCQlwdHIgPSBudHIgKyAxOyAvKiB0eXBlICovCisJCW50ciA9IHN0cmNocihwdHIsICcgJyk7CisJCWlmICghbnRyIHx8IHNiLmJ1ZiArIGxlbiA8PSBudHIgKyA0MSB8fAorCQkgICAgbnRyWzQxXSAhPSAnXHQnIHx8CisJCSAgICBnZXRfc2hhMV9oZXgobnRyICsgMSwgc2hhMSkpCisJCQlkaWUoImlucHV0IGZvcm1hdCBlcnJvcjogJXMiLCBzYi5idWYpOworCQlpZiAoc2hhMV9vYmplY3RfaW5mbyhzaGExLCB0eXBlLCBOVUxMKSkKKwkJCWRpZSgib2JqZWN0ICVzIHVuYXZhaWxhYmxlIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQkqbnRyKysgPSAwOyAvKiBub3cgYXQgdGhlIGJlZ2lubmluZyBvZiBTSEExICovCisJCWlmIChzdHJjbXAocHRyLCB0eXBlKSkKKwkJCWRpZSgib2JqZWN0IHR5cGUgJXMgbWlzbWF0Y2ggKCVzKSIsIHB0ciwgdHlwZSk7CisJCW50ciArPSA0MTsgLyogYXQgdGhlIGJlZ2lubmluZyBvZiBuYW1lICovCisJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIG50clswXSA9PSAnIicpCisJCQlwYXRoID0gdW5xdW90ZV9jX3N0eWxlKG50ciwgTlVMTCk7CisJCWVsc2UKKwkJCXBhdGggPSBudHI7CisKKwkJYXBwZW5kX3RvX3RyZWUobW9kZSwgc2hhMSwgcGF0aCk7CisKKwkJaWYgKHBhdGggIT0gbnRyKQorCQkJZnJlZShwYXRoKTsKKwl9CisJd3JpdGVfdHJlZShzaGExKTsKKwlwdXRzKHNoYTFfdG9faGV4KHNoYTEpKTsKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvbW96aWxsYS1zaGExL3NoYTEuYyBiL21vemlsbGEtc2hhMS9zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NTMxZAotLS0gL2Rldi9udWxsCisrKyBiL21vemlsbGEtc2hhMS9zaGExLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIAorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyAqIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICogCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICogVGhlIE9yaWdpbmFsIENvZGUgaXMgU0hBIDE4MC0xIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoQ29tcGFjdCB2ZXJzaW9uKQorICogCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUGF1bCBLb2NoZXIgb2YKKyAqIENyeXB0b2dyYXBoeSBSZXNlYXJjaC4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgUGF1bCBLb2NoZXIgYXJlIAorICogQ29weXJpZ2h0IChDKSAxOTk1LTkgYnkgQ3J5cHRvZ3JhcGh5IFJlc2VhcmNoLCBJbmMuICBBbGwKKyAqIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogQ29udHJpYnV0b3Iocyk6CisgKgorICogICAgIFBhdWwgS29jaGVyCisgKiAKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUKKyAqICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIAorICogaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIAorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvCisgKiBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwKKyAqIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5CisgKiB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50CisgKiBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlCisgKiBHUEwuCisgKi8KKworI2luY2x1ZGUgInNoYTEuaCIKKworc3RhdGljIHZvaWQgc2hhSGFzaEJsb2NrKFNIQV9DVFggKmN0eCk7CisKK3ZvaWQgU0hBMV9Jbml0KFNIQV9DVFggKmN0eCkgeworICBpbnQgaTsKKworICBjdHgtPmxlblcgPSAwOworICBjdHgtPnNpemVIaSA9IGN0eC0+c2l6ZUxvID0gMDsKKworICAvKiBJbml0aWFsaXplIEggd2l0aCB0aGUgbWFnaWMgY29uc3RhbnRzIChzZWUgRklQUzE4MCBmb3IgY29uc3RhbnRzKQorICAgKi8KKyAgY3R4LT5IWzBdID0gMHg2NzQ1MjMwMTsKKyAgY3R4LT5IWzFdID0gMHhlZmNkYWI4OTsKKyAgY3R4LT5IWzJdID0gMHg5OGJhZGNmZTsKKyAgY3R4LT5IWzNdID0gMHgxMDMyNTQ3NjsKKyAgY3R4LT5IWzRdID0gMHhjM2QyZTFmMDsKKworICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykKKyAgICBjdHgtPldbaV0gPSAwOworfQorCisKK3ZvaWQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqY3R4LCBjb25zdCB2b2lkICpfZGF0YUluLCBpbnQgbGVuKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFJbiA9IF9kYXRhSW47CisgIGludCBpOworCisgIC8qIFJlYWQgdGhlIGRhdGEgaW50byBXIGFuZCBwcm9jZXNzIGJsb2NrcyBhcyB0aGV5IGdldCBmdWxsCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBjdHgtPldbY3R4LT5sZW5XIC8gNF0gPDw9IDg7CisgICAgY3R4LT5XW2N0eC0+bGVuVyAvIDRdIHw9ICh1bnNpZ25lZCBpbnQpZGF0YUluW2ldOworICAgIGlmICgoKytjdHgtPmxlblcpICUgNjQgPT0gMCkgeworICAgICAgc2hhSGFzaEJsb2NrKGN0eCk7CisgICAgICBjdHgtPmxlblcgPSAwOworICAgIH0KKyAgICBjdHgtPnNpemVMbyArPSA4OworICAgIGN0eC0+c2l6ZUhpICs9IChjdHgtPnNpemVMbyA8IDgpOworICB9Cit9CisKKwordm9pZCBTSEExX0ZpbmFsKHVuc2lnbmVkIGNoYXIgaGFzaG91dFsyMF0sIFNIQV9DVFggKmN0eCkgeworICB1bnNpZ25lZCBjaGFyIHBhZDB4ODAgPSAweDgwOworICB1bnNpZ25lZCBjaGFyIHBhZDB4MDAgPSAweDAwOworICB1bnNpZ25lZCBjaGFyIHBhZGxlbls4XTsKKyAgaW50IGk7CisKKyAgLyogUGFkIHdpdGggYSBiaW5hcnkgMSAoZS5nLiAweDgwKSwgdGhlbiB6ZXJvZXMsIHRoZW4gbGVuZ3RoCisgICAqLworICBwYWRsZW5bMF0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUhpID4+IDI0KSAmIDI1NSk7CisgIHBhZGxlblsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplSGkgPj4gMTYpICYgMjU1KTsKKyAgcGFkbGVuWzJdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVIaSA+PiA4KSAmIDI1NSk7CisgIHBhZGxlblszXSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplSGkgPj4gMCkgJiAyNTUpOworICBwYWRsZW5bNF0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUxvID4+IDI0KSAmIDI1NSk7CisgIHBhZGxlbls1XSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplTG8gPj4gMTYpICYgMjU1KTsKKyAgcGFkbGVuWzZdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVMbyA+PiA4KSAmIDI1NSk7CisgIHBhZGxlbls3XSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplTG8gPj4gMCkgJiAyNTUpOworICBTSEExX1VwZGF0ZShjdHgsICZwYWQweDgwLCAxKTsKKyAgd2hpbGUgKGN0eC0+bGVuVyAhPSA1NikKKyAgICBTSEExX1VwZGF0ZShjdHgsICZwYWQweDAwLCAxKTsKKyAgU0hBMV9VcGRhdGUoY3R4LCBwYWRsZW4sIDgpOworCisgIC8qIE91dHB1dCBoYXNoCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIGhhc2hvdXRbaV0gPSAodW5zaWduZWQgY2hhcikoY3R4LT5IW2kgLyA0XSA+PiAyNCk7CisgICAgY3R4LT5IW2kgLyA0XSA8PD0gODsKKyAgfQorCisgIC8qCisgICAqICBSZS1pbml0aWFsaXplIHRoZSBjb250ZXh0IChhbHNvIHplcm9pemVzIGNvbnRlbnRzKQorICAgKi8KKyAgU0hBMV9Jbml0KGN0eCk7Cit9CisKKworI2RlZmluZSBTSEFfUk9UKFgsbikgKCgoWCkgPDwgKG4pKSB8ICgoWCkgPj4gKDMyLShuKSkpKQorCitzdGF0aWMgdm9pZCBzaGFIYXNoQmxvY2soU0hBX0NUWCAqY3R4KSB7CisgIGludCB0OworICB1bnNpZ25lZCBpbnQgQSxCLEMsRCxFLFRFTVA7CisKKyAgZm9yICh0ID0gMTY7IHQgPD0gNzk7IHQrKykKKyAgICBjdHgtPldbdF0gPQorICAgICAgU0hBX1JPVChjdHgtPldbdC0zXSBeIGN0eC0+V1t0LThdIF4gY3R4LT5XW3QtMTRdIF4gY3R4LT5XW3QtMTZdLCAxKTsKKworICBBID0gY3R4LT5IWzBdOworICBCID0gY3R4LT5IWzFdOworICBDID0gY3R4LT5IWzJdOworICBEID0gY3R4LT5IWzNdOworICBFID0gY3R4LT5IWzRdOworCisgIGZvciAodCA9IDA7IHQgPD0gMTk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoKChDXkQpJkIpXkQpICAgICArIEUgKyBjdHgtPldbdF0gKyAweDVhODI3OTk5OworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKyAgZm9yICh0ID0gMjA7IHQgPD0gMzk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoQl5DXkQpICAgICAgICAgICArIEUgKyBjdHgtPldbdF0gKyAweDZlZDllYmExOworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKyAgZm9yICh0ID0gNDA7IHQgPD0gNTk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoKEImQyl8KEQmKEJ8QykpKSArIEUgKyBjdHgtPldbdF0gKyAweDhmMWJiY2RjOworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKyAgZm9yICh0ID0gNjA7IHQgPD0gNzk7IHQrKykgeworICAgIFRFTVAgPSBTSEFfUk9UKEEsNSkgKyAoQl5DXkQpICAgICAgICAgICArIEUgKyBjdHgtPldbdF0gKyAweGNhNjJjMWQ2OworICAgIEUgPSBEOyBEID0gQzsgQyA9IFNIQV9ST1QoQiwgMzApOyBCID0gQTsgQSA9IFRFTVA7CisgIH0KKworICBjdHgtPkhbMF0gKz0gQTsKKyAgY3R4LT5IWzFdICs9IEI7CisgIGN0eC0+SFsyXSArPSBDOworICBjdHgtPkhbM10gKz0gRDsKKyAgY3R4LT5IWzRdICs9IEU7Cit9CisKZGlmZiAtLWdpdCBhL21vemlsbGEtc2hhMS9zaGExLmggYi9tb3ppbGxhLXNoYTEvc2hhMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODJhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tb3ppbGxhLXNoYTEvc2hhMS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIAorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyAqIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICogCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICogVGhlIE9yaWdpbmFsIENvZGUgaXMgU0hBIDE4MC0xIEhlYWRlciBGaWxlCisgKiAKKyAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBQYXVsIEtvY2hlciBvZgorICogQ3J5cHRvZ3JhcGh5IFJlc2VhcmNoLiAgUG9ydGlvbnMgY3JlYXRlZCBieSBQYXVsIEtvY2hlciBhcmUgCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtOSBieSBDcnlwdG9ncmFwaHkgUmVzZWFyY2gsIEluYy4gIEFsbAorICogUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBDb250cmlidXRvcihzKToKKyAqCisgKiAgICAgUGF1bCBLb2NoZXIKKyAqIAorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZQorICogIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgCisgKiBpbnN0ZWFkIG9mIHRob3NlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8KKyAqIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLAorICogaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkKKyAqIHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQKKyAqIG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUKKyAqIEdQTC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBIWzVdOworICB1bnNpZ25lZCBpbnQgV1s4MF07CisgIGludCBsZW5XOworICB1bnNpZ25lZCBpbnQgc2l6ZUhpLHNpemVMbzsKK30gU0hBX0NUWDsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqY3R4KTsKK3ZvaWQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhSW4sIGludCBsZW4pOwordm9pZCBTSEExX0ZpbmFsKHVuc2lnbmVkIGNoYXIgaGFzaG91dFsyMF0sIFNIQV9DVFggKmN0eCk7CmRpZmYgLS1naXQgYS9uYW1lLXJldi5jIGIvbmFtZS1yZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQ4YTUzCi0tLSAvZGV2L251bGwKKysrIGIvbmFtZS1yZXYuYwpAQCAtMCwwICsxLDI0NiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBuYW1lX3Jldl91c2FnZVtdID0KKwkiZ2l0LW5hbWUtcmV2IFstLXRhZ3NdICggLS1hbGwgfCAtLXN0ZGluIHwgY29tbWl0aXNoIFtjb21taXRpc2guLi5dIClcbiI7CisKK3R5cGVkZWYgc3RydWN0IHJldl9uYW1lIHsKKwljb25zdCBjaGFyICp0aXBfbmFtZTsKKwlpbnQgbWVyZ2VfdHJhdmVyc2FsczsKKwlpbnQgZ2VuZXJhdGlvbjsKK30gcmV2X25hbWU7CisKK3N0YXRpYyBsb25nIGN1dG9mZiA9IExPTkdfTUFYOworCitzdGF0aWMgdm9pZCBuYW1lX3JldihzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCWNvbnN0IGNoYXIgKnRpcF9uYW1lLCBpbnQgbWVyZ2VfdHJhdmVyc2FscywgaW50IGdlbmVyYXRpb24sCisJCWludCBkZXJlZikKK3sKKwlzdHJ1Y3QgcmV2X25hbWUgKm5hbWUgPSAoc3RydWN0IHJldl9uYW1lICopY29tbWl0LT5vYmplY3QudXRpbDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJaW50IHBhcmVudF9udW1iZXIgPSAxOworCisJaWYgKCFjb21taXQtPm9iamVjdC5wYXJzZWQpCisJCXBhcnNlX2NvbW1pdChjb21taXQpOworCisJaWYgKGNvbW1pdC0+ZGF0ZSA8IGN1dG9mZikKKwkJcmV0dXJuOworCisJaWYgKGRlcmVmKSB7CisJCWNoYXIgKm5ld19uYW1lID0geG1hbGxvYyhzdHJsZW4odGlwX25hbWUpKzMpOworCQlzdHJjcHkobmV3X25hbWUsIHRpcF9uYW1lKTsKKwkJc3RyY2F0KG5ld19uYW1lLCAiXjAiKTsKKwkJdGlwX25hbWUgPSBuZXdfbmFtZTsKKworCQlpZiAoZ2VuZXJhdGlvbikKKwkJCWRpZSgiZ2VuZXJhdGlvbjogJWQsIGJ1dCBkZXJlZj8iLCBnZW5lcmF0aW9uKTsKKwl9CisKKwlpZiAobmFtZSA9PSBOVUxMKSB7CisJCW5hbWUgPSB4bWFsbG9jKHNpemVvZihyZXZfbmFtZSkpOworCQljb21taXQtPm9iamVjdC51dGlsID0gbmFtZTsKKwkJZ290byBjb3B5X2RhdGE7CisJfSBlbHNlIGlmIChuYW1lLT5tZXJnZV90cmF2ZXJzYWxzID4gbWVyZ2VfdHJhdmVyc2FscyB8fAorCQkJKG5hbWUtPm1lcmdlX3RyYXZlcnNhbHMgPT0gbWVyZ2VfdHJhdmVyc2FscyAmJgorCQkJIG5hbWUtPmdlbmVyYXRpb24gPiBnZW5lcmF0aW9uKSkgeworY29weV9kYXRhOgorCQluYW1lLT50aXBfbmFtZSA9IHRpcF9uYW1lOworCQluYW1lLT5tZXJnZV90cmF2ZXJzYWxzID0gbWVyZ2VfdHJhdmVyc2FsczsKKwkJbmFtZS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisJfSBlbHNlCisJCXJldHVybjsKKworCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJCXBhcmVudHM7CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dCwgcGFyZW50X251bWJlcisrKSB7CisJCWlmIChwYXJlbnRfbnVtYmVyID4gMSkgeworCQkJY2hhciAqbmV3X25hbWUgPSB4bWFsbG9jKHN0cmxlbih0aXBfbmFtZSkrOCk7CisKKwkJCWlmIChnZW5lcmF0aW9uID4gMCkKKwkJCQlzcHJpbnRmKG5ld19uYW1lLCAiJXN+JWReJWQiLCB0aXBfbmFtZSwKKwkJCQkJCWdlbmVyYXRpb24sIHBhcmVudF9udW1iZXIpOworCQkJZWxzZQorCQkJCXNwcmludGYobmV3X25hbWUsICIlc14lZCIsIHRpcF9uYW1lLCBwYXJlbnRfbnVtYmVyKTsKKworCQkJbmFtZV9yZXYocGFyZW50cy0+aXRlbSwgbmV3X25hbWUsCisJCQkJbWVyZ2VfdHJhdmVyc2FscyArIDEgLCAwLCAwKTsKKwkJfSBlbHNlIHsKKwkJCW5hbWVfcmV2KHBhcmVudHMtPml0ZW0sIHRpcF9uYW1lLCBtZXJnZV90cmF2ZXJzYWxzLAorCQkJCWdlbmVyYXRpb24gKyAxLCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB0YWdzX29ubHkgPSAwOworCitzdGF0aWMgaW50IG5hbWVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpbnQgZGVyZWYgPSAwOworCisJaWYgKHRhZ3Nfb25seSAmJiBzdHJuY21wKHBhdGgsICJyZWZzL3RhZ3MvIiwgMTApKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChvICYmIG8tPnR5cGUgPT0gdGFnX3R5cGUpIHsKKwkJc3RydWN0IHRhZyAqdCA9IChzdHJ1Y3QgdGFnICopIG87CisJCWlmICghdC0+dGFnZ2VkKQorCQkJYnJlYWs7IC8qIGJyb2tlbiByZXBvc2l0b3J5ICovCisJCW8gPSBwYXJzZV9vYmplY3QodC0+dGFnZ2VkLT5zaGExKTsKKwkJZGVyZWYgPSAxOworCX0KKwlpZiAobyAmJiBvLT50eXBlID09IGNvbW1pdF90eXBlKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopbzsKKworCQlpZiAoIXN0cm5jbXAocGF0aCwgInJlZnMvaGVhZHMvIiwgMTEpKQorCQkJcGF0aCA9IHBhdGggKyAxMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocGF0aCwgInJlZnMvIiwgNSkpCisJCQlwYXRoID0gcGF0aCArIDU7CisKKwkJbmFtZV9yZXYoY29tbWl0LCBzdHJkdXAocGF0aCksIDAsIDAsIGRlcmVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybnMgYSBzdGF0aWMgYnVmZmVyICovCitzdGF0aWMgY29uc3QgY2hhciogZ2V0X3Jldl9uYW1lKHN0cnVjdCBvYmplY3QgKm8pCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOworCXN0cnVjdCByZXZfbmFtZSAqbiA9IChzdHJ1Y3QgcmV2X25hbWUgKilvLT51dGlsOworCWlmICghbikKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCisJaWYgKCFuLT5nZW5lcmF0aW9uKQorCQlyZXR1cm4gbi0+dGlwX25hbWU7CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXN+JWQiLCBuLT50aXBfbmFtZSwgbi0+Z2VuZXJhdGlvbik7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBvYmplY3RfbGlzdCAqcmV2cyA9IE5VTEw7CisJc3RydWN0IG9iamVjdF9saXN0ICoqd2Fsa2VyID0gJnJldnM7CisJaW50IGFzX2lzID0gMCwgYWxsID0gMCwgdHJhbnNmb3JtX3N0ZGluID0gMDsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlpZiAoYXJnYyA8IDIpCisJCXVzYWdlKG5hbWVfcmV2X3VzYWdlKTsKKworCWZvciAoLS1hcmdjLCArK2FyZ3Y7IGFyZ2M7IC0tYXJnYywgKythcmd2KSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCXN0cnVjdCBvYmplY3QgKm87CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCQlpZiAoIWFzX2lzICYmICgqYXJndilbMF0gPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcCgqYXJndiwgIi0tIikpIHsKKwkJCQlhc19pcyA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItLXRhZ3MiKSkgeworCQkJCXRhZ3Nfb25seSA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItLWFsbCIpKSB7CisJCQkJaWYgKGFyZ2MgPiAxKQorCQkJCQlkaWUoIlNwZWNpZnkgZWl0aGVyIGEgbGlzdCwgb3IgLS1hbGwsIG5vdCBib3RoISIpOworCQkJCWFsbCA9IDE7CisJCQkJY3V0b2ZmID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi0tc3RkaW4iKSkgeworCQkJCWlmIChhcmdjID4gMSkKKwkJCQkJZGllKCJTcGVjaWZ5IGVpdGhlciBhIGxpc3QsIG9yIC0tc3RkaW4sIG5vdCBib3RoISIpOworCQkJCXRyYW5zZm9ybV9zdGRpbiA9IDE7CisJCQkJY3V0b2ZmID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKG5hbWVfcmV2X3VzYWdlKTsKKwkJfQorCisJCWlmIChnZXRfc2hhMSgqYXJndiwgc2hhMSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGdldCBzaGExIGZvciAlcy4gU2tpcHBpbmcuXG4iLAorCQkJCQkqYXJndik7CisJCQljb250aW51ZTsKKwkJfQorCisJCW8gPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KHNoYTEpLCAqYXJndiwgMCk7CisJCWlmICghbyB8fCBvLT50eXBlICE9IGNvbW1pdF90eXBlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgY29tbWl0IGZvciAlcy4gU2tpcHBpbmcuXG4iLAorCQkJCQkqYXJndik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopbzsKKworCQlpZiAoY3V0b2ZmID4gY29tbWl0LT5kYXRlKQorCQkJY3V0b2ZmID0gY29tbWl0LT5kYXRlOworCisJCW9iamVjdF9saXN0X2FwcGVuZCgoc3RydWN0IG9iamVjdCAqKWNvbW1pdCwgd2Fsa2VyKTsKKwkJKCp3YWxrZXIpLT5uYW1lID0gKmFyZ3Y7CisJCXdhbGtlciA9ICYoKCp3YWxrZXIpLT5uZXh0KTsKKwl9CisKKwlmb3JfZWFjaF9yZWYobmFtZV9yZWYpOworCisJaWYgKHRyYW5zZm9ybV9zdGRpbikgeworCQljaGFyIGJ1ZmZlclsyMDQ4XTsKKwkJY2hhciAqcCwgKnBfc3RhcnQ7CisKKwkJd2hpbGUgKCFmZW9mKHN0ZGluKSkgeworCQkJaW50IGZvcnR5ID0gMDsKKwkJCXAgPSBmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbik7CisJCQlpZiAoIXApCisJCQkJYnJlYWs7CisKKwkJCWZvciAocF9zdGFydCA9IHA7ICpwOyBwKyspIHsKKyNkZWZpbmUgaXNoZXgoeCkgKGlzZGlnaXQoKHgpKSB8fCAoKHgpID49ICdhJyAmJiAoeCkgPD0gJ2YnKSkKKwkJCQlpZiAoIWlzaGV4KCpwKSkKKwkJCQkJZm9ydHkgPSAwOworCQkJCWVsc2UgaWYgKCsrZm9ydHkgPT0gNDAgJiYKKwkJCQkJCSFpc2hleCgqKHArMSkpKSB7CisJCQkJCXVuc2lnbmVkIGNoYXIgc2hhMVs0MF07CisJCQkJCWNvbnN0IGNoYXIgKm5hbWUgPSAidW5kZWZpbmVkIjsKKwkJCQkJY2hhciBjID0gKihwKzEpOworCisJCQkJCWZvcnR5ID0gMDsKKworCQkJCQkqKHArMSkgPSAwOworCQkJCQlpZiAoIWdldF9zaGExKHAgLSAzOSwgc2hhMSkpIHsKKwkJCQkJCXN0cnVjdCBvYmplY3QgKm8gPQorCQkJCQkJCWxvb2t1cF9vYmplY3Qoc2hhMSk7CisJCQkJCQlpZiAobykKKwkJCQkJCQluYW1lID0gZ2V0X3Jldl9uYW1lKG8pOworCQkJCQl9CisJCQkJCSoocCsxKSA9IGM7CisKKwkJCQkJaWYgKCFzdHJjbXAobmFtZSwgInVuZGVmaW5lZCIpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJZndyaXRlKHBfc3RhcnQsIHAgLSBwX3N0YXJ0ICsgMSwgMSwKKwkJCQkJICAgICAgIHN0ZG91dCk7CisJCQkJCXByaW50ZigiICglcykiLCBuYW1lKTsKKwkJCQkJcF9zdGFydCA9IHAgKyAxOworCQkJCX0KKwkJCX0KKworCQkJLyogZmx1c2ggKi8KKwkJCWlmIChwX3N0YXJ0ICE9IHApCisJCQkJZndyaXRlKHBfc3RhcnQsIHAgLSBwX3N0YXJ0LCAxLCBzdGRvdXQpOworCQl9CisJfSBlbHNlIGlmIChhbGwpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG9ial9hbGxvY3M7IGkrKykKKwkJCWlmIChvYmpzW2ldKQorCQkJCXByaW50ZigiJXMgJXNcbiIsIHNoYTFfdG9faGV4KG9ianNbaV0tPnNoYTEpLAorCQkJCQkJZ2V0X3Jldl9uYW1lKG9ianNbaV0pKTsKKwl9IGVsc2UKKwkJZm9yICggOyByZXZzOyByZXZzID0gcmV2cy0+bmV4dCkKKwkJCXByaW50ZigiJXMgJXNcbiIsIHJldnMtPm5hbWUsIGdldF9yZXZfbmFtZShyZXZzLT5pdGVtKSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqZWN0LmMgYi9vYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWRjODc0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0LmMKQEAgLTAsMCArMSwyNjggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisKK3N0cnVjdCBvYmplY3QgKipvYmpzOworc3RhdGljIGludCBucl9vYmpzOworaW50IG9ial9hbGxvY3M7CisKK2ludCB0cmFja19vYmplY3RfcmVmcyA9IDA7CisKK3N0YXRpYyBpbnQgaGFzaHRhYmxlX2luZGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgaW50IGk7CisJbWVtY3B5KCZpLCBzaGExLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisJcmV0dXJuIChpbnQpKGkgJSBvYmpfYWxsb2NzKTsKK30KKworc3RhdGljIGludCBmaW5kX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCisJaWYgKCFvYmpzKQorCQlyZXR1cm4gLTE7CisKKwlpID0gaGFzaHRhYmxlX2luZGV4KHNoYTEpOworCXdoaWxlIChvYmpzW2ldKSB7CisJCWlmIChtZW1jbXAoc2hhMSwgb2Jqc1tpXS0+c2hhMSwgMjApID09IDApCisJCQlyZXR1cm4gaTsKKwkJaSsrOworCQlpZiAoaSA9PSBvYmpfYWxsb2NzKQorCQkJaSA9IDA7CisJfQorCXJldHVybiAtMSAtIGk7Cit9CisKK3N0cnVjdCBvYmplY3QgKmxvb2t1cF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcG9zID0gZmluZF9vYmplY3Qoc2hhMSk7CisJaWYgKHBvcyA+PSAwKQorCQlyZXR1cm4gb2Jqc1twb3NdOworCXJldHVybiBOVUxMOworfQorCit2b2lkIGNyZWF0ZWRfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpbnQgcG9zOworCisJb2JqLT5wYXJzZWQgPSAwOworCW1lbWNweShvYmotPnNoYTEsIHNoYTEsIDIwKTsKKwlvYmotPnR5cGUgPSBOVUxMOworCW9iai0+cmVmcyA9IE5VTEw7CisJb2JqLT51c2VkID0gMDsKKworCWlmIChvYmpfYWxsb2NzIC0gMSA8PSBucl9vYmpzICogMikgeworCQlpbnQgaSwgY291bnQgPSBvYmpfYWxsb2NzOworCQlvYmpfYWxsb2NzID0gKG9ial9hbGxvY3MgPCAzMiA/IDMyIDogMiAqIG9ial9hbGxvY3MpOworCQlvYmpzID0geHJlYWxsb2Mob2Jqcywgb2JqX2FsbG9jcyAqIHNpemVvZihzdHJ1Y3Qgb2JqZWN0ICopKTsKKwkJbWVtc2V0KG9ianMgKyBjb3VudCwgMCwgKG9ial9hbGxvY3MgLSBjb3VudCkKKwkJCQkqIHNpemVvZihzdHJ1Y3Qgb2JqZWN0ICopKTsKKwkJZm9yIChpID0gMDsgaSA8IG9ial9hbGxvY3M7IGkrKykKKwkJCWlmIChvYmpzW2ldKSB7CisJCQkJaW50IGogPSBmaW5kX29iamVjdChvYmpzW2ldLT5zaGExKTsKKwkJCQlpZiAoaiAhPSBpKSB7CisJCQkJCWogPSAtMSAtIGo7CisJCQkJCW9ianNbal0gPSBvYmpzW2ldOworCQkJCQlvYmpzW2ldID0gTlVMTDsKKwkJCQl9CisJCQl9CisJfQorCisJcG9zID0gZmluZF9vYmplY3Qoc2hhMSk7CisJaWYgKHBvcyA+PSAwKQorCQlkaWUoIkluc2VydGluZyAlcyB0d2ljZVxuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCXBvcyA9IC1wb3MtMTsKKworCW9ianNbcG9zXSA9IG9iajsKKwlucl9vYmpzKys7Cit9CisKK3N0cnVjdCBvYmplY3RfcmVmcyAqYWxsb2Nfb2JqZWN0X3JlZnModW5zaWduZWQgY291bnQpCit7CisJc3RydWN0IG9iamVjdF9yZWZzICpyZWZzOworCXNpemVfdCBzaXplID0gc2l6ZW9mKCpyZWZzKSArIGNvdW50KnNpemVvZihzdHJ1Y3Qgb2JqZWN0ICopOworCisJcmVmcyA9IHhjYWxsb2MoMSwgc2l6ZSk7CisJcmVmcy0+Y291bnQgPSBjb3VudDsKKwlyZXR1cm4gcmVmczsKK30KKworc3RhdGljIGludCBjb21wYXJlX29iamVjdF9wb2ludGVycyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBvYmplY3QgKiBjb25zdCAqcGEgPSBhOworCWNvbnN0IHN0cnVjdCBvYmplY3QgKiBjb25zdCAqcGIgPSBiOworCWlmICgqcGEgPT0gKnBiKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICgqcGEgPCAqcGIpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAxOworfQorCit2b2lkIHNldF9vYmplY3RfcmVmcyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKworCS8qIERvIG5vdCBpbnN0YWxsIGVtcHR5IGxpc3Qgb2YgcmVmZXJlbmNlcyAqLworCWlmIChyZWZzLT5jb3VudCA8IDEpIHsKKwkJZnJlZShyZWZzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNvcnQgdGhlIGxpc3QgYW5kIGZpbHRlciBvdXQgZHVwbGljYXRlcyAqLworCXFzb3J0KHJlZnMtPnJlZiwgcmVmcy0+Y291bnQsIHNpemVvZihyZWZzLT5yZWZbMF0pLAorCSAgICAgIGNvbXBhcmVfb2JqZWN0X3BvaW50ZXJzKTsKKwlmb3IgKGkgPSBqID0gMTsgaSA8IHJlZnMtPmNvdW50OyBpKyspIHsKKwkJaWYgKHJlZnMtPnJlZltpXSAhPSByZWZzLT5yZWZbaSAtIDFdKQorCQkJcmVmcy0+cmVmW2orK10gPSByZWZzLT5yZWZbaV07CisJfQorCWlmIChqIDwgcmVmcy0+Y291bnQpIHsKKwkJLyogRHVwbGljYXRlcyB3ZXJlIGZvdW5kIC0gcmVhbGxvY2F0ZSBsaXN0ICovCisJCXNpemVfdCBzaXplID0gc2l6ZW9mKCpyZWZzKSArIGoqc2l6ZW9mKHN0cnVjdCBvYmplY3QgKik7CisJCXJlZnMtPmNvdW50ID0gajsKKwkJcmVmcyA9IHhyZWFsbG9jKHJlZnMsIHNpemUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZWZzLT5jb3VudDsgaSsrKQorCQlyZWZzLT5yZWZbaV0tPnVzZWQgPSAxOworCW9iai0+cmVmcyA9IHJlZnM7Cit9CisKK3ZvaWQgbWFya19yZWFjaGFibGUoc3RydWN0IG9iamVjdCAqb2JqLCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlpZiAoIXRyYWNrX29iamVjdF9yZWZzKQorCQlkaWUoImNhbm5vdCBkbyByZWFjaGFiaWxpdHkgd2l0aCBvYmplY3QgcmVmcyB0dXJuZWQgb2ZmIik7CisJLyogSWYgd2UndmUgYmVlbiBoZXJlIGFscmVhZHksIGRvbid0IGJvdGhlciAqLworCWlmIChvYmotPmZsYWdzICYgbWFzaykKKwkJcmV0dXJuOworCW9iai0+ZmxhZ3MgfD0gbWFzazsKKwlpZiAob2JqLT5yZWZzKSB7CisJCWNvbnN0IHN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcyA9IG9iai0+cmVmczsKKwkJdW5zaWduZWQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHJlZnMtPmNvdW50OyBpKyspCisJCQltYXJrX3JlYWNoYWJsZShyZWZzLT5yZWZbaV0sIG1hc2spOworCX0KK30KKworc3RydWN0IG9iamVjdCAqbG9va3VwX29iamVjdF90eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKCF0eXBlKSB7CisJCXJldHVybiBsb29rdXBfdW5rbm93bl9vYmplY3Qoc2hhMSk7CisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpIHsKKwkJcmV0dXJuICZsb29rdXBfYmxvYihzaGExKS0+b2JqZWN0OworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0cmVlX3R5cGUpKSB7CisJCXJldHVybiAmbG9va3VwX3RyZWUoc2hhMSktPm9iamVjdDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgY29tbWl0X3R5cGUpKSB7CisJCXJldHVybiAmbG9va3VwX2NvbW1pdChzaGExKS0+b2JqZWN0OworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0YWdfdHlwZSkpIHsKKwkJcmV0dXJuICZsb29rdXBfdGFnKHNoYTEpLT5vYmplY3Q7CisJfSBlbHNlIHsKKwkJZXJyb3IoIlVua25vd24gdHlwZSAlcyIsIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3VuaW9uIGFueV9vYmplY3QgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworCXN0cnVjdCBjb21taXQgY29tbWl0OworCXN0cnVjdCB0cmVlIHRyZWU7CisJc3RydWN0IGJsb2IgYmxvYjsKKwlzdHJ1Y3QgdGFnIHRhZzsKK307CisKK3N0cnVjdCBvYmplY3QgKmxvb2t1cF91bmtub3duX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopIHsKKwkJdW5pb24gYW55X29iamVjdCAqcmV0ID0geGNhbGxvYygxLCBzaXplb2YoKnJldCkpOworCQljcmVhdGVkX29iamVjdChzaGExLCAmcmV0LT5vYmplY3QpOworCQlyZXQtPm9iamVjdC50eXBlID0gTlVMTDsKKwkJcmV0dXJuICZyZXQtPm9iamVjdDsKKwl9CisJcmV0dXJuIG9iajsKK30KKworc3RydWN0IG9iamVjdCAqcGFyc2Vfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNoYXIgdHlwZVsyMF07CisJdm9pZCAqYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJnNpemUpOworCWlmIChidWZmZXIpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqOworCQlpZiAoY2hlY2tfc2hhMV9zaWduYXR1cmUoc2hhMSwgYnVmZmVyLCBzaXplLCB0eXBlKSA8IDApCisJCQlwcmludGYoInNoYTEgbWlzbWF0Y2ggJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJaWYgKCFzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkgeworCQkJc3RydWN0IGJsb2IgKmJsb2IgPSBsb29rdXBfYmxvYihzaGExKTsKKwkJCXBhcnNlX2Jsb2JfYnVmZmVyKGJsb2IsIGJ1ZmZlciwgc2l6ZSk7CisJCQlvYmogPSAmYmxvYi0+b2JqZWN0OworCQl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgdHJlZV90eXBlKSkgeworCQkJc3RydWN0IHRyZWUgKnRyZWUgPSBsb29rdXBfdHJlZShzaGExKTsKKwkJCW9iaiA9ICZ0cmVlLT5vYmplY3Q7CisJCQlpZiAoIXRyZWUtPm9iamVjdC5wYXJzZWQpIHsKKwkJCQlwYXJzZV90cmVlX2J1ZmZlcih0cmVlLCBidWZmZXIsIHNpemUpOworCQkJCWJ1ZmZlciA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCBjb21taXRfdHlwZSkpIHsKKwkJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXQoc2hhMSk7CisJCQlwYXJzZV9jb21taXRfYnVmZmVyKGNvbW1pdCwgYnVmZmVyLCBzaXplKTsKKwkJCWlmICghY29tbWl0LT5idWZmZXIpIHsKKwkJCQljb21taXQtPmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJCQlidWZmZXIgPSBOVUxMOworCQkJfQorCQkJb2JqID0gJmNvbW1pdC0+b2JqZWN0OworCQl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgdGFnX3R5cGUpKSB7CisJCQlzdHJ1Y3QgdGFnICp0YWcgPSBsb29rdXBfdGFnKHNoYTEpOworCQkJcGFyc2VfdGFnX2J1ZmZlcih0YWcsIGJ1ZmZlciwgc2l6ZSk7CisJCQlvYmogPSAmdGFnLT5vYmplY3Q7CisJCX0gZWxzZSB7CisJCQlvYmogPSBOVUxMOworCQl9CisJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIG9iajsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBvYmplY3RfbGlzdCAqb2JqZWN0X2xpc3RfaW5zZXJ0KHN0cnVjdCBvYmplY3QgKml0ZW0sCisJCQkJICAgICAgIHN0cnVjdCBvYmplY3RfbGlzdCAqKmxpc3RfcCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKm5ld19saXN0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9saXN0KSk7CisgICAgICAgIG5ld19saXN0LT5pdGVtID0gaXRlbTsKKyAgICAgICAgbmV3X2xpc3QtPm5leHQgPSAqbGlzdF9wOworICAgICAgICAqbGlzdF9wID0gbmV3X2xpc3Q7CisgICAgICAgIHJldHVybiBuZXdfbGlzdDsKK30KKwordm9pZCBvYmplY3RfbGlzdF9hcHBlbmQoc3RydWN0IG9iamVjdCAqaXRlbSwKKwkJCXN0cnVjdCBvYmplY3RfbGlzdCAqKmxpc3RfcCkKK3sKKwl3aGlsZSAoKmxpc3RfcCkgeworCQlsaXN0X3AgPSAmKCgqbGlzdF9wKS0+bmV4dCk7CisJfQorCSpsaXN0X3AgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2xpc3QpKTsKKwkoKmxpc3RfcCktPm5leHQgPSBOVUxMOworCSgqbGlzdF9wKS0+aXRlbSA9IGl0ZW07Cit9CisKK3Vuc2lnbmVkIG9iamVjdF9saXN0X2xlbmd0aChzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QpCit7CisJdW5zaWduZWQgcmV0ID0gMDsKKwl3aGlsZSAobGlzdCkgeworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJcmV0Kys7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBvYmplY3RfbGlzdF9jb250YWlucyhzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QsIHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwl3aGlsZSAobGlzdCkgeworCQlpZiAobGlzdC0+aXRlbSA9PSBvYmopCisJCQlyZXR1cm4gMTsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb2JqZWN0LmggYi9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDhhZmJkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0LmgKQEAgLTAsMCArMSw1OCBAQAorI2lmbmRlZiBPQkpFQ1RfSAorI2RlZmluZSBPQkpFQ1RfSAorCitzdHJ1Y3Qgb2JqZWN0X2xpc3QgeworCXN0cnVjdCBvYmplY3QgKml0ZW07CisJc3RydWN0IG9iamVjdF9saXN0ICpuZXh0OworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3Qgb2JqZWN0X3JlZnMgeworCXVuc2lnbmVkIGNvdW50OworCXN0cnVjdCBvYmplY3QgKnJlZltGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RydWN0IG9iamVjdCB7CisJdW5zaWduZWQgcGFyc2VkIDogMTsKKwl1bnNpZ25lZCB1c2VkIDogMTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljb25zdCBjaGFyICp0eXBlOworCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmczsKKwl2b2lkICp1dGlsOworfTsKKworZXh0ZXJuIGludCB0cmFja19vYmplY3RfcmVmczsKK2V4dGVybiBpbnQgb2JqX2FsbG9jczsKK2V4dGVybiBzdHJ1Y3Qgb2JqZWN0ICoqb2JqczsKKworLyoqIEludGVybmFsIG9ubHkgKiovCitzdHJ1Y3Qgb2JqZWN0ICpsb29rdXBfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiogUmV0dXJucyB0aGUgb2JqZWN0LCBoYXZpbmcgbG9va2VkIGl0IHVwIGFzIGJlaW5nIHRoZSBnaXZlbiB0eXBlLiAqKi8KK3N0cnVjdCBvYmplY3QgKmxvb2t1cF9vYmplY3RfdHlwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICp0eXBlKTsKKwordm9pZCBjcmVhdGVkX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBzdHJ1Y3Qgb2JqZWN0ICpvYmopOworCisvKiogUmV0dXJucyB0aGUgb2JqZWN0LCBoYXZpbmcgcGFyc2VkIGl0IHRvIGZpbmQgb3V0IHdoYXQgaXQgaXMuICoqLworc3RydWN0IG9iamVjdCAqcGFyc2Vfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiogUmV0dXJucyB0aGUgb2JqZWN0LCB3aXRoIHBvdGVudGlhbGx5IGV4Y2VzcyBtZW1vcnkgYWxsb2NhdGVkLiAqKi8KK3N0cnVjdCBvYmplY3QgKmxvb2t1cF91bmtub3duX29iamVjdChjb25zdCB1bnNpZ25lZCAgY2hhciAqc2hhMSk7CisKK3N0cnVjdCBvYmplY3RfcmVmcyAqYWxsb2Nfb2JqZWN0X3JlZnModW5zaWduZWQgY291bnQpOwordm9pZCBzZXRfb2JqZWN0X3JlZnMoc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnMpOworCit2b2lkIG1hcmtfcmVhY2hhYmxlKHN0cnVjdCBvYmplY3QgKm9iaiwgdW5zaWduZWQgaW50IG1hc2spOworCitzdHJ1Y3Qgb2JqZWN0X2xpc3QgKm9iamVjdF9saXN0X2luc2VydChzdHJ1Y3Qgb2JqZWN0ICppdGVtLCAKKwkJCQkgICAgICAgc3RydWN0IG9iamVjdF9saXN0ICoqbGlzdF9wKTsKKwordm9pZCBvYmplY3RfbGlzdF9hcHBlbmQoc3RydWN0IG9iamVjdCAqaXRlbSwKKwkJCXN0cnVjdCBvYmplY3RfbGlzdCAqKmxpc3RfcCk7CisKK3Vuc2lnbmVkIG9iamVjdF9saXN0X2xlbmd0aChzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QpOworCitpbnQgb2JqZWN0X2xpc3RfY29udGFpbnMoc3RydWN0IG9iamVjdF9saXN0ICpsaXN0LCBzdHJ1Y3Qgb2JqZWN0ICpvYmopOworCisjZW5kaWYgLyogT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL3BhY2stY2hlY2suYyBiL3BhY2stY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTc1ODc5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFjay1jaGVjay5jCkBAIC0wLDAgKzEsMTYxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisKK3N0YXRpYyBpbnQgdmVyaWZ5X3BhY2tmaWxlKHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXhfc2l6ZSA9IHAtPmluZGV4X3NpemU7CisJdm9pZCAqaW5kZXhfYmFzZSA9IHAtPmluZGV4X2Jhc2U7CisJU0hBX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBsb25nIHBhY2tfc2l6ZSA9IHAtPnBhY2tfc2l6ZTsKKwl2b2lkICpwYWNrX2Jhc2U7CisJc3RydWN0IHBhY2tfaGVhZGVyICpoZHI7CisJaW50IG5yX29iamVjdHMsIGVyciwgaTsKKworCS8qIEhlYWRlciBjb25zaXN0ZW5jeSBjaGVjayAqLworCWhkciA9IHAtPnBhY2tfYmFzZTsKKwlpZiAoaGRyLT5oZHJfc2lnbmF0dXJlICE9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKSkKKwkJcmV0dXJuIGVycm9yKCJQYWNrZmlsZSAlcyBzaWduYXR1cmUgbWlzbWF0Y2giLCBwLT5wYWNrX25hbWUpOworCWlmICghcGFja192ZXJzaW9uX29rKGhkci0+aGRyX3ZlcnNpb24pKQorCQlyZXR1cm4gZXJyb3IoIlBhY2tmaWxlIHZlcnNpb24gJWQgdW5zdXBwb3J0ZWQiLAorCQkJICAgICBudG9obChoZHItPmhkcl92ZXJzaW9uKSk7CisJbnJfb2JqZWN0cyA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCWlmIChudW1fcGFja2VkX29iamVjdHMocCkgIT0gbnJfb2JqZWN0cykKKwkJcmV0dXJuIGVycm9yKCJQYWNrZmlsZSBjbGFpbXMgdG8gaGF2ZSAlZCBvYmplY3RzLCAiCisJCQkgICAgICJ3aGlsZSBpZHggc2l6ZSBleHBlY3RzICVkIiwgbnJfb2JqZWN0cywKKwkJCSAgICAgbnVtX3BhY2tlZF9vYmplY3RzKHApKTsKKworCVNIQTFfSW5pdCgmY3R4KTsKKwlwYWNrX2Jhc2UgPSBwLT5wYWNrX2Jhc2U7CisJU0hBMV9VcGRhdGUoJmN0eCwgcGFja19iYXNlLCBwYWNrX3NpemUgLSAyMCk7CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlpZiAobWVtY21wKHNoYTEsIHBhY2tfYmFzZSArIHBhY2tfc2l6ZSAtIDIwLCAyMCkpCisJCXJldHVybiBlcnJvcigiUGFja2ZpbGUgJXMgU0hBMSBtaXNtYXRjaCB3aXRoIGl0c2VsZiIsCisJCQkgICAgIHAtPnBhY2tfbmFtZSk7CisJaWYgKG1lbWNtcChzaGExLCBpbmRleF9iYXNlICsgaW5kZXhfc2l6ZSAtIDQwLCAyMCkpCisJCXJldHVybiBlcnJvcigiUGFja2ZpbGUgJXMgU0hBMSBtaXNtYXRjaCB3aXRoIGlkeCIsCisJCQkgICAgIHAtPnBhY2tfbmFtZSk7CisKKwkvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyByZWFjaGFibGUgZnJvbSBpZHggaXMgdmFsaWQuICBTaW5jZSB3ZQorCSAqIGhhdmUgdmVyaWZpZWQgdGhhdCBucl9vYmplY3RzIG1hdGNoZXMgYmV0d2VlbiBpZHggYW5kIHBhY2ssCisJICogd2UgZG8gbm90IGRvIHNjYW4tc3RyZWFtaW5nIGNoZWNrIG9uIHRoZSBwYWNrIGZpbGUuCisJICovCisJZm9yIChpID0gZXJyID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3QgcGFja19lbnRyeSBlOworCQl2b2lkICpkYXRhOworCQljaGFyIHR5cGVbMjBdOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJaWYgKG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgaSwgc2hhMSkpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgbnRoLXBhY2tlZC1vYmplY3QiKTsKKwkJaWYgKCFmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsICZlLCBwKSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBmaW5kLXBhY2stZW50cnktb25lIik7CisJCWRhdGEgPSB1bnBhY2tfZW50cnlfZ2VudGx5KCZlLCB0eXBlLCAmc2l6ZSk7CisJCWlmICghZGF0YSkgeworCQkJZXJyID0gZXJyb3IoImNhbm5vdCB1bnBhY2sgJXMgZnJvbSAlcyIsCisJCQkJICAgIHNoYTFfdG9faGV4KHNoYTEpLCBwLT5wYWNrX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoZWNrX3NoYTFfc2lnbmF0dXJlKHNoYTEsIGRhdGEsIHNpemUsIHR5cGUpKSB7CisJCQllcnIgPSBlcnJvcigicGFja2VkICVzIGZyb20gJXMgaXMgY29ycnVwdCIsCisJCQkJICAgIHNoYTFfdG9faGV4KHNoYTEpLCBwLT5wYWNrX25hbWUpOworCQkJZnJlZShkYXRhKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZyZWUoZGF0YSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCisjZGVmaW5lIE1BWF9DSEFJTiA0MAorCitzdGF0aWMgdm9pZCBzaG93X3BhY2tfaW5mbyhzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19oZWFkZXIgKmhkcjsKKwlpbnQgbnJfb2JqZWN0cywgaTsKKwl1bnNpZ25lZCBpbnQgY2hhaW5faGlzdG9ncmFtW01BWF9DSEFJTl07CisKKwloZHIgPSBwLT5wYWNrX2Jhc2U7CisJbnJfb2JqZWN0cyA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCW1lbXNldChjaGFpbl9oaXN0b2dyYW0sIDAsIHNpemVvZihjaGFpbl9oaXN0b2dyYW0pKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgYmFzZV9zaGExWzIwXTsKKwkJc3RydWN0IHBhY2tfZW50cnkgZTsKKwkJY2hhciB0eXBlWzIwXTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQl1bnNpZ25lZCBsb25nIHN0b3JlX3NpemU7CisJCXVuc2lnbmVkIGludCBkZWx0YV9jaGFpbl9sZW5ndGg7CisKKwkJaWYgKG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgaSwgc2hhMSkpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgbnRoLXBhY2tlZC1vYmplY3QiKTsKKwkJaWYgKCFmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsICZlLCBwKSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBmaW5kLXBhY2stZW50cnktb25lIik7CisKKwkJcGFja2VkX29iamVjdF9pbmZvX2RldGFpbCgmZSwgdHlwZSwgJnNpemUsICZzdG9yZV9zaXplLAorCQkJCQkgICZkZWx0YV9jaGFpbl9sZW5ndGgsCisJCQkJCSAgYmFzZV9zaGExKTsKKwkJcHJpbnRmKCIlcyAiLCBzaGExX3RvX2hleChzaGExKSk7CisJCWlmICghZGVsdGFfY2hhaW5fbGVuZ3RoKQorCQkJcHJpbnRmKCIlLTZzICVsdSAldVxuIiwgdHlwZSwgc2l6ZSwgZS5vZmZzZXQpOworCQllbHNlIHsKKwkJCXByaW50ZigiJS02cyAlbHUgJXUgJXUgJXNcbiIsIHR5cGUsIHNpemUsIGUub2Zmc2V0LAorCQkJICAgICAgIGRlbHRhX2NoYWluX2xlbmd0aCwgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisJCQlpZiAoZGVsdGFfY2hhaW5fbGVuZ3RoIDwgTUFYX0NIQUlOKQorCQkJCWNoYWluX2hpc3RvZ3JhbVtkZWx0YV9jaGFpbl9sZW5ndGhdKys7CisJCQllbHNlCisJCQkJY2hhaW5faGlzdG9ncmFtWzBdKys7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQUlOOyBpKyspIHsKKwkJaWYgKCFjaGFpbl9oaXN0b2dyYW1baV0pCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCJjaGFpbiBsZW5ndGggJXMgJWQ6ICVkIG9iamVjdCVzXG4iLAorCQkgICAgICAgaSA/ICI9IiA6ICI+PSIsCisJCSAgICAgICBpID8gaSA6IE1BWF9DSEFJTiwKKwkJICAgICAgIGNoYWluX2hpc3RvZ3JhbVtpXSwKKwkJICAgICAgIDEgPCBjaGFpbl9oaXN0b2dyYW1baV0gPyAicyIgOiAiIik7CisJfQorfQorCitpbnQgdmVyaWZ5X3BhY2soc3RydWN0IHBhY2tlZF9naXQgKnAsIGludCB2ZXJib3NlKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXhfc2l6ZSA9IHAtPmluZGV4X3NpemU7CisJdm9pZCAqaW5kZXhfYmFzZSA9IHAtPmluZGV4X2Jhc2U7CisJU0hBX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcmV0OworCisJcmV0ID0gMDsKKwkvKiBWZXJpZnkgU0hBMSBzdW0gb2YgdGhlIGluZGV4IGZpbGUgKi8KKwlTSEExX0luaXQoJmN0eCk7CisJU0hBMV9VcGRhdGUoJmN0eCwgaW5kZXhfYmFzZSwgaW5kZXhfc2l6ZSAtIDIwKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCWlmIChtZW1jbXAoc2hhMSwgaW5kZXhfYmFzZSArIGluZGV4X3NpemUgLSAyMCwgMjApKQorCQlyZXQgPSBlcnJvcigiUGFja2ZpbGUgaW5kZXggZm9yICVzIFNIQTEgbWlzbWF0Y2giLAorCQkJICAgIHAtPnBhY2tfbmFtZSk7CisKKwlpZiAoIXJldCkgeworCQkvKiBWZXJpZnkgcGFjayBmaWxlICovCisJCXVzZV9wYWNrZWRfZ2l0KHApOworCQlyZXQgPSB2ZXJpZnlfcGFja2ZpbGUocCk7CisJCXVudXNlX3BhY2tlZF9naXQocCk7CisJfQorCisJaWYgKHZlcmJvc2UpIHsKKwkJaWYgKHJldCkKKwkJCXByaW50ZigiJXM6IGJhZFxuIiwgcC0+cGFja19uYW1lKTsKKwkJZWxzZSB7CisJCQl1c2VfcGFja2VkX2dpdChwKTsKKwkJCXNob3dfcGFja19pbmZvKHApOworCQkJdW51c2VfcGFja2VkX2dpdChwKTsKKwkJCXByaW50ZigiJXM6IG9rXG4iLCBwLT5wYWNrX25hbWUpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3BhY2stb2JqZWN0cy5jIGIvcGFjay1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NTYwZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2stb2JqZWN0cy5jCkBAIC0wLDAgKzEsMTM0MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJjc3VtLWZpbGUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBwYWNrX3VzYWdlW10gPSAiZ2l0LXBhY2stb2JqZWN0cyBbLXFdIFstLW5vLXJldXNlLWRlbHRhXSBbLS1ub24tZW1wdHldIFstLWxvY2FsXSBbLS1pbmNyZW1lbnRhbF0gWy0td2luZG93PU5dIFstLWRlcHRoPU5dIHstLXN0ZG91dCB8IGJhc2UtbmFtZX0gPCBvYmplY3QtbGlzdCI7CisKK3N0cnVjdCBvYmplY3RfZW50cnkgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKiB1bmNvbXByZXNzZWQgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBvZmZzZXQgaW50byB0aGUgZmluYWwgcGFjayBmaWxlOworCQkJCSAqIG5vbnplcm8gaWYgYWxyZWFkeSB3cml0dGVuLgorCQkJCSAqLworCXVuc2lnbmVkIGludCBkZXB0aDsJLyogZGVsdGEgZGVwdGggKi8KKwl1bnNpZ25lZCBpbnQgZGVsdGFfbGltaXQ7CS8qIGJhc2UgYWRqdXN0bWVudCBmb3IgaW4tcGFjayBkZWx0YSAqLworCXVuc2lnbmVkIGludCBoYXNoOwkvKiBuYW1lIGhpbnQgaGFzaCAqLworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwllbnVtIG9iamVjdF90eXBlIGluX3BhY2tfdHlwZTsJLyogY291bGQgYmUgZGVsdGEgKi8KKwl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemU7CS8qIGRlbHRhIGRhdGEgc2l6ZSAodW5jb21wcmVzc2VkKSAqLworCXN0cnVjdCBvYmplY3RfZW50cnkgKmRlbHRhOwkvKiBkZWx0YSBiYXNlIG9iamVjdCAqLworCXN0cnVjdCBwYWNrZWRfZ2l0ICppbl9wYWNrOyAJLyogYWxyZWFkeSBpbiBwYWNrICovCisJdW5zaWduZWQgaW50IGluX3BhY2tfb2Zmc2V0OworCXN0cnVjdCBvYmplY3RfZW50cnkgKmRlbHRhX2NoaWxkOyAvKiBkZWxpdGlmaWVkIG9iamVjdHMgd2hvIGJhc2VzIG1lICovCisJc3RydWN0IG9iamVjdF9lbnRyeSAqZGVsdGFfc2libGluZzsgLyogb3RoZXIgZGVsdGlmaWVkIG9iamVjdHMgd2hvCisJCQkJCSAgICAgKiB1c2VzIHRoZSBzYW1lIGJhc2UgYXMgbWUKKwkJCQkJICAgICAqLworCWludCBwcmVmZXJyZWRfYmFzZTsJLyogd2UgZG8gbm90IHBhY2sgdGhpcywgYnV0IGlzIGVuY291cmFnZWQgdG8KKwkJCQkgKiBiZSB1c2VkIGFzIHRoZSBiYXNlIG9iamVjdHRvIGRlbHRhIGh1Z2UKKwkJCQkgKiBvYmplY3RzIGFnYWluc3QuCisJCQkJICovCit9OworCisvKgorICogT2JqZWN0cyB3ZSBhcmUgZ29pbmcgdG8gcGFjayBhcmUgY29sZWN0ZWQgaW4gb2JqZWN0cyBhcnJheSAoZHluYW1pY2FsbHkKKyAqIGV4cGFuZGVkKS4gIG5yX29iamVjdHMgJiBucl9hbGxvYyBjb250cm9scyB0aGlzIGFycmF5LiAgVGhleSBhcmUgc3RvcmVkCisgKiBpbiB0aGUgb3JkZXIgd2Ugc2VlIC0tIHR5cGljYWxseSByZXYtbGlzdCAtLW9iamVjdHMgb3JkZXIgdGhhdCBnaXZlcyB1cworICogbmljZSAibWluaW11bSBzZWVrIiBvcmRlci4KKyAqCisgKiBzb3J0ZWQtYnktc2hhIGFucyBzb3J0ZWQtYnktdHlwZSBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRoYXQgcG9pbnQgYXQKKyAqIGVsZW1lbnRzIGluIHRoZSBvYmplY3RzIGFycmF5LiAgVGhlIGZvcm1lciBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBwYWNrCisgKiBpbmRleCAobGlzdHMgb2JqZWN0IG5hbWVzIGluIHRoZSBhc2NlbmRpbmcgb3JkZXIgdG8gaGVscCBvZmZzZXQgbG9va3VwKSwKKyAqIGFuZCB0aGUgbGF0dGVyIGlzIHVzZWQgdG8gZ3JvdXAgc2ltaWxhciB0aGluZ3MgdG9nZXRoZXIgYnkgdHJ5X2RlbHRhKCkKKyAqIGhldXJpc3RpY3MuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgb2JqZWN0X2xpc3Rfc2hhMVsyMF07CitzdGF0aWMgaW50IG5vbl9lbXB0eSA9IDA7CitzdGF0aWMgaW50IG5vX3JldXNlX2RlbHRhID0gMDsKK3N0YXRpYyBpbnQgbG9jYWwgPSAwOworc3RhdGljIGludCBpbmNyZW1lbnRhbCA9IDA7CitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqKnNvcnRlZF9ieV9zaGEsICoqc29ydGVkX2J5X3R5cGU7CitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqZWN0cyA9IE5VTEw7CitzdGF0aWMgaW50IG5yX29iamVjdHMgPSAwLCBucl9hbGxvYyA9IDAsIG5yX3Jlc3VsdCA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqYmFzZV9uYW1lOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFja19maWxlX3NoYTFbMjBdOworc3RhdGljIGludCBwcm9ncmVzcyA9IDE7CitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHByb2dyZXNzX3VwZGF0ZSA9IDA7CisKKy8qCisgKiBUaGUgb2JqZWN0IG5hbWVzIGluIG9iamVjdHMgYXJyYXkgYXJlIGhhc2hlZCB3aXRoIHRoaXMgaGFzaHRhYmxlLAorICogdG8gaGVscCBsb29raW5nIHVwIHRoZSBlbnRyeSBieSBvYmplY3QgbmFtZS4gIEJpbmFyeSBzZWFyY2ggZnJvbQorICogc29ydGVkX2J5X3NoYSBpcyBhbHNvIHBvc3NpYmxlIGJ1dCB0aGlzIHdhcyBlYXNpZXIgdG8gY29kZSBhbmQgZmFzdGVyLgorICogVGhpcyBoYXNodGFibGUgaXMgYnVpbHQgYWZ0ZXIgYWxsIHRoZSBvYmplY3RzIGFyZSBzZWVuLgorICovCitzdGF0aWMgaW50ICpvYmplY3RfaXggPSBOVUxMOworc3RhdGljIGludCBvYmplY3RfaXhfaGFzaHN6ID0gMDsKKworLyoKKyAqIFBhY2sgaW5kZXggZm9yIGV4aXN0aW5nIHBhY2tzIGdpdmUgdXMgZWFzeSBhY2Nlc3MgdG8gdGhlIG9mZnNldHMgaW50bworICogY29ycmVzcG9uZGluZyBwYWNrIGZpbGUgd2hlcmUgZWFjaCBvYmplY3QncyBkYXRhIHN0YXJ0cywgYnV0IHRoZSBlbnRyaWVzCisgKiBkbyBub3Qgc3RvcmUgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gKHVuY29tcHJlc3NlZAorICogc2l6ZSBpcyBlYXNpbHkgYXZhaWxhYmxlIGJ5IGV4YW1pbmluZyB0aGUgcGFjayBlbnRyeSBoZWFkZXIpLiAgV2UgYnVpbGQKKyAqIGEgaGFzaHRhYmxlIG9mIGV4aXN0aW5nIHBhY2tzIChwYWNrX3JldmluZGV4KSwgYW5kIGtlZXAgcmV2ZXJzZSBpbmRleAorICogaGVyZSAtLSBwYWNrIGluZGV4IGZpbGUgaXMgc29ydGVkIGJ5IG9iamVjdCBuYW1lIG1hcHBpbmcgdG8gb2Zmc2V0OyB0aGlzCisgKiBwYWNrX3JldmluZGV4W10ucmV2aW5kZXggYXJyYXkgaXMgYW4gb3JkZXJlZCBsaXN0IG9mIG9mZnNldHMsIHNvIGlmIHlvdQorICoga25vdyB0aGUgb2Zmc2V0IG9mIGFuIG9iamVjdCwgbmV4dCBvZmZzZXQgaXMgd2hlcmUgaXRzIHBhY2tlZAorICogcmVwcmVzZW50YXRpb24gZW5kcy4KKyAqLworc3RydWN0IHBhY2tfcmV2aW5kZXggeworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXVuc2lnbmVkIGxvbmcgKnJldmluZGV4OworfSAqcGFja19yZXZpbmRleCA9IE5VTEw7CitzdGF0aWMgaW50IHBhY2tfcmV2aW5kZXhfaGFzaHN6ID0gMDsKKworLyoKKyAqIHN0YXRzCisgKi8KK3N0YXRpYyBpbnQgd3JpdHRlbiA9IDA7CitzdGF0aWMgaW50IHdyaXR0ZW5fZGVsdGEgPSAwOworc3RhdGljIGludCByZXVzZWQgPSAwOworc3RhdGljIGludCByZXVzZWRfZGVsdGEgPSAwOworCitzdGF0aWMgaW50IHBhY2tfcmV2aW5kZXhfaXgoc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJdW5zaWduZWQgbG9uZyB1aSA9ICh1bnNpZ25lZCBsb25nKXA7CisJaW50IGk7CisKKwl1aSA9IHVpIF4gKHVpID4+IDE2KTsgLyogZGVmZWF0IHN0cnVjdHVyZSBhbGlnbm1lbnQgKi8KKwlpID0gKGludCkodWkgJSBwYWNrX3JldmluZGV4X2hhc2hzeik7CisJd2hpbGUgKHBhY2tfcmV2aW5kZXhbaV0ucCkgeworCQlpZiAocGFja19yZXZpbmRleFtpXS5wID09IHApCisJCQlyZXR1cm4gaTsKKwkJaWYgKCsraSA9PSBwYWNrX3JldmluZGV4X2hhc2hzeikKKwkJCWkgPSAwOworCX0KKwlyZXR1cm4gLTEgLSBpOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3BhY2tfaXgodm9pZCkKK3sKKwlpbnQgbnVtOworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCWZvciAobnVtID0gMCwgcCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KQorCQludW0rKzsKKwlpZiAoIW51bSkKKwkJcmV0dXJuOworCXBhY2tfcmV2aW5kZXhfaGFzaHN6ID0gbnVtICogMTE7CisJcGFja19yZXZpbmRleCA9IHhjYWxsb2Moc2l6ZW9mKCpwYWNrX3JldmluZGV4KSwgcGFja19yZXZpbmRleF9oYXNoc3opOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCW51bSA9IHBhY2tfcmV2aW5kZXhfaXgocCk7CisJCW51bSA9IC0gMSAtIG51bTsKKwkJcGFja19yZXZpbmRleFtudW1dLnAgPSBwOworCX0KKwkvKiByZXZpbmRleCBlbGVtZW50cyBhcmUgbGF6aWx5IGluaXRpYWxpemVkICovCit9CisKK3N0YXRpYyBpbnQgY21wX29mZnNldChjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJdW5zaWduZWQgbG9uZyBhID0gKih1bnNpZ25lZCBsb25nICopIGFfOworCXVuc2lnbmVkIGxvbmcgYiA9ICoodW5zaWduZWQgbG9uZyAqKSBiXzsKKwlpZiAoYSA8IGIpCisJCXJldHVybiAtMTsKKwllbHNlIGlmIChhID09IGIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBPcmRlcmVkIGxpc3Qgb2Ygb2Zmc2V0cyBvZiBvYmplY3RzIGluIHRoZSBwYWNrLgorICovCitzdGF0aWMgdm9pZCBwcmVwYXJlX3BhY2tfcmV2aW5kZXgoc3RydWN0IHBhY2tfcmV2aW5kZXggKnJpeCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IHJpeC0+cDsKKwlpbnQgbnVtX2VudCA9IG51bV9wYWNrZWRfb2JqZWN0cyhwKTsKKwlpbnQgaTsKKwl2b2lkICppbmRleCA9IHAtPmluZGV4X2Jhc2UgKyAyNTY7CisKKwlyaXgtPnJldmluZGV4ID0geG1hbGxvYyhzaXplb2YodW5zaWduZWQgbG9uZykgKiAobnVtX2VudCArIDEpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudDsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBobCA9ICooKHVuc2lnbmVkIGludCAqKShpbmRleCArIDI0ICogaSkpOworCQlyaXgtPnJldmluZGV4W2ldID0gbnRvaGwoaGwpOworCX0KKwkvKiBUaGlzIGtub3dzIHRoZSBwYWNrIGZvcm1hdCAtLSB0aGUgMjAtYnl0ZSB0cmFpbGVyCisJICogZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBvYmplY3QgZGF0YS4KKwkgKi8KKwlyaXgtPnJldmluZGV4W251bV9lbnRdID0gcC0+cGFja19zaXplIC0gMjA7CisJcXNvcnQocml4LT5yZXZpbmRleCwgbnVtX2VudCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBjbXBfb2Zmc2V0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9wYWNrZWRfb2JqZWN0X3NpemUoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvZnMpCit7CisJaW50IG51bTsKKwlpbnQgbG8sIGhpOworCXN0cnVjdCBwYWNrX3JldmluZGV4ICpyaXg7CisJdW5zaWduZWQgbG9uZyAqcmV2aW5kZXg7CisJbnVtID0gcGFja19yZXZpbmRleF9peChwKTsKKwlpZiAobnVtIDwgMCkKKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogcGFjayByZXZpbmRleCB1bmluaXRpYWxpemVkIik7CisJcml4ID0gJnBhY2tfcmV2aW5kZXhbbnVtXTsKKwlpZiAoIXJpeC0+cmV2aW5kZXgpCisJCXByZXBhcmVfcGFja19yZXZpbmRleChyaXgpOworCXJldmluZGV4ID0gcml4LT5yZXZpbmRleDsKKwlsbyA9IDA7CisJaGkgPSBudW1fcGFja2VkX29iamVjdHMocCkgKyAxOworCWRvIHsKKwkJaW50IG1pID0gKGxvICsgaGkpIC8gMjsKKwkJaWYgKHJldmluZGV4W21pXSA9PSBvZnMpIHsKKwkJCXJldHVybiByZXZpbmRleFttaSsxXSAtIG9mczsKKwkJfQorCQllbHNlIGlmIChvZnMgPCByZXZpbmRleFttaV0pCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9IHdoaWxlIChsbyA8IGhpKTsKKwlkaWUoImludGVybmFsIGVycm9yOiBwYWNrIHJldmluZGV4IGNvcnJ1cHQiKTsKK30KKworc3RhdGljIHZvaWQgKmRlbHRhX2FnYWluc3Qodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgb3RoZXJzaXplLCBkZWx0YV9zaXplOworCWNoYXIgdHlwZVsxMF07CisJdm9pZCAqb3RoZXJidWYgPSByZWFkX3NoYTFfZmlsZShlbnRyeS0+ZGVsdGEtPnNoYTEsIHR5cGUsICZvdGhlcnNpemUpOworCXZvaWQgKmRlbHRhX2J1ZjsKKworCWlmICghb3RoZXJidWYpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgJXMiLCBzaGExX3RvX2hleChlbnRyeS0+ZGVsdGEtPnNoYTEpKTsKKyAgICAgICAgZGVsdGFfYnVmID0gZGlmZl9kZWx0YShvdGhlcmJ1Ziwgb3RoZXJzaXplLAorCQkJICAgICAgIGJ1Ziwgc2l6ZSwgJmRlbHRhX3NpemUsIDApOworICAgICAgICBpZiAoIWRlbHRhX2J1ZiB8fCBkZWx0YV9zaXplICE9IGVudHJ5LT5kZWx0YV9zaXplKQorICAgICAgICAJZGllKCJkZWx0YSBzaXplIGNoYW5nZWQiKTsKKyAgICAgICAgZnJlZShidWYpOworICAgICAgICBmcmVlKG90aGVyYnVmKTsKKwlyZXR1cm4gZGVsdGFfYnVmOworfQorCisvKgorICogVGhlIHBlci1vYmplY3QgaGVhZGVyIGlzIGEgcHJldHR5IGRlbnNlIHRoaW5nLCB3aGljaCBpcworICogIC0gZmlyc3QgYnl0ZTogbG93IGZvdXIgYml0cyBhcmUgInNpemUiLCB0aGVuIHRocmVlIGJpdHMgb2YgInR5cGUiLAorICogICAgYW5kIHRoZSBoaWdoIGJpdCBpcyAic2l6ZSBjb250aW51ZXMiLgorICogIC0gZWFjaCBieXRlIGFmdGVyd2FyZHM6IGxvdyBzZXZlbiBiaXRzIGFyZSBzaXplIGNvbnRpbnVhdGlvbiwKKyAqICAgIHdpdGggdGhlIGhpZ2ggYml0IGJlaW5nICJzaXplIGNvbnRpbnVlcyIKKyAqLworc3RhdGljIGludCBlbmNvZGVfaGVhZGVyKGVudW0gb2JqZWN0X3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBjaGFyICpoZHIpCit7CisJaW50IG4gPSAxOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWlmICh0eXBlIDwgT0JKX0NPTU1JVCB8fCB0eXBlID4gT0JKX0RFTFRBKQorCQlkaWUoImJhZCB0eXBlICVkIiwgdHlwZSk7CisKKwljID0gKHR5cGUgPDwgNCkgfCAoc2l6ZSAmIDE1KTsKKwlzaXplID4+PSA0OworCXdoaWxlIChzaXplKSB7CisJCSpoZHIrKyA9IGMgfCAweDgwOworCQljID0gc2l6ZSAmIDB4N2Y7CisJCXNpemUgPj49IDc7CisJCW4rKzsKKwl9CisJKmhkciA9IGM7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX29iamVjdChzdHJ1Y3Qgc2hhMWZpbGUgKmYsCisJCQkJICBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY2hhciB0eXBlWzEwXTsKKwl2b2lkICpidWY7CisJdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOworCXVuc2lnbmVkIGhkcmxlbiwgZGF0YWxlbjsKKwllbnVtIG9iamVjdF90eXBlIG9ial90eXBlOworCWludCB0b19yZXVzZSA9IDA7CisKKwlpZiAoZW50cnktPnByZWZlcnJlZF9iYXNlKQorCQlyZXR1cm4gMDsKKworCW9ial90eXBlID0gZW50cnktPnR5cGU7CisJaWYgKCEgZW50cnktPmluX3BhY2spCisJCXRvX3JldXNlID0gMDsJLyogY2FuJ3QgcmV1c2Ugd2hhdCB3ZSBkb24ndCBoYXZlICovCisJZWxzZSBpZiAob2JqX3R5cGUgPT0gT0JKX0RFTFRBKQorCQl0b19yZXVzZSA9IDE7CS8qIGNoZWNrX29iamVjdCgpIGRlY2lkZWQgaXQgZm9yIHVzICovCisJZWxzZSBpZiAob2JqX3R5cGUgIT0gZW50cnktPmluX3BhY2tfdHlwZSkKKwkJdG9fcmV1c2UgPSAwOwkvKiBwYWNrIGhhcyBkZWx0YSB3aGljaCBpcyB1bnVzYWJsZSAqLworCWVsc2UgaWYgKGVudHJ5LT5kZWx0YSkKKwkJdG9fcmV1c2UgPSAwOwkvKiB3ZSB3YW50IHRvIHBhY2sgYWZyZXNoICovCisJZWxzZQorCQl0b19yZXVzZSA9IDE7CS8qIHdlIGhhdmUgaXQgaW4tcGFjayB1bmRlbHRpZmllZCwKKwkJCQkgKiBhbmQgd2UgZG8gbm90IG5lZWQgdG8gZGVsdGlmeSBpdC4KKwkJCQkgKi8KKworCWlmICghIHRvX3JldXNlKSB7CisJCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKGVudHJ5LT5zaGExLCB0eXBlLCAmc2l6ZSk7CisJCWlmICghYnVmKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCAlcyIsIHNoYTFfdG9faGV4KGVudHJ5LT5zaGExKSk7CisJCWlmIChzaXplICE9IGVudHJ5LT5zaXplKQorCQkJZGllKCJvYmplY3QgJXMgc2l6ZSBpbmNvbnNpc3RlbmN5ICglbHUgdnMgJWx1KSIsCisJCQkgICAgc2hhMV90b19oZXgoZW50cnktPnNoYTEpLCBzaXplLCBlbnRyeS0+c2l6ZSk7CisJCWlmIChlbnRyeS0+ZGVsdGEpIHsKKwkJCWJ1ZiA9IGRlbHRhX2FnYWluc3QoYnVmLCBzaXplLCBlbnRyeSk7CisJCQlzaXplID0gZW50cnktPmRlbHRhX3NpemU7CisJCQlvYmpfdHlwZSA9IE9CSl9ERUxUQTsKKwkJfQorCQkvKgorCQkgKiBUaGUgb2JqZWN0IGhlYWRlciBpcyBhIGJ5dGUgb2YgJ3R5cGUnIGZvbGxvd2VkIGJ5IHplcm8gb3IKKwkJICogbW9yZSBieXRlcyBvZiBsZW5ndGguICBGb3IgZGVsdGFzLCB0aGUgMjAgYnl0ZXMgb2YgZGVsdGEKKwkJICogc2hhMSBmb2xsb3dzIHRoYXQuCisJCSAqLworCQloZHJsZW4gPSBlbmNvZGVfaGVhZGVyKG9ial90eXBlLCBzaXplLCBoZWFkZXIpOworCQlzaGExd3JpdGUoZiwgaGVhZGVyLCBoZHJsZW4pOworCisJCWlmIChlbnRyeS0+ZGVsdGEpIHsKKwkJCXNoYTF3cml0ZShmLCBlbnRyeS0+ZGVsdGEsIDIwKTsKKwkJCWhkcmxlbiArPSAyMDsKKwkJfQorCQlkYXRhbGVuID0gc2hhMXdyaXRlX2NvbXByZXNzZWQoZiwgYnVmLCBzaXplKTsKKwkJZnJlZShidWYpOworCX0KKwllbHNlIHsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBlbnRyeS0+aW5fcGFjazsKKwkJdXNlX3BhY2tlZF9naXQocCk7CisKKwkJZGF0YWxlbiA9IGZpbmRfcGFja2VkX29iamVjdF9zaXplKHAsIGVudHJ5LT5pbl9wYWNrX29mZnNldCk7CisJCWJ1ZiA9IHAtPnBhY2tfYmFzZSArIGVudHJ5LT5pbl9wYWNrX29mZnNldDsKKwkJc2hhMXdyaXRlKGYsIGJ1ZiwgZGF0YWxlbik7CisJCXVudXNlX3BhY2tlZF9naXQocCk7CisJCWhkcmxlbiA9IDA7IC8qIG5vdCByZWFsbHkgKi8KKwkJaWYgKG9ial90eXBlID09IE9CSl9ERUxUQSkKKwkJCXJldXNlZF9kZWx0YSsrOworCQlyZXVzZWQrKzsKKwl9CisJaWYgKG9ial90eXBlID09IE9CSl9ERUxUQSkKKwkJd3JpdHRlbl9kZWx0YSsrOworCXdyaXR0ZW4rKzsKKwlyZXR1cm4gaGRybGVuICsgZGF0YWxlbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd3JpdGVfb25lKHN0cnVjdCBzaGExZmlsZSAqZiwKKwkJCSAgICAgICBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWlmIChlLT5vZmZzZXQpCisJCS8qIG9mZnNldCBzdGFydHMgZnJvbSBoZWFkZXIgc2l6ZSBhbmQgY2Fubm90IGJlIHplcm8KKwkJICogaWYgaXQgaXMgd3JpdHRlbiBhbHJlYWR5LgorCQkgKi8KKwkJcmV0dXJuIG9mZnNldDsKKwllLT5vZmZzZXQgPSBvZmZzZXQ7CisJb2Zmc2V0ICs9IHdyaXRlX29iamVjdChmLCBlKTsKKwkvKiBpZiB3ZSBhcmUgZGVsdGlmaWVkLCB3cml0ZSBvdXQgaXRzIGJhc2Ugb2JqZWN0LiAqLworCWlmIChlLT5kZWx0YSkKKwkJb2Zmc2V0ID0gd3JpdGVfb25lKGYsIGUtPmRlbHRhLCBvZmZzZXQpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3BhY2tfZmlsZSh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBzaGExZmlsZSAqZjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgcGFja19oZWFkZXIgaGRyOworCXVuc2lnbmVkIGxhc3RfcGVyY2VudCA9IDk5OTsKKwlpbnQgZG9fcHJvZ3Jlc3MgPSAwOworCisJaWYgKCFiYXNlX25hbWUpCisJCWYgPSBzaGExZmQoMSwgIjxzdGRvdXQ+Iik7CisJZWxzZSB7CisJCWYgPSBzaGExY3JlYXRlKCIlcy0lcy4lcyIsIGJhc2VfbmFtZSwKKwkJCSAgICAgICBzaGExX3RvX2hleChvYmplY3RfbGlzdF9zaGExKSwgInBhY2siKTsKKwkJZG9fcHJvZ3Jlc3MgPSBwcm9ncmVzczsKKwl9CisJaWYgKGRvX3Byb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIldyaXRpbmcgJWQgb2JqZWN0cy5cbiIsIG5yX3Jlc3VsdCk7CisKKwloZHIuaGRyX3NpZ25hdHVyZSA9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKTsKKwloZHIuaGRyX3ZlcnNpb24gPSBodG9ubChQQUNLX1ZFUlNJT04pOworCWhkci5oZHJfZW50cmllcyA9IGh0b25sKG5yX3Jlc3VsdCk7CisJc2hhMXdyaXRlKGYsICZoZHIsIHNpemVvZihoZHIpKTsKKwlvZmZzZXQgPSBzaXplb2YoaGRyKTsKKwlpZiAoIW5yX3Jlc3VsdCkKKwkJZ290byBkb25lOworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJb2Zmc2V0ID0gd3JpdGVfb25lKGYsIG9iamVjdHMgKyBpLCBvZmZzZXQpOworCQlpZiAoZG9fcHJvZ3Jlc3MpIHsKKwkJCXVuc2lnbmVkIHBlcmNlbnQgPSB3cml0dGVuICogMTAwIC8gbnJfcmVzdWx0OworCQkJaWYgKHByb2dyZXNzX3VwZGF0ZSB8fCBwZXJjZW50ICE9IGxhc3RfcGVyY2VudCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJTR1JSUgKCV1LyV1KSBkb25lXHIiLAorCQkJCQlwZXJjZW50LCB3cml0dGVuLCBucl9yZXN1bHQpOworCQkJCXByb2dyZXNzX3VwZGF0ZSA9IDA7CisJCQkJbGFzdF9wZXJjZW50ID0gcGVyY2VudDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZG9fcHJvZ3Jlc3MpCisJCWZwdXRjKCdcbicsIHN0ZGVycik7CisgZG9uZToKKwlzaGExY2xvc2UoZiwgcGFja19maWxlX3NoYTEsIDEpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9pbmRleF9maWxlKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHNoYTFmaWxlICpmID0gc2hhMWNyZWF0ZSgiJXMtJXMuJXMiLCBiYXNlX25hbWUsCisJCQkJCXNoYTFfdG9faGV4KG9iamVjdF9saXN0X3NoYTEpLCAiaWR4Iik7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKmxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCXN0cnVjdCBvYmplY3RfZW50cnkgKipsYXN0ID0gbGlzdCArIG5yX3Jlc3VsdDsKKwl1bnNpZ25lZCBpbnQgYXJyYXlbMjU2XTsKKworCS8qCisJICogV3JpdGUgdGhlIGZpcnN0LWxldmVsIHRhYmxlICh0aGUgbGlzdCBpcyBzb3J0ZWQsCisJICogYnV0IHdlIHVzZSBhIDI1Ni1lbnRyeSBsb29rdXAgdG8gYmUgYWJsZSB0byBhdm9pZAorCSAqIGhhdmluZyB0byBkbyBlaWdodCBleHRyYSBiaW5hcnkgc2VhcmNoIGl0ZXJhdGlvbnMpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbmV4dCA9IGxpc3Q7CisJCXdoaWxlIChuZXh0IDwgbGFzdCkgeworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkgPSAqbmV4dDsKKwkJCWlmIChlbnRyeS0+c2hhMVswXSAhPSBpKQorCQkJCWJyZWFrOworCQkJbmV4dCsrOworCQl9CisJCWFycmF5W2ldID0gaHRvbmwobmV4dCAtIHNvcnRlZF9ieV9zaGEpOworCQlsaXN0ID0gbmV4dDsKKwl9CisJc2hhMXdyaXRlKGYsIGFycmF5LCAyNTYgKiBzaXplb2YoaW50KSk7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBhY3R1YWwgU0hBMSBlbnRyaWVzLi4KKwkgKi8KKwlsaXN0ID0gc29ydGVkX2J5X3NoYTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcmVzdWx0OyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkgPSAqbGlzdCsrOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gaHRvbmwoZW50cnktPm9mZnNldCk7CisJCXNoYTF3cml0ZShmLCAmb2Zmc2V0LCA0KTsKKwkJc2hhMXdyaXRlKGYsIGVudHJ5LT5zaGExLCAyMCk7CisJfQorCXNoYTF3cml0ZShmLCBwYWNrX2ZpbGVfc2hhMSwgMjApOworCXNoYTFjbG9zZShmLCBOVUxMLCAxKTsKK30KKworc3RhdGljIGludCBsb2NhdGVfb2JqZWN0X2VudHJ5X2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgdWk7CisJbWVtY3B5KCZ1aSwgc2hhMSwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCWkgPSB1aSAlIG9iamVjdF9peF9oYXNoc3o7CisJd2hpbGUgKDAgPCBvYmplY3RfaXhbaV0pIHsKKwkJaWYgKCFtZW1jbXAoc2hhMSwgb2JqZWN0c1tvYmplY3RfaXhbaV0tMV0uc2hhMSwgMjApKQorCQkJcmV0dXJuIGk7CisJCWlmICgrK2kgPT0gb2JqZWN0X2l4X2hhc2hzeikKKwkJCWkgPSAwOworCX0KKwlyZXR1cm4gLTEgLSBpOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqbG9jYXRlX29iamVjdF9lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCisJaWYgKCFvYmplY3RfaXhfaGFzaHN6KQorCQlyZXR1cm4gTlVMTDsKKworCWkgPSBsb2NhdGVfb2JqZWN0X2VudHJ5X2hhc2goc2hhMSk7CisJaWYgKDAgPD0gaSkKKwkJcmV0dXJuICZvYmplY3RzW29iamVjdF9peFtpXS0xXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVoYXNoX29iamVjdHModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZTsKKworCW9iamVjdF9peF9oYXNoc3ogPSBucl9vYmplY3RzICogMzsKKwlpZiAob2JqZWN0X2l4X2hhc2hzeiA8IDEwMjQpCisJCW9iamVjdF9peF9oYXNoc3ogPSAxMDI0OworCW9iamVjdF9peCA9IHhyZWFsbG9jKG9iamVjdF9peCwgc2l6ZW9mKGludCkgKiBvYmplY3RfaXhfaGFzaHN6KTsKKwltZW1zZXQob2JqZWN0X2l4LCAwLCBzaXplb2YoaW50KSAqIG9iamVjdF9peF9oYXNoc3opOworCWZvciAoaSA9IDAsIG9lID0gb2JqZWN0czsgaSA8IG5yX29iamVjdHM7IGkrKywgb2UrKykgeworCQlpbnQgaXggPSBsb2NhdGVfb2JqZWN0X2VudHJ5X2hhc2gob2UtPnNoYTEpOworCQlpZiAoMCA8PSBpeCkKKwkJCWNvbnRpbnVlOworCQlpeCA9IC0xIC0gaXg7CisJCW9iamVjdF9peFtpeF0gPSBpICsgMTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBuYW1lX2hhc2goY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgaGFzaCA9IDA7CisKKwkvKgorCSAqIFRoaXMgZWZmZWN0aXZlbHkganVzdCBjcmVhdGVzIGEgc29ydGFibGUgbnVtYmVyIGZyb20gdGhlCisJICogbGFzdCBzaXh0ZWVuIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMuIExhc3QgY2hhcmFjdGVycworCSAqIGNvdW50ICJtb3N0Iiwgc28gdGhpbmdzIHRoYXQgZW5kIGluICIuYyIgc29ydCB0b2dldGhlci4KKwkgKi8KKwl3aGlsZSAoKGMgPSAqbmFtZSsrKSAhPSAwKSB7CisJCWlmIChpc3NwYWNlKGMpKQorCQkJY29udGludWU7CisJCWhhc2ggPSAoaGFzaCA+PiAyKSArIChjIDw8IDI0KTsKKwl9CisJcmV0dXJuIGhhc2g7Cit9CisKK3N0YXRpYyBpbnQgYWRkX29iamVjdF9lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBoYXNoLCBpbnQgZXhjbHVkZSkKK3sKKwl1bnNpZ25lZCBpbnQgaWR4ID0gbnJfb2JqZWN0czsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwl1bnNpZ25lZCBpbnQgZm91bmRfb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqZm91bmRfcGFjayA9IE5VTEw7CisJaW50IGl4LCBzdGF0dXMgPSAwOworCisJaWYgKCFleGNsdWRlKSB7CisJCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlzdHJ1Y3QgcGFja19lbnRyeSBlOworCQkJaWYgKGZpbmRfcGFja19lbnRyeV9vbmUoc2hhMSwgJmUsIHApKSB7CisJCQkJaWYgKGluY3JlbWVudGFsKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlpZiAobG9jYWwgJiYgIXAtPnBhY2tfbG9jYWwpCisJCQkJCXJldHVybiAwOworCQkJCWlmICghZm91bmRfcGFjaykgeworCQkJCQlmb3VuZF9vZmZzZXQgPSBlLm9mZnNldDsKKwkJCQkJZm91bmRfcGFjayA9IGUucDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKChlbnRyeSA9IGxvY2F0ZV9vYmplY3RfZW50cnkoc2hhMSkpICE9IE5VTEwpCisJCWdvdG8gYWxyZWFkeV9hZGRlZDsKKworCWlmIChpZHggPj0gbnJfYWxsb2MpIHsKKwkJdW5zaWduZWQgaW50IG5lZWRlZCA9IChpZHggKyAxMDI0KSAqIDMgLyAyOworCQlvYmplY3RzID0geHJlYWxsb2Mob2JqZWN0cywgbmVlZGVkICogc2l6ZW9mKCplbnRyeSkpOworCQlucl9hbGxvYyA9IG5lZWRlZDsKKwl9CisJZW50cnkgPSBvYmplY3RzICsgaWR4OworCW5yX29iamVjdHMgPSBpZHggKyAxOworCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCW1lbWNweShlbnRyeS0+c2hhMSwgc2hhMSwgMjApOworCWVudHJ5LT5oYXNoID0gaGFzaDsKKworCWlmIChvYmplY3RfaXhfaGFzaHN6ICogMyA8PSBucl9vYmplY3RzICogNCkKKwkJcmVoYXNoX29iamVjdHMoKTsKKwllbHNlIHsKKwkJaXggPSBsb2NhdGVfb2JqZWN0X2VudHJ5X2hhc2goZW50cnktPnNoYTEpOworCQlpZiAoMCA8PSBpeCkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gb2JqZWN0IGhhc2hpbmcuIik7CisJCW9iamVjdF9peFstMSAtIGl4XSA9IGlkeCArIDE7CisJfQorCXN0YXR1cyA9IDE7CisKKyBhbHJlYWR5X2FkZGVkOgorCWlmIChwcm9ncmVzc191cGRhdGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VudGluZyBvYmplY3RzLi4uJWRcciIsIG5yX29iamVjdHMpOworCQlwcm9ncmVzc191cGRhdGUgPSAwOworCX0KKwlpZiAoZXhjbHVkZSkKKwkJZW50cnktPnByZWZlcnJlZF9iYXNlID0gMTsKKwllbHNlIHsKKwkJaWYgKGZvdW5kX3BhY2spIHsKKwkJCWVudHJ5LT5pbl9wYWNrID0gZm91bmRfcGFjazsKKwkJCWVudHJ5LT5pbl9wYWNrX29mZnNldCA9IGZvdW5kX29mZnNldDsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgcGJhc2VfdHJlZV9jYWNoZSB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcmVmOworCWludCB0ZW1wb3Jhcnk7CisJdm9pZCAqdHJlZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgdHJlZV9zaXplOworfTsKKworc3RhdGljIHN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICoocGJhc2VfdHJlZV9jYWNoZVsyNTZdKTsKK3N0YXRpYyBpbnQgcGJhc2VfdHJlZV9jYWNoZV9peChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXJldHVybiBzaGExWzBdICUgQVJSQVlfU0laRShwYmFzZV90cmVlX2NhY2hlKTsKK30KK3N0YXRpYyBpbnQgcGJhc2VfdHJlZV9jYWNoZV9peF9pbmNyKGludCBpeCkKK3sKKwlyZXR1cm4gKGl4KzEpICUgQVJSQVlfU0laRShwYmFzZV90cmVlX2NhY2hlKTsKK30KKworc3RhdGljIHN0cnVjdCBwYmFzZV90cmVlIHsKKwlzdHJ1Y3QgcGJhc2VfdHJlZSAqbmV4dDsKKwkvKiBUaGlzIGlzIGEgcGhvbnkgImNhY2hlIiBlbnRyeTsgd2UgYXJlIG5vdAorCSAqIGdvaW5nIHRvIGV2aWN0IGl0IG5vciBmaW5kIGl0IHRocm91Z2ggX2dldCgpCisJICogbWVjaGFuaXNtIC0tIHRoaXMgaXMgZm9yIHRoZSB0b3BsZXZlbCBub2RlIHRoYXQKKwkgKiB3b3VsZCBhbG1vc3QgYWx3YXlzIGNoYW5nZSB3aXRoIGFueSBjb21taXQuCisJICovCisJc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgcGNhY2hlOworfSAqcGJhc2VfdHJlZTsKKworc3RhdGljIHN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICpwYmFzZV90cmVlX2dldChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICplbnQsICpuZW50OworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNoYXIgdHlwZVsyMF07CisJaW50IG5laWdoOworCWludCBteV9peCA9IHBiYXNlX3RyZWVfY2FjaGVfaXgoc2hhMSk7CisJaW50IGF2YWlsYWJsZV9peCA9IC0xOworCisJLyogcGJhc2UtdHJlZS1jYWNoZSBhY3RzIGFzIGEgbGltaXRlZCBoYXNodGFibGUuCisJICogeW91ciBvYmplY3Qgd2lsbCBiZSBmb3VuZCBhdCB5b3VyIGluZGV4IG9yIHdpdGhpbiBhIGZldworCSAqIHNsb3RzIGFmdGVyIHRoYXQgc2xvdCBpZiBpdCBpcyBjYWNoZWQuCisJICovCisJZm9yIChuZWlnaCA9IDA7IG5laWdoIDwgODsgbmVpZ2grKykgeworCQllbnQgPSBwYmFzZV90cmVlX2NhY2hlW215X2l4XTsKKwkJaWYgKGVudCAmJiAhbWVtY21wKGVudC0+c2hhMSwgc2hhMSwgMjApKSB7CisJCQllbnQtPnJlZisrOworCQkJcmV0dXJuIGVudDsKKwkJfQorCQllbHNlIGlmICgoKGF2YWlsYWJsZV9peCA8IDApICYmICghZW50IHx8ICFlbnQtPnJlZikpIHx8CisJCQkgKCgwIDw9IGF2YWlsYWJsZV9peCkgJiYKKwkJCSAgKCFlbnQgJiYgcGJhc2VfdHJlZV9jYWNoZVthdmFpbGFibGVfaXhdKSkpCisJCQlhdmFpbGFibGVfaXggPSBteV9peDsKKwkJaWYgKCFlbnQpCisJCQlicmVhazsKKwkJbXlfaXggPSBwYmFzZV90cmVlX2NhY2hlX2l4X2luY3IobXlfaXgpOworCX0KKworCS8qIERpZCBub3QgZmluZCBvbmUuICBFaXRoZXIgd2UgZ290IGEgYm9ndXMgcmVxdWVzdCBvcgorCSAqIHdlIG5lZWQgdG8gcmVhZCBhbmQgcGVyaGFwcyBjYWNoZS4KKwkgKi8KKwlkYXRhID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJnNpemUpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN0cmNtcCh0eXBlLCB0cmVlX3R5cGUpKSB7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFdlIG5lZWQgdG8gZWl0aGVyIGNhY2hlIG9yIHJldHVybiBhIHRocm93YXdheSBjb3B5ICovCisKKwlpZiAoYXZhaWxhYmxlX2l4IDwgMCkKKwkJZW50ID0gTlVMTDsKKwllbHNlIHsKKwkJZW50ID0gcGJhc2VfdHJlZV9jYWNoZVthdmFpbGFibGVfaXhdOworCQlteV9peCA9IGF2YWlsYWJsZV9peDsKKwl9CisKKwlpZiAoIWVudCkgeworCQluZW50ID0geG1hbGxvYyhzaXplb2YoKm5lbnQpKTsKKwkJbmVudC0+dGVtcG9yYXJ5ID0gKGF2YWlsYWJsZV9peCA8IDApOworCX0KKwllbHNlIHsKKwkJLyogZXZpY3QgYW5kIHJldXNlICovCisJCWZyZWUoZW50LT50cmVlX2RhdGEpOworCQluZW50ID0gZW50OworCX0KKwltZW1jcHkobmVudC0+c2hhMSwgc2hhMSwgMjApOworCW5lbnQtPnRyZWVfZGF0YSA9IGRhdGE7CisJbmVudC0+dHJlZV9zaXplID0gc2l6ZTsKKwluZW50LT5yZWYgPSAxOworCWlmICghbmVudC0+dGVtcG9yYXJ5KQorCQlwYmFzZV90cmVlX2NhY2hlW215X2l4XSA9IG5lbnQ7CisJcmV0dXJuIG5lbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHBiYXNlX3RyZWVfcHV0KHN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICpjYWNoZSkKK3sKKwlpZiAoIWNhY2hlLT50ZW1wb3JhcnkpIHsKKwkJY2FjaGUtPnJlZi0tOworCQlyZXR1cm47CisJfQorCWZyZWUoY2FjaGUtPnRyZWVfZGF0YSk7CisJZnJlZShjYWNoZSk7Cit9CisKK3N0YXRpYyBpbnQgbmFtZV9jbXBfbGVuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgbmFtZVtpXSAmJiBuYW1lW2ldICE9ICdcbicgJiYgbmFtZVtpXSAhPSAnLyc7IGkrKykKKwkJOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBhZGRfcGJhc2Vfb2JqZWN0KHN0cnVjdCB0cmVlX2Rlc2MgKnRyZWUsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGludCBjbXBsZW4sCisJCQkgICAgIGNvbnN0IGNoYXIgKmZ1bGxuYW1lKQoreworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCisJd2hpbGUgKHRyZWVfZW50cnkodHJlZSwmZW50cnkpKSB7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJY2hhciB0eXBlWzIwXTsKKworCQlpZiAoZW50cnkucGF0aGxlbiAhPSBjbXBsZW4gfHwKKwkJICAgIG1lbWNtcChlbnRyeS5wYXRoLCBuYW1lLCBjbXBsZW4pIHx8CisJCSAgICAhaGFzX3NoYTFfZmlsZShlbnRyeS5zaGExKSB8fAorCQkgICAgc2hhMV9vYmplY3RfaW5mbyhlbnRyeS5zaGExLCB0eXBlLCAmc2l6ZSkpCisJCQljb250aW51ZTsKKwkJaWYgKG5hbWVbY21wbGVuXSAhPSAnLycpIHsKKwkJCXVuc2lnbmVkIGhhc2ggPSBuYW1lX2hhc2goZnVsbG5hbWUpOworCQkJYWRkX29iamVjdF9lbnRyeShlbnRyeS5zaGExLCBoYXNoLCAxKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXN0cmNtcCh0eXBlLCB0cmVlX3R5cGUpKSB7CisJCQlzdHJ1Y3QgdHJlZV9kZXNjIHN1YjsKKwkJCXN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICp0cmVlOworCQkJY29uc3QgY2hhciAqZG93biA9IG5hbWUrY21wbGVuKzE7CisJCQlpbnQgZG93bmxlbiA9IG5hbWVfY21wX2xlbihkb3duKTsKKworCQkJdHJlZSA9IHBiYXNlX3RyZWVfZ2V0KGVudHJ5LnNoYTEpOworCQkJaWYgKCF0cmVlKQorCQkJCXJldHVybjsKKwkJCXN1Yi5idWYgPSB0cmVlLT50cmVlX2RhdGE7CisJCQlzdWIuc2l6ZSA9IHRyZWUtPnRyZWVfc2l6ZTsKKworCQkJYWRkX3BiYXNlX29iamVjdCgmc3ViLCBkb3duLCBkb3dubGVuLCBmdWxsbmFtZSk7CisJCQlwYmFzZV90cmVlX3B1dCh0cmVlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkICpkb25lX3BiYXNlX3BhdGhzOworc3RhdGljIGludCBkb25lX3BiYXNlX3BhdGhzX251bTsKK3N0YXRpYyBpbnQgZG9uZV9wYmFzZV9wYXRoc19hbGxvYzsKK3N0YXRpYyBpbnQgZG9uZV9wYmFzZV9wYXRoX3Bvcyh1bnNpZ25lZCBoYXNoKQoreworCWludCBsbyA9IDA7CisJaW50IGhpID0gZG9uZV9wYmFzZV9wYXRoc19udW07CisJd2hpbGUgKGxvIDwgaGkpIHsKKwkJaW50IG1pID0gKGhpICsgbG8pIC8gMjsKKwkJaWYgKGRvbmVfcGJhc2VfcGF0aHNbbWldID09IGhhc2gpCisJCQlyZXR1cm4gbWk7CisJCWlmIChkb25lX3BiYXNlX3BhdGhzW21pXSA8IGhhc2gpCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9CisJcmV0dXJuIC1sby0xOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BiYXNlX3BhdGgodW5zaWduZWQgaGFzaCkKK3sKKwlpbnQgcG9zID0gKCFkb25lX3BiYXNlX3BhdGhzKSA/IC0xIDogZG9uZV9wYmFzZV9wYXRoX3BvcyhoYXNoKTsKKwlpZiAoMCA8PSBwb3MpCisJCXJldHVybiAxOworCXBvcyA9IC1wb3MgLSAxOworCWlmIChkb25lX3BiYXNlX3BhdGhzX2FsbG9jIDw9IGRvbmVfcGJhc2VfcGF0aHNfbnVtKSB7CisJCWRvbmVfcGJhc2VfcGF0aHNfYWxsb2MgPSBhbGxvY19ucihkb25lX3BiYXNlX3BhdGhzX2FsbG9jKTsKKwkJZG9uZV9wYmFzZV9wYXRocyA9IHhyZWFsbG9jKGRvbmVfcGJhc2VfcGF0aHMsCisJCQkJCSAgICBkb25lX3BiYXNlX3BhdGhzX2FsbG9jICoKKwkJCQkJICAgIHNpemVvZih1bnNpZ25lZCkpOworCX0KKwlkb25lX3BiYXNlX3BhdGhzX251bSsrOworCWlmIChwb3MgPCBkb25lX3BiYXNlX3BhdGhzX251bSkKKwkJbWVtbW92ZShkb25lX3BiYXNlX3BhdGhzICsgcG9zICsgMSwKKwkJCWRvbmVfcGJhc2VfcGF0aHMgKyBwb3MsCisJCQkoZG9uZV9wYmFzZV9wYXRoc19udW0gLSBwb3MgLSAxKSAqIHNpemVvZih1bnNpZ25lZCkpOworCWRvbmVfcGJhc2VfcGF0aHNbcG9zXSA9IGhhc2g7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wcmVmZXJyZWRfYmFzZV9vYmplY3QoY2hhciAqbmFtZSwgdW5zaWduZWQgaGFzaCkKK3sKKwlzdHJ1Y3QgcGJhc2VfdHJlZSAqaXQ7CisJaW50IGNtcGxlbiA9IG5hbWVfY21wX2xlbihuYW1lKTsKKworCWlmIChjaGVja19wYmFzZV9wYXRoKGhhc2gpKQorCQlyZXR1cm47CisKKwlmb3IgKGl0ID0gcGJhc2VfdHJlZTsgaXQ7IGl0ID0gaXQtPm5leHQpIHsKKwkJaWYgKGNtcGxlbiA9PSAwKSB7CisJCQloYXNoID0gbmFtZV9oYXNoKCIiKTsKKwkJCWFkZF9vYmplY3RfZW50cnkoaXQtPnBjYWNoZS5zaGExLCBoYXNoLCAxKTsKKwkJfQorCQllbHNlIHsKKwkJCXN0cnVjdCB0cmVlX2Rlc2MgdHJlZTsKKwkJCXRyZWUuYnVmID0gaXQtPnBjYWNoZS50cmVlX2RhdGE7CisJCQl0cmVlLnNpemUgPSBpdC0+cGNhY2hlLnRyZWVfc2l6ZTsKKwkJCWFkZF9wYmFzZV9vYmplY3QoJnRyZWUsIG5hbWUsIGNtcGxlbiwgbmFtZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wcmVmZXJyZWRfYmFzZSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYmFzZV90cmVlICppdDsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHRyZWVfc2hhMVsyMF07CisKKwlkYXRhID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgdHJlZV90eXBlLCAmc2l6ZSwgdHJlZV9zaGExKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCWZvciAoaXQgPSBwYmFzZV90cmVlOyBpdDsgaXQgPSBpdC0+bmV4dCkgeworCQlpZiAoIW1lbWNtcChpdC0+cGNhY2hlLnNoYTEsIHRyZWVfc2hhMSwgMjApKSB7CisJCQlmcmVlKGRhdGEpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaXQgPSB4Y2FsbG9jKDEsIHNpemVvZigqaXQpKTsKKwlpdC0+bmV4dCA9IHBiYXNlX3RyZWU7CisJcGJhc2VfdHJlZSA9IGl0OworCisJbWVtY3B5KGl0LT5wY2FjaGUuc2hhMSwgdHJlZV9zaGExLCAyMCk7CisJaXQtPnBjYWNoZS50cmVlX2RhdGEgPSBkYXRhOworCWl0LT5wY2FjaGUudHJlZV9zaXplID0gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0KHN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5KQoreworCWNoYXIgdHlwZVsyMF07CisKKwlpZiAoZW50cnktPmluX3BhY2sgJiYgIWVudHJ5LT5wcmVmZXJyZWRfYmFzZSkgeworCQl1bnNpZ25lZCBjaGFyIGJhc2VbMjBdOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKmJhc2VfZW50cnk7CisKKwkJLyogV2Ugd2FudCBpbl9wYWNrX3R5cGUgZXZlbiBpZiB3ZSBkbyBub3QgcmV1c2UgZGVsdGEuCisJCSAqIFRoZXJlIGlzIG5vIHBvaW50IG5vdCByZXVzaW5nIG5vbi1kZWx0YSByZXByZXNlbnRhdGlvbnMuCisJCSAqLworCQljaGVja19yZXVzZV9wYWNrX2RlbHRhKGVudHJ5LT5pbl9wYWNrLAorCQkJCSAgICAgICBlbnRyeS0+aW5fcGFja19vZmZzZXQsCisJCQkJICAgICAgIGJhc2UsICZzaXplLAorCQkJCSAgICAgICAmZW50cnktPmluX3BhY2tfdHlwZSk7CisKKwkJLyogQ2hlY2sgaWYgaXQgaXMgZGVsdGEsIGFuZCB0aGUgYmFzZSBpcyBhbHNvIGFuIG9iamVjdAorCQkgKiB3ZSBhcmUgZ29pbmcgdG8gcGFjay4gIElmIHNvIHdlIHdpbGwgcmV1c2UgdGhlIGV4aXN0aW5nCisJCSAqIGRlbHRhLgorCQkgKi8KKwkJaWYgKCFub19yZXVzZV9kZWx0YSAmJgorCQkgICAgZW50cnktPmluX3BhY2tfdHlwZSA9PSBPQkpfREVMVEEgJiYKKwkJICAgIChiYXNlX2VudHJ5ID0gbG9jYXRlX29iamVjdF9lbnRyeShiYXNlKSkgJiYKKwkJICAgICghYmFzZV9lbnRyeS0+cHJlZmVycmVkX2Jhc2UpKSB7CisKKwkJCS8qIERlcHRoIHZhbHVlIGRvZXMgbm90IG1hdHRlciAtIGZpbmRfZGVsdGFzKCkKKwkJCSAqIHdpbGwgbmV2ZXIgY29uc2lkZXIgcmV1c2VkIGRlbHRhIGFzIHRoZQorCQkJICogYmFzZSBvYmplY3QgdG8gZGVsdGlmeSBvdGhlciBvYmplY3RzCisJCQkgKiBhZ2FpbnN0LCBpbiBvcmRlciB0byBhdm9pZCBjaXJjdWxhciBkZWx0YXMuCisJCQkgKi8KKworCQkJLyogdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGRlbHRhIGRhdGEgKi8KKwkJCWVudHJ5LT5zaXplID0gZW50cnktPmRlbHRhX3NpemUgPSBzaXplOworCQkJZW50cnktPmRlbHRhID0gYmFzZV9lbnRyeTsKKwkJCWVudHJ5LT50eXBlID0gT0JKX0RFTFRBOworCisJCQllbnRyeS0+ZGVsdGFfc2libGluZyA9IGJhc2VfZW50cnktPmRlbHRhX2NoaWxkOworCQkJYmFzZV9lbnRyeS0+ZGVsdGFfY2hpbGQgPSBlbnRyeTsKKworCQkJcmV0dXJuOworCQl9CisJCS8qIE90aGVyd2lzZSB3ZSB3b3VsZCBkbyB0aGUgdXN1YWwgKi8KKwl9CisKKwlpZiAoc2hhMV9vYmplY3RfaW5mbyhlbnRyeS0+c2hhMSwgdHlwZSwgJmVudHJ5LT5zaXplKSkKKwkJZGllKCJ1bmFibGUgdG8gZ2V0IHR5cGUgb2Ygb2JqZWN0ICVzIiwKKwkJICAgIHNoYTFfdG9faGV4KGVudHJ5LT5zaGExKSk7CisKKwlpZiAoIXN0cmNtcCh0eXBlLCBjb21taXRfdHlwZSkpIHsKKwkJZW50cnktPnR5cGUgPSBPQkpfQ09NTUlUOworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0cmVlX3R5cGUpKSB7CisJCWVudHJ5LT50eXBlID0gT0JKX1RSRUU7CisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpIHsKKwkJZW50cnktPnR5cGUgPSBPQkpfQkxPQjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgdGFnX3R5cGUpKSB7CisJCWVudHJ5LT50eXBlID0gT0JKX1RBRzsKKwl9IGVsc2UKKwkJZGllKCJ1bmFibGUgdG8gcGFjayBvYmplY3QgJXMgb2YgdHlwZSAlcyIsCisJCSAgICBzaGExX3RvX2hleChlbnRyeS0+c2hhMSksIHR5cGUpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNoZWNrX2RlbHRhX2xpbWl0KHN0cnVjdCBvYmplY3RfZW50cnkgKm1lLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpjaGlsZCA9IG1lLT5kZWx0YV9jaGlsZDsKKwl1bnNpZ25lZCBpbnQgbSA9IG47CisJd2hpbGUgKGNoaWxkKSB7CisJCXVuc2lnbmVkIGludCBjID0gY2hlY2tfZGVsdGFfbGltaXQoY2hpbGQsIG4gKyAxKTsKKwkJaWYgKG0gPCBjKQorCQkJbSA9IGM7CisJCWNoaWxkID0gY2hpbGQtPmRlbHRhX3NpYmxpbmc7CisJfQorCXJldHVybiBtOworfQorCitzdGF0aWMgdm9pZCBnZXRfb2JqZWN0X2RldGFpbHModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeTsKKworCXByZXBhcmVfcGFja19peCgpOworCWZvciAoaSA9IDAsIGVudHJ5ID0gb2JqZWN0czsgaSA8IG5yX29iamVjdHM7IGkrKywgZW50cnkrKykKKwkJY2hlY2tfb2JqZWN0KGVudHJ5KTsKKworCWlmIChucl9vYmplY3RzID09IG5yX3Jlc3VsdCkgeworCQkvKgorCQkgKiBEZXB0aCBvZiBvYmplY3RzIHRoYXQgZGVwZW5kIG9uIHRoZSBlbnRyeSAtLSB0aGlzCisJCSAqIGlzIHN1YnRyYWN0ZWQgZnJvbSBkZXB0aC1tYXggdG8gYnJlYWsgdG9vIGRlZXAKKwkJICogZGVsdGEgY2hhaW4gYmVjYXVzZSBvZiBkZWx0YSBkYXRhIHJldXNpbmcuCisJCSAqIEhvd2V2ZXIsIHdlIGxvb3NlbiB0aGlzIHJlc3RyaWN0aW9uIHdoZW4gd2Uga25vdyB3ZQorCQkgKiBhcmUgY3JlYXRpbmcgYSB0aGluIHBhY2sgLS0gaXQgd2lsbCBoYXZlIHRvIGJlCisJCSAqIGV4cGFuZGVkIG9uIHRoZSBvdGhlciBlbmQgYW55d2F5LCBzbyBkbyBub3QKKwkJICogYXJ0aWZpY2lhbGx5IGN1dCB0aGUgZGVsdGEgY2hhaW4gYW5kIGxldCBpdCBnbyBhcworCQkgKiBkZWVwIGFzIGl0IHdhbnRzLgorCQkgKi8KKwkJZm9yIChpID0gMCwgZW50cnkgPSBvYmplY3RzOyBpIDwgbnJfb2JqZWN0czsgaSsrLCBlbnRyeSsrKQorCQkJaWYgKCFlbnRyeS0+ZGVsdGEgJiYgZW50cnktPmRlbHRhX2NoaWxkKQorCQkJCWVudHJ5LT5kZWx0YV9saW1pdCA9CisJCQkJCWNoZWNrX2RlbHRhX2xpbWl0KGVudHJ5LCAxKTsKKwl9Cit9CisKK3R5cGVkZWYgaW50ICgqZW50cnlfc29ydF90KShjb25zdCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICosIGNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKik7CisKK3N0YXRpYyBlbnRyeV9zb3J0X3QgY3VycmVudF9zb3J0OworCitzdGF0aWMgaW50IHNvcnRfY29tcGFyYXRvcihjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqYSA9ICooc3RydWN0IG9iamVjdF9lbnRyeSAqKilfYTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpiID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9iOworCXJldHVybiBjdXJyZW50X3NvcnQoYSxiKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKipjcmVhdGVfc29ydGVkX2xpc3QoZW50cnlfc29ydF90IHNvcnQpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKmxpc3QgPSB4bWFsbG9jKG5yX29iamVjdHMgKiBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSAqKSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKQorCQlsaXN0W2ldID0gb2JqZWN0cyArIGk7CisJY3VycmVudF9zb3J0ID0gc29ydDsKKwlxc29ydChsaXN0LCBucl9vYmplY3RzLCBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSAqKSwgc29ydF9jb21wYXJhdG9yKTsKKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIGludCBzaGExX3NvcnQoY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYSwgY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYikKK3sKKwlyZXR1cm4gbWVtY21wKGEtPnNoYTEsIGItPnNoYTEsIDIwKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKipjcmVhdGVfZmluYWxfb2JqZWN0X2xpc3Qodm9pZCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGlzdDsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IG5yX3Jlc3VsdCA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspCisJCWlmICghb2JqZWN0c1tpXS5wcmVmZXJyZWRfYmFzZSkKKwkJCW5yX3Jlc3VsdCsrOworCWxpc3QgPSB4bWFsbG9jKG5yX3Jlc3VsdCAqIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICopKTsKKwlmb3IgKGkgPSBqID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQlpZiAoIW9iamVjdHNbaV0ucHJlZmVycmVkX2Jhc2UpCisJCQlsaXN0W2orK10gPSBvYmplY3RzICsgaTsKKwl9CisJY3VycmVudF9zb3J0ID0gc2hhMV9zb3J0OworCXFzb3J0KGxpc3QsIG5yX3Jlc3VsdCwgc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkgKiksIHNvcnRfY29tcGFyYXRvcik7CisJcmV0dXJuIGxpc3Q7Cit9CisKK3N0YXRpYyBpbnQgdHlwZV9zaXplX3NvcnQoY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYSwgY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYikKK3sKKwlpZiAoYS0+dHlwZSA8IGItPnR5cGUpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+dHlwZSA+IGItPnR5cGUpCisJCXJldHVybiAxOworCWlmIChhLT5oYXNoIDwgYi0+aGFzaCkKKwkJcmV0dXJuIC0xOworCWlmIChhLT5oYXNoID4gYi0+aGFzaCkKKwkJcmV0dXJuIDE7CisJaWYgKGEtPnByZWZlcnJlZF9iYXNlIDwgYi0+cHJlZmVycmVkX2Jhc2UpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+cHJlZmVycmVkX2Jhc2UgPiBiLT5wcmVmZXJyZWRfYmFzZSkKKwkJcmV0dXJuIDE7CisJaWYgKGEtPnNpemUgPCBiLT5zaXplKQorCQlyZXR1cm4gLTE7CisJaWYgKGEtPnNpemUgPiBiLT5zaXplKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gYSA8IGIgPyAtMSA6IChhID4gYik7Cit9CisKK3N0cnVjdCB1bnBhY2tlZCB7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnk7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4OworfTsKKworLyoKKyAqIFdlIHNlYXJjaCBmb3IgZGVsdGFzIF9iYWNrd2FyZHNfIGluIGEgbGlzdCBzb3J0ZWQgYnkgdHlwZSBhbmQKKyAqIGJ5IHNpemUsIHNvIHRoYXQgd2Ugc2VlIHByb2dyZXNzaXZlbHkgc21hbGxlciBhbmQgc21hbGxlciBmaWxlcy4KKyAqIFRoYXQncyBiZWNhdXNlIHdlIHByZWZlciBkZWx0YXMgdG8gYmUgZnJvbSB0aGUgYmlnZ2VyIGZpbGUKKyAqIHRvIHRoZSBzbWFsbGVyIC0gZGVsZXRlcyBhcmUgcG90ZW50aWFsbHkgY2hlYXBlciwgYnV0IHBlcmhhcHMKKyAqIG1vcmUgaW1wb3J0YW50bHksIHRoZSBiaWdnZXIgZmlsZSBpcyBsaWtlbHkgdGhlIG1vcmUgcmVjZW50CisgKiBvbmUuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X2RlbHRhKHN0cnVjdCB1bnBhY2tlZCAqdHJnLCBzdHJ1Y3QgdW5wYWNrZWQgKnNyYywKKwkJICAgICBzdHJ1Y3QgZGVsdGFfaW5kZXggKnNyY19pbmRleCwgdW5zaWduZWQgbWF4X2RlcHRoKQoreworCXN0cnVjdCBvYmplY3RfZW50cnkgKnRyZ19lbnRyeSA9IHRyZy0+ZW50cnk7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqc3JjX2VudHJ5ID0gc3JjLT5lbnRyeTsKKwl1bnNpZ25lZCBsb25nIHNpemUsIHNyY19zaXplLCBkZWx0YV9zaXplLCBzaXplZGlmZiwgbWF4X3NpemU7CisJdm9pZCAqZGVsdGFfYnVmOworCisJLyogRG9uJ3QgYm90aGVyIGRvaW5nIGRpZmZzIGJldHdlZW4gZGlmZmVyZW50IHR5cGVzICovCisJaWYgKHRyZ19lbnRyeS0+dHlwZSAhPSBzcmNfZW50cnktPnR5cGUpCisJCXJldHVybiAtMTsKKworCS8qIFdlIGRvIG5vdCBjb21wdXRlIGRlbHRhIHRvICpjcmVhdGUqIG9iamVjdHMgd2UgYXJlIG5vdAorCSAqIGdvaW5nIHRvIHBhY2suCisJICovCisJaWYgKHRyZ19lbnRyeS0+cHJlZmVycmVkX2Jhc2UpCisJCXJldHVybiAtMTsKKworCS8qCisJICogSWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIGF0IHBhY2sgZWRnZSwgdGFrZSB0aGUgZGVwdGggdGhlCisJICogb2JqZWN0cyB0aGF0IGRlcGVuZCBvbiB0aGUgY3VycmVudCBvYmplY3QgaW50byBhY2NvdW50IC0tCisJICogb3RoZXJ3aXNlIHRoZXkgd291bGQgYmVjb21lIHRvbyBkZWVwLgorCSAqLworCWlmICh0cmdfZW50cnktPmRlbHRhX2NoaWxkKSB7CisJCWlmIChtYXhfZGVwdGggPD0gdHJnX2VudHJ5LT5kZWx0YV9saW1pdCkKKwkJCXJldHVybiAwOworCQltYXhfZGVwdGggLT0gdHJnX2VudHJ5LT5kZWx0YV9saW1pdDsKKwl9CisJaWYgKHNyY19lbnRyeS0+ZGVwdGggPj0gbWF4X2RlcHRoKQorCQlyZXR1cm4gMDsKKworCS8qIE5vdyBzb21lIHNpemUgZmlsdGVyaW5nIGhldXJpc3RpY3MuICovCisJc2l6ZSA9IHRyZ19lbnRyeS0+c2l6ZTsKKwltYXhfc2l6ZSA9IHNpemUvMiAtIDIwOworCW1heF9zaXplID0gbWF4X3NpemUgKiAobWF4X2RlcHRoIC0gc3JjX2VudHJ5LT5kZXB0aCkgLyBtYXhfZGVwdGg7CisJaWYgKG1heF9zaXplID09IDApCisJCXJldHVybiAwOworCWlmICh0cmdfZW50cnktPmRlbHRhICYmIHRyZ19lbnRyeS0+ZGVsdGFfc2l6ZSA8PSBtYXhfc2l6ZSkKKwkJbWF4X3NpemUgPSB0cmdfZW50cnktPmRlbHRhX3NpemUtMTsKKwlzcmNfc2l6ZSA9IHNyY19lbnRyeS0+c2l6ZTsKKwlzaXplZGlmZiA9IHNyY19zaXplIDwgc2l6ZSA/IHNpemUgLSBzcmNfc2l6ZSA6IDA7CisJaWYgKHNpemVkaWZmID49IG1heF9zaXplKQorCQlyZXR1cm4gMDsKKworCWRlbHRhX2J1ZiA9IGNyZWF0ZV9kZWx0YShzcmNfaW5kZXgsIHRyZy0+ZGF0YSwgc2l6ZSwgJmRlbHRhX3NpemUsIG1heF9zaXplKTsKKwlpZiAoIWRlbHRhX2J1ZikKKwkJcmV0dXJuIDA7CisKKwl0cmdfZW50cnktPmRlbHRhID0gc3JjX2VudHJ5OworCXRyZ19lbnRyeS0+ZGVsdGFfc2l6ZSA9IGRlbHRhX3NpemU7CisJdHJnX2VudHJ5LT5kZXB0aCA9IHNyY19lbnRyeS0+ZGVwdGggKyAxOworCWZyZWUoZGVsdGFfYnVmKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3Jlc3NfaW50ZXJ2YWwoaW50IHNpZ251bSkKK3sKKwlwcm9ncmVzc191cGRhdGUgPSAxOworfQorCitzdGF0aWMgdm9pZCBmaW5kX2RlbHRhcyhzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGlzdCwgaW50IHdpbmRvdywgaW50IGRlcHRoKQoreworCWludCBpLCBpZHg7CisJdW5zaWduZWQgaW50IGFycmF5X3NpemUgPSB3aW5kb3cgKiBzaXplb2Yoc3RydWN0IHVucGFja2VkKTsKKwlzdHJ1Y3QgdW5wYWNrZWQgKmFycmF5ID0geG1hbGxvYyhhcnJheV9zaXplKTsKKwl1bnNpZ25lZCBwcm9jZXNzZWQgPSAwOworCXVuc2lnbmVkIGxhc3RfcGVyY2VudCA9IDk5OTsKKworCW1lbXNldChhcnJheSwgMCwgYXJyYXlfc2l6ZSk7CisJaSA9IG5yX29iamVjdHM7CisJaWR4ID0gMDsKKwlpZiAocHJvZ3Jlc3MpCisJCWZwcmludGYoc3RkZXJyLCAiRGVsdGlmeWluZyAlZCBvYmplY3RzLlxuIiwgbnJfcmVzdWx0KTsKKworCXdoaWxlICgtLWkgPj0gMCkgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9IGxpc3RbaV07CisJCXN0cnVjdCB1bnBhY2tlZCAqbiA9IGFycmF5ICsgaWR4OworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCWNoYXIgdHlwZVsxMF07CisJCWludCBqOworCisJCWlmICghZW50cnktPnByZWZlcnJlZF9iYXNlKQorCQkJcHJvY2Vzc2VkKys7CisKKwkJaWYgKHByb2dyZXNzKSB7CisJCQl1bnNpZ25lZCBwZXJjZW50ID0gcHJvY2Vzc2VkICogMTAwIC8gbnJfcmVzdWx0OworCQkJaWYgKHBlcmNlbnQgIT0gbGFzdF9wZXJjZW50IHx8IHByb2dyZXNzX3VwZGF0ZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJTR1JSUgKCV1LyV1KSBkb25lXHIiLAorCQkJCQlwZXJjZW50LCBwcm9jZXNzZWQsIG5yX3Jlc3VsdCk7CisJCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMDsKKwkJCQlsYXN0X3BlcmNlbnQgPSBwZXJjZW50OworCQkJfQorCQl9CisKKwkJaWYgKGVudHJ5LT5kZWx0YSkKKwkJCS8qIFRoaXMgaGFwcGVucyBpZiB3ZSBkZWNpZGVkIHRvIHJldXNlIGV4aXN0aW5nCisJCQkgKiBkZWx0YSBmcm9tIGEgcGFjay4gICIhbm9fcmV1c2VfZGVsdGEgJiYiIGlzIGltcGxpZWQuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCisJCWlmIChlbnRyeS0+c2l6ZSA8IDUwKQorCQkJY29udGludWU7CisJCWZyZWVfZGVsdGFfaW5kZXgobi0+aW5kZXgpOworCQluLT5pbmRleCA9IE5VTEw7CisJCWZyZWUobi0+ZGF0YSk7CisJCW4tPmVudHJ5ID0gZW50cnk7CisJCW4tPmRhdGEgPSByZWFkX3NoYTFfZmlsZShlbnRyeS0+c2hhMSwgdHlwZSwgJnNpemUpOworCQlpZiAoc2l6ZSAhPSBlbnRyeS0+c2l6ZSkKKwkJCWRpZSgib2JqZWN0ICVzIGluY29uc2lzdGVudCBvYmplY3QgbGVuZ3RoICglbHUgdnMgJWx1KSIsCisJCQkgICAgc2hhMV90b19oZXgoZW50cnktPnNoYTEpLCBzaXplLCBlbnRyeS0+c2l6ZSk7CisKKwkJaiA9IHdpbmRvdzsKKwkJd2hpbGUgKC0taiA+IDApIHsKKwkJCXVuc2lnbmVkIGludCBvdGhlcl9pZHggPSBpZHggKyBqOworCQkJc3RydWN0IHVucGFja2VkICptOworCQkJaWYgKG90aGVyX2lkeCA+PSB3aW5kb3cpCisJCQkJb3RoZXJfaWR4IC09IHdpbmRvdzsKKwkJCW0gPSBhcnJheSArIG90aGVyX2lkeDsKKwkJCWlmICghbS0+ZW50cnkpCisJCQkJYnJlYWs7CisJCQlpZiAodHJ5X2RlbHRhKG4sIG0sIG0tPmluZGV4LCBkZXB0aCkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCS8qIGlmIHdlIG1hZGUgbiBhIGRlbHRhLCBhbmQgaWYgbiBpcyBhbHJlYWR5IGF0IG1heAorCQkgKiBkZXB0aCwgbGVhdmluZyBpdCBpbiB0aGUgd2luZG93IGlzIHBvaW50bGVzcy4gIHdlCisJCSAqIHNob3VsZCBldmljdCBpdCBmaXJzdC4KKwkJICovCisJCWlmIChlbnRyeS0+ZGVsdGEgJiYgZGVwdGggPD0gZW50cnktPmRlcHRoKQorCQkJY29udGludWU7CisKKwkJbi0+aW5kZXggPSBjcmVhdGVfZGVsdGFfaW5kZXgobi0+ZGF0YSwgc2l6ZSk7CisJCWlmICghbi0+aW5kZXgpCisJCQlkaWUoIm91dCBvZiBtZW1vcnkiKTsKKworCQlpZHgrKzsKKwkJaWYgKGlkeCA+PSB3aW5kb3cpCisJCQlpZHggPSAwOworCX0KKworCWlmIChwcm9ncmVzcykKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKworCWZvciAoaSA9IDA7IGkgPCB3aW5kb3c7ICsraSkgeworCQlmcmVlX2RlbHRhX2luZGV4KGFycmF5W2ldLmluZGV4KTsKKwkJZnJlZShhcnJheVtpXS5kYXRhKTsKKwl9CisJZnJlZShhcnJheSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfcGFjayhpbnQgd2luZG93LCBpbnQgZGVwdGgpCit7CisJZ2V0X29iamVjdF9kZXRhaWxzKCk7CisJc29ydGVkX2J5X3R5cGUgPSBjcmVhdGVfc29ydGVkX2xpc3QodHlwZV9zaXplX3NvcnQpOworCWlmICh3aW5kb3cgJiYgZGVwdGgpCisJCWZpbmRfZGVsdGFzKHNvcnRlZF9ieV90eXBlLCB3aW5kb3crMSwgZGVwdGgpOworfQorCitzdGF0aWMgaW50IHJldXNlX2NhY2hlZF9wYWNrKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBwYWNrX3RvX3N0ZG91dCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjYWNoZVtdID0gInBhY2stY2FjaGUvcGFjay0lcy4lcyI7CisJY2hhciAqY2FjaGVkX3BhY2ssICpjYWNoZWRfaWR4OworCWludCBpZmQsIG9mZCwgaWZkX2l4ID0gLTE7CisKKwljYWNoZWRfcGFjayA9IGdpdF9wYXRoKGNhY2hlLCBzaGExX3RvX2hleChzaGExKSwgInBhY2siKTsKKwlpZmQgPSBvcGVuKGNhY2hlZF9wYWNrLCBPX1JET05MWSk7CisJaWYgKGlmZCA8IDApCisJCXJldHVybiAwOworCisJaWYgKCFwYWNrX3RvX3N0ZG91dCkgeworCQljYWNoZWRfaWR4ID0gZ2l0X3BhdGgoY2FjaGUsIHNoYTFfdG9faGV4KHNoYTEpLCAiaWR4Iik7CisJCWlmZF9peCA9IG9wZW4oY2FjaGVkX2lkeCwgT19SRE9OTFkpOworCQlpZiAoaWZkX2l4IDwgMCkgeworCQkJY2xvc2UoaWZkKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIlJldXNpbmcgJWQgb2JqZWN0cyBwYWNrICVzXG4iLCBucl9vYmplY3RzLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCisJaWYgKHBhY2tfdG9fc3Rkb3V0KSB7CisJCWlmIChjb3B5X2ZkKGlmZCwgMSkpCisJCQlleGl0KDEpOworCQljbG9zZShpZmQpOworCX0KKwllbHNlIHsKKwkJY2hhciBuYW1lW1BBVEhfTUFYXTsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAorCQkJICIlcy0lcy4lcyIsIGJhc2VfbmFtZSwgc2hhMV90b19oZXgoc2hhMSksICJwYWNrIik7CisJCW9mZCA9IG9wZW4obmFtZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KTsKKwkJaWYgKG9mZCA8IDApCisJCQlkaWUoInVuYWJsZSB0byBvcGVuICVzICglcykiLCBuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoY29weV9mZChpZmQsIG9mZCkpCisJCQlleGl0KDEpOworCQljbG9zZShpZmQpOworCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKKwkJCSAiJXMtJXMuJXMiLCBiYXNlX25hbWUsIHNoYTFfdG9faGV4KHNoYTEpLCAiaWR4Iik7CisJCW9mZCA9IG9wZW4obmFtZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KTsKKwkJaWYgKG9mZCA8IDApCisJCQlkaWUoInVuYWJsZSB0byBvcGVuICVzICglcykiLCBuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoY29weV9mZChpZmRfaXgsIG9mZCkpCisJCQlleGl0KDEpOworCQljbG9zZShpZmRfaXgpOworCQlwdXRzKHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcHJvZ3Jlc3Nfc2lnbmFsKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwlzdHJ1Y3QgaXRpbWVydmFsIHY7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gcHJvZ3Jlc3NfaW50ZXJ2YWw7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzaWdhY3Rpb24oU0lHQUxSTSwgJnNhLCBOVUxMKTsKKworCXYuaXRfaW50ZXJ2YWwudHZfc2VjID0gMTsKKwl2Lml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworCXYuaXRfdmFsdWUgPSB2Lml0X2ludGVydmFsOworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJU0hBX0NUWCBjdHg7CisJY2hhciBsaW5lWzQwICsgMSArIFBBVEhfTUFYICsgMl07CisJaW50IHdpbmRvdyA9IDEwLCBkZXB0aCA9IDEwLCBwYWNrX3RvX3N0ZG91dCA9IDA7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKmxpc3Q7CisJaW50IG51bV9wcmVmZXJyZWRfYmFzZSA9IDA7CisJaW50IGk7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlwcm9ncmVzcyA9IGlzYXR0eSgyKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcCgiLS1ub24tZW1wdHkiLCBhcmcpKSB7CisJCQkJbm9uX2VtcHR5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWxvY2FsIiwgYXJnKSkgeworCQkJCWxvY2FsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWluY3JlbWVudGFsIiwgYXJnKSkgeworCQkJCWluY3JlbWVudGFsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcCgiLS13aW5kb3c9IiwgYXJnLCA5KSkgeworCQkJCWNoYXIgKmVuZDsKKwkJCQl3aW5kb3cgPSBzdHJ0b3VsKGFyZys5LCAmZW5kLCAwKTsKKwkJCQlpZiAoIWFyZ1s5XSB8fCAqZW5kKQorCQkJCQl1c2FnZShwYWNrX3VzYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcCgiLS1kZXB0aD0iLCBhcmcsIDgpKSB7CisJCQkJY2hhciAqZW5kOworCQkJCWRlcHRoID0gc3RydG91bChhcmcrOCwgJmVuZCwgMCk7CisJCQkJaWYgKCFhcmdbOF0gfHwgKmVuZCkKKwkJCQkJdXNhZ2UocGFja191c2FnZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1wcm9ncmVzcyIsIGFyZykpIHsKKwkJCQlwcm9ncmVzcyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLXEiLCBhcmcpKSB7CisJCQkJcHJvZ3Jlc3MgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tbm8tcmV1c2UtZGVsdGEiLCBhcmcpKSB7CisJCQkJbm9fcmV1c2VfZGVsdGEgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tc3Rkb3V0IiwgYXJnKSkgeworCQkJCXBhY2tfdG9fc3Rkb3V0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKHBhY2tfdXNhZ2UpOworCQl9CisJCWlmIChiYXNlX25hbWUpCisJCQl1c2FnZShwYWNrX3VzYWdlKTsKKwkJYmFzZV9uYW1lID0gYXJnOworCX0KKworCWlmIChwYWNrX3RvX3N0ZG91dCAhPSAhYmFzZV9uYW1lKQorCQl1c2FnZShwYWNrX3VzYWdlKTsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCisJaWYgKHByb2dyZXNzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2VuZXJhdGluZyBwYWNrLi4uXG4iKTsKKwkJc2V0dXBfcHJvZ3Jlc3Nfc2lnbmFsKCk7CisJfQorCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQl1bnNpZ25lZCBoYXNoOworCisJCWlmICghZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbikpIHsKKwkJCWlmIChmZW9mKHN0ZGluKSkKKwkJCQlicmVhazsKKwkJCWlmICghZmVycm9yKHN0ZGluKSkKKwkJCQlkaWUoImZnZXRzIHJldHVybmVkIE5VTEwsIG5vdCBFT0YsIG5vdCBlcnJvciEiKTsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQlkaWUoImZnZXRzOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQljbGVhcmVycihzdGRpbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsaW5lWzBdID09ICctJykgeworCQkJaWYgKGdldF9zaGExX2hleChsaW5lKzEsIHNoYTEpKQorCQkJCWRpZSgiZXhwZWN0ZWQgZWRnZSBzaGExLCBnb3QgZ2FyYmFnZTpcbiAlcyIsCisJCQkJICAgIGxpbmUrMSk7CisJCQlpZiAobnVtX3ByZWZlcnJlZF9iYXNlKysgPCB3aW5kb3cpCisJCQkJYWRkX3ByZWZlcnJlZF9iYXNlKHNoYTEpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSkKKwkJCWRpZSgiZXhwZWN0ZWQgc2hhMSwgZ290IGdhcmJhZ2U6XG4gJXMiLCBsaW5lKTsKKwkJaGFzaCA9IG5hbWVfaGFzaChsaW5lKzQxKTsKKwkJYWRkX3ByZWZlcnJlZF9iYXNlX29iamVjdChsaW5lKzQxLCBoYXNoKTsKKwkJYWRkX29iamVjdF9lbnRyeShzaGExLCBoYXNoLCAwKTsKKwl9CisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIkRvbmUgY291bnRpbmcgJWQgb2JqZWN0cy5cbiIsIG5yX29iamVjdHMpOworCXNvcnRlZF9ieV9zaGEgPSBjcmVhdGVfZmluYWxfb2JqZWN0X2xpc3QoKTsKKwlpZiAobm9uX2VtcHR5ICYmICFucl9yZXN1bHQpCisJCXJldHVybiAwOworCisJU0hBMV9Jbml0KCZjdHgpOworCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCWZvciAoaSA9IDA7IGkgPCBucl9yZXN1bHQ7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9ICpsaXN0Kys7CisJCVNIQTFfVXBkYXRlKCZjdHgsIGVudHJ5LT5zaGExLCAyMCk7CisJfQorCVNIQTFfRmluYWwob2JqZWN0X2xpc3Rfc2hhMSwgJmN0eCk7CisJaWYgKHByb2dyZXNzICYmIChucl9vYmplY3RzICE9IG5yX3Jlc3VsdCkpCisJCWZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGhhcyAlZCBvYmplY3RzLlxuIiwgbnJfcmVzdWx0KTsKKworCWlmIChyZXVzZV9jYWNoZWRfcGFjayhvYmplY3RfbGlzdF9zaGExLCBwYWNrX3RvX3N0ZG91dCkpCisJCTsKKwllbHNlIHsKKwkJaWYgKG5yX3Jlc3VsdCkKKwkJCXByZXBhcmVfcGFjayh3aW5kb3csIGRlcHRoKTsKKwkJaWYgKHByb2dyZXNzICYmIHBhY2tfdG9fc3Rkb3V0KSB7CisJCQkvKiB0aGUgb3RoZXIgZW5kIHVzdWFsbHkgZGlzcGxheXMgcHJvZ3Jlc3MgaXRzZWxmICovCisJCQlzdHJ1Y3QgaXRpbWVydmFsIHYgPSB7ezAsfSx9OworCQkJc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmdiwgTlVMTCk7CisJCQlzaWduYWwoU0lHQUxSTSwgU0lHX0lHTiApOworCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMDsKKwkJfQorCQl3cml0ZV9wYWNrX2ZpbGUoKTsKKwkJaWYgKCFwYWNrX3RvX3N0ZG91dCkgeworCQkJd3JpdGVfaW5kZXhfZmlsZSgpOworCQkJcHV0cyhzaGExX3RvX2hleChvYmplY3RfbGlzdF9zaGExKSk7CisJCX0KKwl9CisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIlRvdGFsICVkLCB3cml0dGVuICVkIChkZWx0YSAlZCksIHJldXNlZCAlZCAoZGVsdGEgJWQpXG4iLAorCQkJbnJfcmVzdWx0LCB3cml0dGVuLCB3cml0dGVuX2RlbHRhLCByZXVzZWQsIHJldXNlZF9kZWx0YSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wYWNrLXJlZHVuZGFudC5jIGIvcGFjay1yZWR1bmRhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDgxZjVhCi0tLSAvZGV2L251bGwKKysrIGIvcGFjay1yZWR1bmRhbnQuYwpAQCAtMCwwICsxLDY4MyBAQAorLyoKKyoKKyogQ29weXJpZ2h0IDIwMDUsIEx1a2FzIFNhbmRzdHJvbSA8bHVrYXNzQGV0ZWsuY2hhbG1lcnMuc2U+CisqCisqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLgorKgorKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisKKyNkZWZpbmUgQkxLU0laRSA1MTIKKworc3RhdGljIGNvbnN0IGNoYXIgcGFja19yZWR1bmRhbnRfdXNhZ2VbXSA9CisiZ2l0LXBhY2stcmVkdW5kYW50IFsgLS12ZXJib3NlIF0gWyAtLWFsdC1vZGIgXSA8IC0tYWxsIHwgPC5wYWNrIGZpbGVuYW1lPiAuLi4+IjsKKworc3RhdGljIGludCBsb2FkX2FsbF9wYWNrcyA9IDAsIHZlcmJvc2UgPSAwLCBhbHRfb2RiID0gMDsKKworc3RydWN0IGxsaXN0X2l0ZW0geworCXN0cnVjdCBsbGlzdF9pdGVtICpuZXh0OworCXVuc2lnbmVkIGNoYXIgKnNoYTE7Cit9Oworc3RhdGljIHN0cnVjdCBsbGlzdCB7CisJc3RydWN0IGxsaXN0X2l0ZW0gKmZyb250OworCXN0cnVjdCBsbGlzdF9pdGVtICpiYWNrOworCXNpemVfdCBzaXplOworfSAqYWxsX29iamVjdHM7IC8qIGFsbCBvYmplY3RzIHdoaWNoIG11c3QgYmUgcHJlc2VudCBpbiBsb2NhbCBwYWNrZmlsZXMgKi8KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgeworCXN0cnVjdCBwYWNrX2xpc3QgKm5leHQ7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2s7CisJc3RydWN0IGxsaXN0ICp1bmlxdWVfb2JqZWN0czsKKwlzdHJ1Y3QgbGxpc3QgKmFsbF9vYmplY3RzOworfSAqbG9jYWxfcGFja3MgPSBOVUxMLCAqYWx0b2RiX3BhY2tzID0gTlVMTDsKKworc3RydWN0IHBsbCB7CisJc3RydWN0IHBsbCAqbmV4dDsKKwlzdHJ1Y3QgcGFja19saXN0ICpwbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxpc3RfaXRlbSAqZnJlZV9ub2RlcyA9IE5VTEw7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9pdGVtX3B1dChzdHJ1Y3QgbGxpc3RfaXRlbSAqaXRlbSkKK3sKKwlpdGVtLT5uZXh0ID0gZnJlZV9ub2RlczsKKwlmcmVlX25vZGVzID0gaXRlbTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxpc3RfaXRlbSAqbGxpc3RfaXRlbV9nZXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqbmV3OworCWlmICggZnJlZV9ub2RlcyApIHsKKwkJbmV3ID0gZnJlZV9ub2RlczsKKwkJZnJlZV9ub2RlcyA9IGZyZWVfbm9kZXMtPm5leHQ7CisJfSBlbHNlIHsKKwkJaW50IGkgPSAxOworCQluZXcgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgbGxpc3RfaXRlbSkgKiBCTEtTSVpFKTsKKwkJZm9yKDtpIDwgQkxLU0laRTsgaSsrKSB7CisJCQlsbGlzdF9pdGVtX3B1dCgmbmV3W2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgdm9pZCBsbGlzdF9mcmVlKHN0cnVjdCBsbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSgobGlzdC0+YmFjayA9IGxpc3QtPmZyb250KSkgeworCQlsaXN0LT5mcm9udCA9IGxpc3QtPmZyb250LT5uZXh0OworCQlsbGlzdF9pdGVtX3B1dChsaXN0LT5iYWNrKTsKKwl9CisJZnJlZShsaXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2luaXQoc3RydWN0IGxsaXN0ICoqbGlzdCkKK3sKKwkqbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbGlzdCkpOworCSgqbGlzdCktPmZyb250ID0gKCpsaXN0KS0+YmFjayA9IE5VTEw7CisJKCpsaXN0KS0+c2l6ZSA9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGxpc3QgKiBsbGlzdF9jb3B5KHN0cnVjdCBsbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgbGxpc3QgKnJldDsKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqbmV3LCAqb2xkLCAqcHJldjsKKwkKKwlsbGlzdF9pbml0KCZyZXQpOworCisJaWYgKChyZXQtPnNpemUgPSBsaXN0LT5zaXplKSA9PSAwKQorCQlyZXR1cm4gcmV0OworCisJbmV3ID0gcmV0LT5mcm9udCA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJbmV3LT5zaGExID0gbGlzdC0+ZnJvbnQtPnNoYTE7CisKKwlvbGQgPSBsaXN0LT5mcm9udC0+bmV4dDsKKwl3aGlsZSAob2xkKSB7CisJCXByZXYgPSBuZXc7CisJCW5ldyA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJCXByZXYtPm5leHQgPSBuZXc7CisJCW5ldy0+c2hhMSA9IG9sZC0+c2hhMTsKKwkJb2xkID0gb2xkLT5uZXh0OworCX0KKwluZXctPm5leHQgPSBOVUxMOworCXJldC0+YmFjayA9IG5ldzsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICogbGxpc3RfaW5zZXJ0KHN0cnVjdCBsbGlzdCAqbGlzdCwKKwkJCQkJICAgICAgIHN0cnVjdCBsbGlzdF9pdGVtICphZnRlciwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGxsaXN0X2l0ZW0gKm5ldyA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJbmV3LT5zaGExID0gc2hhMTsKKwluZXctPm5leHQgPSBOVUxMOworCisJaWYgKGFmdGVyICE9IE5VTEwpIHsKKwkJbmV3LT5uZXh0ID0gYWZ0ZXItPm5leHQ7CisJCWFmdGVyLT5uZXh0ID0gbmV3OworCQlpZiAoYWZ0ZXIgPT0gbGlzdC0+YmFjaykKKwkJCWxpc3QtPmJhY2sgPSBuZXc7CisJfSBlbHNlIHsvKiBpbnNlcnQgaW4gZnJvbnQgKi8KKwkJaWYgKGxpc3QtPnNpemUgPT0gMCkKKwkJCWxpc3QtPmJhY2sgPSBuZXc7CisJCWVsc2UKKwkJCW5ldy0+bmV4dCA9IGxpc3QtPmZyb250OworCQlsaXN0LT5mcm9udCA9IG5ldzsKKwl9CisJbGlzdC0+c2l6ZSsrOworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKmxsaXN0X2luc2VydF9iYWNrKHN0cnVjdCBsbGlzdCAqbGlzdCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gbGxpc3RfaW5zZXJ0KGxpc3QsIGxpc3QtPmJhY2ssIHNoYTEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICpsbGlzdF9pbnNlcnRfc29ydGVkX3VuaXF1ZShzdHJ1Y3QgbGxpc3QgKmxpc3QsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBsbGlzdF9pdGVtICpoaW50KQoreworCXN0cnVjdCBsbGlzdF9pdGVtICpwcmV2ID0gTlVMTCwgKmw7CisKKwlsID0gKGhpbnQgPT0gTlVMTCkgPyBsaXN0LT5mcm9udCA6IGhpbnQ7CisJd2hpbGUgKGwpIHsKKwkJaW50IGNtcCA9IG1lbWNtcChsLT5zaGExLCBzaGExLCAyMCk7CisJCWlmIChjbXAgPiAwKSB7IC8qIHdlIGluc2VydCBiZWZvcmUgdGhpcyBlbnRyeSAqLworCQkJcmV0dXJuIGxsaXN0X2luc2VydChsaXN0LCBwcmV2LCBzaGExKTsKKwkJfQorCQlpZighY21wKSB7IC8qIGFscmVhZHkgZXhpc3RzICovCisJCQlyZXR1cm4gbDsKKwkJfQorCQlwcmV2ID0gbDsKKwkJbCA9IGwtPm5leHQ7CisJfQorCS8qIGluc2VydCBhdCB0aGUgZW5kICovCisJcmV0dXJuIGxsaXN0X2luc2VydF9iYWNrKGxpc3QsIHNoYTEpOworfQorCisvKiByZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpdGVtIGluIGZyb250IG9mIHNoYTEgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKiBsbGlzdF9zb3J0ZWRfcmVtb3ZlKHN0cnVjdCBsbGlzdCAqbGlzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IGxsaXN0X2l0ZW0gKmhpbnQpCit7CisJc3RydWN0IGxsaXN0X2l0ZW0gKnByZXYsICpsOworCityZWRvX2Zyb21fc3RhcnQ6CisJbCA9IChoaW50ID09IE5VTEwpID8gbGlzdC0+ZnJvbnQgOiBoaW50OworCXByZXYgPSBOVUxMOworCXdoaWxlIChsKSB7CisJCWludCBjbXAgPSBtZW1jbXAobC0+c2hhMSwgc2hhMSwgMjApOworCQlpZiAoY21wID4gMCkgLyogbm90IGluIGxpc3QsIHNpbmNlIHNvcnRlZCAqLworCQkJcmV0dXJuIHByZXY7CisJCWlmKCFjbXApIHsgLyogZm91bmQgKi8KKwkJCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJCQlpZiAoaGludCAhPSBOVUxMICYmIGhpbnQgIT0gbGlzdC0+ZnJvbnQpIHsKKwkJCQkJLyogd2UgZG9uJ3Qga25vdyB0aGUgcHJldmlvdXMgZWxlbWVudCAqLworCQkJCQloaW50ID0gTlVMTDsKKwkJCQkJZ290byByZWRvX2Zyb21fc3RhcnQ7CisJCQkJfQorCQkJCWxpc3QtPmZyb250ID0gbC0+bmV4dDsKKwkJCX0gZWxzZQorCQkJCXByZXYtPm5leHQgPSBsLT5uZXh0OworCQkJaWYgKGwgPT0gbGlzdC0+YmFjaykKKwkJCQlsaXN0LT5iYWNrID0gcHJldjsKKwkJCWxsaXN0X2l0ZW1fcHV0KGwpOworCQkJbGlzdC0+c2l6ZS0tOworCQkJcmV0dXJuIHByZXY7CisJCX0KKwkJcHJldiA9IGw7CisJCWwgPSBsLT5uZXh0OworCX0KKwlyZXR1cm4gcHJldjsKK30KKworLyogY29tcHV0ZXMgQVxCICovCitzdGF0aWMgdm9pZCBsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKHN0cnVjdCBsbGlzdCAqQSwKKwkJCQkgICAgIHN0cnVjdCBsbGlzdCAqQikKK3sKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqaGludCwgKmI7CisKKwloaW50ID0gTlVMTDsKKwliID0gQi0+ZnJvbnQ7CisKKwl3aGlsZSAoYikgeworCQloaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShBLCBiLT5zaGExLCBoaW50KTsKKwkJYiA9IGItPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfaW5zZXJ0KHN0cnVjdCBwYWNrX2xpc3QgKipwbCwKKwkJCQkJICAgc3RydWN0IHBhY2tfbGlzdCAqZW50cnkpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWNrX2xpc3QpKTsKKwltZW1jcHkocCwgZW50cnksIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcC0+bmV4dCA9ICpwbDsKKwkqcGwgPSBwOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBwYWNrX2xpc3Rfc2l6ZShzdHJ1Y3QgcGFja19saXN0ICpwbCkKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwl3aGlsZShwbCkgeworCQlyZXQrKzsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfZGlmZmVyZW5jZShjb25zdCBzdHJ1Y3QgcGFja19saXN0ICpBLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqQikKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpyZXQ7CisJY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqcGw7CisKKwlpZiAoQSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBsID0gQjsKKwl3aGlsZSAocGwgIT0gTlVMTCkgeworCQlpZiAoQS0+cGFjayA9PSBwbC0+cGFjaykKKwkJCXJldHVybiBwYWNrX2xpc3RfZGlmZmVyZW5jZShBLT5uZXh0LCBCKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBhY2tfbGlzdCkpOworCW1lbWNweShyZXQsIEEsIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcmV0LT5uZXh0ID0gcGFja19saXN0X2RpZmZlcmVuY2UoQS0+bmV4dCwgQik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY21wX3R3b19wYWNrcyhzdHJ1Y3QgcGFja19saXN0ICpwMSwgc3RydWN0IHBhY2tfbGlzdCAqcDIpCit7CisJaW50IHAxX29mZiwgcDJfb2ZmOworCXZvaWQgKnAxX2Jhc2UsICpwMl9iYXNlOworCXN0cnVjdCBsbGlzdF9pdGVtICpwMV9oaW50ID0gTlVMTCwgKnAyX2hpbnQgPSBOVUxMOworCQorCXAxX29mZiA9IHAyX29mZiA9IDI1NiAqIDQgKyA0OworCXAxX2Jhc2UgPSAodm9pZCAqKXAxLT5wYWNrLT5pbmRleF9iYXNlOworCXAyX2Jhc2UgPSAodm9pZCAqKXAyLT5wYWNrLT5pbmRleF9iYXNlOworCisJd2hpbGUgKHAxX29mZiA8PSBwMS0+cGFjay0+aW5kZXhfc2l6ZSAtIDMgKiAyMCAmJgorCSAgICAgICBwMl9vZmYgPD0gcDItPnBhY2stPmluZGV4X3NpemUgLSAzICogMjApCisJeworCQlpbnQgY21wID0gbWVtY21wKHAxX2Jhc2UgKyBwMV9vZmYsIHAyX2Jhc2UgKyBwMl9vZmYsIDIwKTsKKwkJLyogY21wIH4gcDEgLSBwMiAqLworCQlpZiAoY21wID09IDApIHsKKwkJCXAxX2hpbnQgPSBsbGlzdF9zb3J0ZWRfcmVtb3ZlKHAxLT51bmlxdWVfb2JqZWN0cywKKwkJCQkJcDFfYmFzZSArIHAxX29mZiwgcDFfaGludCk7CisJCQlwMl9oaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShwMi0+dW5pcXVlX29iamVjdHMsCisJCQkJCXAxX2Jhc2UgKyBwMV9vZmYsIHAyX2hpbnQpOworCQkJcDFfb2ZmKz0yNDsKKwkJCXAyX29mZis9MjQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY21wIDwgMCkgeyAvKiBwMSBoYXMgdGhlIG9iamVjdCwgcDIgZG9lc24ndCAqLworCQkJcDFfb2ZmKz0yNDsKKwkJfSBlbHNlIHsgLyogcDIgaGFzIHRoZSBvYmplY3QsIHAxIGRvZXNuJ3QgKi8KKwkJCXAyX29mZis9MjQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBsbF9mcmVlKHN0cnVjdCBwbGwgKmwpCit7CisJc3RydWN0IHBsbCAqb2xkOworCXN0cnVjdCBwYWNrX2xpc3QgKm9wbDsKKworCXdoaWxlIChsKSB7CisJCW9sZCA9IGw7CisJCXdoaWxlIChsLT5wbCkgeworCQkJb3BsID0gbC0+cGw7CisJCQlsLT5wbCA9IG9wbC0+bmV4dDsKKwkJCWZyZWUob3BsKTsKKwkJfQorCQlsID0gbC0+bmV4dDsKKwkJZnJlZShvbGQpOworCX0KK30KKworLyogYWxsIHRoZSBwZXJtdXRhdGlvbnMgaGF2ZSB0byBiZSBmcmVlKClkIGF0IHRoZSBzYW1lIHRpbWUsCisgKiBzaW5jZSB0aGV5IHJlZmVyIHRvIGVhY2ggb3RoZXIKKyAqLworc3RhdGljIHN0cnVjdCBwbGwgKiBnZXRfcGVybXV0YXRpb25zKHN0cnVjdCBwYWNrX2xpc3QgKmxpc3QsIGludCBuKQoreworCXN0cnVjdCBwbGwgKnN1YnNldCwgKnJldCA9IE5VTEwsICpuZXdfcGxsID0gTlVMTCwgKnBsbDsKKworCWlmIChsaXN0ID09IE5VTEwgfHwgcGFja19saXN0X3NpemUobGlzdCkgPCBuIHx8IG4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobiA9PSAxKSB7CisJCXdoaWxlIChsaXN0KSB7CisJCQluZXdfcGxsID0geG1hbGxvYyhzaXplb2YocGxsKSk7CisJCQluZXdfcGxsLT5wbCA9IE5VTEw7CisJCQlwYWNrX2xpc3RfaW5zZXJ0KCZuZXdfcGxsLT5wbCwgbGlzdCk7CisJCQluZXdfcGxsLT5uZXh0ID0gcmV0OworCQkJcmV0ID0gbmV3X3BsbDsKKwkJCWxpc3QgPSBsaXN0LT5uZXh0OworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJd2hpbGUgKGxpc3QtPm5leHQpIHsKKwkJc3Vic2V0ID0gZ2V0X3Blcm11dGF0aW9ucyhsaXN0LT5uZXh0LCBuIC0gMSk7CisJCXdoaWxlIChzdWJzZXQpIHsKKwkJCW5ld19wbGwgPSB4bWFsbG9jKHNpemVvZihwbGwpKTsKKwkJCW5ld19wbGwtPnBsID0gc3Vic2V0LT5wbDsKKwkJCXBhY2tfbGlzdF9pbnNlcnQoJm5ld19wbGwtPnBsLCBsaXN0KTsKKwkJCW5ld19wbGwtPm5leHQgPSByZXQ7CisJCQlyZXQgPSBuZXdfcGxsOworCQkJc3Vic2V0ID0gc3Vic2V0LT5uZXh0OworCQl9CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzX3N1cGVyc2V0KHN0cnVjdCBwYWNrX2xpc3QgKnBsLCBzdHJ1Y3QgbGxpc3QgKmxpc3QpCit7CisJc3RydWN0IGxsaXN0ICpkaWZmOworCisJZGlmZiA9IGxsaXN0X2NvcHkobGlzdCk7CisKKwl3aGlsZSAocGwpIHsKKwkJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShkaWZmLCBwbC0+YWxsX29iamVjdHMpOworCQlpZiAoZGlmZi0+c2l6ZSA9PSAwKSB7IC8qIHdlJ3JlIGRvbmUgKi8KKwkJCWxsaXN0X2ZyZWUoZGlmZik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlwbCA9IHBsLT5uZXh0OworCX0KKwlsbGlzdF9mcmVlKGRpZmYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc2l6ZV90IHNpemVvZl91bmlvbihzdHJ1Y3QgcGFja2VkX2dpdCAqcDEsIHN0cnVjdCBwYWNrZWRfZ2l0ICpwMikKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwlpbnQgcDFfb2ZmLCBwMl9vZmY7CisJdm9pZCAqcDFfYmFzZSwgKnAyX2Jhc2U7CisKKwlwMV9vZmYgPSBwMl9vZmYgPSAyNTYgKiA0ICsgNDsKKwlwMV9iYXNlID0gKHZvaWQgKilwMS0+aW5kZXhfYmFzZTsKKwlwMl9iYXNlID0gKHZvaWQgKilwMi0+aW5kZXhfYmFzZTsKKworCXdoaWxlIChwMV9vZmYgPD0gcDEtPmluZGV4X3NpemUgLSAzICogMjAgJiYKKwkgICAgICAgcDJfb2ZmIDw9IHAyLT5pbmRleF9zaXplIC0gMyAqIDIwKQorCXsKKwkJaW50IGNtcCA9IG1lbWNtcChwMV9iYXNlICsgcDFfb2ZmLCBwMl9iYXNlICsgcDJfb2ZmLCAyMCk7CisJCS8qIGNtcCB+IHAxIC0gcDIgKi8KKwkJaWYgKGNtcCA9PSAwKSB7CisJCQlyZXQrKzsKKwkJCXAxX29mZis9MjQ7CisJCQlwMl9vZmYrPTI0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNtcCA8IDApIHsgLyogcDEgaGFzIHRoZSBvYmplY3QsIHAyIGRvZXNuJ3QgKi8KKwkJCXAxX29mZis9MjQ7CisJCX0gZWxzZSB7IC8qIHAyIGhhcyB0aGUgb2JqZWN0LCBwMSBkb2Vzbid0ICovCisJCQlwMl9vZmYrPTI0OworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIGFub3RoZXIgTyhuXjIpIGZ1bmN0aW9uIC4uLiAqLworc3RhdGljIHNpemVfdCBnZXRfcGFja19yZWR1bmRhbmN5KHN0cnVjdCBwYWNrX2xpc3QgKnBsKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnN1YnNldDsKKwlzaXplX3QgcmV0ID0gMDsKKworCWlmIChwbCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgoc3Vic2V0ID0gcGwtPm5leHQpKSB7CisJCXdoaWxlKHN1YnNldCkgeworCQkJcmV0ICs9IHNpemVvZl91bmlvbihwbC0+cGFjaywgc3Vic2V0LT5wYWNrKTsKKwkJCXN1YnNldCA9IHN1YnNldC0+bmV4dDsKKwkJfQorCQlwbCA9IHBsLT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBwYWNrX3NldF9ieXRlY291bnQoc3RydWN0IHBhY2tfbGlzdCAqcGwpCit7CisJc2l6ZV90IHJldCA9IDA7CisJd2hpbGUgKHBsKSB7CisJCXJldCArPSBwbC0+cGFjay0+cGFja19zaXplOworCQlyZXQgKz0gcGwtPnBhY2stPmluZGV4X3NpemU7CisJCXBsID0gcGwtPm5leHQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1pbmltaXplKHN0cnVjdCBwYWNrX2xpc3QgKiptaW4pCit7CisJc3RydWN0IHBhY2tfbGlzdCAqcGwsICp1bmlxdWUgPSBOVUxMLAorCQkqbm9uX3VuaXF1ZSA9IE5VTEwsICptaW5fcGVybSA9IE5VTEw7CisJc3RydWN0IHBsbCAqcGVybSwgKnBlcm1fYWxsLCAqcGVybV9vayA9IE5VTEwsICpuZXdfcGVybTsKKwlzdHJ1Y3QgbGxpc3QgKm1pc3Npbmc7CisJc2l6ZV90IG1pbl9wZXJtX3NpemUgPSAoc2l6ZV90KS0xLCBwZXJtX3NpemU7CisJaW50IG47CisKKwlwbCA9IGxvY2FsX3BhY2tzOworCXdoaWxlIChwbCkgeworCQlpZihwbC0+dW5pcXVlX29iamVjdHMtPnNpemUpCisJCQlwYWNrX2xpc3RfaW5zZXJ0KCZ1bmlxdWUsIHBsKTsKKwkJZWxzZQorCQkJcGFja19saXN0X2luc2VydCgmbm9uX3VuaXF1ZSwgcGwpOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwkvKiBmaW5kIG91dCB3aGljaCBvYmplY3RzIGFyZSBtaXNzaW5nIGZyb20gdGhlIHNldCBvZiB1bmlxdWUgcGFja3MgKi8KKwltaXNzaW5nID0gbGxpc3RfY29weShhbGxfb2JqZWN0cyk7CisJcGwgPSB1bmlxdWU7CisJd2hpbGUgKHBsKSB7CisJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UobWlzc2luZywgcGwtPmFsbF9vYmplY3RzKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisKKwkvKiByZXR1cm4gaWYgdGhlcmUgYXJlIG5vIG9iamVjdHMgbWlzc2luZyBmcm9tIHRoZSB1bmlxdWUgc2V0ICovCisJaWYgKG1pc3NpbmctPnNpemUgPT0gMCkgeworCQkqbWluID0gdW5pcXVlOworCQlyZXR1cm47CisJfQorCisJLyogZmluZCB0aGUgcGVybXV0YXRpb25zIHdoaWNoIGNvbnRhaW4gYWxsIG1pc3Npbmcgb2JqZWN0cyAqLworCWZvciAobiA9IDE7IG4gPD0gcGFja19saXN0X3NpemUobm9uX3VuaXF1ZSkgJiYgIXBlcm1fb2s7IG4rKykgeworCQlwZXJtX2FsbCA9IHBlcm0gPSBnZXRfcGVybXV0YXRpb25zKG5vbl91bmlxdWUsIG4pOworCQl3aGlsZSAocGVybSkgeworCQkJaWYgKGlzX3N1cGVyc2V0KHBlcm0tPnBsLCBtaXNzaW5nKSkgeworCQkJCW5ld19wZXJtID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBsbCkpOworCQkJCW1lbWNweShuZXdfcGVybSwgcGVybSwgc2l6ZW9mKHN0cnVjdCBwbGwpKTsKKwkJCQluZXdfcGVybS0+bmV4dCA9IHBlcm1fb2s7CisJCQkJcGVybV9vayA9IG5ld19wZXJtOworCQkJfQorCQkJcGVybSA9IHBlcm0tPm5leHQ7CisJCX0KKwkJaWYgKHBlcm1fb2spCisJCQlicmVhazsKKwkJcGxsX2ZyZWUocGVybV9hbGwpOworCX0KKwlpZiAocGVybV9vayA9PSBOVUxMKQorCQlkaWUoIkludGVybmFsIGVycm9yOiBObyBjb21wbGV0ZSBzZXRzIGZvdW5kIVxuIik7CisKKwkvKiBmaW5kIHRoZSBwZXJtdXRhdGlvbiB3aXRoIHRoZSBzbWFsbGVzdCBzaXplICovCisJcGVybSA9IHBlcm1fb2s7CisJd2hpbGUgKHBlcm0pIHsKKwkJcGVybV9zaXplID0gcGFja19zZXRfYnl0ZWNvdW50KHBlcm0tPnBsKTsKKwkJaWYgKG1pbl9wZXJtX3NpemUgPiBwZXJtX3NpemUpIHsKKwkJCW1pbl9wZXJtX3NpemUgPSBwZXJtX3NpemU7CisJCQltaW5fcGVybSA9IHBlcm0tPnBsOworCQl9CisJCXBlcm0gPSBwZXJtLT5uZXh0OworCX0KKwkqbWluID0gbWluX3Blcm07CisJLyogYWRkIHRoZSB1bmlxdWUgcGFja3MgdG8gdGhlIGxpc3QgKi8KKwlwbCA9IHVuaXF1ZTsKKwl3aGlsZShwbCkgeworCQlwYWNrX2xpc3RfaW5zZXJ0KG1pbiwgcGwpOworCQlwbCA9IHBsLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgbG9hZF9hbGxfb2JqZWN0cyh2b2lkKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnBsID0gbG9jYWxfcGFja3M7CisJc3RydWN0IGxsaXN0X2l0ZW0gKmhpbnQsICpsOworCisJbGxpc3RfaW5pdCgmYWxsX29iamVjdHMpOworCisJd2hpbGUgKHBsKSB7CisJCWhpbnQgPSBOVUxMOworCQlsID0gcGwtPmFsbF9vYmplY3RzLT5mcm9udDsKKwkJd2hpbGUgKGwpIHsKKwkJCWhpbnQgPSBsbGlzdF9pbnNlcnRfc29ydGVkX3VuaXF1ZShhbGxfb2JqZWN0cywKKwkJCQkJCQkgIGwtPnNoYTEsIGhpbnQpOworCQkJbCA9IGwtPm5leHQ7CisJCX0KKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJLyogcmVtb3ZlIG9iamVjdHMgcHJlc2VudCBpbiByZW1vdGUgcGFja3MgKi8KKwlwbCA9IGFsdG9kYl9wYWNrczsKKwl3aGlsZSAocGwpIHsKKwkJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShhbGxfb2JqZWN0cywgcGwtPmFsbF9vYmplY3RzKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9Cit9CisKKy8qIHRoaXMgc2NhbGVzIGxpa2UgTyhuXjIpICovCitzdGF0aWMgdm9pZCBjbXBfbG9jYWxfcGFja3Modm9pZCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpzdWJzZXQsICpwbCA9IGxvY2FsX3BhY2tzOworCisJd2hpbGUgKChzdWJzZXQgPSBwbCkpIHsKKwkJd2hpbGUoKHN1YnNldCA9IHN1YnNldC0+bmV4dCkpCisJCQljbXBfdHdvX3BhY2tzKHBsLCBzdWJzZXQpOworCQlwbCA9IHBsLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgc2Nhbl9hbHRfb2RiX3BhY2tzKHZvaWQpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqbG9jYWwsICphbHQ7CisKKwlhbHQgPSBhbHRvZGJfcGFja3M7CisJd2hpbGUgKGFsdCkgeworCQlsb2NhbCA9IGxvY2FsX3BhY2tzOworCQl3aGlsZSAobG9jYWwpIHsKKwkJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UobG9jYWwtPnVuaXF1ZV9vYmplY3RzLAorCQkJCQkJCWFsdC0+YWxsX29iamVjdHMpOworCQkJbG9jYWwgPSBsb2NhbC0+bmV4dDsKKwkJfQorCQlsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKGFsbF9vYmplY3RzLCBhbHQtPmFsbF9vYmplY3RzKTsKKwkJYWx0ID0gYWx0LT5uZXh0OworCX0KK30KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgKiBhZGRfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0IGw7CisJc2l6ZV90IG9mZjsKKwl2b2lkICpiYXNlOworCisJaWYgKCFwLT5wYWNrX2xvY2FsICYmICEoYWx0X29kYiB8fCB2ZXJib3NlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsLnBhY2sgPSBwOworCWxsaXN0X2luaXQoJmwuYWxsX29iamVjdHMpOworCisJb2ZmID0gMjU2ICogNCArIDQ7CisJYmFzZSA9ICh2b2lkICopcC0+aW5kZXhfYmFzZTsKKwl3aGlsZSAob2ZmIDw9IHAtPmluZGV4X3NpemUgLSAzICogMjApIHsKKwkJbGxpc3RfaW5zZXJ0X2JhY2sobC5hbGxfb2JqZWN0cywgYmFzZSArIG9mZik7CisJCW9mZiArPSAyNDsKKwl9CisJLyogdGhpcyBsaXN0IHdpbGwgYmUgcHJ1bmVkIGluIGNtcF90d29fcGFja3MgbGF0ZXIgKi8KKwlsLnVuaXF1ZV9vYmplY3RzID0gbGxpc3RfY29weShsLmFsbF9vYmplY3RzKTsKKwlpZiAocC0+cGFja19sb2NhbCkKKwkJcmV0dXJuIHBhY2tfbGlzdF9pbnNlcnQoJmxvY2FsX3BhY2tzLCAmbCk7CisJZWxzZQorCQlyZXR1cm4gcGFja19saXN0X2luc2VydCgmYWx0b2RiX3BhY2tzLCAmbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja19saXN0ICogYWRkX3BhY2tfZmlsZShjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IHBhY2tlZF9naXQ7CisKKwlpZiAoc3RybGVuKGZpbGVuYW1lKSA8IDQwKQorCQlkaWUoIkJhZCBwYWNrIGZpbGVuYW1lOiAlc1xuIiwgZmlsZW5hbWUpOworCisJd2hpbGUgKHApIHsKKwkJaWYgKHN0cnN0cihwLT5wYWNrX25hbWUsIGZpbGVuYW1lKSkKKwkJCXJldHVybiBhZGRfcGFjayhwKTsKKwkJcCA9IHAtPm5leHQ7CisJfQorCWRpZSgiRmlsZW5hbWUgJXMgbm90IGZvdW5kIGluIHBhY2tlZF9naXRcbiIsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IHBhY2tlZF9naXQ7CisKKwl3aGlsZSAocCkgeworCQlhZGRfcGFjayhwKTsKKwkJcCA9IHAtPm5leHQ7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJc3RydWN0IHBhY2tfbGlzdCAqbWluLCAqcmVkLCAqcGw7CisJc3RydWN0IGxsaXN0ICppZ25vcmU7CisJdW5zaWduZWQgY2hhciAqc2hhMTsKKwljaGFyIGJ1Zls0Ml07IC8qIDQwIGJ5dGUgc2hhMSArIFxuICsgXDAgKi8KKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZighc3RyY21wKGFyZywgIi0tYWxsIikpIHsKKwkJCWxvYWRfYWxsX3BhY2tzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmKCFzdHJjbXAoYXJnLCAiLS12ZXJib3NlIikpIHsKKwkJCXZlcmJvc2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYoIXN0cmNtcChhcmcsICItLWFsdC1vZGIiKSkgeworCQkJYWx0X29kYiA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZigqYXJnID09ICctJykKKwkJCXVzYWdlKHBhY2tfcmVkdW5kYW50X3VzYWdlKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisKKwlpZiAobG9hZF9hbGxfcGFja3MpCisJCWxvYWRfYWxsKCk7CisJZWxzZQorCQl3aGlsZSAoKihhcmd2ICsgaSkgIT0gTlVMTCkKKwkJCWFkZF9wYWNrX2ZpbGUoKihhcmd2ICsgaSsrKSk7CisKKwlpZiAobG9jYWxfcGFja3MgPT0gTlVMTCkKKwkJZGllKCJaZXJvIHBhY2tzIGZvdW5kIVxuIik7CisKKwlsb2FkX2FsbF9vYmplY3RzKCk7CisKKwljbXBfbG9jYWxfcGFja3MoKTsKKwlpZiAoYWx0X29kYikKKwkJc2Nhbl9hbHRfb2RiX3BhY2tzKCk7CisKKwkvKiBpZ25vcmUgb2JqZWN0cyBnaXZlbiBvbiBzdGRpbiAqLworCWxsaXN0X2luaXQoJmlnbm9yZSk7CisJaWYgKCFpc2F0dHkoMCkpIHsKKwkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0ZGluKSkgeworCQkJc2hhMSA9IHhtYWxsb2MoMjApOworCQkJaWYgKGdldF9zaGExX2hleChidWYsIHNoYTEpKQorCQkJCWRpZSgiQmFkIHNoYTEgb24gc3RkaW46ICVzIiwgYnVmKTsKKwkJCWxsaXN0X2luc2VydF9zb3J0ZWRfdW5pcXVlKGlnbm9yZSwgc2hhMSwgTlVMTCk7CisJCX0KKwl9CisJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShhbGxfb2JqZWN0cywgaWdub3JlKTsKKwlwbCA9IGxvY2FsX3BhY2tzOworCXdoaWxlIChwbCkgeworCQlsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKHBsLT51bmlxdWVfb2JqZWN0cywgaWdub3JlKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisKKwltaW5pbWl6ZSgmbWluKTsKKworCWlmICh2ZXJib3NlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlICVsdSBwYWNrcyBhdmFpbGFibGUgaW4gYWx0LW9kYnMuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcGFja19saXN0X3NpemUoYWx0b2RiX3BhY2tzKSk7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIHNtYWxsZXN0IChieXRld2lzZSkgc2V0IG9mIHBhY2tzIGlzOlxuIik7CisJCXBsID0gbWluOworCQl3aGlsZSAocGwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXHQlc1xuIiwgcGwtPnBhY2stPnBhY2tfbmFtZSk7CisJCQlwbCA9IHBsLT5uZXh0OworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiY29udGFpbmluZyAlbHUgZHVwbGljYXRlIG9iamVjdHMgIgorCQkJCSJ3aXRoIGEgdG90YWwgc2l6ZSBvZiAlbHVrYi5cbiIsCisJCQkodW5zaWduZWQgbG9uZylnZXRfcGFja19yZWR1bmRhbmN5KG1pbiksCisJCQkodW5zaWduZWQgbG9uZylwYWNrX3NldF9ieXRlY291bnQobWluKS8xMDI0KTsKKwkJZnByaW50ZihzdGRlcnIsICJBIHRvdGFsIG9mICVsdSB1bmlxdWUgb2JqZWN0cyB3ZXJlIGNvbnNpZGVyZWQuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYWxsX29iamVjdHMtPnNpemUpOworCQlmcHJpbnRmKHN0ZGVyciwgIlJlZHVuZGFudCBwYWNrcyAod2l0aCBpbmRleGVzKTpcbiIpOworCX0KKwlwbCA9IHJlZCA9IHBhY2tfbGlzdF9kaWZmZXJlbmNlKGxvY2FsX3BhY2tzLCBtaW4pOworCXdoaWxlIChwbCkgeworCQlwcmludGYoIiVzXG4lc1xuIiwKKwkJICAgICAgIHNoYTFfcGFja19pbmRleF9uYW1lKHBsLT5wYWNrLT5zaGExKSwKKwkJICAgICAgIHBsLT5wYWNrLT5wYWNrX25hbWUpOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICIlbHVNQiBvZiByZWR1bmRhbnQgcGFja3MgaW4gdG90YWwuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcGFja19zZXRfYnl0ZWNvdW50KHJlZCkvKDEwMjQqMTAyNCkpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wYWNrLmggYi9wYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0ZTBjNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2suaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIFBBQ0tfSAorI2RlZmluZSBQQUNLX0gKKworLyoKKyAqIFRoZSBwYWNrZWQgb2JqZWN0IHR5cGUgaXMgc3RvcmVkIGluIDMgYml0cy4KKyAqIFRoZSB0eXBlIHZhbHVlIDAgaXMgYSByZXNlcnZlZCBwcmVmaXggaWYgZXZlciB0aGVyZSBpcyBtb3JlIHRoYW4gNworICogb2JqZWN0IHR5cGVzLCBvciBhbnkgZnV0dXJlIGZvcm1hdCBleHRlbnNpb25zLgorICovCitlbnVtIG9iamVjdF90eXBlIHsKKwlPQkpfRVhUID0gMCwKKwlPQkpfQ09NTUlUID0gMSwKKwlPQkpfVFJFRSA9IDIsCisJT0JKX0JMT0IgPSAzLAorCU9CSl9UQUcgPSA0LAorCS8qIDUvNiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCU9CSl9ERUxUQSA9IDcsCit9OworCisvKgorICogUGFja2VkIG9iamVjdCBoZWFkZXIKKyAqLworI2RlZmluZSBQQUNLX1NJR05BVFVSRSAweDUwNDE0MzRiCS8qICJQQUNLIiAqLworI2RlZmluZSBQQUNLX1ZFUlNJT04gMgorI2RlZmluZSBwYWNrX3ZlcnNpb25fb2sodikgKCh2KSA9PSBodG9ubCgyKSB8fCAodikgPT0gaHRvbmwoMykpCitzdHJ1Y3QgcGFja19oZWFkZXIgeworCXVuc2lnbmVkIGludCBoZHJfc2lnbmF0dXJlOworCXVuc2lnbmVkIGludCBoZHJfdmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgaGRyX2VudHJpZXM7Cit9OworCitleHRlcm4gaW50IHZlcmlmeV9wYWNrKHN0cnVjdCBwYWNrZWRfZ2l0ICosIGludCk7CitleHRlcm4gaW50IGNoZWNrX3JldXNlX3BhY2tfZGVsdGEoc3RydWN0IHBhY2tlZF9naXQgKiwgdW5zaWduZWQgbG9uZywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqLAorCQkJCSAgZW51bSBvYmplY3RfdHlwZSAqKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGFnZXIuYyBiL3BhZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzMDkzOQotLS0gL2Rldi9udWxsCisrKyBiL3BhZ2VyLmMKQEAgLTAsMCArMSw1MyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKKy8qCisgKiBUaGlzIGlzIHNwbGl0IHVwIGZyb20gdGhlIHJlc3Qgb2YgZ2l0IHNvIHRoYXQgd2UgbWlnaHQgZG8KKyAqIHNvbWV0aGluZyBkaWZmZXJlbnQgb24gV2luZG93cywgZm9yIGV4YW1wbGUuCisgKi8KKworc3RhdGljIHZvaWQgcnVuX3BhZ2VyKGNvbnN0IGNoYXIgKnBhZ2VyKQoreworCWV4ZWNscChwYWdlciwgcGFnZXIsIE5VTEwpOworCWV4ZWNsKCIvYmluL3NoIiwgInNoIiwgIi1jIiwgcGFnZXIsIE5VTEwpOworfQorCit2b2lkIHNldHVwX3BhZ2VyKHZvaWQpCit7CisJcGlkX3QgcGlkOworCWludCBmZFsyXTsKKwljb25zdCBjaGFyICpwYWdlciA9IGdldGVudigiUEFHRVIiKTsKKworCWlmICghaXNhdHR5KDEpKQorCQlyZXR1cm47CisJaWYgKCFwYWdlcikKKwkJcGFnZXIgPSAibGVzcyI7CisJZWxzZSBpZiAoISpwYWdlciB8fCAhc3RyY21wKHBhZ2VyLCAiY2F0IikpCisJCXJldHVybjsKKworCWlmIChwaXBlKGZkKSA8IDApCisJCXJldHVybjsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIHsKKwkJY2xvc2UoZmRbMF0pOworCQljbG9zZShmZFsxXSk7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXR1cm4gaW4gdGhlIGNoaWxkICovCisJaWYgKCFwaWQpIHsKKwkJZHVwMihmZFsxXSwgMSk7CisJCWNsb3NlKGZkWzBdKTsKKwkJY2xvc2UoZmRbMV0pOworCQlyZXR1cm47CisJfQorCisJLyogVGhlIG9yaWdpbmFsIHByb2Nlc3MgdHVybnMgaW50byB0aGUgUEFHRVIgKi8KKwlkdXAyKGZkWzBdLCAwKTsKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworCisJc2V0ZW52KCJMRVNTIiwgIi1TIiwgMCk7CisJcnVuX3BhZ2VyKHBhZ2VyKTsKKwlkaWUoInVuYWJsZSB0byBleGVjdXRlIHBhZ2VyICclcyciLCBwYWdlcik7CisJZXhpdCgyNTUpOworfQpkaWZmIC0tZ2l0IGEvcGF0Y2gtZGVsdGEuYyBiL3BhdGNoLWRlbHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMThlZAotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLWRlbHRhLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIHBhdGNoLWRlbHRhLmM6CisgKiByZWNyZWF0ZSBhIGJ1ZmZlciBmcm9tIGEgc291cmNlIGFuZCB0aGUgZGVsdGEgcHJvZHVjZWQgYnkgZGlmZi1kZWx0YS5jCisgKgorICogKEMpIDIwMDUgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRlbHRhLmgiCisKK3ZvaWQgKnBhdGNoX2RlbHRhKGNvbnN0IHZvaWQgKnNyY19idWYsIHVuc2lnbmVkIGxvbmcgc3JjX3NpemUsCisJCSAgY29uc3Qgdm9pZCAqZGVsdGFfYnVmLCB1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUsCisJCSAgdW5zaWduZWQgbG9uZyAqZHN0X3NpemUpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgKnRvcDsKKwl1bnNpZ25lZCBjaGFyICpkc3RfYnVmLCAqb3V0LCBjbWQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKGRlbHRhX3NpemUgPCBERUxUQV9TSVpFX01JTikKKwkJcmV0dXJuIE5VTEw7CisKKwlkYXRhID0gZGVsdGFfYnVmOworCXRvcCA9IGRlbHRhX2J1ZiArIGRlbHRhX3NpemU7CisKKwkvKiBtYWtlIHN1cmUgdGhlIG9yaWcgZmlsZSBzaXplIG1hdGNoZXMgd2hhdCB3ZSBleHBlY3QgKi8KKwlzaXplID0gZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCB0b3ApOworCWlmIChzaXplICE9IHNyY19zaXplKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIG5vdyB0aGUgcmVzdWx0IHNpemUgKi8KKwlzaXplID0gZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCB0b3ApOworCWRzdF9idWYgPSBtYWxsb2Moc2l6ZSArIDEpOworCWlmICghZHN0X2J1ZikKKwkJcmV0dXJuIE5VTEw7CisJZHN0X2J1ZltzaXplXSA9IDA7CisKKwlvdXQgPSBkc3RfYnVmOworCXdoaWxlIChkYXRhIDwgdG9wKSB7CisJCWNtZCA9ICpkYXRhKys7CisJCWlmIChjbWQgJiAweDgwKSB7CisJCQl1bnNpZ25lZCBsb25nIGNwX29mZiA9IDAsIGNwX3NpemUgPSAwOworCQkJaWYgKGNtZCAmIDB4MDEpIGNwX29mZiA9ICpkYXRhKys7CisJCQlpZiAoY21kICYgMHgwMikgY3Bfb2ZmIHw9ICgqZGF0YSsrIDw8IDgpOworCQkJaWYgKGNtZCAmIDB4MDQpIGNwX29mZiB8PSAoKmRhdGErKyA8PCAxNik7CisJCQlpZiAoY21kICYgMHgwOCkgY3Bfb2ZmIHw9ICgqZGF0YSsrIDw8IDI0KTsKKwkJCWlmIChjbWQgJiAweDEwKSBjcF9zaXplID0gKmRhdGErKzsKKwkJCWlmIChjbWQgJiAweDIwKSBjcF9zaXplIHw9ICgqZGF0YSsrIDw8IDgpOworCQkJaWYgKGNtZCAmIDB4NDApIGNwX3NpemUgfD0gKCpkYXRhKysgPDwgMTYpOworCQkJaWYgKGNwX3NpemUgPT0gMCkgY3Bfc2l6ZSA9IDB4MTAwMDA7CisJCQlpZiAoY3Bfb2ZmICsgY3Bfc2l6ZSA8IGNwX3NpemUgfHwKKwkJCSAgICBjcF9vZmYgKyBjcF9zaXplID4gc3JjX3NpemUgfHwKKwkJCSAgICBjcF9zaXplID4gc2l6ZSkKKwkJCQlnb3RvIGJhZDsKKwkJCW1lbWNweShvdXQsIHNyY19idWYgKyBjcF9vZmYsIGNwX3NpemUpOworCQkJb3V0ICs9IGNwX3NpemU7CisJCQlzaXplIC09IGNwX3NpemU7CisJCX0gZWxzZSBpZiAoY21kKSB7CisJCQlpZiAoY21kID4gc2l6ZSkKKwkJCQlnb3RvIGJhZDsKKwkJCW1lbWNweShvdXQsIGRhdGEsIGNtZCk7CisJCQlvdXQgKz0gY21kOworCQkJZGF0YSArPSBjbWQ7CisJCQlzaXplIC09IGNtZDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBjbWQgPT0gMCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGVuY29kaW5nCisJCQkgKiBleHRlbnNpb25zLiBJbiB0aGUgbWVhbiB0aW1lIHdlIG11c3QgZmFpbCB3aGVuCisJCQkgKiBlbmNvdW50ZXJpbmcgdGhlbSAobWlnaHQgYmUgZGF0YSBjb3JydXB0aW9uKS4KKwkJCSAqLworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoZGF0YSAhPSB0b3AgfHwgc2l6ZSAhPSAwKSB7CisJCWJhZDoKKwkJZnJlZShkc3RfYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmRzdF9zaXplID0gb3V0IC0gZHN0X2J1ZjsKKwlyZXR1cm4gZHN0X2J1ZjsKK30KZGlmZiAtLWdpdCBhL3BhdGNoLWlkLmMgYi9wYXRjaC1pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmM0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRjaC1pZC5jCkBAIC0wLDAgKzEsODIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgdm9pZCBmbHVzaF9jdXJyZW50X2lkKGludCBwYXRjaGxlbiwgdW5zaWduZWQgY2hhciAqaWQsIFNIQV9DVFggKmMpCit7CisJdW5zaWduZWQgY2hhciByZXN1bHRbMjBdOworCWNoYXIgbmFtZVs1MF07CisKKwlpZiAoIXBhdGNobGVuKQorCQlyZXR1cm47CisKKwlTSEExX0ZpbmFsKHJlc3VsdCwgYyk7CisJbWVtY3B5KG5hbWUsIHNoYTFfdG9faGV4KGlkKSwgNDEpOworCXByaW50ZigiJXMgJXNcbiIsIHNoYTFfdG9faGV4KHJlc3VsdCksIG5hbWUpOworCVNIQTFfSW5pdChjKTsKK30KKworc3RhdGljIGludCByZW1vdmVfc3BhY2UoY2hhciAqbGluZSkKK3sKKwljaGFyICpzcmMgPSBsaW5lOworCWNoYXIgKmRzdCA9IGxpbmU7CisJdW5zaWduZWQgY2hhciBjOworCisJd2hpbGUgKChjID0gKnNyYysrKSAhPSAnXDAnKSB7CisJCWlmICghaXNzcGFjZShjKSkKKwkJCSpkc3QrKyA9IGM7CisJfQorCXJldHVybiBkc3QgLSBsaW5lOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9pZF9saXN0KHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKKwlTSEFfQ1RYIGN0eDsKKwlpbnQgcGF0Y2hsZW4gPSAwOworCisJU0hBMV9Jbml0KCZjdHgpOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgblsyMF07CisJCWNoYXIgKnAgPSBsaW5lOworCQlpbnQgbGVuOworCisJCWlmICghbWVtY21wKGxpbmUsICJkaWZmLXRyZWUgIiwgMTApKQorCQkJcCArPSAxMDsKKworCQlpZiAoIWdldF9zaGExX2hleChwLCBuKSkgeworCQkJZmx1c2hfY3VycmVudF9pZChwYXRjaGxlbiwgc2hhMSwgJmN0eCk7CisJCQltZW1jcHkoc2hhMSwgbiwgMjApOworCQkJcGF0Y2hsZW4gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZ25vcmUgY29tbWl0IGNvbW1lbnRzICovCisJCWlmICghcGF0Y2hsZW4gJiYgbWVtY21wKGxpbmUsICJkaWZmICIsIDUpKQorCQkJY29udGludWU7CisKKwkJLyogSWdub3JlIGdpdC1kaWZmIGluZGV4IGhlYWRlciAqLworCQlpZiAoIW1lbWNtcChsaW5lLCAiaW5kZXggIiwgNikpCisJCQljb250aW51ZTsKKworCQkvKiBJZ25vcmUgbGluZSBudW1iZXJzIHdoZW4gY29tcHV0aW5nIHRoZSBTSEExIG9mIHRoZSBwYXRjaCAqLworCQlpZiAoIW1lbWNtcChsaW5lLCAiQEAgLSIsIDQpKQorCQkJY29udGludWU7CisKKwkJLyogQ29tcHV0ZSB0aGUgc2hhIHdpdGhvdXQgd2hpdGVzcGFjZSAqLworCQlsZW4gPSByZW1vdmVfc3BhY2UobGluZSk7CisJCXBhdGNobGVuICs9IGxlbjsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgbGluZSwgbGVuKTsKKwl9CisJZmx1c2hfY3VycmVudF9pZChwYXRjaGxlbiwgc2hhMSwgJmN0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHBhdGNoX2lkX3VzYWdlW10gPSAiZ2l0LXBhdGNoLWlkIDwgcGF0Y2giOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgIT0gMSkKKwkJdXNhZ2UocGF0Y2hfaWRfdXNhZ2UpOworCisJZ2VuZXJhdGVfaWRfbGlzdCgpOworCXJldHVybiAwOworfQkKZGlmZiAtLWdpdCBhL3BhdGguYyBiL3BhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY4YjVmCi0tLSAvZGV2L251bGwKKysrIGIvcGF0aC5jCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogSSdtIHRpcmVkIG9mIGRvaW5nICJ2c25wcmludGYoKSIgZXRjIGp1c3QgdG8gb3BlbiBhCisgKiBmaWxlLCBzbyBoZXJlJ3MgYSAicmV0dXJuIHN0YXRpYyBidWZmZXIgd2l0aCBwcmludGYiCisgKiBpbnRlcmZhY2UgZm9yIHBhdGhzLgorICoKKyAqIEl0J3Mgb2J2aW91c2x5IG5vdCB0aHJlYWQtc2FmZS4gU3VlIG1lLiBCdXQgaXQncyBxdWl0ZQorICogdXNlZnVsIGZvciBkb2luZyB0aGluZ3MgbGlrZQorICoKKyAqICAgZiA9IG9wZW4obWtwYXRoKCIlcy8lcy5naXQiLCBiYXNlLCBuYW1lKSwgT19SRE9OTFkpOworICoKKyAqIHdoaWNoIGlzIHdoYXQgaXQncyBkZXNpZ25lZCBmb3IuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgPHB3ZC5oPgorCitzdGF0aWMgY2hhciBwYXRobmFtZVtQQVRIX01BWF07CitzdGF0aWMgY2hhciBiYWRfcGF0aFtdID0gIi9iYWQtcGF0aC8iOworCitzdGF0aWMgY2hhciAqY2xlYW51cF9wYXRoKGNoYXIgKnBhdGgpCit7CisJLyogQ2xlYW4gaXQgdXAgKi8KKwlpZiAoIW1lbWNtcChwYXRoLCAiLi8iLCAyKSkgeworCQlwYXRoICs9IDI7CisJCXdoaWxlICgqcGF0aCA9PSAnLycpCisJCQlwYXRoKys7CisJfQorCXJldHVybiBwYXRoOworfQorCitjaGFyICpta3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXVuc2lnbmVkIGxlbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHBhdGhuYW1lLCBQQVRIX01BWCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJcmV0dXJuIGJhZF9wYXRoOworCXJldHVybiBjbGVhbnVwX3BhdGgocGF0aG5hbWUpOworfQorCitjaGFyICpnaXRfcGF0aChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljb25zdCBjaGFyICpnaXRfZGlyID0gZ2V0X2dpdF9kaXIoKTsKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCisJbGVuID0gc3RybGVuKGdpdF9kaXIpOworCWlmIChsZW4gPiBQQVRIX01BWC0xMDApCisJCXJldHVybiBiYWRfcGF0aDsKKwltZW1jcHkocGF0aG5hbWUsIGdpdF9kaXIsIGxlbik7CisJaWYgKGxlbiAmJiBnaXRfZGlyW2xlbi0xXSAhPSAnLycpCisJCXBhdGhuYW1lW2xlbisrXSA9ICcvJzsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiArPSB2c25wcmludGYocGF0aG5hbWUgKyBsZW4sIFBBVEhfTUFYIC0gbGVuLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gYmFkX3BhdGg7CisJcmV0dXJuIGNsZWFudXBfcGF0aChwYXRobmFtZSk7Cit9CisKKworLyogZ2l0X21rc3RlbXAoKSAtIGNyZWF0ZSB0bXAgZmlsZSBob25vcmluZyBUTVBESVIgdmFyaWFibGUgKi8KK2ludCBnaXRfbWtzdGVtcChjaGFyICpwYXRoLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSkKK3sKKwljaGFyICplbnYsICpwY2ggPSBwYXRoOworCisJaWYgKChlbnYgPSBnZXRlbnYoIlRNUERJUiIpKSA9PSBOVUxMKSB7CisJCXN0cmNweShwY2gsICIvdG1wLyIpOworCQlsZW4gLT0gNTsKKwkJcGNoICs9IDU7CisJfSBlbHNlIHsKKwkJc2l6ZV90IG4gPSBzbnByaW50ZihwY2gsIGxlbiwgIiVzLyIsIGVudik7CisKKwkJbGVuIC09IG47CisJCXBjaCArPSBuOworCX0KKworCXNhZmVfc3RybmNweShwY2gsIHRlbXBsYXRlLCBsZW4pOworCisJcmV0dXJuIG1rc3RlbXAocGF0aCk7Cit9CisKKworY2hhciAqc2FmZV9zdHJuY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG4pCit7CisJc3RybmNweShkZXN0LCBzcmMsIG4pOworCWRlc3RbbiAtIDFdID0gJ1wwJzsKKworCXJldHVybiBkZXN0OworfQorCitpbnQgdmFsaWRhdGVfc3ltcmVmKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqYnVmLCBidWZmZXJbMjU2XTsKKwlpbnQgbGVuLCBmZDsKKworCWlmIChsc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyogTWFrZSBzdXJlIGl0IGlzIGEgInJlZnMvLi4iIHN5bWxpbmsgKi8KKwlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSkgeworCQlsZW4gPSByZWFkbGluayhwYXRoLCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEpOworCQlpZiAobGVuID49IDUgJiYgIW1lbWNtcCgicmVmcy8iLCBidWZmZXIsIDUpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIEFueXRoaW5nIGVsc2UsIGp1c3Qgb3BlbiBpdCBhbmQgdHJ5IHRvIHNlZSBpZiBpdCBpcyBhIHN5bWJvbGljIHJlZi4KKwkgKi8KKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKwlsZW4gPSByZWFkKGZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogSXMgaXQgYSBzeW1ib2xpYyByZWY/CisJICovCisJaWYgKGxlbiA8IDQgfHwgbWVtY21wKCJyZWY6IiwgYnVmZmVyLCA0KSkKKwkJcmV0dXJuIC0xOworCWJ1ZiA9IGJ1ZmZlciArIDQ7CisJbGVuIC09IDQ7CisJd2hpbGUgKGxlbiAmJiBpc3NwYWNlKCpidWYpKQorCQlidWYrKywgbGVuLS07CisJaWYgKGxlbiA+PSA1ICYmICFtZW1jbXAoInJlZnMvIiwgYnVmLCA1KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY2hhciAqdXNlcl9wYXRoKGNoYXIgKmJ1ZiwgY2hhciAqcGF0aCwgaW50IHN6KQoreworCXN0cnVjdCBwYXNzd2QgKnB3OworCWNoYXIgKnNsYXNoOworCWludCBsZW4sIGJhc2VsZW47CisKKwlpZiAoIXBhdGggfHwgcGF0aFswXSAhPSAnficpCisJCXJldHVybiBOVUxMOworCXBhdGgrKzsKKwlzbGFzaCA9IHN0cmNocihwYXRoLCAnLycpOworCWlmIChwYXRoWzBdID09ICcvJyB8fCAhcGF0aFswXSkgeworCQlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwl9CisJZWxzZSB7CisJCWlmIChzbGFzaCkgeworCQkJKnNsYXNoID0gMDsKKwkJCXB3ID0gZ2V0cHduYW0ocGF0aCk7CisJCQkqc2xhc2ggPSAnLyc7CisJCX0KKwkJZWxzZQorCQkJcHcgPSBnZXRwd25hbShwYXRoKTsKKwl9CisJaWYgKCFwdyB8fCAhcHctPnB3X2RpciB8fCBzeiA8PSBzdHJsZW4ocHctPnB3X2RpcikpCisJCXJldHVybiBOVUxMOworCWJhc2VsZW4gPSBzdHJsZW4ocHctPnB3X2Rpcik7CisJbWVtY3B5KGJ1ZiwgcHctPnB3X2RpciwgYmFzZWxlbik7CisJd2hpbGUgKCgxIDwgYmFzZWxlbikgJiYgKGJ1ZltiYXNlbGVuLTFdID09ICcvJykpIHsKKwkJYnVmW2Jhc2VsZW4tMV0gPSAwOworCQliYXNlbGVuLS07CisJfQorCWlmIChzbGFzaCAmJiBzbGFzaFsxXSkgeworCQlsZW4gPSBzdHJsZW4oc2xhc2gpOworCQlpZiAoc3ogPD0gYmFzZWxlbiArIGxlbikKKwkJCXJldHVybiBOVUxMOworCQltZW1jcHkoYnVmICsgYmFzZWxlbiwgc2xhc2gsIGxlbiArIDEpOworCX0KKwlyZXR1cm4gYnVmOworfQorCisvKgorICogRmlyc3QsIG9uZSBkaXJlY3RvcnkgdG8gdHJ5IGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0uCisgKgorICogKDApIElmICJzdHJpY3QiIGlzIGdpdmVuLCB0aGUgcGF0aCBpcyB1c2VkIGFzIGdpdmVuIGFuZCBubyBEV0lNIGlzCisgKiAgICAgZG9uZS4gT3RoZXJ3aXNlOgorICogKDEpICJ+L3BhdGgiIHRvIG1lYW4gcGF0aCB1bmRlciB0aGUgcnVubmluZyB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnk7CisgKiAoMikgIn51c2VyL3BhdGgiIHRvIG1lYW4gcGF0aCB1bmRlciBuYW1lZCB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnk7CisgKiAoMykgInJlbGF0aXZlL3BhdGgiIHRvIG1lYW4gY3dkIHJlbGF0aXZlIGRpcmVjdG9yeTsgb3IKKyAqICg0KSAiL2Fic29sdXRlL3BhdGgiIHRvIG1lYW4gYWJzb2x1dGUgZGlyZWN0b3J5LgorICoKKyAqIFVubGVzcyAic3RyaWN0IiBpcyBnaXZlbiwgd2UgdHJ5IGFjY2VzcygpIGZvciBleGlzdGVuY2Ugb2YgIiVzLmdpdC8uZ2l0IiwKKyAqICIlcy8uZ2l0IiwgIiVzLmdpdCIsICIlcyIgaW4gdGhpcyBvcmRlci4gIFRoZSBmaXJzdCBvbmUgdGhhdCBleGlzdHMgaXMKKyAqIHdoYXQgd2UgdHJ5LgorICoKKyAqIFNlY29uZCwgd2UgdHJ5IGNoZGlyKCkgdG8gdGhhdC4gIFVwb24gZmFpbHVyZSwgd2UgcmV0dXJuIE5VTEwuCisgKgorICogVGhlbiwgd2UgdHJ5IGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBhIHZhbGlkIGdpdCByZXBvc2l0b3J5LgorICogVXBvbiBmYWlsdXJlLCB3ZSByZXR1cm4gTlVMTC4KKyAqCisgKiBJZiBhbGwgZ29lcyB3ZWxsLCB3ZSByZXR1cm4gdGhlIGRpcmVjdG9yeSB3ZSB1c2VkIHRvIGNoZGlyKCkgKGJ1dAorICogYmVmb3JlIH51c2VyIGlzIGV4cGFuZGVkKSwgYXZvaWRpbmcgZ2V0Y3dkKCkgcmVzb2x2aW5nIHN5bWJvbGljCisgKiBsaW5rcy4gIFVzZXIgcmVsYXRpdmUgcGF0aHMgYXJlIGFsc28gcmV0dXJuZWQgYXMgdGhleSBhcmUgZ2l2ZW4sCisgKiBleGNlcHQgRFdJTSBzdWZmaXhpbmcuCisgKi8KK2NoYXIgKmVudGVyX3JlcG8oY2hhciAqcGF0aCwgaW50IHN0cmljdCkKK3sKKwlzdGF0aWMgY2hhciB1c2VkX3BhdGhbUEFUSF9NQVhdOworCXN0YXRpYyBjaGFyIHZhbGlkYXRlZF9wYXRoW1BBVEhfTUFYXTsKKworCWlmICghcGF0aCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXN0cmljdCkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqc3VmZml4W10gPSB7CisJCQkiLmdpdC8uZ2l0IiwgIi8uZ2l0IiwgIi5naXQiLCAiIiwgTlVMTCwKKwkJfTsKKwkJaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKKwkJaW50IGk7CisJCXdoaWxlICgoMSA8IGxlbikgJiYgKHBhdGhbbGVuLTFdID09ICcvJykpIHsKKwkJCXBhdGhbbGVuLTFdID0gMDsKKwkJCWxlbi0tOworCQl9CisJCWlmIChQQVRIX01BWCA8PSBsZW4pCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHBhdGhbMF0gPT0gJ34nKSB7CisJCQlpZiAoIXVzZXJfcGF0aCh1c2VkX3BhdGgsIHBhdGgsIFBBVEhfTUFYKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXN0cmNweSh2YWxpZGF0ZWRfcGF0aCwgcGF0aCk7CisJCQlwYXRoID0gdXNlZF9wYXRoOworCQl9CisJCWVsc2UgaWYgKFBBVEhfTUFYIC0gMTAgPCBsZW4pCisJCQlyZXR1cm4gTlVMTDsKKwkJZWxzZSB7CisJCQlwYXRoID0gc3RyY3B5KHVzZWRfcGF0aCwgcGF0aCk7CisJCQlzdHJjcHkodmFsaWRhdGVkX3BhdGgsIHBhdGgpOworCQl9CisJCWxlbiA9IHN0cmxlbihwYXRoKTsKKwkJZm9yIChpID0gMDsgc3VmZml4W2ldOyBpKyspIHsKKwkJCXN0cmNweShwYXRoICsgbGVuLCBzdWZmaXhbaV0pOworCQkJaWYgKCFhY2Nlc3MocGF0aCwgRl9PSykpIHsKKwkJCQlzdHJjYXQodmFsaWRhdGVkX3BhdGgsIHN1ZmZpeFtpXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFzdWZmaXhbaV0gfHwgY2hkaXIocGF0aCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJcGF0aCA9IHZhbGlkYXRlZF9wYXRoOworCX0KKwllbHNlIGlmIChjaGRpcihwYXRoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYWNjZXNzKCJvYmplY3RzIiwgWF9PSykgPT0gMCAmJiBhY2Nlc3MoInJlZnMiLCBYX09LKSA9PSAwICYmCisJICAgIHZhbGlkYXRlX3N5bXJlZigiSEVBRCIpID09IDApIHsKKwkJcHV0ZW52KCJHSVRfRElSPS4iKTsKKwkJY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQoKTsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBhZGp1c3Rfc2hhcmVkX3Blcm0oY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgbW9kZTsKKworCWlmICghc2hhcmVkX3JlcG9zaXRvcnkpCisJCXJldHVybiAwOworCWlmIChsc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJcmV0dXJuIC0xOworCW1vZGUgPSBzdC5zdF9tb2RlOworCWlmIChtb2RlICYgU19JUlVTUikKKwkJbW9kZSB8PSBTX0lSR1JQOworCWlmIChtb2RlICYgU19JV1VTUikKKwkJbW9kZSB8PSBTX0lXR1JQOworCWlmIChtb2RlICYgU19JWFVTUikKKwkJbW9kZSB8PSBTX0lYR1JQOworCWlmIChTX0lTRElSKG1vZGUpKQorCQltb2RlIHw9IFNfSVNHSUQ7CisJaWYgKGNobW9kKHBhdGgsIG1vZGUpIDwgMCkKKwkJcmV0dXJuIC0yOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcGVlay1yZW1vdGUuYyBiL3BlZWstcmVtb3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwY2YyMgotLS0gL2Rldi9udWxsCisrKyBiL3BlZWstcmVtb3RlLmMKQEAgLTAsMCArMSw1OCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgcGVla19yZW1vdGVfdXNhZ2VbXSA9CisiZ2l0LXBlZWstcmVtb3RlIFstLWV4ZWM9dXBsb2FkLXBhY2tdIFtob3N0Ol1kaXJlY3RvcnkiOworc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWMgPSAiZ2l0LXVwbG9hZC1wYWNrIjsKKworc3RhdGljIGludCBwZWVrX3JlbW90ZShpbnQgZmRbMl0pCit7CisJc3RydWN0IHJlZiAqcmVmOworCisJZ2V0X3JlbW90ZV9oZWFkcyhmZFswXSwgJnJlZiwgMCwgTlVMTCwgMCk7CisJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKworCXdoaWxlIChyZWYpIHsKKwkJcHJpbnRmKCIlcwklc1xuIiwgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSksIHJlZi0+bmFtZSk7CisJCXJlZiA9IHJlZi0+bmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmV0OworCWNoYXIgKmRlc3QgPSBOVUxMOworCWludCBmZFsyXTsKKwlwaWRfdCBwaWQ7CisJaW50IG5vbmdpdCA9IDA7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmbm9uZ2l0KTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RybmNtcCgiLS1leGVjPSIsIGFyZywgNykpCisJCQkJZXhlYyA9IGFyZyArIDc7CisJCQllbHNlCisJCQkJdXNhZ2UocGVla19yZW1vdGVfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJZGVzdCA9IGFyZzsKKwkJYnJlYWs7CisJfQorCWlmICghZGVzdCB8fCBpICE9IGFyZ2MgLSAxKQorCQl1c2FnZShwZWVrX3JlbW90ZV91c2FnZSk7CisKKwlwaWQgPSBnaXRfY29ubmVjdChmZCwgZGVzdCwgZXhlYyk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiAxOworCXJldCA9IHBlZWtfcmVtb3RlKGZkKTsKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworCWZpbmlzaF9jb25uZWN0KHBpZCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3BrdC1saW5lLmMgYi9wa3QtbGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiM2JhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9wa3QtbGluZS5jCkBAIC0wLDAgKzEsMTEyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorCisvKgorICogV3JpdGUgYSBwYWNrZXRpemVkIHN0cmVhbSwgd2hlcmUgZWFjaCBsaW5lIGlzIHByZWNlZGVkIGJ5CisgKiBpdHMgbGVuZ3RoIChpbmNsdWRpbmcgdGhlIGhlYWRlcikgYXMgYSA0LWJ5dGUgaGV4IG51bWJlci4KKyAqIEEgbGVuZ3RoIG9mICd6ZXJvJyBtZWFucyBlbmQgb2Ygc3RyZWFtIChhbmQgYSBsZW5ndGggb2YgMS0zCisgKiB3b3VsZCBiZSBhbiBlcnJvcikuIAorICoKKyAqIFRoaXMgaXMgYWxsIHByZXR0eSBzdHVwaWQsIGJ1dCB3ZSB1c2UgdGhpcyBwYWNrZXRpemVkIGxpbmUKKyAqIGZvcm1hdCB0byBtYWtlIGEgc3RyZWFtaW5nIGZvcm1hdCBwb3NzaWJsZSB3aXRob3V0IGV2ZXIKKyAqIG92ZXItcnVubmluZyB0aGUgcmVhZCBidWZmZXJzLiBUaGF0IHdheSB3ZSdsbCBuZXZlciByZWFkCisgKiBpbnRvIHdoYXQgbWlnaHQgYmUgdGhlIHBhY2sgZGF0YSAod2hpY2ggc2hvdWxkIGdvIHRvIGFub3RoZXIKKyAqIHByb2Nlc3MgZW50aXJlbHkpLgorICoKKyAqIFRoZSB3cml0aW5nIHNpZGUgY291bGQgdXNlIHN0ZGlvLCBidXQgc2luY2UgdGhlIHJlYWRpbmcKKyAqIHNpZGUgY2FuJ3QsIHdlIHN0YXkgd2l0aCBwdXJlIHJlYWQvd3JpdGUgaW50ZXJmYWNlcy4KKyAqLworc3RhdGljIHZvaWQgc2FmZV93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbikKK3sKKwl3aGlsZSAobikgeworCQlpbnQgcmV0ID0geHdyaXRlKGZkLCBidWYsIG4pOworCQlpZiAocmV0ID4gMCkgeworCQkJYnVmICs9IHJldDsKKwkJCW4gLT0gcmV0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZXQpCisJCQlkaWUoIndyaXRlIGVycm9yIChkaXNrIGZ1bGw/KSIpOworCQlkaWUoIndyaXRlIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKworLyoKKyAqIElmIHdlIGJ1ZmZlcmVkIHRoaW5ncyB1cCBhYm92ZSAod2UgZG9uJ3QsIGJ1dCB3ZSBzaG91bGQpLAorICogd2UnZCBmbHVzaCBpdCBoZXJlCisgKi8KK3ZvaWQgcGFja2V0X2ZsdXNoKGludCBmZCkKK3sKKwlzYWZlX3dyaXRlKGZkLCAiMDAwMCIsIDQpOworfQorCisjZGVmaW5lIGhleChhKSAoaGV4Y2hhclsoYSkgJiAxNV0pCit2b2lkIHBhY2tldF93cml0ZShpbnQgZmQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDAwXTsKKwlzdGF0aWMgY2hhciBoZXhjaGFyW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJdmFfbGlzdCBhcmdzOworCXVuc2lnbmVkIG47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCW4gPSB2c25wcmludGYoYnVmZmVyICsgNCwgc2l6ZW9mKGJ1ZmZlcikgLSA0LCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAobiA+PSBzaXplb2YoYnVmZmVyKS00KQorCQlkaWUoInByb3RvY29sIGVycm9yOiBpbXBvc3NpYmx5IGxvbmcgbGluZSIpOworCW4gKz0gNDsKKwlidWZmZXJbMF0gPSBoZXgobiA+PiAxMik7CisJYnVmZmVyWzFdID0gaGV4KG4gPj4gOCk7CisJYnVmZmVyWzJdID0gaGV4KG4gPj4gNCk7CisJYnVmZmVyWzNdID0gaGV4KG4pOworCXNhZmVfd3JpdGUoZmQsIGJ1ZmZlciwgbik7Cit9CisKK3N0YXRpYyB2b2lkIHNhZmVfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSkKK3sKKwlpbnQgbiA9IDA7CisKKwl3aGlsZSAobiA8IHNpemUpIHsKKwkJaW50IHJldCA9IHhyZWFkKGZkLCBidWZmZXIgKyBuLCBzaXplIC0gbik7CisJCWlmIChyZXQgPCAwKQorCQkJZGllKCJyZWFkIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoIXJldCkKKwkJCWRpZSgidW5leHBlY3RlZCBFT0YiKTsKKwkJbiArPSByZXQ7CisJfQorfQorCitpbnQgcGFja2V0X3JlYWRfbGluZShpbnQgZmQsIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSkKK3sKKwlpbnQgbjsKKwl1bnNpZ25lZCBsZW47CisJY2hhciBsaW5lbGVuWzRdOworCisJc2FmZV9yZWFkKGZkLCBsaW5lbGVuLCA0KTsKKworCWxlbiA9IDA7CisJZm9yIChuID0gMDsgbiA8IDQ7IG4rKykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSBsaW5lbGVuW25dOworCQlsZW4gPDw9IDQ7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworCQkJbGVuICs9IGMgLSAnMCc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKKwkJCWxlbiArPSBjIC0gJ2EnICsgMTA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHsKKwkJCWxlbiArPSBjIC0gJ0EnICsgMTA7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoInByb3RvY29sIGVycm9yOiBiYWQgbGluZSBsZW5ndGggY2hhcmFjdGVyIik7CisJfQorCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKwlsZW4gLT0gNDsKKwlpZiAobGVuID49IHNpemUpCisJCWRpZSgicHJvdG9jb2wgZXJyb3I6IGJhZCBsaW5lIGxlbmd0aCAlZCIsIGxlbik7CisJc2FmZV9yZWFkKGZkLCBidWZmZXIsIGxlbik7CisJYnVmZmVyW2xlbl0gPSAwOworCXJldHVybiBsZW47Cit9CmRpZmYgLS1naXQgYS9wa3QtbGluZS5oIGIvcGt0LWxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQwY2JlCi0tLSAvZGV2L251bGwKKysrIGIvcGt0LWxpbmUuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIFBLVExJTkVfSAorI2RlZmluZSBQS1RMSU5FX0gKKworLyoKKyAqIFNpbGx5IHBhY2tldGl6ZWQgbGluZSB3cml0aW5nIGludGVyZmFjZQorICovCit2b2lkIHBhY2tldF9mbHVzaChpbnQgZmQpOwordm9pZCBwYWNrZXRfd3JpdGUoaW50IGZkLCBjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisKK2ludCBwYWNrZXRfcmVhZF9saW5lKGludCBmZCwgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBzaXplKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wcGMvc2hhMS5jIGIvcHBjL3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE0ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvcHBjL3NoYTEuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICoKKyAqIFRoaXMgdmVyc2lvbiBhc3N1bWVzIHdlIGFyZSBydW5uaW5nIG9uIGEgYmlnLWVuZGlhbiBtYWNoaW5lLgorICogSXQgY2FsbHMgYW4gZXh0ZXJuYWwgc2hhMV9jb3JlKCkgdG8gcHJvY2VzcyBibG9ja3Mgb2YgNjQgYnl0ZXMuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNoYTEuaCIKKworZXh0ZXJuIHZvaWQgc2hhMV9jb3JlKHVpbnQzMl90ICpoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbmJsb2Nrcyk7CisKK2ludCBTSEExX0luaXQoU0hBX0NUWCAqYykKK3sKKwljLT5oYXNoWzBdID0gMHg2NzQ1MjMwMTsKKwljLT5oYXNoWzFdID0gMHhFRkNEQUI4OTsKKwljLT5oYXNoWzJdID0gMHg5OEJBRENGRTsKKwljLT5oYXNoWzNdID0gMHgxMDMyNTQ3NjsKKwljLT5oYXNoWzRdID0gMHhDM0QyRTFGMDsKKwljLT5sZW4gPSAwOworCWMtPmNudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBTSEExX1VwZGF0ZShTSEFfQ1RYICpjLCBjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl1bnNpZ25lZCBsb25nIG5iOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBwdHI7CisKKwljLT5sZW4gKz0gbiA8PCAzOworCXdoaWxlIChuICE9IDApIHsKKwkJaWYgKGMtPmNudCB8fCBuIDwgNjQpIHsKKwkJCW5iID0gNjQgLSBjLT5jbnQ7CisJCQlpZiAobmIgPiBuKQorCQkJCW5iID0gbjsKKwkJCW1lbWNweSgmYy0+YnVmLmJbYy0+Y250XSwgcCwgbmIpOworCQkJaWYgKChjLT5jbnQgKz0gbmIpID09IDY0KSB7CisJCQkJc2hhMV9jb3JlKGMtPmhhc2gsIGMtPmJ1Zi5iLCAxKTsKKwkJCQljLT5jbnQgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJbmIgPSBuID4+IDY7CisJCQlzaGExX2NvcmUoYy0+aGFzaCwgcCwgbmIpOworCQkJbmIgPDw9IDY7CisJCX0KKwkJbiAtPSBuYjsKKwkJcCArPSBuYjsKKwl9CisJcmV0dXJuIDA7Cit9CQorCitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKQoreworCXVuc2lnbmVkIGludCBjbnQgPSBjLT5jbnQ7CisKKwljLT5idWYuYltjbnQrK10gPSAweDgwOworCWlmIChjbnQgPiA1NikgeworCQlpZiAoY250IDwgNjQpCisJCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDY0IC0gY250KTsKKwkJc2hhMV9jb3JlKGMtPmhhc2gsIGMtPmJ1Zi5iLCAxKTsKKwkJY250ID0gMDsKKwl9CisJaWYgKGNudCA8IDU2KQorCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDU2IC0gY250KTsKKwljLT5idWYubFs3XSA9IGMtPmxlbjsKKwlzaGExX2NvcmUoYy0+aGFzaCwgYy0+YnVmLmIsIDEpOworCW1lbWNweShoYXNoLCBjLT5oYXNoLCAyMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcGMvc2hhMS5oIGIvcHBjL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M1MWFhCi0tLSAvZGV2L251bGwKKysrIGIvcHBjL3NoYTEuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHNoYV9jb250ZXh0IHsKKwl1aW50MzJfdCBoYXNoWzVdOworCXVpbnQzMl90IGNudDsKKwl1aW50NjRfdCBsZW47CisJdW5pb24geworCQl1bnNpZ25lZCBjaGFyIGJbNjRdOworCQl1aW50NjRfdCBsWzhdOworCX0gYnVmOworfSBTSEFfQ1RYOworCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpOworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbik7CitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKTsKZGlmZiAtLWdpdCBhL3BwYy9zaGExcHBjLlMgYi9wcGMvc2hhMXBwYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTYxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wcGMvc2hhMXBwYy5TCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gZm9yIFBvd2VyUEMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisjZGVmaW5lIEZTCTgwCisKKy8qCisgKiBXZSByb2xsIHRoZSByZWdpc3RlcnMgZm9yIFQsIEEsIEIsIEMsIEQsIEUgYXJvdW5kIG9uIGVhY2gKKyAqIGl0ZXJhdGlvbjsgVCBvbiBpdGVyYXRpb24gdCBpcyBBIG9uIGl0ZXJhdGlvbiB0KzEsIGFuZCBzbyBvbi4KKyAqIFdlIHVzZSByZWdpc3RlcnMgNyAtIDEyIGZvciB0aGlzLgorICovCisjZGVmaW5lIFJUKHQpCSgoKCh0KSs1KSU2KSs3KQorI2RlZmluZSBSQSh0KQkoKCgodCkrNCklNikrNykKKyNkZWZpbmUgUkIodCkJKCgoKHQpKzMpJTYpKzcpCisjZGVmaW5lIFJDKHQpCSgoKCh0KSsyKSU2KSs3KQorI2RlZmluZSBSRCh0KQkoKCgodCkrMSklNikrNykKKyNkZWZpbmUgUkUodCkJKCgoKHQpKzApJTYpKzcpCisKKy8qIFdlIHVzZSByZWdpc3RlcnMgMTYgLSAzMSBmb3IgdGhlIFcgdmFsdWVzICovCisjZGVmaW5lIFcodCkJKCgodCklMTYpKzE2KQorCisjZGVmaW5lIFNURVBEMCh0KQkJCQlcCisJYW5kCSVyNixSQih0KSxSQyh0KTsJCVwKKwlhbmRjCSVyMCxSRCh0KSxSQih0KTsJCVwKKwlyb3Rsd2kJUlQodCksUkEodCksNTsJCQlcCisJcm90bHdpCVJCKHQpLFJCKHQpLDMwOwkJCVwKKwlvcgklcjYsJXI2LCVyMDsJCQlcCisJYWRkCSVyMCxSRSh0KSwlcjE1OwkJCVwKKwlhZGQJUlQodCksUlQodCksJXI2OwkJXAorCWFkZAklcjAsJXIwLFcodCk7CQkJXAorCWFkZAlSVCh0KSxSVCh0KSwlcjAKKworI2RlZmluZSBTVEVQRDEodCkJCQkJXAorCXhvcgklcjYsUkIodCksUkModCk7CQlcCisJcm90bHdpCVJUKHQpLFJBKHQpLDU7CQkJXAorCXJvdGx3aQlSQih0KSxSQih0KSwzMDsJCQlcCisJeG9yCSVyNiwlcjYsUkQodCk7CQkJXAorCWFkZAklcjAsUkUodCksJXIxNTsJCQlcCisJYWRkCVJUKHQpLFJUKHQpLCVyNjsJCVwKKwlhZGQJJXIwLCVyMCxXKHQpOwkJCVwKKwlhZGQJUlQodCksUlQodCksJXIwCisKKyNkZWZpbmUgU1RFUEQyKHQpCQkJCVwKKwlhbmQJJXI2LFJCKHQpLFJDKHQpOwkJXAorCWFuZAklcjAsUkIodCksUkQodCk7CQlcCisJcm90bHdpCVJUKHQpLFJBKHQpLDU7CQkJXAorCXJvdGx3aQlSQih0KSxSQih0KSwzMDsJCQlcCisJb3IJJXI2LCVyNiwlcjA7CQkJXAorCWFuZAklcjAsUkModCksUkQodCk7CQlcCisJb3IJJXI2LCVyNiwlcjA7CQkJXAorCWFkZAklcjAsUkUodCksJXIxNTsJCQlcCisJYWRkCVJUKHQpLFJUKHQpLCVyNjsJCVwKKwlhZGQJJXIwLCVyMCxXKHQpOwkJCVwKKwlhZGQJUlQodCksUlQodCksJXIwCisKKyNkZWZpbmUgTE9BRFcodCkJCQkJXAorCWx3eglXKHQpLCh0KSo0KCVyNCkKKworI2RlZmluZSBVUERBVEVXKHQpCQkJCVwKKwl4b3IJJXIwLFcoKHQpLTMpLFcoKHQpLTgpOwkJXAorCXhvcglXKHQpLFcoKHQpLTE2KSxXKCh0KS0xNCk7CVwKKwl4b3IJVyh0KSxXKHQpLCVyMDsJCQlcCisJcm90bHdpCVcodCksVyh0KSwxCisKKyNkZWZpbmUgU1RFUDBMRDQodCkJCQkJXAorCVNURVBEMCh0KTsgICBMT0FEVygodCkrNCk7CQlcCisJU1RFUEQwKCh0KSsxKTsgTE9BRFcoKHQpKzUpOwkJXAorCVNURVBEMCgodCkrMik7IExPQURXKCh0KSs2KTsJCVwKKwlTVEVQRDAoKHQpKzMpOyBMT0FEVygodCkrNykKKworI2RlZmluZSBTVEVQVVA0KHQsIGZuKQkJCQlcCisJU1RFUCMjZm4odCk7ICAgVVBEQVRFVygodCkrNCk7CQlcCisJU1RFUCMjZm4oKHQpKzEpOyBVUERBVEVXKCh0KSs1KTsJXAorCVNURVAjI2ZuKCh0KSsyKTsgVVBEQVRFVygodCkrNik7CVwKKwlTVEVQIyNmbigodCkrMyk7IFVQREFURVcoKHQpKzcpCisKKyNkZWZpbmUgU1RFUFVQMjAodCwgZm4pCQkJCVwKKwlTVEVQVVA0KHQsIGZuKTsJCQkJXAorCVNURVBVUDQoKHQpKzQsIGZuKTsJCQlcCisJU1RFUFVQNCgodCkrOCwgZm4pOwkJCVwKKwlTVEVQVVA0KCh0KSsxMiwgZm4pOwkJCVwKKwlTVEVQVVA0KCh0KSsxNiwgZm4pCisKKwkuZ2xvYmwJc2hhMV9jb3JlCitzaGExX2NvcmU6CisJc3R3dQklcjEsLUZTKCVyMSkKKwlzdHcJJXIxNSxGUy02OCglcjEpCisJc3R3CSVyMTYsRlMtNjQoJXIxKQorCXN0dwklcjE3LEZTLTYwKCVyMSkKKwlzdHcJJXIxOCxGUy01NiglcjEpCisJc3R3CSVyMTksRlMtNTIoJXIxKQorCXN0dwklcjIwLEZTLTQ4KCVyMSkKKwlzdHcJJXIyMSxGUy00NCglcjEpCisJc3R3CSVyMjIsRlMtNDAoJXIxKQorCXN0dwklcjIzLEZTLTM2KCVyMSkKKwlzdHcJJXIyNCxGUy0zMiglcjEpCisJc3R3CSVyMjUsRlMtMjgoJXIxKQorCXN0dwklcjI2LEZTLTI0KCVyMSkKKwlzdHcJJXIyNyxGUy0yMCglcjEpCisJc3R3CSVyMjgsRlMtMTYoJXIxKQorCXN0dwklcjI5LEZTLTEyKCVyMSkKKwlzdHcJJXIzMCxGUy04KCVyMSkKKwlzdHcJJXIzMSxGUy00KCVyMSkKKworCS8qIExvYWQgdXAgQSAtIEUgKi8KKwlsd3oJUkEoMCksMCglcjMpCS8qIEEgKi8KKwlsd3oJUkIoMCksNCglcjMpCS8qIEIgKi8KKwlsd3oJUkMoMCksOCglcjMpCS8qIEMgKi8KKwlsd3oJUkQoMCksMTIoJXIzKQkvKiBEICovCisJbHd6CVJFKDApLDE2KCVyMykJLyogRSAqLworCisJbXRjdHIJJXI1CisKKzE6CUxPQURXKDApCisJTE9BRFcoMSkKKwlMT0FEVygyKQorCUxPQURXKDMpCisKKwlsaXMJJXIxNSwweDVhODIJLyogSzAtMTkgKi8KKwlvcmkJJXIxNSwlcjE1LDB4Nzk5OQorCVNURVAwTEQ0KDApCisJU1RFUDBMRDQoNCkKKwlTVEVQMExENCg4KQorCVNURVBVUDQoMTIsIEQwKQorCVNURVBVUDQoMTYsIEQwKQorCisJbGlzCSVyMTUsMHg2ZWQ5CS8qIEsyMC0zOSAqLworCW9yaQklcjE1LCVyMTUsMHhlYmExCisJU1RFUFVQMjAoMjAsIEQxKQorCisJbGlzCSVyMTUsMHg4ZjFiCS8qIEs0MC01OSAqLworCW9yaQklcjE1LCVyMTUsMHhiY2RjCisJU1RFUFVQMjAoNDAsIEQyKQorCisJbGlzCSVyMTUsMHhjYTYyCS8qIEs2MC03OSAqLworCW9yaQklcjE1LCVyMTUsMHhjMWQ2CisJU1RFUFVQNCg2MCwgRDEpCisJU1RFUFVQNCg2NCwgRDEpCisJU1RFUFVQNCg2OCwgRDEpCisJU1RFUFVQNCg3MiwgRDEpCisJU1RFUEQxKDc2KQorCVNURVBEMSg3NykKKwlTVEVQRDEoNzgpCisJU1RFUEQxKDc5KQorCisJbHd6CSVyMjAsMTYoJXIzKQorCWx3egklcjE5LDEyKCVyMykKKwlsd3oJJXIxOCw4KCVyMykKKwlsd3oJJXIxNyw0KCVyMykKKwlsd3oJJXIxNiwwKCVyMykKKwlhZGQJJXIyMCxSRSg4MCksJXIyMAorCWFkZAlSRCgwKSxSRCg4MCksJXIxOQorCWFkZAlSQygwKSxSQyg4MCksJXIxOAorCWFkZAlSQigwKSxSQig4MCksJXIxNworCWFkZAlSQSgwKSxSQSg4MCksJXIxNgorCW1yCVJFKDApLCVyMjAKKwlzdHcJUkEoMCksMCglcjMpCisJc3R3CVJCKDApLDQoJXIzKQorCXN0dwlSQygwKSw4KCVyMykKKwlzdHcJUkQoMCksMTIoJXIzKQorCXN0dwlSRSgwKSwxNiglcjMpCisKKwlhZGRpCSVyNCwlcjQsNjQKKwliZG56CTFiCisKKwlsd3oJJXIxNSxGUy02OCglcjEpCisJbHd6CSVyMTYsRlMtNjQoJXIxKQorCWx3egklcjE3LEZTLTYwKCVyMSkKKwlsd3oJJXIxOCxGUy01NiglcjEpCisJbHd6CSVyMTksRlMtNTIoJXIxKQorCWx3egklcjIwLEZTLTQ4KCVyMSkKKwlsd3oJJXIyMSxGUy00NCglcjEpCisJbHd6CSVyMjIsRlMtNDAoJXIxKQorCWx3egklcjIzLEZTLTM2KCVyMSkKKwlsd3oJJXIyNCxGUy0zMiglcjEpCisJbHd6CSVyMjUsRlMtMjgoJXIxKQorCWx3egklcjI2LEZTLTI0KCVyMSkKKwlsd3oJJXIyNyxGUy0yMCglcjEpCisJbHd6CSVyMjgsRlMtMTYoJXIxKQorCWx3egklcjI5LEZTLTEyKCVyMSkKKwlsd3oJJXIzMCxGUy04KCVyMSkKKwlsd3oJJXIzMSxGUy00KCVyMSkKKwlhZGRpCSVyMSwlcjEsRlMKKwlibHIKZGlmZiAtLWdpdCBhL3BydW5lLXBhY2tlZC5jIGIvcHJ1bmUtcGFja2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0YjA5NwotLS0gL2Rldi9udWxsCisrKyBiL3BydW5lLXBhY2tlZC5jCkBAIC0wLDAgKzEsNzkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBwcnVuZV9wYWNrZWRfdXNhZ2VbXSA9CisiZ2l0LXBydW5lLXBhY2tlZCBbLW5dIjsKKworc3RhdGljIGludCBkcnlydW47CisKK3N0YXRpYyB2b2lkIHBydW5lX2RpcihpbnQgaSwgRElSICpkaXIsIGNoYXIgKnBhdGhuYW1lLCBpbnQgbGVuKQoreworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgaGV4WzQwXTsKKworCXNwcmludGYoaGV4LCAiJTAyeCIsIGkpOworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJaWYgKHN0cmxlbihkZS0+ZF9uYW1lKSAhPSAzOCkKKwkJCWNvbnRpbnVlOworCQltZW1jcHkoaGV4KzIsIGRlLT5kX25hbWUsIDM4KTsKKwkJaWYgKGdldF9zaGExX2hleChoZXgsIHNoYTEpKQorCQkJY29udGludWU7CisJCWlmICghaGFzX3NoYTFfcGFjayhzaGExKSkKKwkJCWNvbnRpbnVlOworCQltZW1jcHkocGF0aG5hbWUgKyBsZW4sIGRlLT5kX25hbWUsIDM4KTsKKwkJaWYgKGRyeXJ1bikKKwkJCXByaW50Zigicm0gLWYgJXNcbiIsIHBhdGhuYW1lKTsKKwkJZWxzZSBpZiAodW5saW5rKHBhdGhuYW1lKSA8IDApCisJCQllcnJvcigidW5hYmxlIHRvIHVubGluayAlcyIsIHBhdGhuYW1lKTsKKwl9CisJcGF0aG5hbWVbbGVuXSA9IDA7CisJcm1kaXIocGF0aG5hbWUpOworfQorCitzdGF0aWMgdm9pZCBwcnVuZV9wYWNrZWRfb2JqZWN0cyh2b2lkKQoreworCWludCBpOworCXN0YXRpYyBjaGFyIHBhdGhuYW1lW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCWludCBsZW4gPSBzdHJsZW4oZGlyKTsKKworCWlmIChsZW4gPiBQQVRIX01BWCAtIDQyKQorCQlkaWUoImltcG9zc2libGUgb2JqZWN0IGRpcmVjdG9yeSIpOworCW1lbWNweShwYXRobmFtZSwgZGlyLCBsZW4pOworCWlmIChsZW4gJiYgcGF0aG5hbWVbbGVuLTFdICE9ICcvJykKKwkJcGF0aG5hbWVbbGVuKytdID0gJy8nOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlESVIgKmQ7CisKKwkJc3ByaW50ZihwYXRobmFtZSArIGxlbiwgIiUwMngvIiwgaSk7CisJCWQgPSBvcGVuZGlyKHBhdGhuYW1lKTsKKwkJaWYgKCFkKQorCQkJY29udGludWU7CisJCXBydW5lX2RpcihpLCBkLCBwYXRobmFtZSwgbGVuICsgMyk7CisJCWNsb3NlZGlyKGQpOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkKKwkJCQlkcnlydW4gPSAxOworCQkJZWxzZQorCQkJCXVzYWdlKHBydW5lX3BhY2tlZF91c2FnZSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBIYW5kbGUgYXJndW1lbnRzIGhlcmUgLi4gKi8KKwkJdXNhZ2UocHJ1bmVfcGFja2VkX3VzYWdlKTsKKwl9CisJc3luYygpOworCXBydW5lX3BhY2tlZF9vYmplY3RzKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9xdW90ZS5jIGIvcXVvdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjc5MmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcXVvdGUuYwpAQCAtMCwwICsxLDI2NiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworLyogSGVscCB0byBjb3B5IHRoZSB0aGluZyBwcm9wZXJseSBxdW90ZWQgZm9yIHRoZSBzaGVsbCBzYWZldHkuCisgKiBhbnkgc2luZ2xlIHF1b3RlIGlzIHJlcGxhY2VkIHdpdGggJ1wnJywgYW55IGV4Y2xhbWF0aW9uIHBvaW50CisgKiBpcyByZXBsYWNlZCB3aXRoICdcIScsIGFuZCB0aGUgd2hvbGUgdGhpbmcgaXMgZW5jbG9zZWQgaW4gYQorICoKKyAqIEUuZy4KKyAqICBvcmlnaW5hbCAgICAgc3FfcXVvdGUgICAgIHJlc3VsdAorICogIG5hbWUgICAgID09PiBuYW1lICAgICAgPT0+ICduYW1lJworICogIGEgYiAgICAgID09PiBhIGIgICAgICAgPT0+ICdhIGInCisgKiAgYSdiICAgICAgPT0+IGEnXCcnYiAgICA9PT4gJ2EnXCcnYicKKyAqICBhIWIgICAgICA9PT4gYSdcISdiICAgID09PiAnYSdcISdiJworICovCisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKHgpICggKCsrbGVuIDwgbikgJiYgKCpicCsrID0gKHgpKSApCisKK3N0YXRpYyBpbmxpbmUgaW50IG5lZWRfYnNfcXVvdGUoY2hhciBjKQoreworCXJldHVybiAoYyA9PSAnXCcnIHx8IGMgPT0gJyEnKTsKK30KKworc2l6ZV90IHNxX3F1b3RlX2J1ZihjaGFyICpkc3QsIHNpemVfdCBuLCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciBjOworCWNoYXIgKmJwID0gZHN0OworCXNpemVfdCBsZW4gPSAwOworCisJRU1JVCgnXCcnKTsKKwl3aGlsZSAoKGMgPSAqc3JjKyspKSB7CisJCWlmIChuZWVkX2JzX3F1b3RlKGMpKSB7CisJCQlFTUlUKCdcJycpOworCQkJRU1JVCgnXFwnKTsKKwkJCUVNSVQoYyk7CisJCQlFTUlUKCdcJycpOworCQl9IGVsc2UgeworCQkJRU1JVChjKTsKKwkJfQorCX0KKwlFTUlUKCdcJycpOworCisJaWYgKCBuICkKKwkJKmJwID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK2NoYXIgKnNxX3F1b3RlKGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICpidWY7CisJc2l6ZV90IGNudDsKKworCWNudCA9IHNxX3F1b3RlX2J1ZihOVUxMLCAwLCBzcmMpICsgMTsKKwlidWYgPSB4bWFsbG9jKGNudCk7CisJc3FfcXVvdGVfYnVmKGJ1ZiwgY250LCBzcmMpOworCisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqc3FfZGVxdW90ZShjaGFyICphcmcpCit7CisJY2hhciAqZHN0ID0gYXJnOworCWNoYXIgKnNyYyA9IGFyZzsKKwljaGFyIGM7CisKKwlpZiAoKnNyYyAhPSAnXCcnKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKDs7KSB7CisJCWMgPSAqKytzcmM7CisJCWlmICghYykKKwkJCXJldHVybiBOVUxMOworCQlpZiAoYyAhPSAnXCcnKSB7CisJCQkqZHN0KysgPSBjOworCQkJY29udGludWU7CisJCX0KKwkJLyogV2Ugc3RlcHBlZCBvdXQgb2Ygc3EgKi8KKwkJc3dpdGNoICgqKytzcmMpIHsKKwkJY2FzZSAnXDAnOgorCQkJKmRzdCA9IDA7CisJCQlyZXR1cm4gYXJnOworCQljYXNlICdcXCc6CisJCQljID0gKisrc3JjOworCQkJaWYgKG5lZWRfYnNfcXVvdGUoYykgJiYgKisrc3JjID09ICdcJycpIHsKKwkJCQkqZHN0KysgPSBjOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkvKiBGYWxsdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDLXN0eWxlIG5hbWUgcXVvdGluZy4KKyAqCisgKiBEb2VzIG9uZSBvZiB0aHJlZSB0aGluZ3M6CisgKgorICogKDEpIGlmIG91dGJ1ZiBhbmQgb3V0ZnAgYXJlIGJvdGggTlVMTCwgaW5zcGVjdCB0aGUgaW5wdXQgbmFtZSBhbmQKKyAqICAgICBjb3VudHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBuZWVkZWQgdG8gaG9sZCBjX3N0eWxlCisgKiAgICAgcXVvdGVkIHZlcnNpb24gb2YgbmFtZSwgY291bnRpbmcgdGhlIGRvdWJsZSBxdW90ZXMgYXJvdW5kCisgKiAgICAgaXQgYnV0IG5vdCB0ZXJtaW5hdGluZyBOVUwsIGFuZCByZXR1cm5zIGl0LiAgSG93ZXZlciwgaWYgbmFtZQorICogICAgIGRvZXMgbm90IG5lZWQgY19zdHlsZSBxdW90aW5nLCBpdCByZXR1cm5zIDAuCisgKgorICogKDIpIGlmIG91dGJ1ZiBpcyBub3QgTlVMTCwgaXQgbXVzdCBwb2ludCBhdCBhIGJ1ZmZlciBsYXJnZSBlbm91Z2gKKyAqICAgICB0byBob2xkIHRoZSBjX3N0eWxlIHF1b3RlZCB2ZXJzaW9uIG9mIG5hbWUsIGVuY2xvc2luZyBkb3VibGUKKyAqICAgICBxdW90ZXMsIGFuZCB0ZXJtaW5hdGluZyBOVUwuICBGaWxscyBvdXRidWYgd2l0aCBjX3N0eWxlIHF1b3RlZAorICogICAgIHZlcnNpb24gb2YgbmFtZSBlbmNsb3NlZCBpbiBkb3VibGUtcXVvdGUgcGFpci4gIFJldHVybiB2YWx1ZQorICogICAgIGlzIHVuZGVmaW5lZC4KKyAqCisgKiAoMykgaWYgb3V0ZnAgaXMgbm90IE5VTEwsIG91dHB1dHMgY19zdHlsZSBxdW90ZWQgdmVyc2lvbiBvZiBuYW1lLAorICogICAgIGJ1dCBub3QgZW5jbG9zZWQgaW4gZG91YmxlLXF1b3RlIHBhaXIuICBSZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLgorICovCisKK3N0YXRpYyBpbnQgcXVvdGVfY19zdHlsZV9jb3VudGVkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSBjaGFyICpvdXRidWYsIEZJTEUgKm91dGZwLCBpbnQgbm9fZHEpCit7CisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKGMpIFwKKwkob3V0YnVmID8gKCpvdXRidWYrKyA9IChjKSkgOiBvdXRmcCA/IGZwdXRjKGMsIG91dGZwKSA6IChjb3VudCsrKSkKKworI2RlZmluZSBFTUlUUSgpIEVNSVQoJ1xcJykKKworCWNvbnN0IGNoYXIgKnNwOworCWludCBjaCwgY291bnQgPSAwLCBuZWVkcXVvdGUgPSAwOworCisJaWYgKCFub19kcSkKKwkJRU1JVCgnIicpOworCWZvciAoc3AgPSBuYW1lOyBzcCA8IG5hbWUgKyBuYW1lbGVuOyBzcCsrKSB7CisJCWNoID0gKnNwOworCQlpZiAoIWNoKQorCQkJYnJlYWs7CisJCWlmICgoY2ggPCAnICcpIHx8IChjaCA9PSAnIicpIHx8IChjaCA9PSAnXFwnKSB8fAorCQkgICAgKGNoID09IDAxNzcpKSB7CisJCQluZWVkcXVvdGUgPSAxOworCQkJc3dpdGNoIChjaCkgeworCQkJY2FzZSAnXGEnOiBFTUlUUSgpOyBjaCA9ICdhJzsgYnJlYWs7CisJCQljYXNlICdcYic6IEVNSVRRKCk7IGNoID0gJ2InOyBicmVhazsKKwkJCWNhc2UgJ1xmJzogRU1JVFEoKTsgY2ggPSAnZic7IGJyZWFrOworCQkJY2FzZSAnXG4nOiBFTUlUUSgpOyBjaCA9ICduJzsgYnJlYWs7CisJCQljYXNlICdccic6IEVNSVRRKCk7IGNoID0gJ3InOyBicmVhazsKKwkJCWNhc2UgJ1x0JzogRU1JVFEoKTsgY2ggPSAndCc7IGJyZWFrOworCQkJY2FzZSAnXHYnOiBFTUlUUSgpOyBjaCA9ICd2JzsgYnJlYWs7CisKKwkJCWNhc2UgJ1xcJzogLyogZmFsbHRocnUgKi8KKwkJCWNhc2UgJyInOiBFTUlUUSgpOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogb2N0YWwgKi8KKwkJCQlFTUlUUSgpOworCQkJCUVNSVQoKChjaCA+PiA2KSAmIDAzKSArICcwJyk7CisJCQkJRU1JVCgoKGNoID4+IDMpICYgMDcpICsgJzAnKTsKKwkJCQljaCA9IChjaCAmIDA3KSArICcwJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlFTUlUKGNoKTsKKwl9CisJaWYgKCFub19kcSkKKwkJRU1JVCgnIicpOworCWlmIChvdXRidWYpCisJCSpvdXRidWYgPSAwOworCisJcmV0dXJuIG5lZWRxdW90ZSA/IGNvdW50IDogMDsKK30KKworaW50IHF1b3RlX2Nfc3R5bGUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqb3V0YnVmLCBGSUxFICpvdXRmcCwgaW50IG5vX2RxKQoreworCWludCBjbnQgPSBzdHJsZW4obmFtZSk7CisJcmV0dXJuIHF1b3RlX2Nfc3R5bGVfY291bnRlZChuYW1lLCBjbnQsIG91dGJ1Ziwgb3V0ZnAsIG5vX2RxKTsKK30KKworLyoKKyAqIEMtc3R5bGUgbmFtZSB1bnF1b3RpbmcuCisgKgorICogUXVvdGVkIHNob3VsZCBwb2ludCBhdCB0aGUgb3BlbmluZyBkb3VibGUgcXVvdGUuICBSZXR1cm5zCisgKiBhbiBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaG9sZHMgdW5xdW90ZWQgbmFtZSwgd2hpY2ggdGhlIGNhbGxlcgorICogc2hvdWxkIGZyZWUgd2hlbiBkb25lLiAgVXBkYXRlcyBlbmRwIHBvaW50ZXIgdG8gcG9pbnQgYXQKKyAqIG9uZSBwYXN0IHRoZSBlbmRpbmcgZG91YmxlIHF1b3RlIGlmIGdpdmVuLgorICovCisKK2NoYXIgKnVucXVvdGVfY19zdHlsZShjb25zdCBjaGFyICpxdW90ZWQsIGNvbnN0IGNoYXIgKiplbmRwKQoreworCWNvbnN0IGNoYXIgKnNwOworCWNoYXIgKm5hbWUgPSBOVUxMLCAqb3V0cCA9IE5VTEw7CisJaW50IGNvdW50ID0gMCwgY2gsIGFjOworCisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKGMpIChvdXRwID8gKCpvdXRwKysgPSAoYykpIDogKGNvdW50KyspKQorCisJaWYgKCpxdW90ZWQrKyAhPSAnIicpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKDEpIHsKKwkJLyogZmlyc3QgcGFzcyBjb3VudHMgYW5kIGFsbG9jYXRlcywgc2Vjb25kIHBhc3MgZmlsbHMgKi8KKwkJZm9yIChzcCA9IHF1b3RlZDsgKGNoID0gKnNwKyspICE9ICciJzsgKSB7CisJCQlpZiAoY2ggPT0gJ1xcJykgeworCQkJCXN3aXRjaCAoY2ggPSAqc3ArKykgeworCQkJCWNhc2UgJ2EnOiBjaCA9ICdcYSc7IGJyZWFrOworCQkJCWNhc2UgJ2InOiBjaCA9ICdcYic7IGJyZWFrOworCQkJCWNhc2UgJ2YnOiBjaCA9ICdcZic7IGJyZWFrOworCQkJCWNhc2UgJ24nOiBjaCA9ICdcbic7IGJyZWFrOworCQkJCWNhc2UgJ3InOiBjaCA9ICdccic7IGJyZWFrOworCQkJCWNhc2UgJ3QnOiBjaCA9ICdcdCc7IGJyZWFrOworCQkJCWNhc2UgJ3YnOiBjaCA9ICdcdic7IGJyZWFrOworCisJCQkJY2FzZSAnXFwnOiBjYXNlICciJzoKKwkJCQkJYnJlYWs7IC8qIHZlcmJhdGltICovCisKKwkJCQljYXNlICcwJy4uLic3JzoKKwkJCQkJLyogb2N0YWwgKi8KKwkJCQkJYWMgPSAoKGNoIC0gJzAnKSA8PCA2KTsKKwkJCQkJaWYgKChjaCA9ICpzcCsrKSA8ICcwJyB8fCAnNycgPCBjaCkKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQlhYyB8PSAoKGNoIC0gJzAnKSA8PCAzKTsKKwkJCQkJaWYgKChjaCA9ICpzcCsrKSA8ICcwJyB8fCAnNycgPCBjaCkKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQlhYyB8PSAoY2ggLSAnMCcpOworCQkJCQljaCA9IGFjOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTlVMTDsgLyogbWFsZm9ybWVkICovCisJCQkJfQorCQkJfQorCQkJRU1JVChjaCk7CisJCX0KKworCQlpZiAobmFtZSkgeworCQkJKm91dHAgPSAwOworCQkJaWYgKGVuZHApCisJCQkJKmVuZHAgPSBzcDsKKwkJCXJldHVybiBuYW1lOworCQl9CisJCW91dHAgPSBuYW1lID0geG1hbGxvYyhjb3VudCArIDEpOworCX0KK30KKwordm9pZCB3cml0ZV9uYW1lX3F1b3RlZChjb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHF1b3RlLCBGSUxFICpvdXQpCit7CisJaW50IG5lZWRxdW90ZTsKKworCWlmICghcXVvdGUpIHsKKwlub19xdW90ZToKKwkJaWYgKHByZWZpeF9sZW4pCisJCQlmcHJpbnRmKG91dCwgIiUuKnMiLCBwcmVmaXhfbGVuLCBwcmVmaXgpOworCQlmcHV0cyhuYW1lLCBvdXQpOworCQlyZXR1cm47CisJfQorCisJbmVlZHF1b3RlID0gMDsKKwlpZiAocHJlZml4X2xlbikKKwkJbmVlZHF1b3RlID0gcXVvdGVfY19zdHlsZV9jb3VudGVkKHByZWZpeCwgcHJlZml4X2xlbiwKKwkJCQkJCSAgTlVMTCwgTlVMTCwgMCk7CisJaWYgKCFuZWVkcXVvdGUpCisJCW5lZWRxdW90ZSA9IHF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgTlVMTCwgMCk7CisJaWYgKG5lZWRxdW90ZSkgeworCQlmcHV0YygnIicsIG91dCk7CisJCWlmIChwcmVmaXhfbGVuKQorCQkJcXVvdGVfY19zdHlsZV9jb3VudGVkKHByZWZpeCwgcHJlZml4X2xlbiwKKwkJCQkJICAgICAgTlVMTCwgb3V0LCAxKTsKKwkJcXVvdGVfY19zdHlsZShuYW1lLCBOVUxMLCBvdXQsIDEpOworCQlmcHV0YygnIicsIG91dCk7CisJfQorCWVsc2UKKwkJZ290byBub19xdW90ZTsKK30KZGlmZiAtLWdpdCBhL3F1b3RlLmggYi9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWIzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9xdW90ZS5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgUVVPVEVfSAorI2RlZmluZSBRVU9URV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBIZWxwIHRvIGNvcHkgdGhlIHRoaW5nIHByb3Blcmx5IHF1b3RlZCBmb3IgdGhlIHNoZWxsIHNhZmV0eS4KKyAqIGFueSBzaW5nbGUgcXVvdGUgaXMgcmVwbGFjZWQgd2l0aCAnXCcnLCBhbnkgZXhjbGFtYXRpb24gcG9pbnQKKyAqIGlzIHJlcGxhY2VkIHdpdGggJ1whJywgYW5kIHRoZSB3aG9sZSB0aGluZyBpcyBlbmNsb3NlZCBpbiBhCisgKiBzaW5nbGUgcXVvdGUgcGFpci4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBwYXNzaW5nIHRoZSByZXN1bHQgdG8gc3lzdGVtKCkgYXMgYW4KKyAqIGFyZ3VtZW50OgorICoKKyAqIHNwcmludGYoY21kLCAiZm9vYmFyICVzICVzIiwgc3FfcXVvdGUoYXJnMCksIHNxX3F1b3RlKGFyZzEpKQorICoKKyAqIHdvdWxkIGJlIGFwcHJvcHJpYXRlLiAgSWYgdGhlIHN5c3RlbSgpIGlzIGdvaW5nIHRvIGNhbGwgc3NoIHRvCisgKiBydW4gdGhlIGNvbW1hbmQgb24gdGhlIG90aGVyIHNpZGU6CisgKgorICogc3ByaW50ZihjbWQsICJnaXQtZGlmZi10cmVlICVzICVzIiwgc3FfcXVvdGUoYXJnMCksIHNxX3F1b3RlKGFyZzEpKTsKKyAqIHNwcmludGYocmNtZCwgInNzaCAlcyAlcyIsIHNxX3F1b3RlKGhvc3QpLCBzcV9xdW90ZShjbWQpKTsKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGFib3ZlIGV4YW1wbGVzIGxlYWsgbWVtb3J5ISAgUmVtZW1iZXIgdG8gZnJlZSByZXN1bHQgZnJvbQorICogc3FfcXVvdGUoKSBpbiBhIHJlYWwgYXBwbGljYXRpb24uCisgKgorICogc3FfcXVvdGVfYnVmKCkgd3JpdGVzIHRvIGFuIGV4aXN0aW5nIGJ1ZmZlciBvZiBzcGVjaWZpZWQgc2l6ZTsgaXQKKyAqIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuCisgKiBleGNsdWRpbmcgdGhlIGZpbmFsIG51bGwgcmVnYXJkbGVzcyBvZiB0aGUgYnVmZmVyIHNpemUuCisgKi8KKworZXh0ZXJuIGNoYXIgKnNxX3F1b3RlKGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gc2l6ZV90IHNxX3F1b3RlX2J1ZihjaGFyICpkc3QsIHNpemVfdCBuLCBjb25zdCBjaGFyICpzcmMpOworCisvKiBUaGlzIHVud3JhcHMgd2hhdCBzcV9xdW90ZSgpIHByb2R1Y2VzIGluIHBsYWNlLCBidXQgcmV0dXJucworICogTlVMTCBpZiB0aGUgaW5wdXQgZG9lcyBub3QgbG9vayBsaWtlIHdoYXQgc3FfcXVvdGUgd291bGQgaGF2ZQorICogcHJvZHVjZWQuCisgKi8KK2V4dGVybiBjaGFyICpzcV9kZXF1b3RlKGNoYXIgKik7CisKK2V4dGVybiBpbnQgcXVvdGVfY19zdHlsZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICpvdXRidWYsIEZJTEUgKm91dGZwLAorCQkJIGludCBub2RxKTsKK2V4dGVybiBjaGFyICp1bnF1b3RlX2Nfc3R5bGUoY29uc3QgY2hhciAqcXVvdGVkLCBjb25zdCBjaGFyICoqZW5kcCk7CisKK2V4dGVybiB2b2lkIHdyaXRlX25hbWVfcXVvdGVkKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IHByZWZpeF9sZW4sCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgcXVvdGUsIEZJTEUgKm91dCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVhZC1jYWNoZS5jIGIvcmVhZC1jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTljNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkLWNhY2hlLmMKQEAgLTAsMCArMSw5NTAgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworLyogSW5kZXggZXh0ZW5zaW9ucy4KKyAqCisgKiBUaGUgZmlyc3QgbGV0dGVyIHNob3VsZCBiZSAnQScuLidaJyBmb3IgZXh0ZW5zaW9ucyB0aGF0IGFyZSBub3QKKyAqIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IG9wZXJhdGlvbiAoaS5lLiBvcHRpbWl6YXRpb24gZGF0YSkuCisgKiBXaGVuIG5ldyBleHRlbnNpb25zIGFyZSBhZGRlZCB0aGF0IF9uZWVkc18gdG8gYmUgdW5kZXJzdG9vZCBpbgorICogb3JkZXIgdG8gY29ycmVjdGx5IGludGVycHJldCB0aGUgaW5kZXggZmlsZSwgcGljayBjaGFyYWN0ZXIgdGhhdAorICogaXMgb3V0c2lkZSB0aGUgcmFuZ2UsIHRvIGNhdXNlIHRoZSByZWFkZXIgdG8gYWJvcnQuCisgKi8KKworI2RlZmluZSBDQUNIRV9FWFQocykgKCAoc1swXTw8MjQpfChzWzFdPDwxNil8KHNbMl08PDgpfChzWzNdKSApCisjZGVmaW5lIENBQ0hFX0VYVF9UUkVFIDB4NTQ1MjQ1NDUJLyogIlRSRUUiICovCisKK3N0cnVjdCBjYWNoZV9lbnRyeSAqKmFjdGl2ZV9jYWNoZSA9IE5VTEw7CitzdGF0aWMgdGltZV90IGluZGV4X2ZpbGVfdGltZXN0YW1wOwordW5zaWduZWQgaW50IGFjdGl2ZV9uciA9IDAsIGFjdGl2ZV9hbGxvYyA9IDAsIGFjdGl2ZV9jYWNoZV9jaGFuZ2VkID0gMDsKKworc3RydWN0IGNhY2hlX3RyZWUgKmFjdGl2ZV9jYWNoZV90cmVlID0gTlVMTDsKKworLyoKKyAqIFRoaXMgb25seSB1cGRhdGVzIHRoZSAibm9uLWNyaXRpY2FsIiBwYXJ0cyBvZiB0aGUgZGlyZWN0b3J5CisgKiBjYWNoZSwgaWUgdGhlIHBhcnRzIHRoYXQgYXJlbid0IHRyYWNrZWQgYnkgR0lULCBhbmQgb25seSB1c2VkCisgKiB0byB2YWxpZGF0ZSB0aGUgY2FjaGUuCisgKi8KK3ZvaWQgZmlsbF9zdGF0X2NhY2hlX2luZm8oc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCWNlLT5jZV9jdGltZS5zZWMgPSBodG9ubChzdC0+c3RfY3RpbWUpOworCWNlLT5jZV9tdGltZS5zZWMgPSBodG9ubChzdC0+c3RfbXRpbWUpOworI2lmZGVmIFVTRV9OU0VDCisJY2UtPmNlX2N0aW1lLm5zZWMgPSBodG9ubChzdC0+c3RfY3RpbS50dl9uc2VjKTsKKwljZS0+Y2VfbXRpbWUubnNlYyA9IGh0b25sKHN0LT5zdF9tdGltLnR2X25zZWMpOworI2VuZGlmCisJY2UtPmNlX2RldiA9IGh0b25sKHN0LT5zdF9kZXYpOworCWNlLT5jZV9pbm8gPSBodG9ubChzdC0+c3RfaW5vKTsKKwljZS0+Y2VfdWlkID0gaHRvbmwoc3QtPnN0X3VpZCk7CisJY2UtPmNlX2dpZCA9IGh0b25sKHN0LT5zdF9naWQpOworCWNlLT5jZV9zaXplID0gaHRvbmwoc3QtPnN0X3NpemUpOworCisJaWYgKGFzc3VtZV91bmNoYW5nZWQpCisJCWNlLT5jZV9mbGFncyB8PSBodG9ucyhDRV9WQUxJRCk7Cit9CisKK3N0YXRpYyBpbnQgY2VfY29tcGFyZV9kYXRhKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpbnQgbWF0Y2ggPSAtMTsKKwlpbnQgZmQgPSBvcGVuKGNlLT5uYW1lLCBPX1JET05MWSk7CisKKwlpZiAoZmQgPj0gMCkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoIWluZGV4X2ZkKHNoYTEsIGZkLCBzdCwgMCwgTlVMTCkpCisJCQltYXRjaCA9IG1lbWNtcChzaGExLCBjZS0+c2hhMSwgMjApOworCQljbG9zZShmZCk7CisJfQorCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIGludCBjZV9jb21wYXJlX2xpbmsoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgdW5zaWduZWQgbG9uZyBleHBlY3RlZF9zaXplKQoreworCWludCBtYXRjaCA9IC0xOworCWNoYXIgKnRhcmdldDsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNoYXIgdHlwZVsxMF07CisJaW50IGxlbjsKKworCXRhcmdldCA9IHhtYWxsb2MoZXhwZWN0ZWRfc2l6ZSk7CisJbGVuID0gcmVhZGxpbmsoY2UtPm5hbWUsIHRhcmdldCwgZXhwZWN0ZWRfc2l6ZSk7CisJaWYgKGxlbiAhPSBleHBlY3RlZF9zaXplKSB7CisJCWZyZWUodGFyZ2V0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlidWZmZXIgPSByZWFkX3NoYTFfZmlsZShjZS0+c2hhMSwgdHlwZSwgJnNpemUpOworCWlmICghYnVmZmVyKSB7CisJCWZyZWUodGFyZ2V0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc2l6ZSA9PSBleHBlY3RlZF9zaXplKQorCQltYXRjaCA9IG1lbWNtcChidWZmZXIsIHRhcmdldCwgc2l6ZSk7CisJZnJlZShidWZmZXIpOworCWZyZWUodGFyZ2V0KTsKKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyBpbnQgY2VfbW9kaWZpZWRfY2hlY2tfZnMoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCXN3aXRjaCAoc3QtPnN0X21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWlmIChjZV9jb21wYXJlX2RhdGEoY2UsIHN0KSkKKwkJCXJldHVybiBEQVRBX0NIQU5HRUQ7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKKwkJaWYgKGNlX2NvbXBhcmVfbGluayhjZSwgc3QtPnN0X3NpemUpKQorCQkJcmV0dXJuIERBVEFfQ0hBTkdFRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFRZUEVfQ0hBTkdFRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2VfbWF0Y2hfc3RhdF9iYXNpYyhzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisJdW5zaWduZWQgaW50IGNoYW5nZWQgPSAwOworCisJc3dpdGNoIChudG9obChjZS0+Y2VfbW9kZSkgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWNoYW5nZWQgfD0gIVNfSVNSRUcoc3QtPnN0X21vZGUpID8gVFlQRV9DSEFOR0VEIDogMDsKKwkJLyogV2UgY29uc2lkZXIgb25seSB0aGUgb3duZXIgeCBiaXQgdG8gYmUgcmVsZXZhbnQgZm9yCisJCSAqICJtb2RlIGNoYW5nZXMiCisJCSAqLworCQlpZiAodHJ1c3RfZXhlY3V0YWJsZV9iaXQgJiYKKwkJICAgICgwMTAwICYgKG50b2hsKGNlLT5jZV9tb2RlKSBeIHN0LT5zdF9tb2RlKSkpCisJCQljaGFuZ2VkIHw9IE1PREVfQ0hBTkdFRDsKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQljaGFuZ2VkIHw9ICFTX0lTTE5LKHN0LT5zdF9tb2RlKSA/IFRZUEVfQ0hBTkdFRCA6IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGNlX21vZGUgaXMgJW8iLCBudG9obChjZS0+Y2VfbW9kZSkpOworCX0KKwlpZiAoY2UtPmNlX210aW1lLnNlYyAhPSBodG9ubChzdC0+c3RfbXRpbWUpKQorCQljaGFuZ2VkIHw9IE1USU1FX0NIQU5HRUQ7CisJaWYgKGNlLT5jZV9jdGltZS5zZWMgIT0gaHRvbmwoc3QtPnN0X2N0aW1lKSkKKwkJY2hhbmdlZCB8PSBDVElNRV9DSEFOR0VEOworCisjaWZkZWYgVVNFX05TRUMKKwkvKgorCSAqIG5zZWMgc2VlbXMgdW5yZWxpYWJsZSAtIG5vdCBhbGwgZmlsZXN5c3RlbXMgc3VwcG9ydCBpdCwgc28KKwkgKiBhcyBsb25nIGFzIGl0IGlzIGluIHRoZSBpbm9kZSBjYWNoZSB5b3UgZ2V0IHJpZ2h0IG5zZWMKKwkgKiBidXQgYWZ0ZXIgaXQgZ2V0cyBmbHVzaGVkLCB5b3UgZ2V0IHplcm8gbnNlYy4KKwkgKi8KKwlpZiAoY2UtPmNlX210aW1lLm5zZWMgIT0gaHRvbmwoc3QtPnN0X210aW0udHZfbnNlYykpCisJCWNoYW5nZWQgfD0gTVRJTUVfQ0hBTkdFRDsKKwlpZiAoY2UtPmNlX2N0aW1lLm5zZWMgIT0gaHRvbmwoc3QtPnN0X2N0aW0udHZfbnNlYykpCisJCWNoYW5nZWQgfD0gQ1RJTUVfQ0hBTkdFRDsKKyNlbmRpZgkKKworCWlmIChjZS0+Y2VfdWlkICE9IGh0b25sKHN0LT5zdF91aWQpIHx8CisJICAgIGNlLT5jZV9naWQgIT0gaHRvbmwoc3QtPnN0X2dpZCkpCisJCWNoYW5nZWQgfD0gT1dORVJfQ0hBTkdFRDsKKwlpZiAoY2UtPmNlX2lubyAhPSBodG9ubChzdC0+c3RfaW5vKSkKKwkJY2hhbmdlZCB8PSBJTk9ERV9DSEFOR0VEOworCisjaWZkZWYgVVNFX1NUREVWCisJLyoKKwkgKiBzdF9kZXYgYnJlYWtzIG9uIG5ldHdvcmsgZmlsZXN5c3RlbXMgd2hlcmUgZGlmZmVyZW50CisJICogY2xpZW50cyB3aWxsIGhhdmUgZGlmZmVyZW50IHZpZXdzIG9mIHdoYXQgImRldmljZSIKKwkgKiB0aGUgZmlsZXN5c3RlbSBpcyBvbgorCSAqLworCWlmIChjZS0+Y2VfZGV2ICE9IGh0b25sKHN0LT5zdF9kZXYpKQorCQljaGFuZ2VkIHw9IElOT0RFX0NIQU5HRUQ7CisjZW5kaWYKKworCWlmIChjZS0+Y2Vfc2l6ZSAhPSBodG9ubChzdC0+c3Rfc2l6ZSkpCisJCWNoYW5nZWQgfD0gREFUQV9DSEFOR0VEOworCisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK2ludCBjZV9tYXRjaF9zdGF0KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCwgaW50IGlnbm9yZV92YWxpZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbmdlZDsKKworCS8qCisJICogSWYgaXQncyBtYXJrZWQgYXMgYWx3YXlzIHZhbGlkIGluIHRoZSBpbmRleCwgaXQncworCSAqIHZhbGlkIHdoYXRldmVyIHRoZSBjaGVja2VkLW91dCBjb3B5IHNheXMuCisJICovCisJaWYgKCFpZ25vcmVfdmFsaWQgJiYgKGNlLT5jZV9mbGFncyAmIGh0b25zKENFX1ZBTElEKSkpCisJCXJldHVybiAwOworCisJY2hhbmdlZCA9IGNlX21hdGNoX3N0YXRfYmFzaWMoY2UsIHN0KTsKKworCS8qCisJICogV2l0aGluIDEgc2Vjb25kIG9mIHRoaXMgc2VxdWVuY2U6CisJICogCWVjaG8geHl6enkgPmZpbGUgJiYgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlCisJICogcnVubmluZyB0aGlzIGNvbW1hbmQ6CisJICogCWVjaG8gZnJvdHogPmZpbGUKKwkgKiB3b3VsZCBnaXZlIGEgZmFsc2VseSBjbGVhbiBjYWNoZSBlbnRyeS4gIFRoZSBtdGltZSBhbmQKKwkgKiBsZW5ndGggbWF0Y2ggdGhlIGNhY2hlLCBhbmQgb3RoZXIgc3RhdCBmaWVsZHMgZG8gbm90IGNoYW5nZS4KKwkgKgorCSAqIFdlIGNvdWxkIGRldGVjdCB0aGlzIGF0IHVwZGF0ZS1pbmRleCB0aW1lICh0aGUgY2FjaGUgZW50cnkKKwkgKiBiZWluZyByZWdpc3RlcmVkL3VwZGF0ZWQgcmVjb3JkcyB0aGUgc2FtZSB0aW1lIGFzICJub3ciKQorCSAqIGFuZCBkZWxheSB0aGUgcmV0dXJuIGZyb20gZ2l0LXVwZGF0ZS1pbmRleCwgYnV0IHRoYXQgd291bGQKKwkgKiBlZmZlY3RpdmVseSBtZWFuIHdlIGNhbiBtYWtlIGF0IG1vc3Qgb25lIGNvbW1pdCBwZXIgc2Vjb25kLAorCSAqIHdoaWNoIGlzIG5vdCBhY2NlcHRhYmxlLiAgSW5zdGVhZCwgd2UgY2hlY2sgY2FjaGUgZW50cmllcworCSAqIHdob3NlIG10aW1lIGFyZSB0aGUgc2FtZSBhcyB0aGUgaW5kZXggZmlsZSB0aW1lc3RhbXAgbW9yZQorCSAqIGNhcmVmdWxseSB0aGFuIG90aGVycy4KKwkgKi8KKwlpZiAoIWNoYW5nZWQgJiYKKwkgICAgaW5kZXhfZmlsZV90aW1lc3RhbXAgJiYKKwkgICAgaW5kZXhfZmlsZV90aW1lc3RhbXAgPD0gbnRvaGwoY2UtPmNlX210aW1lLnNlYykpCisJCWNoYW5nZWQgfD0gY2VfbW9kaWZpZWRfY2hlY2tfZnMoY2UsIHN0KTsKKworCXJldHVybiBjaGFuZ2VkOworfQorCitpbnQgY2VfbW9kaWZpZWQoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0LCBpbnQgcmVhbGx5KQoreworCWludCBjaGFuZ2VkLCBjaGFuZ2VkX2ZzOworCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0KGNlLCBzdCwgcmVhbGx5KTsKKwlpZiAoIWNoYW5nZWQpCisJCXJldHVybiAwOworCS8qCisJICogSWYgdGhlIG1vZGUgb3IgdHlwZSBoYXMgY2hhbmdlZCwgdGhlcmUncyBubyBwb2ludCBpbiB0cnlpbmcKKwkgKiB0byByZWZyZXNoIHRoZSBlbnRyeSAtIGl0J3Mgbm90IGdvaW5nIHRvIG1hdGNoCisJICovCisJaWYgKGNoYW5nZWQgJiAoTU9ERV9DSEFOR0VEIHwgVFlQRV9DSEFOR0VEKSkKKwkJcmV0dXJuIGNoYW5nZWQ7CisKKwkvKiBJbW1lZGlhdGVseSBhZnRlciByZWFkLXRyZWUgb3IgdXBkYXRlLWluZGV4IC0tY2FjaGVpbmZvLAorCSAqIHRoZSBsZW5ndGggZmllbGQgaXMgemVyby4gIEZvciBvdGhlciBjYXNlcyB0aGUgY2Vfc2l6ZQorCSAqIHNob3VsZCBtYXRjaCB0aGUgU0hBMSByZWNvcmRlZCBpbiB0aGUgaW5kZXggZW50cnkuCisJICovCisJaWYgKChjaGFuZ2VkICYgREFUQV9DSEFOR0VEKSAmJiBjZS0+Y2Vfc2l6ZSAhPSBodG9ubCgwKSkKKwkJcmV0dXJuIGNoYW5nZWQ7CisKKwljaGFuZ2VkX2ZzID0gY2VfbW9kaWZpZWRfY2hlY2tfZnMoY2UsIHN0KTsKKwlpZiAoY2hhbmdlZF9mcykKKwkJcmV0dXJuIGNoYW5nZWQgfCBjaGFuZ2VkX2ZzOworCXJldHVybiAwOworfQorCitpbnQgYmFzZV9uYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqbmFtZTEsIGludCBsZW4xLCBpbnQgbW9kZTEsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgbGVuMiwgaW50IG1vZGUyKQoreworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCWludCBsZW4gPSBsZW4xIDwgbGVuMiA/IGxlbjEgOiBsZW4yOworCWludCBjbXA7CisKKwljbXAgPSBtZW1jbXAobmFtZTEsIG5hbWUyLCBsZW4pOworCWlmIChjbXApCisJCXJldHVybiBjbXA7CisJYzEgPSBuYW1lMVtsZW5dOworCWMyID0gbmFtZTJbbGVuXTsKKwlpZiAoIWMxICYmIFNfSVNESVIobW9kZTEpKQorCQljMSA9ICcvJzsKKwlpZiAoIWMyICYmIFNfSVNESVIobW9kZTIpKQorCQljMiA9ICcvJzsKKwlyZXR1cm4gKGMxIDwgYzIpID8gLTEgOiAoYzEgPiBjMikgPyAxIDogMDsKK30KKworaW50IGNhY2hlX25hbWVfY29tcGFyZShjb25zdCBjaGFyICpuYW1lMSwgaW50IGZsYWdzMSwgY29uc3QgY2hhciAqbmFtZTIsIGludCBmbGFnczIpCit7CisJaW50IGxlbjEgPSBmbGFnczEgJiBDRV9OQU1FTUFTSzsKKwlpbnQgbGVuMiA9IGZsYWdzMiAmIENFX05BTUVNQVNLOworCWludCBsZW4gPSBsZW4xIDwgbGVuMiA/IGxlbjEgOiBsZW4yOworCWludCBjbXA7CisKKwljbXAgPSBtZW1jbXAobmFtZTEsIG5hbWUyLCBsZW4pOworCWlmIChjbXApCisJCXJldHVybiBjbXA7CisJaWYgKGxlbjEgPCBsZW4yKQorCQlyZXR1cm4gLTE7CisJaWYgKGxlbjEgPiBsZW4yKQorCQlyZXR1cm4gMTsKKworCS8qIENvbXBhcmUgc3RhZ2VzICAqLworCWZsYWdzMSAmPSBDRV9TVEFHRU1BU0s7CisJZmxhZ3MyICY9IENFX1NUQUdFTUFTSzsKKworCWlmIChmbGFnczEgPCBmbGFnczIpCisJCXJldHVybiAtMTsKKwlpZiAoZmxhZ3MxID4gZmxhZ3MyKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNhY2hlX25hbWVfcG9zKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCWludCBmaXJzdCwgbGFzdDsKKworCWZpcnN0ID0gMDsKKwlsYXN0ID0gYWN0aXZlX25yOworCXdoaWxlIChsYXN0ID4gZmlyc3QpIHsKKwkJaW50IG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW25leHRdOworCQlpbnQgY21wID0gY2FjaGVfbmFtZV9jb21wYXJlKG5hbWUsIG5hbWVsZW4sIGNlLT5uYW1lLCBudG9ocyhjZS0+Y2VfZmxhZ3MpKTsKKwkJaWYgKCFjbXApCisJCQlyZXR1cm4gbmV4dDsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCWxhc3QgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZmlyc3QgPSBuZXh0KzE7CisJfQorCXJldHVybiAtZmlyc3QtMTsKK30KKworLyogUmVtb3ZlIGVudHJ5LCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBlbnRyaWVzIHRvIGdvLi4gKi8KK2ludCByZW1vdmVfY2FjaGVfZW50cnlfYXQoaW50IHBvcykKK3sKKwlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJYWN0aXZlX25yLS07CisJaWYgKHBvcyA+PSBhY3RpdmVfbnIpCisJCXJldHVybiAwOworCW1lbW1vdmUoYWN0aXZlX2NhY2hlICsgcG9zLCBhY3RpdmVfY2FjaGUgKyBwb3MgKyAxLCAoYWN0aXZlX25yIC0gcG9zKSAqIHNpemVvZihzdHJ1Y3QgY2FjaGVfZW50cnkgKikpOworCXJldHVybiAxOworfQorCitpbnQgcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBzdHJsZW4ocGF0aCkpOworCWlmIChwb3MgPCAwKQorCQlwb3MgPSAtcG9zLTE7CisJd2hpbGUgKHBvcyA8IGFjdGl2ZV9uciAmJiAhc3RyY21wKGFjdGl2ZV9jYWNoZVtwb3NdLT5uYW1lLCBwYXRoKSkKKwkJcmVtb3ZlX2NhY2hlX2VudHJ5X2F0KHBvcyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjZV9zYW1lX25hbWUoc3RydWN0IGNhY2hlX2VudHJ5ICphLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmIpCit7CisJaW50IGxlbiA9IGNlX25hbWVsZW4oYSk7CisJcmV0dXJuIGNlX25hbWVsZW4oYikgPT0gbGVuICYmICFtZW1jbXAoYS0+bmFtZSwgYi0+bmFtZSwgbGVuKTsKK30KKworaW50IGNlX3BhdGhfbWF0Y2goY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgY29uc3QgY2hhciAqKnBhdGhzcGVjKQoreworCWNvbnN0IGNoYXIgKm1hdGNoLCAqbmFtZTsKKwlpbnQgbGVuOworCisJaWYgKCFwYXRoc3BlYykKKwkJcmV0dXJuIDE7CisKKwlsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwluYW1lID0gY2UtPm5hbWU7CisJd2hpbGUgKChtYXRjaCA9ICpwYXRoc3BlYysrKSAhPSBOVUxMKSB7CisJCWludCBtYXRjaGxlbiA9IHN0cmxlbihtYXRjaCk7CisJCWlmIChtYXRjaGxlbiA+IGxlbikKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKG5hbWUsIG1hdGNoLCBtYXRjaGxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKG1hdGNobGVuICYmIG5hbWVbbWF0Y2hsZW4tMV0gPT0gJy8nKQorCQkJcmV0dXJuIDE7CisJCWlmIChuYW1lW21hdGNobGVuXSA9PSAnLycgfHwgIW5hbWVbbWF0Y2hsZW5dKQorCQkJcmV0dXJuIDE7CisJCWlmICghbWF0Y2hsZW4pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBmdW5kYW1lbnRhbGx5IGRvbid0IGxpa2Ugc29tZSBwYXRoczogd2UgZG9uJ3Qgd2FudAorICogZG90IG9yIGRvdC1kb3QgYW55d2hlcmUsIGFuZCBmb3Igb2J2aW91cyByZWFzb25zIGRvbid0CisgKiB3YW50IHRvIHJlY3Vyc2UgaW50byAiLmdpdCIgZWl0aGVyLgorICoKKyAqIEFsc28sIHdlIGRvbid0IHdhbnQgZG91YmxlIHNsYXNoZXMgb3Igc2xhc2hlcyBhdCB0aGUKKyAqIGVuZCB0aGF0IGNhbiBtYWtlIHBhdGhuYW1lcyBhbWJpZ3VvdXMuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X2RvdGZpbGUoY29uc3QgY2hhciAqcmVzdCkKK3sKKwkvKgorCSAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgd2FzICcuJywgYnV0IHRoYXQKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIGRpc2NhcmRlZCwgd2Ugbm93IHRlc3QKKwkgKiB0aGUgcmVzdC4KKwkgKi8KKwlzd2l0Y2ggKCpyZXN0KSB7CisJLyogIi4iIGlzIG5vdCBhbGxvd2VkICovCisJY2FzZSAnXDAnOiBjYXNlICcvJzoKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqICIuZ2l0IiBmb2xsb3dlZCBieSAgTlVMIG9yIHNsYXNoIGlzIGJhZC4gVGhpcworCSAqIHNoYXJlcyB0aGUgcGF0aCBlbmQgdGVzdCB3aXRoIHRoZSAiLi4iIGNhc2UuCisJICovCisJY2FzZSAnZyc6CisJCWlmIChyZXN0WzFdICE9ICdpJykKKwkJCWJyZWFrOworCQlpZiAocmVzdFsyXSAhPSAndCcpCisJCQlicmVhazsKKwkJcmVzdCArPSAyOworCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSAnLic6CisJCWlmIChyZXN0WzFdID09ICdcMCcgfHwgcmVzdFsxXSA9PSAnLycpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludCB2ZXJpZnlfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgYzsKKworCWdvdG8gaW5zaWRlOworCWZvciAoOzspIHsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIDE7CisJCWlmIChjID09ICcvJykgeworaW5zaWRlOgorCQkJYyA9ICpwYXRoKys7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWRlZmF1bHQ6CisJCQkJY29udGludWU7CisJCQljYXNlICcvJzogY2FzZSAnXDAnOgorCQkJCWJyZWFrOworCQkJY2FzZSAnLic6CisJCQkJaWYgKHZlcmlmeV9kb3RmaWxlKHBhdGgpKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWMgPSAqcGF0aCsrOworCX0KK30KKworLyoKKyAqIERvIHdlIGhhdmUgYW5vdGhlciBmaWxlIHRoYXQgaGFzIHRoZSBiZWdpbm5pbmcgY29tcG9uZW50cyBiZWluZyBhCisgKiBwcm9wZXIgc3VwZXJzZXQgb2YgdGhlIG5hbWUgd2UncmUgdHJ5aW5nIHRvIGFkZD8KKyAqLworc3RhdGljIGludCBoYXNfZmlsZV9uYW1lKGNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGludCBwb3MsIGludCBva190b19yZXBsYWNlKQoreworCWludCByZXR2YWwgPSAwOworCWludCBsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwlpbnQgc3RhZ2UgPSBjZV9zdGFnZShjZSk7CisJY29uc3QgY2hhciAqbmFtZSA9IGNlLT5uYW1lOworCisJd2hpbGUgKHBvcyA8IGFjdGl2ZV9ucikgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKnAgPSBhY3RpdmVfY2FjaGVbcG9zKytdOworCisJCWlmIChsZW4gPj0gY2VfbmFtZWxlbihwKSkKKwkJCWJyZWFrOworCQlpZiAobWVtY21wKG5hbWUsIHAtPm5hbWUsIGxlbikpCisJCQlicmVhazsKKwkJaWYgKGNlX3N0YWdlKHApICE9IHN0YWdlKQorCQkJY29udGludWU7CisJCWlmIChwLT5uYW1lW2xlbl0gIT0gJy8nKQorCQkJY29udGludWU7CisJCXJldHZhbCA9IC0xOworCQlpZiAoIW9rX3RvX3JlcGxhY2UpCisJCQlicmVhazsKKwkJcmVtb3ZlX2NhY2hlX2VudHJ5X2F0KC0tcG9zKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIERvIHdlIGhhdmUgYW5vdGhlciBmaWxlIHdpdGggYSBwYXRobmFtZSB0aGF0IGlzIGEgcHJvcGVyCisgKiBzdWJzZXQgb2YgdGhlIG5hbWUgd2UncmUgdHJ5aW5nIHRvIGFkZD8KKyAqLworc3RhdGljIGludCBoYXNfZGlyX25hbWUoY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHBvcywgaW50IG9rX3RvX3JlcGxhY2UpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHN0YWdlID0gY2Vfc3RhZ2UoY2UpOworCWNvbnN0IGNoYXIgKm5hbWUgPSBjZS0+bmFtZTsKKwljb25zdCBjaGFyICpzbGFzaCA9IG5hbWUgKyBjZV9uYW1lbGVuKGNlKTsKKworCWZvciAoOzspIHsKKwkJaW50IGxlbjsKKworCQlmb3IgKDs7KSB7CisJCQlpZiAoKi0tc2xhc2ggPT0gJy8nKQorCQkJCWJyZWFrOworCQkJaWYgKHNsYXNoIDw9IGNlLT5uYW1lKQorCQkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJbGVuID0gc2xhc2ggLSBuYW1lOworCisJCXBvcyA9IGNhY2hlX25hbWVfcG9zKG5hbWUsIG50b2hzKGNyZWF0ZV9jZV9mbGFncyhsZW4sIHN0YWdlKSkpOworCQlpZiAocG9zID49IDApIHsKKwkJCXJldHZhbCA9IC0xOworCQkJaWYgKG9rX3RvX3JlcGxhY2UpCisJCQkJYnJlYWs7CisJCQlyZW1vdmVfY2FjaGVfZW50cnlfYXQocG9zKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVHJpdmlhbCBvcHRpbWl6YXRpb246IGlmIHdlIGZpbmQgYW4gZW50cnkgdGhhdAorCQkgKiBhbHJlYWR5IG1hdGNoZXMgdGhlIHN1Yi1kaXJlY3RvcnksIHRoZW4gd2Uga25vdworCQkgKiB3ZSdyZSBvaywgYW5kIHdlIGNhbiBleGl0LgorCQkgKi8KKwkJcG9zID0gLXBvcy0xOworCQl3aGlsZSAocG9zIDwgYWN0aXZlX25yKSB7CisJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKnAgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmICgoY2VfbmFtZWxlbihwKSA8PSBsZW4pIHx8CisJCQkgICAgKHAtPm5hbWVbbGVuXSAhPSAnLycpIHx8CisJCQkgICAgbWVtY21wKHAtPm5hbWUsIG5hbWUsIGxlbikpCisJCQkJYnJlYWs7IC8qIG5vdCBvdXIgc3ViZGlyZWN0b3J5ICovCisJCQlpZiAoY2Vfc3RhZ2UocCkgPT0gc3RhZ2UpCisJCQkJLyogcCBpcyBhdCB0aGUgc2FtZSBzdGFnZSBhcyBvdXIgZW50cnksIGFuZAorCQkJCSAqIGlzIGEgc3ViZGlyZWN0b3J5IG9mIHdoYXQgd2UgYXJlIGxvb2tpbmcKKwkJCQkgKiBhdCwgc28gd2UgY2Fubm90IGhhdmUgY29uZmxpY3RzIGF0IG91cgorCQkJCSAqIGxldmVsIG9yIGFueXRoaW5nIHNob3J0ZXIuCisJCQkJICovCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXBvcysrOworCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFdlIG1heSBiZSBpbiBhIHNpdHVhdGlvbiB3aGVyZSB3ZSBhbHJlYWR5IGhhdmUgcGF0aC9maWxlIGFuZCBwYXRoCisgKiBpcyBiZWluZyBhZGRlZCwgb3Igd2UgYWxyZWFkeSBoYXZlIHBhdGggYW5kIHBhdGgvZmlsZSBpcyBiZWluZworICogYWRkZWQuICBFaXRoZXIgb25lIHdvdWxkIHJlc3VsdCBpbiBhIG5vbnNlbnNlIHRyZWUgdGhhdCBoYXMgcGF0aAorICogdHdpY2Ugd2hlbiBnaXQtd3JpdGUtdHJlZSB0cmllcyB0byB3cml0ZSBpdCBvdXQuICBQcmV2ZW50IGl0LgorICogCisgKiBJZiBvay10by1yZXBsYWNlIGlzIHNwZWNpZmllZCwgd2UgcmVtb3ZlIHRoZSBjb25mbGljdGluZyBlbnRyaWVzCisgKiBmcm9tIHRoZSBjYWNoZSBzbyB0aGUgY2FsbGVyIHNob3VsZCByZWNvbXB1dGUgdGhlIGluc2VydCBwb3NpdGlvbi4KKyAqIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSByZXR1cm4gbm9uLXplcm8uCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZmlsZV9kaXJlY3RvcnlfY29uZmxpY3QoY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHBvcywgaW50IG9rX3RvX3JlcGxhY2UpCit7CisJLyoKKwkgKiBXZSBjaGVjayBpZiB0aGUgcGF0aCBpcyBhIHN1Yi1wYXRoIG9mIGEgc3Vic2VxdWVudCBwYXRobmFtZQorCSAqIGZpcnN0LCBzaW5jZSByZW1vdmluZyB0aG9zZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uCisJICogaW4gdGhlIGFycmF5CisJICovCisJaW50IHJldHZhbCA9IGhhc19maWxlX25hbWUoY2UsIHBvcywgb2tfdG9fcmVwbGFjZSk7CisJLyoKKwkgKiBUaGVuIGNoZWNrIGlmIHRoZSBwYXRoIG1pZ2h0IGhhdmUgYSBjbGFzaGluZyBzdWItZGlyZWN0b3J5CisJICogYmVmb3JlIGl0LgorCSAqLworCXJldHVybiByZXR2YWwgKyBoYXNfZGlyX25hbWUoY2UsIHBvcywgb2tfdG9fcmVwbGFjZSk7Cit9CisKK2ludCBhZGRfY2FjaGVfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IG9wdGlvbikKK3sKKwlpbnQgcG9zOworCWludCBva190b19hZGQgPSBvcHRpb24gJiBBRERfQ0FDSEVfT0tfVE9fQUREOworCWludCBva190b19yZXBsYWNlID0gb3B0aW9uICYgQUREX0NBQ0hFX09LX1RPX1JFUExBQ0U7CisJaW50IHNraXBfZGZfY2hlY2sgPSBvcHRpb24gJiBBRERfQ0FDSEVfU0tJUF9ERkNIRUNLOworCisJcG9zID0gY2FjaGVfbmFtZV9wb3MoY2UtPm5hbWUsIG50b2hzKGNlLT5jZV9mbGFncykpOworCisJLyogZXhpc3RpbmcgbWF0Y2g/IEp1c3QgcmVwbGFjZSBpdC4gKi8KKwlpZiAocG9zID49IDApIHsKKwkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAxOworCQlhY3RpdmVfY2FjaGVbcG9zXSA9IGNlOworCQlyZXR1cm4gMDsKKwl9CisJcG9zID0gLXBvcy0xOworCisJLyoKKwkgKiBJbnNlcnRpbmcgYSBtZXJnZWQgZW50cnkgKCJzdGFnZSAwIikgaW50byB0aGUgaW5kZXgKKwkgKiB3aWxsIGFsd2F5cyByZXBsYWNlIGFsbCBub24tbWVyZ2VkIGVudHJpZXMuLgorCSAqLworCWlmIChwb3MgPCBhY3RpdmVfbnIgJiYgY2Vfc3RhZ2UoY2UpID09IDApIHsKKwkJd2hpbGUgKGNlX3NhbWVfbmFtZShhY3RpdmVfY2FjaGVbcG9zXSwgY2UpKSB7CisJCQlva190b19hZGQgPSAxOworCQkJaWYgKCFyZW1vdmVfY2FjaGVfZW50cnlfYXQocG9zKSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghb2tfdG9fYWRkKQorCQlyZXR1cm4gLTE7CisJaWYgKCF2ZXJpZnlfcGF0aChjZS0+bmFtZSkpCisJCXJldHVybiAtMTsKKworCWlmICghc2tpcF9kZl9jaGVjayAmJgorCSAgICBjaGVja19maWxlX2RpcmVjdG9yeV9jb25mbGljdChjZSwgcG9zLCBva190b19yZXBsYWNlKSkgeworCQlpZiAoIW9rX3RvX3JlcGxhY2UpCisJCQlyZXR1cm4gLTE7CisJCXBvcyA9IGNhY2hlX25hbWVfcG9zKGNlLT5uYW1lLCBudG9ocyhjZS0+Y2VfZmxhZ3MpKTsKKwkJcG9zID0gLXBvcy0xOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgYmlnIGVub3VnaCAuLiAqLworCWlmIChhY3RpdmVfbnIgPT0gYWN0aXZlX2FsbG9jKSB7CisJCWFjdGl2ZV9hbGxvYyA9IGFsbG9jX25yKGFjdGl2ZV9hbGxvYyk7CisJCWFjdGl2ZV9jYWNoZSA9IHhyZWFsbG9jKGFjdGl2ZV9jYWNoZSwgYWN0aXZlX2FsbG9jICogc2l6ZW9mKHN0cnVjdCBjYWNoZV9lbnRyeSAqKSk7CisJfQorCisJLyogQWRkIGl0IGluLi4gKi8KKwlhY3RpdmVfbnIrKzsKKwlpZiAoYWN0aXZlX25yID4gcG9zKQorCQltZW1tb3ZlKGFjdGl2ZV9jYWNoZSArIHBvcyArIDEsIGFjdGl2ZV9jYWNoZSArIHBvcywgKGFjdGl2ZV9uciAtIHBvcyAtIDEpICogc2l6ZW9mKGNlKSk7CisJYWN0aXZlX2NhY2hlW3Bvc10gPSBjZTsKKwlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRocmVlIGZ1bmN0aW9ucyB0byBhbGxvdyBvdmVybG9hZGVkIHBvaW50ZXIgcmV0dXJuOyBzZWUgbGludXgvZXJyLmggKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqRVJSX1BUUihsb25nIGVycm9yKQoreworCXJldHVybiAodm9pZCAqKSBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBsb25nIFBUUl9FUlIoY29uc3Qgdm9pZCAqcHRyKQoreworCXJldHVybiAobG9uZykgcHRyOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgSVNfRVJSKGNvbnN0IHZvaWQgKnB0cikKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHRyID4gKHVuc2lnbmVkIGxvbmcpLTEwMDBMOworfQorCisvKgorICogInJlZnJlc2giIGRvZXMgbm90IGNhbGN1bGF0ZSBhIG5ldyBzaGExIGZpbGUgb3IgYnJpbmcgdGhlCisgKiBjYWNoZSB1cC10by1kYXRlIGZvciBtb2RlL2NvbnRlbnQgY2hhbmdlcy4gQnV0IHdoYXQgaXQKKyAqIF9kb2VzXyBkbyBpcyB0byAicmUtbWF0Y2giIHRoZSBzdGF0IGluZm9ybWF0aW9uIG9mIGEgZmlsZQorICogd2l0aCB0aGUgY2FjaGUsIHNvIHRoYXQgeW91IGNhbiByZWZyZXNoIHRoZSBjYWNoZSBmb3IgYQorICogZmlsZSB0aGF0IGhhc24ndCBiZWVuIGNoYW5nZWQgYnV0IHdoZXJlIHRoZSBzdGF0IGVudHJ5IGlzCisgKiBvdXQgb2YgZGF0ZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgeW91J2Qgd2FudCB0byBkbyB0aGlzIGFmdGVyIGRvaW5nIGEgImdpdC1yZWFkLXRyZWUiLAorICogdG8gbGluayB1cCB0aGUgc3RhdCBjYWNoZSBkZXRhaWxzIHdpdGggdGhlIHByb3BlciBmaWxlcy4KKyAqLworc3RhdGljIHN0cnVjdCBjYWNoZV9lbnRyeSAqcmVmcmVzaF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgcmVhbGx5KQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqdXBkYXRlZDsKKwlpbnQgY2hhbmdlZCwgc2l6ZTsKKworCWlmIChsc3RhdChjZS0+bmFtZSwgJnN0KSA8IDApCisJCXJldHVybiBFUlJfUFRSKC1lcnJubyk7CisKKwljaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCByZWFsbHkpOworCWlmICghY2hhbmdlZCkgeworCQlpZiAocmVhbGx5ICYmIGFzc3VtZV91bmNoYW5nZWQgJiYKKwkJICAgICEoY2UtPmNlX2ZsYWdzICYgaHRvbnMoQ0VfVkFMSUQpKSkKKwkJCTsgLyogbWFyayB0aGlzIG9uZSBWQUxJRCBhZ2FpbiAqLworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoY2VfbW9kaWZpZWQoY2UsICZzdCwgcmVhbGx5KSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlzaXplID0gY2Vfc2l6ZShjZSk7CisJdXBkYXRlZCA9IHhtYWxsb2Moc2l6ZSk7CisJbWVtY3B5KHVwZGF0ZWQsIGNlLCBzaXplKTsKKwlmaWxsX3N0YXRfY2FjaGVfaW5mbyh1cGRhdGVkLCAmc3QpOworCisJLyogSW4gdGhpcyBjYXNlLCBpZiByZWFsbHkgaXMgbm90IHNldCwgd2Ugc2hvdWxkIGxlYXZlCisJICogQ0VfVkFMSUQgYml0IGFsb25lLiAgT3RoZXJ3aXNlLCBwYXRocyBtYXJrZWQgd2l0aAorCSAqIC0tbm8tYXNzdW1lLXVuY2hhbmdlZCAoaS5lLiB0aGluZ3MgdG8gYmUgZWRpdGVkKSB3aWxsCisJICogcmVhY3F1aXJlIENFX1ZBTElEIGJpdCBhdXRvbWF0aWNhbGx5LCB3aGljaCBpcyBub3QKKwkgKiByZWFsbHkgd2hhdCB3ZSB3YW50LgorCSAqLworCWlmICghcmVhbGx5ICYmIGFzc3VtZV91bmNoYW5nZWQgJiYgIShjZS0+Y2VfZmxhZ3MgJiBodG9ucyhDRV9WQUxJRCkpKQorCQl1cGRhdGVkLT5jZV9mbGFncyAmPSB+aHRvbnMoQ0VfVkFMSUQpOworCisJcmV0dXJuIHVwZGF0ZWQ7Cit9CisKK2ludCByZWZyZXNoX2NhY2hlKHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgaTsKKwlpbnQgaGFzX2Vycm9ycyA9IDA7CisJaW50IHJlYWxseSA9IChmbGFncyAmIFJFRlJFU0hfUkVBTExZKSAhPSAwOworCWludCBhbGxvd191bm1lcmdlZCA9IChmbGFncyAmIFJFRlJFU0hfVU5NRVJHRUQpICE9IDA7CisJaW50IHF1aWV0ID0gKGZsYWdzICYgUkVGUkVTSF9RVUlFVCkgIT0gMDsKKwlpbnQgbm90X25ldyA9IChmbGFncyAmIFJFRlJFU0hfSUdOT1JFX01JU1NJTkcpICE9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgKm5ldzsKKwkJY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCXdoaWxlICgoaSA8IGFjdGl2ZV9ucikgJiYKKwkJCSAgICAgICAhIHN0cmNtcChhY3RpdmVfY2FjaGVbaV0tPm5hbWUsIGNlLT5uYW1lKSkKKwkJCQlpKys7CisJCQlpLS07CisJCQlpZiAoYWxsb3dfdW5tZXJnZWQpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzOiBuZWVkcyBtZXJnZVxuIiwgY2UtPm5hbWUpOworCQkJaGFzX2Vycm9ycyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCW5ldyA9IHJlZnJlc2hfZW50cnkoY2UsIHJlYWxseSk7CisJCWlmICghbmV3KQorCQkJY29udGludWU7CisJCWlmIChJU19FUlIobmV3KSkgeworCQkJaWYgKG5vdF9uZXcgJiYgUFRSX0VSUihuZXcpID09IC1FTk9FTlQpCisJCQkJY29udGludWU7CisJCQlpZiAocmVhbGx5ICYmIFBUUl9FUlIobmV3KSA9PSAtRUlOVkFMKSB7CisJCQkJLyogSWYgd2UgYXJlIGRvaW5nIC0tcmVhbGx5LXJlZnJlc2ggdGhhdAorCQkJCSAqIG1lYW5zIHRoZSBpbmRleCBpcyBub3QgdmFsaWQgYW55bW9yZS4KKwkJCQkgKi8KKwkJCQljZS0+Y2VfZmxhZ3MgJj0gfmh0b25zKENFX1ZBTElEKTsKKwkJCQlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJCQl9CisJCQlpZiAocXVpZXQpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzOiBuZWVkcyB1cGRhdGVcbiIsIGNlLT5uYW1lKTsKKwkJCWhhc19lcnJvcnMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAxOworCQkvKiBZb3UgY2FuIE5PVCBqdXN0IGZyZWUgYWN0aXZlX2NhY2hlW2ldIGhlcmUsIHNpbmNlIGl0CisJCSAqIG1pZ2h0IG5vdCBiZSBuZWNlc3NhcmlseSBtYWxsb2MoKWVkIGJ1dCBjYW4gYWxzbyBjb21lCisJCSAqIGZyb20gbW1hcCgpLiAqLworCQlhY3RpdmVfY2FjaGVbaV0gPSBuZXc7CisJfQorCXJldHVybiBoYXNfZXJyb3JzOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9oZHIoc3RydWN0IGNhY2hlX2hlYWRlciAqaGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJU0hBX0NUWCBjOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoaGRyLT5oZHJfc2lnbmF0dXJlICE9IGh0b25sKENBQ0hFX1NJR05BVFVSRSkpCisJCXJldHVybiBlcnJvcigiYmFkIHNpZ25hdHVyZSIpOworCWlmIChoZHItPmhkcl92ZXJzaW9uICE9IGh0b25sKDIpKQorCQlyZXR1cm4gZXJyb3IoImJhZCBpbmRleCB2ZXJzaW9uIik7CisJU0hBMV9Jbml0KCZjKTsKKwlTSEExX1VwZGF0ZSgmYywgaGRyLCBzaXplIC0gMjApOworCVNIQTFfRmluYWwoc2hhMSwgJmMpOworCWlmIChtZW1jbXAoc2hhMSwgKHZvaWQgKiloZHIgKyBzaXplIC0gMjAsIDIwKSkKKwkJcmV0dXJuIGVycm9yKCJiYWQgaW5kZXggZmlsZSBzaGExIHNpZ25hdHVyZSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfaW5kZXhfZXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlzd2l0Y2ggKENBQ0hFX0VYVChleHQpKSB7CisJY2FzZSBDQUNIRV9FWFRfVFJFRToKKwkJYWN0aXZlX2NhY2hlX3RyZWUgPSBjYWNoZV90cmVlX3JlYWQoZGF0YSwgc3opOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoKmV4dCA8ICdBJyB8fCAnWicgPCAqZXh0KQorCQkJcmV0dXJuIGVycm9yKCJpbmRleCB1c2VzICUuNHMgZXh0ZW5zaW9uLCB3aGljaCB3ZSBkbyBub3QgdW5kZXJzdGFuZCIsCisJCQkJICAgICBleHQpOworCQlmcHJpbnRmKHN0ZGVyciwgImlnbm9yaW5nICUuNHMgZXh0ZW5zaW9uXG4iLCBleHQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWFkX2NhY2hlKHZvaWQpCit7CisJaW50IGZkLCBpOworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb2Zmc2V0OworCXZvaWQgKm1hcDsKKwlzdHJ1Y3QgY2FjaGVfaGVhZGVyICpoZHI7CisKKwllcnJubyA9IEVCVVNZOworCWlmIChhY3RpdmVfY2FjaGUpCisJCXJldHVybiBhY3RpdmVfbnI7CisKKwllcnJubyA9IEVOT0VOVDsKKwlpbmRleF9maWxlX3RpbWVzdGFtcCA9IDA7CisJZmQgPSBvcGVuKGdldF9pbmRleF9maWxlKCksIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gMDsKKwkJZGllKCJpbmRleCBmaWxlIG9wZW4gZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCXNpemUgPSAwOyAvLyBhdm9pZCBnY2Mgd2FybmluZworCW1hcCA9IE1BUF9GQUlMRUQ7CisJaWYgKCFmc3RhdChmZCwgJnN0KSkgeworCQlzaXplID0gc3Quc3Rfc2l6ZTsKKwkJZXJybm8gPSBFSU5WQUw7CisJCWlmIChzaXplID49IHNpemVvZihzdHJ1Y3QgY2FjaGVfaGVhZGVyKSArIDIwKQorCQkJbWFwID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOworCX0KKwljbG9zZShmZCk7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlkaWUoImluZGV4IGZpbGUgbW1hcCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisKKwloZHIgPSBtYXA7CisJaWYgKHZlcmlmeV9oZHIoaGRyLCBzaXplKSA8IDApCisJCWdvdG8gdW5tYXA7CisKKwlhY3RpdmVfbnIgPSBudG9obChoZHItPmhkcl9lbnRyaWVzKTsKKwlhY3RpdmVfYWxsb2MgPSBhbGxvY19ucihhY3RpdmVfbnIpOworCWFjdGl2ZV9jYWNoZSA9IHhjYWxsb2MoYWN0aXZlX2FsbG9jLCBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5ICopKTsKKworCW9mZnNldCA9IHNpemVvZigqaGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IG1hcCArIG9mZnNldDsKKwkJb2Zmc2V0ID0gb2Zmc2V0ICsgY2Vfc2l6ZShjZSk7CisJCWFjdGl2ZV9jYWNoZVtpXSA9IGNlOworCX0KKwlpbmRleF9maWxlX3RpbWVzdGFtcCA9IHN0LnN0X210aW1lOworCXdoaWxlIChvZmZzZXQgPD0gc2l6ZSAtIDIwIC0gOCkgeworCQkvKiBBZnRlciBhbiBhcnJheSBvZiBhY3RpdmVfbnIgaW5kZXggZW50cmllcywKKwkJICogdGhlcmUgY2FuIGJlIGFyYml0cmFyeSBudW1iZXIgb2YgZXh0ZW5kZWQKKwkJICogc2VjdGlvbnMsIGVhY2ggb2Ygd2hpY2ggaXMgcHJlZml4ZWQgd2l0aAorCQkgKiBleHRlbnNpb24gbmFtZSAoNC1ieXRlKSBhbmQgc2VjdGlvbiBsZW5ndGgKKwkJICogaW4gNC1ieXRlIG5ldHdvcmsgYnl0ZSBvcmRlci4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgZXh0c2l6ZTsKKwkJbWVtY3B5KCZleHRzaXplLCBtYXAgKyBvZmZzZXQgKyA0LCA0KTsKKwkJZXh0c2l6ZSA9IG50b2hsKGV4dHNpemUpOworCQlpZiAocmVhZF9pbmRleF9leHRlbnNpb24obWFwICsgb2Zmc2V0LAorCQkJCQkgbWFwICsgb2Zmc2V0ICsgOCwgZXh0c2l6ZSkgPCAwKQorCQkJZ290byB1bm1hcDsKKwkJb2Zmc2V0ICs9IDg7CisJCW9mZnNldCArPSBleHRzaXplOworCX0KKwlyZXR1cm4gYWN0aXZlX25yOworCit1bm1hcDoKKwltdW5tYXAobWFwLCBzaXplKTsKKwllcnJubyA9IEVJTlZBTDsKKwlkaWUoImluZGV4IGZpbGUgY29ycnVwdCIpOworfQorCisjZGVmaW5lIFdSSVRFX0JVRkZFUl9TSVpFIDgxOTIKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdyaXRlX2J1ZmZlcltXUklURV9CVUZGRVJfU0laRV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9idWZmZXJfbGVuOworCitzdGF0aWMgaW50IGNlX3dyaXRlKFNIQV9DVFggKmNvbnRleHQsIGludCBmZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuKSB7CisJCXVuc2lnbmVkIGludCBidWZmZXJlZCA9IHdyaXRlX2J1ZmZlcl9sZW47CisJCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gV1JJVEVfQlVGRkVSX1NJWkUgLSBidWZmZXJlZDsKKwkJaWYgKHBhcnRpYWwgPiBsZW4pCisJCQlwYXJ0aWFsID0gbGVuOworCQltZW1jcHkod3JpdGVfYnVmZmVyICsgYnVmZmVyZWQsIGRhdGEsIHBhcnRpYWwpOworCQlidWZmZXJlZCArPSBwYXJ0aWFsOworCQlpZiAoYnVmZmVyZWQgPT0gV1JJVEVfQlVGRkVSX1NJWkUpIHsKKwkJCVNIQTFfVXBkYXRlKGNvbnRleHQsIHdyaXRlX2J1ZmZlciwgV1JJVEVfQlVGRkVSX1NJWkUpOworCQkJaWYgKHdyaXRlKGZkLCB3cml0ZV9idWZmZXIsIFdSSVRFX0JVRkZFUl9TSVpFKSAhPSBXUklURV9CVUZGRVJfU0laRSkKKwkJCQlyZXR1cm4gLTE7CisJCQlidWZmZXJlZCA9IDA7CisJCX0KKwkJd3JpdGVfYnVmZmVyX2xlbiA9IGJ1ZmZlcmVkOworCQlsZW4gLT0gcGFydGlhbDsKKwkJZGF0YSArPSBwYXJ0aWFsOworIAl9CisgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2luZGV4X2V4dF9oZWFkZXIoU0hBX0NUWCAqY29udGV4dCwgaW50IGZkLAorCQkJCSAgdW5zaWduZWQgaW50IGV4dCwgdW5zaWduZWQgaW50IHN6KQoreworCWV4dCA9IGh0b25sKGV4dCk7CisJc3ogPSBodG9ubChzeik7CisJaWYgKChjZV93cml0ZShjb250ZXh0LCBmZCwgJmV4dCwgNCkgPCAwKSB8fAorCSAgICAoY2Vfd3JpdGUoY29udGV4dCwgZmQsICZzeiwgNCkgPCAwKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlX2ZsdXNoKFNIQV9DVFggKmNvbnRleHQsIGludCBmZCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVmdCA9IHdyaXRlX2J1ZmZlcl9sZW47CisKKwlpZiAobGVmdCkgeworCQl3cml0ZV9idWZmZXJfbGVuID0gMDsKKwkJU0hBMV9VcGRhdGUoY29udGV4dCwgd3JpdGVfYnVmZmVyLCBsZWZ0KTsKKwl9CisKKwkvKiBGbHVzaCBmaXJzdCBpZiBub3QgZW5vdWdoIHNwYWNlIGZvciBTSEExIHNpZ25hdHVyZSAqLworCWlmIChsZWZ0ICsgMjAgPiBXUklURV9CVUZGRVJfU0laRSkgeworCQlpZiAod3JpdGUoZmQsIHdyaXRlX2J1ZmZlciwgbGVmdCkgIT0gbGVmdCkKKwkJCXJldHVybiAtMTsKKwkJbGVmdCA9IDA7CisJfQorCisJLyogQXBwZW5kIHRoZSBTSEExIHNpZ25hdHVyZSBhdCB0aGUgZW5kICovCisJU0hBMV9GaW5hbCh3cml0ZV9idWZmZXIgKyBsZWZ0LCBjb250ZXh0KTsKKwlsZWZ0ICs9IDIwOworCWlmICh3cml0ZShmZCwgd3JpdGVfYnVmZmVyLCBsZWZ0KSAhPSBsZWZ0KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNlX3NtdWRnZV9yYWNpbHlfY2xlYW5fZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwkvKgorCSAqIFRoZSBvbmx5IHRoaW5nIHdlIGNhcmUgYWJvdXQgaW4gdGhpcyBmdW5jdGlvbiBpcyB0byBzbXVkZ2UgdGhlCisJICogZmFsc2VseSBjbGVhbiBlbnRyeSBkdWUgdG8gdG91Y2gtdXBkYXRlLXRvdWNoIHJhY2UsIHNvIHdlIGxlYXZlCisJICogZXZlcnl0aGluZyBlbHNlIGFzIHRoZXkgYXJlLiAgV2UgYXJlIGNhbGxlZCBmb3IgZW50cmllcyB3aG9zZQorCSAqIGNlX210aW1lIG1hdGNoIHRoZSBpbmRleCBmaWxlIG10aW1lLgorCSAqLworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkKKwkJcmV0dXJuOworCWlmIChjZV9tYXRjaF9zdGF0X2Jhc2ljKGNlLCAmc3QpKQorCQlyZXR1cm47CisJaWYgKGNlX21vZGlmaWVkX2NoZWNrX2ZzKGNlLCAmc3QpKSB7CisJCS8qIFRoaXMgaXMgInJhY2lseSBjbGVhbiI7IHNtdWRnZSBpdC4gIE5vdGUgdGhhdCB0aGlzCisJCSAqIGlzIGEgdHJpY2t5IGNvZGUuICBBdCBmaXJzdCBnbGFuY2UsIGl0IG1heSBhcHBlYXIKKwkJICogdGhhdCBpdCBjYW4gYnJlYWsgd2l0aCB0aGlzIHNlcXVlbmNlOgorCQkgKgorCQkgKiAkIGVjaG8geHl6enkgPmZyb3R6CisJCSAqICQgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90egorCQkgKiAkIDogPmZyb3R6CisJCSAqICQgc2xlZXAgMworCQkgKiAkIGVjaG8gZmlsZnJlID5uaXRmb2wKKwkJICogJCBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbAorCQkgKgorCQkgKiBidXQgaXQgZG9lcyBub3QuICBXaGUgdGhlIHNlY29uZCB1cGRhdGUtaW5kZXggcnVucywKKwkJICogaXQgbm90aWNlcyB0aGF0IHRoZSBlbnRyeSAiZnJvdHoiIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXAKKwkJICogYXMgaW5kZXgsIGFuZCBpZiB3ZSB3ZXJlIHRvIHNtdWRnZSBpdCBieSByZXNldHRpbmcgaXRzCisJCSAqIHNpemUgdG8gemVybyBoZXJlLCB0aGVuIHRoZSBvYmplY3QgbmFtZSByZWNvcmRlZAorCQkgKiBpbiBpbmRleCBpcyB0aGUgNi1ieXRlIGZpbGUgYnV0IHRoZSBjYWNoZWQgc3RhdCBpbmZvcm1hdGlvbgorCQkgKiBiZWNvbWVzIHplcm8gLS0tIHdoaWNoIHdvdWxkIHRoZW4gbWF0Y2ggd2hhdCB3ZSB3b3VsZAorCQkgKiBvYnRhaW4gZnJvbSB0aGUgZmlsZXN5c3RlbSBuZXh0IHRpbWUgd2Ugc3RhdCgiZnJvdHoiKS4gCisJCSAqCisJCSAqIEhvd2V2ZXIsIHRoZSBzZWNvbmQgdXBkYXRlLWluZGV4LCBiZWZvcmUgY2FsbGluZworCQkgKiB0aGlzIGZ1bmN0aW9uLCBub3RpY2VzIHRoYXQgdGhlIGNhY2hlZCBzaXplIGlzIDYKKwkJICogYnl0ZXMgYW5kIHdoYXQgaXMgb24gdGhlIGZpbGVzeXN0ZW0gaXMgYW4gZW1wdHkKKwkJICogZmlsZSwgYW5kIG5ldmVyIGNhbGxzIHVzLCBzbyB0aGUgY2FjaGVkIHNpemUgaW5mb3JtYXRpb24KKwkJICogZm9yICJmcm90eiIgc3RheXMgNiB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZXN5c3RlbS4KKwkJICovCisJCWNlLT5jZV9zaXplID0gaHRvbmwoMCk7CisJfQorfQorCitpbnQgd3JpdGVfY2FjaGUoaW50IG5ld2ZkLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKipjYWNoZSwgaW50IGVudHJpZXMpCit7CisJU0hBX0NUWCBjOworCXN0cnVjdCBjYWNoZV9oZWFkZXIgaGRyOworCWludCBpLCByZW1vdmVkOworCisJZm9yIChpID0gcmVtb3ZlZCA9IDA7IGkgPCBlbnRyaWVzOyBpKyspCisJCWlmICghY2FjaGVbaV0tPmNlX21vZGUpCisJCQlyZW1vdmVkKys7CisKKwloZHIuaGRyX3NpZ25hdHVyZSA9IGh0b25sKENBQ0hFX1NJR05BVFVSRSk7CisJaGRyLmhkcl92ZXJzaW9uID0gaHRvbmwoMik7CisJaGRyLmhkcl9lbnRyaWVzID0gaHRvbmwoZW50cmllcyAtIHJlbW92ZWQpOworCisJU0hBMV9Jbml0KCZjKTsKKwlpZiAoY2Vfd3JpdGUoJmMsIG5ld2ZkLCAmaGRyLCBzaXplb2YoaGRyKSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBjYWNoZVtpXTsKKwkJaWYgKCFjZS0+Y2VfbW9kZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5kZXhfZmlsZV90aW1lc3RhbXAgJiYKKwkJICAgIGluZGV4X2ZpbGVfdGltZXN0YW1wIDw9IG50b2hsKGNlLT5jZV9tdGltZS5zZWMpKQorCQkJY2Vfc211ZGdlX3JhY2lseV9jbGVhbl9lbnRyeShjZSk7CisJCWlmIChjZV93cml0ZSgmYywgbmV3ZmQsIGNlLCBjZV9zaXplKGNlKSkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIFdyaXRlIGV4dGVuc2lvbiBkYXRhIGhlcmUgKi8KKwlpZiAoYWN0aXZlX2NhY2hlX3RyZWUpIHsKKwkJdW5zaWduZWQgbG9uZyBzejsKKwkJdm9pZCAqZGF0YSA9IGNhY2hlX3RyZWVfd3JpdGUoYWN0aXZlX2NhY2hlX3RyZWUsICZzeik7CisJCWlmIChkYXRhICYmCisJCSAgICAhd3JpdGVfaW5kZXhfZXh0X2hlYWRlcigmYywgbmV3ZmQsIENBQ0hFX0VYVF9UUkVFLCBzeikgJiYKKwkJICAgICFjZV93cml0ZSgmYywgbmV3ZmQsIGRhdGEsIHN6KSkKKwkJCTsKKwkJZWxzZSB7CisJCQlmcmVlKGRhdGEpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiBjZV9mbHVzaCgmYywgbmV3ZmQpOworfQpkaWZmIC0tZ2l0IGEvcmVjZWl2ZS1wYWNrLmMgYi9yZWNlaXZlLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzkyOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVjZWl2ZS1wYWNrLmMKQEAgLTAsMCArMSwzNDAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgcmVjZWl2ZV9wYWNrX3VzYWdlW10gPSAiZ2l0LXJlY2VpdmUtcGFjayA8Z2l0LWRpcj4iOworCitzdGF0aWMgY29uc3QgY2hhciAqdW5wYWNrZXJbXSA9IHsgInVucGFjay1vYmplY3RzIiwgTlVMTCB9OworCitzdGF0aWMgaW50IHJlcG9ydF9zdGF0dXMgPSAwOworCitzdGF0aWMgY2hhciBjYXBhYmlsaXRpZXNbXSA9ICJyZXBvcnQtc3RhdHVzIjsKK3N0YXRpYyBpbnQgY2FwYWJpbGl0aWVzX3NlbnQgPSAwOworCitzdGF0aWMgaW50IHNob3dfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKGNhcGFiaWxpdGllc19zZW50KQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJZWxzZQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzJWMlc1xuIiwKKwkJCSAgICAgc2hhMV90b19oZXgoc2hhMSksIHBhdGgsIDAsIGNhcGFiaWxpdGllcyk7CisJY2FwYWJpbGl0aWVzX3NlbnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9oZWFkX2luZm8odm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoc2hvd19yZWYpOworCWlmICghY2FwYWJpbGl0aWVzX3NlbnQpCisJCXNob3dfcmVmKCJjYXBhYmlsaXRpZXNee30iLCBudWxsX3NoYTEpOworCit9CisKK3N0cnVjdCBjb21tYW5kIHsKKwlzdHJ1Y3QgY29tbWFuZCAqbmV4dDsKKwljb25zdCBjaGFyICplcnJvcl9zdHJpbmc7CisJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBuZXdfc2hhMVsyMF07CisJY2hhciByZWZfbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBjb21tYW5kICpjb21tYW5kcyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgaXNfYWxsX3plcm9lcyhjb25zdCBjaGFyICpoZXgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDQwOyBpKyspCisJCWlmICgqaGV4KysgIT0gJzAnKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X29sZF9yZWYoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqaGV4X2NvbnRlbnRzKQoreworCWludCBmZCwgcmV0OworCWNoYXIgYnVmZmVyWzYwXTsKKworCWlmIChpc19hbGxfemVyb2VzKGhleF9jb250ZW50cykpCisJCXJldHVybiAwOworCWZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCXJldCA9IHJlYWQoZmQsIGJ1ZmZlciwgNDApOworCWNsb3NlKGZkKTsKKwlpZiAocmV0ICE9IDQwKQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChidWZmZXIsIGhleF9jb250ZW50cywgNDApKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyIHVwZGF0ZV9ob29rW10gPSAiaG9va3MvdXBkYXRlIjsKKworc3RhdGljIGludCBydW5fdXBkYXRlX2hvb2soY29uc3QgY2hhciAqcmVmbmFtZSwKKwkJCSAgIGNoYXIgKm9sZF9oZXgsIGNoYXIgKm5ld19oZXgpCit7CisJaW50IGNvZGU7CisKKwlpZiAoYWNjZXNzKHVwZGF0ZV9ob29rLCBYX09LKSA8IDApCisJCXJldHVybiAwOworCWNvZGUgPSBydW5fY29tbWFuZCh1cGRhdGVfaG9vaywgcmVmbmFtZSwgb2xkX2hleCwgbmV3X2hleCwgTlVMTCk7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gMDsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfRk9SSzoKKwkJcmV0dXJuIGVycm9yKCJob29rIGZvcmsgZmFpbGVkIik7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0VYRUM6CisJCXJldHVybiBlcnJvcigiaG9vayBleGVjdXRlIGZhaWxlZCIpOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEOgorCQlyZXR1cm4gZXJyb3IoIndhaXRwaWQgZmFpbGVkIik7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOgorCQlyZXR1cm4gZXJyb3IoIndhaXRwaWQgaXMgY29uZnVzZWQiKTsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUw6CisJCXJldHVybiBlcnJvcigiJXMgZGllZCBvZiBzaWduYWwiLCB1cGRhdGVfaG9vayk7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQlyZXR1cm4gZXJyb3IoIiVzIGRpZWQgc3RyYW5nZWx5IiwgdXBkYXRlX2hvb2spOworCWRlZmF1bHQ6CisJCWVycm9yKCIlcyBleGl0ZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgdXBkYXRlX2hvb2ssIC1jb2RlKTsKKwkJcmV0dXJuIC1jb2RlOworCX0KK30KKworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IGNvbW1hbmQgKmNtZCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gY21kLT5yZWZfbmFtZTsKKwl1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSA9IGNtZC0+b2xkX3NoYTE7CisJdW5zaWduZWQgY2hhciAqbmV3X3NoYTEgPSBjbWQtPm5ld19zaGExOworCWNoYXIgbmV3X2hleFs2MF0sICpvbGRfaGV4LCAqbG9ja19uYW1lOworCWludCBuZXdmZCwgbmFtZWxlbiwgd3JpdHRlbjsKKworCWNtZC0+ZXJyb3Jfc3RyaW5nID0gTlVMTDsKKwlpZiAoIXN0cm5jbXAobmFtZSwgInJlZnMvIiwgNSkgJiYgY2hlY2tfcmVmX2Zvcm1hdChuYW1lICsgNSkpIHsKKwkJY21kLT5lcnJvcl9zdHJpbmcgPSAiZnVubnkgcmVmbmFtZSI7CisJCXJldHVybiBlcnJvcigicmVmdXNpbmcgdG8gY3JlYXRlIGZ1bm55IHJlZiAnJXMnIGxvY2FsbHkiLAorCQkJICAgICBuYW1lKTsKKwl9CisKKwluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWxvY2tfbmFtZSA9IHhtYWxsb2MobmFtZWxlbiArIDEwKTsKKwltZW1jcHkobG9ja19uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwltZW1jcHkobG9ja19uYW1lICsgbmFtZWxlbiwgIi5sb2NrIiwgNik7CisKKwlzdHJjcHkobmV3X2hleCwgc2hhMV90b19oZXgobmV3X3NoYTEpKTsKKwlvbGRfaGV4ID0gc2hhMV90b19oZXgob2xkX3NoYTEpOworCWlmICghaGFzX3NoYTFfZmlsZShuZXdfc2hhMSkpIHsKKwkJY21kLT5lcnJvcl9zdHJpbmcgPSAiYmFkIHBhY2siOworCQlyZXR1cm4gZXJyb3IoInVucGFjayBzaG91bGQgaGF2ZSBnZW5lcmF0ZWQgJXMsICIKKwkJCSAgICAgImJ1dCBJIGNhbid0IGZpbmQgaXQhIiwgbmV3X2hleCk7CisJfQorCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMobG9ja19uYW1lKTsKKworCW5ld2ZkID0gb3Blbihsb2NrX25hbWUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgMDY2Nik7CisJaWYgKG5ld2ZkIDwgMCkgeworCQljbWQtPmVycm9yX3N0cmluZyA9ICJjYW4ndCBsb2NrIjsKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gY3JlYXRlICVzICglcykiLAorCQkJICAgICBsb2NrX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJLyogV3JpdGUgdGhlIHJlZiB3aXRoIGFuIGVuZGluZyAnXG4nICovCisJbmV3X2hleFs0MF0gPSAnXG4nOworCW5ld19oZXhbNDFdID0gMDsKKwl3cml0dGVuID0gd3JpdGUobmV3ZmQsIG5ld19oZXgsIDQxKTsKKwkvKiBSZW1vdmUgdGhlICdcbicgYWdhaW4gKi8KKwluZXdfaGV4WzQwXSA9IDA7CisKKwljbG9zZShuZXdmZCk7CisJaWYgKHdyaXR0ZW4gIT0gNDEpIHsKKwkJdW5saW5rKGxvY2tfbmFtZSk7CisJCWNtZC0+ZXJyb3Jfc3RyaW5nID0gImNhbid0IHdyaXRlIjsKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gd3JpdGUgJXMiLCBsb2NrX25hbWUpOworCX0KKwlpZiAodmVyaWZ5X29sZF9yZWYobmFtZSwgb2xkX2hleCkgPCAwKSB7CisJCXVubGluayhsb2NrX25hbWUpOworCQljbWQtPmVycm9yX3N0cmluZyA9ICJyYWNlZCI7CisJCXJldHVybiBlcnJvcigiJXMgY2hhbmdlZCBkdXJpbmcgcHVzaCIsIG5hbWUpOworCX0KKwlpZiAocnVuX3VwZGF0ZV9ob29rKG5hbWUsIG9sZF9oZXgsIG5ld19oZXgpKSB7CisJCXVubGluayhsb2NrX25hbWUpOworCQljbWQtPmVycm9yX3N0cmluZyA9ICJob29rIGRlY2xpbmVkIjsKKwkJcmV0dXJuIGVycm9yKCJob29rIGRlY2xpbmVkIHRvIHVwZGF0ZSAlcyIsIG5hbWUpOworCX0KKwllbHNlIGlmIChyZW5hbWUobG9ja19uYW1lLCBuYW1lKSA8IDApIHsKKwkJdW5saW5rKGxvY2tfbmFtZSk7CisJCWNtZC0+ZXJyb3Jfc3RyaW5nID0gImNhbid0IHJlbmFtZSI7CisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHJlcGxhY2UgJXMiLCBuYW1lKTsKKwl9CisJZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIC0+ICVzXG4iLCBuYW1lLCBvbGRfaGV4LCBuZXdfaGV4KTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgY2hhciB1cGRhdGVfcG9zdF9ob29rW10gPSAiaG9va3MvcG9zdC11cGRhdGUiOworCitzdGF0aWMgdm9pZCBydW5fdXBkYXRlX3Bvc3RfaG9vayhzdHJ1Y3QgY29tbWFuZCAqY21kKQoreworCXN0cnVjdCBjb21tYW5kICpjbWRfcDsKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICoqYXJndjsKKworCWlmIChhY2Nlc3ModXBkYXRlX3Bvc3RfaG9vaywgWF9PSykgPCAwKQorCQlyZXR1cm47CisJZm9yIChhcmdjID0gMSwgY21kX3AgPSBjbWQ7IGNtZF9wOyBjbWRfcCA9IGNtZF9wLT5uZXh0KSB7CisJCWlmIChjbWRfcC0+ZXJyb3Jfc3RyaW5nKQorCQkJY29udGludWU7CisJCWFyZ2MrKzsKKwl9CisJYXJndiA9IHhtYWxsb2Moc2l6ZW9mKCphcmd2KSAqICgxICsgYXJnYykpOworCWFyZ3ZbMF0gPSB1cGRhdGVfcG9zdF9ob29rOworCisJZm9yIChhcmdjID0gMSwgY21kX3AgPSBjbWQ7IGNtZF9wOyBjbWRfcCA9IGNtZF9wLT5uZXh0KSB7CisJCWNoYXIgKnA7CisJCWlmIChjbWRfcC0+ZXJyb3Jfc3RyaW5nKQorCQkJY29udGludWU7CisJCXAgPSB4bWFsbG9jKHN0cmxlbihjbWRfcC0+cmVmX25hbWUpICsgMSk7CisJCXN0cmNweShwLCBjbWRfcC0+cmVmX25hbWUpOworCQlhcmd2W2FyZ2NdID0gcDsKKwkJYXJnYysrOworCX0KKwlhcmd2W2FyZ2NdID0gTlVMTDsKKwlydW5fY29tbWFuZF92X29wdChhcmdjLCBhcmd2LCBSVU5fQ09NTUFORF9OT19TVERJTyk7Cit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGFmdGVyKGlmKSB3ZSd2ZSBzdWNjZXNzZnVsbHkKKyAqIHVucGFja2VkIHRoZSBkYXRhIHBheWxvYWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4ZWN1dGVfY29tbWFuZHModm9pZCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY21kID0gY29tbWFuZHM7CisKKwl3aGlsZSAoY21kKSB7CisJCXVwZGF0ZShjbWQpOworCQljbWQgPSBjbWQtPm5leHQ7CisJfQorCXJ1bl91cGRhdGVfcG9zdF9ob29rKGNvbW1hbmRzKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9oZWFkX2luZm8odm9pZCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqKnAgPSAmY29tbWFuZHM7CisJZm9yICg7OykgeworCQlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCQl1bnNpZ25lZCBjaGFyIG9sZF9zaGExWzIwXSwgbmV3X3NoYTFbMjBdOworCQlzdHJ1Y3QgY29tbWFuZCAqY21kOworCQljaGFyICpyZWZuYW1lOworCQlpbnQgbGVuLCByZWZsZW47CisKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJCWxpbmVbLS1sZW5dID0gMDsKKwkJaWYgKGxlbiA8IDgzIHx8CisJCSAgICBsaW5lWzQwXSAhPSAnICcgfHwKKwkJICAgIGxpbmVbODFdICE9ICcgJyB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUsIG9sZF9zaGExKSB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUgKyA0MSwgbmV3X3NoYTEpKQorCQkJZGllKCJwcm90b2NvbCBlcnJvcjogZXhwZWN0ZWQgb2xkL25ldy9yZWYsIGdvdCAnJXMnIiwKKwkJCSAgICBsaW5lKTsKKworCQlyZWZuYW1lID0gbGluZSArIDgyOworCQlyZWZsZW4gPSBzdHJsZW4ocmVmbmFtZSk7CisJCWlmIChyZWZsZW4gKyA4MiA8IGxlbikgeworCQkJaWYgKHN0cnN0cihyZWZuYW1lICsgcmVmbGVuICsgMSwgInJlcG9ydC1zdGF0dXMiKSkKKwkJCQlyZXBvcnRfc3RhdHVzID0gMTsKKwkJfQorCQljbWQgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWFuZCkgKyBsZW4gLSA4MCk7CisJCW1lbWNweShjbWQtPm9sZF9zaGExLCBvbGRfc2hhMSwgMjApOworCQltZW1jcHkoY21kLT5uZXdfc2hhMSwgbmV3X3NoYTEsIDIwKTsKKwkJbWVtY3B5KGNtZC0+cmVmX25hbWUsIGxpbmUgKyA4MiwgbGVuIC0gODEpOworCQljbWQtPmVycm9yX3N0cmluZyA9ICJuL2EgKHVucGFja2VyIGVycm9yKSI7CisJCWNtZC0+bmV4dCA9IE5VTEw7CisJCSpwID0gY21kOworCQlwID0gJmNtZC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp1bnBhY2soaW50ICplcnJvcl9jb2RlKQoreworCWludCBjb2RlID0gcnVuX2NvbW1hbmRfdl9vcHQoMSwgdW5wYWNrZXIsIFJVTl9HSVRfQ01EKTsKKworCSplcnJvcl9jb2RlID0gMDsKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIDA6CisJCXJldHVybiBOVUxMOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9GT1JLOgorCQlyZXR1cm4gInVucGFjayBmb3JrIGZhaWxlZCI7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0VYRUM6CisJCXJldHVybiAidW5wYWNrIGV4ZWN1dGUgZmFpbGVkIjsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDoKKwkJcmV0dXJuICJ3YWl0cGlkIGZhaWxlZCI7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOgorCQlyZXR1cm4gIndhaXRwaWQgaXMgY29uZnVzZWQiOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDoKKwkJcmV0dXJuICJ1bnBhY2tlciBkaWVkIG9mIHNpZ25hbCI7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQlyZXR1cm4gInVucGFja2VyIGRpZWQgc3RyYW5nZWx5IjsKKwlkZWZhdWx0OgorCQkqZXJyb3JfY29kZSA9IC1jb2RlOworCQlyZXR1cm4gInVucGFja2VyIGV4aXRlZCB3aXRoIGVycm9yIGNvZGUiOworCX0KK30KKworc3RhdGljIHZvaWQgcmVwb3J0KGNvbnN0IGNoYXIgKnVucGFja19zdGF0dXMpCit7CisJc3RydWN0IGNvbW1hbmQgKmNtZDsKKwlwYWNrZXRfd3JpdGUoMSwgInVucGFjayAlc1xuIiwKKwkJICAgICB1bnBhY2tfc3RhdHVzID8gdW5wYWNrX3N0YXR1cyA6ICJvayIpOworCWZvciAoY21kID0gY29tbWFuZHM7IGNtZDsgY21kID0gY21kLT5uZXh0KSB7CisJCWlmICghY21kLT5lcnJvcl9zdHJpbmcpCisJCQlwYWNrZXRfd3JpdGUoMSwgIm9rICVzXG4iLAorCQkJCSAgICAgY21kLT5yZWZfbmFtZSk7CisJCWVsc2UKKwkJCXBhY2tldF93cml0ZSgxLCAibmcgJXMgJXNcbiIsCisJCQkJICAgICBjbWQtPnJlZl9uYW1lLCBjbWQtPmVycm9yX3N0cmluZyk7CisJfQorCXBhY2tldF9mbHVzaCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWNoYXIgKmRpciA9IE5VTEw7CisKKwlhcmd2Kys7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSAqYXJndisrOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJLyogRG8gZmxhZyBoYW5kbGluZyBoZXJlICovCisJCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCQl9CisJCWlmIChkaXIpCisJCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCQlkaXIgPSBhcmc7CisJfQorCWlmICghZGlyKQorCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCisJaWYoIWVudGVyX3JlcG8oZGlyLCAwKSkKKwkJZGllKCInJXMnOiB1bmFibGUgdG8gY2hkaXIgb3Igbm90IGEgZ2l0IGFyY2hpdmUiLCBkaXIpOworCisJd3JpdGVfaGVhZF9pbmZvKCk7CisKKwkvKiBFT0YgKi8KKwlwYWNrZXRfZmx1c2goMSk7CisKKwlyZWFkX2hlYWRfaW5mbygpOworCWlmIChjb21tYW5kcykgeworCQlpbnQgY29kZTsKKwkJY29uc3QgY2hhciAqdW5wYWNrX3N0YXR1cyA9IHVucGFjaygmY29kZSk7CisJCWlmICghdW5wYWNrX3N0YXR1cykKKwkJCWV4ZWN1dGVfY29tbWFuZHMoKTsKKwkJaWYgKHJlcG9ydF9zdGF0dXMpCisJCQlyZXBvcnQodW5wYWNrX3N0YXR1cyk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmVmcy5jIGIvcmVmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2NhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWZzLmMKQEAgLTAsMCArMSw1MjAgQEAKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIFdlIGFsbG93ICJyZWN1cnNpdmUiIHN5bWJvbGljIHJlZnMuIE9ubHkgd2l0aGluIHJlYXNvbiwgdGhvdWdoICovCisjZGVmaW5lIE1BWERFUFRIIDUKKworY29uc3QgY2hhciAqcmVzb2x2ZV9yZWYoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IHJlYWRpbmcpCit7CisJaW50IGRlcHRoID0gTUFYREVQVEgsIGxlbjsKKwljaGFyIGJ1ZmZlclsyNTZdOworCisJZm9yICg7OykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqYnVmOworCQlpbnQgZmQ7CisKKwkJaWYgKC0tZGVwdGggPCAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogU3BlY2lhbCBjYXNlOiBub24tZXhpc3RpbmcgZmlsZS4KKwkJICogTm90IGhhdmluZyB0aGUgcmVmcy9oZWFkcy9uZXctYnJhbmNoIGlzIE9LCisJCSAqIGlmIHdlIGFyZSB3cml0aW5nIGludG8gaXQsIHNvIGlzIC5naXQvSEVBRAorCQkgKiB0aGF0IHBvaW50cyBhdCByZWZzL2hlYWRzL21hc3RlciBzdGlsbCB0byBiZQorCQkgKiBib3JuLiAgSXQgaXMgTk9UIE9LIGlmIHdlIGFyZSByZXNvbHZpbmcgZm9yCisJCSAqIHJlYWRpbmcuCisJCSAqLworCQlpZiAobHN0YXQocGF0aCwgJnN0KSA8IDApIHsKKwkJCWlmIChyZWFkaW5nIHx8IGVycm5vICE9IEVOT0VOVCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCW1lbXNldChzaGExLCAwLCAyMCk7CisJCQlyZXR1cm4gcGF0aDsKKwkJfQorCisJCS8qIEZvbGxvdyAibm9ybWFsaXplZCIgLSBpZSAicmVmcy8uLiIgc3ltbGlua3MgYnkgaGFuZCAqLworCQlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSkgeworCQkJbGVuID0gcmVhZGxpbmsocGF0aCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwkJCWlmIChsZW4gPj0gNSAmJiAhbWVtY21wKCJyZWZzLyIsIGJ1ZmZlciwgNSkpIHsKKwkJCQlwYXRoID0gZ2l0X3BhdGgoIiUuKnMiLCBsZW4sIGJ1ZmZlcik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBBbnl0aGluZyBlbHNlLCBqdXN0IG9wZW4gaXQgYW5kIHRyeSB0byB1c2UgaXQgYXMKKwkJICogYSByZWYKKwkJICovCisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuID0gcmVhZChmZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwkJY2xvc2UoZmQpOworCisJCS8qCisJCSAqIElzIGl0IGEgc3ltYm9saWMgcmVmPworCQkgKi8KKwkJaWYgKGxlbiA8IDQgfHwgbWVtY21wKCJyZWY6IiwgYnVmZmVyLCA0KSkKKwkJCWJyZWFrOworCQlidWYgPSBidWZmZXIgKyA0OworCQlsZW4gLT0gNDsKKwkJd2hpbGUgKGxlbiAmJiBpc3NwYWNlKCpidWYpKQorCQkJYnVmKyssIGxlbi0tOworCQl3aGlsZSAobGVuICYmIGlzc3BhY2UoYnVmW2xlbi0xXSkpCisJCQlidWZbLS1sZW5dID0gMDsKKwkJcGF0aCA9IGdpdF9wYXRoKCIlLipzIiwgbGVuLCBidWYpOworCX0KKwlpZiAobGVuIDwgNDAgfHwgZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgc2hhMSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBwYXRoOworfQorCitpbnQgY3JlYXRlX3N5bXJlZihjb25zdCBjaGFyICpnaXRfSEVBRCwgY29uc3QgY2hhciAqcmVmc19oZWFkc19tYXN0ZXIpCit7CisJY29uc3QgY2hhciAqbG9ja3BhdGg7CisJY2hhciByZWZbMTAwMF07CisJaW50IGZkLCBsZW4sIHdyaXR0ZW47CisKKyNpZm5kZWYgTk9fU1lNTElOS19IRUFECisJaWYgKHByZWZlcl9zeW1saW5rX3JlZnMpIHsKKwkJdW5saW5rKGdpdF9IRUFEKTsKKwkJaWYgKCFzeW1saW5rKHJlZnNfaGVhZHNfbWFzdGVyLCBnaXRfSEVBRCkpCisJCQlyZXR1cm4gMDsKKwkJZnByaW50ZihzdGRlcnIsICJubyBzeW1saW5rIC0gZmFsbGluZyBiYWNrIHRvIHN5bWJvbGljIHJlZlxuIik7CisJfQorI2VuZGlmCisKKwlsZW4gPSBzbnByaW50ZihyZWYsIHNpemVvZihyZWYpLCAicmVmOiAlc1xuIiwgcmVmc19oZWFkc19tYXN0ZXIpOworCWlmIChzaXplb2YocmVmKSA8PSBsZW4pIHsKKwkJZXJyb3IoInJlZm5hbWUgdG9vIGxvbmc6ICVzIiwgcmVmc19oZWFkc19tYXN0ZXIpOworCQlyZXR1cm4gLTE7CisJfQorCWxvY2twYXRoID0gbWtwYXRoKCIlcy5sb2NrIiwgZ2l0X0hFQUQpOworCWZkID0gb3Blbihsb2NrcGF0aCwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KTsJCisJd3JpdHRlbiA9IHdyaXRlKGZkLCByZWYsIGxlbik7CisJY2xvc2UoZmQpOworCWlmICh3cml0dGVuICE9IGxlbikgeworCQl1bmxpbmsobG9ja3BhdGgpOworCQllcnJvcigiVW5hYmxlIHRvIHdyaXRlIHRvICVzIiwgbG9ja3BhdGgpOworCQlyZXR1cm4gLTI7CisJfQorCWlmIChyZW5hbWUobG9ja3BhdGgsIGdpdF9IRUFEKSA8IDApIHsKKwkJdW5saW5rKGxvY2twYXRoKTsKKwkJZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgJXMiLCBnaXRfSEVBRCk7CisJCXJldHVybiAtMzsKKwl9CisJaWYgKGFkanVzdF9zaGFyZWRfcGVybShnaXRfSEVBRCkpIHsKKwkJdW5saW5rKGxvY2twYXRoKTsKKwkJZXJyb3IoIlVuYWJsZSB0byBmaXggcGVybWlzc2lvbnMgb24gJXMiLCBsb2NrcGF0aCk7CisJCXJldHVybiAtNDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWFkX3JlZihjb25zdCBjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAocmVzb2x2ZV9yZWYoZmlsZW5hbWUsIHNoYTEsIDEpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZG9fZm9yX2VhY2hfcmVmKGNvbnN0IGNoYXIgKmJhc2UsIGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSwgaW50IHRyaW0pCit7CisJaW50IHJldHZhbCA9IDA7CisJRElSICpkaXIgPSBvcGVuZGlyKGdpdF9wYXRoKCIlcyIsIGJhc2UpKTsKKworCWlmIChkaXIpIHsKKwkJc3RydWN0IGRpcmVudCAqZGU7CisJCWludCBiYXNlbGVuID0gc3RybGVuKGJhc2UpOworCQljaGFyICpwYXRoID0geG1hbGxvYyhiYXNlbGVuICsgMjU3KTsKKworCQlpZiAoIXN0cm5jbXAoYmFzZSwgIi4vIiwgMikpIHsKKwkJCWJhc2UgKz0gMjsKKwkJCWJhc2VsZW4gLT0gMjsKKwkJfQorCQltZW1jcHkocGF0aCwgYmFzZSwgYmFzZWxlbik7CisJCWlmIChiYXNlbGVuICYmIGJhc2VbYmFzZWxlbi0xXSAhPSAnLycpCisJCQlwYXRoW2Jhc2VsZW4rK10gPSAnLyc7CisKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaW50IG5hbWVsZW47CisKKwkJCWlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKwkJCQljb250aW51ZTsKKwkJCW5hbWVsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisJCQlpZiAobmFtZWxlbiA+IDI1NSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChuYW1lbGVuPjUgJiYgIXN0cmNtcChkZS0+ZF9uYW1lK25hbWVsZW4tNSwiLmxvY2siKSkKKwkJCQljb250aW51ZTsKKwkJCW1lbWNweShwYXRoICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbmFtZWxlbisxKTsKKwkJCWlmIChzdGF0KGdpdF9wYXRoKCIlcyIsIHBhdGgpLCAmc3QpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCQkJcmV0dmFsID0gZG9fZm9yX2VhY2hfcmVmKHBhdGgsIGZuLCB0cmltKTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlicmVhazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyZWFkX3JlZihnaXRfcGF0aCgiJXMiLCBwYXRoKSwgc2hhMSkgPCAwKSB7CisJCQkJZXJyb3IoIiVzIHBvaW50cyBub3doZXJlISIsIHBhdGgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFoYXNfc2hhMV9maWxlKHNoYTEpKSB7CisJCQkJZXJyb3IoIiVzIGRvZXMgbm90IHBvaW50IHRvIGEgdmFsaWQgIgorCQkJCSAgICAgICJjb21taXQgb2JqZWN0ISIsIHBhdGgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dmFsID0gZm4ocGF0aCArIHRyaW0sIHNoYTEpOworCQkJaWYgKHJldHZhbCkKKwkJCQlicmVhazsKKwkJfQorCQlmcmVlKHBhdGgpOworCQljbG9zZWRpcihkaXIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaGVhZF9yZWYoaW50ICgqZm4pKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaWYgKCFyZWFkX3JlZihnaXRfcGF0aCgiSEVBRCIpLCBzaGExKSkKKwkJcmV0dXJuIGZuKCJIRUFEIiwgc2hhMSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmb3JfZWFjaF9yZWYoaW50ICgqZm4pKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpKQoreworCXJldHVybiBkb19mb3JfZWFjaF9yZWYoInJlZnMiLCBmbiwgMCk7Cit9CisKK2ludCBmb3JfZWFjaF90YWdfcmVmKGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmKCJyZWZzL3RhZ3MiLCBmbiwgMTApOworfQorCitpbnQgZm9yX2VhY2hfYnJhbmNoX3JlZihpbnQgKCpmbikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkpCit7CisJcmV0dXJuIGRvX2Zvcl9lYWNoX3JlZigicmVmcy9oZWFkcyIsIGZuLCAxMSk7Cit9CisKK2ludCBmb3JfZWFjaF9yZW1vdGVfcmVmKGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmKCJyZWZzL3JlbW90ZXMiLCBmbiwgMTMpOworfQorCitpbnQgZ2V0X3JlZl9zaGExKGNvbnN0IGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoY2hlY2tfcmVmX2Zvcm1hdChyZWYpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHJlYWRfcmVmKGdpdF9wYXRoKCJyZWZzLyVzIiwgcmVmKSwgc2hhMSk7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgInJlZiIgaXMgc29tZXRoaW5nIHJlYXNvbmFibGUgdG8gaGF2ZSB1bmRlciAiLmdpdC9yZWZzLyI7CisgKiBXZSBkbyBub3QgbGlrZSBpdCBpZjoKKyAqCisgKiAtIGFueSBwYXRoIGNvbXBvbmVudCBvZiBpdCBiZWdpbnMgd2l0aCAiLiIsIG9yCisgKiAtIGl0IGhhcyBkb3VibGUgZG90cyAiLi4iLCBvcgorICogLSBpdCBoYXMgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXIsICJ+IiwgIl4iLCAiOiIgb3IgU1AsIGFueXdoZXJlLCBvcgorICogLSBpdCBlbmRzIHdpdGggYSAiLyIuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYmFkX3JlZl9jaGFyKGludCBjaCkKK3sKKwlyZXR1cm4gKCgodW5zaWduZWQpIGNoKSA8PSAnICcgfHwKKwkJY2ggPT0gJ34nIHx8IGNoID09ICdeJyB8fCBjaCA9PSAnOicgfHwKKwkJLyogMi4xMyBQYXR0ZXJuIE1hdGNoaW5nIE5vdGF0aW9uICovCisJCWNoID09ICc/JyB8fCBjaCA9PSAnKicgfHwgY2ggPT0gJ1snKTsKK30KKworaW50IGNoZWNrX3JlZl9mb3JtYXQoY29uc3QgY2hhciAqcmVmKQoreworCWludCBjaCwgbGV2ZWw7CisJY29uc3QgY2hhciAqY3AgPSByZWY7CisKKwlsZXZlbCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKChjaCA9ICpjcCsrKSA9PSAnLycpCisJCQk7IC8qIHRvbGVyYXRlIGR1cGxpY2F0ZWQgc2xhc2hlcyAqLworCQlpZiAoIWNoKQorCQkJcmV0dXJuIC0xOyAvKiBzaG91bGQgbm90IGVuZCB3aXRoIHNsYXNoZXMgKi8KKworCQkvKiB3ZSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBjb21wb25lbnQgKi8KKwkJaWYgKGNoID09ICcuJyB8fCBiYWRfcmVmX2NoYXIoY2gpKQorCQkJcmV0dXJuIC0xOworCisJCS8qIHNjYW4gdGhlIHJlc3Qgb2YgdGhlIHBhdGggY29tcG9uZW50ICovCisJCXdoaWxlICgoY2ggPSAqY3ArKykgIT0gMCkgeworCQkJaWYgKGJhZF9yZWZfY2hhcihjaCkpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKGNoID09ICcvJykKKwkJCQlicmVhazsKKwkJCWlmIChjaCA9PSAnLicgJiYgKmNwID09ICcuJykKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJbGV2ZWwrKzsKKwkJaWYgKCFjaCkgeworCQkJaWYgKGxldmVsIDwgMikKKwkJCQlyZXR1cm4gLTE7IC8qIGF0IGxlYXN0IG9mIGZvcm0gImhlYWRzL2JsYWgiICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCByZWZfbG9jayAqdmVyaWZ5X2xvY2soc3RydWN0IHJlZl9sb2NrICpsb2NrLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLCBpbnQgbXVzdGV4aXN0KQoreworCWNoYXIgYnVmWzQwXTsKKwlpbnQgbnIsIGZkID0gb3Blbihsb2NrLT5yZWZfZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDAgJiYgKG11c3RleGlzdCB8fCBlcnJubyAhPSBFTk9FTlQpKSB7CisJCWVycm9yKCJDYW4ndCB2ZXJpZnkgcmVmICVzIiwgbG9jay0+cmVmX2ZpbGUpOworCQl1bmxvY2tfcmVmKGxvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbnIgPSByZWFkKGZkLCBidWYsIDQwKTsKKwljbG9zZShmZCk7CisJaWYgKG5yICE9IDQwIHx8IGdldF9zaGExX2hleChidWYsIGxvY2stPm9sZF9zaGExKSA8IDApIHsKKwkJZXJyb3IoIkNhbid0IHZlcmlmeSByZWYgJXMiLCBsb2NrLT5yZWZfZmlsZSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAobWVtY21wKGxvY2stPm9sZF9zaGExLCBvbGRfc2hhMSwgMjApKSB7CisJCWVycm9yKCJSZWYgJXMgaXMgYXQgJXMgYnV0IGV4cGVjdGVkICVzIiwgbG9jay0+cmVmX2ZpbGUsCisJCQlzaGExX3RvX2hleChsb2NrLT5vbGRfc2hhMSksIHNoYTFfdG9faGV4KG9sZF9zaGExKSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbG9jazsKK30KKworc3RhdGljIHN0cnVjdCByZWZfbG9jayAqbG9ja19yZWZfc2hhMV9iYXNpYyhjb25zdCBjaGFyICpwYXRoLAorCWludCBwbGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLCBpbnQgbXVzdGV4aXN0KQoreworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWxvY2sgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmVmX2xvY2spKTsKKwlsb2NrLT5sb2NrX2ZkID0gLTE7CisKKwlwbGVuID0gc3RybGVuKHBhdGgpIC0gcGxlbjsKKwlwYXRoID0gcmVzb2x2ZV9yZWYocGF0aCwgbG9jay0+b2xkX3NoYTEsIG11c3RleGlzdCk7CisJaWYgKCFwYXRoKSB7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlsb2NrLT5sayA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKworCWxvY2stPnJlZl9maWxlID0gc3RyZHVwKHBhdGgpOworCWxvY2stPmxvZ19maWxlID0gc3RyZHVwKGdpdF9wYXRoKCJsb2dzLyVzIiwgbG9jay0+cmVmX2ZpbGUgKyBwbGVuKSk7CisJbG9jay0+Zm9yY2Vfd3JpdGUgPSBsc3RhdChsb2NrLT5yZWZfZmlsZSwgJnN0KSAmJiBlcnJubyA9PSBFTk9FTlQ7CisKKwlpZiAoc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3Rvcmllcyhsb2NrLT5yZWZfZmlsZSkpCisJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgZm9yICVzIiwgbG9jay0+cmVmX2ZpbGUpOworCWxvY2stPmxvY2tfZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKGxvY2stPmxrLCBsb2NrLT5yZWZfZmlsZSk7CisJaWYgKGxvY2stPmxvY2tfZmQgPCAwKSB7CisJCWVycm9yKCJDb3VsZG4ndCBvcGVuIGxvY2sgZmlsZSAlczogJXMiLAorCQkgICAgICBsb2NrLT5say0+ZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBvbGRfc2hhMSA/IHZlcmlmeV9sb2NrKGxvY2ssIG9sZF9zaGExLCBtdXN0ZXhpc3QpIDogbG9jazsKK30KKworc3RydWN0IHJlZl9sb2NrICpsb2NrX3JlZl9zaGExKGNvbnN0IGNoYXIgKnJlZiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwgaW50IG11c3RleGlzdCkKK3sKKwlpZiAoY2hlY2tfcmVmX2Zvcm1hdChyZWYpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbG9ja19yZWZfc2hhMV9iYXNpYyhnaXRfcGF0aCgicmVmcy8lcyIsIHJlZiksCisJCTUgKyBzdHJsZW4ocmVmKSwgb2xkX3NoYTEsIG11c3RleGlzdCk7Cit9CisKK3N0cnVjdCByZWZfbG9jayAqbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUoY29uc3QgY2hhciAqcmVmLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLCBpbnQgbXVzdGV4aXN0KQoreworCXJldHVybiBsb2NrX3JlZl9zaGExX2Jhc2ljKGdpdF9wYXRoKCIlcyIsIHJlZiksCisJCXN0cmxlbihyZWYpLCBvbGRfc2hhMSwgbXVzdGV4aXN0KTsKK30KKwordm9pZCB1bmxvY2tfcmVmKHN0cnVjdCByZWZfbG9jayAqbG9jaykKK3sKKwlpZiAobG9jay0+bG9ja19mZCA+PSAwKSB7CisJCWNsb3NlKGxvY2stPmxvY2tfZmQpOworCQkvKiBEbyBub3QgZnJlZSBsb2NrLT5sayAtLSBhdGV4aXQoKSBzdGlsbCBsb29rcyBhdCB0aGVtICovCisJCWlmIChsb2NrLT5saykKKwkJCXJvbGxiYWNrX2xvY2tfZmlsZShsb2NrLT5sayk7CisJfQorCWlmIChsb2NrLT5yZWZfZmlsZSkKKwkJZnJlZShsb2NrLT5yZWZfZmlsZSk7CisJaWYgKGxvY2stPmxvZ19maWxlKQorCQlmcmVlKGxvY2stPmxvZ19maWxlKTsKKwlmcmVlKGxvY2spOworfQorCitzdGF0aWMgaW50IGxvZ19yZWZfd3JpdGUoc3RydWN0IHJlZl9sb2NrICpsb2NrLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgbG9nZmQsIHdyaXR0ZW4sIG9mbGFncyA9IE9fQVBQRU5EIHwgT19XUk9OTFk7CisJdW5zaWduZWQgbWF4bGVuLCBsZW47CisJY2hhciAqbG9ncmVjOworCWNvbnN0IGNoYXIgKmNvbWl0dGVyOworCisJaWYgKGxvZ19hbGxfcmVmX3VwZGF0ZXMpIHsKKwkJaWYgKHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMobG9jay0+bG9nX2ZpbGUpIDwgMCkKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgZm9yICVzIiwKKwkJCQlsb2NrLT5sb2dfZmlsZSk7CisJCW9mbGFncyB8PSBPX0NSRUFUOworCX0KKworCWxvZ2ZkID0gb3Blbihsb2NrLT5sb2dfZmlsZSwgb2ZsYWdzLCAwNjY2KTsKKwlpZiAobG9nZmQgPCAwKSB7CisJCWlmICghbG9nX2FsbF9yZWZfdXBkYXRlcyAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gYXBwZW5kIHRvICVzOiAlcyIsCisJCQlsb2NrLT5sb2dfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlzZXR1cF9pZGVudCgpOworCWNvbWl0dGVyID0gZ2l0X2NvbW1pdHRlcl9pbmZvKDEpOworCWlmIChtc2cpIHsKKwkJbWF4bGVuID0gc3RybGVuKGNvbWl0dGVyKSArIHN0cmxlbihtc2cpICsgMio0MCArIDU7CisJCWxvZ3JlYyA9IHhtYWxsb2MobWF4bGVuKTsKKwkJbGVuID0gc25wcmludGYobG9ncmVjLCBtYXhsZW4sICIlcyAlcyAlc1x0JXNcbiIsCisJCQlzaGExX3RvX2hleChsb2NrLT5vbGRfc2hhMSksCisJCQlzaGExX3RvX2hleChzaGExKSwKKwkJCWNvbWl0dGVyLAorCQkJbXNnKTsKKwl9CisJZWxzZSB7CisJCW1heGxlbiA9IHN0cmxlbihjb21pdHRlcikgKyAyKjQwICsgNDsKKwkJbG9ncmVjID0geG1hbGxvYyhtYXhsZW4pOworCQlsZW4gPSBzbnByaW50Zihsb2dyZWMsIG1heGxlbiwgIiVzICVzICVzXG4iLAorCQkJc2hhMV90b19oZXgobG9jay0+b2xkX3NoYTEpLAorCQkJc2hhMV90b19oZXgoc2hhMSksCisJCQljb21pdHRlcik7CisJfQorCXdyaXR0ZW4gPSBsZW4gPD0gbWF4bGVuID8gd3JpdGUobG9nZmQsIGxvZ3JlYywgbGVuKSA6IC0xOworCWZyZWUobG9ncmVjKTsKKwljbG9zZShsb2dmZCk7CisJaWYgKHdyaXR0ZW4gIT0gbGVuKQorCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBhcHBlbmQgdG8gJXMiLCBsb2NrLT5sb2dfZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB3cml0ZV9yZWZfc2hhMShzdHJ1Y3QgcmVmX2xvY2sgKmxvY2ssCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqbG9nbXNnKQoreworCXN0YXRpYyBjaGFyIHRlcm0gPSAnXG4nOworCisJaWYgKCFsb2NrKQorCQlyZXR1cm4gLTE7CisJaWYgKCFsb2NrLT5mb3JjZV93cml0ZSAmJiAhbWVtY21wKGxvY2stPm9sZF9zaGExLCBzaGExLCAyMCkpIHsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh3cml0ZShsb2NrLT5sb2NrX2ZkLCBzaGExX3RvX2hleChzaGExKSwgNDApICE9IDQwIHx8CisJICAgIHdyaXRlKGxvY2stPmxvY2tfZmQsICZ0ZXJtLCAxKSAhPSAxCisJCXx8IGNsb3NlKGxvY2stPmxvY2tfZmQpIDwgMCkgeworCQllcnJvcigiQ291bGRuJ3Qgd3JpdGUgJXMiLCBsb2NrLT5say0+ZmlsZW5hbWUpOworCQl1bmxvY2tfcmVmKGxvY2spOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChsb2dfcmVmX3dyaXRlKGxvY2ssIHNoYTEsIGxvZ21zZykgPCAwKSB7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUobG9jay0+bGspKSB7CisJCWVycm9yKCJDb3VsZG4ndCBzZXQgJXMiLCBsb2NrLT5yZWZfZmlsZSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJbG9jay0+bG9ja19mZCA9IC0xOworCXVubG9ja19yZWYobG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWFkX3JlZl9hdChjb25zdCBjaGFyICpyZWYsIHVuc2lnbmVkIGxvbmcgYXRfdGltZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljb25zdCBjaGFyICpsb2dmaWxlLCAqbG9nZGF0YSwgKmxvZ2VuZCwgKnJlYywgKmxhc3RndCwgKmxhc3RyZWM7CisJY2hhciAqdHpfYzsKKwlpbnQgbG9nZmQsIHR6OworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIGxvbmcgZGF0ZTsKKwl1bnNpZ25lZCBjaGFyIGxvZ2dlZF9zaGExWzIwXTsKKworCWxvZ2ZpbGUgPSBnaXRfcGF0aCgibG9ncy8lcyIsIHJlZik7CisJbG9nZmQgPSBvcGVuKGxvZ2ZpbGUsIE9fUkRPTkxZLCAwKTsKKwlpZiAobG9nZmQgPCAwKQorCQlkaWUoIlVuYWJsZSB0byByZWFkIGxvZyAlczogJXMiLCBsb2dmaWxlLCBzdHJlcnJvcihlcnJubykpOworCWZzdGF0KGxvZ2ZkLCAmc3QpOworCWlmICghc3Quc3Rfc2l6ZSkKKwkJZGllKCJMb2cgJXMgaXMgZW1wdHkuIiwgbG9nZmlsZSk7CisJbG9nZGF0YSA9IG1tYXAoTlVMTCwgc3Quc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgbG9nZmQsIDApOworCWNsb3NlKGxvZ2ZkKTsKKworCWxhc3RyZWMgPSBOVUxMOworCXJlYyA9IGxvZ2VuZCA9IGxvZ2RhdGEgKyBzdC5zdF9zaXplOworCXdoaWxlIChsb2dkYXRhIDwgcmVjKSB7CisJCWlmIChsb2dkYXRhIDwgcmVjICYmICoocmVjLTEpID09ICdcbicpCisJCQlyZWMtLTsKKwkJbGFzdGd0ID0gTlVMTDsKKwkJd2hpbGUgKGxvZ2RhdGEgPCByZWMgJiYgKihyZWMtMSkgIT0gJ1xuJykgeworCQkJcmVjLS07CisJCQlpZiAoKnJlYyA9PSAnPicpCisJCQkJbGFzdGd0ID0gcmVjOworCQl9CisJCWlmICghbGFzdGd0KQorCQkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwkJZGF0ZSA9IHN0cnRvdWwobGFzdGd0ICsgMSwgJnR6X2MsIDEwKTsKKwkJaWYgKGRhdGUgPD0gYXRfdGltZSkgeworCQkJaWYgKGxhc3RyZWMpIHsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KGxhc3RyZWMsIGxvZ2dlZF9zaGExKSkKKwkJCQkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KHJlYyArIDQxLCBzaGExKSkKKwkJCQkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwkJCQlpZiAobWVtY21wKGxvZ2dlZF9zaGExLCBzaGExLCAyMCkpIHsKKwkJCQkJdHogPSBzdHJ0b3VsKHR6X2MsIE5VTEwsIDEwKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkid2FybmluZzogTG9nICVzIGhhcyBnYXAgYWZ0ZXIgJXMuXG4iLAorCQkJCQkJbG9nZmlsZSwgc2hvd19yZmMyODIyX2RhdGUoZGF0ZSwgdHopKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkYXRlID09IGF0X3RpbWUpIHsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KHJlYyArIDQxLCBzaGExKSkKKwkJCQkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChnZXRfc2hhMV9oZXgocmVjICsgNDEsIGxvZ2dlZF9zaGExKSkKKwkJCQkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwkJCQlpZiAobWVtY21wKGxvZ2dlZF9zaGExLCBzaGExLCAyMCkpIHsKKwkJCQkJdHogPSBzdHJ0b3VsKHR6X2MsIE5VTEwsIDEwKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkid2FybmluZzogTG9nICVzIHVuZXhwZWN0ZWRseSBlbmRlZCBvbiAlcy5cbiIsCisJCQkJCQlsb2dmaWxlLCBzaG93X3JmYzI4MjJfZGF0ZShkYXRlLCB0eikpOworCQkJCX0KKwkJCX0KKwkJCW11bm1hcCgodm9pZCopbG9nZGF0YSwgc3Quc3Rfc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsYXN0cmVjID0gcmVjOworCX0KKworCXJlYyA9IGxvZ2RhdGE7CisJd2hpbGUgKHJlYyA8IGxvZ2VuZCAmJiAqcmVjICE9ICc+JyAmJiAqcmVjICE9ICdcbicpCisJCXJlYysrOworCWlmIChyZWMgPT0gbG9nZW5kIHx8ICpyZWMgPT0gJ1xuJykKKwkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwlkYXRlID0gc3RydG91bChyZWMgKyAxLCAmdHpfYywgMTApOworCXR6ID0gc3RydG91bCh0el9jLCBOVUxMLCAxMCk7CisJaWYgKGdldF9zaGExX2hleChsb2dkYXRhLCBzaGExKSkKKwkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwltdW5tYXAoKHZvaWQqKWxvZ2RhdGEsIHN0LnN0X3NpemUpOworCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogTG9nICVzIG9ubHkgZ29lcyBiYWNrIHRvICVzLlxuIiwKKwkJbG9nZmlsZSwgc2hvd19yZmMyODIyX2RhdGUoZGF0ZSwgdHopKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JlZnMuaCBiL3JlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTMxNTVjCi0tLSAvZGV2L251bGwKKysrIGIvcmVmcy5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgUkVGU19ICisjZGVmaW5lIFJFRlNfSAorCitzdHJ1Y3QgcmVmX2xvY2sgeworCWNoYXIgKnJlZl9maWxlOworCWNoYXIgKmxvZ19maWxlOworCXN0cnVjdCBsb2NrX2ZpbGUgKmxrOworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCWludCBsb2NrX2ZkOworCWludCBmb3JjZV93cml0ZTsKK307CisKKy8qCisgKiBDYWxscyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGZvciBlYWNoIHJlZiBmaWxlIHVudGlsIGl0IHJldHVybnMgbm9uemVybywKKyAqIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQorICovCitleHRlcm4gaW50IGhlYWRfcmVmKGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSk7CitleHRlcm4gaW50IGZvcl9lYWNoX3JlZihpbnQgKCpmbikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkpOworZXh0ZXJuIGludCBmb3JfZWFjaF90YWdfcmVmKGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSk7CitleHRlcm4gaW50IGZvcl9lYWNoX2JyYW5jaF9yZWYoaW50ICgqZm4pKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfcmVtb3RlX3JlZihpbnQgKCpmbikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkpOworCisvKiogUmVhZHMgdGhlIHJlZnMgZmlsZSBzcGVjaWZpZWQgaW50byBzaGExICoqLworZXh0ZXJuIGludCBnZXRfcmVmX3NoYTEoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworLyoqIExvY2tzIGEgInJlZnMvIiByZWYgcmV0dXJuaW5nIHRoZSBsb2NrIG9uIHN1Y2Nlc3MgYW5kIE5VTEwgb24gZmFpbHVyZS4gKiovCitleHRlcm4gc3RydWN0IHJlZl9sb2NrICpsb2NrX3JlZl9zaGExKGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsIGludCBtdXN0ZXhpc3QpOworCisvKiogTG9ja3MgYW55IHJlZiAoZm9yICdIRUFEJyB0eXBlIHJlZnMpLiAqLworZXh0ZXJuIHN0cnVjdCByZWZfbG9jayAqbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUoY29uc3QgY2hhciAqcmVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwgaW50IG11c3RleGlzdCk7CisKKy8qKiBSZWxlYXNlIGFueSBsb2NrIHRha2VuIGJ1dCBub3Qgd3JpdHRlbi4gKiovCitleHRlcm4gdm9pZCB1bmxvY2tfcmVmKHN0cnVjdCByZWZfbG9jayAqbG9jayk7CisKKy8qKiBXcml0ZXMgc2hhMSBpbnRvIHRoZSByZWYgc3BlY2lmaWVkIGJ5IHRoZSBsb2NrLiAqKi8KK2V4dGVybiBpbnQgd3JpdGVfcmVmX3NoYTEoc3RydWN0IHJlZl9sb2NrICpsb2NrLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICptc2cpOworCisvKiogUmVhZHMgbG9nIGZvciB0aGUgdmFsdWUgb2YgcmVmIGR1cmluZyBhdF90aW1lLiAqKi8KK2V4dGVybiBpbnQgcmVhZF9yZWZfYXQoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBsb25nIGF0X3RpbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiogUmV0dXJucyAwIGlmIHRhcmdldCBoYXMgdGhlIHJpZ2h0IGZvcm1hdCBmb3IgYSByZWYuICoqLworZXh0ZXJuIGludCBjaGVja19yZWZfZm9ybWF0KGNvbnN0IGNoYXIgKnRhcmdldCk7CisKKyNlbmRpZiAvKiBSRUZTX0ggKi8KZGlmZiAtLWdpdCBhL3JlcG8tY29uZmlnLmMgYi9yZXBvLWNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZmM0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9yZXBvLWNvbmZpZy5jCkBAIC0wLDAgKzEsMTc3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlIDxyZWdleC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBnaXRfY29uZmlnX3NldF91c2FnZVtdID0KKyJnaXQtcmVwby1jb25maWcgWyAtLWJvb2wgfCAtLWludCBdIFstLWdldCB8IC0tZ2V0LWFsbCB8IC0tZ2V0LXJlZ2V4cCB8IC0tcmVwbGFjZS1hbGwgfCAtLXVuc2V0IHwgLS11bnNldC1hbGxdIG5hbWUgW3ZhbHVlIFt2YWx1ZV9yZWdleF1dIHwgLS1saXN0IjsKKworc3RhdGljIGNoYXIqIGtleSA9IE5VTEw7CitzdGF0aWMgcmVnZXhfdCoga2V5X3JlZ2V4cCA9IE5VTEw7CitzdGF0aWMgcmVnZXhfdCogcmVnZXhwID0gTlVMTDsKK3N0YXRpYyBpbnQgc2hvd19rZXlzID0gMDsKK3N0YXRpYyBpbnQgdXNlX2tleV9yZWdleHAgPSAwOworc3RhdGljIGludCBkb19hbGwgPSAwOworc3RhdGljIGludCBkb19ub3RfbWF0Y2ggPSAwOworc3RhdGljIGludCBzZWVuID0gMDsKK3N0YXRpYyBlbnVtIHsgVF9SQVcsIFRfSU5ULCBUX0JPT0wgfSB0eXBlID0gVF9SQVc7CisKK3N0YXRpYyBpbnQgc2hvd19hbGxfY29uZmlnKGNvbnN0IGNoYXIgKmtleV8sIGNvbnN0IGNoYXIgKnZhbHVlXykKK3sKKwlpZiAodmFsdWVfKQorCQlwcmludGYoIiVzPSVzXG4iLCBrZXlfLCB2YWx1ZV8pOworCWVsc2UKKwkJcHJpbnRmKCIlc1xuIiwga2V5Xyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19jb25maWcoY29uc3QgY2hhcioga2V5XywgY29uc3QgY2hhciogdmFsdWVfKQoreworCWNoYXIgdmFsdWVbMjU2XTsKKwljb25zdCBjaGFyICp2cHRyID0gdmFsdWU7CisJaW50IGR1cF9lcnJvciA9IDA7CisKKwlpZiAodmFsdWVfID09IE5VTEwpCisJCXZhbHVlXyA9ICIiOworCisJaWYgKCF1c2Vfa2V5X3JlZ2V4cCAmJiBzdHJjbXAoa2V5Xywga2V5KSkKKwkJcmV0dXJuIDA7CisJaWYgKHVzZV9rZXlfcmVnZXhwICYmIHJlZ2V4ZWMoa2V5X3JlZ2V4cCwga2V5XywgMCwgTlVMTCwgMCkpCisJCXJldHVybiAwOworCWlmIChyZWdleHAgIT0gTlVMTCAmJgorCQkJIChkb19ub3RfbWF0Y2ggXgorCQkJICByZWdleGVjKHJlZ2V4cCwgdmFsdWVfLCAwLCBOVUxMLCAwKSkpCisJCXJldHVybiAwOworCisJaWYgKHNob3dfa2V5cykKKwkJcHJpbnRmKCIlcyAiLCBrZXlfKTsKKwlpZiAoc2VlbiAmJiAhZG9fYWxsKQorCQlkdXBfZXJyb3IgPSAxOworCWlmICh0eXBlID09IFRfSU5UKQorCQlzcHJpbnRmKHZhbHVlLCAiJWQiLCBnaXRfY29uZmlnX2ludChrZXlfLCB2YWx1ZV8pKTsKKwllbHNlIGlmICh0eXBlID09IFRfQk9PTCkKKwkJdnB0ciA9IGdpdF9jb25maWdfYm9vbChrZXlfLCB2YWx1ZV8pID8gInRydWUiIDogImZhbHNlIjsKKwllbHNlCisJCXZwdHIgPSB2YWx1ZV87CisJc2VlbisrOworCWlmIChkdXBfZXJyb3IpIHsKKwkJZXJyb3IoIk1vcmUgdGhhbiBvbmUgdmFsdWUgZm9yIHRoZSBrZXkgJXM6ICVzIiwKKwkJCQlrZXlfLCB2cHRyKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiVzXG4iLCB2cHRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF92YWx1ZShjb25zdCBjaGFyKiBrZXlfLCBjb25zdCBjaGFyKiByZWdleF8pCit7CisJY2hhciAqdGw7CisKKwlrZXkgPSBzdHJkdXAoa2V5Xyk7CisJZm9yICh0bD1rZXkrc3RybGVuKGtleSktMTsgdGwgPj0ga2V5ICYmICp0bCAhPSAnLic7IC0tdGwpCisJCSp0bCA9IHRvbG93ZXIoKnRsKTsKKwlmb3IgKHRsPWtleTsgKnRsICYmICp0bCAhPSAnLic7ICsrdGwpCisJCSp0bCA9IHRvbG93ZXIoKnRsKTsKKworCWlmICh1c2Vfa2V5X3JlZ2V4cCkgeworCQlrZXlfcmVnZXhwID0gKHJlZ2V4X3QqKW1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQlpZiAocmVnY29tcChrZXlfcmVnZXhwLCBrZXksIFJFR19FWFRFTkRFRCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBrZXkgcGF0dGVybjogJXNcbiIsIGtleV8pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKHJlZ2V4XykgeworCQlpZiAocmVnZXhfWzBdID09ICchJykgeworCQkJZG9fbm90X21hdGNoID0gMTsKKwkJCXJlZ2V4XysrOworCQl9CisKKwkJcmVnZXhwID0gKHJlZ2V4X3QqKW1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQlpZiAocmVnY29tcChyZWdleHAsIHJlZ2V4XywgUkVHX0VYVEVOREVEKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBhdHRlcm46ICVzXG4iLCByZWdleF8pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJZ2l0X2NvbmZpZyhzaG93X2NvbmZpZyk7CisJZnJlZShrZXkpOworCWlmIChyZWdleHApIHsKKwkJcmVnZnJlZShyZWdleHApOworCQlmcmVlKHJlZ2V4cCk7CisJfQorCisJaWYgKGRvX2FsbCkKKwkJcmV0dXJuICFzZWVuOworCisJcmV0dXJuIChzZWVuID09IDEpID8gMCA6IDE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgbm9uZ2l0ID0gMDsKKwlzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmbm9uZ2l0KTsKKworCXdoaWxlICgxIDwgYXJnYykgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1pbnQiKSkKKwkJCXR5cGUgPSBUX0lOVDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1ib29sIikpCisJCQl0eXBlID0gVF9CT09MOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWxpc3QiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItbCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWcoc2hvd19hbGxfY29uZmlnKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMjoKKwkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzFdLCBOVUxMKTsKKwljYXNlIDM6CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItLXVuc2V0IikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXQoYXJndlsyXSwgTlVMTCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tdW5zZXQtYWxsIikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgTlVMTCwgTlVMTCwgMSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0IikpCisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIE5VTEwpOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldC1hbGwiKSkgeworCQkJZG9fYWxsID0gMTsKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgTlVMTCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtcmVnZXhwIikpIHsKKwkJCXNob3dfa2V5cyA9IDE7CisJCQl1c2Vfa2V5X3JlZ2V4cCA9IDE7CisJCQlkb19hbGwgPSAxOworCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBOVUxMKTsKKwkJfSBlbHNlCisKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldChhcmd2WzFdLCBhcmd2WzJdKTsKKwljYXNlIDQ6CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItLXVuc2V0IikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgTlVMTCwgYXJndlszXSwgMCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tdW5zZXQtYWxsIikpCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgTlVMTCwgYXJndlszXSwgMSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0IikpCisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIGFyZ3ZbM10pOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldC1hbGwiKSkgeworCQkJZG9fYWxsID0gMTsKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgYXJndlszXSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtcmVnZXhwIikpIHsKKwkJCXNob3dfa2V5cyA9IDE7CisJCQl1c2Vfa2V5X3JlZ2V4cCA9IDE7CisJCQlkb19hbGwgPSAxOworCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBhcmd2WzNdKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXJlcGxhY2UtYWxsIikpCisKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihhcmd2WzJdLCBhcmd2WzNdLCBOVUxMLCAxKTsKKwkJZWxzZQorCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsxXSwgYXJndlsyXSwgYXJndlszXSwgMCk7CisJY2FzZSA1OgorCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1yZXBsYWNlLWFsbCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIGFyZ3ZbM10sIGFyZ3ZbNF0sIDEpOworCWNhc2UgMToKKwlkZWZhdWx0OgorCQl1c2FnZShnaXRfY29uZmlnX3NldF91c2FnZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmV2aXNpb24uYyBiL3JldmlzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2OTUyYwotLS0gL2Rldi9udWxsCisrKyBiL3JldmlzaW9uLmMKQEAgLTAsMCArMSw5OTggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorCitzdGF0aWMgY2hhciAqcGF0aF9uYW1lKHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5hbWVfcGF0aCAqcDsKKwljaGFyICpuLCAqbTsKKwlpbnQgbmxlbiA9IHN0cmxlbihuYW1lKTsKKwlpbnQgbGVuID0gbmxlbiArIDE7CisKKwlmb3IgKHAgPSBwYXRoOyBwOyBwID0gcC0+dXApIHsKKwkJaWYgKHAtPmVsZW1fbGVuKQorCQkJbGVuICs9IHAtPmVsZW1fbGVuICsgMTsKKwl9CisJbiA9IHhtYWxsb2MobGVuKTsKKwltID0gbiArIGxlbiAtIChubGVuICsgMSk7CisJc3RyY3B5KG0sIG5hbWUpOworCWZvciAocCA9IHBhdGg7IHA7IHAgPSBwLT51cCkgeworCQlpZiAocC0+ZWxlbV9sZW4pIHsKKwkJCW0gLT0gcC0+ZWxlbV9sZW4gKyAxOworCQkJbWVtY3B5KG0sIHAtPmVsZW0sIHAtPmVsZW1fbGVuKTsKKwkJCW1bcC0+ZWxlbV9sZW5dID0gJy8nOworCQl9CisJfQorCXJldHVybiBuOworfQorCitzdHJ1Y3Qgb2JqZWN0X2xpc3QgKiphZGRfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaiwKKwkJCQkgICAgICAgc3RydWN0IG9iamVjdF9saXN0ICoqcCwKKwkJCQkgICAgICAgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmVudHJ5ID0geG1hbGxvYyhzaXplb2YoKmVudHJ5KSk7CisJZW50cnktPml0ZW0gPSBvYmo7CisJZW50cnktPm5leHQgPSAqcDsKKwllbnRyeS0+bmFtZSA9IHBhdGhfbmFtZShwYXRoLCBuYW1lKTsKKwkqcCA9IGVudHJ5OworCXJldHVybiAmZW50cnktPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfYmxvYl91bmludGVyZXN0aW5nKHN0cnVjdCBibG9iICpibG9iKQoreworCWlmIChibG9iLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlyZXR1cm47CisJYmxvYi0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7Cit9CisKK3ZvaWQgbWFya190cmVlX3VuaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWUgKnRyZWUpCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0cmVlLT5vYmplY3Q7CisKKwlpZiAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCXJldHVybjsKKwlvYmotPmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJaWYgKCFoYXNfc2hhMV9maWxlKG9iai0+c2hhMSkpCisJCXJldHVybjsKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSA8IDApCisJCWRpZSgiYmFkIHRyZWUgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKworCWRlc2MuYnVmID0gdHJlZS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IHRyZWUtPnNpemU7CisJd2hpbGUgKHRyZWVfZW50cnkoJmRlc2MsICZlbnRyeSkpIHsKKwkJaWYgKFNfSVNESVIoZW50cnkubW9kZSkpCisJCQltYXJrX3RyZWVfdW5pbnRlcmVzdGluZyhsb29rdXBfdHJlZShlbnRyeS5zaGExKSk7CisJCWVsc2UKKwkJCW1hcmtfYmxvYl91bmludGVyZXN0aW5nKGxvb2t1cF9ibG9iKGVudHJ5LnNoYTEpKTsKKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHRyZWUgYW55IG1vcmUKKwkgKiBhZnRlciBpdCBoYXMgYmVlbiBtYXJrZWQgdW5pbnRlcmVzdGluZy4KKwkgKi8KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKK30KKwordm9pZCBtYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCisJd2hpbGUgKHBhcmVudHMpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcGFyZW50cy0+aXRlbTsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkgeworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKworCQkJLyoKKwkJCSAqIE5vcm1hbGx5IHdlIGhhdmVuJ3QgcGFyc2VkIHRoZSBwYXJlbnQKKwkJCSAqIHlldCwgc28gd2Ugd29uJ3QgaGF2ZSBhIHBhcmVudCBvZiBhIHBhcmVudAorCQkJICogaGVyZS4gSG93ZXZlciwgaXQgbWF5IHR1cm4gb3V0IHRoYXQgd2UndmUKKwkJCSAqIHJlYWNoZWQgdGhpcyBjb21taXQgc29tZSBvdGhlciB3YXkgKHdoZXJlIGl0CisJCQkgKiB3YXNuJ3QgdW5pbnRlcmVzdGluZyksIGluIHdoaWNoIGNhc2Ugd2UgbmVlZAorCQkJICogdG8gbWFyayBpdHMgcGFyZW50cyByZWN1cnNpdmVseSB0b28uLgorCQkJICovCisJCQlpZiAoY29tbWl0LT5wYXJlbnRzKQorCQkJCW1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJCX0KKworCQkvKgorCQkgKiBBIG1pc3NpbmcgY29tbWl0IGlzIG9rIGlmZiBpdHMgcGFyZW50IGlzIG1hcmtlZAorCQkgKiB1bmludGVyZXN0aW5nLgorCQkgKgorCQkgKiBXZSBqdXN0IG1hcmsgc3VjaCBhIHRoaW5nIHBhcnNlZCwgc28gdGhhdCB3aGVuCisJCSAqIGl0IGlzIHBvcHBlZCBuZXh0IHRpbWUgYXJvdW5kLCB3ZSB3b24ndCBiZSB0cnlpbmcKKwkJICogdG8gcGFyc2UgaXQgYW5kIGdldCBhbiBlcnJvci4KKwkJICovCisJCWlmICghaGFzX3NoYTFfZmlsZShjb21taXQtPm9iamVjdC5zaGExKSkKKwkJCWNvbW1pdC0+b2JqZWN0LnBhcnNlZCA9IDE7CisJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgYWRkX3BlbmRpbmdfb2JqZWN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKQoreworCWFkZF9vYmplY3Qob2JqLCAmcmV2cy0+cGVuZGluZ19vYmplY3RzLCBOVUxMLCBuYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3QgKmdldF9yZWZlcmVuY2Uoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG9iamVjdCAqb2JqZWN0OworCisJb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCWlmICghb2JqZWN0KQorCQlkaWUoImJhZCBvYmplY3QgJXMiLCBuYW1lKTsKKwlvYmplY3QtPmZsYWdzIHw9IGZsYWdzOworCXJldHVybiBvYmplY3Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICpoYW5kbGVfY29tbWl0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IG9iamVjdCAqb2JqZWN0LCBjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBvYmplY3QtPmZsYWdzOworCisJLyoKKwkgKiBUYWcgb2JqZWN0PyBMb29rIHdoYXQgaXQgcG9pbnRzIHRvLi4KKwkgKi8KKwl3aGlsZSAob2JqZWN0LT50eXBlID09IHRhZ190eXBlKSB7CisJCXN0cnVjdCB0YWcgKnRhZyA9IChzdHJ1Y3QgdGFnICopIG9iamVjdDsKKwkJaWYgKHJldnMtPnRhZ19vYmplY3RzICYmICEoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsIHRhZy0+dGFnKTsKKwkJb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHRhZy0+dGFnZ2VkLT5zaGExKTsKKwkJaWYgKCFvYmplY3QpCisJCQlkaWUoImJhZCBvYmplY3QgJXMiLCBzaGExX3RvX2hleCh0YWctPnRhZ2dlZC0+c2hhMSkpOworCX0KKworCS8qCisJICogQ29tbWl0IG9iamVjdD8gSnVzdCByZXR1cm4gaXQsIHdlJ2xsIGRvIGFsbCB0aGUgY29tcGxleAorCSAqIHJlYWNoYWJpbGl0eSBjcnVkLgorCSAqLworCWlmIChvYmplY3QtPnR5cGUgPT0gY29tbWl0X3R5cGUpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvYmplY3Q7CisJCWlmIChwYXJzZV9jb21taXQoY29tbWl0KSA8IDApCisJCQlkaWUoInVuYWJsZSB0byBwYXJzZSBjb21taXQgJXMiLCBuYW1lKTsKKwkJaWYgKGZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCW1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJCQlyZXZzLT5saW1pdGVkID0gMTsKKwkJfQorCQlyZXR1cm4gY29tbWl0OworCX0KKworCS8qCisJICogVHJlZSBvYmplY3Q/IEVpdGhlciBtYXJrIGl0IHVuaW5pdGVyZXN0aW5nLCBvciBhZGQgaXQKKwkgKiB0byB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGxvb2sgYXQgbGF0ZXIuLgorCSAqLworCWlmIChvYmplY3QtPnR5cGUgPT0gdHJlZV90eXBlKSB7CisJCXN0cnVjdCB0cmVlICp0cmVlID0gKHN0cnVjdCB0cmVlICopb2JqZWN0OworCQlpZiAoIXJldnMtPnRyZWVfb2JqZWN0cykKKwkJCXJldHVybiBOVUxMOworCQlpZiAoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQltYXJrX3RyZWVfdW5pbnRlcmVzdGluZyh0cmVlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsICIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBCbG9iIG9iamVjdD8gWW91IGtub3cgdGhlIGRyaWxsIGJ5IG5vdy4uCisJICovCisJaWYgKG9iamVjdC0+dHlwZSA9PSBibG9iX3R5cGUpIHsKKwkJc3RydWN0IGJsb2IgKmJsb2IgPSAoc3RydWN0IGJsb2IgKilvYmplY3Q7CisJCWlmICghcmV2cy0+YmxvYl9vYmplY3RzKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChmbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfYmxvYl91bmludGVyZXN0aW5nKGJsb2IpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgIiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZGllKCIlcyBpcyB1bmtub3duIG9iamVjdCIsIG5hbWUpOworfQorCitzdGF0aWMgaW50IGV2ZXJ5Ym9keV91bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqb3JpZykKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QgPSBvcmlnOworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0cmVlX2RpZmZlcmVuY2UgPSBSRVZfVFJFRV9TQU1FOworCitzdGF0aWMgdm9pZCBmaWxlX2FkZF9yZW1vdmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIGludCBhZGRyZW1vdmUsIHVuc2lnbmVkIG1vZGUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkgICAgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgZGlmZiA9IFJFVl9UUkVFX0RJRkZFUkVOVDsKKworCS8qCisJICogSXMgaXQgYW4gYWRkIG9mIGEgbmV3IGZpbGU/IEl0IG1lYW5zIHRoYXQgdGhlIG9sZCB0cmVlCisJICogZGlkbid0IGhhdmUgaXQgYXQgYWxsLCBzbyB3ZSB3aWxsIHR1cm4gIlJFVl9UUkVFX1NBTUUiIC0+CisJICogIlJFVl9UUkVFX05FVyIsIGJ1dCBsZWF2ZSBhbnkgIlJFVl9UUkVFX0RJRkZFUkVOVCIgYWxvbmUKKwkgKiAoYW5kIGlmIGl0IGFscmVhZHkgd2FzICJSRVZfVFJFRV9ORVciLCB3ZSdsbCBrZWVwIGl0CisJICogIlJFVl9UUkVFX05FVyIgb2YgY291cnNlKS4KKwkgKi8KKwlpZiAoYWRkcmVtb3ZlID09ICcrJykgeworCQlkaWZmID0gdHJlZV9kaWZmZXJlbmNlOworCQlpZiAoZGlmZiAhPSBSRVZfVFJFRV9TQU1FKQorCQkJcmV0dXJuOworCQlkaWZmID0gUkVWX1RSRUVfTkVXOworCX0KKwl0cmVlX2RpZmZlcmVuY2UgPSBkaWZmOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2NoYW5nZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgdW5zaWduZWQgb2xkX21vZGUsIHVuc2lnbmVkIG5ld19tb2RlLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJdHJlZV9kaWZmZXJlbmNlID0gUkVWX1RSRUVfRElGRkVSRU5UOworfQorCitpbnQgcmV2X2NvbXBhcmVfdHJlZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCB0cmVlICp0MSwgc3RydWN0IHRyZWUgKnQyKQoreworCWlmICghdDEpCisJCXJldHVybiBSRVZfVFJFRV9ORVc7CisJaWYgKCF0MikKKwkJcmV0dXJuIFJFVl9UUkVFX0RJRkZFUkVOVDsKKwl0cmVlX2RpZmZlcmVuY2UgPSBSRVZfVFJFRV9TQU1FOworCWlmIChkaWZmX3RyZWVfc2hhMSh0MS0+b2JqZWN0LnNoYTEsIHQyLT5vYmplY3Quc2hhMSwgIiIsCisJCQkgICAmcmV2cy0+cHJ1bmluZykgPCAwKQorCQlyZXR1cm4gUkVWX1RSRUVfRElGRkVSRU5UOworCXJldHVybiB0cmVlX2RpZmZlcmVuY2U7Cit9CisKK2ludCByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IHRyZWUgKnQxKQoreworCWludCByZXR2YWw7CisJdm9pZCAqdHJlZTsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGVtcHR5LCByZWFsOworCisJaWYgKCF0MSkKKwkJcmV0dXJuIDA7CisKKwl0cmVlID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UodDEtPm9iamVjdC5zaGExLCB0cmVlX3R5cGUsICZyZWFsLnNpemUsIE5VTEwpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIDA7CisJcmVhbC5idWYgPSB0cmVlOworCisJZW1wdHkuYnVmID0gIiI7CisJZW1wdHkuc2l6ZSA9IDA7CisKKwl0cmVlX2RpZmZlcmVuY2UgPSAwOworCXJldHZhbCA9IGRpZmZfdHJlZSgmZW1wdHksICZyZWFsLCAiIiwgJnJldnMtPnBydW5pbmcpOworCWZyZWUodHJlZSk7CisKKwlyZXR1cm4gcmV0dmFsID49IDAgJiYgIXRyZWVfZGlmZmVyZW5jZTsKK30KKworc3RhdGljIHZvaWQgdHJ5X3RvX3NpbXBsaWZ5X2NvbW1pdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKipwcCwgKnBhcmVudDsKKwlpbnQgdHJlZV9jaGFuZ2VkID0gMDsKKworCWlmICghY29tbWl0LT50cmVlKQorCQlyZXR1cm47CisKKwlpZiAoIWNvbW1pdC0+cGFyZW50cykgeworCQlpZiAoIXJldl9zYW1lX3RyZWVfYXNfZW1wdHkocmV2cywgY29tbWl0LT50cmVlKSkKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRSRUVDSEFOR0U7CisJCXJldHVybjsKKwl9CisKKwlwcCA9ICZjb21taXQtPnBhcmVudHM7CisJd2hpbGUgKChwYXJlbnQgPSAqcHApICE9IE5VTEwpIHsKKwkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKworCQlwYXJzZV9jb21taXQocCk7CisJCXN3aXRjaCAocmV2X2NvbXBhcmVfdHJlZShyZXZzLCBwLT50cmVlLCBjb21taXQtPnRyZWUpKSB7CisJCWNhc2UgUkVWX1RSRUVfU0FNRToKKwkJCWlmIChwLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQkJLyogRXZlbiBpZiBhIG1lcmdlIHdpdGggYW4gdW5pbnRlcmVzdGluZworCQkJCSAqIHNpZGUgYnJhbmNoIGJyb3VnaHQgdGhlIGVudGlyZSBjaGFuZ2UKKwkJCQkgKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiwgd2UgZG8gbm90IHdhbnQKKwkJCQkgKiB0byBsb3NlIHRoZSBvdGhlciBicmFuY2hlcyBvZiB0aGlzCisJCQkJICogbWVyZ2UsIHNvIHdlIGp1c3Qga2VlcCBnb2luZy4KKwkJCQkgKi8KKwkJCQlwcCA9ICZwYXJlbnQtPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwYXJlbnQtPm5leHQgPSBOVUxMOworCQkJY29tbWl0LT5wYXJlbnRzID0gcGFyZW50OworCQkJcmV0dXJuOworCisJCWNhc2UgUkVWX1RSRUVfTkVXOgorCQkJaWYgKHJldnMtPnJlbW92ZV9lbXB0eV90cmVlcyAmJgorCQkJICAgIHJldl9zYW1lX3RyZWVfYXNfZW1wdHkocmV2cywgcC0+dHJlZSkpIHsKKwkJCQkvKiBXZSBhcmUgYWRkaW5nIGFsbCB0aGUgc3BlY2lmaWVkCisJCQkJICogcGF0aHMgZnJvbSB0aGlzIHBhcmVudCwgc28gdGhlCisJCQkJICogaGlzdG9yeSBiZXlvbmQgdGhpcyBwYXJlbnQgaXMgbm90CisJCQkJICogaW50ZXJlc3RpbmcuICBSZW1vdmUgaXRzIHBhcmVudHMKKwkJCQkgKiAodGhleSBhcmUgZ3JhbmRwYXJlbnRzIGZvciB1cykuCisJCQkJICogSU9XLCB3ZSBwcmV0ZW5kIHRoaXMgcGFyZW50IGlzIGEKKwkJCQkgKiAicm9vdCIgY29tbWl0LgorCQkJCSAqLworCQkJCXBhcnNlX2NvbW1pdChwKTsKKwkJCQlwLT5wYXJlbnRzID0gTlVMTDsKKwkJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSBSRVZfVFJFRV9ESUZGRVJFTlQ6CisJCQl0cmVlX2NoYW5nZWQgPSAxOworCQkJcHAgPSAmcGFyZW50LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJiYWQgdHJlZSBjb21wYXJlIGZvciBjb21taXQgJXMiLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJfQorCWlmICh0cmVlX2NoYW5nZWQpCisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRSRUVDSEFOR0U7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wYXJlbnRzX3RvX2xpc3Qoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQgPSBjb21taXQtPnBhcmVudHM7CisKKwlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBBRERFRCkKKwkJcmV0dXJuOworCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IEFEREVEOworCisJLyoKKwkgKiBJZiB0aGUgY29tbWl0IGlzIHVuaW50ZXJlc3RpbmcsIGRvbid0IHRyeSB0bworCSAqIHBydW5lIHBhcmVudHMgLSB3ZSB3YW50IHRoZSBtYXhpbWFsIHVuaW50ZXJlc3RpbmcKKwkgKiBzZXQuCisJICoKKwkgKiBOb3JtYWxseSB3ZSBoYXZlbid0IHBhcnNlZCB0aGUgcGFyZW50CisJICogeWV0LCBzbyB3ZSB3b24ndCBoYXZlIGEgcGFyZW50IG9mIGEgcGFyZW50CisJICogaGVyZS4gSG93ZXZlciwgaXQgbWF5IHR1cm4gb3V0IHRoYXQgd2UndmUKKwkgKiByZWFjaGVkIHRoaXMgY29tbWl0IHNvbWUgb3RoZXIgd2F5ICh3aGVyZSBpdAorCSAqIHdhc24ndCB1bmludGVyZXN0aW5nKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkCisJICogdG8gbWFyayBpdHMgcGFyZW50cyByZWN1cnNpdmVseSB0b28uLgorCSAqLworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJd2hpbGUgKHBhcmVudCkgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKwkJCXBhcmVudCA9IHBhcmVudC0+bmV4dDsKKwkJCXBhcnNlX2NvbW1pdChwKTsKKwkJCXAtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJaWYgKHAtPnBhcmVudHMpCisJCQkJbWFya19wYXJlbnRzX3VuaW50ZXJlc3RpbmcocCk7CisJCQlpZiAocC0+b2JqZWN0LmZsYWdzICYgU0VFTikKKwkJCQljb250aW51ZTsKKwkJCXAtPm9iamVjdC5mbGFncyB8PSBTRUVOOworCQkJaW5zZXJ0X2J5X2RhdGUocCwgbGlzdCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogT2ssIHRoZSBjb21taXQgd2Fzbid0IHVuaW50ZXJlc3RpbmcuIFRyeSB0bworCSAqIHNpbXBsaWZ5IHRoZSBjb21taXQgaGlzdG9yeSBhbmQgZmluZCB0aGUgcGFyZW50CisJICogdGhhdCBoYXMgbm8gZGlmZmVyZW5jZXMgaW4gdGhlIHBhdGggc2V0IGlmIG9uZSBleGlzdHMuCisJICovCisJaWYgKHJldnMtPnBydW5lX2ZuKQorCQlyZXZzLT5wcnVuZV9mbihyZXZzLCBjb21taXQpOworCisJaWYgKHJldnMtPm5vX3dhbGspCisJCXJldHVybjsKKworCXBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAocGFyZW50KSB7CisJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnQtPml0ZW07CisKKwkJcGFyZW50ID0gcGFyZW50LT5uZXh0OworCisJCXBhcnNlX2NvbW1pdChwKTsKKwkJaWYgKHAtPm9iamVjdC5mbGFncyAmIFNFRU4pCisJCQljb250aW51ZTsKKwkJcC0+b2JqZWN0LmZsYWdzIHw9IFNFRU47CisJCWluc2VydF9ieV9kYXRlKHAsIGxpc3QpOworCX0KK30KKworc3RhdGljIHZvaWQgbGltaXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gcmV2cy0+Y29tbWl0czsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKm5ld2xpc3QgPSBOVUxMOworCXN0cnVjdCBjb21taXRfbGlzdCAqKnAgPSAmbmV3bGlzdDsKKworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqZW50cnkgPSBsaXN0OworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmY29tbWl0LT5vYmplY3Q7CisKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWZyZWUoZW50cnkpOworCisJCWlmIChyZXZzLT5tYXhfYWdlICE9IC0xICYmIChjb21taXQtPmRhdGUgPCByZXZzLT5tYXhfYWdlKSkKKwkJCW9iai0+ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJaWYgKHJldnMtPnVucGFja2VkICYmIGhhc19zaGExX3BhY2sob2JqLT5zaGExKSkKKwkJCW9iai0+ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJYWRkX3BhcmVudHNfdG9fbGlzdChyZXZzLCBjb21taXQsICZsaXN0KTsKKwkJaWYgKG9iai0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQltYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhjb21taXQpOworCQkJaWYgKGV2ZXJ5Ym9keV91bmludGVyZXN0aW5nKGxpc3QpKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJldnMtPm1pbl9hZ2UgIT0gLTEgJiYgKGNvbW1pdC0+ZGF0ZSA+IHJldnMtPm1pbl9hZ2UpKQorCQkJY29udGludWU7CisJCXAgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KGNvbW1pdCwgcCktPm5leHQ7CisJfQorCWlmIChyZXZzLT5ib3VuZGFyeSkgeworCQkvKiBtYXJrIHRoZSBvbmVzIHRoYXQgYXJlIG9uIHRoZSByZXN1bHQgbGlzdCBmaXJzdCAqLworCQlmb3IgKGxpc3QgPSBuZXdsaXN0OyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRNUF9NQVJLOworCQl9CisJCWZvciAobGlzdCA9IG5ld2xpc3Q7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQkJc3RydWN0IG9iamVjdCAqb2JqID0gJmNvbW1pdC0+b2JqZWN0OworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQ7CisJCQlpZiAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQkJY29udGludWU7CisJCQlmb3IgKHBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKwkJCSAgICAgcGFyZW50OworCQkJICAgICBwYXJlbnQgPSBwYXJlbnQtPm5leHQpIHsKKwkJCQlzdHJ1Y3QgY29tbWl0ICpwY29tbWl0ID0gcGFyZW50LT5pdGVtOworCQkJCWlmICghKHBjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJCQljb250aW51ZTsKKwkJCQlwY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gQk9VTkRBUlk7CisJCQkJaWYgKHBjb21taXQtPm9iamVjdC5mbGFncyAmIFRNUF9NQVJLKQorCQkJCQljb250aW51ZTsKKwkJCQlwY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVE1QX01BUks7CisJCQkJcCA9ICZjb21taXRfbGlzdF9pbnNlcnQocGNvbW1pdCwgcCktPm5leHQ7CisJCQl9CisJCX0KKwkJZm9yIChsaXN0ID0gbmV3bGlzdDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCQljb21taXQtPm9iamVjdC5mbGFncyAmPSB+VE1QX01BUks7CisJCX0KKwl9CisJcmV2cy0+Y29tbWl0cyA9IG5ld2xpc3Q7Cit9CisKK3N0YXRpYyBpbnQgYWxsX2ZsYWdzOworc3RhdGljIHN0cnVjdCByZXZfaW5mbyAqYWxsX3JldnM7CisKK3N0YXRpYyBpbnQgaGFuZGxlX29uZV9yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSBnZXRfcmVmZXJlbmNlKGFsbF9yZXZzLCBwYXRoLCBzaGExLCBhbGxfZmxhZ3MpOworCWFkZF9wZW5kaW5nX29iamVjdChhbGxfcmV2cywgb2JqZWN0LCAiIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9hbGwoc3RydWN0IHJldl9pbmZvICpyZXZzLCB1bnNpZ25lZCBmbGFncykKK3sKKwlhbGxfcmV2cyA9IHJldnM7CisJYWxsX2ZsYWdzID0gZmxhZ3M7CisJZm9yX2VhY2hfcmVmKGhhbmRsZV9vbmVfcmVmKTsKK30KKworc3RhdGljIGludCBhZGRfcGFyZW50c19vbmx5KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICppdDsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJaWYgKCphcmcgPT0gJ14nKSB7CisJCWZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJCWFyZysrOworCX0KKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKDEpIHsKKwkJaXQgPSBnZXRfcmVmZXJlbmNlKHJldnMsIGFyZywgc2hhMSwgMCk7CisJCWlmIChzdHJjbXAoaXQtPnR5cGUsIHRhZ190eXBlKSkKKwkJCWJyZWFrOworCQltZW1jcHkoc2hhMSwgKChzdHJ1Y3QgdGFnKilpdCktPnRhZ2dlZC0+c2hhMSwgMjApOworCX0KKwlpZiAoc3RyY21wKGl0LT50eXBlLCBjb21taXRfdHlwZSkpCisJCXJldHVybiAwOworCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopaXQ7CisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQlpdCA9ICZwYXJlbnRzLT5pdGVtLT5vYmplY3Q7CisJCWl0LT5mbGFncyB8PSBmbGFnczsKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIGl0LCBhcmcpOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBpbml0X3JldmlzaW9ucyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJbWVtc2V0KHJldnMsIDAsIHNpemVvZigqcmV2cykpOworCisJcmV2cy0+YWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJcmV2cy0+aWdub3JlX21lcmdlcyA9IDE7CisJcmV2cy0+cHJ1bmluZy5yZWN1cnNpdmUgPSAxOworCXJldnMtPnBydW5pbmcuYWRkX3JlbW92ZSA9IGZpbGVfYWRkX3JlbW92ZTsKKwlyZXZzLT5wcnVuaW5nLmNoYW5nZSA9IGZpbGVfY2hhbmdlOworCXJldnMtPmxpZm8gPSAxOworCXJldnMtPmRlbnNlID0gMTsKKwlyZXZzLT5wcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJcmV2cy0+bWF4X2FnZSA9IC0xOworCXJldnMtPm1pbl9hZ2UgPSAtMTsKKwlyZXZzLT5tYXhfY291bnQgPSAtMTsKKworCXJldnMtPnBydW5lX2ZuID0gTlVMTDsKKwlyZXZzLT5wcnVuZV9kYXRhID0gTlVMTDsKKworCXJldnMtPnRvcG9fc2V0dGVyID0gdG9wb19zb3J0X2RlZmF1bHRfc2V0dGVyOworCXJldnMtPnRvcG9fZ2V0dGVyID0gdG9wb19zb3J0X2RlZmF1bHRfZ2V0dGVyOworCisJcmV2cy0+Y29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX0RFRkFVTFQ7CisKKwlkaWZmX3NldHVwKCZyZXZzLT5kaWZmb3B0KTsKK30KKworLyoKKyAqIFBhcnNlIHJldmlzaW9uIGluZm9ybWF0aW9uLCBmaWxsaW5nIGluIHRoZSAicmV2X2luZm8iIHN0cnVjdHVyZSwKKyAqIGFuZCByZW1vdmluZyB0aGUgdXNlZCBhcmd1bWVudHMgZnJvbSB0aGUgYXJndW1lbnQgbGlzdC4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGxlZnQgdGhhdCB3ZXJlbid0IHJlY29nbml6ZWQKKyAqICh3aGljaCBhcmUgYWxzbyBtb3ZlZCB0byB0aGUgaGVhZCBvZiB0aGUgYXJndW1lbnQgbGlzdCkKKyAqLworaW50IHNldHVwX3JldmlzaW9ucyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqZGVmKQoreworCWludCBpLCBmbGFncywgc2Vlbl9kYXNoZGFzaDsKKwljb25zdCBjaGFyICoqdW5yZWNvZ25pemVkID0gYXJndiArIDE7CisJaW50IGxlZnQgPSAxOworCisJLyogRmlyc3QsIHNlYXJjaCBmb3IgIi0tIiAqLworCXNlZW5fZGFzaGRhc2ggPSAwOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKHN0cmNtcChhcmcsICItLSIpKQorCQkJY29udGludWU7CisJCWFyZ3ZbaV0gPSBOVUxMOworCQlhcmdjID0gaTsKKwkJcmV2cy0+cHJ1bmVfZGF0YSA9IGdldF9wYXRoc3BlYyhyZXZzLT5wcmVmaXgsIGFyZ3YgKyBpICsgMSk7CisJCXNlZW5fZGFzaGRhc2ggPSAxOworCQlicmVhazsKKwl9CisKKwlmbGFncyA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNoYXIgKmRvdGRvdDsKKwkJaW50IGxvY2FsX2ZsYWdzOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaW50IG9wdHM7CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1tYXgtY291bnQ9IiwgMTIpKSB7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmcgKyAxMik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBhY2NlcHQgLTxkaWdpdD4sIGxpa2UgdHJhZGl0aW9uYWwgImhlYWQiICovCisJCQlpZiAoKCphcmcgPT0gJy0nKSAmJiBpc2RpZ2l0KGFyZ1sxXSkpIHsKKwkJCQlyZXZzLT5tYXhfY291bnQgPSBhdG9pKGFyZyArIDEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJCWlmIChhcmdjIDw9IGkgKyAxKQorCQkJCQlkaWUoIi1uIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iik7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmd2WysraV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywiLW4iLDIpKSB7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmcgKyAyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLW1heC1hZ2U9IiwgMTApKSB7CisJCQkJcmV2cy0+bWF4X2FnZSA9IGF0b2koYXJnICsgMTApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tc2luY2U9IiwgOCkpIHsKKwkJCQlyZXZzLT5tYXhfYWdlID0gYXBwcm94aWRhdGUoYXJnICsgOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1hZnRlcj0iLCA4KSkgeworCQkJCXJldnMtPm1heF9hZ2UgPSBhcHByb3hpZGF0ZShhcmcgKyA4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLW1pbi1hZ2U9IiwgMTApKSB7CisJCQkJcmV2cy0+bWluX2FnZSA9IGF0b2koYXJnICsgMTApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tYmVmb3JlPSIsIDkpKSB7CisJCQkJcmV2cy0+bWluX2FnZSA9IGFwcHJveGlkYXRlKGFyZyArIDkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tdW50aWw9IiwgOCkpIHsKKwkJCQlyZXZzLT5taW5fYWdlID0gYXBwcm94aWRhdGUoYXJnICsgOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJaGFuZGxlX2FsbChyZXZzLCBmbGFncyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vdCIpKSB7CisJCQkJZmxhZ3MgXj0gVU5JTlRFUkVTVElORzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGVmYXVsdCIpKSB7CisJCQkJaWYgKCsraSA+PSBhcmdjKQorCQkJCQlkaWUoImJhZCAtLWRlZmF1bHQgYXJndW1lbnQiKTsKKwkJCQlkZWYgPSBhcmd2W2ldOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS10b3BvLW9yZGVyIikpIHsKKwkJCQlyZXZzLT50b3BvX29yZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGF0ZS1vcmRlciIpKSB7CisJCQkJcmV2cy0+bGlmbyA9IDA7CisJCQkJcmV2cy0+dG9wb19vcmRlciA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXBhcmVudHMiKSkgeworCQkJCXJldnMtPnBhcmVudHMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1kZW5zZSIpKSB7CisJCQkJcmV2cy0+ZGVuc2UgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zcGFyc2UiKSkgeworCQkJCXJldnMtPmRlbnNlID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVtb3ZlLWVtcHR5IikpIHsKKwkJCQlyZXZzLT5yZW1vdmVfZW1wdHlfdHJlZXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1tZXJnZXMiKSkgeworCQkJCXJldnMtPm5vX21lcmdlcyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWJvdW5kYXJ5IikpIHsKKwkJCQlyZXZzLT5ib3VuZGFyeSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW9iamVjdHMiKSkgeworCQkJCXJldnMtPnRhZ19vYmplY3RzID0gMTsKKwkJCQlyZXZzLT50cmVlX29iamVjdHMgPSAxOworCQkJCXJldnMtPmJsb2Jfb2JqZWN0cyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW9iamVjdHMtZWRnZSIpKSB7CisJCQkJcmV2cy0+dGFnX29iamVjdHMgPSAxOworCQkJCXJldnMtPnRyZWVfb2JqZWN0cyA9IDE7CisJCQkJcmV2cy0+YmxvYl9vYmplY3RzID0gMTsKKwkJCQlyZXZzLT5lZGdlX2hpbnQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS11bnBhY2tlZCIpKSB7CisJCQkJcmV2cy0+dW5wYWNrZWQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXIiKSkgeworCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCXJldnMtPmRpZmZvcHQucmVjdXJzaXZlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi10IikpIHsKKwkJCQlyZXZzLT5kaWZmID0gMTsKKwkJCQlyZXZzLT5kaWZmb3B0LnJlY3Vyc2l2ZSA9IDE7CisJCQkJcmV2cy0+ZGlmZm9wdC50cmVlX2luX3JlY3Vyc2l2ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItbSIpKSB7CisJCQkJcmV2cy0+aWdub3JlX21lcmdlcyA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItYyIpKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzID0gMDsKKwkJCQlyZXZzLT5jb21iaW5lX21lcmdlcyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWNjIikpIHsKKwkJCQlyZXZzLT5kaWZmID0gMTsKKwkJCQlyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAxOworCQkJCXJldnMtPmNvbWJpbmVfbWVyZ2VzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi12IikpIHsKKwkJCQlyZXZzLT52ZXJib3NlX2hlYWRlciA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1wcmV0dHkiLCA4KSkgeworCQkJCXJldnMtPnZlcmJvc2VfaGVhZGVyID0gMTsKKwkJCQlyZXZzLT5jb21taXRfZm9ybWF0ID0gZ2V0X2NvbW1pdF9mb3JtYXQoYXJnKzgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yb290IikpIHsKKwkJCQlyZXZzLT5zaG93X3Jvb3RfZGlmZiA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vLWNvbW1pdC1pZCIpKSB7CisJCQkJcmV2cy0+bm9fY29tbWl0X2lkID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYWx3YXlzIikpIHsKKwkJCQlyZXZzLT5hbHdheXNfc2hvd19oZWFkZXIgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1hYmJyZXYiKSkgeworCQkJCXJldnMtPmFiYnJldiA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFiYnJldiIpKSB7CisJCQkJcmV2cy0+YWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1hYmJyZXY9IiwgOSkpIHsKKwkJCQlyZXZzLT5hYmJyZXYgPSBzdHJ0b3VsKGFyZyArIDksIE5VTEwsIDEwKTsKKwkJCQlpZiAocmV2cy0+YWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJCXJldnMtPmFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJCWVsc2UgaWYgKHJldnMtPmFiYnJldiA+IDQwKQorCQkJCQlyZXZzLT5hYmJyZXYgPSA0MDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYWJicmV2LWNvbW1pdCIpKSB7CisJCQkJcmV2cy0+YWJicmV2X2NvbW1pdCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWZ1bGwtZGlmZiIpKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJcmV2cy0+ZnVsbF9kaWZmID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW9wdHMgPSBkaWZmX29wdF9wYXJzZSgmcmV2cy0+ZGlmZm9wdCwgYXJnditpLCBhcmdjLWkpOworCQkJaWYgKG9wdHMgPiAwKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJaSArPSBvcHRzIC0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSp1bnJlY29nbml6ZWQrKyA9IGFyZzsKKwkJCWxlZnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRvdGRvdCA9IHN0cnN0cihhcmcsICIuLiIpOworCQlpZiAoZG90ZG90KSB7CisJCQl1bnNpZ25lZCBjaGFyIGZyb21fc2hhMVsyMF07CisJCQljb25zdCBjaGFyICpuZXh0ID0gZG90ZG90ICsgMjsKKwkJCWNvbnN0IGNoYXIgKnRoaXMgPSBhcmc7CisJCQkqZG90ZG90ID0gMDsKKwkJCWlmICghKm5leHQpCisJCQkJbmV4dCA9ICJIRUFEIjsKKwkJCWlmIChkb3Rkb3QgPT0gYXJnKQorCQkJCXRoaXMgPSAiSEVBRCI7CisJCQlpZiAoIWdldF9zaGExKHRoaXMsIGZyb21fc2hhMSkgJiYKKwkJCSAgICAhZ2V0X3NoYTEobmV4dCwgc2hhMSkpIHsKKwkJCQlzdHJ1Y3Qgb2JqZWN0ICpleGNsdWRlOworCQkJCXN0cnVjdCBvYmplY3QgKmluY2x1ZGU7CisKKwkJCQlleGNsdWRlID0gZ2V0X3JlZmVyZW5jZShyZXZzLCB0aGlzLCBmcm9tX3NoYTEsIGZsYWdzIF4gVU5JTlRFUkVTVElORyk7CisJCQkJaW5jbHVkZSA9IGdldF9yZWZlcmVuY2UocmV2cywgbmV4dCwgc2hhMSwgZmxhZ3MpOworCQkJCWlmICghZXhjbHVkZSB8fCAhaW5jbHVkZSkKKwkJCQkJZGllKCJJbnZhbGlkIHJldmlzaW9uIHJhbmdlICVzLi4lcyIsIGFyZywgbmV4dCk7CisKKwkJCQlpZiAoIXNlZW5fZGFzaGRhc2gpIHsKKwkJCQkJKmRvdGRvdCA9ICcuJzsKKwkJCQkJdmVyaWZ5X25vbl9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZyk7CisJCQkJfQorCQkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBleGNsdWRlLCB0aGlzKTsKKwkJCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgaW5jbHVkZSwgbmV4dCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqZG90ZG90ID0gJy4nOworCQl9CisJCWRvdGRvdCA9IHN0cnN0cihhcmcsICJeQCIpOworCQlpZiAoZG90ZG90ICYmICFkb3Rkb3RbMl0pIHsKKwkJCSpkb3Rkb3QgPSAwOworCQkJaWYgKGFkZF9wYXJlbnRzX29ubHkocmV2cywgYXJnLCBmbGFncykpCisJCQkJY29udGludWU7CisJCQkqZG90ZG90ID0gJ14nOworCQl9CisJCWxvY2FsX2ZsYWdzID0gMDsKKwkJaWYgKCphcmcgPT0gJ14nKSB7CisJCQlsb2NhbF9mbGFncyA9IFVOSU5URVJFU1RJTkc7CisJCQlhcmcrKzsKKwkJfQorCQlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkgeworCQkJaW50IGo7CisKKwkJCWlmIChzZWVuX2Rhc2hkYXNoIHx8IGxvY2FsX2ZsYWdzKQorCQkJCWRpZSgiYmFkIHJldmlzaW9uICclcyciLCBhcmcpOworCisJCQkvKiBJZiB3ZSBkaWRuJ3QgaGF2ZSBhICItLSI6CisJCQkgKiAoMSkgYWxsIGZpbGVuYW1lcyBtdXN0IGV4aXN0OworCQkJICogKDIpIGFsbCByZXYtYXJncyBtdXN0IG5vdCBiZSBpbnRlcnByZXRhYmxlCisJCQkgKiAgICAgYXMgYSB2YWxpZCBmaWxlbmFtZS4KKwkJCSAqIGJ1dCB0aGUgbGF0dGVyIHdlIGhhdmUgY2hlY2tlZCBpbiB0aGUgbWFpbiBsb29wLgorCQkJICovCisJCQlmb3IgKGogPSBpOyBqIDwgYXJnYzsgaisrKQorCQkJCXZlcmlmeV9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZ3Zbal0pOworCisJCQlyZXZzLT5wcnVuZV9kYXRhID0gZ2V0X3BhdGhzcGVjKHJldnMtPnByZWZpeCwgYXJndiArIGkpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzZWVuX2Rhc2hkYXNoKQorCQkJdmVyaWZ5X25vbl9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZyk7CisJCW9iamVjdCA9IGdldF9yZWZlcmVuY2UocmV2cywgYXJnLCBzaGExLCBmbGFncyBeIGxvY2FsX2ZsYWdzKTsKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgYXJnKTsKKwl9CisJaWYgKGRlZiAmJiAhcmV2cy0+cGVuZGluZ19vYmplY3RzKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKwkJaWYgKGdldF9zaGExKGRlZiwgc2hhMSkpCisJCQlkaWUoImJhZCBkZWZhdWx0IHJldmlzaW9uICclcyciLCBkZWYpOworCQlvYmplY3QgPSBnZXRfcmVmZXJlbmNlKHJldnMsIGRlZiwgc2hhMSwgMCk7CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsIGRlZik7CisJfQorCisJaWYgKHJldnMtPnRvcG9fb3JkZXIgfHwgcmV2cy0+dW5wYWNrZWQpCisJCXJldnMtPmxpbWl0ZWQgPSAxOworCisJaWYgKHJldnMtPnBydW5lX2RhdGEpIHsKKwkJZGlmZl90cmVlX3NldHVwX3BhdGhzKHJldnMtPnBydW5lX2RhdGEsICZyZXZzLT5wcnVuaW5nKTsKKwkJcmV2cy0+cHJ1bmVfZm4gPSB0cnlfdG9fc2ltcGxpZnlfY29tbWl0OworCQlpZiAoIXJldnMtPmZ1bGxfZGlmZikKKwkJCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhyZXZzLT5wcnVuZV9kYXRhLCAmcmV2cy0+ZGlmZm9wdCk7CisJfQorCWlmIChyZXZzLT5jb21iaW5lX21lcmdlcykgeworCQlyZXZzLT5pZ25vcmVfbWVyZ2VzID0gMDsKKwkJaWYgKHJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyAmJgorCQkgICAgKHJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCAhPSBESUZGX0ZPUk1BVF9ESUZGU1RBVCkpCisJCQlyZXZzLT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9QQVRDSDsKKwl9CisJcmV2cy0+ZGlmZm9wdC5hYmJyZXYgPSByZXZzLT5hYmJyZXY7CisJZGlmZl9zZXR1cF9kb25lKCZyZXZzLT5kaWZmb3B0KTsKKworCXJldHVybiBsZWZ0OworfQorCit2b2lkIHByZXBhcmVfcmV2aXNpb25fd2FsayhzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJc3RydWN0IG9iamVjdF9saXN0ICpsaXN0OworCisJbGlzdCA9IHJldnMtPnBlbmRpbmdfb2JqZWN0czsKKwlyZXZzLT5wZW5kaW5nX29iamVjdHMgPSBOVUxMOworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGhhbmRsZV9jb21taXQocmV2cywgbGlzdC0+aXRlbSwgbGlzdC0+bmFtZSk7CisJCWlmIChjb21taXQpIHsKKwkJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU0VFTikpIHsKKwkJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBTRUVOOworCQkJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgJnJldnMtPmNvbW1pdHMpOworCQkJfQorCQl9CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCX0KKworCWlmIChyZXZzLT5ub193YWxrKQorCQlyZXR1cm47CisJaWYgKHJldnMtPmxpbWl0ZWQpCisJCWxpbWl0X2xpc3QocmV2cyk7CisJaWYgKHJldnMtPnRvcG9fb3JkZXIpCisJCXNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXJfZm4oJnJldnMtPmNvbW1pdHMsIHJldnMtPmxpZm8sCisJCQkJCSAgICAgcmV2cy0+dG9wb19zZXR0ZXIsCisJCQkJCSAgICAgcmV2cy0+dG9wb19nZXR0ZXIpOworfQorCitzdGF0aWMgaW50IHJld3JpdGVfb25lKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqKnBwKQoreworCWZvciAoOzspIHsKKwkJc3RydWN0IGNvbW1pdCAqcCA9ICpwcDsKKwkJaWYgKCFyZXZzLT5saW1pdGVkKQorCQkJYWRkX3BhcmVudHNfdG9fbGlzdChyZXZzLCBwLCAmcmV2cy0+Y29tbWl0cyk7CisJCWlmIChwLT5vYmplY3QuZmxhZ3MgJiAoVFJFRUNIQU5HRSB8IFVOSU5URVJFU1RJTkcpKQorCQkJcmV0dXJuIDA7CisJCWlmICghcC0+cGFyZW50cykKKwkJCXJldHVybiAtMTsKKwkJKnBwID0gcC0+cGFyZW50cy0+aXRlbTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJld3JpdGVfcGFyZW50cyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKipwcCA9ICZjb21taXQtPnBhcmVudHM7CisJd2hpbGUgKCpwcCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudCA9ICpwcDsKKwkJaWYgKHJld3JpdGVfb25lKHJldnMsICZwYXJlbnQtPml0ZW0pIDwgMCkgeworCQkJKnBwID0gcGFyZW50LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJcHAgPSAmcGFyZW50LT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgbWFya19ib3VuZGFyeV90b19zaG93KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnAgPSBjb21taXQtPnBhcmVudHM7CisJd2hpbGUgKHApIHsKKwkJY29tbWl0ID0gcC0+aXRlbTsKKwkJcCA9IHAtPm5leHQ7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEJPVU5EQVJZKQorCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gQk9VTkRBUllfU0hPVzsKKwl9Cit9CisKK3N0cnVjdCBjb21taXQgKmdldF9yZXZpc2lvbihzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gcmV2cy0+Y29tbWl0czsKKworCWlmICghbGlzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDaGVjayB0aGUgbWF4X2NvdW50IC4uLiAqLworCXN3aXRjaCAocmV2cy0+bWF4X2NvdW50KSB7CisJY2FzZSAtMToKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlyZXR1cm4gTlVMTDsKKwlkZWZhdWx0OgorCQlyZXZzLT5tYXhfY291bnQtLTsKKwl9CisKKwlkbyB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHJldnMtPmNvbW1pdHMtPml0ZW07CisKKwkJcmV2cy0+Y29tbWl0cyA9IHJldnMtPmNvbW1pdHMtPm5leHQ7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZW4ndCBkb25lIHRoZSBsaXN0IGxpbWl0aW5nLCB3ZSBuZWVkIHRvIGxvb2sgYXQKKwkJICogdGhlIHBhcmVudHMgaGVyZS4gV2UgYWxzbyBuZWVkIHRvIGRvIHRoZSBkYXRlLWJhc2VkIGxpbWl0aW5nCisJCSAqIHRoYXQgd2UnZCBvdGhlcndpc2UgaGF2ZSBkb25lIGluIGxpbWl0X2xpc3QoKS4KKwkJICovCisJCWlmICghcmV2cy0+bGltaXRlZCkgeworCQkJaWYgKChyZXZzLT51bnBhY2tlZCAmJgorCQkJICAgICBoYXNfc2hhMV9wYWNrKGNvbW1pdC0+b2JqZWN0LnNoYTEpKSB8fAorCQkJICAgIChyZXZzLT5tYXhfYWdlICE9IC0xICYmCisJCQkgICAgIChjb21taXQtPmRhdGUgPCByZXZzLT5tYXhfYWdlKSkpCisJCQkJY29udGludWU7CisJCQlhZGRfcGFyZW50c190b19saXN0KHJldnMsIGNvbW1pdCwgJnJldnMtPmNvbW1pdHMpOworCQl9CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNIT1dOKQorCQkJY29udGludWU7CisKKwkJLyogV2Ugd2FudCB0byBzaG93IGJvdW5kYXJ5IGNvbW1pdHMgb25seSB3aGVuIHRoZWlyCisJCSAqIGNoaWxkcmVuIGFyZSBzaG93bi4gIFdoZW4gcGF0aC1saW1pdGVyIGlzIGluIGVmZmVjdCwKKwkJICogcmV3cml0ZV9wYXJlbnRzKCkgZHJvcHMgc29tZSBjb21taXRzIGZyb20gZ2V0dGluZyBzaG93biwKKwkJICogYW5kIHRoZXJlIGlzIG5vIHBvaW50IHNob3dpbmcgYm91bmRhcnkgcGFyZW50cyB0aGF0CisJCSAqIGFyZSBub3Qgc2hvd24uICBBZnRlciByZXdyaXRlX3BhcmVudHMoKSByZXdyaXRlcyB0aGUKKwkJICogcGFyZW50cyBvZiBhIGNvbW1pdCB0aGF0IGlzIHNob3duLCB3ZSBtYXJrIHRoZSBib3VuZGFyeQorCQkgKiBwYXJlbnRzIHdpdGggQk9VTkRBUllfU0hPVy4KKwkJICovCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEJPVU5EQVJZX1NIT1cpIHsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFNIT1dOOworCQkJcmV0dXJuIGNvbW1pdDsKKwkJfQorCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCWlmIChyZXZzLT5taW5fYWdlICE9IC0xICYmIChjb21taXQtPmRhdGUgPiByZXZzLT5taW5fYWdlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmV2cy0+bm9fbWVyZ2VzICYmCisJCSAgICBjb21taXQtPnBhcmVudHMgJiYgY29tbWl0LT5wYXJlbnRzLT5uZXh0KQorCQkJY29udGludWU7CisJCWlmIChyZXZzLT5wcnVuZV9mbiAmJiByZXZzLT5kZW5zZSkgeworCQkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBUUkVFQ0hBTkdFKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZXZzLT5wYXJlbnRzKQorCQkJCXJld3JpdGVfcGFyZW50cyhyZXZzLCBjb21taXQpOworCQl9CisJCWlmIChyZXZzLT5ib3VuZGFyeSkKKwkJCW1hcmtfYm91bmRhcnlfdG9fc2hvdyhjb21taXQpOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBTSE9XTjsKKwkJcmV0dXJuIGNvbW1pdDsKKwl9IHdoaWxlIChyZXZzLT5jb21taXRzKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3JldmlzaW9uLmggYi9yZXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODViMGYKLS0tIC9kZXYvbnVsbAorKysgYi9yZXZpc2lvbi5oCkBAIC0wLDAgKzEsMTA2IEBACisjaWZuZGVmIFJFVklTSU9OX0gKKyNkZWZpbmUgUkVWSVNJT05fSAorCisjZGVmaW5lIFNFRU4JCSgxdTw8MCkKKyNkZWZpbmUgVU5JTlRFUkVTVElORyAgICgxdTw8MSkKKyNkZWZpbmUgVFJFRUNIQU5HRQkoMXU8PDIpCisjZGVmaW5lIFNIT1dOCQkoMXU8PDMpCisjZGVmaW5lIFRNUF9NQVJLCSgxdTw8NCkgLyogZm9yIGlzb2xhdGVkIGNhc2VzOyBjbGVhbiBhZnRlciB1c2UgKi8KKyNkZWZpbmUgQk9VTkRBUlkJKDF1PDw1KQorI2RlZmluZSBCT1VOREFSWV9TSE9XCSgxdTw8NikKKyNkZWZpbmUgQURERUQJCSgxdTw8NykJLyogUGFyZW50cyBhbHJlYWR5IHBhcnNlZCBhbmQgYWRkZWQ/ICovCisKK3N0cnVjdCByZXZfaW5mbzsKK3N0cnVjdCBsb2dfaW5mbzsKKwordHlwZWRlZiB2b2lkIChwcnVuZV9mbl90KShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCk7CisKK3N0cnVjdCByZXZfaW5mbyB7CisJLyogU3RhcnRpbmcgbGlzdCAqLworCXN0cnVjdCBjb21taXRfbGlzdCAqY29tbWl0czsKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKnBlbmRpbmdfb2JqZWN0czsKKworCS8qIEJhc2ljIGluZm9ybWF0aW9uICovCisJY29uc3QgY2hhciAqcHJlZml4OworCXZvaWQgKnBydW5lX2RhdGE7CisJcHJ1bmVfZm5fdCAqcHJ1bmVfZm47CisKKwkvKiBUcmF2ZXJzYWwgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJZGVuc2U6MSwKKwkJCW5vX21lcmdlczoxLAorCQkJbm9fd2FsazoxLAorCQkJcmVtb3ZlX2VtcHR5X3RyZWVzOjEsCisJCQlsaWZvOjEsCisJCQl0b3BvX29yZGVyOjEsCisJCQl0YWdfb2JqZWN0czoxLAorCQkJdHJlZV9vYmplY3RzOjEsCisJCQlibG9iX29iamVjdHM6MSwKKwkJCWVkZ2VfaGludDoxLAorCQkJbGltaXRlZDoxLAorCQkJdW5wYWNrZWQ6MSwKKwkJCWJvdW5kYXJ5OjEsCisJCQlwYXJlbnRzOjE7CisKKwkvKiBEaWZmIGZsYWdzICovCisJdW5zaWduZWQgaW50CWRpZmY6MSwKKwkJCWZ1bGxfZGlmZjoxLAorCQkJc2hvd19yb290X2RpZmY6MSwKKwkJCW5vX2NvbW1pdF9pZDoxLAorCQkJdmVyYm9zZV9oZWFkZXI6MSwKKwkJCWlnbm9yZV9tZXJnZXM6MSwKKwkJCWNvbWJpbmVfbWVyZ2VzOjEsCisJCQlkZW5zZV9jb21iaW5lZF9tZXJnZXM6MSwKKwkJCWFsd2F5c19zaG93X2hlYWRlcjoxOworCisJLyogRm9ybWF0IGluZm8gKi8KKwl1bnNpZ25lZCBpbnQJc2hvd25fb25lOjEsCisJCQlhYmJyZXZfY29tbWl0OjE7CisJdW5zaWduZWQgaW50CWFiYnJldjsKKwllbnVtIGNtaXRfZm10CWNvbW1pdF9mb3JtYXQ7CisJc3RydWN0IGxvZ19pbmZvICpsb2dpbmZvOworCWludAkJbnIsIHRvdGFsOworCWNvbnN0IGNoYXIJKm1pbWVfYm91bmRhcnk7CisJY29uc3QgY2hhcgkqYWRkX3NpZ25vZmY7CisJY29uc3QgY2hhcgkqZXh0cmFfaGVhZGVyczsKKworCS8qIHNwZWNpYWwgbGltaXRzICovCisJaW50IG1heF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIG1heF9hZ2U7CisJdW5zaWduZWQgbG9uZyBtaW5fYWdlOworCisJLyogZGlmZiBpbmZvIGZvciBwYXRjaGVzIGFuZCBmb3IgcGF0aHMgbGltaXRpbmcgKi8KKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIGRpZmZvcHQ7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBwcnVuaW5nOworCisJdG9wb19zb3J0X3NldF9mbl90IHRvcG9fc2V0dGVyOworCXRvcG9fc29ydF9nZXRfZm5fdCB0b3BvX2dldHRlcjsKK307CisKKyNkZWZpbmUgUkVWX1RSRUVfU0FNRQkJMAorI2RlZmluZSBSRVZfVFJFRV9ORVcJCTEKKyNkZWZpbmUgUkVWX1RSRUVfRElGRkVSRU5UCTIKKworLyogcmV2aXNpb24uYyAqLworZXh0ZXJuIGludCByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHN0cnVjdCByZXZfaW5mbyAqLCBzdHJ1Y3QgdHJlZSAqdDEpOworZXh0ZXJuIGludCByZXZfY29tcGFyZV90cmVlKHN0cnVjdCByZXZfaW5mbyAqLCBzdHJ1Y3QgdHJlZSAqdDEsIHN0cnVjdCB0cmVlICp0Mik7CisKK2V4dGVybiB2b2lkIGluaXRfcmV2aXNpb25zKHN0cnVjdCByZXZfaW5mbyAqcmV2cyk7CitleHRlcm4gaW50IHNldHVwX3JldmlzaW9ucyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqZGVmKTsKK2V4dGVybiB2b2lkIHByZXBhcmVfcmV2aXNpb25fd2FsayhzdHJ1Y3QgcmV2X2luZm8gKnJldnMpOworZXh0ZXJuIHN0cnVjdCBjb21taXQgKmdldF9yZXZpc2lvbihzdHJ1Y3QgcmV2X2luZm8gKnJldnMpOworCitleHRlcm4gdm9pZCBtYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpOworZXh0ZXJuIHZvaWQgbWFya190cmVlX3VuaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWUgKnRyZWUpOworCitzdHJ1Y3QgbmFtZV9wYXRoIHsKKwlzdHJ1Y3QgbmFtZV9wYXRoICp1cDsKKwlpbnQgZWxlbV9sZW47CisJY29uc3QgY2hhciAqZWxlbTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKiphZGRfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaiwKKwkJCQkgICAgICAgc3RydWN0IG9iamVjdF9saXN0ICoqcCwKKwkJCQkgICAgICAgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnNoLmMgYi9yc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE2NmFkCi0tLSAvZGV2L251bGwKKysrIGIvcnNoLmMKQEAgLTAsMCArMSwxMTYgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJyc2guaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisKKyNkZWZpbmUgQ09NTUFORF9TSVpFIDQwOTYKKworLyoKKyAqIEFwcGVuZCBhIHN0cmluZyB0byBhIHN0cmluZyBidWZmZXIsIHdpdGggb3Igd2l0aG91dCBzaGVsbCBxdW90aW5nLgorICogUmV0dXJuIHRydWUgaWYgdGhlIGJ1ZmZlciBvdmVyZmxvd2VkLgorICovCitzdGF0aWMgaW50IGFkZF90b19zdHJpbmcoY2hhciAqKnB0cnAsIGludCAqc2l6ZXAsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHF1b3RlKQoreworCWNoYXIgKnAgPSAqcHRycDsKKwlpbnQgc2l6ZSA9ICpzaXplcDsKKwlpbnQgb2M7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIHF1b3RlICkgeworCQlvYyA9IHNxX3F1b3RlX2J1ZihwLCBzaXplLCBzdHIpOworCX0gZWxzZSB7CisJCW9jID0gc3RybGVuKHN0cik7CisJCW1lbWNweShwLCBzdHIsIChvYyA+PSBzaXplKSA/IHNpemUtMSA6IG9jKTsKKwl9CisKKwlpZiAoIG9jID49IHNpemUgKSB7CisJCWVyciA9IDE7CisJCW9jID0gc2l6ZS0xOworCX0KKworCSpwdHJwICArPSBvYzsKKwkqKnB0cnAgID0gJ1wwJzsKKwkqc2l6ZXAgLT0gb2M7CisJcmV0dXJuIGVycjsKK30KKworaW50IHNldHVwX2Nvbm5lY3Rpb24oaW50ICpmZF9pbiwgaW50ICpmZF9vdXQsIGNvbnN0IGNoYXIgKnJlbW90ZV9wcm9nLCAKKwkJICAgICBjaGFyICp1cmwsIGludCBybXRfYXJnYywgY2hhciAqKnJtdF9hcmd2KQoreworCWNoYXIgKmhvc3Q7CisJY2hhciAqcGF0aDsKKwlpbnQgc3ZbMl07CisJY2hhciBjb21tYW5kW0NPTU1BTkRfU0laRV07CisJY2hhciAqcG9zbjsKKwlpbnQgc2l6ZW47CisJaW50IG9mOworCWludCBpOworCXBpZF90IHBpZDsKKworCWlmICghc3RyY21wKHVybCwgIi0iKSkgeworCQkqZmRfaW4gPSAwOworCQkqZmRfb3V0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaG9zdCA9IHN0cnN0cih1cmwsICIvLyIpOworCWlmIChob3N0KSB7CisJCWhvc3QgKz0gMjsKKwkJcGF0aCA9IHN0cmNocihob3N0LCAnLycpOworCX0gZWxzZSB7CisJCWhvc3QgPSB1cmw7CisJCXBhdGggPSBzdHJjaHIoaG9zdCwgJzonKTsKKwkJaWYgKHBhdGgpCisJCQkqKHBhdGgrKykgPSAnXDAnOworCX0KKwlpZiAoIXBhdGgpIHsKKwkJcmV0dXJuIGVycm9yKCJCYWQgVVJMOiAlcyIsIHVybCk7CisJfQorCS8qICRHSVRfUlNIIDxob3N0PiAiZW52IEdJVF9ESVI9PHBhdGg+IDxyZW1vdGVfcHJvZz4gPGFyZ3MuLi4+IiAqLworCXNpemVuID0gQ09NTUFORF9TSVpFOworCXBvc24gPSBjb21tYW5kOworCW9mID0gMDsKKwlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sICJlbnYgIiwgMCk7CisJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCBHSVRfRElSX0VOVklST05NRU5UICI9IiwgMCk7CisJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCBwYXRoLCAxKTsKKwlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sICIgIiwgMCk7CisJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCByZW1vdGVfcHJvZywgMSk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBybXRfYXJnYyA7IGkrKyApIHsKKwkJb2YgfD0gYWRkX3RvX3N0cmluZygmcG9zbiwgJnNpemVuLCAiICIsIDApOworCQlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sIHJtdF9hcmd2W2ldLCAxKTsKKwl9CisKKwlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sICIgLSIsIDApOworCisJaWYgKCBvZiApCisJCXJldHVybiBlcnJvcigiQ29tbWFuZCBsaW5lIHRvbyBsb25nIik7CisKKwlpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc3YpKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzb2NrZXQiKTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBmb3JrIik7CisJaWYgKCFwaWQpIHsKKwkJY29uc3QgY2hhciAqc3NoLCAqc3NoX2Jhc2VuYW1lOworCQlzc2ggPSBnZXRlbnYoIkdJVF9TU0giKTsKKwkJaWYgKCFzc2gpIHNzaCA9ICJzc2giOworCQlzc2hfYmFzZW5hbWUgPSBzdHJyY2hyKHNzaCwgJy8nKTsKKwkJaWYgKCFzc2hfYmFzZW5hbWUpCisJCQlzc2hfYmFzZW5hbWUgPSBzc2g7CisJCWVsc2UKKwkJCXNzaF9iYXNlbmFtZSsrOworCQljbG9zZShzdlsxXSk7CisJCWR1cDIoc3ZbMF0sIDApOworCQlkdXAyKHN2WzBdLCAxKTsKKwkJZXhlY2xwKHNzaCwgc3NoX2Jhc2VuYW1lLCBob3N0LCBjb21tYW5kLCBOVUxMKTsKKwl9CisJY2xvc2Uoc3ZbMF0pOworCSpmZF9pbiA9IHN2WzFdOworCSpmZF9vdXQgPSBzdlsxXTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JzaC5oIGIvcnNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0MTk0MgotLS0gL2Rldi9udWxsCisrKyBiL3JzaC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBSU0hfSAorI2RlZmluZSBSU0hfSAorCitpbnQgc2V0dXBfY29ubmVjdGlvbihpbnQgKmZkX2luLCBpbnQgKmZkX291dCwgY29uc3QgY2hhciAqcmVtb3RlX3Byb2csIAorCQkgICAgIGNoYXIgKnVybCwgaW50IHJtdF9hcmdjLCBjaGFyICoqcm10X2FyZ3YpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J1bi1jb21tYW5kLmMgYi9ydW4tY29tbWFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjdlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW4tY29tbWFuZC5jCkBAIC0wLDAgKzEsNzQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCitpbnQgcnVuX2NvbW1hbmRfdl9vcHQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgZmxhZ3MpCit7CisJcGlkX3QgcGlkID0gZm9yaygpOworCisJaWYgKHBpZCA8IDApCisJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX0ZPUks7CisJaWYgKCFwaWQpIHsKKwkJaWYgKGZsYWdzICYgUlVOX0NPTU1BTkRfTk9fU1RESU8pIHsKKwkJCWludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJCQlkdXAyKGZkLCAwKTsKKwkJCWR1cDIoZmQsIDEpOworCQkJY2xvc2UoZmQpOworCQl9CisJCWlmIChmbGFncyAmIFJVTl9HSVRfQ01EKSB7CisJCQlleGVjdl9naXRfY21kKGFyZ3YpOworCQl9IGVsc2UgeworCQkJZXhlY3ZwKGFyZ3ZbMF0sIChjaGFyICpjb25zdCopIGFyZ3YpOworCQl9CisJCWRpZSgiZXhlYyAlcyBmYWlsZWQuIiwgYXJndlswXSk7CisJfQorCWZvciAoOzspIHsKKwkJaW50IHN0YXR1cywgY29kZTsKKwkJaW50IHJldHZhbCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKKworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IoIndhaXRwaWQgZmFpbGVkICglcykiLCBzdHJlcnJvcihyZXR2YWwpKTsKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSUQ7CisJCX0KKwkJaWYgKHJldHZhbCAhPSBwaWQpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRDsKKwkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDsKKworCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKQorCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9OT0VYSVQ7CisJCWNvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlpZiAoY29kZSkKKwkJCXJldHVybiAtY29kZTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgcnVuX2NvbW1hbmRfdihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ2MsIGFyZ3YsIDApOworfQorCitpbnQgcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY21kLCAuLi4pCit7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqYXJndltNQVhfUlVOX0NPTU1BTkRfQVJHU107CisJY29uc3QgY2hhciAqYXJnOworCXZhX2xpc3QgcGFyYW07CisKKwl2YV9zdGFydChwYXJhbSwgY21kKTsKKwlhcmd2WzBdID0gKGNoYXIqKSBjbWQ7CisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ2MgPCBNQVhfUlVOX0NPTU1BTkRfQVJHUykgeworCQlhcmcgPSBhcmd2W2FyZ2MrK10gPSB2YV9hcmcocGFyYW0sIGNoYXIgKik7CisJCWlmICghYXJnKQorCQkJYnJlYWs7CisJfQorCXZhX2VuZChwYXJhbSk7CisJaWYgKE1BWF9SVU5fQ09NTUFORF9BUkdTIDw9IGFyZ2MpCisJCXJldHVybiBlcnJvcigidG9vIG1hbnkgYXJncyB0byBydW4gJXMiLCBjbWQpOworCXJldHVybiBydW5fY29tbWFuZF92X29wdChhcmdjLCBhcmd2LCAwKTsKK30KZGlmZiAtLWdpdCBhL3J1bi1jb21tYW5kLmggYi9ydW4tY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjQ3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9ydW4tY29tbWFuZC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgUlVOX0NPTU1BTkRfSAorI2RlZmluZSBSVU5fQ09NTUFORF9ICisKKyNkZWZpbmUgTUFYX1JVTl9DT01NQU5EX0FSR1MgMjU2CitlbnVtIHsKKwlFUlJfUlVOX0NPTU1BTkRfRk9SSyA9IDEwMDAwLAorCUVSUl9SVU5fQ09NTUFORF9FWEVDLAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElELAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRCwKKwlFUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUwsCisJRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElULAorfTsKKworI2RlZmluZSBSVU5fQ09NTUFORF9OT19TVERJTyAxCisjZGVmaW5lIFJVTl9HSVRfQ01ECSAgICAgMgkvKklmIHRoaXMgaXMgdG8gYmUgZ2l0IHN1Yi1jb21tYW5kICovCitpbnQgcnVuX2NvbW1hbmRfdl9vcHQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgb3B0KTsKK2ludCBydW5fY29tbWFuZF92KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CitpbnQgcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY21kLCAuLi4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlbmQtcGFjay5jIGIvc2VuZC1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5ZjE4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlbmQtcGFjay5jCkBAIC0wLDAgKzEsNDE0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCitzdGF0aWMgY29uc3QgY2hhciBzZW5kX3BhY2tfdXNhZ2VbXSA9CisiZ2l0LXNlbmQtcGFjayBbLS1hbGxdIFstLWV4ZWM9Z2l0LXJlY2VpdmUtcGFja10gPHJlbW90ZT4gWzxoZWFkPi4uLl1cbiIKKyIgIC0tYWxsIGFuZCBleHBsaWNpdCA8aGVhZD4gc3BlY2lmaWNhdGlvbiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7CitzdGF0aWMgY29uc3QgY2hhciAqZXhlYyA9ICJnaXQtcmVjZWl2ZS1wYWNrIjsKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CitzdGF0aWMgaW50IHNlbmRfYWxsID0gMDsKK3N0YXRpYyBpbnQgZm9yY2VfdXBkYXRlID0gMDsKK3N0YXRpYyBpbnQgdXNlX3RoaW5fcGFjayA9IDA7CisKK3N0YXRpYyBpbnQgaXNfemVyb19zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQlpZiAoKnNoYTErKykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZXhlY19wYWNrX29iamVjdHModm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqYXJnc1tdID0geworCQkicGFjay1vYmplY3RzIiwKKwkJIi0tc3Rkb3V0IiwKKwkJTlVMTAorCX07CisJZXhlY3ZfZ2l0X2NtZChhcmdzKTsKKwlkaWUoImdpdC1wYWNrLW9iamVjdHMgZXhlYyBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWNfcmV2X2xpc3Qoc3RydWN0IHJlZiAqcmVmcykKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3NbMTAwMF07CisJaW50IGkgPSAwLCBqOworCisJYXJnc1tpKytdID0gInJldi1saXN0IjsJLyogMCAqLworCWlmICh1c2VfdGhpbl9wYWNrKQkvKiAxICovCisJCWFyZ3NbaSsrXSA9ICItLW9iamVjdHMtZWRnZSI7CisJZWxzZQorCQlhcmdzW2krK10gPSAiLS1vYmplY3RzIjsKKworCS8qIEZpcnN0IHNlbmQgdGhlIG9uZXMgd2UgY2FyZSBhYm91dCBtb3N0ICovCisJZm9yIChyZWYgPSByZWZzOyByZWY7IHJlZiA9IHJlZi0+bmV4dCkgeworCQlpZiAoOTAwIDwgaSkKKwkJCWRpZSgiZ2l0LXJldi1saXN0IGVudmlyb25tZW50IG92ZXJmbG93Iik7CisJCWlmICghaXNfemVyb19zaGExKHJlZi0+bmV3X3NoYTEpKSB7CisJCQljaGFyICpidWYgPSBtYWxsb2MoMTAwKTsKKwkJCWFyZ3NbaSsrXSA9IGJ1ZjsKKwkJCXNucHJpbnRmKGJ1ZiwgNTAsICIlcyIsIHNoYTFfdG9faGV4KHJlZi0+bmV3X3NoYTEpKTsKKwkJCWJ1ZiArPSA1MDsKKwkJCWlmICghaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpICYmCisJCQkgICAgaGFzX3NoYTFfZmlsZShyZWYtPm9sZF9zaGExKSkgeworCQkJCWFyZ3NbaSsrXSA9IGJ1ZjsKKwkJCQlzbnByaW50ZihidWYsIDUwLCAiXiVzIiwKKwkJCQkJIHNoYTFfdG9faGV4KHJlZi0+b2xkX3NoYTEpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFRoZW4gYSBoYW5kZnVsIG9mIHRoZSByZW1haW5kZXIKKwkgKiBORUVEU1dPUks6IHdlIHdvdWxkIGJlIGJldHRlciBvZmYgaWYgdXNlZCB0aGUgbmV3ZXIgb25lcyBmaXJzdC4KKwkgKi8KKwlmb3IgKHJlZiA9IHJlZnMsIGogPSBpICsgMTY7CisJICAgICBpIDwgOTAwICYmIGkgPCBqICYmIHJlZjsKKwkgICAgIHJlZiA9IHJlZi0+bmV4dCkgeworCQlpZiAoaXNfemVyb19zaGExKHJlZi0+bmV3X3NoYTEpICYmCisJCSAgICAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpICYmCisJCSAgICBoYXNfc2hhMV9maWxlKHJlZi0+b2xkX3NoYTEpKSB7CisJCQljaGFyICpidWYgPSBtYWxsb2MoNDIpOworCQkJYXJnc1tpKytdID0gYnVmOworCQkJc25wcmludGYoYnVmLCA0MiwgIl4lcyIsIHNoYTFfdG9faGV4KHJlZi0+b2xkX3NoYTEpKTsKKwkJfQorCX0KKwlhcmdzW2ldID0gTlVMTDsKKwlleGVjdl9naXRfY21kKGFyZ3MpOworCWRpZSgiZ2l0LXJldi1saXN0IGV4ZWMgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgdm9pZCByZXZfbGlzdChpbnQgZmQsIHN0cnVjdCByZWYgKnJlZnMpCit7CisJaW50IHBpcGVfZmRbMl07CisJcGlkX3QgcGFja19vYmplY3RzX3BpZDsKKworCWlmIChwaXBlKHBpcGVfZmQpIDwgMCkKKwkJZGllKCJyZXYtbGlzdCBzZXR1cDogcGlwZSBmYWlsZWQiKTsKKwlwYWNrX29iamVjdHNfcGlkID0gZm9yaygpOworCWlmICghcGFja19vYmplY3RzX3BpZCkgeworCQlkdXAyKHBpcGVfZmRbMF0sIDApOworCQlkdXAyKGZkLCAxKTsKKwkJY2xvc2UocGlwZV9mZFswXSk7CisJCWNsb3NlKHBpcGVfZmRbMV0pOworCQljbG9zZShmZCk7CisJCWV4ZWNfcGFja19vYmplY3RzKCk7CisJCWRpZSgicGFjay1vYmplY3RzIHNldHVwIGZhaWxlZCIpOworCX0KKwlpZiAocGFja19vYmplY3RzX3BpZCA8IDApCisJCWRpZSgicGFjay1vYmplY3RzIGZvcmsgZmFpbGVkIik7CisJZHVwMihwaXBlX2ZkWzFdLCAxKTsKKwljbG9zZShwaXBlX2ZkWzBdKTsKKwljbG9zZShwaXBlX2ZkWzFdKTsKKwljbG9zZShmZCk7CisJZXhlY19yZXZfbGlzdChyZWZzKTsKK30KKworc3RhdGljIGludCBwYWNrX29iamVjdHMoaW50IGZkLCBzdHJ1Y3QgcmVmICpyZWZzKQoreworCXBpZF90IHJldl9saXN0X3BpZDsKKworCXJldl9saXN0X3BpZCA9IGZvcmsoKTsKKwlpZiAoIXJldl9saXN0X3BpZCkgeworCQlyZXZfbGlzdChmZCwgcmVmcyk7CisJCWRpZSgicmV2LWxpc3Qgc2V0dXAgZmFpbGVkIik7CisJfQorCWlmIChyZXZfbGlzdF9waWQgPCAwKQorCQlkaWUoInJldi1saXN0IGZvcmsgZmFpbGVkIik7CisJLyoKKwkgKiBXZSBkb24ndCB3YWl0IGZvciB0aGUgcmV2LWxpc3QgcGlwZWxpbmUgaW4gdGhlIHBhcmVudDoKKwkgKiB3ZSBlbmQgdXAgd2FpdGluZyBmb3IgdGhlIG90aGVyIGVuZCBpbnN0ZWFkCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFya19hbmRfZnJlZShzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QsIHVuc2lnbmVkIGludCBtYXJrKQoreworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqdGVtcCA9IGxpc3Q7CisJCXRlbXAtPml0ZW0tPm9iamVjdC5mbGFncyAmPSB+bWFyazsKKwkJbGlzdCA9IHRlbXAtPm5leHQ7CisJCWZyZWUodGVtcCk7CisJfQorfQorCitzdGF0aWMgaW50IHJlZl9uZXdlcihjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCXN0cnVjdCBjb21taXQgKm9sZCwgKm5ldzsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QsICp1c2VkOworCWludCBmb3VuZCA9IDA7CisKKwkvKiBCb3RoIG5ldyBhbmQgb2xkIG11c3QgYmUgY29tbWl0LWlzaCBhbmQgbmV3IGlzIGRlc2NlbmRhbnQgb2YKKwkgKiBvbGQuICBPdGhlcndpc2Ugd2UgcmVxdWlyZSAtLWZvcmNlLgorCSAqLworCW8gPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KG9sZF9zaGExKSwgTlVMTCwgMCk7CisJaWYgKCFvIHx8IG8tPnR5cGUgIT0gY29tbWl0X3R5cGUpCisJCXJldHVybiAwOworCW9sZCA9IChzdHJ1Y3QgY29tbWl0ICopIG87CisKKwlvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChuZXdfc2hhMSksIE5VTEwsIDApOworCWlmICghbyB8fCBvLT50eXBlICE9IGNvbW1pdF90eXBlKQorCQlyZXR1cm4gMDsKKwluZXcgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCisJaWYgKHBhcnNlX2NvbW1pdChuZXcpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwl1c2VkID0gbGlzdCA9IE5VTEw7CisJY29tbWl0X2xpc3RfaW5zZXJ0KG5ldywgJmxpc3QpOworCXdoaWxlIChsaXN0KSB7CisJCW5ldyA9IHBvcF9tb3N0X3JlY2VudF9jb21taXQoJmxpc3QsIDEpOworCQljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmdXNlZCk7CisJCWlmIChuZXcgPT0gb2xkKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwl1bm1hcmtfYW5kX2ZyZWUobGlzdCwgMSk7CisJdW5tYXJrX2FuZF9mcmVlKHVzZWQsIDEpOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmxvY2FsX3JlZnMsICoqbG9jYWxfdGFpbDsKK3N0YXRpYyBzdHJ1Y3QgcmVmICpyZW1vdGVfcmVmcywgKipyZW1vdGVfdGFpbDsKKworc3RhdGljIGludCBvbmVfbG9jYWxfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHJlZiAqcmVmOworCWludCBsZW4gPSBzdHJsZW4ocmVmbmFtZSkgKyAxOworCXJlZiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZWYpICsgbGVuKTsKKwltZW1jcHkocmVmLT5uZXdfc2hhMSwgc2hhMSwgMjApOworCW1lbWNweShyZWYtPm5hbWUsIHJlZm5hbWUsIGxlbik7CisJKmxvY2FsX3RhaWwgPSByZWY7CisJbG9jYWxfdGFpbCA9ICZyZWYtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9sb2NhbF9oZWFkcyh2b2lkKQoreworCWxvY2FsX3RhaWwgPSAmbG9jYWxfcmVmczsKKwlmb3JfZWFjaF9yZWYob25lX2xvY2FsX3JlZik7Cit9CisKK3N0YXRpYyBpbnQgcmVjZWl2ZV9zdGF0dXMoaW50IGluKQoreworCWNoYXIgbGluZVsxMDAwXTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbGVuID0gcGFja2V0X3JlYWRfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwlpZiAobGVuIDwgMTAgfHwgbWVtY21wKGxpbmUsICJ1bnBhY2sgIiwgNykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkaWQgbm90IHJlY2VpdmUgc3RhdHVzIGJhY2tcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChtZW1jbXAobGluZSwgInVucGFjayBva1xuIiwgMTApKSB7CisJCWZwdXRzKGxpbmUsIHN0ZGVycik7CisJCXJldCA9IC0xOworCX0KKwl3aGlsZSAoMSkgeworCQlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGluLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgMyB8fAorCQkgICAgKG1lbWNtcChsaW5lLCAib2siLCAyKSAmJiBtZW1jbXAobGluZSwgIm5nIiwgMikpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInByb3RvY29sIGVycm9yOiAlc1xuIiwgbGluZSk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghbWVtY21wKGxpbmUsICJvayIsIDIpKQorCQkJY29udGludWU7CisJCWZwdXRzKGxpbmUsIHN0ZGVycik7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlbmRfcGFjayhpbnQgaW4sIGludCBvdXQsIGludCBucl9yZWZzcGVjLCBjaGFyICoqcmVmc3BlYykKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IG5ld19yZWZzOworCWludCByZXQgPSAwOworCWludCBhc2tfZm9yX3N0YXR1c19yZXBvcnQgPSAwOworCWludCBleHBlY3Rfc3RhdHVzX3JlcG9ydCA9IDA7CisKKwkvKiBObyBmdW5ueSBidXNpbmVzcyB3aXRoIHRoZSBtYXRjaGVyICovCisJcmVtb3RlX3RhaWwgPSBnZXRfcmVtb3RlX2hlYWRzKGluLCAmcmVtb3RlX3JlZnMsIDAsIE5VTEwsIDEpOworCWdldF9sb2NhbF9oZWFkcygpOworCisJLyogRG9lcyB0aGUgb3RoZXIgZW5kIHN1cHBvcnQgdGhlIHJlcG9ydGluZz8gKi8KKwlpZiAoc2VydmVyX3N1cHBvcnRzKCJyZXBvcnQtc3RhdHVzIikpCisJCWFza19mb3Jfc3RhdHVzX3JlcG9ydCA9IDE7CisKKwkvKiBtYXRjaCB0aGVtIHVwICovCisJaWYgKCFyZW1vdGVfdGFpbCkKKwkJcmVtb3RlX3RhaWwgPSAmcmVtb3RlX3JlZnM7CisJaWYgKG1hdGNoX3JlZnMobG9jYWxfcmVmcywgcmVtb3RlX3JlZnMsICZyZW1vdGVfdGFpbCwKKwkJICAgICAgIG5yX3JlZnNwZWMsIHJlZnNwZWMsIHNlbmRfYWxsKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFyZW1vdGVfcmVmcykgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHJlZnMgaW4gY29tbW9uIGFuZCBub25lIHNwZWNpZmllZDsgZG9pbmcgbm90aGluZy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHksIHRlbGwgdGhlIG90aGVyIGVuZCEKKwkgKi8KKwluZXdfcmVmcyA9IDA7CisJZm9yIChyZWYgPSByZW1vdGVfcmVmczsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJY2hhciBvbGRfaGV4WzYwXSwgKm5ld19oZXg7CisJCWlmICghcmVmLT5wZWVyX3JlZikKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1lbWNtcChyZWYtPm9sZF9zaGExLCByZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwgMjApKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiclcyc6IHVwLXRvLWRhdGVcbiIsIHJlZi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoaXMgcGFydCBkZXRlcm1pbmVzIHdoYXQgY2FuIG92ZXJ3cml0ZSB3aGF0LgorCQkgKiBUaGUgcnVsZXMgYXJlOgorCQkgKgorCQkgKiAoMCkgeW91IGNhbiBhbHdheXMgdXNlIC0tZm9yY2Ugb3IgK0E6QiBub3RhdGlvbiB0bworCQkgKiAgICAgc2VsZWN0aXZlbHkgZm9yY2UgaW5kaXZpZHVhbCByZWYgcGFpcnMuCisJCSAqCisJCSAqICgxKSBpZiB0aGUgb2xkIHRoaW5nIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBPSy4KKwkJICoKKwkJICogKDIpIGlmIHlvdSBkbyBub3QgaGF2ZSB0aGUgb2xkIHRoaW5nLCB5b3UgYXJlIG5vdCBhbGxvd2VkCisJCSAqICAgICB0byBvdmVyd3JpdGUgaXQ7IHlvdSB3b3VsZCBub3Qga25vdyB3aGF0IHlvdSBhcmUgbG9zaW5nCisJCSAqICAgICBvdGhlcndpc2UuCisJCSAqCisJCSAqICgzKSBpZiBib3RoIG5ldyBhbmQgb2xkIGFyZSBjb21taXQtaXNoLCBhbmQgbmV3IGlzIGEKKwkJICogICAgIGRlc2NlbmRhbnQgb2Ygb2xkLCBpdCBpcyBPSy4KKwkJICovCisKKwkJaWYgKCFmb3JjZV91cGRhdGUgJiYKKwkJICAgICFpc196ZXJvX3NoYTEocmVmLT5vbGRfc2hhMSkgJiYKKwkJICAgICFyZWYtPmZvcmNlKSB7CisJCQlpZiAoIWhhc19zaGExX2ZpbGUocmVmLT5vbGRfc2hhMSkgfHwKKwkJCSAgICAhcmVmX25ld2VyKHJlZi0+cGVlcl9yZWYtPm5ld19zaGExLAorCQkJCSAgICAgICByZWYtPm9sZF9zaGExKSkgeworCQkJCS8qIFdlIGRvIG5vdCBoYXZlIHRoZSByZW1vdGUgcmVmLCBvcgorCQkJCSAqIHdlIGtub3cgdGhhdCB0aGUgcmVtb3RlIHJlZiBpcyBub3QKKwkJCQkgKiBhbiBhbmNlc3RvciBvZiB3aGF0IHdlIGFyZSB0cnlpbmcgdG8KKwkJCQkgKiBwdXNoLiAgRWl0aGVyIHdheSB0aGlzIGNhbiBiZSBsb3NpbmcKKwkJCQkgKiBjb21taXRzIGF0IHRoZSByZW1vdGUgZW5kIGFuZCBsaWtlbHkKKwkJCQkgKiB3ZSB3ZXJlIG5vdCB1cCB0byBkYXRlIHRvIGJlZ2luIHdpdGguCisJCQkJICovCisJCQkJZXJyb3IoInJlbW90ZSAnJXMnIGlzIG5vdCBhIHN0cmljdCAiCisJCQkJICAgICAgInN1YnNldCBvZiBsb2NhbCByZWYgJyVzJy4gIgorCQkJCSAgICAgICJtYXliZSB5b3UgYXJlIG5vdCB1cC10by1kYXRlIGFuZCAiCisJCQkJICAgICAgIm5lZWQgdG8gcHVsbCBmaXJzdD8iLAorCQkJCSAgICAgIHJlZi0+bmFtZSwKKwkJCQkgICAgICByZWYtPnBlZXJfcmVmLT5uYW1lKTsKKwkJCQlyZXQgPSAtMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQltZW1jcHkocmVmLT5uZXdfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEsIDIwKTsKKwkJaWYgKGlzX3plcm9fc2hhMShyZWYtPm5ld19zaGExKSkgeworCQkJZXJyb3IoImNhbm5vdCBoYXBwZW4gYW55bW9yZSIpOworCQkJcmV0ID0gLTM7CisJCQljb250aW51ZTsKKwkJfQorCQluZXdfcmVmcysrOworCQlzdHJjcHkob2xkX2hleCwgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCQluZXdfaGV4ID0gc2hhMV90b19oZXgocmVmLT5uZXdfc2hhMSk7CisKKwkJaWYgKGFza19mb3Jfc3RhdHVzX3JlcG9ydCkgeworCQkJcGFja2V0X3dyaXRlKG91dCwgIiVzICVzICVzJWMlcyIsCisJCQkJICAgICBvbGRfaGV4LCBuZXdfaGV4LCByZWYtPm5hbWUsIDAsCisJCQkJICAgICAicmVwb3J0LXN0YXR1cyIpOworCQkJYXNrX2Zvcl9zdGF0dXNfcmVwb3J0ID0gMDsKKwkJCWV4cGVjdF9zdGF0dXNfcmVwb3J0ID0gMTsKKwkJfQorCQllbHNlCisJCQlwYWNrZXRfd3JpdGUob3V0LCAiJXMgJXMgJXMiLAorCQkJCSAgICAgb2xkX2hleCwgbmV3X2hleCwgcmVmLT5uYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJ1cGRhdGluZyAnJXMnIiwgcmVmLT5uYW1lKTsKKwkJaWYgKHN0cmNtcChyZWYtPm5hbWUsIHJlZi0+cGVlcl9yZWYtPm5hbWUpKQorCQkJZnByaW50ZihzdGRlcnIsICIgdXNpbmcgJyVzJyIsIHJlZi0+cGVlcl9yZWYtPm5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuICBmcm9tICVzXG4gIHRvICAgJXNcbiIsIG9sZF9oZXgsIG5ld19oZXgpOworCX0KKworCXBhY2tldF9mbHVzaChvdXQpOworCWlmIChuZXdfcmVmcykKKwkJcGFja19vYmplY3RzKG91dCwgcmVtb3RlX3JlZnMpOworCWNsb3NlKG91dCk7CisKKwlpZiAoZXhwZWN0X3N0YXR1c19yZXBvcnQpIHsKKwkJaWYgKHJlY2VpdmVfc3RhdHVzKGluKSkKKwkJCXJldCA9IC00OworCX0KKworCWlmICghbmV3X3JlZnMgJiYgcmV0ID09IDApCisJCWZwcmludGYoc3RkZXJyLCAiRXZlcnl0aGluZyB1cC10by1kYXRlXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgbnJfaGVhZHMgPSAwOworCWNoYXIgKmRlc3QgPSBOVUxMOworCWNoYXIgKipoZWFkcyA9IE5VTEw7CisJaW50IGZkWzJdLCByZXQ7CisJcGlkX3QgcGlkOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWFyZ3YrKzsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrLCBhcmd2KyspIHsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1leGVjPSIsIDcpKSB7CisJCQkJZXhlYyA9IGFyZyArIDc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJc2VuZF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mb3JjZSIpKSB7CisJCQkJZm9yY2VfdXBkYXRlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQkJdmVyYm9zZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXRoaW4iKSkgeworCQkJCXVzZV90aGluX3BhY2sgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2Uoc2VuZF9wYWNrX3VzYWdlKTsKKwkJfQorCQlpZiAoIWRlc3QpIHsKKwkJCWRlc3QgPSBhcmc7CisJCQljb250aW51ZTsKKwkJfQorCQloZWFkcyA9IGFyZ3Y7CisJCW5yX2hlYWRzID0gYXJnYyAtIGk7CisJCWJyZWFrOworCX0KKwlpZiAoIWRlc3QpCisJCXVzYWdlKHNlbmRfcGFja191c2FnZSk7CisJaWYgKGhlYWRzICYmIHNlbmRfYWxsKQorCQl1c2FnZShzZW5kX3BhY2tfdXNhZ2UpOworCXBpZCA9IGdpdF9jb25uZWN0KGZkLCBkZXN0LCBleGVjKTsKKwlpZiAocGlkIDwgMCkKKwkJcmV0dXJuIDE7CisJcmV0ID0gc2VuZF9wYWNrKGZkWzBdLCBmZFsxXSwgbnJfaGVhZHMsIGhlYWRzKTsKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworCWZpbmlzaF9jb25uZWN0KHBpZCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NlcnZlci1pbmZvLmMgYi9zZXJ2ZXItaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YmNlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2ZXItaW5mby5jCkBAIC0wLDAgKzEsMjQ4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisKKy8qIHJlZnMgKi8KK3N0YXRpYyBGSUxFICppbmZvX3JlZl9mcDsKKworc3RhdGljIGludCBhZGRfaW5mb19yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCisJZnByaW50ZihpbmZvX3JlZl9mcCwgIiVzCSVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJaWYgKG8tPnR5cGUgPT0gdGFnX3R5cGUpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCBwYXRoLCAwKTsKKwkJaWYgKG8pCisJCQlmcHJpbnRmKGluZm9fcmVmX2ZwLCAiJXMJJXNee31cbiIsCisJCQkJc2hhMV90b19oZXgoby0+c2hhMSksIHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGRhdGVfaW5mb19yZWZzKGludCBmb3JjZSkKK3sKKwljaGFyICpwYXRoMCA9IHN0cmR1cChnaXRfcGF0aCgiaW5mby9yZWZzIikpOworCWludCBsZW4gPSBzdHJsZW4ocGF0aDApOworCWNoYXIgKnBhdGgxID0geG1hbGxvYyhsZW4gKyAyKTsKKworCXN0cmNweShwYXRoMSwgcGF0aDApOworCXN0cmNweShwYXRoMSArIGxlbiwgIisiKTsKKworCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMocGF0aDApOworCWluZm9fcmVmX2ZwID0gZm9wZW4ocGF0aDEsICJ3Iik7CisJaWYgKCFpbmZvX3JlZl9mcCkKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gdXBkYXRlICVzIiwgcGF0aDApOworCWZvcl9lYWNoX3JlZihhZGRfaW5mb19yZWYpOworCWZjbG9zZShpbmZvX3JlZl9mcCk7CisJcmVuYW1lKHBhdGgxLCBwYXRoMCk7CisJZnJlZShwYXRoMCk7CisJZnJlZShwYXRoMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHBhY2tzICovCitzdGF0aWMgc3RydWN0IHBhY2tfaW5mbyB7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJaW50IG9sZF9udW07CisJaW50IG5ld19udW07CisJaW50IG5yX2FsbG9jOworCWludCBucl9oZWFkczsKKwl1bnNpZ25lZCBjaGFyICgqaGVhZClbMjBdOworfSAqKmluZm87CitzdGF0aWMgaW50IG51bV9wYWNrOworc3RhdGljIGNvbnN0IGNoYXIgKm9iamRpcjsKK3N0YXRpYyBpbnQgb2JqZGlybGVuOworCitzdGF0aWMgc3RydWN0IHBhY2tfaW5mbyAqZmluZF9wYWNrX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2s7IGkrKykgeworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGluZm9baV0tPnA7CisJCS8qIHNraXAgIi9wYWNrLyIgYWZ0ZXIgIi5naXQvb2JqZWN0cyIgKi8KKwkJaWYgKCFzdHJjbXAocC0+cGFja19uYW1lICsgb2JqZGlybGVuICsgNiwgbmFtZSkpCisJCQlyZXR1cm4gaW5mb1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgaW5mbyBpbiB0aGUKKyAqIG9sZCBmaWxlIGlzIHVzZWxlc3MuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcGFja19kZWYoY29uc3QgY2hhciAqbGluZSwgaW50IG9sZF9jbnQpCit7CisJc3RydWN0IHBhY2tfaW5mbyAqaSA9IGZpbmRfcGFja19ieV9uYW1lKGxpbmUgKyAyKTsKKwlpZiAoaSkgeworCQlpLT5vbGRfbnVtID0gb2xkX2NudDsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQkvKiBUaGUgZmlsZSBkZXNjcmliZXMgYSBwYWNrIHRoYXQgaXMgbm8gbG9uZ2VyIGhlcmUgKi8KKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIGluZm8gaW4gdGhlCisgKiBvbGQgZmlsZSBpcyB1c2VsZXNzLgorICovCitzdGF0aWMgaW50IHJlYWRfcGFja19pbmZvX2ZpbGUoY29uc3QgY2hhciAqaW5mb2ZpbGUpCit7CisJRklMRSAqZnA7CisJY2hhciBsaW5lWzEwMDBdOworCWludCBvbGRfY250ID0gMDsKKworCWZwID0gZm9wZW4oaW5mb2ZpbGUsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIDE7IC8qIG5vbmV4aXN0aW5nIGlzIG5vdCBhbiBlcnJvci4gKi8KKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworCQlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCQlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJCWxpbmVbLS1sZW5dID0gMDsKKworCQlpZiAoIWxlbikKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICdQJzogLyogUCBuYW1lICovCisJCQlpZiAocGFyc2VfcGFja19kZWYobGluZSwgb2xkX2NudCsrKSkKKwkJCQlnb3RvIG91dF9zdGFsZTsKKwkJCWJyZWFrOworCQljYXNlICdEJzogLyogd2UgdXNlZCB0byBlbWl0IEQgYnV0IHRoYXQgd2FzIG1pc2d1aWRlZC4gKi8KKwkJCWdvdG8gb3V0X3N0YWxlOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOiAvKiB3ZSB1c2VkIHRvIGVtaXQgVCBidXQgbm9ib2R5IHVzZXMgaXQuICovCisJCQlnb3RvIG91dF9zdGFsZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IoInVucmVjb2duaXplZDogJXMiLCBsaW5lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZjbG9zZShmcCk7CisJcmV0dXJuIDA7Cisgb3V0X3N0YWxlOgorCWZjbG9zZShmcCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9pbmZvKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgcGFja19pbmZvICogY29uc3QqIGEgPSBhXzsKKwlzdHJ1Y3QgcGFja19pbmZvICogY29uc3QqIGIgPSBiXzsKKworCWlmICgwIDw9ICgqYSktPm9sZF9udW0gJiYgMCA8PSAoKmIpLT5vbGRfbnVtKQorCQkvKiBLZWVwIHRoZSBvcmRlciBpbiB0aGUgb3JpZ2luYWwgKi8KKwkJcmV0dXJuICgqYSktPm9sZF9udW0gLSAoKmIpLT5vbGRfbnVtOworCWVsc2UgaWYgKDAgPD0gKCphKS0+b2xkX251bSkKKwkJLyogT25seSBBIGV4aXN0ZWQgaW4gdGhlIG9yaWdpbmFsIHNvIEIgaXMgb2J2aW91c2x5IG5ld2VyICovCisJCXJldHVybiAtMTsKKwllbHNlIGlmICgwIDw9ICgqYiktPm9sZF9udW0pCisJCS8qIFRoZSBvdGhlciB3YXkgYXJvdW5kLiAqLworCQlyZXR1cm4gMTsKKworCS8qIHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIGJ1dCBhdCBsZWFzdCBrZWVwIHRoZSBjb21wYXJpc29uIHN0YWJsZSAqLworCWlmICgoKmEpLT5wID09ICgqYiktPnApCisJCXJldHVybiAwOworCWVsc2UgaWYgKCgqYSktPnAgPCAoKmIpLT5wKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9wYWNrX2luZm8oY29uc3QgY2hhciAqaW5mb2ZpbGUsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlpbnQgc3RhbGU7CisJaW50IGkgPSAwOworCisJb2JqZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlvYmpkaXJsZW4gPSBzdHJsZW4ob2JqZGlyKTsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCS8qIHdlIGlnbm9yZSB0aGluZ3Mgb24gYWx0ZXJuYXRlIHBhdGggc2luY2UgdGhleSBhcmUKKwkJICogbm90IGF2YWlsYWJsZSB0byB0aGUgcHVsbGVycyBpbiBnZW5lcmFsLgorCQkgKi8KKwkJaWYgKCFwLT5wYWNrX2xvY2FsKQorCQkJY29udGludWU7CisJCWkrKzsKKwl9CisJbnVtX3BhY2sgPSBpOworCWluZm8gPSB4Y2FsbG9jKG51bV9wYWNrLCBzaXplb2Yoc3RydWN0IHBhY2tfaW5mbyAqKSk7CisJZm9yIChpID0gMCwgcCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmICghcC0+cGFja19sb2NhbCkKKwkJCWNvbnRpbnVlOworCQlpbmZvW2ldID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBhY2tfaW5mbykpOworCQlpbmZvW2ldLT5wID0gcDsKKwkJaW5mb1tpXS0+b2xkX251bSA9IC0xOworCQlpKys7CisJfQorCisJaWYgKGluZm9maWxlICYmICFmb3JjZSkKKwkJc3RhbGUgPSByZWFkX3BhY2tfaW5mb19maWxlKGluZm9maWxlKTsKKwllbHNlCisJCXN0YWxlID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFjazsgaSsrKSB7CisJCWlmIChzdGFsZSkgeworCQkJaW5mb1tpXS0+b2xkX251bSA9IC0xOworCQkJaW5mb1tpXS0+bnJfaGVhZHMgPSAwOworCQl9CisJfQorCisJLyogcmVudW1iZXIgdGhlbSAqLworCXFzb3J0KGluZm8sIG51bV9wYWNrLCBzaXplb2YoaW5mb1swXSksIGNvbXBhcmVfaW5mbyk7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWNrOyBpKyspCisJCWluZm9baV0tPm5ld19udW0gPSBpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9wYWNrX2luZm9fZmlsZShGSUxFICpmcCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2s7IGkrKykKKwkJZnByaW50ZihmcCwgIlAgJXNcbiIsIGluZm9baV0tPnAtPnBhY2tfbmFtZSArIG9iamRpcmxlbiArIDYpOworCWZwdXRjKCdcbicsIGZwKTsKK30KKworc3RhdGljIGludCB1cGRhdGVfaW5mb19wYWNrcyhpbnQgZm9yY2UpCit7CisJY2hhciBpbmZvZmlsZVtQQVRIX01BWF07CisJY2hhciBuYW1lW1BBVEhfTUFYXTsKKwlpbnQgbmFtZWxlbjsKKwlGSUxFICpmcDsKKworCW5hbWVsZW4gPSBzcHJpbnRmKGluZm9maWxlLCAiJXMvaW5mby9wYWNrcyIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCXN0cmNweShuYW1lLCBpbmZvZmlsZSk7CisJc3RyY3B5KG5hbWUgKyBuYW1lbGVuLCAiKyIpOworCisJaW5pdF9wYWNrX2luZm8oaW5mb2ZpbGUsIGZvcmNlKTsKKworCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMobmFtZSk7CisJZnAgPSBmb3BlbihuYW1lLCAidyIpOworCWlmICghZnApCisJCXJldHVybiBlcnJvcigiY2Fubm90IG9wZW4gJXMiLCBuYW1lKTsKKwl3cml0ZV9wYWNrX2luZm9fZmlsZShmcCk7CisJZmNsb3NlKGZwKTsKKwlyZW5hbWUobmFtZSwgaW5mb2ZpbGUpOworCXJldHVybiAwOworfQorCisvKiBwdWJsaWMgKi8KK2ludCB1cGRhdGVfc2VydmVyX2luZm8oaW50IGZvcmNlKQoreworCS8qIFdlIHdvdWxkIGFkZCBtb3JlIGR1bWItc2VydmVyIHN1cHBvcnQgZmlsZXMgbGF0ZXIsCisJICogaW5jbHVkaW5nIGluZGV4IG9mIGF2YWlsYWJsZSBwYWNrIGZpbGVzIGFuZCB0aGVpcgorCSAqIGludGVuZGVkIGF1ZGllbmNlcy4KKwkgKi8KKwlpbnQgZXJycyA9IDA7CisKKwllcnJzID0gZXJycyB8IHVwZGF0ZV9pbmZvX3JlZnMoZm9yY2UpOworCWVycnMgPSBlcnJzIHwgdXBkYXRlX2luZm9fcGFja3MoZm9yY2UpOworCisJLyogcmVtb3ZlIGxlZnRvdmVyIHJldi1jYWNoZSBmaWxlIGlmIHRoZXJlIGlzIGFueSAqLworCXVubGluayhnaXRfcGF0aCgiaW5mby9yZXYtY2FjaGUiKSk7CisKKwlyZXR1cm4gZXJyczsKK30KZGlmZiAtLWdpdCBhL3NldHVwLmMgYi9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlN2Y4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXR1cC5jCkBAIC0wLDAgKzEsMjQ1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworY29uc3QgY2hhciAqcHJlZml4X3BhdGgoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgbGVuLCBjb25zdCBjaGFyICpwYXRoKQoreworCWNvbnN0IGNoYXIgKm9yaWcgPSBwYXRoOworCWZvciAoOzspIHsKKwkJY2hhciBjOworCQlpZiAoKnBhdGggIT0gJy4nKQorCQkJYnJlYWs7CisJCWMgPSBwYXRoWzFdOworCQkvKiAiLiIgKi8KKwkJaWYgKCFjKSB7CisJCQlwYXRoKys7CisJCQlicmVhazsKKwkJfQorCQkvKiAiLi8iICovCisJCWlmIChjID09ICcvJykgeworCQkJcGF0aCArPSAyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgIT0gJy4nKQorCQkJYnJlYWs7CisJCWMgPSBwYXRoWzJdOworCQlpZiAoIWMpCisJCQlwYXRoICs9IDI7CisJCWVsc2UgaWYgKGMgPT0gJy8nKQorCQkJcGF0aCArPSAzOworCQllbHNlCisJCQlicmVhazsKKwkJLyogIi4uIiBhbmQgIi4uLyIgKi8KKwkJLyogUmVtb3ZlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwcmVmaXggKi8KKwkJZG8geworCQkJaWYgKCFsZW4pCisJCQkJZGllKCInJXMnIGlzIG91dHNpZGUgcmVwb3NpdG9yeSIsIG9yaWcpOworCQkJbGVuLS07CisJCX0gd2hpbGUgKGxlbiAmJiBwcmVmaXhbbGVuLTFdICE9ICcvJyk7CisJCWNvbnRpbnVlOworCX0KKwlpZiAobGVuKSB7CisJCWludCBzcGVjbGVuID0gc3RybGVuKHBhdGgpOworCQljaGFyICpuID0geG1hbGxvYyhzcGVjbGVuICsgbGVuICsgMSk7CisJCisJCW1lbWNweShuLCBwcmVmaXgsIGxlbik7CisJCW1lbWNweShuICsgbGVuLCBwYXRoLCBzcGVjbGVuKzEpOworCQlwYXRoID0gbjsKKwl9CisJcmV0dXJuIHBhdGg7Cit9CisKKy8qIAorICogVW5saWtlIHByZWZpeF9wYXRoLCB0aGlzIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBuYW1lZCBmaWxlIGRvZXMKKyAqIG5vdCBoYXZlIHRvIGludGVyYWN0IHdpdGggaW5kZXggZW50cnk7IGkuZS4gbmFtZSBvZiBhIHJhbmRvbSBmaWxlCisgKiBvbiB0aGUgZmlsZXN5c3RlbS4KKyAqLworY29uc3QgY2hhciAqcHJlZml4X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnBmeCwgaW50IHBmeF9sZW4sIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzdGF0aWMgY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlpZiAoIXBmeCB8fCAhKnBmeCB8fCBhcmdbMF0gPT0gJy8nKQorCQlyZXR1cm4gYXJnOworCW1lbWNweShwYXRoLCBwZngsIHBmeF9sZW4pOworCXN0cmNweShwYXRoICsgcGZ4X2xlbiwgYXJnKTsKKwlyZXR1cm4gcGF0aDsKK30KKworLyoKKyAqIFZlcmlmeSBhIGZpbGVuYW1lIHRoYXQgd2UgZ290IGFzIGFuIGFyZ3VtZW50IGZvciBhIHBhdGhzcGVjCisgKiBlbnRyeS4gTm90ZSB0aGF0IGEgZmlsZW5hbWUgdGhhdCBiZWdpbnMgd2l0aCAiLSIgbmV2ZXIgdmVyaWZpZXMKKyAqIGFzIHRydWUsIGJlY2F1c2UgZXZlbiBpZiBzdWNoIGEgZmlsZW5hbWUgd2VyZSB0byBleGlzdCwgd2Ugd2FudAorICogaXQgdG8gYmUgcHJlY2VkZWQgYnkgdGhlICItLSIgbWFya2VyIChvciB3ZSB3YW50IHRoZSB1c2VyIHRvCisgKiB1c2UgYSBmb3JtYXQgbGlrZSAiLi8tZmlsZW5hbWUiKQorICovCit2b2lkIHZlcmlmeV9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCphcmcgPT0gJy0nKQorCQlkaWUoImJhZCBmbGFnICclcycgdXNlZCBhZnRlciBmaWxlbmFtZSIsIGFyZyk7CisJbmFtZSA9IHByZWZpeCA/IHByZWZpeF9maWxlbmFtZShwcmVmaXgsIHN0cmxlbihwcmVmaXgpLCBhcmcpIDogYXJnOworCWlmICghbHN0YXQobmFtZSwgJnN0KSkKKwkJcmV0dXJuOworCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCWRpZSgiYW1iaWd1b3VzIGFyZ3VtZW50ICclcyc6IHVua25vd24gcmV2aXNpb24gb3IgcGF0aCBub3QgaW4gdGhlIHdvcmtpbmcgdHJlZS5cbiIKKwkJICAgICJVc2UgJy0tJyB0byBzZXBhcmF0ZSBwYXRocyBmcm9tIHJldmlzaW9ucyIsIGFyZyk7CisJZGllKCInJXMnOiAlcyIsIGFyZywgc3RyZXJyb3IoZXJybm8pKTsKK30KKworLyoKKyAqIE9wcG9zaXRlIG9mIHRoZSBhYm92ZTogdGhlIGNvbW1hbmQgbGluZSBkaWQgbm90IGhhdmUgLS0gbWFya2VyCisgKiBhbmQgd2UgcGFyc2VkIHRoZSBhcmcgYXMgYSByZWZuYW1lLiAgSXQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRhYmxlCisgKiBhcyBhIGZpbGVuYW1lLgorICovCit2b2lkIHZlcmlmeV9ub25fZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICphcmcpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICgqYXJnID09ICctJykKKwkJcmV0dXJuOyAvKiBmbGFnICovCisJbmFtZSA9IHByZWZpeCA/IHByZWZpeF9maWxlbmFtZShwcmVmaXgsIHN0cmxlbihwcmVmaXgpLCBhcmcpIDogYXJnOworCWlmICghbHN0YXQobmFtZSwgJnN0KSkKKwkJZGllKCJhbWJpZ3VvdXMgYXJndW1lbnQgJyVzJzogYm90aCByZXZpc2lvbiBhbmQgZmlsZW5hbWVcbiIKKwkJICAgICJVc2UgJy0tJyB0byBzZXBhcmF0ZSBmaWxlbmFtZXMgZnJvbSByZXZpc2lvbnMiLCBhcmcpOworCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCWRpZSgiJyVzJzogJXMiLCBhcmcsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK2NvbnN0IGNoYXIgKipnZXRfcGF0aHNwZWMoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqZW50cnkgPSAqcGF0aHNwZWM7CisJY29uc3QgY2hhciAqKnA7CisJaW50IHByZWZpeGxlbjsKKworCWlmICghcHJlZml4ICYmICFlbnRyeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWVudHJ5KSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICpzcGVjWzJdOworCQlzcGVjWzBdID0gcHJlZml4OworCQlzcGVjWzFdID0gTlVMTDsKKwkJcmV0dXJuIHNwZWM7CisJfQorCisJLyogT3RoZXJ3aXNlIHdlIGhhdmUgdG8gcmUtd3JpdGUgdGhlIGVudHJpZXMuLiAqLworCXAgPSBwYXRoc3BlYzsKKwlwcmVmaXhsZW4gPSBwcmVmaXggPyBzdHJsZW4ocHJlZml4KSA6IDA7CisJZG8geworCQkqcCA9IHByZWZpeF9wYXRoKHByZWZpeCwgcHJlZml4bGVuLCBlbnRyeSk7CisJfSB3aGlsZSAoKGVudHJ5ID0gKisrcCkgIT0gTlVMTCk7CisJcmV0dXJuIChjb25zdCBjaGFyICoqKSBwYXRoc3BlYzsKK30KKworLyoKKyAqIFRlc3QgaWYgaXQgbG9va3MgbGlrZSB3ZSdyZSBhdCB0aGUgdG9wIGxldmVsIGdpdCBkaXJlY3RvcnkuCisgKiBXZSB3YW50IHRvIHNlZToKKyAqCisgKiAgLSBlaXRoZXIgYSAuZ2l0L29iamVjdHMvIGRpcmVjdG9yeSBfb3JfIHRoZSBwcm9wZXIKKyAqICAgIEdJVF9PQkpFQ1RfRElSRUNUT1JZIGVudmlyb25tZW50IHZhcmlhYmxlCisgKiAgLSBhIHJlZnMvIGRpcmVjdG9yeSB1bmRlciAiLmdpdCIKKyAqICAtIGVpdGhlciBhIEhFQUQgc3ltbGluayBvciBhIEhFQUQgZmlsZSB0aGF0IGlzIGZvcm1hdHRlZCBhcworICogICAgYSBwcm9wZXIgInJlZjoiLgorICovCitzdGF0aWMgaW50IGlzX3RvcGxldmVsX2RpcmVjdG9yeSh2b2lkKQoreworCWlmIChhY2Nlc3MoIi5naXQvcmVmcy8iLCBYX09LKSB8fAorCSAgICBhY2Nlc3MoZ2V0ZW52KERCX0VOVklST05NRU5UKSA/CisJCSAgIGdldGVudihEQl9FTlZJUk9OTUVOVCkgOiAiLmdpdC9vYmplY3RzLyIsIFhfT0spIHx8CisJICAgIHZhbGlkYXRlX3N5bXJlZigiLmdpdC9IRUFEIikpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitjb25zdCBjaGFyICpzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseShpbnQgKm5vbmdpdF9vaykKK3sKKwlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVgrMV07CisJaW50IGxlbiwgb2Zmc2V0OworCisJLyoKKwkgKiBJZiBHSVRfRElSIGlzIHNldCBleHBsaWNpdGx5LCB3ZSdyZSBub3QgZ29pbmcKKwkgKiB0byBkbyBhbnkgZGlzY292ZXJ5LCBidXQgd2Ugc3RpbGwgZG8gcmVwb3NpdG9yeQorCSAqIHZhbGlkYXRpb24uCisJICovCisJaWYgKGdldGVudihHSVRfRElSX0VOVklST05NRU5UKSkgeworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQlpbnQgbGVuID0gc3RybGVuKGdldGVudihHSVRfRElSX0VOVklST05NRU5UKSk7CisJCWlmIChzaXplb2YocGF0aCkgLSA0MCA8IGxlbikKKwkJCWRpZSgiJyQlcycgdG9vIGJpZyIsIEdJVF9ESVJfRU5WSVJPTk1FTlQpOworCQltZW1jcHkocGF0aCwgZ2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpLCBsZW4pOworCQkKKwkJc3RyY3B5KHBhdGggKyBsZW4sICIvcmVmcyIpOworCQlpZiAoYWNjZXNzKHBhdGgsIFhfT0spKQorCQkJZ290byBiYWRfZGlyX2Vudmlyb247CisJCXN0cmNweShwYXRoICsgbGVuLCAiL0hFQUQiKTsKKwkJaWYgKHZhbGlkYXRlX3N5bXJlZihwYXRoKSkKKwkJCWdvdG8gYmFkX2Rpcl9lbnZpcm9uOworCQlpZiAoZ2V0ZW52KERCX0VOVklST05NRU5UKSkgeworCQkJaWYgKGFjY2VzcyhnZXRlbnYoREJfRU5WSVJPTk1FTlQpLCBYX09LKSkKKwkJCQlnb3RvIGJhZF9kaXJfZW52aXJvbjsKKwkJfQorCQllbHNlIHsKKwkJCXN0cmNweShwYXRoICsgbGVuLCAiL29iamVjdHMiKTsKKwkJCWlmIChhY2Nlc3MocGF0aCwgWF9PSykpCisJCQkJZ290byBiYWRfZGlyX2Vudmlyb247CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJYmFkX2Rpcl9lbnZpcm9uOgorCQlwYXRoW2xlbl0gPSAwOworCQlkaWUoIk5vdCBhIGdpdCByZXBvc2l0b3J5OiAnJXMnIiwgcGF0aCk7CisJfQorCisJaWYgKCFnZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkgfHwgY3dkWzBdICE9ICcvJykKKwkJZGllKCJVbmFibGUgdG8gcmVhZCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisKKwlvZmZzZXQgPSBsZW4gPSBzdHJsZW4oY3dkKTsKKwlmb3IgKDs7KSB7CisJCWlmIChpc190b3BsZXZlbF9kaXJlY3RvcnkoKSkKKwkJCWJyZWFrOworCQljaGRpcigiLi4iKTsKKwkJZG8geworCQkJaWYgKCFvZmZzZXQpIHsKKwkJCQlpZiAobm9uZ2l0X29rKSB7CisJCQkJCWlmIChjaGRpcihjd2QpKQorCQkJCQkJZGllKCJDYW5ub3QgY29tZSBiYWNrIHRvIGN3ZCIpOworCQkJCQkqbm9uZ2l0X29rID0gMTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWRpZSgiTm90IGEgZ2l0IHJlcG9zaXRvcnkiKTsKKwkJCX0KKwkJfSB3aGlsZSAoY3dkWy0tb2Zmc2V0XSAhPSAnLycpOworCX0KKworCWlmIChvZmZzZXQgPT0gbGVuKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIE1ha2UgIm9mZnNldCIgcG9pbnQgdG8gcGFzdCB0aGUgJy8nLCBhbmQgYWRkIGEgJy8nIGF0IHRoZSBlbmQgKi8KKwlvZmZzZXQrKzsKKwljd2RbbGVuKytdID0gJy8nOworCWN3ZFtsZW5dID0gMDsKKwlyZXR1cm4gY3dkICsgb2Zmc2V0OworfQorCitpbnQgY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgICAgIGlmIChzdHJjbXAodmFyLCAiY29yZS5yZXBvc2l0b3J5Zm9ybWF0dmVyc2lvbiIpID09IDApCisgICAgICAgICAgICAgICByZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJZWxzZSBpZiAoc3RyY21wKHZhciwgImNvcmUuc2hhcmVkcmVwb3NpdG9yeSIpID09IDApCisJCXNoYXJlZF9yZXBvc2l0b3J5ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworICAgICAgIHJldHVybiAwOworfQorCitpbnQgY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQodm9pZCkKK3sKKwlnaXRfY29uZmlnKGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24pOworCWlmIChHSVRfUkVQT19WRVJTSU9OIDwgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbikKKwkJZGllICgiRXhwZWN0ZWQgZ2l0IHJlcG8gdmVyc2lvbiA8PSAlZCwgZm91bmQgJWQiLAorCQkgICAgIEdJVF9SRVBPX1ZFUlNJT04sIHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24pOworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpzZXR1cF9naXRfZGlyZWN0b3J5KHZvaWQpCit7CisJY29uc3QgY2hhciAqcmV0dmFsID0gc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoTlVMTCk7CisJY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQoKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvc2hhMV9maWxlLmMgYi9zaGExX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZmMjMzCi0tLSAvZGV2L251bGwKKysrIGIvc2hhMV9maWxlLmMKQEAgLTAsMCArMSwxNzg1IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICoKKyAqIFRoaXMgaGFuZGxlcyBiYXNpYyBnaXQgc2hhMSBvYmplY3QgZmlsZXMgLSBwYWNraW5nLCB1bnBhY2tpbmcsCisgKiBjcmVhdGlvbiBldGMuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKKyNpZm5kZWYgT19OT0FUSU1FCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fUFBDX18pKQorI2RlZmluZSBPX05PQVRJTUUgMDEwMDAwMDAKKyNlbHNlCisjZGVmaW5lIE9fTk9BVElNRSAwCisjZW5kaWYKKyNlbmRpZgorCitjb25zdCB1bnNpZ25lZCBjaGFyIG51bGxfc2hhMVsyMF0gPSB7IDAsIH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2hhMV9maWxlX29wZW5fZmxhZyA9IE9fTk9BVElNRTsKKworc3RhdGljIHVuc2lnbmVkIGhleHZhbChjaGFyIGMpCit7CisJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQlyZXR1cm4gYyAtICcwJzsKKwlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCXJldHVybiBjIC0gJ2EnICsgMTA7CisJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQlyZXR1cm4gYyAtICdBJyArIDEwOworCXJldHVybiB+MDsKK30KKworaW50IGdldF9zaGExX2hleChjb25zdCBjaGFyICpoZXgsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9IChoZXh2YWwoaGV4WzBdKSA8PCA0KSB8IGhleHZhbChoZXhbMV0pOworCQlpZiAodmFsICYgfjB4ZmYpCisJCQlyZXR1cm4gLTE7CisJCSpzaGExKysgPSB2YWw7CisJCWhleCArPSAyOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoY2hhciAqcGF0aCkKK3sKKwljaGFyICpwb3MgPSBwYXRoOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCpwb3MgPT0gJy8nKQorCQlwb3MrKzsKKworCXdoaWxlIChwb3MpIHsKKwkJcG9zID0gc3RyY2hyKHBvcywgJy8nKTsKKwkJaWYgKCFwb3MpCisJCQlicmVhazsKKwkJKnBvcyA9IDA7CisJCWlmICghc3RhdChwYXRoLCAmc3QpKSB7CisJCQkvKiBwYXRoIGV4aXN0cyAqLworCQkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCQkJKnBvcyA9ICcvJzsKKwkJCQlyZXR1cm4gLTM7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAobWtkaXIocGF0aCwgMDc3NykpIHsKKwkJCSpwb3MgPSAnLyc7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZWxzZSBpZiAoYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpKSB7CisJCQkqcG9zID0gJy8nOworCQkJcmV0dXJuIC0yOworCQl9CisJCSpwb3MrKyA9ICcvJzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKiBzaGExX3RvX2hleChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBpbnQgYnVmbm87CisJc3RhdGljIGNoYXIgaGV4YnVmZmVyWzRdWzUwXTsKKwlzdGF0aWMgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwljaGFyICpidWZmZXIgPSBoZXhidWZmZXJbMyAmICsrYnVmbm9dLCAqYnVmID0gYnVmZmVyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9ICpzaGExKys7CisJCSpidWYrKyA9IGhleFt2YWwgPj4gNF07CisJCSpidWYrKyA9IGhleFt2YWwgJiAweGZdOworCX0KKwkqYnVmID0gJ1wwJzsKKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfc2hhMV9wYXRoKGNoYXIgKnBhdGhidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJc3RhdGljIGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJCXVuc2lnbmVkIGludCB2YWwgPSBzaGExW2ldOworCQljaGFyICpwb3MgPSBwYXRoYnVmICsgaSoyICsgKGkgPiAwKTsKKwkJKnBvcysrID0gaGV4W3ZhbCA+PiA0XTsKKwkJKnBvcyA9IGhleFt2YWwgJiAweGZdOworCX0KK30KKworLyoKKyAqIE5PVEUhIFRoaXMgcmV0dXJucyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGJ1ZmZlciwgc28geW91IGhhdmUgdG8gYmUKKyAqIGNhcmVmdWwgYWJvdXQgdXNpbmcgaXQuIERvIGEgInN0cmR1cCgpIiBpZiB5b3UgbmVlZCB0byBzYXZlIHRoZQorICogZmlsZW5hbWUuCisgKgorICogQWxzbyBub3RlIHRoYXQgdGhpcyByZXR1cm5zIHRoZSBsb2NhdGlvbiBmb3IgY3JlYXRpbmcuICBSZWFkaW5nCisgKiBTSEExIGZpbGUgY2FuIGhhcHBlbiBmcm9tIGFueSBhbHRlcm5hdGUgZGlyZWN0b3J5IGxpc3RlZCBpbiB0aGUKKyAqIERCX0VOVklST05NRU5UIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIG5vdCBmb3VuZCBpbgorICogdGhlIHByaW1hcnkgb2JqZWN0IGRhdGFiYXNlLgorICovCitjaGFyICpzaGExX2ZpbGVfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjaGFyICpuYW1lLCAqYmFzZTsKKworCWlmICghYmFzZSkgeworCQljb25zdCBjaGFyICpzaGExX2ZpbGVfZGlyZWN0b3J5ID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJaW50IGxlbiA9IHN0cmxlbihzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJYmFzZSA9IHhtYWxsb2MobGVuICsgNjApOworCQltZW1jcHkoYmFzZSwgc2hhMV9maWxlX2RpcmVjdG9yeSwgbGVuKTsKKwkJbWVtc2V0KGJhc2UrbGVuLCAwLCA2MCk7CisJCWJhc2VbbGVuXSA9ICcvJzsKKwkJYmFzZVtsZW4rM10gPSAnLyc7CisJCW5hbWUgPSBiYXNlICsgbGVuICsgMTsKKwl9CisJZmlsbF9zaGExX3BhdGgobmFtZSwgc2hhMSk7CisJcmV0dXJuIGJhc2U7Cit9CisKK2NoYXIgKnNoYTFfcGFja19uYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJc3RhdGljIGNoYXIgKm5hbWUsICpiYXNlLCAqYnVmOworCWludCBpOworCisJaWYgKCFiYXNlKSB7CisJCWNvbnN0IGNoYXIgKnNoYTFfZmlsZV9kaXJlY3RvcnkgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCQlpbnQgbGVuID0gc3RybGVuKHNoYTFfZmlsZV9kaXJlY3RvcnkpOworCQliYXNlID0geG1hbGxvYyhsZW4gKyA2MCk7CisJCXNwcmludGYoYmFzZSwgIiVzL3BhY2svcGFjay0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwLnBhY2siLCBzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJbmFtZSA9IGJhc2UgKyBsZW4gKyAxMTsKKwl9CisKKwlidWYgPSBuYW1lOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9ICpzaGExKys7CisJCSpidWYrKyA9IGhleFt2YWwgPj4gNF07CisJCSpidWYrKyA9IGhleFt2YWwgJiAweGZdOworCX0KKwkKKwlyZXR1cm4gYmFzZTsKK30KKworY2hhciAqc2hhMV9wYWNrX2luZGV4X25hbWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwlzdGF0aWMgY2hhciAqbmFtZSwgKmJhc2UsICpidWY7CisJaW50IGk7CisKKwlpZiAoIWJhc2UpIHsKKwkJY29uc3QgY2hhciAqc2hhMV9maWxlX2RpcmVjdG9yeSA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJCWludCBsZW4gPSBzdHJsZW4oc2hhMV9maWxlX2RpcmVjdG9yeSk7CisJCWJhc2UgPSB4bWFsbG9jKGxlbiArIDYwKTsKKwkJc3ByaW50ZihiYXNlLCAiJXMvcGFjay9wYWNrLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAuaWR4Iiwgc2hhMV9maWxlX2RpcmVjdG9yeSk7CisJCW5hbWUgPSBiYXNlICsgbGVuICsgMTE7CisJfQorCisJYnVmID0gbmFtZTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAqc2hhMSsrOworCQkqYnVmKysgPSBoZXhbdmFsID4+IDRdOworCQkqYnVmKysgPSBoZXhbdmFsICYgMHhmXTsKKwl9CisJCisJcmV0dXJuIGJhc2U7Cit9CisKK3N0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICphbHRfb2RiX2xpc3Q7CitzdGF0aWMgc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKiphbHRfb2RiX3RhaWw7CisKK3N0YXRpYyB2b2lkIHJlYWRfaW5mb19hbHRlcm5hdGVzKGNvbnN0IGNoYXIgKiBhbHRlcm5hdGVzLCBpbnQgZGVwdGgpOworCisvKgorICogUHJlcGFyZSBhbHRlcm5hdGUgb2JqZWN0IGRhdGFiYXNlIHJlZ2lzdHJ5LgorICoKKyAqIFRoZSB2YXJpYWJsZSBhbHRfb2RiX2xpc3QgcG9pbnRzIGF0IHRoZSBsaXN0IG9mIHN0cnVjdAorICogYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZS4gIFRoZSBlbGVtZW50cyBvbiB0aGlzIGxpc3QgY29tZSBmcm9tCisgKiBub24tZW1wdHkgZWxlbWVudHMgZnJvbSBjb2xvbiBzZXBhcmF0ZWQgQUxURVJOQVRFX0RCX0VOVklST05NRU5UCisgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kICRHSVRfT0JKRUNUX0RJUkVDVE9SWS9pbmZvL2FsdGVybmF0ZXMsCisgKiB3aG9zZSBjb250ZW50cyBpcyBzaW1pbGFyIHRvIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUgYnV0IGNhbiBiZQorICogTEYgc2VwYXJhdGVkLiAgSXRzIGJhc2UgcG9pbnRzIGF0IGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgYnVmZmVyIHRoYXQKKyAqIGNvbnRhaW5zICIvdGhlL2RpcmVjdG9yeS9jb3JyZXNwb25kaW5nL3RvLy5naXQvb2JqZWN0cy8uLi4iLCB3aGlsZQorICogaXRzIG5hbWUgcG9pbnRzIGp1c3QgYWZ0ZXIgdGhlIHNsYXNoIGF0IHRoZSBlbmQgb2YgIi5naXQvb2JqZWN0cy8iCisgKiBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgYW5kIGhhcyBlbm91Z2ggc3BhY2UgdG8gaG9sZCA0MC1ieXRlIGhleAorICogU0hBMSwgYW4gZXh0cmEgc2xhc2ggZm9yIHRoZSBmaXJzdCBsZXZlbCBpbmRpcmVjdGlvbiwgYW5kIHRoZQorICogdGVybWluYXRpbmcgTlVMLgorICovCitzdGF0aWMgaW50IGxpbmtfYWx0X29kYl9lbnRyeShjb25zdCBjaGFyICogZW50cnksIGludCBsZW4sIGNvbnN0IGNoYXIgKiByZWxhdGl2ZV9iYXNlLCBpbnQgZGVwdGgpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY29uc3QgY2hhciAqb2JqZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqZW50OworCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICphbHQ7CisJLyogNDMgPSA0MC1ieXRlICsgMiAnLycgKyB0ZXJtaW5hdGluZyBOVUwgKi8KKwlpbnQgcGZ4bGVuID0gbGVuOworCWludCBlbnRsZW4gPSBwZnhsZW4gKyA0MzsKKwlpbnQgYmFzZV9sZW4gPSAtMTsKKworCWlmICgqZW50cnkgIT0gJy8nICYmIHJlbGF0aXZlX2Jhc2UpIHsKKwkJLyogUmVsYXRpdmUgYWx0LW9kYiAqLworCQlpZiAoYmFzZV9sZW4gPCAwKQorCQkJYmFzZV9sZW4gPSBzdHJsZW4ocmVsYXRpdmVfYmFzZSkgKyAxOworCQllbnRsZW4gKz0gYmFzZV9sZW47CisJCXBmeGxlbiArPSBiYXNlX2xlbjsKKwl9CisJZW50ID0geG1hbGxvYyhzaXplb2YoKmVudCkgKyBlbnRsZW4pOworCisJaWYgKCplbnRyeSAhPSAnLycgJiYgcmVsYXRpdmVfYmFzZSkgeworCQltZW1jcHkoZW50LT5iYXNlLCByZWxhdGl2ZV9iYXNlLCBiYXNlX2xlbiAtIDEpOworCQllbnQtPmJhc2VbYmFzZV9sZW4gLSAxXSA9ICcvJzsKKwkJbWVtY3B5KGVudC0+YmFzZSArIGJhc2VfbGVuLCBlbnRyeSwgbGVuKTsKKwl9CisJZWxzZQorCQltZW1jcHkoZW50LT5iYXNlLCBlbnRyeSwgcGZ4bGVuKTsKKworCWVudC0+bmFtZSA9IGVudC0+YmFzZSArIHBmeGxlbiArIDE7CisJZW50LT5iYXNlW3BmeGxlbiArIDNdID0gJy8nOworCWVudC0+YmFzZVtwZnhsZW5dID0gZW50LT5iYXNlW2VudGxlbi0xXSA9IDA7CisKKwkvKiBEZXRlY3QgY2FzZXMgd2hlcmUgYWx0ZXJuYXRlIGRpc2FwcGVhcmVkICovCisJaWYgKHN0YXQoZW50LT5iYXNlLCAmc3QpIHx8ICFTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCWVycm9yKCJvYmplY3QgZGlyZWN0b3J5ICVzIGRvZXMgbm90IGV4aXN0OyAiCisJCSAgICAgICJjaGVjayAuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzLiIsCisJCSAgICAgIGVudC0+YmFzZSk7CisJCWZyZWUoZW50KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFByZXZlbnQgdGhlIGNvbW1vbiBtaXN0YWtlIG9mIGxpc3RpbmcgdGhlIHNhbWUKKwkgKiB0aGluZyB0d2ljZSwgb3Igb2JqZWN0IGRpcmVjdG9yeSBpdHNlbGYuCisJICovCisJZm9yIChhbHQgPSBhbHRfb2RiX2xpc3Q7IGFsdDsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCWlmICghbWVtY21wKGVudC0+YmFzZSwgYWx0LT5iYXNlLCBwZnhsZW4pKSB7CisJCQlmcmVlKGVudCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaWYgKCFtZW1jbXAoZW50LT5iYXNlLCBvYmpkaXIsIHBmeGxlbikpIHsKKwkJZnJlZShlbnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYWRkIHRoZSBhbHRlcm5hdGUgZW50cnkgKi8KKwkqYWx0X29kYl90YWlsID0gZW50OworCWFsdF9vZGJfdGFpbCA9ICYoZW50LT5uZXh0KTsKKwllbnQtPm5leHQgPSBOVUxMOworCisJLyogcmVjdXJzaXZlbHkgYWRkIGFsdGVybmF0ZXMgKi8KKwlyZWFkX2luZm9fYWx0ZXJuYXRlcyhlbnQtPmJhc2UsIGRlcHRoICsgMSk7CisKKwllbnQtPmJhc2VbcGZ4bGVuXSA9ICcvJzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsaW5rX2FsdF9vZGJfZW50cmllcyhjb25zdCBjaGFyICphbHQsIGNvbnN0IGNoYXIgKmVwLCBpbnQgc2VwLAorCQkJCSBjb25zdCBjaGFyICpyZWxhdGl2ZV9iYXNlLCBpbnQgZGVwdGgpCit7CisJY29uc3QgY2hhciAqY3AsICpsYXN0OworCisJaWYgKGRlcHRoID4gNSkgeworCQllcnJvcigiJXM6IGlnbm9yaW5nIGFsdGVybmF0ZSBvYmplY3Qgc3RvcmVzLCBuZXN0aW5nIHRvbyBkZWVwLiIsCisJCQkJcmVsYXRpdmVfYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwlsYXN0ID0gYWx0OworCXdoaWxlIChsYXN0IDwgZXApIHsKKwkJY3AgPSBsYXN0OworCQlpZiAoY3AgPCBlcCAmJiAqY3AgPT0gJyMnKSB7CisJCQl3aGlsZSAoY3AgPCBlcCAmJiAqY3AgIT0gc2VwKQorCQkJCWNwKys7CisJCQlsYXN0ID0gY3AgKyAxOworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGNwIDwgZXAgJiYgKmNwICE9IHNlcCkKKwkJCWNwKys7CisJCWlmIChsYXN0ICE9IGNwKSB7CisJCQlpZiAoKCpsYXN0ICE9ICcvJykgJiYgZGVwdGgpIHsKKwkJCQllcnJvcigiJXM6IGlnbm9yaW5nIHJlbGF0aXZlIGFsdGVybmF0ZSBvYmplY3Qgc3RvcmUgJXMiLAorCQkJCQkJcmVsYXRpdmVfYmFzZSwgbGFzdCk7CisJCQl9IGVsc2UgeworCQkJCWxpbmtfYWx0X29kYl9lbnRyeShsYXN0LCBjcCAtIGxhc3QsCisJCQkJCQlyZWxhdGl2ZV9iYXNlLCBkZXB0aCk7CisJCQl9CisJCX0KKwkJd2hpbGUgKGNwIDwgZXAgJiYgKmNwID09IHNlcCkKKwkJCWNwKys7CisJCWxhc3QgPSBjcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfaW5mb19hbHRlcm5hdGVzKGNvbnN0IGNoYXIgKiByZWxhdGl2ZV9iYXNlLCBpbnQgZGVwdGgpCit7CisJY2hhciAqbWFwOworCXN0cnVjdCBzdGF0IHN0OworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGZkOworCisJc3ByaW50ZihwYXRoLCAiJXMvaW5mby9hbHRlcm5hdGVzIiwgcmVsYXRpdmVfYmFzZSk7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisJaWYgKGZzdGF0KGZkLCAmc3QpIHx8IChzdC5zdF9zaXplID09IDApKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm47CisKKwlsaW5rX2FsdF9vZGJfZW50cmllcyhtYXAsIG1hcCArIHN0LnN0X3NpemUsICdcbicsIHJlbGF0aXZlX2Jhc2UsIGRlcHRoKTsKKworCW11bm1hcChtYXAsIHN0LnN0X3NpemUpOworfQorCit2b2lkIHByZXBhcmVfYWx0X29kYih2b2lkKQoreworCWNoYXIgKmFsdDsKKworCWFsdCA9IGdldGVudihBTFRFUk5BVEVfREJfRU5WSVJPTk1FTlQpOworCWlmICghYWx0KSBhbHQgPSAiIjsKKworCWlmIChhbHRfb2RiX3RhaWwpCisJCXJldHVybjsKKwlhbHRfb2RiX3RhaWwgPSAmYWx0X29kYl9saXN0OworCWxpbmtfYWx0X29kYl9lbnRyaWVzKGFsdCwgYWx0ICsgc3RybGVuKGFsdCksICc6JywgTlVMTCwgMCk7CisKKwlyZWFkX2luZm9fYWx0ZXJuYXRlcyhnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCAwKTsKK30KKworc3RhdGljIGNoYXIgKmZpbmRfc2hhMV9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwljaGFyICpuYW1lID0gc2hhMV9maWxlX25hbWUoc2hhMSk7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKworCWlmICghc3RhdChuYW1lLCBzdCkpCisJCXJldHVybiBuYW1lOworCXByZXBhcmVfYWx0X29kYigpOworCWZvciAoYWx0ID0gYWx0X29kYl9saXN0OyBhbHQ7IGFsdCA9IGFsdC0+bmV4dCkgeworCQluYW1lID0gYWx0LT5uYW1lOworCQlmaWxsX3NoYTFfcGF0aChuYW1lLCBzaGExKTsKKwkJaWYgKCFzdGF0KGFsdC0+YmFzZSwgc3QpKQorCQkJcmV0dXJuIGFsdC0+YmFzZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgUEFDS19NQVhfU1ogKDE8PDI2KQorc3RhdGljIGludCBwYWNrX3VzZWRfY3RyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFja19tYXBwZWQ7CitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja2VkX2dpdDsKKworc3RhdGljIGludCBjaGVja19wYWNrZWRfZ2l0X2lkeChjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBsb25nICppZHhfc2l6ZV8sCisJCQkJdm9pZCAqKmlkeF9tYXBfKQoreworCXZvaWQgKmlkeF9tYXA7CisJdW5zaWduZWQgaW50ICppbmRleDsKKwl1bnNpZ25lZCBsb25nIGlkeF9zaXplOworCWludCBuciwgaTsKKwlpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGZzdGF0KGZkLCAmc3QpKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZHhfc2l6ZSA9IHN0LnN0X3NpemU7CisJaWR4X21hcCA9IG1tYXAoTlVMTCwgaWR4X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisJaWYgKGlkeF9tYXAgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIC0xOworCisJaW5kZXggPSBpZHhfbWFwOworCSppZHhfbWFwXyA9IGlkeF9tYXA7CisJKmlkeF9zaXplXyA9IGlkeF9zaXplOworCisJLyogY2hlY2sgaW5kZXggbWFwICovCisJaWYgKGlkeF9zaXplIDwgNCoyNTYgKyAyMCArIDIwKQorCQlyZXR1cm4gZXJyb3IoImluZGV4IGZpbGUgdG9vIHNtYWxsIik7CisJbnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgbiA9IG50b2hsKGluZGV4W2ldKTsKKwkJaWYgKG4gPCBucikKKwkJCXJldHVybiBlcnJvcigibm9uLW1vbm90b25pYyBpbmRleCIpOworCQluciA9IG47CisJfQorCisJLyoKKwkgKiBUb3RhbCBzaXplOgorCSAqICAtIDI1NiBpbmRleCBlbnRyaWVzIDQgYnl0ZXMgZWFjaAorCSAqICAtIDI0LWJ5dGUgZW50cmllcyAqIG5yICgyMC1ieXRlIHNoYTEgKyA0LWJ5dGUgb2Zmc2V0KQorCSAqICAtIDIwLWJ5dGUgU0hBMSBvZiB0aGUgcGFja2ZpbGUKKwkgKiAgLSAyMC1ieXRlIFNIQTEgZmlsZSBjaGVja3N1bQorCSAqLworCWlmIChpZHhfc2l6ZSAhPSA0KjI1NiArIG5yICogMjQgKyAyMCArIDIwKQorCQlyZXR1cm4gZXJyb3IoIndyb25nIGluZGV4IGZpbGUgc2l6ZSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdW51c2Vfb25lX3BhY2tlZF9naXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgKmxydSA9IE5VTEw7CisKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+cGFja191c2VfY250IHx8ICFwLT5wYWNrX2Jhc2UpCisJCQljb250aW51ZTsKKwkJaWYgKCFscnUgfHwgcC0+cGFja19sYXN0X3VzZWQgPCBscnUtPnBhY2tfbGFzdF91c2VkKQorCQkJbHJ1ID0gcDsKKwl9CisJaWYgKCFscnUpCisJCXJldHVybiAwOworCW11bm1hcChscnUtPnBhY2tfYmFzZSwgbHJ1LT5wYWNrX3NpemUpOworCWxydS0+cGFja19iYXNlID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKwordm9pZCB1bnVzZV9wYWNrZWRfZ2l0KHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXAtPnBhY2tfdXNlX2NudC0tOworfQorCitpbnQgdXNlX3BhY2tlZF9naXQoc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJaWYgKCFwLT5wYWNrX3NpemUpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCS8vIFdlIGNyZWF0ZWQgdGhlIHN0cnVjdCBiZWZvcmUgd2UgaGFkIHRoZSBwYWNrCisJCXN0YXQocC0+cGFja19uYW1lLCAmc3QpOworCQlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCQlkaWUoInBhY2tmaWxlICVzIG5vdCBhIHJlZ3VsYXIgZmlsZSIsIHAtPnBhY2tfbmFtZSk7CisJCXAtPnBhY2tfc2l6ZSA9IHN0LnN0X3NpemU7CisJfQorCWlmICghcC0+cGFja19iYXNlKSB7CisJCWludCBmZDsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCXZvaWQgKm1hcDsKKworCQlwYWNrX21hcHBlZCArPSBwLT5wYWNrX3NpemU7CisJCXdoaWxlIChQQUNLX01BWF9TWiA8IHBhY2tfbWFwcGVkICYmIHVudXNlX29uZV9wYWNrZWRfZ2l0KCkpCisJCQk7IC8qIG5vdGhpbmcgKi8KKwkJZmQgPSBvcGVuKHAtPnBhY2tfbmFtZSwgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwKQorCQkJZGllKCJwYWNrZmlsZSAlcyBjYW5ub3QgYmUgb3BlbmVkIiwgcC0+cGFja19uYW1lKTsKKwkJaWYgKGZzdGF0KGZkLCAmc3QpKSB7CisJCQljbG9zZShmZCk7CisJCQlkaWUoInBhY2tmaWxlICVzIGNhbm5vdCBiZSBvcGVuZWQiLCBwLT5wYWNrX25hbWUpOworCQl9CisJCWlmIChzdC5zdF9zaXplICE9IHAtPnBhY2tfc2l6ZSkKKwkJCWRpZSgicGFja2ZpbGUgJXMgc2l6ZSBtaXNtYXRjaC4iLCBwLT5wYWNrX25hbWUpOworCQltYXAgPSBtbWFwKE5VTEwsIHAtPnBhY2tfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCQljbG9zZShmZCk7CisJCWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKKwkJCWRpZSgicGFja2ZpbGUgJXMgY2Fubm90IGJlIG1hcHBlZC4iLCBwLT5wYWNrX25hbWUpOworCQlwLT5wYWNrX2Jhc2UgPSBtYXA7CisKKwkJLyogQ2hlY2sgaWYgdGhlIHBhY2sgZmlsZSBtYXRjaGVzIHdpdGggdGhlIGluZGV4IGZpbGUuCisJCSAqIHRoaXMgaXMgY2hlYXAuCisJCSAqLworCQlpZiAobWVtY21wKChjaGFyKikocC0+aW5kZXhfYmFzZSkgKyBwLT5pbmRleF9zaXplIC0gNDAsCisJCQkgICBwLT5wYWNrX2Jhc2UgKyBwLT5wYWNrX3NpemUgLSAyMCwgMjApKSB7CisJCQkgICAgICAKKwkJCWRpZSgicGFja2ZpbGUgJXMgZG9lcyBub3QgbWF0Y2ggaW5kZXguIiwgcC0+cGFja19uYW1lKTsKKwkJfQorCX0KKwlwLT5wYWNrX2xhc3RfdXNlZCA9IHBhY2tfdXNlZF9jdHIrKzsKKwlwLT5wYWNrX3VzZV9jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBhY2tlZF9naXQgKmFkZF9wYWNrZWRfZ2l0KGNoYXIgKnBhdGgsIGludCBwYXRoX2xlbiwgaW50IGxvY2FsKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXVuc2lnbmVkIGxvbmcgaWR4X3NpemU7CisJdm9pZCAqaWR4X21hcDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJaWYgKGNoZWNrX3BhY2tlZF9naXRfaWR4KHBhdGgsICZpZHhfc2l6ZSwgJmlkeF9tYXApKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGRvIHdlIGhhdmUgYSBjb3JyZXNwb25kaW5nIC5wYWNrIGZpbGU/ICovCisJc3RyY3B5KHBhdGggKyBwYXRoX2xlbiAtIDQsICIucGFjayIpOworCWlmIChzdGF0KHBhdGgsICZzdCkgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJbXVubWFwKGlkeF9tYXAsIGlkeF9zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIG9rLCBpdCBsb29rcyBzYW5lIGFzIGZhciBhcyB3ZSBjYW4gY2hlY2sgd2l0aG91dAorCSAqIGFjdHVhbGx5IG1hcHBpbmcgdGhlIHBhY2sgZmlsZS4KKwkgKi8KKwlwID0geG1hbGxvYyhzaXplb2YoKnApICsgcGF0aF9sZW4gKyAyKTsKKwlzdHJjcHkocC0+cGFja19uYW1lLCBwYXRoKTsKKwlwLT5pbmRleF9zaXplID0gaWR4X3NpemU7CisJcC0+cGFja19zaXplID0gc3Quc3Rfc2l6ZTsKKwlwLT5pbmRleF9iYXNlID0gaWR4X21hcDsKKwlwLT5uZXh0ID0gTlVMTDsKKwlwLT5wYWNrX2Jhc2UgPSBOVUxMOworCXAtPnBhY2tfbGFzdF91c2VkID0gMDsKKwlwLT5wYWNrX3VzZV9jbnQgPSAwOworCXAtPnBhY2tfbG9jYWwgPSBsb2NhbDsKKwlpZiAoKHBhdGhfbGVuID4gNDQpICYmICFnZXRfc2hhMV9oZXgocGF0aCArIHBhdGhfbGVuIC0gNDQsIHNoYTEpKQorCQltZW1jcHkocC0+c2hhMSwgc2hhMSwgMjApOworCXJldHVybiBwOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKnBhdGggPSBzaGExX3BhY2tfaW5kZXhfbmFtZShzaGExKTsKKwlyZXR1cm4gcGFyc2VfcGFja19pbmRleF9maWxlKHNoYTEsIHBhdGgpOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleF9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKmlkeF9wYXRoKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXVuc2lnbmVkIGxvbmcgaWR4X3NpemU7CisJdm9pZCAqaWR4X21hcDsKKwljaGFyICpwYXRoOworCisJaWYgKGNoZWNrX3BhY2tlZF9naXRfaWR4KGlkeF9wYXRoLCAmaWR4X3NpemUsICZpZHhfbWFwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYXRoID0gc2hhMV9wYWNrX25hbWUoc2hhMSk7CisKKwlwID0geG1hbGxvYyhzaXplb2YoKnApICsgc3RybGVuKHBhdGgpICsgMik7CisJc3RyY3B5KHAtPnBhY2tfbmFtZSwgcGF0aCk7CisJcC0+aW5kZXhfc2l6ZSA9IGlkeF9zaXplOworCXAtPnBhY2tfc2l6ZSA9IDA7CisJcC0+aW5kZXhfYmFzZSA9IGlkeF9tYXA7CisJcC0+bmV4dCA9IE5VTEw7CisJcC0+cGFja19iYXNlID0gTlVMTDsKKwlwLT5wYWNrX2xhc3RfdXNlZCA9IDA7CisJcC0+cGFja191c2VfY250ID0gMDsKKwltZW1jcHkocC0+c2hhMSwgc2hhMSwgMjApOworCXJldHVybiBwOworfQorCit2b2lkIGluc3RhbGxfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjaykKK3sKKwlwYWNrLT5uZXh0ID0gcGFja2VkX2dpdDsKKwlwYWNrZWRfZ2l0ID0gcGFjazsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9wYWNrZWRfZ2l0X29uZShjaGFyICpvYmpkaXIsIGludCBsb2NhbCkKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWludCBsZW47CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZGU7CisKKwlzcHJpbnRmKHBhdGgsICIlcy9wYWNrIiwgb2JqZGlyKTsKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJZGlyID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoIWRpcikgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJZXJyb3IoInVuYWJsZSB0byBvcGVuIG9iamVjdCBwYWNrIGRpcmVjdG9yeTogJXM6ICVzIiwKKwkJCSAgICAgIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisJcGF0aFtsZW4rK10gPSAnLyc7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnA7CisKKwkJaWYgKHN0cmNtcChkZS0+ZF9uYW1lICsgbmFtZWxlbiAtIDQsICIuaWR4IikpCisJCQljb250aW51ZTsKKworCQkvKiB3ZSBoYXZlIC5pZHguICBJcyBpdCBhIGZpbGUgd2UgY2FuIG1hcD8gKi8KKwkJc3RyY3B5KHBhdGggKyBsZW4sIGRlLT5kX25hbWUpOworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJaWYgKCFtZW1jbXAocGF0aCwgcC0+cGFja19uYW1lLCBsZW4gKyBuYW1lbGVuIC0gNCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHApCisJCQljb250aW51ZTsKKwkJcCA9IGFkZF9wYWNrZWRfZ2l0KHBhdGgsIGxlbiArIG5hbWVsZW4sIGxvY2FsKTsKKwkJaWYgKCFwKQorCQkJY29udGludWU7CisJCXAtPm5leHQgPSBwYWNrZWRfZ2l0OworCQlwYWNrZWRfZ2l0ID0gcDsKKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworc3RhdGljIGludCBwcmVwYXJlX3BhY2tlZF9naXRfcnVuX29uY2UgPSAwOwordm9pZCBwcmVwYXJlX3BhY2tlZF9naXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0OworCisJaWYgKHByZXBhcmVfcGFja2VkX2dpdF9ydW5fb25jZSkKKwkJcmV0dXJuOworCXByZXBhcmVfcGFja2VkX2dpdF9vbmUoZ2V0X29iamVjdF9kaXJlY3RvcnkoKSwgMSk7CisJcHJlcGFyZV9hbHRfb2RiKCk7CisJZm9yIChhbHQgPSBhbHRfb2RiX2xpc3Q7IGFsdDsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCWFsdC0+bmFtZVstMV0gPSAwOworCQlwcmVwYXJlX3BhY2tlZF9naXRfb25lKGFsdC0+YmFzZSwgMCk7CisJCWFsdC0+bmFtZVstMV0gPSAnLyc7CisJfQorCXByZXBhcmVfcGFja2VkX2dpdF9ydW5fb25jZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlcHJlcGFyZV9wYWNrZWRfZ2l0KHZvaWQpCit7CisJcHJlcGFyZV9wYWNrZWRfZ2l0X3J1bl9vbmNlID0gMDsKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKK30KKworaW50IGNoZWNrX3NoYTFfc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKm1hcCwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICp0eXBlKQoreworCWNoYXIgaGVhZGVyWzEwMF07CisJdW5zaWduZWQgY2hhciByZWFsX3NoYTFbMjBdOworCVNIQV9DVFggYzsKKworCVNIQTFfSW5pdCgmYyk7CisJU0hBMV9VcGRhdGUoJmMsIGhlYWRlciwgMStzcHJpbnRmKGhlYWRlciwgIiVzICVsdSIsIHR5cGUsIHNpemUpKTsKKwlTSEExX1VwZGF0ZSgmYywgbWFwLCBzaXplKTsKKwlTSEExX0ZpbmFsKHJlYWxfc2hhMSwgJmMpOworCXJldHVybiBtZW1jbXAoc2hhMSwgcmVhbF9zaGExLCAyMCkgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkICptYXBfc2hhMV9maWxlX2ludGVybmFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqbWFwOworCWludCBmZDsKKwljaGFyICpmaWxlbmFtZSA9IGZpbmRfc2hhMV9maWxlKHNoYTEsICZzdCk7CisKKwlpZiAoIWZpbGVuYW1lKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBzaGExX2ZpbGVfb3Blbl9mbGFnKTsKKwlpZiAoZmQgPCAwKSB7CisJCS8qIFNlZSBpZiBpdCB3b3JrcyB3aXRob3V0IE9fTk9BVElNRSAqLworCQlzd2l0Y2ggKHNoYTFfZmlsZV9vcGVuX2ZsYWcpIHsKKwkJZGVmYXVsdDoKKwkJCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCQkJaWYgKGZkID49IDApCisJCQkJYnJlYWs7CisJCS8qIEZhbGx0aHJvdWdoICovCisJCWNhc2UgMDoKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogSWYgaXQgZmFpbGVkIG9uY2UsIGl0IHdpbGwgcHJvYmFibHkgZmFpbCBhZ2Fpbi4KKwkJICogU3RvcCB1c2luZyBPX05PQVRJTUUKKwkJICovCisJCXNoYTFfZmlsZV9vcGVuX2ZsYWcgPSAwOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm4gTlVMTDsKKwkqc2l6ZSA9IHN0LnN0X3NpemU7CisJcmV0dXJuIG1hcDsKK30KKworaW50IHVucGFja19zaGExX2hlYWRlcih6X3N0cmVhbSAqc3RyZWFtLCB2b2lkICptYXAsIHVuc2lnbmVkIGxvbmcgbWFwc2l6ZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJLyogR2V0IHRoZSBkYXRhIHN0cmVhbSAqLworCW1lbXNldChzdHJlYW0sIDAsIHNpemVvZigqc3RyZWFtKSk7CisJc3RyZWFtLT5uZXh0X2luID0gbWFwOworCXN0cmVhbS0+YXZhaWxfaW4gPSBtYXBzaXplOworCXN0cmVhbS0+bmV4dF9vdXQgPSBidWZmZXI7CisJc3RyZWFtLT5hdmFpbF9vdXQgPSBzaXplOworCisJaW5mbGF0ZUluaXQoc3RyZWFtKTsKKwlyZXR1cm4gaW5mbGF0ZShzdHJlYW0sIDApOworfQorCitzdGF0aWMgdm9pZCAqdW5wYWNrX3NoYTFfcmVzdCh6X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgYnl0ZXMgPSBzdHJsZW4oYnVmZmVyKSArIDE7CisJdW5zaWduZWQgY2hhciAqYnVmID0geG1hbGxvYygxK3NpemUpOworCisJbWVtY3B5KGJ1ZiwgYnVmZmVyICsgYnl0ZXMsIHN0cmVhbS0+dG90YWxfb3V0IC0gYnl0ZXMpOworCWJ5dGVzID0gc3RyZWFtLT50b3RhbF9vdXQgLSBieXRlczsKKwlpZiAoYnl0ZXMgPCBzaXplKSB7CisJCXN0cmVhbS0+bmV4dF9vdXQgPSBidWYgKyBieXRlczsKKwkJc3RyZWFtLT5hdmFpbF9vdXQgPSBzaXplIC0gYnl0ZXM7CisJCXdoaWxlIChpbmZsYXRlKHN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCQkvKiBub3RoaW5nICovOworCX0KKwlidWZbc2l6ZV0gPSAwOworCWluZmxhdGVFbmQoc3RyZWFtKTsKKwlyZXR1cm4gYnVmOworfQorCisvKgorICogV2UgdXNlZCB0byBqdXN0IHVzZSAic3NjYW5mKCkiLCBidXQgdGhhdCdzIGFjdHVhbGx5IHdheQorICogdG9vIHBlcm1pc3NpdmUgZm9yIHdoYXQgd2Ugd2FudCB0byBjaGVjay4gU28gZG8gYW4gYW5hbAorICogb2JqZWN0IGhlYWRlciBwYXJzZSBieSBoYW5kLgorICovCitpbnQgcGFyc2Vfc2hhMV9oZWFkZXIoY2hhciAqaGRyLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkvKgorCSAqIFRoZSB0eXBlIGNhbiBiZSBhdCBtb3N0IHRlbiBieXRlcyAoaW5jbHVkaW5nIHRoZSAKKwkgKiB0ZXJtaW5hdGluZyAnXDAnIHRoYXQgd2UgYWRkKSwgYW5kIGlzIGZvbGxvd2VkIGJ5CisJICogYSBzcGFjZS4gCisJICovCisJaSA9IDEwOworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKmhkcisrOworCQlpZiAoYyA9PSAnICcpCisJCQlicmVhazsKKwkJaWYgKCEtLWkpCisJCQlyZXR1cm4gLTE7CisJCSp0eXBlKysgPSBjOworCX0KKwkqdHlwZSA9IDA7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBmb2xsb3cgaW1tZWRpYXRlbHksIGFuZCBiZSBpbiBjYW5vbmljYWwKKwkgKiBkZWNpbWFsIGZvcm1hdCAoaWUgIjAxMCIgaXMgbm90IHZhbGlkKS4KKwkgKi8KKwlzaXplID0gKmhkcisrIC0gJzAnOworCWlmIChzaXplID4gOSkKKwkJcmV0dXJuIC0xOworCWlmIChzaXplKSB7CisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYyA9ICpoZHIgLSAnMCc7CisJCQlpZiAoYyA+IDkpCisJCQkJYnJlYWs7CisJCQloZHIrKzsKKwkJCXNpemUgPSBzaXplICogMTAgKyBjOworCQl9CisJfQorCSpzaXplcCA9IHNpemU7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBiZSBmb2xsb3dlZCBieSBhIHplcm8gYnl0ZQorCSAqLworCXJldHVybiAqaGRyID8gLTEgOiAwOworfQorCit2b2lkICogdW5wYWNrX3NoYTFfZmlsZSh2b2lkICptYXAsIHVuc2lnbmVkIGxvbmcgbWFwc2l6ZSwgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwlpbnQgcmV0OworCXpfc3RyZWFtIHN0cmVhbTsKKwljaGFyIGhkcls4MTkyXTsKKworCXJldCA9IHVucGFja19zaGExX2hlYWRlcigmc3RyZWFtLCBtYXAsIG1hcHNpemUsIGhkciwgc2l6ZW9mKGhkcikpOworCWlmIChyZXQgPCBaX09LIHx8IHBhcnNlX3NoYTFfaGVhZGVyKGhkciwgdHlwZSwgc2l6ZSkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB1bnBhY2tfc2hhMV9yZXN0KCZzdHJlYW0sIGhkciwgKnNpemUpOworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBhIG11dHVhbGx5IHJlY3Vyc2l2ZSBmdW5jdGlvbiAqLworc3RhdGljIGludCBwYWNrZWRfb2JqZWN0X2luZm8oc3RydWN0IHBhY2tfZW50cnkgKmVudHJ5LAorCQkJICAgICAgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApOworCitzdGF0aWMgaW50IHBhY2tlZF9kZWx0YV9pbmZvKHVuc2lnbmVkIGNoYXIgKmJhc2Vfc2hhMSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGxlZnQsCisJCQkgICAgIGNoYXIgKnR5cGUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnNpemVwLAorCQkJICAgICBzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19lbnRyeSBiYXNlX2VudDsKKworCWlmIChsZWZ0IDwgMjApCisJCWRpZSgidHJ1bmNhdGVkIHBhY2sgZmlsZSIpOworCisJLyogVGhlIGJhc2UgZW50cnkgX211c3RfIGJlIGluIHRoZSBzYW1lIHBhY2sgKi8KKwlpZiAoIWZpbmRfcGFja19lbnRyeV9vbmUoYmFzZV9zaGExLCAmYmFzZV9lbnQsIHApKQorCQlkaWUoImZhaWxlZCB0byBmaW5kIGRlbHRhLXBhY2sgYmFzZSBvYmplY3QgJXMiLAorCQkgICAgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisKKwkvKiBXZSBjaG9vc2UgdG8gb25seSBnZXQgdGhlIHR5cGUgb2YgdGhlIGJhc2Ugb2JqZWN0IGFuZAorCSAqIGlnbm9yZSBwb3RlbnRpYWxseSBjb3JydXB0IHBhY2sgZmlsZSB0aGF0IGV4cGVjdHMgdGhlIGRlbHRhCisJICogYmFzZWQgb24gYSBiYXNlIHdpdGggYSB3cm9uZyBzaXplLiAgVGhpcyBzYXZlcyB0b25zIG9mCisJICogaW5mbGF0ZSgpIGNhbGxzLgorCSAqLworCisJaWYgKHBhY2tlZF9vYmplY3RfaW5mbygmYmFzZV9lbnQsIHR5cGUsIE5VTEwpKQorCQlkaWUoImNhbm5vdCBnZXQgaW5mbyBmb3IgZGVsdGEtcGFjayBiYXNlIik7CisKKwlpZiAoc2l6ZXApIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJdW5zaWduZWQgY2hhciBkZWx0YV9oZWFkWzY0XTsKKwkJdW5zaWduZWQgbG9uZyByZXN1bHRfc2l6ZTsKKwkJel9zdHJlYW0gc3RyZWFtOworCQlpbnQgc3Q7CisKKwkJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKworCQlkYXRhID0gc3RyZWFtLm5leHRfaW4gPSBiYXNlX3NoYTEgKyAyMDsKKwkJc3RyZWFtLmF2YWlsX2luID0gbGVmdCAtIDIwOworCQlzdHJlYW0ubmV4dF9vdXQgPSBkZWx0YV9oZWFkOworCQlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGRlbHRhX2hlYWQpOworCisJCWluZmxhdGVJbml0KCZzdHJlYW0pOworCQlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCQlpbmZsYXRlRW5kKCZzdHJlYW0pOworCQlpZiAoKHN0ICE9IFpfU1RSRUFNX0VORCkgJiYKKwkJICAgIHN0cmVhbS50b3RhbF9vdXQgIT0gc2l6ZW9mKGRlbHRhX2hlYWQpKQorCQkJZGllKCJkZWx0YSBkYXRhIHVucGFjay1pbml0aWFsIGZhaWxlZCIpOworCisJCS8qIEV4YW1pbmUgdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgZGVsdGEgdG8gZmlndXJlIG91dAorCQkgKiB0aGUgcmVzdWx0IHNpemUuCisJCSAqLworCQlkYXRhID0gZGVsdGFfaGVhZDsKKworCQkvKiBpZ25vcmUgYmFzZSBzaXplICovCisJCWdldF9kZWx0YV9oZHJfc2l6ZSgmZGF0YSwgZGVsdGFfaGVhZCtzaXplb2YoZGVsdGFfaGVhZCkpOworCisJCS8qIFJlYWQgdGhlIHJlc3VsdCBzaXplICovCisJCXJlc3VsdF9zaXplID0gZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCBkZWx0YV9oZWFkK3NpemVvZihkZWx0YV9oZWFkKSk7CisJCSpzaXplcCA9IHJlc3VsdF9zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdW5wYWNrX29iamVjdF9oZWFkZXIoc3RydWN0IHBhY2tlZF9naXQgKnAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCWVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXVuc2lnbmVkIHNoaWZ0OworCXVuc2lnbmVkIGNoYXIgKnBhY2ssIGM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKG9mZnNldCA+PSBwLT5wYWNrX3NpemUpCisJCWRpZSgib2JqZWN0IG9mZnNldCBvdXRzaWRlIG9mIHBhY2sgZmlsZSIpOworCisJcGFjayA9ICBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJYyA9ICpwYWNrKys7CisJb2Zmc2V0Kys7CisJKnR5cGUgPSAoYyA+PiA0KSAmIDc7CisJc2l6ZSA9IGMgJiAxNTsKKwlzaGlmdCA9IDQ7CisJd2hpbGUgKGMgJiAweDgwKSB7CisJCWlmIChvZmZzZXQgPj0gcC0+cGFja19zaXplKQorCQkJZGllKCJvYmplY3Qgb2Zmc2V0IG91dHNpZGUgb2YgcGFjayBmaWxlIik7CisJCWMgPSAqcGFjaysrOworCQlvZmZzZXQrKzsKKwkJc2l6ZSArPSAoYyAmIDB4N2YpIDw8IHNoaWZ0OworCQlzaGlmdCArPSA3OworCX0KKwkqc2l6ZXAgPSBzaXplOworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBjaGVja19yZXVzZV9wYWNrX2RlbHRhKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmJhc2UsIHVuc2lnbmVkIGxvbmcgKnNpemVwLAorCQkJICAgZW51bSBvYmplY3RfdHlwZSAqa2luZHApCit7CisJdW5zaWduZWQgbG9uZyBwdHI7CisJaW50IHN0YXR1cyA9IC0xOworCisJdXNlX3BhY2tlZF9naXQocCk7CisJcHRyID0gb2Zmc2V0OworCXB0ciA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsIHB0ciwga2luZHAsIHNpemVwKTsKKwlpZiAoKmtpbmRwICE9IE9CSl9ERUxUQSkKKwkJZ290byBkb25lOworCW1lbWNweShiYXNlLCBwLT5wYWNrX2Jhc2UgKyBwdHIsIDIwKTsKKwlzdGF0dXMgPSAwOworIGRvbmU6CisJdW51c2VfcGFja2VkX2dpdChwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHBhY2tlZF9vYmplY3RfaW5mb19kZXRhaWwoc3RydWN0IHBhY2tfZW50cnkgKmUsCisJCQkgICAgICAgY2hhciAqdHlwZSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaXplLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0b3JlX3NpemUsCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkZWx0YV9jaGFpbl9sZW5ndGgsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqYmFzZV9zaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0gZS0+cDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrOworCWVudW0gb2JqZWN0X3R5cGUga2luZDsKKworCW9mZnNldCA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsIGUtPm9mZnNldCwgJmtpbmQsIHNpemUpOworCXBhY2sgPSBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJaWYgKGtpbmQgIT0gT0JKX0RFTFRBKQorCQkqZGVsdGFfY2hhaW5fbGVuZ3RoID0gMDsKKwllbHNlIHsKKwkJdW5zaWduZWQgaW50IGNoYWluX2xlbmd0aCA9IDA7CisJCWlmIChwLT5wYWNrX3NpemUgPD0gb2Zmc2V0ICsgMjApCisJCQlkaWUoInBhY2sgZmlsZSAlcyByZWNvcmRzIGFuIGluY29tcGxldGUgZGVsdGEgYmFzZSIsCisJCQkgICAgcC0+cGFja19uYW1lKTsKKwkJbWVtY3B5KGJhc2Vfc2hhMSwgcGFjaywgMjApOworCQlkbyB7CisJCQlzdHJ1Y3QgcGFja19lbnRyeSBiYXNlX2VudDsKKwkJCXVuc2lnbmVkIGxvbmcganVuazsKKworCQkJZmluZF9wYWNrX2VudHJ5X29uZShwYWNrLCAmYmFzZV9lbnQsIHApOworCQkJb2Zmc2V0ID0gdW5wYWNrX29iamVjdF9oZWFkZXIocCwgYmFzZV9lbnQub2Zmc2V0LAorCQkJCQkJICAgICAgJmtpbmQsICZqdW5rKTsKKwkJCXBhY2sgPSBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJCQljaGFpbl9sZW5ndGgrKzsKKwkJfSB3aGlsZSAoa2luZCA9PSBPQkpfREVMVEEpOworCQkqZGVsdGFfY2hhaW5fbGVuZ3RoID0gY2hhaW5fbGVuZ3RoOworCX0KKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIE9CSl9DT01NSVQ6CisJCXN0cmNweSh0eXBlLCBjb21taXRfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgT0JKX1RSRUU6CisJCXN0cmNweSh0eXBlLCB0cmVlX3R5cGUpOworCQlicmVhazsKKwljYXNlIE9CSl9CTE9COgorCQlzdHJjcHkodHlwZSwgYmxvYl90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfVEFHOgorCQlzdHJjcHkodHlwZSwgdGFnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoImNvcnJ1cHRlZCBwYWNrIGZpbGUgJXMgY29udGFpbmluZyBvYmplY3Qgb2Yga2luZCAlZCIsCisJCSAgICBwLT5wYWNrX25hbWUsIGtpbmQpOworCX0KKwkqc3RvcmVfc2l6ZSA9IDA7IC8qIG5vdHlldCAqLworfQorCitzdGF0aWMgaW50IHBhY2tlZF9vYmplY3RfaW5mbyhzdHJ1Y3QgcGFja19lbnRyeSAqZW50cnksCisJCQkgICAgICBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGVudHJ5LT5wOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplLCBsZWZ0OworCXVuc2lnbmVkIGNoYXIgKnBhY2s7CisJZW51bSBvYmplY3RfdHlwZSBraW5kOworCWludCByZXR2YWw7CisKKwlpZiAodXNlX3BhY2tlZF9naXQocCkpCisJCWRpZSgiY2Fubm90IG1hcCBwYWNrZWQgZmlsZSIpOworCisJb2Zmc2V0ID0gdW5wYWNrX29iamVjdF9oZWFkZXIocCwgZW50cnktPm9mZnNldCwgJmtpbmQsICZzaXplKTsKKwlwYWNrID0gcC0+cGFja19iYXNlICsgb2Zmc2V0OworCWxlZnQgPSBwLT5wYWNrX3NpemUgLSBvZmZzZXQ7CisKKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIE9CSl9ERUxUQToKKwkJcmV0dmFsID0gcGFja2VkX2RlbHRhX2luZm8ocGFjaywgc2l6ZSwgbGVmdCwgdHlwZSwgc2l6ZXAsIHApOworCQl1bnVzZV9wYWNrZWRfZ2l0KHApOworCQlyZXR1cm4gcmV0dmFsOworCWNhc2UgT0JKX0NPTU1JVDoKKwkJc3RyY3B5KHR5cGUsIGNvbW1pdF90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfVFJFRToKKwkJc3RyY3B5KHR5cGUsIHRyZWVfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgT0JKX0JMT0I6CisJCXN0cmNweSh0eXBlLCBibG9iX3R5cGUpOworCQlicmVhazsKKwljYXNlIE9CSl9UQUc6CisJCXN0cmNweSh0eXBlLCB0YWdfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiY29ycnVwdGVkIHBhY2sgZmlsZSAlcyBjb250YWluaW5nIG9iamVjdCBvZiBraW5kICVkIiwKKwkJICAgIHAtPnBhY2tfbmFtZSwga2luZCk7CisJfQorCWlmIChzaXplcCkKKwkJKnNpemVwID0gc2l6ZTsKKwl1bnVzZV9wYWNrZWRfZ2l0KHApOworCXJldHVybiAwOworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBhIG11dHVhbGx5IHJlY3Vyc2l2ZSBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQgKnVucGFja19lbnRyeShzdHJ1Y3QgcGFja19lbnRyeSAqLCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfZGVsdGFfZW50cnkodW5zaWduZWQgY2hhciAqYmFzZV9zaGExLAorCQkJCXVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSwKKwkJCQl1bnNpZ25lZCBsb25nIGxlZnQsCisJCQkJY2hhciAqdHlwZSwKKwkJCQl1bnNpZ25lZCBsb25nICpzaXplcCwKKwkJCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19lbnRyeSBiYXNlX2VudDsKKwl2b2lkICpkYXRhLCAqZGVsdGFfZGF0YSwgKnJlc3VsdCwgKmJhc2U7CisJdW5zaWduZWQgbG9uZyBkYXRhX3NpemUsIHJlc3VsdF9zaXplLCBiYXNlX3NpemU7CisJel9zdHJlYW0gc3RyZWFtOworCWludCBzdDsKKworCWlmIChsZWZ0IDwgMjApCisJCWRpZSgidHJ1bmNhdGVkIHBhY2sgZmlsZSIpOworCisJLyogVGhlIGJhc2UgZW50cnkgX211c3RfIGJlIGluIHRoZSBzYW1lIHBhY2sgKi8KKwlpZiAoIWZpbmRfcGFja19lbnRyeV9vbmUoYmFzZV9zaGExLCAmYmFzZV9lbnQsIHApKQorCQlkaWUoImZhaWxlZCB0byBmaW5kIGRlbHRhLXBhY2sgYmFzZSBvYmplY3QgJXMiLAorCQkgICAgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisJYmFzZSA9IHVucGFja19lbnRyeV9nZW50bHkoJmJhc2VfZW50LCB0eXBlLCAmYmFzZV9zaXplKTsKKwlpZiAoIWJhc2UpCisJCWRpZSgiZmFpbGVkIHRvIHJlYWQgZGVsdGEtcGFjayBiYXNlIG9iamVjdCAlcyIsCisJCSAgICBzaGExX3RvX2hleChiYXNlX3NoYTEpKTsKKworCWRhdGEgPSBiYXNlX3NoYTEgKyAyMDsKKwlkYXRhX3NpemUgPSBsZWZ0IC0gMjA7CisJZGVsdGFfZGF0YSA9IHhtYWxsb2MoZGVsdGFfc2l6ZSk7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCisJc3RyZWFtLm5leHRfaW4gPSBkYXRhOworCXN0cmVhbS5hdmFpbF9pbiA9IGRhdGFfc2l6ZTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBkZWx0YV9kYXRhOworCXN0cmVhbS5hdmFpbF9vdXQgPSBkZWx0YV9zaXplOworCisJaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJc3QgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCWlmICgoc3QgIT0gWl9TVFJFQU1fRU5EKSB8fCBzdHJlYW0udG90YWxfb3V0ICE9IGRlbHRhX3NpemUpCisJCWRpZSgiZGVsdGEgZGF0YSB1bnBhY2sgZmFpbGVkIik7CisKKwlyZXN1bHQgPSBwYXRjaF9kZWx0YShiYXNlLCBiYXNlX3NpemUsCisJCQkgICAgIGRlbHRhX2RhdGEsIGRlbHRhX3NpemUsCisJCQkgICAgICZyZXN1bHRfc2l6ZSk7CisJaWYgKCFyZXN1bHQpCisJCWRpZSgiZmFpbGVkIHRvIGFwcGx5IGRlbHRhIik7CisJZnJlZShkZWx0YV9kYXRhKTsKKwlmcmVlKGJhc2UpOworCSpzaXplcCA9IHJlc3VsdF9zaXplOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfbm9uX2RlbHRhX2VudHJ5KHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsZWZ0KQoreworCWludCBzdDsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0geG1hbGxvYyhzaXplICsgMSk7CisJYnVmZmVyW3NpemVdID0gMDsKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCXN0cmVhbS5uZXh0X2luID0gZGF0YTsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZWZ0OworCXN0cmVhbS5uZXh0X291dCA9IGJ1ZmZlcjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCXN0ID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlpZiAoKHN0ICE9IFpfU1RSRUFNX0VORCkgfHwgc3RyZWFtLnRvdGFsX291dCAhPSBzaXplKSB7CisJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgKnVucGFja19lbnRyeShzdHJ1Y3QgcGFja19lbnRyeSAqZW50cnksCisJCQkgIGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0gZW50cnktPnA7CisJdm9pZCAqcmV0dmFsOworCisJaWYgKHVzZV9wYWNrZWRfZ2l0KHApKQorCQlkaWUoImNhbm5vdCBtYXAgcGFja2VkIGZpbGUiKTsKKwlyZXR2YWwgPSB1bnBhY2tfZW50cnlfZ2VudGx5KGVudHJ5LCB0eXBlLCBzaXplcCk7CisJdW51c2VfcGFja2VkX2dpdChwKTsKKwlpZiAoIXJldHZhbCkKKwkJZGllKCJjb3JydXB0ZWQgcGFjayBmaWxlICVzIiwgcC0+cGFja19uYW1lKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB1c2VfcGFja2VkX2dpdCgpL3VudXNlX3BhY2tlZF9naXQoKSBwYWlyICovCit2b2lkICp1bnBhY2tfZW50cnlfZ2VudGx5KHN0cnVjdCBwYWNrX2VudHJ5ICplbnRyeSwKKwkJCSAgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBlbnRyeS0+cDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZSwgbGVmdDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrOworCWVudW0gb2JqZWN0X3R5cGUga2luZDsKKwl2b2lkICpyZXR2YWw7CisKKwlvZmZzZXQgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcihwLCBlbnRyeS0+b2Zmc2V0LCAma2luZCwgJnNpemUpOworCXBhY2sgPSBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJbGVmdCA9IHAtPnBhY2tfc2l6ZSAtIG9mZnNldDsKKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIE9CSl9ERUxUQToKKwkJcmV0dmFsID0gdW5wYWNrX2RlbHRhX2VudHJ5KHBhY2ssIHNpemUsIGxlZnQsIHR5cGUsIHNpemVwLCBwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwljYXNlIE9CSl9DT01NSVQ6CisJCXN0cmNweSh0eXBlLCBjb21taXRfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgT0JKX1RSRUU6CisJCXN0cmNweSh0eXBlLCB0cmVlX3R5cGUpOworCQlicmVhazsKKwljYXNlIE9CSl9CTE9COgorCQlzdHJjcHkodHlwZSwgYmxvYl90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfVEFHOgorCQlzdHJjcHkodHlwZSwgdGFnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisJKnNpemVwID0gc2l6ZTsKKwlyZXR2YWwgPSB1bnBhY2tfbm9uX2RlbHRhX2VudHJ5KHBhY2ssIHNpemUsIGxlZnQpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBudW1fcGFja2VkX29iamVjdHMoY29uc3Qgc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJLyogU2VlIGNoZWNrX3BhY2tlZF9naXRfaWR4KCkgKi8KKwlyZXR1cm4gKHAtPmluZGV4X3NpemUgLSAyMCAtIDIwIC0gNCoyNTYpIC8gMjQ7Cit9CisKK2ludCBudGhfcGFja2VkX29iamVjdF9zaGExKGNvbnN0IHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBpbnQgbiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIqIHNoYTEpCit7CisJdm9pZCAqaW5kZXggPSBwLT5pbmRleF9iYXNlICsgMjU2OworCWlmIChuIDwgMCB8fCBudW1fcGFja2VkX29iamVjdHMocCkgPD0gbikKKwkJcmV0dXJuIC0xOworCW1lbWNweShzaGExLCAoaW5kZXggKyAyNCAqIG4gKyA0KSwgMjApOworCXJldHVybiAwOworfQorCitpbnQgZmluZF9wYWNrX2VudHJ5X29uZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJc3RydWN0IHBhY2tfZW50cnkgKmUsIHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXVuc2lnbmVkIGludCAqbGV2ZWwxX29mcyA9IHAtPmluZGV4X2Jhc2U7CisJaW50IGhpID0gbnRvaGwobGV2ZWwxX29mc1sqc2hhMV0pOworCWludCBsbyA9ICgoKnNoYTEgPT0gMHgwKSA/IDAgOiBudG9obChsZXZlbDFfb2ZzWypzaGExIC0gMV0pKTsKKwl2b2lkICppbmRleCA9IHAtPmluZGV4X2Jhc2UgKyAyNTY7CisKKwlkbyB7CisJCWludCBtaSA9IChsbyArIGhpKSAvIDI7CisJCWludCBjbXAgPSBtZW1jbXAoaW5kZXggKyAyNCAqIG1pICsgNCwgc2hhMSwgMjApOworCQlpZiAoIWNtcCkgeworCQkJZS0+b2Zmc2V0ID0gbnRvaGwoKigodW5zaWduZWQgaW50ICopKGluZGV4ICsgMjQgKiBtaSkpKTsKKwkJCW1lbWNweShlLT5zaGExLCBzaGExLCAyMCk7CisJCQllLT5wID0gcDsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChjbXAgPiAwKQorCQkJaGkgPSBtaTsKKwkJZWxzZQorCQkJbG8gPSBtaSsxOworCX0gd2hpbGUgKGxvIDwgaGkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfcGFja19lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBzdHJ1Y3QgcGFja19lbnRyeSAqZSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsIGUsIHApKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqZmluZF9zaGExX3BhY2soY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgCisJCQkJICBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja3MpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJc3RydWN0IHBhY2tfZW50cnkgZTsKKworCWZvciAocCA9IHBhY2tzOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAoZmluZF9wYWNrX2VudHJ5X29uZShzaGExLCAmZSwgcCkpCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7CisJCit9CisKK2ludCBzaGExX29iamVjdF9pbmZvKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBtYXBzaXplLCBzaXplOworCXZvaWQgKm1hcDsKKwl6X3N0cmVhbSBzdHJlYW07CisJY2hhciBoZHJbMTI4XTsKKworCW1hcCA9IG1hcF9zaGExX2ZpbGVfaW50ZXJuYWwoc2hhMSwgJm1hcHNpemUpOworCWlmICghbWFwKSB7CisJCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisKKwkJaWYgKGZpbmRfcGFja19lbnRyeShzaGExLCAmZSkpCisJCQlyZXR1cm4gcGFja2VkX29iamVjdF9pbmZvKCZlLCB0eXBlLCBzaXplcCk7CisJCXJlcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisJCWlmIChmaW5kX3BhY2tfZW50cnkoc2hhMSwgJmUpKQorCQkJcmV0dXJuIHBhY2tlZF9vYmplY3RfaW5mbygmZSwgdHlwZSwgc2l6ZXApOworCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBmaW5kICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwlpZiAodW5wYWNrX3NoYTFfaGVhZGVyKCZzdHJlYW0sIG1hcCwgbWFwc2l6ZSwgaGRyLCBzaXplb2YoaGRyKSkgPCAwKQorCQlzdGF0dXMgPSBlcnJvcigidW5hYmxlIHRvIHVucGFjayAlcyBoZWFkZXIiLAorCQkJICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlpZiAocGFyc2Vfc2hhMV9oZWFkZXIoaGRyLCB0eXBlLCAmc2l6ZSkgPCAwKQorCQlzdGF0dXMgPSBlcnJvcigidW5hYmxlIHRvIHBhcnNlICVzIGhlYWRlciIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwllbHNlIHsKKwkJc3RhdHVzID0gMDsKKwkJaWYgKHNpemVwKQorCQkJKnNpemVwID0gc2l6ZTsKKwl9CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwltdW5tYXAobWFwLCBtYXBzaXplKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCAqcmVhZF9wYWNrZWRfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisKKwlpZiAoIWZpbmRfcGFja19lbnRyeShzaGExLCAmZSkpIHsKKwkJZXJyb3IoImNhbm5vdCByZWFkIHNoYTFfZmlsZSBmb3IgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdW5wYWNrX2VudHJ5KCZlLCB0eXBlLCBzaXplKTsKK30KKwordm9pZCAqIHJlYWRfc2hhMV9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJdW5zaWduZWQgbG9uZyBtYXBzaXplOworCXZvaWQgKm1hcCwgKmJ1ZjsKKwlzdHJ1Y3QgcGFja19lbnRyeSBlOworCisJaWYgKGZpbmRfcGFja19lbnRyeShzaGExLCAmZSkpCisJCXJldHVybiByZWFkX3BhY2tlZF9zaGExKHNoYTEsIHR5cGUsIHNpemUpOworCW1hcCA9IG1hcF9zaGExX2ZpbGVfaW50ZXJuYWwoc2hhMSwgJm1hcHNpemUpOworCWlmIChtYXApIHsKKwkJYnVmID0gdW5wYWNrX3NoYTFfZmlsZShtYXAsIG1hcHNpemUsIHR5cGUsIHNpemUpOworCQltdW5tYXAobWFwLCBtYXBzaXplKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisJcmVwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwlpZiAoZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlKSkKKwkJcmV0dXJuIHJlYWRfcGFja2VkX3NoYTEoc2hhMSwgdHlwZSwgc2l6ZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKnJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJIGNvbnN0IGNoYXIgKnJlcXVpcmVkX3R5cGUsCisJCQkJIHVuc2lnbmVkIGxvbmcgKnNpemUsCisJCQkJIHVuc2lnbmVkIGNoYXIgKmFjdHVhbF9zaGExX3JldHVybikKK3sKKwljaGFyIHR5cGVbMjBdOworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGlzaXplOworCXVuc2lnbmVkIGNoYXIgYWN0dWFsX3NoYTFbMjBdOworCisJbWVtY3B5KGFjdHVhbF9zaGExLCBzaGExLCAyMCk7CisJd2hpbGUgKDEpIHsKKwkJaW50IHJlZl9sZW5ndGggPSAtMTsKKwkJY29uc3QgY2hhciAqcmVmX3R5cGUgPSBOVUxMOworCisJCWJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKGFjdHVhbF9zaGExLCB0eXBlLCAmaXNpemUpOworCQlpZiAoIWJ1ZmZlcikKKwkJCXJldHVybiBOVUxMOworCQlpZiAoIXN0cmNtcCh0eXBlLCByZXF1aXJlZF90eXBlKSkgeworCQkJKnNpemUgPSBpc2l6ZTsKKwkJCWlmIChhY3R1YWxfc2hhMV9yZXR1cm4pCisJCQkJbWVtY3B5KGFjdHVhbF9zaGExX3JldHVybiwgYWN0dWFsX3NoYTEsIDIwKTsKKwkJCXJldHVybiBidWZmZXI7CisJCX0KKwkJLyogSGFuZGxlIHJlZmVyZW5jZXMgKi8KKwkJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCBjb21taXRfdHlwZSkpCisJCQlyZWZfdHlwZSA9ICJ0cmVlICI7CisJCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgdGFnX3R5cGUpKQorCQkJcmVmX3R5cGUgPSAib2JqZWN0ICI7CisJCWVsc2UgeworCQkJZnJlZShidWZmZXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmVmX2xlbmd0aCA9IHN0cmxlbihyZWZfdHlwZSk7CisKKwkJaWYgKG1lbWNtcChidWZmZXIsIHJlZl90eXBlLCByZWZfbGVuZ3RoKSB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGJ1ZmZlciArIHJlZl9sZW5ndGgsIGFjdHVhbF9zaGExKSkgeworCQkJZnJlZShidWZmZXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZnJlZShidWZmZXIpOworCQkvKiBOb3cgd2UgaGF2ZSB0aGUgSUQgb2YgdGhlIHJlZmVycmVkLXRvIG9iamVjdCBpbgorCQkgKiBhY3R1YWxfc2hhMS4gIENoZWNrIGFnYWluLiAqLworCX0KK30KKworY2hhciAqd3JpdGVfc2hhMV9maWxlX3ByZXBhcmUodm9pZCAqYnVmLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkgICAgICBjb25zdCBjaGFyICp0eXBlLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmhkciwKKwkJCSAgICAgIGludCAqaGRybGVuKQoreworCVNIQV9DVFggYzsKKworCS8qIEdlbmVyYXRlIHRoZSBoZWFkZXIgKi8KKwkqaGRybGVuID0gc3ByaW50ZigoY2hhciAqKWhkciwgIiVzICVsdSIsIHR5cGUsIGxlbikrMTsKKworCS8qIFNoYTEuLiAqLworCVNIQTFfSW5pdCgmYyk7CisJU0hBMV9VcGRhdGUoJmMsIGhkciwgKmhkcmxlbik7CisJU0hBMV9VcGRhdGUoJmMsIGJ1ZiwgbGVuKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjKTsKKworCXJldHVybiBzaGExX2ZpbGVfbmFtZShzaGExKTsKK30KKworLyoKKyAqIExpbmsgdGhlIHRlbXBmaWxlIHRvIHRoZSBmaW5hbCBwbGFjZSwgcG9zc2libHkgY3JlYXRpbmcgdGhlCisgKiBsYXN0IGRpcmVjdG9yeSBsZXZlbCBhcyB5b3UgZG8gc28uCisgKgorICogUmV0dXJucyB0aGUgZXJybm8gb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGxpbmtfdGVtcF90b19maWxlKGNvbnN0IGNoYXIgKnRtcGZpbGUsIGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQ7CisKKwlpZiAoIWxpbmsodG1wZmlsZSwgZmlsZW5hbWUpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVHJ5IHRvIG1rZGlyIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IGlmIHRoYXQgZmFpbGVkCisJICogd2l0aCBhbiBFTk9FTlQuCisJICoKKwkgKiBSZS10cnkgdGhlICJsaW5rKCkiIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbWtkaXIKKwkgKiBzdWNjZWVkcywgc2luY2UgYSByYWNlIG1pZ2h0IG1lYW4gdGhhdCBzb21lYm9keQorCSAqIGVsc2Ugc3VjY2VlZGVkLgorCSAqLworCXJldCA9IGVycm5vOworCWlmIChyZXQgPT0gRU5PRU5UKSB7CisJCWNoYXIgKmRpciA9IHN0cnJjaHIoZmlsZW5hbWUsICcvJyk7CisJCWlmIChkaXIpIHsKKwkJCSpkaXIgPSAwOworCQkJbWtkaXIoZmlsZW5hbWUsIDA3NzcpOworCQkJaWYgKGFkanVzdF9zaGFyZWRfcGVybShmaWxlbmFtZSkpCisJCQkJcmV0dXJuIC0yOworCQkJKmRpciA9ICcvJzsKKwkJCWlmICghbGluayh0bXBmaWxlLCBmaWxlbmFtZSkpCisJCQkJcmV0dXJuIDA7CisJCQlyZXQgPSBlcnJubzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTW92ZSB0aGUganVzdCB3cml0dGVuIG9iamVjdCBpbnRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlCisgKi8KK2ludCBtb3ZlX3RlbXBfdG9fZmlsZShjb25zdCBjaGFyICp0bXBmaWxlLCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgcmV0ID0gbGlua190ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworCisJLyoKKwkgKiBDb2RhIGhhY2sgLSBjb2RhIGRvZXNuJ3QgbGlrZSBjcm9zcy1kaXJlY3RvcnkgbGlua3MsCisJICogc28gd2UgZmFsbCBiYWNrIHRvIGEgcmVuYW1lLCB3aGljaCB3aWxsIG1lYW4gdGhhdCBpdAorCSAqIHdvbid0IGJlIGFibGUgdG8gY2hlY2sgY29sbGlzaW9ucywgYnV0IHRoYXQncyBub3QgYQorCSAqIGJpZyBkZWFsLgorCSAqCisJICogVGhlIHNhbWUgaG9sZHMgZm9yIEZBVCBmb3JtYXR0ZWQgbWVkaWEuCisJICoKKwkgKiBXaGVuIHRoaXMgc3VjY2VlZHMsIHdlIGp1c3QgcmV0dXJuIDAuIFdlIGhhdmUgbm90aGluZworCSAqIGxlZnQgdG8gdW5saW5rLgorCSAqLworCWlmIChyZXQgJiYgcmV0ICE9IEVFWElTVCkgeworCQlpZiAoIXJlbmFtZSh0bXBmaWxlLCBmaWxlbmFtZSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0ID0gZXJybm87CisJfQorCXVubGluayh0bXBmaWxlKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgIT0gRUVYSVNUKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byB3cml0ZSBzaGExIGZpbGVuYW1lICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8qIEZJWE1FISEhIENvbGxpc2lvbiBjaGVjayBoZXJlID8gKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9idWZmZXIoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKGxlbikgeworCQlzc2l6ZV90IHNpemU7CisKKwkJc2l6ZSA9IHdyaXRlKGZkLCBidWYsIGxlbik7CisJCWlmICghc2l6ZSkKKwkJCXJldHVybiBlcnJvcigiZmlsZSB3cml0ZTogZGlzayBmdWxsIik7CisJCWlmIChzaXplIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikKKwkJCQljb250aW51ZTsKKwkJCXJldHVybiBlcnJvcigiZmlsZSB3cml0ZSBlcnJvciAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlsZW4gLT0gc2l6ZTsKKwkJYnVmICs9IHNpemU7CisJfQorCXJldHVybiAwOworfQorCitpbnQgd3JpdGVfc2hhMV9maWxlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKnJldHVybnNoYTEpCit7CisJaW50IHNpemU7CisJdW5zaWduZWQgY2hhciAqY29tcHJlc3NlZDsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICpmaWxlbmFtZTsKKwlzdGF0aWMgY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBjaGFyIGhkcls1MF07CisJaW50IGZkLCBoZHJsZW47CisKKwkvKiBOb3JtYWxseSBpZiB3ZSBoYXZlIGl0IGluIHRoZSBwYWNrIHRoZW4gd2UgZG8gbm90IGJvdGhlciB3cml0aW5nCisJICogaXQgb3V0IGludG8gLmdpdC9vYmplY3RzLz8/Lz97Mzh9IGZpbGUuCisJICovCisJZmlsZW5hbWUgPSB3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShidWYsIGxlbiwgdHlwZSwgc2hhMSwgaGRyLCAmaGRybGVuKTsKKwlpZiAocmV0dXJuc2hhMSkKKwkJbWVtY3B5KHJldHVybnNoYTEsIHNoYTEsIDIwKTsKKwlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSkKKwkJcmV0dXJuIDA7CisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJLyoKKwkJICogRklYTUUhISEgV2UgbWlnaHQgZG8gY29sbGlzaW9uIGNoZWNraW5nIGhlcmUsIGJ1dCB3ZSdkCisJCSAqIG5lZWQgdG8gdW5jb21wcmVzcyB0aGUgb2xkIGZpbGUgYW5kIGNoZWNrIGl0LiBMYXRlci4KKwkJICovCisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInNoYTEgZmlsZSAlczogJXNcbiIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMvb2JqX1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCisJZmQgPSBta3N0ZW1wKHRtcGZpbGUpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBzaGExIGZpbGVuYW1lICVzOiAlc1xuIiwgdG1wZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCBpdCB1cCAqLworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisJZGVmbGF0ZUluaXQoJnN0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKKwlzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIGxlbitoZHJsZW4pOworCWNvbXByZXNzZWQgPSB4bWFsbG9jKHNpemUpOworCisJLyogQ29tcHJlc3MgaXQgKi8KKwlzdHJlYW0ubmV4dF9vdXQgPSBjb21wcmVzc2VkOworCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplOworCisJLyogRmlyc3QgaGVhZGVyLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9IGhkcjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBoZHJsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgMCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKworCS8qIFRoZW4gdGhlIGRhdGEgaXRzZWxmLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9IGJ1ZjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCS8qIG5vdGhpbmcgKi87CisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwlzaXplID0gc3RyZWFtLnRvdGFsX291dDsKKworCWlmICh3cml0ZV9idWZmZXIoZmQsIGNvbXByZXNzZWQsIHNpemUpIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgc2hhMSBmaWxlIik7CisJZmNobW9kKGZkLCAwNDQ0KTsKKwljbG9zZShmZCk7CisJZnJlZShjb21wcmVzc2VkKTsKKworCXJldHVybiBtb3ZlX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIHVucGFjayBhbmQgcmVjb21wcmVzcyB0aGUgb2JqZWN0IGZvciB3cml0aW5nCisgKiBpdCBvdXQgdG8gYSBkaWZmZXJlbnQgZmlsZS4KKyAqLworc3RhdGljIHZvaWQgKnJlcGFja19vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgbG9uZyAqb2Jqc2l6ZSkKK3sKKwlzaXplX3Qgc2l6ZTsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciAqdW5wYWNrZWQ7CisJdW5zaWduZWQgbG9uZyBsZW47CisJY2hhciB0eXBlWzIwXTsKKwljaGFyIGhkcls1MF07CisJaW50IGhkcmxlbjsKKwl2b2lkICpidWY7CisKKwkvLyBuZWVkIHRvIHVucGFjayBhbmQgcmVjb21wcmVzcyBpdCBieSBpdHNlbGYKKwl1bnBhY2tlZCA9IHJlYWRfcGFja2VkX3NoYTEoc2hhMSwgdHlwZSwgJmxlbik7CisKKwloZHJsZW4gPSBzcHJpbnRmKGhkciwgIiVzICVsdSIsIHR5cGUsIGxlbikgKyAxOworCisJLyogU2V0IGl0IHVwICovCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04pOworCXNpemUgPSBkZWZsYXRlQm91bmQoJnN0cmVhbSwgbGVuICsgaGRybGVuKTsKKwlidWYgPSB4bWFsbG9jKHNpemUpOworCisJLyogQ29tcHJlc3MgaXQgKi8KKwlzdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisKKwkvKiBGaXJzdCBoZWFkZXIuLiAqLworCXN0cmVhbS5uZXh0X2luID0gKHZvaWQgKiloZHI7CisJc3RyZWFtLmF2YWlsX2luID0gaGRybGVuOworCXdoaWxlIChkZWZsYXRlKCZzdHJlYW0sIDApID09IFpfT0spCisJCS8qIG5vdGhpbmcgKi87CisKKwkvKiBUaGVuIHRoZSBkYXRhIGl0c2VsZi4uICovCisJc3RyZWFtLm5leHRfaW4gPSB1bnBhY2tlZDsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCS8qIG5vdGhpbmcgKi87CisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwlmcmVlKHVucGFja2VkKTsKKworCSpvYmpzaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgd3JpdGVfc2hhMV90b19mZChpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIG9ianNpemU7CisJdm9pZCAqYnVmID0gbWFwX3NoYTFfZmlsZV9pbnRlcm5hbChzaGExLCAmb2Jqc2l6ZSk7CisKKwlpZiAoYnVmKSB7CisJCXJldHZhbCA9IHdyaXRlX2J1ZmZlcihmZCwgYnVmLCBvYmpzaXplKTsKKwkJbXVubWFwKGJ1Ziwgb2Jqc2l6ZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJYnVmID0gcmVwYWNrX29iamVjdChzaGExLCAmb2Jqc2l6ZSk7CisJcmV0dmFsID0gd3JpdGVfYnVmZmVyKGZkLCBidWYsIG9ianNpemUpOworCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgd3JpdGVfc2hhMV9mcm9tX2ZkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgY2hhciAqYnVmZmVyLAorCQkgICAgICAgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCAqYnVmcG9zbikKK3sKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCBsb2NhbDsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciByZWFsX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgZGlzY2FyZFs0MDk2XTsKKwlpbnQgcmV0OworCVNIQV9DVFggYzsKKworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwgIiVzL29ial9YWFhYWFgiLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKworCWxvY2FsID0gbWtzdGVtcCh0bXBmaWxlKTsKKwlpZiAobG9jYWwgPCAwKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IG9wZW4gJXMgZm9yICVzIiwKKwkJCSAgICAgdG1wZmlsZSwgc2hhMV90b19oZXgoc2hhMSkpOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCisJU0hBMV9Jbml0KCZjKTsKKworCWRvIHsKKwkJc3NpemVfdCBzaXplOworCQlpZiAoKmJ1ZnBvc24pIHsKKwkJCXN0cmVhbS5hdmFpbF9pbiA9ICpidWZwb3NuOworCQkJc3RyZWFtLm5leHRfaW4gPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXI7CisJCQlkbyB7CisJCQkJc3RyZWFtLm5leHRfb3V0ID0gZGlzY2FyZDsKKwkJCQlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGRpc2NhcmQpOworCQkJCXJldCA9IGluZmxhdGUoJnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKKwkJCQlTSEExX1VwZGF0ZSgmYywgZGlzY2FyZCwgc2l6ZW9mKGRpc2NhcmQpIC0KKwkJCQkJICAgIHN0cmVhbS5hdmFpbF9vdXQpOworCQkJfSB3aGlsZSAoc3RyZWFtLmF2YWlsX2luICYmIHJldCA9PSBaX09LKTsKKwkJCWlmICh3cml0ZV9idWZmZXIobG9jYWwsIGJ1ZmZlciwgKmJ1ZnBvc24gLSBzdHJlYW0uYXZhaWxfaW4pIDwgMCkKKwkJCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzaGExIGZpbGUiKTsKKwkJCW1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyAqYnVmcG9zbiAtIHN0cmVhbS5hdmFpbF9pbiwKKwkJCQlzdHJlYW0uYXZhaWxfaW4pOworCQkJKmJ1ZnBvc24gPSBzdHJlYW0uYXZhaWxfaW47CisJCQlpZiAocmV0ICE9IFpfT0spCisJCQkJYnJlYWs7CisJCX0KKwkJc2l6ZSA9IHJlYWQoZmQsIGJ1ZmZlciArICpidWZwb3NuLCBidWZzaXplIC0gKmJ1ZnBvc24pOworCQlpZiAoc2l6ZSA8PSAwKSB7CisJCQljbG9zZShsb2NhbCk7CisJCQl1bmxpbmsodG1wZmlsZSk7CisJCQlpZiAoIXNpemUpCisJCQkJcmV0dXJuIGVycm9yKCJDb25uZWN0aW9uIGNsb3NlZD8iKTsKKwkJCXBlcnJvcigiUmVhZGluZyBmcm9tIGNvbm5lY3Rpb24iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkqYnVmcG9zbiArPSBzaXplOworCX0gd2hpbGUgKDEpOworCWluZmxhdGVFbmQoJnN0cmVhbSk7CisKKwljbG9zZShsb2NhbCk7CisJU0hBMV9GaW5hbChyZWFsX3NoYTEsICZjKTsKKwlpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQl1bmxpbmsodG1wZmlsZSk7CisJCXJldHVybiBlcnJvcigiRmlsZSAlcyBjb3JydXB0ZWQiLCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCWlmIChtZW1jbXAoc2hhMSwgcmVhbF9zaGExLCAyMCkpIHsKKwkJdW5saW5rKHRtcGZpbGUpOworCQlyZXR1cm4gZXJyb3IoIkZpbGUgJXMgaGFzIGJhZCBoYXNoIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKworCXJldHVybiBtb3ZlX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBzaGExX2ZpbGVfbmFtZShzaGExKSk7Cit9CisKK2ludCBoYXNfcGFja19pbmRleChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdGF0IHN0OworCWlmIChzdGF0KHNoYTFfcGFja19pbmRleF9uYW1lKHNoYTEpLCAmc3QpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50IGhhc19wYWNrX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpZiAoc3RhdChzaGExX3BhY2tfbmFtZShzaGExKSwgJnN0KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK2ludCBoYXNfc2hhMV9wYWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tfZW50cnkgZTsKKwlyZXR1cm4gZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlKTsKK30KKworaW50IGhhc19zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgcGFja19lbnRyeSBlOworCisJaWYgKGZpbmRfcGFja19lbnRyeShzaGExLCAmZSkpCisJCXJldHVybiAxOworCXJldHVybiBmaW5kX3NoYTFfZmlsZShzaGExLCAmc3QpID8gMSA6IDA7Cit9CisKKy8qCisgKiByZWFkcyBmcm9tIGZkIGFzIGxvbmcgYXMgcG9zc2libGUgaW50byBhIHN1cHBsaWVkIGJ1ZmZlciBvZiBzaXplIGJ5dGVzLgorICogSWYgbmVjY2Vzc2FyeSB0aGUgYnVmZmVyJ3Mgc2l6ZSBpcyBpbmNyZWFzZWQgdXNpbmcgcmVhbGxvYygpCisgKgorICogcmV0dXJucyAwIGlmIGFueXRoaW5nIHdlbnQgZmluZSBhbmQgLTEgb3RoZXJ3aXNlCisgKgorICogTk9URTogYm90aCBidWYgYW5kIHNpemUgbWF5IGNoYW5nZSwgYnV0IGV2ZW4gd2hlbiAtMSBpcyByZXR1cm5lZAorICogeW91IHN0aWxsIGhhdmUgdG8gZnJlZSgpIGl0IHlvdXJzZWxmLgorICovCitpbnQgcmVhZF9waXBlKGludCBmZCwgY2hhcioqIHJldHVybl9idWYsIHVuc2lnbmVkIGxvbmcqIHJldHVybl9zaXplKQoreworCWNoYXIqIGJ1ZiA9ICpyZXR1cm5fYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICpyZXR1cm5fc2l6ZTsKKwlpbnQgaXJldDsKKwl1bnNpZ25lZCBsb25nIG9mZiA9IDA7CisKKwlkbyB7CisJCWlyZXQgPSB4cmVhZChmZCwgYnVmICsgb2ZmLCBzaXplIC0gb2ZmKTsKKwkJaWYgKGlyZXQgPiAwKSB7CisJCQlvZmYgKz0gaXJldDsKKwkJCWlmIChvZmYgPT0gc2l6ZSkgeworCQkJCXNpemUgKj0gMjsKKwkJCQlidWYgPSByZWFsbG9jKGJ1Ziwgc2l6ZSk7CisJCQl9CisJCX0KKwl9IHdoaWxlIChpcmV0ID4gMCk7CisKKwkqcmV0dXJuX2J1ZiA9IGJ1ZjsKKwkqcmV0dXJuX3NpemUgPSBvZmY7CisKKwlpZiAoaXJldCA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGluZGV4X3BpcGUodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDQwOTY7CisJY2hhciAqYnVmID0gbWFsbG9jKHNpemUpOworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBoZHJbNTBdOworCWludCBoZHJsZW47CisKKwlpZiAocmVhZF9waXBlKGZkLCAmYnVmLCAmc2l6ZSkpIHsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCF0eXBlKQorCQl0eXBlID0gYmxvYl90eXBlOworCWlmICh3cml0ZV9vYmplY3QpCisJCXJldCA9IHdyaXRlX3NoYTFfZmlsZShidWYsIHNpemUsIHR5cGUsIHNoYTEpOworCWVsc2UgeworCQl3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShidWYsIHNpemUsIHR5cGUsIHNoYTEsIGhkciwgJmhkcmxlbik7CisJCXJldCA9IDA7CisJfQorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaW5kZXhfZmQodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCB3cml0ZV9vYmplY3QsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gc3QtPnN0X3NpemU7CisJdm9pZCAqYnVmOworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBoZHJbNTBdOworCWludCBoZHJsZW47CisKKwlidWYgPSAiIjsKKwlpZiAoc2l6ZSkKKwkJYnVmID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCWlmIChidWYgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCF0eXBlKQorCQl0eXBlID0gYmxvYl90eXBlOworCWlmICh3cml0ZV9vYmplY3QpCisJCXJldCA9IHdyaXRlX3NoYTFfZmlsZShidWYsIHNpemUsIHR5cGUsIHNoYTEpOworCWVsc2UgeworCQl3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShidWYsIHNpemUsIHR5cGUsIHNoYTEsIGhkciwgJmhkcmxlbik7CisJCXJldCA9IDA7CisJfQorCWlmIChzaXplKQorCQltdW5tYXAoYnVmLCBzaXplKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaW5kZXhfcGF0aCh1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCB3cml0ZV9vYmplY3QpCit7CisJaW50IGZkOworCWNoYXIgKnRhcmdldDsKKworCXN3aXRjaCAoc3QtPnN0X21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gZXJyb3IoIm9wZW4oXCIlc1wiKTogJXMiLCBwYXRoLAorCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGluZGV4X2ZkKHNoYTEsIGZkLCBzdCwgd3JpdGVfb2JqZWN0LCBOVUxMKSA8IDApCisJCQlyZXR1cm4gZXJyb3IoIiVzOiBmYWlsZWQgdG8gaW5zZXJ0IGludG8gZGF0YWJhc2UiLAorCQkJCSAgICAgcGF0aCk7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKKwkJdGFyZ2V0ID0geG1hbGxvYyhzdC0+c3Rfc2l6ZSsxKTsKKwkJaWYgKHJlYWRsaW5rKHBhdGgsIHRhcmdldCwgc3QtPnN0X3NpemUrMSkgIT0gc3QtPnN0X3NpemUpIHsKKwkJCWNoYXIgKmVycnN0ciA9IHN0cmVycm9yKGVycm5vKTsKKwkJCWZyZWUodGFyZ2V0KTsKKwkJCXJldHVybiBlcnJvcigicmVhZGxpbmsoXCIlc1wiKTogJXMiLCBwYXRoLAorCQkJICAgICAgICAgICAgIGVycnN0cik7CisJCX0KKwkJaWYgKCF3cml0ZV9vYmplY3QpIHsKKwkJCXVuc2lnbmVkIGNoYXIgaGRyWzUwXTsKKwkJCWludCBoZHJsZW47CisJCQl3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZSh0YXJnZXQsIHN0LT5zdF9zaXplLCBibG9iX3R5cGUsCisJCQkJCQlzaGExLCBoZHIsICZoZHJsZW4pOworCQl9IGVsc2UgaWYgKHdyaXRlX3NoYTFfZmlsZSh0YXJnZXQsIHN0LT5zdF9zaXplLCBibG9iX3R5cGUsIHNoYTEpKQorCQkJcmV0dXJuIGVycm9yKCIlczogZmFpbGVkIHRvIGluc2VydCBpbnRvIGRhdGFiYXNlIiwKKwkJCQkgICAgIHBhdGgpOworCQlmcmVlKHRhcmdldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBlcnJvcigiJXM6IHVuc3VwcG9ydGVkIGZpbGUgdHlwZSIsIHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NoYTFfbmFtZS5jIGIvc2hhMV9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiZGUxYwotLS0gL2Rldi9udWxsCisrKyBiL3NoYTFfbmFtZS5jCkBAIC0wLDAgKzEsNTQ2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworc3RhdGljIGludCBmaW5kX3Nob3J0X29iamVjdF9maWxlbmFtZShpbnQgbGVuLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICphbHQ7CisJY2hhciBoZXhbNDBdOworCWludCBmb3VuZCA9IDA7CisJc3RhdGljIHN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICpmYWtlZW50OworCisJaWYgKCFmYWtlZW50KSB7CisJCWNvbnN0IGNoYXIgKm9iamRpciA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJCWludCBvYmpkaXJfbGVuID0gc3RybGVuKG9iamRpcik7CisJCWludCBlbnRsZW4gPSBvYmpkaXJfbGVuICsgNDM7CisJCWZha2VlbnQgPSB4bWFsbG9jKHNpemVvZigqZmFrZWVudCkgKyBlbnRsZW4pOworCQltZW1jcHkoZmFrZWVudC0+YmFzZSwgb2JqZGlyLCBvYmpkaXJfbGVuKTsKKwkJZmFrZWVudC0+bmFtZSA9IGZha2VlbnQtPmJhc2UgKyBvYmpkaXJfbGVuICsgMTsKKwkJZmFrZWVudC0+bmFtZVstMV0gPSAnLyc7CisJfQorCWZha2VlbnQtPm5leHQgPSBhbHRfb2RiX2xpc3Q7CisKKwlzcHJpbnRmKGhleCwgIiUuMnMiLCBuYW1lKTsKKwlmb3IgKGFsdCA9IGZha2VlbnQ7IGFsdCAmJiBmb3VuZCA8IDI7IGFsdCA9IGFsdC0+bmV4dCkgeworCQlzdHJ1Y3QgZGlyZW50ICpkZTsKKwkJRElSICpkaXI7CisJCXNwcmludGYoYWx0LT5uYW1lLCAiJS4ycy8iLCBuYW1lKTsKKwkJZGlyID0gb3BlbmRpcihhbHQtPmJhc2UpOworCQlpZiAoIWRpcikKKwkJCWNvbnRpbnVlOworCQl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQlpZiAoc3RybGVuKGRlLT5kX25hbWUpICE9IDM4KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChkZS0+ZF9uYW1lLCBuYW1lICsgMiwgbGVuIC0gMikpCisJCQkJY29udGludWU7CisJCQlpZiAoIWZvdW5kKSB7CisJCQkJbWVtY3B5KGhleCArIDIsIGRlLT5kX25hbWUsIDM4KTsKKwkJCQlmb3VuZCsrOworCQkJfQorCQkJZWxzZSBpZiAobWVtY21wKGhleCArIDIsIGRlLT5kX25hbWUsIDM4KSkgeworCQkJCWZvdW5kID0gMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQljbG9zZWRpcihkaXIpOworCX0KKwlpZiAoZm91bmQgPT0gMSkKKwkJcmV0dXJuIGdldF9zaGExX2hleChoZXgsIHNoYTEpID09IDA7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50IG1hdGNoX3NoYSh1bnNpZ25lZCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIpCit7CisJZG8geworCQlpZiAoKmEgIT0gKmIpCisJCQlyZXR1cm4gMDsKKwkJYSsrOworCQliKys7CisJCWxlbiAtPSAyOworCX0gd2hpbGUgKGxlbiA+IDEpOworCWlmIChsZW4pCisJCWlmICgoKmEgXiAqYikgJiAweGYwKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9zaG9ydF9wYWNrZWRfb2JqZWN0KGludCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hdGNoLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXVuc2lnbmVkIGNoYXIgZm91bmRfc2hhMVsyMF07CisJaW50IGZvdW5kID0gMDsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHAgJiYgZm91bmQgPCAyOyBwID0gcC0+bmV4dCkgeworCQl1bnNpZ25lZCBudW0gPSBudW1fcGFja2VkX29iamVjdHMocCk7CisJCXVuc2lnbmVkIGZpcnN0ID0gMCwgbGFzdCA9IG51bTsKKwkJd2hpbGUgKGZpcnN0IDwgbGFzdCkgeworCQkJdW5zaWduZWQgbWlkID0gKGZpcnN0ICsgbGFzdCkgLyAyOworCQkJdW5zaWduZWQgY2hhciBub3dbMjBdOworCQkJaW50IGNtcDsKKworCQkJbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBtaWQsIG5vdyk7CisJCQljbXAgPSBtZW1jbXAobWF0Y2gsIG5vdywgMjApOworCQkJaWYgKCFjbXApIHsKKwkJCQlmaXJzdCA9IG1pZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjbXAgPiAwKSB7CisJCQkJZmlyc3QgPSBtaWQrMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxhc3QgPSBtaWQ7CisJCX0KKwkJaWYgKGZpcnN0IDwgbnVtKSB7CisJCQl1bnNpZ25lZCBjaGFyIG5vd1syMF0sIG5leHRbMjBdOworCQkJbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBmaXJzdCwgbm93KTsKKwkJCWlmIChtYXRjaF9zaGEobGVuLCBtYXRjaCwgbm93KSkgeworCQkJCWlmIChudGhfcGFja2VkX29iamVjdF9zaGExKHAsIGZpcnN0KzEsIG5leHQpIHx8CisJCQkJICAgICFtYXRjaF9zaGEobGVuLCBtYXRjaCwgbmV4dCkpIHsKKwkJCQkJLyogdW5pcXVlIHdpdGhpbiB0aGlzIHBhY2sgKi8KKwkJCQkJaWYgKCFmb3VuZCkgeworCQkJCQkJbWVtY3B5KGZvdW5kX3NoYTEsIG5vdywgMjApOworCQkJCQkJZm91bmQrKzsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChtZW1jbXAoZm91bmRfc2hhMSwgbm93LCAyMCkpIHsKKwkJCQkJCWZvdW5kID0gMjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvKiBub3QgZXZlbiB1bmlxdWUgd2l0aGluIHRoaXMgcGFjayAqLworCQkJCQlmb3VuZCA9IDI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoZm91bmQgPT0gMSkKKwkJbWVtY3B5KHNoYTEsIGZvdW5kX3NoYTEsIDIwKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKKyNkZWZpbmUgU0hPUlRfTkFNRV9OT1RfRk9VTkQgKC0xKQorI2RlZmluZSBTSE9SVF9OQU1FX0FNQklHVU9VUyAoLTIpCisKK3N0YXRpYyBpbnQgZmluZF91bmlxdWVfc2hvcnRfb2JqZWN0KGludCBsZW4sIGNoYXIgKmNhbm9uaWNhbCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciAqcmVzLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBoYXNfdW5wYWNrZWQsIGhhc19wYWNrZWQ7CisJdW5zaWduZWQgY2hhciB1bnBhY2tlZF9zaGExWzIwXSwgcGFja2VkX3NoYTFbMjBdOworCisJaGFzX3VucGFja2VkID0gZmluZF9zaG9ydF9vYmplY3RfZmlsZW5hbWUobGVuLCBjYW5vbmljYWwsIHVucGFja2VkX3NoYTEpOworCWhhc19wYWNrZWQgPSBmaW5kX3Nob3J0X3BhY2tlZF9vYmplY3QobGVuLCByZXMsIHBhY2tlZF9zaGExKTsKKwlpZiAoIWhhc191bnBhY2tlZCAmJiAhaGFzX3BhY2tlZCkKKwkJcmV0dXJuIFNIT1JUX05BTUVfTk9UX0ZPVU5EOworCWlmICgxIDwgaGFzX3VucGFja2VkIHx8IDEgPCBoYXNfcGFja2VkKQorCQlyZXR1cm4gU0hPUlRfTkFNRV9BTUJJR1VPVVM7CisJaWYgKGhhc191bnBhY2tlZCAhPSBoYXNfcGFja2VkKSB7CisJCW1lbWNweShzaGExLCAoaGFzX3BhY2tlZCA/IHBhY2tlZF9zaGExIDogdW5wYWNrZWRfc2hhMSksIDIwKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIEJvdGggaGF2ZSB1bmlxdWUgb25lcyAtLSBkbyB0aGV5IG1hdGNoPyAqLworCWlmIChtZW1jbXAocGFja2VkX3NoYTEsIHVucGFja2VkX3NoYTEsIDIwKSkKKwkJcmV0dXJuIFNIT1JUX05BTUVfQU1CSUdVT1VTOworCW1lbWNweShzaGExLCBwYWNrZWRfc2hhMSwgMjApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9zaG9ydF9zaGExKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgIGludCBxdWlldGx5KQoreworCWludCBpLCBzdGF0dXM7CisJY2hhciBjYW5vbmljYWxbNDBdOworCXVuc2lnbmVkIGNoYXIgcmVzWzIwXTsKKworCWlmIChsZW4gPCBNSU5JTVVNX0FCQlJFVikKKwkJcmV0dXJuIC0xOworCW1lbXNldChyZXMsIDAsIDIwKTsKKwltZW1zZXQoY2Fub25pY2FsLCAneCcsIDQwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuIDtpKyspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gbmFtZVtpXTsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCXZhbCA9IGMgLSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQkJdmFsID0gYyAtICdhJyArIDEwOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9J0YnKSB7CisJCQl2YWwgPSBjIC0gJ0EnICsgMTA7CisJCQljIC09ICdBJyAtICdhJzsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLTE7CisJCWNhbm9uaWNhbFtpXSA9IGM7CisJCWlmICghKGkgJiAxKSkKKwkJCXZhbCA8PD0gNDsKKwkJcmVzW2kgPj4gMV0gfD0gdmFsOworCX0KKworCXN0YXR1cyA9IGZpbmRfdW5pcXVlX3Nob3J0X29iamVjdChpLCBjYW5vbmljYWwsIHJlcywgc2hhMSk7CisJaWYgKCFxdWlldGx5ICYmIChzdGF0dXMgPT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpKQorCQlyZXR1cm4gZXJyb3IoInNob3J0IFNIQTEgJS4qcyBpcyBhbWJpZ3VvdXMuIiwgbGVuLCBjYW5vbmljYWwpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2NvbnN0IGNoYXIgKmZpbmRfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgbGVuKQoreworCWludCBzdGF0dXMsIGlzX251bGw7CisJc3RhdGljIGNoYXIgaGV4WzQxXTsKKworCWlzX251bGwgPSAhbWVtY21wKHNoYTEsIG51bGxfc2hhMSwgMjApOworCW1lbWNweShoZXgsIHNoYTFfdG9faGV4KHNoYTEpLCA0MCk7CisJaWYgKGxlbiA9PSA0MCkKKwkJcmV0dXJuIGhleDsKKwl3aGlsZSAobGVuIDwgNDApIHsKKwkJdW5zaWduZWQgY2hhciBzaGExX3JldFsyMF07CisJCXN0YXR1cyA9IGdldF9zaG9ydF9zaGExKGhleCwgbGVuLCBzaGExX3JldCwgMSk7CisJCWlmICghc3RhdHVzIHx8CisJCSAgICAoaXNfbnVsbCAmJiBzdGF0dXMgIT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpKSB7CisJCQloZXhbbGVuXSA9IDA7CisJCQlyZXR1cm4gaGV4OworCQl9CisJCWlmIChzdGF0dXMgIT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGFtYmlndW91c19wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGludCBsZW4pCit7CisJaW50IHNsYXNoID0gMTsKKwlpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBsZW47IGNudCsrKSB7CisJCXN3aXRjaCAoKnBhdGgrKykgeworCQljYXNlICdcMCc6CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCQlpZiAoc2xhc2gpCisJCQkJYnJlYWs7CisJCQlzbGFzaCA9IDE7CisJCQljb250aW51ZTsKKwkJY2FzZSAnLic6CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCXNsYXNoID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2xhc2g7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfYmFzaWMoY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpmbXRbXSA9IHsKKwkJIiUuKnMiLAorCQkicmVmcy8lLipzIiwKKwkJInJlZnMvdGFncy8lLipzIiwKKwkJInJlZnMvaGVhZHMvJS4qcyIsCisJCSJyZWZzL3JlbW90ZXMvJS4qcyIsCisJCSJyZWZzL3JlbW90ZXMvJS4qcy9IRUFEIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKndhcm5pbmcgPSAid2FybmluZzogcmVmbmFtZSAnJS4qcycgaXMgYW1iaWd1b3VzLlxuIjsKKwljb25zdCBjaGFyICoqcCwgKnBhdGhuYW1lOworCWNoYXIgKnJlYWxfcGF0aCA9IE5VTEw7CisJaW50IHJlZnNfZm91bmQgPSAwLCBhbTsKKwl1bnNpZ25lZCBsb25nIGF0X3RpbWUgPSAodW5zaWduZWQgbG9uZyktMTsKKwl1bnNpZ25lZCBjaGFyICp0aGlzX3Jlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFfZnJvbV9yZWZbMjBdOworCisJaWYgKGxlbiA9PSA0MCAmJiAhZ2V0X3NoYTFfaGV4KHN0ciwgc2hhMSkpCisJCXJldHVybiAwOworCisJLyogQXQgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZT8gIkB7MiBob3VycyBhZ299IiAqLworCWZvciAoYW0gPSAxOyBhbSA8IGxlbiAtIDE7IGFtKyspIHsKKwkJaWYgKHN0clthbV0gPT0gJ0AnICYmIHN0clthbSsxXSA9PSAneycgJiYgc3RyW2xlbi0xXSA9PSAnfScpIHsKKwkJCWludCBkYXRlX2xlbiA9IGxlbiAtIGFtIC0gMzsKKwkJCWNoYXIgKmRhdGVfc3BlYyA9IHhtYWxsb2MoZGF0ZV9sZW4gKyAxKTsKKwkJCXN0cm5jcHkoZGF0ZV9zcGVjLCBzdHIgKyBhbSArIDIsIGRhdGVfbGVuKTsKKwkJCWRhdGVfc3BlY1tkYXRlX2xlbl0gPSAwOworCQkJYXRfdGltZSA9IGFwcHJveGlkYXRlKGRhdGVfc3BlYyk7CisJCQlmcmVlKGRhdGVfc3BlYyk7CisJCQlsZW4gPSBhbTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQWNjZXB0IG9ubHkgdW5hbWJpZ3VvdXMgcmVmIHBhdGhzLiAqLworCWlmIChhbWJpZ3VvdXNfcGF0aChzdHIsIGxlbikpCisJCXJldHVybiAtMTsKKworCWZvciAocCA9IGZtdDsgKnA7IHArKykgeworCQl0aGlzX3Jlc3VsdCA9IHJlZnNfZm91bmQgPyBzaGExX2Zyb21fcmVmIDogc2hhMTsKKwkJcGF0aG5hbWUgPSByZXNvbHZlX3JlZihnaXRfcGF0aCgqcCwgbGVuLCBzdHIpLCB0aGlzX3Jlc3VsdCwgMSk7CisJCWlmIChwYXRobmFtZSkgeworCQkJaWYgKCFyZWZzX2ZvdW5kKyspCisJCQkJcmVhbF9wYXRoID0gc3RyZHVwKHBhdGhuYW1lKTsKKwkJCWlmICghd2Fybl9hbWJpZ3VvdXNfcmVmcykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcmVmc19mb3VuZCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHdhcm5fYW1iaWd1b3VzX3JlZnMgJiYgcmVmc19mb3VuZCA+IDEpCisJCWZwcmludGYoc3RkZXJyLCB3YXJuaW5nLCBsZW4sIHN0cik7CisKKwlpZiAoYXRfdGltZSAhPSAodW5zaWduZWQgbG9uZyktMSkgeworCQlyZWFkX3JlZl9hdCgKKwkJCXJlYWxfcGF0aCArIHN0cmxlbihnaXRfcGF0aCgiLiIpKSAtIDEsCisJCQlhdF90aW1lLAorCQkJc2hhMSk7CisJfQorCisJZnJlZShyZWFsX3BhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9zaGExXzEoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK3N0YXRpYyBpbnQgZ2V0X3BhcmVudChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIGludCBpZHgpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcmV0ID0gZ2V0X3NoYTFfMShuYW1lLCBsZW4sIHNoYTEpOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCWlmICghY29tbWl0KQorCQlyZXR1cm4gLTE7CisJaWYgKHBhcnNlX2NvbW1pdChjb21taXQpKQorCQlyZXR1cm4gLTE7CisJaWYgKCFpZHgpIHsKKwkJbWVtY3B5KHJlc3VsdCwgY29tbWl0LT5vYmplY3Quc2hhMSwgMjApOworCQlyZXR1cm4gMDsKKwl9CisJcCA9IGNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAocCkgeworCQlpZiAoIS0taWR4KSB7CisJCQltZW1jcHkocmVzdWx0LCBwLT5pdGVtLT5vYmplY3Quc2hhMSwgMjApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcCA9IHAtPm5leHQ7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBnZXRfbnRoX2FuY2VzdG9yKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCQkgICAgdW5zaWduZWQgY2hhciAqcmVzdWx0LCBpbnQgZ2VuZXJhdGlvbikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCByZXQgPSBnZXRfc2hhMV8xKG5hbWUsIGxlbiwgc2hhMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXdoaWxlIChnZW5lcmF0aW9uLS0pIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisKKwkJaWYgKCFjb21taXQgfHwgcGFyc2VfY29tbWl0KGNvbW1pdCkgfHwgIWNvbW1pdC0+cGFyZW50cykKKwkJCXJldHVybiAtMTsKKwkJbWVtY3B5KHNoYTEsIGNvbW1pdC0+cGFyZW50cy0+aXRlbS0+b2JqZWN0LnNoYTEsIDIwKTsKKwl9CisJbWVtY3B5KHJlc3VsdCwgc2hhMSwgMjApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlZWxfb25pb24oY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCBjaGFyIG91dGVyWzIwXTsKKwljb25zdCBjaGFyICpzcDsKKwljb25zdCBjaGFyICp0eXBlX3N0cmluZyA9IE5VTEw7CisJc3RydWN0IG9iamVjdCAqbzsKKworCS8qCisJICogInJlZl57dHlwZX0iIGRlcmVmZXJlbmNlcyByZWYgcmVwZWF0ZWRseSB1bnRpbCB5b3UgY2Fubm90CisJICogZGVyZWZlcmVuY2UgYW55bW9yZSwgb3IgeW91IGdldCBhbiBvYmplY3Qgb2YgZ2l2ZW4gdHlwZSwKKwkgKiB3aGljaGV2ZXIgY29tZXMgZmlyc3QuICAicmVmXnt9IiBtZWFucyBqdXN0IGRlcmVmZXJlbmNlCisJICogdGFncyB1bnRpbCB5b3UgZ2V0IGEgbm9uLXRhZy4gICJyZWZeMCIgaXMgYSBzaG9ydGhhbmQgZm9yCisJICogInJlZl57Y29tbWl0fSIuICAiY29tbWl0Xnt0cmVlfSIgY291bGQgYmUgdXNlZCB0byBmaW5kIHRoZQorCSAqIHRvcC1sZXZlbCB0cmVlIG9mIHRoZSBnaXZlbiBjb21taXQuCisJICovCisJaWYgKGxlbiA8IDQgfHwgbmFtZVtsZW4tMV0gIT0gJ30nKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKHNwID0gbmFtZSArIGxlbiAtIDE7IG5hbWUgPD0gc3A7IHNwLS0pIHsKKwkJaW50IGNoID0gKnNwOworCQlpZiAoY2ggPT0gJ3snICYmIG5hbWUgPCBzcCAmJiBzcFstMV0gPT0gJ14nKQorCQkJYnJlYWs7CisJfQorCWlmIChzcCA8PSBuYW1lKQorCQlyZXR1cm4gLTE7CisKKwlzcCsrOyAvKiBiZWdpbm5pbmcgb2YgdHlwZSBuYW1lLCBvciBjbG9zaW5nIGJyYWNlIGZvciBlbXB0eSAqLworCWlmICghc3RybmNtcChjb21taXRfdHlwZSwgc3AsIDYpICYmIHNwWzZdID09ICd9JykKKwkJdHlwZV9zdHJpbmcgPSBjb21taXRfdHlwZTsKKwllbHNlIGlmICghc3RybmNtcCh0cmVlX3R5cGUsIHNwLCA0KSAmJiBzcFs0XSA9PSAnfScpCisJCXR5cGVfc3RyaW5nID0gdHJlZV90eXBlOworCWVsc2UgaWYgKCFzdHJuY21wKGJsb2JfdHlwZSwgc3AsIDQpICYmIHNwWzRdID09ICd9JykKKwkJdHlwZV9zdHJpbmcgPSBibG9iX3R5cGU7CisJZWxzZSBpZiAoc3BbMF0gPT0gJ30nKQorCQl0eXBlX3N0cmluZyA9IE5VTEw7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZ2V0X3NoYTFfMShuYW1lLCBzcCAtIG5hbWUgLSAyLCBvdXRlcikpCisJCXJldHVybiAtMTsKKworCW8gPSBwYXJzZV9vYmplY3Qob3V0ZXIpOworCWlmICghbykKKwkJcmV0dXJuIC0xOworCWlmICghdHlwZV9zdHJpbmcpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCBuYW1lLCBzcCAtIG5hbWUgLSAyKTsKKwkJaWYgKCFvIHx8ICghby0+cGFyc2VkICYmICFwYXJzZV9vYmplY3Qoby0+c2hhMSkpKQorCQkJcmV0dXJuIC0xOworCQltZW1jcHkoc2hhMSwgby0+c2hhMSwgMjApOworCX0KKwllbHNlIHsKKwkJLyogQXQgdGhpcyBwb2ludCwgdGhlIHN5bnRheCBsb29rIGNvcnJlY3QsIHNvCisJCSAqIGlmIHdlIGRvIG5vdCBnZXQgdGhlIG5lZWRlZCBvYmplY3QsIHdlIHNob3VsZAorCQkgKiBiYXJmLgorCQkgKi8KKworCQl3aGlsZSAoMSkgeworCQkJaWYgKCFvIHx8ICghby0+cGFyc2VkICYmICFwYXJzZV9vYmplY3Qoby0+c2hhMSkpKQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChvLT50eXBlID09IHR5cGVfc3RyaW5nKSB7CisJCQkJbWVtY3B5KHNoYTEsIG8tPnNoYTEsIDIwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChvLT50eXBlID09IHRhZ190eXBlKQorCQkJCW8gPSAoKHN0cnVjdCB0YWcqKSBvKS0+dGFnZ2VkOworCQkJZWxzZSBpZiAoby0+dHlwZSA9PSBjb21taXRfdHlwZSkKKwkJCQlvID0gJigoKHN0cnVjdCBjb21taXQgKikgbyktPnRyZWUtPm9iamVjdCk7CisJCQllbHNlCisJCQkJcmV0dXJuIGVycm9yKCIlLipzOiBleHBlY3RlZCAlcyB0eXBlLCBidXQgdGhlIG9iamVjdCBkZXJlZmVyZW5jZXMgdG8gJXMgdHlwZSIsCisJCQkJCSAgICAgbGVuLCBuYW1lLCB0eXBlX3N0cmluZywKKwkJCQkJICAgICBvLT50eXBlKTsKKwkJCWlmICghby0+cGFyc2VkKQorCQkJCXBhcnNlX29iamVjdChvLT5zaGExKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfc2hhMV8xKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IHJldCwgaGFzX3N1ZmZpeDsKKwljb25zdCBjaGFyICpjcDsKKworCS8qICJuYW1lfjMiIGlzICJuYW1lXl5eIiwKKwkgKiAibmFtZX4iIGFuZCAibmFtZX4wIiBhcmUgbmFtZSAtLSBub3QgIm5hbWVeMCIhCisJICogIm5hbWVeIiBpcyBub3QgIm5hbWVeMCI7IGl0IGlzICJuYW1lXjEiLgorCSAqLworCWhhc19zdWZmaXggPSAwOworCWZvciAoY3AgPSBuYW1lICsgbGVuIC0gMTsgbmFtZSA8PSBjcDsgY3AtLSkgeworCQlpbnQgY2ggPSAqY3A7CisJCWlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQorCQkJY29udGludWU7CisJCWlmIChjaCA9PSAnficgfHwgY2ggPT0gJ14nKQorCQkJaGFzX3N1ZmZpeCA9IGNoOworCQlicmVhazsKKwl9CisKKwlpZiAoaGFzX3N1ZmZpeCkgeworCQlpbnQgbnVtID0gMDsKKwkJaW50IGxlbjEgPSBjcCAtIG5hbWU7CisJCWNwKys7CisJCXdoaWxlIChjcCA8IG5hbWUgKyBsZW4pCisJCQludW0gPSBudW0gKiAxMCArICpjcCsrIC0gJzAnOworCQlpZiAoaGFzX3N1ZmZpeCA9PSAnXicpIHsKKwkJCWlmICghbnVtICYmIGxlbjEgPT0gbGVuIC0gMSkKKwkJCQludW0gPSAxOworCQkJcmV0dXJuIGdldF9wYXJlbnQobmFtZSwgbGVuMSwgc2hhMSwgbnVtKTsKKwkJfQorCQkvKiBlbHNlIGlmIChoYXNfc3VmZml4ID09ICd+JykgLS0gZ29lcyB3aXRob3V0IHNheWluZyAqLworCQlyZXR1cm4gZ2V0X250aF9hbmNlc3RvcihuYW1lLCBsZW4xLCBzaGExLCBudW0pOworCX0KKworCXJldCA9IHBlZWxfb25pb24obmFtZSwgbGVuLCBzaGExKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBnZXRfc2hhMV9iYXNpYyhuYW1lLCBsZW4sIHNoYTEpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZ2V0X3Nob3J0X3NoYTEobmFtZSwgbGVuLCBzaGExLCAwKTsKK30KKworLyoKKyAqIFRoaXMgaXMgbGlrZSAiZ2V0X3NoYTFfYmFzaWMoKSIsIGV4Y2VwdCBpdCBhbGxvd3MgInNoYTEgZXhwcmVzc2lvbnMiLAorICogbm90YWJseSAieHl6XiIgZm9yICJwYXJlbnQgb2YgeHl6IgorICovCitpbnQgZ2V0X3NoYTEoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0LCBicmFja2V0X2RlcHRoOworCXVuc2lnbmVkIHVudXNlZDsKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwljb25zdCBjaGFyICpjcDsKKworCXByZXBhcmVfYWx0X29kYigpOworCXJldCA9IGdldF9zaGExXzEobmFtZSwgbmFtZWxlbiwgc2hhMSk7CisJaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisJLyogc2hhMTpwYXRoIC0tPiBvYmplY3QgbmFtZSBvZiBwYXRoIGluIGVudCBzaGExCisJICogOnBhdGggLT4gb2JqZWN0IG5hbWUgb2YgcGF0aCBpbiBpbmRleAorCSAqIDpbMC0zXTpwYXRoIC0+IG9iamVjdCBuYW1lIG9mIHBhdGggaW4gaW5kZXggYXQgc3RhZ2UKKwkgKi8KKwlpZiAobmFtZVswXSA9PSAnOicpIHsKKwkJaW50IHN0YWdlID0gMDsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwkJaW50IHBvczsKKwkJaWYgKG5hbWVsZW4gPCAzIHx8CisJCSAgICBuYW1lWzJdICE9ICc6JyB8fAorCQkgICAgbmFtZVsxXSA8ICcwJyB8fCAnMycgPCBuYW1lWzFdKQorCQkJY3AgPSBuYW1lICsgMTsKKwkJZWxzZSB7CisJCQlzdGFnZSA9IG5hbWVbMV0gLSAnMCc7CisJCQljcCA9IG5hbWUgKyAzOworCQl9CisJCW5hbWVsZW4gPSBuYW1lbGVuIC0gKGNwIC0gbmFtZSk7CisJCWlmICghYWN0aXZlX2NhY2hlKQorCQkJcmVhZF9jYWNoZSgpOworCQlpZiAoYWN0aXZlX25yIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJcG9zID0gY2FjaGVfbmFtZV9wb3MoY3AsIG5hbWVsZW4pOworCQlpZiAocG9zIDwgMCkKKwkJCXBvcyA9IC1wb3MgLSAxOworCQl3aGlsZSAocG9zIDwgYWN0aXZlX25yKSB7CisJCQljZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQkJaWYgKGNlX25hbWVsZW4oY2UpICE9IG5hbWVsZW4gfHwKKwkJCSAgICBtZW1jbXAoY2UtPm5hbWUsIGNwLCBuYW1lbGVuKSkKKwkJCQlicmVhazsKKwkJCWlmIChjZV9zdGFnZShjZSkgPT0gc3RhZ2UpIHsKKwkJCQltZW1jcHkoc2hhMSwgY2UtPnNoYTEsIDIwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXBvcysrOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChjcCA9IG5hbWUsIGJyYWNrZXRfZGVwdGggPSAwOyAqY3A7IGNwKyspIHsKKwkJaWYgKCpjcCA9PSAneycpCisJCQlicmFja2V0X2RlcHRoKys7CisJCWVsc2UgaWYgKGJyYWNrZXRfZGVwdGggJiYgKmNwID09ICd9JykKKwkJCWJyYWNrZXRfZGVwdGgtLTsKKwkJZWxzZSBpZiAoIWJyYWNrZXRfZGVwdGggJiYgKmNwID09ICc6JykKKwkJCWJyZWFrOworCX0KKwlpZiAoKmNwID09ICc6JykgeworCQl1bnNpZ25lZCBjaGFyIHRyZWVfc2hhMVsyMF07CisJCWlmICghZ2V0X3NoYTFfMShuYW1lLCBjcC1uYW1lLCB0cmVlX3NoYTEpKQorCQkJcmV0dXJuIGdldF90cmVlX2VudHJ5KHRyZWVfc2hhMSwgY3ArMSwgc2hhMSwKKwkJCQkJICAgICAgJnVudXNlZCk7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zaGVsbC5jIGIvc2hlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA4Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwuYwpAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK3N0YXRpYyBpbnQgZG9fZ2VuZXJpY19jbWQoY29uc3QgY2hhciAqbWUsIGNoYXIgKmFyZykKK3sKKwljb25zdCBjaGFyICpteV9hcmd2WzRdOworCisJaWYgKCFhcmcgfHwgIShhcmcgPSBzcV9kZXF1b3RlKGFyZykpKQorCQlkaWUoImJhZCBhcmd1bWVudCIpOworCWlmIChzdHJuY21wKG1lLCAiZ2l0LSIsIDQpKQorCQlkaWUoImJhZCBjb21tYW5kIik7CisKKwlteV9hcmd2WzBdID0gbWUgKyA0OworCW15X2FyZ3ZbMV0gPSBhcmc7CisJbXlfYXJndlsyXSA9IE5VTEw7CisKKwlyZXR1cm4gZXhlY3ZfZ2l0X2NtZChteV9hcmd2KTsKK30KKworc3RhdGljIHN0cnVjdCBjb21tYW5kcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpleGVjKShjb25zdCBjaGFyICptZSwgY2hhciAqYXJnKTsKK30gY21kX2xpc3RbXSA9IHsKKwl7ICJnaXQtcmVjZWl2ZS1wYWNrIiwgZG9fZ2VuZXJpY19jbWQgfSwKKwl7ICJnaXQtdXBsb2FkLXBhY2siLCBkb19nZW5lcmljX2NtZCB9LAorCXsgTlVMTCB9LAorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnByb2c7CisJc3RydWN0IGNvbW1hbmRzICpjbWQ7CisKKwkvKiBXZSB3YW50IHRvIHNlZSAiLWMgY21kIGFyZ3MiLCBhbmQgbm90aGluZyBlbHNlICovCisJaWYgKGFyZ2MgIT0gMyB8fCBzdHJjbXAoYXJndlsxXSwgIi1jIikpCisJCWRpZSgiV2hhdCBkbyB5b3UgdGhpbmsgSSBhbT8gQSBzaGVsbD8iKTsKKworCXByb2cgPSBhcmd2WzJdOworCWFyZ3YgKz0gMjsKKwlhcmdjIC09IDI7CisJZm9yIChjbWQgPSBjbWRfbGlzdCA7IGNtZC0+bmFtZSA7IGNtZCsrKSB7CisJCWludCBsZW4gPSBzdHJsZW4oY21kLT5uYW1lKTsKKwkJY2hhciAqYXJnOworCQlpZiAoc3RybmNtcChjbWQtPm5hbWUsIHByb2csIGxlbikpCisJCQljb250aW51ZTsKKwkJYXJnID0gTlVMTDsKKwkJc3dpdGNoIChwcm9nW2xlbl0pIHsKKwkJY2FzZSAnXDAnOgorCQkJYXJnID0gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlICcgJzoKKwkJCWFyZyA9IHByb2cgKyBsZW4gKyAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCQlleGl0KGNtZC0+ZXhlYyhjbWQtPm5hbWUsIGFyZykpOworCX0KKwlkaWUoInVucmVjb2duaXplZCBjb21tYW5kICclcyciLCBwcm9nKTsKK30KZGlmZiAtLWdpdCBhL3Nob3ctaW5kZXguYyBiL3Nob3ctaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjFkNjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2hvdy1pbmRleC5jCkBAIC0wLDAgKzEsMjggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJdW5zaWduZWQgbnI7CisJdW5zaWduZWQgaW50IGVudHJ5WzZdOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdG9wX2luZGV4WzI1Nl07CisKKwlpZiAoZnJlYWQodG9wX2luZGV4LCBzaXplb2YodG9wX2luZGV4KSwgMSwgc3RkaW4pICE9IDEpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgaWRleCIpOworCW5yID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJdW5zaWduZWQgbiA9IG50b2hsKHRvcF9pbmRleFtpXSk7CisJCWlmIChuIDwgbnIpCisJCQlkaWUoImNvcnJ1cHQgaW5kZXggZmlsZSIpOworCQluciA9IG47CisJfQorCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCXVuc2lnbmVkIG9mZnNldDsKKworCQlpZiAoZnJlYWQoZW50cnksIDI0LCAxLCBzdGRpbikgIT0gMSkKKwkJCWRpZSgidW5hYmxlIHRvIHJlYWQgZW50cnkgJXUvJXUiLCBpLCBucik7CisJCW9mZnNldCA9IG50b2hsKGVudHJ5WzBdKTsKKwkJcHJpbnRmKCIldSAlc1xuIiwgb2Zmc2V0LCBzaGExX3RvX2hleCgodm9pZCAqKShlbnRyeSsxKSkpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NzaC1mZXRjaC5jIGIvc3NoLWZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwNjdiOAotLS0gL2Rldi9udWxsCisrKyBiL3NzaC1mZXRjaC5jCkBAIC0wLDAgKzEsMTc0IEBACisjaWZuZGVmIENPVU5URVJQQVJUX0VOVl9OQU1FCisjZGVmaW5lIENPVU5URVJQQVJUX0VOVl9OQU1FICJHSVRfU1NIX1VQTE9BRCIKKyNlbmRpZgorI2lmbmRlZiBDT1VOVEVSUEFSVF9QUk9HUkFNX05BTUUKKyNkZWZpbmUgQ09VTlRFUlBBUlRfUFJPR1JBTV9OQU1FICJnaXQtc3NoLXVwbG9hZCIKKyNlbmRpZgorI2lmbmRlZiBNWV9QUk9HUkFNX05BTUUKKyNkZWZpbmUgTVlfUFJPR1JBTV9OQU1FICJnaXQtc3NoLWZldGNoIgorI2VuZGlmCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJzaC5oIgorI2luY2x1ZGUgImZldGNoLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCitzdGF0aWMgaW50IGZkX2luOworc3RhdGljIGludCBmZF9vdXQ7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlbW90ZV92ZXJzaW9uID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworCitzdGF0aWMgc3NpemVfdCBmb3JjZV93cml0ZShpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzc2l6ZV90IHJldCA9IDA7CisJd2hpbGUgKHJldCA8IGxlbmd0aCkgeworCQlzc2l6ZV90IHNpemUgPSB3cml0ZShmZCwgYnVmZmVyICsgcmV0LCBsZW5ndGggLSByZXQpOworCQlpZiAoc2l6ZSA8IDApIHsKKwkJCXJldHVybiBzaXplOworCQl9CisJCWlmIChzaXplID09IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ICs9IHNpemU7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJlZmV0Y2hlcyA9IDA7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmluX3RyYW5zaXQgPSBOVUxMOworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKmVuZF9vZl90cmFuc2l0ID0gJmluX3RyYW5zaXQ7CisKK3ZvaWQgcHJlZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyIHR5cGUgPSAnbyc7CisJc3RydWN0IG9iamVjdF9saXN0ICpub2RlOworCWlmIChwcmVmZXRjaGVzID4gMTAwKSB7CisJCWZldGNoKGluX3RyYW5zaXQtPml0ZW0tPnNoYTEpOworCX0KKwlub2RlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9saXN0KSk7CisJbm9kZS0+bmV4dCA9IE5VTEw7CisJbm9kZS0+aXRlbSA9IGxvb2t1cF91bmtub3duX29iamVjdChzaGExKTsKKwkqZW5kX29mX3RyYW5zaXQgPSBub2RlOworCWVuZF9vZl90cmFuc2l0ID0gJm5vZGUtPm5leHQ7CisJZm9yY2Vfd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CisJZm9yY2Vfd3JpdGUoZmRfb3V0LCBzaGExLCAyMCk7CisJcHJlZmV0Y2hlcysrOworfQorCitzdGF0aWMgY2hhciBjb25uX2J1Zls0MDk2XTsKK3N0YXRpYyBzaXplX3QgY29ubl9idWZfcG9zbiA9IDA7CisKK2ludCBmZXRjaCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCByZXQ7CisJc2lnbmVkIGNoYXIgcmVtb3RlOworCXN0cnVjdCBvYmplY3RfbGlzdCAqdGVtcDsKKworCWlmIChtZW1jbXAoc2hhMSwgaW5fdHJhbnNpdC0+aXRlbS0+c2hhMSwgMjApKSB7CisJCS8vIHdlIG11c3QgaGF2ZSBhbHJlYWR5IGZldGNoZWQgaXQgdG8gY2xlYW4gdGhlIHF1ZXVlCisJCXJldHVybiBoYXNfc2hhMV9maWxlKHNoYTEpID8gMCA6IC0xOworCX0KKwlwcmVmZXRjaGVzLS07CisJdGVtcCA9IGluX3RyYW5zaXQ7CisJaW5fdHJhbnNpdCA9IGluX3RyYW5zaXQtPm5leHQ7CisJaWYgKCFpbl90cmFuc2l0KQorCQllbmRfb2ZfdHJhbnNpdCA9ICZpbl90cmFuc2l0OworCWZyZWUodGVtcCk7CisKKwlpZiAoY29ubl9idWZfcG9zbikgeworCQlyZW1vdGUgPSBjb25uX2J1ZlswXTsKKwkJbWVtbW92ZShjb25uX2J1ZiwgY29ubl9idWYgKyAxLCAtLWNvbm5fYnVmX3Bvc24pOworCX0gZWxzZSB7CisJCWlmIChyZWFkKGZkX2luLCAmcmVtb3RlLCAxKSA8IDEpCisJCQlyZXR1cm4gLTE7CisJfQorCS8vZnByaW50ZihzdGRlcnIsICJHb3QgJWRcbiIsIHJlbW90ZSk7CisJaWYgKHJlbW90ZSA8IDApCisJCXJldHVybiByZW1vdGU7CisJcmV0ID0gd3JpdGVfc2hhMV9mcm9tX2ZkKHNoYTEsIGZkX2luLCBjb25uX2J1ZiwgNDA5NiwgJmNvbm5fYnVmX3Bvc24pOworCWlmICghcmV0KQorCQlwdWxsX3NheSgiZ290ICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfdmVyc2lvbih2b2lkKQoreworCWNoYXIgdHlwZSA9ICd2JzsKKwl3cml0ZShmZF9vdXQsICZ0eXBlLCAxKTsKKwl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKwlpZiAocmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpIHsKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCByZWFkIHZlcnNpb24gZnJvbSByZW1vdGUgZW5kIik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZmV0Y2hfcmVmKGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzaWduZWQgY2hhciByZW1vdGU7CisJY2hhciB0eXBlID0gJ3InOworCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworCXdyaXRlKGZkX291dCwgcmVmLCBzdHJsZW4ocmVmKSArIDEpOworCXJlYWQoZmRfaW4sICZyZW1vdGUsIDEpOworCWlmIChyZW1vdGUgPCAwKQorCQlyZXR1cm4gcmVtb3RlOworCXJlYWQoZmRfaW4sIHNoYTEsIDIwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgc3NoX2ZldGNoX3VzYWdlW10gPQorICBNWV9QUk9HUkFNX05BTUUKKyAgIiBbLWNdIFstdF0gWy1hXSBbLXZdIFstZF0gWy0tcmVjb3Zlcl0gWy13IHJlZl0gY29tbWl0LWlkIHVybCI7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqY29tbWl0X2lkOworCWNoYXIgKnVybDsKKwlpbnQgYXJnID0gMTsKKwljb25zdCBjaGFyICpwcm9nOworCisJcHJvZyA9IGdldGVudigiR0lUX1NTSF9QVVNIIik7CisJaWYgKCFwcm9nKSBwcm9nID0gImdpdC1zc2gtdXBsb2FkIjsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CisJCQlnZXRfdHJlZSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKwkJCWdldF9hbGwgPSAxOworCQkJZ2V0X3RyZWUgPSAxOworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndicpIHsKKwkJCWdldF92ZXJib3NlbHkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndycpIHsKKwkJCXdyaXRlX3JlZiA9IGFyZ3ZbYXJnICsgMV07CisJCQlhcmcrKzsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbYXJnXSwgIi0tcmVjb3ZlciIpKSB7CisJCQlnZXRfcmVjb3ZlciA9IDE7CisJCX0KKwkJYXJnKys7CisJfQorCWlmIChhcmdjIDwgYXJnICsgMikgeworCQl1c2FnZShzc2hfZmV0Y2hfdXNhZ2UpOworCQlyZXR1cm4gMTsKKwl9CisJY29tbWl0X2lkID0gYXJndlthcmddOworCXVybCA9IGFyZ3ZbYXJnICsgMV07CisJd3JpdGVfcmVmX2xvZ19kZXRhaWxzID0gdXJsOworCisJaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCBwcm9nLCB1cmwsIGFyZywgYXJndiArIDEpKQorCQlyZXR1cm4gMTsKKworCWlmIChnZXRfdmVyc2lvbigpKQorCQlyZXR1cm4gMTsKKworCWlmIChwdWxsKGNvbW1pdF9pZCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zc2gtcHVsbC5jIGIvc3NoLXB1bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjhjZTRkCi0tLSAvZGV2L251bGwKKysrIGIvc3NoLXB1bGwuYwpAQCAtMCwwICsxLDQgQEAKKyNkZWZpbmUgQ09VTlRFUlBBUlRfRU5WX05BTUUgIkdJVF9TU0hfUFVTSCIKKyNkZWZpbmUgQ09VTlRFUlBBUlRfUFJPR1JBTV9OQU1FICJnaXQtc3NoLXB1c2giCisjZGVmaW5lIE1ZX1BST0dSQU1fTkFNRSAiZ2l0LXNzaC1wdWxsIgorI2luY2x1ZGUgInNzaC1mZXRjaC5jIgpkaWZmIC0tZ2l0IGEvc3NoLXB1c2guYyBiL3NzaC1wdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MmRmMQotLS0gL2Rldi9udWxsCisrKyBiL3NzaC1wdXNoLmMKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIENPVU5URVJQQVJUX0VOVl9OQU1FICJHSVRfU1NIX1BVTEwiCisjZGVmaW5lIENPVU5URVJQQVJUX1BST0dSQU1fTkFNRSAiZ2l0LXNzaC1wdWxsIgorI2RlZmluZSBNWV9QUk9HUkFNX05BTUUgImdpdC1zc2gtcHVzaCIKKyNpbmNsdWRlICJzc2gtdXBsb2FkLmMiCmRpZmYgLS1naXQgYS9zc2gtdXBsb2FkLmMgYi9zc2gtdXBsb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhNjY2MQotLS0gL2Rldi9udWxsCisrKyBiL3NzaC11cGxvYWQuYwpAQCAtMCwwICsxLDE0NiBAQAorI2lmbmRlZiBDT1VOVEVSUEFSVF9FTlZfTkFNRQorI2RlZmluZSBDT1VOVEVSUEFSVF9FTlZfTkFNRSAiR0lUX1NTSF9GRVRDSCIKKyNlbmRpZgorI2lmbmRlZiBDT1VOVEVSUEFSVF9QUk9HUkFNX05BTUUKKyNkZWZpbmUgQ09VTlRFUlBBUlRfUFJPR1JBTV9OQU1FICJnaXQtc3NoLWZldGNoIgorI2VuZGlmCisjaWZuZGVmIE1ZX1BST0dSQU1fTkFNRQorI2RlZmluZSBNWV9QUk9HUkFNX05BTUUgImdpdC1zc2gtdXBsb2FkIgorI2VuZGlmCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJzaC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBsb2NhbF92ZXJzaW9uID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlbW90ZV92ZXJzaW9uID0gMDsKKworc3RhdGljIGludCB2ZXJib3NlID0gMDsKKworc3RhdGljIGludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CisJc3NpemVfdCBzaXplOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc2lnbmVkIGNoYXIgcmVtb3RlOworCWludCBwb3NuID0gMDsKKwlkbyB7CisJCXNpemUgPSByZWFkKGZkX2luLCBzaGExICsgcG9zbiwgMjAgLSBwb3NuKTsKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlwZXJyb3IoImdpdC1zc2gtdXBsb2FkOiByZWFkICIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghc2l6ZSkKKwkJCXJldHVybiAtMTsKKwkJcG9zbiArPSBzaXplOworCX0gd2hpbGUgKHBvc24gPCAyMCk7CisJCisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiU2VydmluZyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJcmVtb3RlID0gMDsKKwkKKwlpZiAoIWhhc19zaGExX2ZpbGUoc2hhMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJnaXQtc3NoLXVwbG9hZDogY291bGQgbm90IGZpbmQgJXNcbiIsCisJCQlzaGExX3RvX2hleChzaGExKSk7CisJCXJlbW90ZSA9IC0xOworCX0KKwkKKwl3cml0ZShmZF9vdXQsICZyZW1vdGUsIDEpOworCQorCWlmIChyZW1vdGUgPCAwKQorCQlyZXR1cm4gMDsKKwkKKwlyZXR1cm4gd3JpdGVfc2hhMV90b19mZChmZF9vdXQsIHNoYTEpOworfQorCitzdGF0aWMgaW50IHNlcnZlX3ZlcnNpb24oaW50IGZkX2luLCBpbnQgZmRfb3V0KQoreworCWlmIChyZWFkKGZkX2luLCAmcmVtb3RlX3ZlcnNpb24sIDEpIDwgMSkKKwkJcmV0dXJuIC0xOworCXdyaXRlKGZkX291dCwgJmxvY2FsX3ZlcnNpb24sIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcnZlX3JlZihpbnQgZmRfaW4sIGludCBmZF9vdXQpCit7CisJY2hhciByZWZbUEFUSF9NQVhdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHBvc24gPSAwOworCXNpZ25lZCBjaGFyIHJlbW90ZSA9IDA7CisJZG8geworCQlpZiAocmVhZChmZF9pbiwgcmVmICsgcG9zbiwgMSkgPCAxKQorCQkJcmV0dXJuIC0xOworCQlwb3NuKys7CisJfSB3aGlsZSAocmVmW3Bvc24gLSAxXSk7CisKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICJTZXJ2aW5nICVzXG4iLCByZWYpOworCisJaWYgKGdldF9yZWZfc2hhMShyZWYsIHNoYTEpKQorCQlyZW1vdGUgPSAtMTsKKwl3cml0ZShmZF9vdXQsICZyZW1vdGUsIDEpOworCWlmIChyZW1vdGUpCisJCXJldHVybiAwOworCXdyaXRlKGZkX291dCwgc2hhMSwgMjApOworICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzZXJ2aWNlKGludCBmZF9pbiwgaW50IGZkX291dCkgeworCWNoYXIgdHlwZTsKKwlpbnQgcmV0dmFsOworCWRvIHsKKwkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworCQlpZiAocmV0dmFsIDwgMSkgeworCQkJaWYgKHJldHZhbCA8IDApCisJCQkJcGVycm9yKCJnaXQtc3NoLXVwbG9hZDogcmVhZCAiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodHlwZSA9PSAndicgJiYgc2VydmVfdmVyc2lvbihmZF9pbiwgZmRfb3V0KSkKKwkJCXJldHVybjsKKwkJaWYgKHR5cGUgPT0gJ28nICYmIHNlcnZlX29iamVjdChmZF9pbiwgZmRfb3V0KSkKKwkJCXJldHVybjsKKwkJaWYgKHR5cGUgPT0gJ3InICYmIHNlcnZlX3JlZihmZF9pbiwgZmRfb3V0KSkKKwkJCXJldHVybjsKKwl9IHdoaWxlICgxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgc3NoX3B1c2hfdXNhZ2VbXSA9CisJTVlfUFJPR1JBTV9OQU1FICIgWy1jXSBbLXRdIFstYV0gWy13IHJlZl0gY29tbWl0LWlkIHVybCI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYXJnID0gMTsKKyAgICAgICAgY2hhciAqY29tbWl0X2lkOworICAgICAgICBjaGFyICp1cmw7CisJaW50IGZkX2luLCBmZF9vdXQ7CisJY29uc3QgY2hhciAqcHJvZzsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgaGV4WzQxXTsKKworCXByb2cgPSBnZXRlbnYoQ09VTlRFUlBBUlRfRU5WX05BTUUpOworCWlmICghcHJvZykgcHJvZyA9IENPVU5URVJQQVJUX1BST0dSQU1fTkFNRTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKwkJaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndycpCisJCQlhcmcrKzsKKyAgICAgICAgICAgICAgICBhcmcrKzsKKyAgICAgICAgfQorCWlmIChhcmdjIDwgYXJnICsgMikKKwkJdXNhZ2Uoc3NoX3B1c2hfdXNhZ2UpOworCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKwl1cmwgPSBhcmd2W2FyZyArIDFdOworCWlmIChnZXRfc2hhMShjb21taXRfaWQsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgY29tbWl0X2lkKTsKKwltZW1jcHkoaGV4LCBzaGExX3RvX2hleChzaGExKSwgc2l6ZW9mKGhleCkpOworCWFyZ3ZbYXJnXSA9IGhleDsKKworCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgcHJvZywgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKwkJcmV0dXJuIDE7CisKKwlzZXJ2aWNlKGZkX2luLCBmZF9vdXQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3RyYnVmLmMgYi9zdHJidWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDlkOGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3RyYnVmLmMKQEAgLTAsMCArMSw0NCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic3RyYnVmLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKwordm9pZCBzdHJidWZfaW5pdChzdHJ1Y3Qgc3RyYnVmICpzYikgeworCXNiLT5idWYgPSBOVUxMOworCXNiLT5lb2YgPSBzYi0+YWxsb2MgPSBzYi0+bGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgc3RyYnVmX2JlZ2luKHN0cnVjdCBzdHJidWYgKnNiKSB7CisJZnJlZShzYi0+YnVmKTsKKwlzdHJidWZfaW5pdChzYik7Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBzdHJidWZfYWRkKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgY2gpIHsKKwlpZiAoc2ItPmFsbG9jIDw9IHNiLT5sZW4pIHsKKwkJc2ItPmFsbG9jID0gc2ItPmFsbG9jICogMyAvIDIgKyAxNjsKKwkJc2ItPmJ1ZiA9IHhyZWFsbG9jKHNiLT5idWYsIHNiLT5hbGxvYyk7CisJfQorCXNiLT5idWZbc2ItPmxlbisrXSA9IGNoOworfQorCitzdGF0aWMgdm9pZCBzdHJidWZfZW5kKHN0cnVjdCBzdHJidWYgKnNiKSB7CisJc3RyYnVmX2FkZChzYiwgMCk7Cit9CisKK3ZvaWQgcmVhZF9saW5lKHN0cnVjdCBzdHJidWYgKnNiLCBGSUxFICpmcCwgaW50IHRlcm0pIHsKKwlpbnQgY2g7CisJc3RyYnVmX2JlZ2luKHNiKTsKKwlpZiAoZmVvZihmcCkpIHsKKwkJc2ItPmVvZiA9IDE7CisJCXJldHVybjsKKwl9CisJd2hpbGUgKChjaCA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7CisJCWlmIChjaCA9PSB0ZXJtKQorCQkJYnJlYWs7CisJCXN0cmJ1Zl9hZGQoc2IsIGNoKTsKKwl9CisJaWYgKGNoID09IEVPRiAmJiBzYi0+bGVuID09IDApCisJCXNiLT5lb2YgPSAxOworCXN0cmJ1Zl9lbmQoc2IpOworfQorCmRpZmYgLS1naXQgYS9zdHJidWYuaCBiL3N0cmJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2MwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJidWYuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIFNUUkJVRl9ICisjZGVmaW5lIFNUUkJVRl9ICitzdHJ1Y3Qgc3RyYnVmIHsKKwlpbnQgYWxsb2M7CisJaW50IGxlbjsKKwlpbnQgZW9mOworCWNoYXIgKmJ1ZjsKK307CisKK2V4dGVybiB2b2lkIHN0cmJ1Zl9pbml0KHN0cnVjdCBzdHJidWYgKik7CitleHRlcm4gdm9pZCByZWFkX2xpbmUoc3RydWN0IHN0cmJ1ZiAqLCBGSUxFICosIGludCk7CisKKyNlbmRpZiAvKiBTVFJCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvc3RyaXBzcGFjZS5jIGIvc3RyaXBzcGFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTYzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJpcHNwYWNlLmMKQEAgLTAsMCArMSw1NSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyoKKyAqIFJlbW92ZSBlbXB0eSBsaW5lcyBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZC4KKyAqCisgKiBUdXJuIG11bHRpcGxlIGNvbnNlY3V0aXZlIGVtcHR5IGxpbmVzIGludG8ganVzdCBvbmUKKyAqIGVtcHR5IGxpbmUuICBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhbiBpbmNvbXBsZXRlIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQgY2xlYW51cChjaGFyICpsaW5lKQoreworCWludCBsZW4gPSBzdHJsZW4obGluZSk7CisKKwlpZiAobGVuICYmIGxpbmVbbGVuLTFdID09ICdcbicpIHsKKwkJaWYgKGxlbiA9PSAxKQorCQkJcmV0dXJuIDA7CisJCWRvIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9IGxpbmVbbGVuLTJdOworCQkJaWYgKCFpc3NwYWNlKGMpKQorCQkJCWJyZWFrOworCQkJbGluZVtsZW4tMl0gPSAnXG4nOworCQkJbGVuLS07CisJCQlsaW5lW2xlbl0gPSAwOworCQl9IHdoaWxlIChsZW4gPiAxKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGVtcHRpZXMgPSAtMTsKKwlpbnQgaW5jb21wbGV0ZSA9IDA7CisJY2hhciBsaW5lWzEwMjRdOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pKSB7CisJCWluY29tcGxldGUgPSBjbGVhbnVwKGxpbmUpOworCisJCS8qIE5vdCBqdXN0IGFuIGVtcHR5IGxpbmU/ICovCisJCWlmIChsaW5lWzBdICE9ICdcbicpIHsKKwkJCWlmIChlbXB0aWVzID4gMCkKKwkJCQlwdXRjaGFyKCdcbicpOworCQkJZW1wdGllcyA9IDA7CisJCQlmcHV0cyhsaW5lLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGVtcHRpZXMgPCAwKQorCQkJY29udGludWU7CisJCWVtcHRpZXMrKzsKKwl9CisJaWYgKGluY29tcGxldGUpCisJCXB1dGNoYXIoJ1xuJyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zeW1ib2xpYy1yZWYuYyBiL3N5bWJvbGljLXJlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5M2M4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeW1ib2xpYy1yZWYuYwpAQCAtMCwwICsxLDM1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X3N5bWJvbGljX3JlZl91c2FnZVtdID0KKyJnaXQtc3ltYm9saWMtcmVmIG5hbWUgW3JlZl0iOworCitzdGF0aWMgdm9pZCBjaGVja19zeW1yZWYoY29uc3QgY2hhciAqSEVBRCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKmdpdF9IRUFEID0gc3RyZHVwKGdpdF9wYXRoKCIlcyIsIEhFQUQpKTsKKwljb25zdCBjaGFyICpnaXRfcmVmc19oZWFkc19tYXN0ZXIgPSByZXNvbHZlX3JlZihnaXRfSEVBRCwgc2hhMSwgMCk7CisJaWYgKGdpdF9yZWZzX2hlYWRzX21hc3RlcikgeworCQkvKiB3ZSB3YW50IHRvIHN0cmlwIHRoZSAuZ2l0LyBwYXJ0ICovCisJCWludCBwZnhsZW4gPSBzdHJsZW4oZ2l0X0hFQUQpIC0gc3RybGVuKEhFQUQpOworCQlwdXRzKGdpdF9yZWZzX2hlYWRzX21hc3RlciArIHBmeGxlbik7CisJfQorCWVsc2UKKwkJZGllKCJObyBzdWNoIHJlZjogJXMiLCBIRUFEKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAyOgorCQljaGVja19zeW1yZWYoYXJndlsxXSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY3JlYXRlX3N5bXJlZihzdHJkdXAoZ2l0X3BhdGgoIiVzIiwgYXJndlsxXSkpLCBhcmd2WzJdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdXNhZ2UoZ2l0X3N5bWJvbGljX3JlZl91c2FnZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdC8uZ2l0aWdub3JlIGIvdC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDY3YzAKLS0tIC9kZXYvbnVsbAorKysgYi90Ly5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordHJhc2gKZGlmZiAtLWdpdCBhL3QvTWFrZWZpbGUgYi90L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTU5ODUKLS0tIC9kZXYvbnVsbAorKysgYi90L01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMgUnVuIHRlc3RzCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCisjR0lUX1RFU1RfT1BUUz0tLXZlcmJvc2UgLS1kZWJ1ZworU0hFTExfUEFUSCA/PSAkKFNIRUxMKQorVEFSID89ICQoVEFSKQorCisjIFNoZWxsIHF1b3RlOworU0hFTExfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSCkpCisKK1QgPSAkKHdpbGRjYXJkIHRbMC05XVswLTldWzAtOV1bMC05XS0qLnNoKQorCitpZmRlZiBOT19QWVRIT04KKwlHSVRfVEVTVF9PUFRTICs9IC0tbm8tcHl0aG9uCitlbmRpZgorCithbGw6ICQoVCkgY2xlYW4KKworJChUKToKKwlAZWNobyAiKioqICRAICoqKiI7ICckKFNIRUxMX1BBVEhfU1EpJyAkQCAkKEdJVF9URVNUX09QVFMpCisKK2NsZWFuOgorCXJtIC1mciB0cmFzaAorCisuUEhPTlk6ICQoVCkgY2xlYW4KKy5OT1RQQVJBTExFTDoKKwpkaWZmIC0tZ2l0IGEvdC9SRUFETUUgYi90L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzVhM2FjCi0tLSAvZGV2L251bGwKKysrIGIvdC9SRUFETUUKQEAgLTAsMCArMSwyMDggQEAKK0NvcmUgR0lUIFRlc3RzCis9PT09PT09PT09PT09PQorCitUaGlzIGRpcmVjdG9yeSBob2xkcyBtYW55IHRlc3Qgc2NyaXB0cyBmb3IgY29yZSBHSVQgdG9vbHMuICBUaGUKK2ZpcnN0IHBhcnQgb2YgdGhpcyBzaG9ydCBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHJ1biB0aGUgdGVzdHMKK2FuZCByZWFkIHRoZWlyIG91dHB1dC4KKworV2hlbiBmaXhpbmcgdGhlIHRvb2xzIG9yIGFkZGluZyBlbmhhbmNlbWVudHMsIHlvdSBhcmUgc3Ryb25nbHkKK2VuY291cmFnZWQgdG8gYWRkIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5IHRvIGNvdmVyIHdoYXQgeW91IGFyZQordHJ5aW5nIHRvIGZpeCBvciBlbmhhbmNlLiAgVGhlIGxhdGVyIHBhcnQgb2YgdGhpcyBzaG9ydCBkb2N1bWVudAorZGVzY3JpYmVzIGhvdyB5b3VyIHRlc3Qgc2NyaXB0cyBzaG91bGQgYmUgb3JnYW5pemVkLgorCisKK1J1bm5pbmcgVGVzdHMKKy0tLS0tLS0tLS0tLS0KKworVGhlIGVhc2llc3Qgd2F5IHRvIHJ1biB0ZXN0cyBpcyB0byBzYXkgIm1ha2UiLiAgVGhpcyBydW5zIGFsbAordGhlIHRlc3RzLgorCisgICAgKioqIHQwMDAwLWJhc2ljLnNoICoqKgorICAgICogICBvayAxOiAuZ2l0L29iamVjdHMgc2hvdWxkIGJlIGVtcHR5IGFmdGVyIGdpdC1pbml0LWRiIGluIGFuIGVtcHR5IHJlcG8uCisgICAgKiAgIG9rIDI6IC5naXQvb2JqZWN0cyBzaG91bGQgaGF2ZSAyNTYgc3ViZGlyZWN0b3JpZXMuCisgICAgKiAgIG9rIDM6IGdpdC11cGRhdGUtaW5kZXggd2l0aG91dCAtLWFkZCBzaG91bGQgZmFpbCBhZGRpbmcuCisgICAgLi4uCisgICAgKiAgIG9rIDIzOiBubyBkaWZmIGFmdGVyIGNoZWNrb3V0IGFuZCBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaC4KKyAgICAqIHBhc3NlZCBhbGwgMjMgdGVzdChzKQorICAgICoqKiB0MDEwMC1lbnZpcm9ubWVudC1uYW1lcy5zaCAqKioKKyAgICAqICAgb2sgMTogdXNpbmcgb2xkIG5hbWVzIHNob3VsZCBpc3N1ZSB3YXJuaW5ncy4KKyAgICAqICAgb2sgMjogdXNpbmcgb2xkIG5hbWVzIGJ1dCBoYXZpbmcgbmV3IG5hbWVzIHNob3VsZCBub3QgaXNzdWUgd2FybmluZ3MuCisgICAgLi4uCisKK09yIHlvdSBjYW4gcnVuIGVhY2ggdGVzdCBpbmRpdmlkdWFsbHkgZnJvbSBjb21tYW5kIGxpbmUsIGxpa2UKK3RoaXM6CisKKyAgICAkIHNoIC4vdDMwMDEtbHMtZmlsZXMta2lsbGVkLnNoCisgICAgKiAgIG9rIDE6IGdpdC11cGRhdGUtaW5kZXggLS1hZGQgdG8gYWRkIHZhcmlvdXMgcGF0aHMuCisgICAgKiAgIG9rIDI6IGdpdC1scy1maWxlcyAtayB0byBzaG93IGtpbGxlZCBmaWxlcy4KKyAgICAqICAgb2sgMzogdmFsaWRhdGUgZ2l0LWxzLWZpbGVzIC1rIG91dHB1dC4KKyAgICAqIHBhc3NlZCBhbGwgMyB0ZXN0KHMpCisKK1lvdSBjYW4gcGFzcyAtLXZlcmJvc2UgKG9yIC12KSwgLS1kZWJ1ZyAob3IgLWQpLCBhbmQgLS1pbW1lZGlhdGUKKyhvciAtaSkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIHRoZSB0ZXN0LgorCistLXZlcmJvc2U6OgorCVRoaXMgbWFrZXMgdGhlIHRlc3QgbW9yZSB2ZXJib3NlLiAgU3BlY2lmaWNhbGx5LCB0aGUKKwljb21tYW5kIGJlaW5nIHJ1biBhbmQgdGhlaXIgb3V0cHV0IGlmIGFueSBhcmUgYWxzbworCW91dHB1dC4KKworLS1kZWJ1Zzo6CisJVGhpcyBtYXkgaGVscCB0aGUgcGVyc29uIHdobyBpcyBkZXZlbG9waW5nIGEgbmV3IHRlc3QuCisJSXQgY2F1c2VzIHRoZSBjb21tYW5kIGRlZmluZWQgd2l0aCB0ZXN0X2RlYnVnIHRvIHJ1bi4KKworLS1pbW1lZGlhdGU6OgorCVRoaXMgY2F1c2VzIHRoZSB0ZXN0IHRvIGltbWVkaWF0ZWx5IGV4aXQgdXBvbiB0aGUgZmlyc3QKKwlmYWlsZWQgdGVzdC4KKworCitOYW1pbmcgVGVzdHMKKy0tLS0tLS0tLS0tLQorCitUaGUgdGVzdCBmaWxlcyBhcmUgbmFtZWQgYXM6CisKKwl0Tk5OTi1jb21tYW5kbmFtZS1kZXRhaWxzLnNoCisKK3doZXJlIE4gaXMgYSBkZWNpbWFsIGRpZ2l0LgorCitGaXJzdCBkaWdpdCB0ZWxscyB0aGUgZmFtaWx5OgorCisJMCAtIHRoZSBhYnNvbHV0ZSBiYXNpY3MgYW5kIGdsb2JhbCBzdHVmZgorCTEgLSB0aGUgYmFzaWMgY29tbWFuZHMgY29uY2VybmluZyBkYXRhYmFzZQorCTIgLSB0aGUgYmFzaWMgY29tbWFuZHMgY29uY2VybmluZyB0aGUgd29ya2luZyB0cmVlCisJMyAtIHRoZSBvdGhlciBiYXNpYyBjb21tYW5kcyAoZS5nLiBscy1maWxlcykKKwk0IC0gdGhlIGRpZmYgY29tbWFuZHMKKwk1IC0gdGhlIHB1bGwgYW5kIGV4cG9ydGluZyBjb21tYW5kcworCTYgLSB0aGUgcmV2aXNpb24gdHJlZSBjb21tYW5kcyAoZXZlbiBlLmcuIG1lcmdlLWJhc2UpCisKK1NlY29uZCBkaWdpdCB0ZWxscyB0aGUgcGFydGljdWxhciBjb21tYW5kIHdlIGFyZSB0ZXN0aW5nLgorCitUaGlyZCBkaWdpdCAob3B0aW9uYWxseSkgdGVsbHMgdGhlIHBhcnRpY3VsYXIgc3dpdGNoIG9yIGdyb3VwIG9mIHN3aXRjaGVzCit3ZSBhcmUgdGVzdGluZy4KKworSWYgeW91IGNyZWF0ZSBmaWxlcyB1bmRlciB0LyBkaXJlY3RvcnkgKGkuZS4gaGVyZSkgdGhhdCBpcyBub3QKK3RoZSB0b3AtbGV2ZWwgdGVzdCBzY3JpcHQsIG5ldmVyIG5hbWUgdGhlIGZpbGUgdG8gbWF0Y2ggdGhlIGFib3ZlCitwYXR0ZXJuLiAgVGhlIE1ha2VmaWxlIGhlcmUgY29uc2lkZXJzIGFsbCBzdWNoIGZpbGVzIGFzIHRoZQordG9wLWxldmVsIHRlc3Qgc2NyaXB0IGFuZCB0cmllcyB0byBydW4gYWxsIG9mIHRoZW0uICBBIGNhcmUgaXMKK2VzcGVjaWFsbHkgbmVlZGVkIGlmIHlvdSBhcmUgY3JlYXRpbmcgYSBjb21tb24gdGVzdCBsaWJyYXJ5CitmaWxlLCBzaW1pbGFyIHRvIHRlc3QtbGliLnNoLCBiZWNhdXNlIHN1Y2ggYSBsaWJyYXJ5IGZpbGUgbWF5Citub3QgYmUgc3VpdGFibGUgZm9yIHN0YW5kYWxvbmUgZXhlY3V0aW9uLgorCisKK1dyaXRpbmcgVGVzdHMKKy0tLS0tLS0tLS0tLS0KKworVGhlIHRlc3Qgc2NyaXB0IGlzIHdyaXR0ZW4gYXMgYSBzaGVsbCBzY3JpcHQuICBJdCBzaG91bGQgc3RhcnQKK3dpdGggdGhlIHN0YW5kYXJkICIjIS9iaW4vc2giIHdpdGggY29weXJpZ2h0IG5vdGljZXMsIGFuZCBhbgorYXNzaWdubWVudCB0byB2YXJpYWJsZSAndGVzdF9kZXNjcmlwdGlvbicsIGxpa2UgdGhpczoKKworCSMhL2Jpbi9zaAorCSMKKwkjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworCSMKKworCXRlc3RfZGVzY3JpcHRpb249J3h4eCB0ZXN0IChvcHRpb24gLS1mcm90eikKKworCVRoaXMgdGVzdCByZWdpc3RlcnMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIGNhY2hlCisJYW5kIHRyaWVzIHRvIHJ1biBnaXQtbHMtZmlsZXMgd2l0aCBvcHRpb24gLS1mcm90ei4nCisKKworU291cmNlICd0ZXN0LWxpYi5zaCcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIGFzc2lnbmluZyB0ZXN0X2Rlc2NyaXB0aW9uLCB0aGUgdGVzdCBzY3JpcHQgc2hvdWxkIHNvdXJjZQordGVzdC1saWIuc2ggbGlrZSB0aGlzOgorCisJLiAuL3Rlc3QtbGliLnNoCisKK1RoaXMgdGVzdCBoYXJuZXNzIGxpYnJhcnkgZG9lcyB0aGUgZm9sbG93aW5nIHRoaW5nczoKKworIC0gSWYgdGhlIHNjcmlwdCBpcyBpbnZva2VkIHdpdGggY29tbWFuZCBsaW5lIGFyZ3VtZW50IC0taGVscAorICAgKG9yIC1oKSwgaXQgc2hvd3MgdGhlIHRlc3RfZGVzY3JpcHRpb24gYW5kIGV4aXRzLgorCisgLSBDcmVhdGVzIGFuIGVtcHR5IHRlc3QgZGlyZWN0b3J5IHdpdGggYW4gZW1wdHkgLmdpdC9vYmplY3RzCisgICBkYXRhYmFzZSBhbmQgY2hkaXIoMikgaW50byBpdC4gIFRoaXMgZGlyZWN0b3J5IGlzICd0L3RyYXNoJworICAgaWYgeW91IG11c3Qga25vdywgYnV0IEkgZG8gbm90IHRoaW5rIHlvdSBjYXJlLgorCisgLSBEZWZpbmVzIHN0YW5kYXJkIHRlc3QgaGVscGVyIGZ1bmN0aW9ucyBmb3IgeW91ciBzY3JpcHRzIHRvCisgICB1c2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIG1ha2UgYWxsIHNjcmlwdHMgYmVoYXZlCisgICBjb25zaXN0ZW50bHkgd2hlbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIC0tdmVyYm9zZSAob3IgLXYpLAorICAgLS1kZWJ1ZyAob3IgLWQpLCBhbmQgLS1pbW1lZGlhdGUgKG9yIC1pKSBpcyBnaXZlbi4KKworCitFbmQgd2l0aCB0ZXN0X2RvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3VyIHNjcmlwdCB3aWxsIGJlIGEgc2VxdWVuY2Ugb2YgdGVzdHMsIHVzaW5nIGhlbHBlciBmdW5jdGlvbnMKK2Zyb20gdGhlIHRlc3QgaGFybmVzcyBsaWJyYXJ5LiAgQXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0LCBjYWxsCisndGVzdF9kb25lJy4KKworCitUZXN0IGhhcm5lc3MgbGlicmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIGEgaGFuZGZ1bCBoZWxwZXIgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHRlc3QgaGFybmVzcworbGlicmFyeSBmb3IgeW91ciBzY3JpcHQgdG8gdXNlLgorCisgLSB0ZXN0X2V4cGVjdF9zdWNjZXNzIDxtZXNzYWdlPiA8c2NyaXB0PgorCisgICBUaGlzIHRha2VzIHR3byBzdHJpbmdzIGFzIHBhcmFtZXRlciwgYW5kIGV2YWx1YXRlcyB0aGUKKyAgIDxzY3JpcHQ+LiAgSWYgaXQgeWllbGRzIHN1Y2Nlc3MsIHRlc3QgaXMgY29uc2lkZXJlZAorICAgc3VjY2Vzc2Z1bC4gIDxtZXNzYWdlPiBzaG91bGQgc3RhdGUgd2hhdCBpdCBpcyB0ZXN0aW5nLgorCisgICBFeGFtcGxlOgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICdnaXQtd3JpdGUtdHJlZSBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSB0cmVlLicgXAorCSAgICAndHJlZT0kKGdpdC13cml0ZS10cmVlKScKKworIC0gdGVzdF9leHBlY3RfZmFpbHVyZSA8bWVzc2FnZT4gPHNjcmlwdD4KKworICAgVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgdGVzdF9leHBlY3Rfc3VjY2Vzcy4gIElmIDxzY3JpcHQ+CisgICB5aWVsZHMgc3VjY2VzcywgdGVzdCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4KKworICAgRXhhbXBsZToKKworCXRlc3RfZXhwZWN0X2ZhaWx1cmUgXAorCSAgICAnZ2l0LXVwZGF0ZS1pbmRleCB3aXRob3V0IC0tYWRkIHNob3VsZCBmYWlsIGFkZGluZy4nIFwKKwkgICAgJ2dpdC11cGRhdGUtaW5kZXggc2hvdWxkLWJlLWVtcHR5JworCisgLSB0ZXN0X2RlYnVnIDxzY3JpcHQ+CisKKyAgIFRoaXMgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIDxzY3JpcHQ+LCBhbmQgZXZhbHVhdGVzIGl0IG9ubHkKKyAgIHdoZW4gdGhlIHRlc3Qgc2NyaXB0IGlzIHN0YXJ0ZWQgd2l0aCAtLWRlYnVnIGNvbW1hbmQgbGluZQorICAgYXJndW1lbnQuICBUaGlzIGlzIHByaW1hcmlseSBtZWFudCBmb3IgdXNlIGR1cmluZyB0aGUKKyAgIGRldmVsb3BtZW50IG9mIGEgbmV3IHRlc3Qgc2NyaXB0LgorCisgLSB0ZXN0X2RvbmUKKworICAgWW91ciB0ZXN0IHNjcmlwdCBtdXN0IGhhdmUgdGVzdF9kb25lIGF0IHRoZSBlbmQuICBJdHMgcHVycG9zZQorICAgaXMgdG8gc3VtbWFyaXplIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMgaW4gdGhlIHRlc3Qgc2NyaXB0IGFuZAorICAgZXhpdCB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisKKworVGlwcyBmb3IgV3JpdGluZyBUZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyB3aXRoIGFueSBwcm9ncmFtbWluZyBwcm9qZWN0cywgZXhpc3RpbmcgcHJvZ3JhbXMgYXJlIHRoZSBiZXN0Citzb3VyY2Ugb2YgdGhlIGluZm9ybWF0aW9uLiAgSG93ZXZlciwgZG8gX25vdF8gZW11bGF0ZQordDAwMDAtYmFzaWMuc2ggd2hlbiB3cml0aW5nIHlvdXIgdGVzdHMuICBUaGUgdGVzdCBpcyBzcGVjaWFsIGluCit0aGF0IGl0IHRyaWVzIHRvIHZhbGlkYXRlIHRoZSB2ZXJ5IGNvcmUgb2YgR0lULiAgRm9yIGV4YW1wbGUsIGl0Citrbm93cyB0aGF0IHRoZXJlIHdpbGwgYmUgMjU2IHN1YmRpcmVjdG9yaWVzIHVuZGVyIC5naXQvb2JqZWN0cy8sCithbmQgaXQga25vd3MgdGhhdCB0aGUgb2JqZWN0IElEIG9mIGFuIGVtcHR5IHRyZWUgaXMgYSBjZXJ0YWluCis0MC1ieXRlIHN0cmluZy4gIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGRvbmUgc28gaW4gdDAwMDAtYmFzaWMuc2gKK2JlY2F1c2UgdGhlIHRoaW5ncyB0aGUgdmVyeSBiYXNpYyBjb3JlIHRlc3QgdHJpZXMgdG8gYWNoaWV2ZSBpcwordG8gc2VydmUgYXMgYSBiYXNpcyBmb3IgcGVvcGxlIHdobyBhcmUgY2hhbmdpbmcgdGhlIEdJVCBpbnRlcm5hbAorZHJhc3RpY2FsbHkuICBGb3IgdGhlc2UgcGVvcGxlLCBhZnRlciBtYWtpbmcgY2VydGFpbiBjaGFuZ2VzLAorbm90IHNlZWluZyBmYWlsdXJlcyBmcm9tIHRoZSBiYXNpYyB0ZXN0IF9pc18gYSBmYWlsdXJlLiAgQW5kCitzdWNoIGRyYXN0aWMgY2hhbmdlcyB0byB0aGUgY29yZSBHSVQgdGhhdCBldmVuIGNoYW5nZXMgdGhlc2UKK290aGVyd2lzZSBzdXBwb3NlZGx5IHN0YWJsZSBvYmplY3QgSURzIHNob3VsZCBiZSBhY2NvbXBhbmllZCBieQorYW4gdXBkYXRlIHRvIHQwMDAwLWJhc2ljLnNoLgorCitIb3dldmVyLCBvdGhlciB0ZXN0cyB0aGF0IHNpbXBseSByZWx5IG9uIGJhc2ljIHBhcnRzIG9mIHRoZSBjb3JlCitHSVQgd29ya2luZyBwcm9wZXJseSBzaG91bGQgbm90IGhhdmUgdGhhdCBsZXZlbCBvZiBpbnRpbWF0ZQora25vd2xlZGdlIG9mIHRoZSBjb3JlIEdJVCBpbnRlcm5hbHMuICBJZiBhbGwgdGhlIHRlc3Qgc2NyaXB0cworaGFyZGNvZGVkIHRoZSBvYmplY3QgSURzIGxpa2UgdDAwMDAtYmFzaWMuc2ggZG9lcywgdGhhdCBkZWZlYXRzCit0aGUgcHVycG9zZSBvZiB0MDAwMC1iYXNpYy5zaCwgd2hpY2ggaXMgdG8gaXNvbGF0ZSB0aGF0IGxldmVsIG9mCit2YWxpZGF0aW9uIGluIG9uZSBwbGFjZS4gIFlvdXIgdGVzdCBhbHNvIGVuZHMgdXAgbmVlZGluZwordXBkYXRpbmcgd2hlbiBzdWNoIGEgY2hhbmdlIHRvIHRoZSBpbnRlcm5hbCBoYXBwZW5zLCBzbyBkbyBfbm90XworZG8gaXQgYW5kIGxlYXZlIHRoZSBsb3cgbGV2ZWwgb2YgdmFsaWRhdGlvbiB0byB0MDAwMC1iYXNpYy5zaC4KZGlmZiAtLWdpdCBhL3QvYW5ub3RhdGUtdGVzdHMuc2ggYi90L2Fubm90YXRlLXRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDkzOGMKLS0tIC9kZXYvbnVsbAorKysgYi90L2Fubm90YXRlLXRlc3RzLnNoCkBAIC0wLDAgKzEsMTIxIEBACisjIFRoaXMgZmlsZSBpc24ndCB1c2VkIGFzIGEgdGVzdCBzY3JpcHQgZGlyZWN0bHksIGluc3RlYWQgaXQgaXMKKyMgc291cmNlZCBmcm9tIHQ4MDAxLWFubm90YXRlLnNoIGFuZCB0ODAwMS1ibGFtZS5zaC4KKworY2hlY2tfY291bnQgKCkgeworCWhlYWQ9CisJY2FzZSAiJDEiIGluIC1oKSBoZWFkPSIkMiI7IHNoaWZ0OyBzaGlmdCA7OyBlc2FjCisJJFBST0cgZmlsZSAkaGVhZCB8IHBlcmwgLWUgJworCQlteSAlZXhwZWN0ID0gKEBBUkdWKTsKKwkJbXkgJWNvdW50ID0gKCk7CisJCXdoaWxlICg8U1RESU4+KSB7CisJCQlpZiAoL15bMC05YS1mXStcdFwoKFteXHRdKylcdC8pIHsKKwkJCQlteSAkYXV0aG9yID0gJDE7CisJCQkJZm9yICgkYXV0aG9yKSB7IHMvXlxzKi8vOyBzL1xzKiQvLzsgfQorCQkJCWlmIChleGlzdHMgJGV4cGVjdHskYXV0aG9yfSkgeworCQkJCQkkY291bnR7JGF1dGhvcn0rKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXkgJGJhZCA9IDA7CisJCXdoaWxlIChteSAoJGF1dGhvciwgJGNvdW50KSA9IGVhY2ggJWNvdW50KSB7CisJCQlteSAkb2s7CisJCQlpZiAoJGV4cGVjdHskYXV0aG9yfSAhPSAkY291bnQpIHsKKwkJCQkkYmFkID0gMTsKKwkJCQkkb2sgPSAiYmFkIjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSRvayA9ICJnb29kIjsKKwkJCX0KKwkJCXByaW50IFNUREVSUiAiQXV0aG9yICRhdXRob3IgKGV4cGVjdGVkICRleHBlY3R7JGF1dGhvcn0sIGF0dHJpYnV0ZWQgJGNvdW50KSAkb2tcbiI7CisJCX0KKwkJZXhpdCgkYmFkKTsKKwknICIkQCIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnZWNobyAiMUEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIiA+ZmlsZSAmJgorICAgICBlY2hvICJsYXp5IGRvZyIgPj5maWxlICYmCisgICAgIGdpdCBhZGQgZmlsZQorICAgICBHSVRfQVVUSE9SX05BTUU9IkEiIGdpdCBjb21taXQgLWEgLW0gIkluaXRpYWwuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNrIGFsbCBsaW5lcyBibGFtZWQgb24gQScgXAorICAgICdjaGVja19jb3VudCBBIDInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdTZXR1cCBuZXcgbGluZXMgYmxhbWVkIG9uIEInIFwKKyAgICAnZWNobyAiMkEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIiA+PmZpbGUgJiYKKyAgICAgZWNobyAibGF6eSBkb2ciID4+IGZpbGUgJiYKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJCIiBnaXQgY29tbWl0IC1hIC1tICJTZWNvbmQuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1R3byBsaW5lcyBibGFtZWQgb24gQSwgdHdvIG9uIEInIFwKKyAgICAnY2hlY2tfY291bnQgQSAyIEIgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21lcmdlLXNldHVwIHBhcnQgMScgXAorICAgICdnaXQgY2hlY2tvdXQgLWIgYnJhbmNoMSBtYXN0ZXIgJiYKKyAgICAgZWNobyAiM0Egc2xvdyBncmVlbiBmb3gganVtcHMgaW50byB0aGUiID4+IGZpbGUgJiYKKyAgICAgZWNobyAid2VsbC4iID4+IGZpbGUgJiYKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJCMSIgZ2l0IGNvbW1pdCAtYSAtbSAiQnJhbmNoMS0xIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1R3byBsaW5lcyBibGFtZWQgb24gQSwgdHdvIG9uIEIsIHR3byBvbiBCMScgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAyIEIxIDInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtZXJnZS1zZXR1cCBwYXJ0IDInIFwKKyAgICAnZ2l0IGNoZWNrb3V0IC1iIGJyYW5jaDIgbWFzdGVyICYmCisgICAgIHNlZCAtZSAicy8yQSBxdWljayBicm93bi80QSBxdWljayBicm93biBsYXp5IGRvZy8iIDwgZmlsZSA+IGZpbGUubmV3ICYmCisgICAgIG12IGZpbGUubmV3IGZpbGUgJiYKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJCMiIgZ2l0IGNvbW1pdCAtYSAtbSAiQnJhbmNoMi0xIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1R3byBsaW5lcyBibGFtZWQgb24gQSwgb25lIG9uIEIsIG9uZSBvbiBCMicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAxIEIyIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtZXJnZS1zZXR1cCBwYXJ0IDMnIFwKKyAgICAnZ2l0IHB1bGwgLiBicmFuY2gxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCBvbmUgb24gQiwgdHdvIG9uIEIxLCBvbmUgb24gQjInIFwKKyAgICAnY2hlY2tfY291bnQgQSAyIEIgMSBCMSAyIEIyIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdBbm5vdGF0aW5nIGFuIG9sZCByZXZpc2lvbiB3b3JrcycgXAorICAgICdjaGVja19jb3VudCAtaCBtYXN0ZXIgQSAyIEIgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0Fubm90YXRpbmcgYW4gb2xkIHJldmlzaW9uIHdvcmtzJyBcCisgICAgJ2NoZWNrX2NvdW50IC1oIG1hc3Rlcl4gQSAyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbWVyZ2Utc2V0dXAgcGFydCA0JyBcCisgICAgJ2VjaG8gImV2aWwgbWVyZ2UuIiA+PmZpbGUgJiYKKyAgICAgRURJVE9SPTogVklTVUFMPTogZ2l0IGNvbW1pdCAtYSAtLWFtZW5kJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCBvbmUgb24gQiwgdHdvIG9uIEIxLCBvbmUgb24gQjIsIG9uZSBvbiBBIFUgVGhvcicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAxIEIxIDIgQjIgMSAiQSBVIFRob3IiIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhbiBpbmNvbXBsZXRlIGxpbmUgYWRkZWQnIFwKKyAgICAnZWNobyAiaW5jb21wbGV0ZSIgfCB0ciAtZCAiXFwwMTIiID4+ZmlsZSAmJgorICAgIEdJVF9BVVRIT1JfTkFNRT0iQyIgZ2l0IGNvbW1pdCAtYSAtbSAiSW5jb21wbGV0ZSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdXaXRoIGluY29tcGxldGUgbGluZXMuJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDEgQjEgMiBCMiAxICJBIFUgVGhvciIgMSBDIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzb21lIGVkaXQnIFwKKyAgICAnbXYgZmlsZSBmaWxlMSAmJgorICAgICBzZWQgLWUgMWQgLWUgIjVzLzNBLzk5LyIgZmlsZTEgPmZpbGUgJiYKKyAgICAgcm0gLWYgZmlsZTEgJiYKKyAgICBHSVRfQVVUSE9SX05BTUU9IkQiIGdpdCBjb21taXQgLWEgLW0gImVkaXQiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc29tZSBlZGl0JyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMSBCIDEgQjEgMSBCMiAxICJBIFUgVGhvciIgMSBDIDEgRCAxJwpkaWZmIC0tZ2l0IGEvdC9kaWZmLWxpYi5zaCBiL3QvZGlmZi1saWIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQ1YTFiMAotLS0gL2Rldi9udWxsCisrKyBiL3QvZGlmZi1saWIuc2gKQEAgLTAsMCArMSw0MSBAQAorOgorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Nhbml0aXplX2RpZmZfcmF3PScvXjovcy8gJyIkX3g0MCInICciJF94NDAiJyBcKFtBLVpdXClbMC05XSoJLyBYIFggXDEjCS8nCitjb21wYXJlX2RpZmZfcmF3ICgpIHsKKyAgICAjIFdoZW4gaGV1cmlzdGljcyBhcmUgaW1wcm92ZWQsIHRoZSBzY29yZSBudW1iZXJzIHdvdWxkIGNoYW5nZS4KKyAgICAjIElnbm9yZSB0aGVtIHdoaWxlIGNvbXBhcmluZy4KKyAgICAjIEFsc28gd2UgZG8gbm90IGNoZWNrIFNIQTEgaGFzaCBnZW5lcmF0aW9uIGluIHRoaXMgdGVzdCwgd2hpY2gKKyAgICAjIGlzIGEgam9iIGZvciB0MDAwMC1iYXNpYy5zaAorCisgICAgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXciIDwiJDEiID4udG1wLTEKKyAgICBzZWQgLWUgIiRzYW5pdGl6ZV9kaWZmX3JhdyIgPCIkMiIgPi50bXAtMgorICAgIGRpZmYgLXUgLnRtcC0xIC50bXAtMiAmJiBybSAtZiAudG1wLTEgLnRtcC0yCit9CisKK3Nhbml0aXplX2RpZmZfcmF3X3o9Jy9eOi9zLyAnIiRfeDQwIicgJyIkX3g0MCInIFwoW0EtWl1cKVswLTldKiQvIFggWCBcMSMvJworY29tcGFyZV9kaWZmX3Jhd196ICgpIHsKKyAgICAjIFdoZW4gaGV1cmlzdGljcyBhcmUgaW1wcm92ZWQsIHRoZSBzY29yZSBudW1iZXJzIHdvdWxkIGNoYW5nZS4KKyAgICAjIElnbm9yZSB0aGVtIHdoaWxlIGNvbXBhcmluZy4KKyAgICAjIEFsc28gd2UgZG8gbm90IGNoZWNrIFNIQTEgaGFzaCBnZW5lcmF0aW9uIGluIHRoaXMgdGVzdCwgd2hpY2gKKyAgICAjIGlzIGEgam9iIGZvciB0MDAwMC1iYXNpYy5zaAorCisgICAgdHIgJ1wwJyAnXDAxMicgPCIkMSIgfCBzZWQgLWUgIiRzYW5pdGl6ZV9kaWZmX3Jhd196IiA+LnRtcC0xCisgICAgdHIgJ1wwJyAnXDAxMicgPCIkMiIgfCBzZWQgLWUgIiRzYW5pdGl6ZV9kaWZmX3Jhd196IiA+LnRtcC0yCisgICAgZGlmZiAtdSAudG1wLTEgLnRtcC0yICYmIHJtIC1mIC50bXAtMSAudG1wLTIKK30KKworY29tcGFyZV9kaWZmX3BhdGNoICgpIHsKKyAgICAjIFdoZW4gaGV1cmlzdGljcyBhcmUgaW1wcm92ZWQsIHRoZSBzY29yZSBudW1iZXJzIHdvdWxkIGNoYW5nZS4KKyAgICAjIElnbm9yZSB0aGVtIHdoaWxlIGNvbXBhcmluZy4KKyAgICBzZWQgLWUgJworCS9eW2Rpc10qaW1pbGFyaXR5IGluZGV4IFswLTldKiUkL2QKKwkvXmluZGV4IFswLTlhLWZdKlwuXC5bMC05YS1mXS9kCisgICAgJyA8IiQxIiA+LnRtcC0xCisgICAgc2VkIC1lICcKKwkvXltkaXNdKmltaWxhcml0eSBpbmRleCBbMC05XSolJC9kCisJL15pbmRleCBbMC05YS1mXSpcLlwuWzAtOWEtZl0vZAorICAgICcgPCIkMiIgPi50bXAtMgorICAgIGRpZmYgLXUgLnRtcC0xIC50bXAtMiAmJiBybSAtZiAudG1wLTEgLnRtcC0yCit9CmRpZmYgLS1naXQgYS90L2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoIGIvdC9saWItcmVhZC10cmVlLW0tM3dheS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTk1NjAzCi0tLSAvZGV2L251bGwKKysrIGIvdC9saWItcmVhZC10cmVlLW0tM3dheS5zaApAQCAtMCwwICsxLDE1OCBAQAorOiBJbmNsdWRlZCBmcm9tIHQxMDAwLXJlYWQtdHJlZS1tLTN3YXkuc2ggYW5kIG90aGVycworIyBPcmlnaW5hbCB0cmVlLgorbWtkaXIgWgorZm9yIGEgaW4gTiBEIE0KK2RvCisgICAgZm9yIGIgaW4gTiBEIE0KKyAgICBkbworICAgICAgICBwPSRhJGIKKwllY2hvIFRoaXMgaXMgJHAgZnJvbSB0aGUgb3JpZ2luYWwgdHJlZS4gPiRwCisJZWNobyBUaGlzIGlzIFovJHAgZnJvbSB0aGUgb3JpZ2luYWwgdHJlZS4gPlovJHAKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkgICAgImFkZGluZyB0ZXN0IGZpbGUgJHAgYW5kIFovJHAiIFwKKwkgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgJHAgJiYKKwkgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBaLyRwJworICAgIGRvbmUKK2RvbmUKK2VjaG8gVGhpcyBpcyBTUyBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlLiA+U1MKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhZGRpbmcgdGVzdCBmaWxlIFNTJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgU1MnCitjYXQgPlRUIDw8XEVPRgorVGhpcyBpcyBhIHRyaXZpYWwgbWVyZ2Ugc2FtcGxlIHRleHQuCitCcmFuY2ggQSBpcyBleHBlY3RlZCB0byB1cGNhc2UgdGhpcyB3b3JkLCBoZXJlLgorVGhlcmUgYXJlIHNvbWUgZmlsbGVyIGxpbmVzIHRvIGF2b2lkIGRpZmYgY29udGV4dAorY29uZmxpY3RzIGhlcmUsCitsaWtlIHRoaXMgb25lLAorYW5kIHRoaXMgb25lLAorYW5kIHRoaXMgb25lIGlzIHlldCBhbm90aGVyIG9uZSBvZiB0aGVtLgorQXQgdGhlIHZlcnkgZW5kLCBoZXJlIGNvbWVzIGFub3RoZXIgbGluZSwgdGhhdCBpcwordGhlIHdvcmQsIGV4cGVjdGVkIHRvIGJlIHVwY2FzZWQgYnkgQnJhbmNoIEIuCitUaGlzIGNvbmNsdWRlcyB0aGUgdHJpdmlhbCBtZXJnZSBzYW1wbGUgZmlsZS4KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FkZGluZyB0ZXN0IGZpbGUgVFQnIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBUVCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIGluaXRpYWwgdHJlZScgXAorICAgICd0cmVlX089JChnaXQtd3JpdGUtdHJlZSknCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnJhbmNoIEEgYW5kIEIgbWFrZXMgdGhlIGNoYW5nZXMgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBtYXRyaXguCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnJhbmNoIEEKKwordG9fcmVtb3ZlPSQoZWNobyBEPyBaL0Q/KQorcm0gLWYgJHRvX3JlbW92ZQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQSAocmVtb3ZhbCknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAkdG9fcmVtb3ZlJworCitmb3IgcCBpbiBNPyBaL00/CitkbworICAgIGVjaG8gVGhpcyBpcyBtb2RpZmllZCAkcCBpbiB0aGUgYnJhbmNoIEEuID4kcAorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjaGFuZ2UgaW4gYnJhbmNoIEEgKG1vZGlmaWNhdGlvbiknIFwKKyAgICAgICAgImdpdC11cGRhdGUtaW5kZXggJHAiCitkb25lCisKK2ZvciBwIGluIEFOIEFBIFovQU4gWi9BQQorZG8KKyAgICBlY2hvIFRoaXMgaXMgYWRkZWQgJHAgaW4gdGhlIGJyYW5jaCBBLiA+JHAKKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY2hhbmdlIGluIGJyYW5jaCBBIChhZGRpdGlvbiknIFwKKwkiZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAkcCIKK2RvbmUKKworZWNobyBUaGlzIGlzIFNTIGZyb20gdGhlIG1vZGlmaWVkIHRyZWUuID5TUworZWNobyBUaGlzIGlzIExMIGZyb20gdGhlIG1vZGlmaWVkIHRyZWUuID5MTAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQSAoYWRkaXRpb24pJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgTEwgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBTUycKK212IFRUIFRULQorc2VkIC1lICcvQnJhbmNoIEEvcy93b3JkL1dPUkQvZycgPFRULSA+VFQKK3JtIC1mIFRULQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQSAoZWRpdCknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCBUVCcKKworbWtkaXIgREYKK2VjaG8gQnJhbmNoIEEgbWFrZXMgYSBmaWxlIGF0IERGL0RGLCBjcmVhdGluZyBhIGRpcmVjdG9yeSBERi4gPkRGL0RGCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBBIChjaGFuZ2UgZmlsZSB0byBkaXJlY3RvcnkpJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgREYvREYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWNvcmRpbmcgYnJhbmNoIEEgdHJlZScgXAorICAgICd0cmVlX0E9JChnaXQtd3JpdGUtdHJlZSknCisJICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJyYW5jaCBCCisjIFN0YXJ0IGZyb20gTworCitybSAtcmYgW05ETUFTTFRdW05ETUFTTFRdIFogREYKK21rZGlyIFoKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkaW5nIG9yaWdpbmFsIHRyZWUgYW5kIGNoZWNraW5nIG91dCcgXAorICAgICdnaXQtcmVhZC10cmVlICR0cmVlX08gJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1hJworCit0b19yZW1vdmU9JChlY2hvID9EIFovP0QpCitybSAtZiAkdG9fcmVtb3ZlCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBCIChyZW1vdmFsKScgXAorICAgICJnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlICR0b19yZW1vdmUiCisKK2ZvciBwIGluID9NIFovP00KK2RvCisgICAgZWNobyBUaGlzIGlzIG1vZGlmaWVkICRwIGluIHRoZSBicmFuY2ggQi4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQiAobW9kaWZpY2F0aW9uKScgXAorCSJnaXQtdXBkYXRlLWluZGV4ICRwIgorZG9uZQorCitmb3IgcCBpbiBOQSBBQSBaL05BIFovQUEKK2RvCisgICAgZWNobyBUaGlzIGlzIGFkZGVkICRwIGluIHRoZSBicmFuY2ggQi4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQiAoYWRkaXRpb24pJyBcCisJImdpdC11cGRhdGUtaW5kZXggLS1hZGQgJHAiCitkb25lCitlY2hvIFRoaXMgaXMgU1MgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPlNTCitlY2hvIFRoaXMgaXMgTEwgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPkxMCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBCIChhZGRpdGlvbiBhbmQgbW9kaWZpY2F0aW9uKScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggU1MnCittdiBUVCBUVC0KK3NlZCAtZSAnL0JyYW5jaCBCL3Mvd29yZC9XT1JEL2cnIDxUVC0gPlRUCitybSAtZiBUVC0KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEIgKG1vZGlmaWNhdGlvbiknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCBUVCcKKworZWNobyBCcmFuY2ggQiBtYWtlcyBhIGZpbGUgYXQgREYuID5ERgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQiAoYWRkaXRpb24gb2YgYSBmaWxlIHRvIGNvbmZsaWN0IHdpdGggZGlyZWN0b3J5KScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIERGJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVjb3JkaW5nIGJyYW5jaCBCIHRyZWUnIFwKKyAgICAndHJlZV9CPSQoZ2l0LXdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAna2VlcCBjb250ZW50cyBvZiAzIHRyZWVzIGZvciBlYXN5IGFjY2VzcycgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfTyAmJgorICAgICBta2RpciAub3JpZy1PICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1PLyAtZiAtcSAtYSAmJgorICAgICBybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBta2RpciAub3JpZy1BICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1BLyAtZiAtcSAtYSAmJgorICAgICBybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBta2RpciAub3JpZy1CICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1CLyAtZiAtcSAtYScKZGlmZiAtLWdpdCBhL3QvdDAwMDAtYmFzaWMuc2ggYi90L3QwMDAwLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmMzM5ODkKLS0tIC9kZXYvbnVsbAorKysgYi90L3QwMDAwLWJhc2ljLnNoCkBAIC0wLDAgKzEsMjU3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgdGhlIHZlcnkgYmFzaWNzIHBhcnQgIzEuCisKK1RoZSByZXN0IG9mIHRoZSB0ZXN0IHN1aXRlIGRvZXMgbm90IGNoZWNrIHRoZSBiYXNpYyBvcGVyYXRpb24gb2YgZ2l0CitwbHVtYmluZyBjb21tYW5kcyB0byB3b3JrIHZlcnkgY2FyZWZ1bGx5LiAgVGhlaXIgam9iIGlzIHRvIGNvbmNlbnRyYXRlCitvbiB0cmlja3kgZmVhdHVyZXMgdGhhdCBjYXVzZWQgYnVncyBpbiB0aGUgcGFzdCB0byBkZXRlY3QgcmVncmVzc2lvbi4KKworVGhpcyB0ZXN0IHJ1bnMgdmVyeSBiYXNpYyBmZWF0dXJlcywgbGlrZSByZWdpc3RlcmluZyB0aGluZ3MgaW4gY2FjaGUsCit3cml0aW5nIHRyZWUsIGV0Yy4KKworTm90ZSB0aGF0IHRoaXMgdGVzdCAqZGVsaWJlcmF0ZWx5KiBoYXJkLWNvZGVzIG1hbnkgZXhwZWN0ZWQgb2JqZWN0CitJRHMuICBXaGVuIG9iamVjdCBJRCBjb21wdXRhdGlvbiBjaGFuZ2VzLCBsaWtlIGluIHRoZSBwcmV2aW91cyBjYXNlIG9mCitzd2FwcGluZyBjb21wcmVzc2lvbiBhbmQgaGFzaGluZyBvcmRlciwgdGhlIHBlcnNvbiB3aG8gaXMgbWFraW5nIHRoZQorbW9kaWZpY2F0aW9uICpzaG91bGQqIHRha2Ugbm90aWNlIGFuZCB1cGRhdGUgdGhlIHRlc3QgdmVjdG9ycyBoZXJlLgorJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEl0IGFwcGVhcnMgdGhhdCBwZW9wbGUgYXJlIGdldHRpbmcgYml0dGVuIGJ5IG5vdCBpbnN0YWxsaW5nCisjICdtZXJnZScgKHVzdWFsbHkgcGFydCBvZiBSQ1MgcGFja2FnZSBpbiBiaW5hcnkgZGlzdHJpYnV0aW9ucykKKyMgb3IgaGF2ZSB0b28gb2xkIHB5dGhvbiB3aXRob3V0IHN1YnByb2Nlc3MuICBDaGVjayB0aGVtIGFuZCBlcnJvcgorIyBvdXQgYmVmb3JlIHJ1bm5pbmcgYW55IHRlc3RzLiAgQWxzbyBjYXRjaCB0aGUgYm9nb3NpdHkgb2YgdHJ5aW5nCisjIHRvIHJ1biB0ZXN0cyB3aXRob3V0IGJ1aWxkaW5nIHdoaWxlIHdlIGFyZSBhdCBpdC4KKworLi4vZ2l0ID4vZGV2L251bGwKK2lmIHRlc3QgJD8gIT0gMQordGhlbgorCWVjaG8gPiYyICdZb3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBidWlsdCBnaXQgeWV0LicKKwlleGl0IDEKK2ZpCisKK21lcmdlID4vZGV2L251bGwgMj4vZGV2L251bGwKK2lmIHRlc3QgJD8gPSAxMjcKK3RoZW4KKwllY2hvID4mMiAnWW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgIm1lcmdlIiBpbnN0YWxsZWQuCitQbGVhc2UgY2hlY2sgSU5TVEFMTCBkb2N1bWVudC4nCisJZXhpdCAxCitmaQorCisuIC4vdGVzdC1saWIuc2gKKwordGVzdCAiJG5vX3B5dGhvbiIgfHwgIiRQWVRIT04iIC1jICdpbXBvcnQgc3VicHJvY2VzcycgfHwgeworCWVjaG8gPiYyICdZb3VyIHB5dGhvbiBzZWVtIHRvIGxhY2sgInN1YnByb2Nlc3MiIG1vZHVsZS4KK1BsZWFzZSBjaGVjayBJTlNUQUxMIGRvY3VtZW50LicKKwlleGl0IDEKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpbml0LWRiIGhhcyBiZWVuIGRvbmUgaW4gYW4gZW1wdHkgcmVwb3NpdG9yeS4KKyMgbWFrZSBzdXJlIGl0IGlzIGVtcHR5LgorCitmaW5kIC5naXQvb2JqZWN0cyAtdHlwZSBmIC1wcmludCA+c2hvdWxkLWJlLWVtcHR5Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnLmdpdC9vYmplY3RzIHNob3VsZCBiZSBlbXB0eSBhZnRlciBnaXQtaW5pdC1kYiBpbiBhbiBlbXB0eSByZXBvLicgXAorICAgICdjbXAgLXMgL2Rldi9udWxsIHNob3VsZC1iZS1lbXB0eScgCisKKyMgYWxzbyBpdCBzaG91bGQgaGF2ZSAyIHN1YmRpcmVjdG9yaWVzOyBubyBmYW4tb3V0IGFueW1vcmUsIHBhY2ssIGFuZCBpbmZvLgorIyAzIGlzIGNvdW50aW5nICJvYmplY3RzIiBpdHNlbGYKK2ZpbmQgLmdpdC9vYmplY3RzIC10eXBlIGQgLXByaW50ID5mdWxsLW9mLWRpcmVjdG9yaWVzCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnLmdpdC9vYmplY3RzIHNob3VsZCBoYXZlIDMgc3ViZGlyZWN0b3JpZXMuJyBcCisgICAgJ3Rlc3QgJCh3YyAtbCA8IGZ1bGwtb2YtZGlyZWN0b3JpZXMpID0gMycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCYXNpY3Mgb2YgdGhlIGJhc2ljcworCisjIHVwZGF0aW5nIGEgbmV3IGZpbGUgd2l0aG91dCAtLWFkZCBzaG91bGQgZmFpbC4KK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IHdpdGhvdXQgLS1hZGQgc2hvdWxkIGZhaWwgYWRkaW5nLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IHNob3VsZC1iZS1lbXB0eScKKworIyBhbmQgd2l0aCAtLWFkZCBpdCBzaG91bGQgc3VjY2VlZCwgZXZlbiBpZiBpdCBpcyBlbXB0eSAoaXQgdXNlZCB0byBmYWlsKS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IHdpdGggLS1hZGQgc2hvdWxkIHN1Y2NlZWQuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgc2hvdWxkLWJlLWVtcHR5JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdC13cml0ZS10cmVlJyBcCisgICAgJ3RyZWU9JChnaXQtd3JpdGUtdHJlZSknCisKKyMgd2Uga25vdyB0aGUgc2hhcGUgYW5kIGNvbnRlbnRzIG9mIHRoZSB0cmVlIGFuZCBrbm93IHRoZSBvYmplY3QgSUQgZm9yIGl0LgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBvZiBhIGtub3duIHRyZWUuJyBcCisgICAgJ3Rlc3QgIiR0cmVlIiA9IDdiYjk0MzU1OWEzMDViZGQ2YmRlZTJjZWY2ZTVkZjI0MTNjM2QzMGEnCisKKyMgUmVtb3ZpbmcgcGF0aHMuCitybSAtZiBzaG91bGQtYmUtZW1wdHkgZnVsbC1vZi1kaXJlY3RvcmllcwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggd2l0aG91dCAtLXJlbW92ZSBzaG91bGQgZmFpbCByZW1vdmluZy4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCBzaG91bGQtYmUtZW1wdHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IHdpdGggLS1yZW1vdmUgc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlIHNob3VsZC1iZS1lbXB0eScKKworIyBFbXB0eSB0cmVlIGNhbiBiZSB3cml0dGVuIHdpdGggcmVjZW50IHdyaXRlLXRyZWUuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXdyaXRlLXRyZWUgc2hvdWxkIGJlIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgdHJlZS4nIFwKKyAgICAndHJlZT0kKGdpdC13cml0ZS10cmVlKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBvZiBhIGtub3duIHRyZWUuJyBcCisgICAgJ3Rlc3QgIiR0cmVlIiA9IDRiODI1ZGM2NDJjYjZlYjlhMDYwZTU0YmY4ZDY5Mjg4ZmJlZTQ5MDQnCisKKyMgVmFyaW91cyB0eXBlcyBvZiBvYmplY3RzCitta2RpciBwYXRoMiBwYXRoMyBwYXRoMy9zdWJwMworZm9yIHAgaW4gcGF0aDAgcGF0aDIvZmlsZTIgcGF0aDMvZmlsZTMgcGF0aDMvc3VicDMvZmlsZTMKK2RvCisgICAgZWNobyAiaGVsbG8gJHAiID4kcAorICAgIGxuIC1zICJoZWxsbyAkcCIgJHtwfXN5bQorZG9uZQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FkZGluZyB2YXJpb3VzIHR5cGVzIG9mIG9iamVjdHMgd2l0aCBnaXQtdXBkYXRlLWluZGV4IC0tYWRkLicgXAorICAgICdmaW5kIHBhdGgqICEgLXR5cGUgZCAtcHJpbnQgfCB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkJworCisjIFNob3cgdGhlbSBhbmQgc2VlIHRoYXQgbWF0Y2hlcyB3aGF0IHdlIGV4cGVjdC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzaG93aW5nIHN0YWdlIHdpdGggZ2l0LWxzLWZpbGVzIC0tc3RhZ2UnIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgZjg3MjkwZjhlYjJjYmJlYTc4NTcyMTQ0NTlhMDczOTkyN2VhYjE1NCAwCXBhdGgwCisxMjAwMDAgMTVhOTg0MzNhZTMzMTE0YjA4NWYzZWIzYmIwM2I4MzJiMzE4MGEwMSAwCXBhdGgwc3ltCisxMDA2NDQgM2ZlZmY5NDllZDAwYTYyZDlmN2FmOTdjMTVjZDhhMzA1OTVlN2FjNyAwCXBhdGgyL2ZpbGUyCisxMjAwMDAgZDhjZTE2MWFkZGM1MTczODY3YTNjM2M3MzA5MjQzODhkYWVkYmMzOCAwCXBhdGgyL2ZpbGUyc3ltCisxMDA2NDQgMGFhMzRjYWU2OGQwODc4NTc4YWQxMTljODZjYTJiNWVkNWIyODM3NiAwCXBhdGgzL2ZpbGUzCisxMjAwMDAgODU5OTEwMzk2OWI0M2FmZjdlNDMwZWZlYTc5Y2E0NjM2NDY2Nzk0ZiAwCXBhdGgzL2ZpbGUzc3ltCisxMDA2NDQgMDBmYjU5MDhjYjk3YzI1NjRhOTc4M2MwYzY0MDg3MzMzYjNiNDY0ZiAwCXBhdGgzL3N1YnAzL2ZpbGUzCisxMjAwMDAgNjY0OWExZWJlOWU5ZjFjNTUzYjY2ZjVhNmU3NDEzNmEwN2NjYzU3YyAwCXBhdGgzL3N1YnAzL2ZpbGUzc3ltCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBnaXQtbHMtZmlsZXMgb3V0cHV0IGZvciBhIGtub3duIHRyZWUuJyBcCisgICAgJ2RpZmYgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgdHJlZSBvdXQgd2l0aCBnaXQtd3JpdGUtdHJlZS4nIFwKKyAgICAndHJlZT0kKGdpdC13cml0ZS10cmVlKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvYmplY3QgSUQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAndGVzdCAiJHRyZWUiID0gMDg3NzA0YTk2YmFmMWMyZDFjODY5YThiMDg0NDgxZTEyMWM4OGI1YicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Nob3dpbmcgdHJlZSB3aXRoIGdpdC1scy10cmVlJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlID5jdXJyZW50JworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBibG9iIGY4NzI5MGY4ZWIyY2JiZWE3ODU3MjE0NDU5YTA3Mzk5MjdlYWIxNTQJcGF0aDAKKzEyMDAwMCBibG9iIDE1YTk4NDMzYWUzMzExNGIwODVmM2ViM2JiMDNiODMyYjMxODBhMDEJcGF0aDBzeW0KKzA0MDAwMCB0cmVlIDU4YTA5YzIzZTJjYTE1MjE5M2YyNzg2ZTA2OTg2YjdiNjcxMmJkYmUJcGF0aDIKKzA0MDAwMCB0cmVlIDIxYWU4MjY5Y2FjYmU1N2FlMDkxMzhkY2MzYTI4ODdmOTA0ZDAyYjMJcGF0aDMKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy10cmVlIG91dHB1dCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICdkaWZmIGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMgVGhpcyBjaGFuZ2VkIGluIGxzLXRyZWUgcGF0aHNwZWMgY2hhbmdlIC0tIHJlY3Vyc2l2ZSBkb2VzCisjIG5vdCBzaG93IHRyZWUgbm9kZXMgYW55bW9yZS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzaG93aW5nIHRyZWUgd2l0aCBnaXQtbHMtdHJlZSAtcicgXAorICAgICdnaXQtbHMtdHJlZSAtciAkdHJlZSA+Y3VycmVudCcKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgYmxvYiBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0CXBhdGgwCisxMjAwMDAgYmxvYiAxNWE5ODQzM2FlMzMxMTRiMDg1ZjNlYjNiYjAzYjgzMmIzMTgwYTAxCXBhdGgwc3ltCisxMDA2NDQgYmxvYiAzZmVmZjk0OWVkMDBhNjJkOWY3YWY5N2MxNWNkOGEzMDU5NWU3YWM3CXBhdGgyL2ZpbGUyCisxMjAwMDAgYmxvYiBkOGNlMTYxYWRkYzUxNzM4NjdhM2MzYzczMDkyNDM4OGRhZWRiYzM4CXBhdGgyL2ZpbGUyc3ltCisxMDA2NDQgYmxvYiAwYWEzNGNhZTY4ZDA4Nzg1NzhhZDExOWM4NmNhMmI1ZWQ1YjI4Mzc2CXBhdGgzL2ZpbGUzCisxMjAwMDAgYmxvYiA4NTk5MTAzOTY5YjQzYWZmN2U0MzBlZmVhNzljYTQ2MzY0NjY3OTRmCXBhdGgzL2ZpbGUzc3ltCisxMDA2NDQgYmxvYiAwMGZiNTkwOGNiOTdjMjU2NGE5NzgzYzBjNjQwODczMzNiM2I0NjRmCXBhdGgzL3N1YnAzL2ZpbGUzCisxMjAwMDAgYmxvYiA2NjQ5YTFlYmU5ZTlmMWM1NTNiNjZmNWE2ZTc0MTM2YTA3Y2NjNTdjCXBhdGgzL3N1YnAzL2ZpbGUzc3ltCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtdHJlZSAtciBvdXRwdXQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAnZGlmZiBjdXJyZW50IGV4cGVjdGVkJworCisjIEJ1dCB3aXRoIC1yIC10IHdlIGNhbiBoYXZlIGJvdGguCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2hvd2luZyB0cmVlIHdpdGggZ2l0LWxzLXRyZWUgLXIgLXQnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgLXQgJHRyZWUgPmN1cnJlbnQnCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IGJsb2IgZjg3MjkwZjhlYjJjYmJlYTc4NTcyMTQ0NTlhMDczOTkyN2VhYjE1NAlwYXRoMAorMTIwMDAwIGJsb2IgMTVhOTg0MzNhZTMzMTE0YjA4NWYzZWIzYmIwM2I4MzJiMzE4MGEwMQlwYXRoMHN5bQorMDQwMDAwIHRyZWUgNThhMDljMjNlMmNhMTUyMTkzZjI3ODZlMDY5ODZiN2I2NzEyYmRiZQlwYXRoMgorMTAwNjQ0IGJsb2IgM2ZlZmY5NDllZDAwYTYyZDlmN2FmOTdjMTVjZDhhMzA1OTVlN2FjNwlwYXRoMi9maWxlMgorMTIwMDAwIGJsb2IgZDhjZTE2MWFkZGM1MTczODY3YTNjM2M3MzA5MjQzODhkYWVkYmMzOAlwYXRoMi9maWxlMnN5bQorMDQwMDAwIHRyZWUgMjFhZTgyNjljYWNiZTU3YWUwOTEzOGRjYzNhMjg4N2Y5MDRkMDJiMwlwYXRoMworMTAwNjQ0IGJsb2IgMGFhMzRjYWU2OGQwODc4NTc4YWQxMTljODZjYTJiNWVkNWIyODM3NglwYXRoMy9maWxlMworMTIwMDAwIGJsb2IgODU5OTEwMzk2OWI0M2FmZjdlNDMwZWZlYTc5Y2E0NjM2NDY2Nzk0ZglwYXRoMy9maWxlM3N5bQorMDQwMDAwIHRyZWUgM2M1ZTUzOTlmM2EzMzNlZGRlY2NlN2E5Yjk0NjViNjNmNjVmNTFlMglwYXRoMy9zdWJwMworMTAwNjQ0IGJsb2IgMDBmYjU5MDhjYjk3YzI1NjRhOTc4M2MwYzY0MDg3MzMzYjNiNDY0ZglwYXRoMy9zdWJwMy9maWxlMworMTIwMDAwIGJsb2IgNjY0OWExZWJlOWU5ZjFjNTUzYjY2ZjVhNmU3NDEzNmEwN2NjYzU3YwlwYXRoMy9zdWJwMy9maWxlM3N5bQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgb3V0cHV0IGZvciBhIGtub3duIHRyZWUuJyBcCisgICAgJ2RpZmYgY3VycmVudCBleHBlY3RlZCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcm0gLmdpdC9pbmRleAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1yZWFkLXRyZWUgZm9sbG93ZWQgYnkgd3JpdGUtdHJlZSBzaG91bGQgYmUgaWRlbXBvdGVudC4nIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAkdHJlZSAmJgorICAgICB0ZXN0IC1mIC5naXQvaW5kZXggJiYKKyAgICAgbmV3dHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgICB0ZXN0ICIkbmV3dHJlZSIgPSAiJHRyZWUiJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgZjg3MjkwZjhlYjJjYmJlYTc4NTcyMTQ0NTlhMDczOTkyN2VhYjE1NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDAKKzoxMjAwMDAgMTIwMDAwIDE1YTk4NDMzYWUzMzExNGIwODVmM2ViM2JiMDNiODMyYjMxODBhMDEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgwc3ltCis6MTAwNjQ0IDEwMDY0NCAzZmVmZjk0OWVkMDBhNjJkOWY3YWY5N2MxNWNkOGEzMDU5NWU3YWM3IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMi9maWxlMgorOjEyMDAwMCAxMjAwMDAgZDhjZTE2MWFkZGM1MTczODY3YTNjM2M3MzA5MjQzODhkYWVkYmMzOCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDIvZmlsZTJzeW0KKzoxMDA2NDQgMTAwNjQ0IDBhYTM0Y2FlNjhkMDg3ODU3OGFkMTE5Yzg2Y2EyYjVlZDViMjgzNzYgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgzL2ZpbGUzCis6MTIwMDAwIDEyMDAwMCA4NTk5MTAzOTY5YjQzYWZmN2U0MzBlZmVhNzljYTQ2MzY0NjY3OTRmIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMy9maWxlM3N5bQorOjEwMDY0NCAxMDA2NDQgMDBmYjU5MDhjYjk3YzI1NjRhOTc4M2MwYzY0MDg3MzMzYjNiNDY0ZiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDMvc3VicDMvZmlsZTMKKzoxMjAwMDAgMTIwMDAwIDY2NDlhMWViZTllOWYxYzU1M2I2NmY1YTZlNzQxMzZhMDdjY2M1N2MgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgzL3N1YnAzL2ZpbGUzc3ltCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBnaXQtZGlmZi1maWxlcyBvdXRwdXQgZm9yIGEga25vdyBjYWNoZS93b3JrIHRyZWUgc3RhdGUuJyBcCisgICAgJ2dpdC1kaWZmLWZpbGVzID5jdXJyZW50ICYmIGRpZmYgPi9kZXYvbnVsbCAtYiBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggc2hvdWxkIHN1Y2NlZWQuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm8gZGlmZiBhZnRlciBjaGVja291dCBhbmQgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2guJyBcCisgICAgJ2dpdC1kaWZmLWZpbGVzID5jdXJyZW50ICYmIGNtcCAtcyBjdXJyZW50IC9kZXYvbnVsbCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworUD0wODc3MDRhOTZiYWYxYzJkMWM4NjlhOGIwODQ0ODFlMTIxYzg4YjViCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWNvbW1pdC10cmVlIHJlY29yZHMgdGhlIGNvcnJlY3QgdHJlZSBpbiBhIGNvbW1pdC4nIFwKKyAgICAnY29tbWl0MD0kKGVjaG8gTk8gfCBnaXQtY29tbWl0LXRyZWUgJFApICYmCisgICAgIHRyZWU9JChnaXQgc2hvdyAtLXByZXR0eT1yYXcgJGNvbW1pdDAgfAorCSBzZWQgLW4gLWUgInMvXnRyZWUgLy9wIiAtZSAiL15hdXRob3IgL3EiKSAmJgorICAgICB0ZXN0ICJ6JHRyZWUiID0gInokUCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtY29tbWl0LXRyZWUgcmVjb3JkcyB0aGUgY29ycmVjdCBwYXJlbnQgaW4gYSBjb21taXQuJyBcCisgICAgJ2NvbW1pdDE9JChlY2hvIE5PIHwgZ2l0LWNvbW1pdC10cmVlICRQIC1wICRjb21taXQwKSAmJgorICAgICBwYXJlbnQ9JChnaXQgc2hvdyAtLXByZXR0eT1yYXcgJGNvbW1pdDEgfAorCSBzZWQgLW4gLWUgInMvXnBhcmVudCAvL3AiIC1lICIvXmF1dGhvciAvcSIpICYmCisgICAgIHRlc3QgInokY29tbWl0MCIgPSAieiRwYXJlbnQiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWNvbW1pdC10cmVlIG9taXRzIGR1cGxpY2F0ZWQgcGFyZW50IGluIGEgY29tbWl0LicgXAorICAgICdjb21taXQyPSQoZWNobyBOTyB8IGdpdC1jb21taXQtdHJlZSAkUCAtcCAkY29tbWl0MCAtcCAkY29tbWl0MCkgJiYKKyAgICAgcGFyZW50PSQoZ2l0IHNob3cgLS1wcmV0dHk9cmF3ICRjb21taXQyIHwKKwkgc2VkIC1uIC1lICJzL15wYXJlbnQgLy9wIiAtZSAiL15hdXRob3IgL3EiIHwKKwkgc29ydCAtdSkgJiYKKyAgICAgdGVzdCAieiRjb21taXQwIiA9ICJ6JHBhcmVudCIgJiYKKyAgICAgbnVtcGFyZW50PSQoZ2l0IHNob3cgLS1wcmV0dHk9cmF3ICRjb21taXQyIHwKKwkgc2VkIC1uIC1lICJzL15wYXJlbnQgLy9wIiAtZSAiL15hdXRob3IgL3EiIHwKKwkgd2MgLWwpICYmCisgICAgIHRlc3QgJG51bXBhcmVudCA9IDEnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MDAxMC1yYWN5LWdpdC5zaCBiL3QvdDAwMTAtcmFjeS1naXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTQ1YTllNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDAwMTAtcmFjeS1naXQuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3JhY3kgR0lUJworCisuIC4vdGVzdC1saWIuc2gKKworIyBUaGlzIHRlc3QgY2FuIGdpdmUgZmFsc2Ugc3VjY2VzcyBpZiB5b3VyIG1hY2hpbmUgaXMgc3VmZmljaWVudGx5CisjIHNsb3cgb3IgeW91ciB0cmlhbCBoYXBwZW5lZCB0byBoYXBwZW4gb24gc2Vjb25kIGJvdW5kYXJ5LgorCitmb3IgdHJpYWwgaW4gMCAxIDIgMyA0CitkbworCXJtIC1mIC5naXQvaW5kZXgKKwllY2hvIGZyb3R6ID5pbmZvY29tCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBpbmZvY29tCisJZWNobyB4eXp6eSA+aW5mb2NvbQorCisJZmlsZXM9YGdpdCBkaWZmLWZpbGVzIC1wYAorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJSYWN5IEdJVCB0cmlhbCAjJHRyaWFsIHBhcnQgQSIgXAorCSd0ZXN0ICIiICE9ICIkZmlsZXMiJworCisJc2xlZXAgMQorCWVjaG8geHl6enkgPmNvcm5lcnN0b25lCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBjb3JuZXJzdG9uZQorCisJZmlsZXM9YGdpdCBkaWZmLWZpbGVzIC1wYAorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJSYWN5IEdJVCB0cmlhbCAjJHRyaWFsIHBhcnQgQiIgXAorCSd0ZXN0ICIiICE9ICIkZmlsZXMiJworCitkb25lCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoIGIvdC90MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwYWY4YzMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDAwLXJlYWQtdHJlZS1tLTN3YXkuc2gKQEAgLTAsMCArMSw1MTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGhyZWUgd2F5IG1lcmdlIHdpdGggcmVhZC10cmVlIC1tCisKK1RoaXMgdGVzdCB0cmllcyB0aHJlZS13YXkgbWVyZ2Ugd2l0aCByZWFkLXRyZWUgLW0KKworVGhlcmUgaXMgb25lIGFuY2VzdG9yIChjYWxsZWQgTyBmb3IgT3JpZ2luYWwpIGFuZCB0d28gYnJhbmNoZXMgQQorYW5kIEIgZGVyaXZlZCBmcm9tIGl0LiAgV2Ugd2FudCB0byBkbyBhIDMtd2F5IG1lcmdlIGJldHdlZW4gQSBhbmQKK0IsIHVzaW5nIE8gYXMgdGhlIGNvbW1vbiBhbmNlc3Rvci4KKworICAgIG1lcmdlIEEgTyBCCisKK0RlY2lzaW9ucyBhcmUgbWFkZSBieSBjb21wYXJpbmcgY29udGVudHMgb2YgTywgQSBhbmQgQiBwYXRobmFtZQorYnkgcGF0aG5hbWUuICBUaGUgcmVzdWx0IGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyBndWlkaW5nCitwcmluY2lwbGU6CisKKyAtIElmIG9ubHkgQSBkb2VzIHNvbWV0aGluZyB0byBpdCBhbmQgQiBkb2VzIG5vdCB0b3VjaCBpdCwgdGFrZQorICAgd2hhdGV2ZXIgQSBkb2VzLgorCisgLSBJZiBvbmx5IEIgZG9lcyBzb21ldGhpbmcgdG8gaXQgYW5kIEEgZG9lcyBub3QgdG91Y2ggaXQsIHRha2UKKyAgIHdoYXRldmVyIEIgZG9lcy4KKworIC0gSWYgYm90aCBBIGFuZCBCIGRvZXMgc29tZXRoaW5nIGJ1dCBpbiB0aGUgc2FtZSB3YXksIHRha2UKKyAgIHdoYXRldmVyIHRoZXkgZG8uCisKKyAtIElmIEEgYW5kIEIgZG9lcyBzb21ldGhpbmcgYnV0IGRpZmZlcmVudCB0aGluZ3MsIHdlIG5lZWQgYQorICAgMy13YXkgbWVyZ2U6CisKKyAgIC0gV2UgY2Fubm90IGRvIGFueXRoaW5nIGFib3V0IHRoZSBmb2xsb3dpbmcgY2FzZXM6CisKKyAgICAgKiBPIGRvZXMgbm90IGhhdmUgaXQuICBBIGFuZCBCIGJvdGggbXVzdCBiZSBhZGRpbmcgdG8gdGhlCisgICAgICAgc2FtZSBwYXRoIGluZGVwZW5kZW50bHkuCisKKyAgICAgKiBBIGRlbGV0ZXMgaXQuICBCIG11c3QgYmUgbW9kaWZ5aW5nLgorCisgICAtIE90aGVyd2lzZSwgQSBhbmQgQiBhcmUgbW9kaWZ5aW5nLiAgUnVuIDMtd2F5IG1lcmdlLgorCitGaXJzdCwgdGhlIGNhc2UgbWF0cml4LgorCisgLSBWZXJ0aWNhbCBheGlzIGlzIGZvciBBJ1wnJ3MgYWN0aW9ucy4KKyAtIEhvcml6b250YWwgYXhpcyBpcyBmb3IgQidcJydzIGFjdGlvbnMuCisKKy4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBBICAgICAgICBCIHwgTm8gQWN0aW9uICB8ICAgRGVsZXRlICAgfCAgIE1vZGlmeSAgIHwgICAgQWRkICAgICB8Cit8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLXwKK3wgTm8gQWN0aW9uICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfAorfCAgICAgICAgICAgIHwgc2VsZWN0IE8gICB8IGRlbGV0ZSAgICAgfCBzZWxlY3QgQiAgIHwgc2VsZWN0IEIgICB8Cit8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwKK3wtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tfAorfCBEZWxldGUgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAqKioqKioqKioqIHwgICAgY2FuICAgICB8Cit8ICAgICAgICAgICAgfCBkZWxldGUgICAgIHwgZGVsZXRlICAgICB8IG1lcmdlICAgICAgfCAgICBub3QgICAgIHwKK3wgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICBoYXBwZW4gICAgfAorfC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS18Cit8IE1vZGlmeSAgICAgfCAgICAgICAgICAgIHwgKioqKioqKioqKiB8ID8/Pz8/Pz8/Pz8gfCAgICBjYW4gICAgIHwKK3wgICAgICAgICAgICB8IHNlbGVjdCBBICAgfCBtZXJnZSAgICAgIHwgc2VsZWN0IEE9QiB8ICAgIG5vdCAgICAgfAorfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCBtZXJnZSAgICAgIHwgIGhhcHBlbiAgICB8Cit8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLXwKK3wgQWRkICAgICAgICB8ICAgICAgICAgICAgfCAgICBjYW4gICAgIHwgICAgY2FuICAgICB8ID8/Pz8/Pz8/Pz8gfAorfCAgICAgICAgICAgIHwgc2VsZWN0IEEgICB8ICAgIG5vdCAgICAgfCAgICBub3QgICAgIHwgc2VsZWN0IEE9QiB8Cit8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgIGhhcHBlbiAgICB8ICBoYXBwZW4gICAgfCBtZXJnZSAgICAgIHwKKy4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorCitJbiBhZGRpdGlvbjoKKworIFNTOiBhIHNwZWNpYWwgY2FzZSBvZiBNTSwgd2hlcmUgQSBhbmQgQiBtYWtlcyB0aGUgc2FtZSBtb2RpZmljYXRpb24uCisgTEw6IGEgc3BlY2lhbCBjYXNlIG9mIEFBLCB3aGVyZSBBIGFuZCBCIGNyZWF0ZXMgdGhlIHNhbWUgZmlsZS4KKyBUVDogYSBzcGVjaWFsIGNhc2Ugb2YgTU0sIHdoZXJlIEEgYW5kIEIgbWFrZXMgbWVyZ2VhYmxlIGNoYW5nZXMuCisgREY6IGEgc3BlY2lhbCBjYXNlLCB3aGVyZSBBIG1ha2VzIGEgZGlyZWN0b3J5IGFuZCBCIG1ha2VzIGEgZmlsZS4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHJpdmlhbCAibWFqb3JpdHkgd2hlbiAzIHN0YWdlcyBleGlzdCIgbWVyZ2UgcGx1cyAjMkFMVCwgIzNBTFQKKyMgYW5kICM1QUxUIHRyaXZpYWwgbWVyZ2VzLgorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IFggMglBQQorMTAwNjQ0IFggMwlBQQorMTAwNjQ0IFggMAlBTgorMTAwNjQ0IFggMQlERAorMTAwNjQ0IFggMwlERgorMTAwNjQ0IFggMglERi9ERgorMTAwNjQ0IFggMQlETQorMTAwNjQ0IFggMwlETQorMTAwNjQ0IFggMQlETgorMTAwNjQ0IFggMwlETgorMTAwNjQ0IFggMAlMTAorMTAwNjQ0IFggMQlNRAorMTAwNjQ0IFggMglNRAorMTAwNjQ0IFggMQlNTQorMTAwNjQ0IFggMglNTQorMTAwNjQ0IFggMwlNTQorMTAwNjQ0IFggMAlNTgorMTAwNjQ0IFggMAlOQQorMTAwNjQ0IFggMQlORAorMTAwNjQ0IFggMglORAorMTAwNjQ0IFggMAlOTQorMTAwNjQ0IFggMAlOTgorMTAwNjQ0IFggMAlTUworMTAwNjQ0IFggMQlUVAorMTAwNjQ0IFggMglUVAorMTAwNjQ0IFggMwlUVAorMTAwNjQ0IFggMglaL0FBCisxMDA2NDQgWCAzCVovQUEKKzEwMDY0NCBYIDAJWi9BTgorMTAwNjQ0IFggMQlaL0RECisxMDA2NDQgWCAxCVovRE0KKzEwMDY0NCBYIDMJWi9ETQorMTAwNjQ0IFggMQlaL0ROCisxMDA2NDQgWCAzCVovRE4KKzEwMDY0NCBYIDEJWi9NRAorMTAwNjQ0IFggMglaL01ECisxMDA2NDQgWCAxCVovTU0KKzEwMDY0NCBYIDIJWi9NTQorMTAwNjQ0IFggMwlaL01NCisxMDA2NDQgWCAwCVovTU4KKzEwMDY0NCBYIDAJWi9OQQorMTAwNjQ0IFggMQlaL05ECisxMDA2NDQgWCAyCVovTkQKKzEwMDY0NCBYIDAJWi9OTQorMTAwNjQ0IFggMAlaL05OCitFT0YKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCisKK2NoZWNrX3Jlc3VsdCAoKSB7CisgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgfCBzZWQgLWUgJ3MvICciJF94NDAiJyAvIFggLycgPmN1cnJlbnQgJiYKKyAgICBkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQKK30KKworIyBUaGlzIGlzIGRvbmUgb24gYW4gZW1wdHkgd29yayBkaXJlY3RvcnksIHdoaWNoIGlzIHRoZSBub3JtYWwKKyMgbWVyZ2UgcGVyc29uIGJlaGF2aW91ci4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICczLXdheSBtZXJnZSB3aXRoIGdpdC1yZWFkLXRyZWUgLW0sIGVtcHR5IGNhY2hlJyBcCisgICAgInJtIC1mciBbTkRNQUxUU11bTkRNQUxUU0ZdIFogJiYKKyAgICAgcm0gLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKworIyBUaGlzIHN0YXJ0cyBvdXQgd2l0aCB0aGUgZmlyc3QgaGVhZCwgd2hpY2ggaXMgdGhlIG5vcm1hbAorIyBwYXRjaCBzdWJtaXR0ZXIgYmVoYXZpb3VyLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzMtd2F5IG1lcmdlIHdpdGggZ2l0LXJlYWQtdHJlZSAtbSwgbWF0Y2ggSCcgXAorICAgICJybSAtZnIgW05ETUFMVFNdW05ETUFMVFNGXSBaICYmCisgICAgIHJtIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZV9BICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAtYSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKworOiA8PFxFTkRfT0ZfQ0FTRV9UQUJMRQorCitXZSBoYXZlIHNvIGZhciB0ZXN0ZWQgb25seSBlbXB0eSBpbmRleCBhbmQgY2xlYW4tYW5kLW1hdGNoaW5nLUEgaW5kZXgKK2Nhc2Ugd2hpY2ggYXJlIHRyaXZpYWwuICBNYWtlIHN1cmUgaW5kZXggcmVxdWlyZW1lbnRzIGFyZSBhbHNvCitjaGVja2VkLgorCisiZ2l0LXJlYWQtdHJlZSAtbSBPIEEgQiIKKworICAgICBPICAgICAgIEEgICAgICAgQiAgICAgICAgIHJlc3VsdCAgICAgIGluZGV4IHJlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAxICBtaXNzaW5nIG1pc3NpbmcgbWlzc2luZyAgIC0gICAgICAgICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAyICBtaXNzaW5nIG1pc3NpbmcgZXhpc3RzICAgIHRha2UgQiogICAgIG11c3QgbWF0Y2ggQiwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAzICBtaXNzaW5nIGV4aXN0cyAgbWlzc2luZyAgIHRha2UgQSogICAgIG11c3QgbWF0Y2ggQSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA0ICBtaXNzaW5nIGV4aXN0cyAgQSE9QiAgICAgIG5vIG1lcmdlICAgIG11c3QgbWF0Y2ggQSBhbmQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cC10by1kYXRlLCBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDUgIG1pc3NpbmcgZXhpc3RzICBBPT1CICAgICAgdGFrZSBBICAgICAgbXVzdCBtYXRjaCBBLCBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDYgIGV4aXN0cyAgbWlzc2luZyBtaXNzaW5nICAgcmVtb3ZlICAgICAgbXVzdCBub3QgZXhpc3QuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDcgIGV4aXN0cyAgbWlzc2luZyBPIT1CICAgICAgbm8gbWVyZ2UgICAgbXVzdCBub3QgZXhpc3QuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDggIGV4aXN0cyAgbWlzc2luZyBPPT1CICAgICAgcmVtb3ZlICAgICAgbXVzdCBub3QgZXhpc3QuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDkgIGV4aXN0cyAgTyE9QSAgICBtaXNzaW5nICAgbm8gbWVyZ2UgICAgbXVzdCBtYXRjaCBBIGFuZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwLXRvLWRhdGUsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxMCAgZXhpc3RzICBPPT1BICAgIG1pc3NpbmcgICByZW1vdmUgICAgICBkaXR0bworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDExICBleGlzdHMgIE8hPUEgICAgTyE9QiAgICAgIG5vIG1lcmdlICAgIG11c3QgbWF0Y2ggQSBhbmQgYmUKKyAgICAgICAgICAgICAgICAgICAgIEEhPUIgICAgICAgICAgICAgICAgICB1cC10by1kYXRlLCBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTIgIGV4aXN0cyAgTyE9QSAgICBPIT1CICAgICAgdGFrZSBBICAgICAgbXVzdCBtYXRjaCBBLCBpZiBleGlzdHMuCisgICAgICAgICAgICAgICAgICAgICBBPT1CCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTMgIGV4aXN0cyAgTyE9QSAgICBPPT1CICAgICAgdGFrZSBBICAgICAgbXVzdCBtYXRjaCBBLCBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTQgIGV4aXN0cyAgTz09QSAgICBPIT1CICAgICAgdGFrZSBCICAgICAgaWYgZXhpc3RzLCBtdXN0IGVpdGhlciAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBBIGFuZCBiZSB1cC10by1kYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICgyKSBtYXRjaCBCLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDE1ICBleGlzdHMgIE89PUEgICAgTz09QiAgICAgIHRha2UgQiAgICAgIG11c3QgbWF0Y2ggQSBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTYgIGV4aXN0cyAgTz09QSAgICBPPT1CICAgICAgYmFyZiAgICAgICAgbXVzdCBtYXRjaCBBIGlmIGV4aXN0cy4KKyAgICAgKm11bHRpKiBpbiBvbmUgIGluIGFub3RoZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZTogd2UgbmVlZCB0byBiZSBjYXJlZnVsIGluIGNhc2UgMiBhbmQgMy4gIFRoZSB0cmVlIEEgbWF5IGNvbnRhaW4KK0RGIChmaWxlKSB3aGVuIHRyZWUgQiByZXF1aXJlIERGIHRvIGJlIGEgZGlyZWN0b3J5IGJ5IGhhdmluZyBERi9ERgorKGZpbGUpLgorCitFTkRfT0ZfQ0FTRV9UQUJMRQorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMSAtIG11c3Qgbm90IGhhdmUgYW4gZW50cnkgbm90IGluIEEuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggWFggJiYKKyAgICAgZWNobyBYWCA+WFggJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBYWCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMiAtIG11c3QgbWF0Y2ggQiBpbiAhTyAmJiAhQSAmJiBCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkEgJiYKKyAgICAgY3AgLm9yaWctQi9OQSBOQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5BICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyIC0gbWF0Y2hpbmcgQiBhbG9uZSBpcyBPSyBpbiAhTyAmJiAhQSAmJiBCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkEgJiYKKyAgICAgY3AgLm9yaWctQi9OQSBOQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5BICYmCisgICAgIGVjaG8gZXh0cmEgPj5OQSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMyAtIG11c3QgbWF0Y2ggQSBpbiAhTyAmJiBBICYmICFCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQU4gJiYKKyAgICAgY3AgLm9yaWctQS9BTiBBTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEFOICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMyAtIG1hdGNoaW5nIEEgYWxvbmUgaXMgT0sgaW4gIU8gJiYgQSAmJiAhQiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEFOICYmCisgICAgIGNwIC5vcmlnLUEvQU4gQU4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBTiAmJgorICAgICBlY2hvIGV4dHJhID4+QU4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzMgKGZhaWwpIC0gbXVzdCBtYXRjaCBBIGluICFPICYmIEEgJiYgIUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBBTiAmJgorICAgICBjcCAub3JpZy1BL0FOIEFOICYmCisgICAgIGVjaG8gZXh0cmEgPj5BTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEFOICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc0IC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiAhTyAmJiBBICYmIEIgJiYgQSE9QiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEFBICYmCisgICAgIGNwIC5vcmlnLUEvQUEgQUEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBQSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzQgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiAhTyAmJiBBICYmIEIgJiYgQSE9QiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEFBICYmCisgICAgIGNwIC5vcmlnLUEvQUEgQUEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBQSAmJgorICAgICBlY2hvIGV4dHJhID4+QUEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzQgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiAhTyAmJiBBICYmIEIgJiYgQSE9QiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEFBICYmCisgICAgIGNwIC5vcmlnLUEvQUEgQUEgJiYKKyAgICAgZWNobyBleHRyYSA+PkFBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQUEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzUgLSBtdXN0IG1hdGNoIGluICFPICYmIEEgJiYgQiAmJiBBPT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTEwgJiYKKyAgICAgY3AgLm9yaWctQS9MTCBMTCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNSAtIG11c3QgbWF0Y2ggaW4gIU8gJiYgQSAmJiBCICYmIEE9PUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBMTCAmJgorICAgICBjcCAub3JpZy1BL0xMIExMICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTEwgJiYKKyAgICAgZWNobyBleHRyYSA+PkxMICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnNSAoZmFpbCkgLSBtdXN0IG1hdGNoIEEgaW4gIU8gJiYgQSAmJiBCICYmIEE9PUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBMTCAmJgorICAgICBjcCAub3JpZy1BL0xMIExMICYmCisgICAgIGVjaG8gZXh0cmEgPj5MTCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc2IC0gbXVzdCBub3QgZXhpc3QgaW4gTyAmJiAhQSAmJiAhQiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggREQgJiYKKyAgICAgZWNobyBERCA+REQKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnNyAtIG11c3Qgbm90IGV4aXN0IGluIE8gJiYgIUEgJiYgQiAmJiBPIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBETSAmJgorICAgICBjcCAub3JpZy1CL0RNIERNICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgRE0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzggLSBtdXN0IG5vdCBleGlzdCBpbiBPICYmICFBICYmIEIgJiYgTz09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggRE4gJiYKKyAgICAgY3AgLm9yaWctQi9ETiBETiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEROICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc5IC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTyE9QSBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTUQgJiYKKyAgICAgY3AgLm9yaWctQS9NRCBNRCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1EICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnOSAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPIT1BIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNRCAmJgorICAgICBjcCAub3JpZy1BL01EIE1EICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTUQgJiYKKyAgICAgZWNobyBleHRyYSA+Pk1EICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc5IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmICFCICYmIE8hPUEgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1EICYmCisgICAgIGNwIC5vcmlnLUEvTUQgTUQgJiYKKyAgICAgZWNobyBleHRyYSA+Pk1EICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTUQgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEwIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTz09QSBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkQgJiYKKyAgICAgY3AgLm9yaWctQS9ORCBORCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5EICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTAgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTz09QSBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkQgJiYKKyAgICAgY3AgLm9yaWctQS9ORCBORCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5EICYmCisgICAgIGVjaG8gZXh0cmEgPj5ORCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTAgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTz09QSBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkQgJiYKKyAgICAgY3AgLm9yaWctQS9ORCBORCAmJgorICAgICBlY2hvIGV4dHJhID4+TkQgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBORCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTEgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgTyE9QiAmJiBBIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNTSAmJgorICAgICBjcCAub3JpZy1BL01NIE1NICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTU0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxMSAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgTyE9QiAmJiBBIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNTSAmJgorICAgICBjcCAub3JpZy1BL01NIE1NICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTU0gJiYKKyAgICAgZWNobyBleHRyYSA+Pk1NICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxMSAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgTyE9QiAmJiBBIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNTSAmJgorICAgICBjcCAub3JpZy1BL01NIE1NICYmCisgICAgIGVjaG8gZXh0cmEgPj5NTSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1NICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMiAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIEE9PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IFNTICYmCisgICAgIGNwIC5vcmlnLUEvU1MgU1MgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBTUyAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEyIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgQT09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggU1MgJiYKKyAgICAgY3AgLm9yaWctQS9TUyBTUyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIFNTICYmCisgICAgIGVjaG8gZXh0cmEgPj5TUyAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzEyIChmYWlsKSAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIEE9PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IFNTICYmCisgICAgIGNwIC5vcmlnLUEvU1MgU1MgJiYKKyAgICAgZWNobyBleHRyYSA+PlNTICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgU1MgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEzIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgTz09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTU4gJiYKKyAgICAgY3AgLm9yaWctQS9NTiBNTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1OICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTMgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBPPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNTiAmJgorICAgICBjcCAub3JpZy1BL01OIE1OICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTU4gJiYKKyAgICAgZWNobyBleHRyYSA+Pk1OICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTQgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiBCICYmIE89PUEgJiYgTyE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTk0gJiYKKyAgICAgY3AgLm9yaWctQS9OTSBOTSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5NICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTQgLSBtYXkgbWF0Y2ggQiBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE8hPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5NICYmCisgICAgIGNwIC5vcmlnLUIvTk0gTk0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOTSAmJgorICAgICBlY2hvIGV4dHJhID4+Tk0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxNCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiBCICYmIE89PUEgJiYgTyE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTk0gJiYKKyAgICAgY3AgLm9yaWctQS9OTSBOTSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5NICYmCisgICAgIGVjaG8gZXh0cmEgPj5OTSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTQgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE8hPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5NICYmCisgICAgIGNwIC5vcmlnLUEvTk0gTk0gJiYKKyAgICAgZWNobyBleHRyYSA+Pk5NICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTk0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE1IC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE89PUEgJiYgTz09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTk4gJiYKKyAgICAgY3AgLm9yaWctQS9OTiBOTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5OICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTUgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTiAmJgorICAgICBjcCAub3JpZy1BL05OIE5OICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTk4gJiYKKyAgICAgZWNobyBleHRyYSA+Pk5OICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTUgKGZhaWwpIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE89PUEgJiYgTz09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTk4gJiYKKyAgICAgY3AgLm9yaWctQS9OTiBOTiAmJgorICAgICBlY2hvIGV4dHJhID4+Tk4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCisjICMxNgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE2IC0gQSBtYXRjaGVzIGluIG9uZSBhbmQgQiBtYXRjaGVzIGluIGFub3RoZXIuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggRjE2ICYmCisgICAgZWNobyBGMTYgPkYxNiAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgRjE2ICYmCisgICAgdHJlZTA9YGdpdC13cml0ZS10cmVlYCAmJgorICAgIGVjaG8gRTE2ID5GMTYgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IEYxNiAmJgorICAgIHRyZWUxPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlMCAkdHJlZTEgJHRyZWUxICR0cmVlMCAmJgorICAgIGdpdC1scy1maWxlcyAtLXN0YWdlJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEwMDEtcmVhZC10cmVlLW0tMndheS5zaCBiL3QvdDEwMDEtcmVhZC10cmVlLW0tMndheS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NWU0YzlhCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTAwMS1yZWFkLXRyZWUtbS0yd2F5LnNoCkBAIC0wLDAgKzEsMzQ0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1R3byB3YXkgbWVyZ2Ugd2l0aCByZWFkLXRyZWUgLW0gJEggJE0KKworVGhpcyB0ZXN0IHRyaWVzIHR3by13YXkgbWVyZ2UgKGFrYSBmYXN0IGZvcndhcmQgd2l0aCBjYXJyeSBmb3J3YXJkKS4KKworVGhlcmUgaXMgdGhlIGhlYWQgKGNhbGxlZCBIKSBhbmQgYW5vdGhlciBjb21taXQgKGNhbGxlZCBNKSwgd2hpY2ggaXMKK3NpbXBseSBhaGVhZCBvZiBILiAgVGhlIGluZGV4IGFuZCB0aGUgd29yayB0cmVlIGNvbnRhaW5zIGEgc3RhdGUgdGhhdAoraXMgZGVyaXZlZCBmcm9tIEgsIGJ1dCBtYXkgYWxzbyBoYXZlIGxvY2FsIGNoYW5nZXMuICBUaGlzIHRlc3QgY2hlY2tzCithbGwgdGhlIGNvbWJpbmF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIHR3by10cmVlIG1lcmdlICJjYXJyeSBmb3J3YXJkIgorcnVsZXMsIGZvdW5kIGluIDxEb2N1bWVudGF0aW9uL2dpdC1yZWFkLXRyZWUudHh0Pi4KKworSW4gdGhlIHRlc3QsIHRoZXNlIHBhdGhzIGFyZSB1c2VkOgorICAgICAgICBib3piYXIgIC0gaW4gSCwgc3RheXMgaW4gTSwgbW9kaWZpZWQgZnJvbSBib3piYXIgdG8gZ251c3RvCisgICAgICAgIGZyb3R6ICAgLSBub3QgaW4gSCBhZGRlZCBpbiBNCisgICAgICAgIG5pdGZvbCAgLSBpbiBILCBzdGF5cyBpbiBNIHVubW9kaWZpZWQKKyAgICAgICAgcmV6cm92ICAtIGluIEgsIGRlbGV0ZWQgaW4gTQorICAgICAgICB5b21pbiAgIC0gbm90IGluIEggbm9yIE0KKycKKy4gLi90ZXN0LWxpYi5zaAorCityZWFkX3RyZWVfdHdvd2F5ICgpIHsKKyAgICBnaXQtcmVhZC10cmVlIC1tICIkMSIgIiQyIiAmJiBnaXQtbHMtZmlsZXMgLS1zdGFnZQorfQorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK2NvbXBhcmVfY2hhbmdlICgpIHsKKwlzZWQgLW4gPmN1cnJlbnQgXAorCSAgICAtZSAnL14tLS0gL2Q7IC9eKysrIC9kOyAvXkBAIC9kOycgXAorCSAgICAtZSAncy9eXChbLStdWzAtN11bMC03XVswLTddWzAtN11bMC03XVswLTddXCkgJyIkX3g0MCInIC9cMSBYIC9wJyBcCisJICAgICIkMSIKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQKK30KKworY2hlY2tfY2FjaGVfYXQgKCkgeworCWNsZWFuX2lmX2VtcHR5PWBnaXQtZGlmZi1maWxlcyAtLSAiJDEiYAorCWNhc2UgIiRjbGVhbl9pZl9lbXB0eSIgaW4KKwknJykgIGVjaG8gIiQxOiBjbGVhbiIgOzsKKwk/KikgIGVjaG8gIiQxOiBkaXJ0eSIgOzsKKwllc2FjCisJY2FzZSAiJDIsJGNsZWFuX2lmX2VtcHR5IiBpbgorCWNsZWFuLCkJCTogICAgIDs7CisJY2xlYW4sPyopCWZhbHNlIDs7CisJZGlydHksKQkJZmFsc2UgOzsKKwlkaXJ0eSw/KikJOiAgICAgOzsKKwllc2FjCit9CisKK2NhdCA+Ym96YmFyLW9sZCA8PFxFT0YKK1RoaXMgaXMgYSBzYW1wbGUgZmlsZSB1c2VkIGluIHR3by13YXkgZmFzdCBmb3J3YXJkIG1lcmdlCit0ZXN0cy4gIEl0cyBzZWNvbmQgbGluZSBlbmRzIHdpdGggYSBtYWdpYyB3b3JkIGJvemJhcgord2hpY2ggd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgbWVyZ2VkIGhlYWQgdG8gZ251c3RvLgorSXQgaGFzIHNvbWUgZXh0cmEgbGluZXMgc28gdGhhdCBleHRlcm5hbCB0b29scyBjYW4KK3N1Y2Nlc3NmdWxseSBtZXJnZSBpbmRlcGVuZGVudCBjaGFuZ2VzIG1hZGUgdG8gbGF0ZXIKK2xpbmVzIChzdWNoIGFzIHRoaXMgb25lKSwgYXZvaWRpbmcgbGluZSBjb25mbGljdHMuCitFT0YKKworc2VkIC1lICdzL2JvemJhci9nbnVzdG8gKGVhcmxpZXIgYm96YmFyKS8nIGJvemJhci1vbGQgPmJvemJhci1uZXcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgc2V0dXAgXAorICAgICdlY2hvIGZyb3R6ID5mcm90eiAmJgorICAgICBlY2hvIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGNhdCBib3piYXItb2xkID5ib3piYXIgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBlY2hvIHlvbWluID55b21pbiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCBib3piYXIgcmV6cm92ICYmCisgICAgIHRyZWVIPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlSCAkdHJlZUggJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVIICYmCisKKyAgICAgY2F0IGJvemJhci1uZXcgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6IGJvemJhciAtLWZvcmNlLXJlbW92ZSByZXpyb3YgJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPk0ub3V0ICYmCisgICAgIHRyZWVNPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlTSAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVNICYmCisgICAgIGdpdC1kaWZmLXRyZWUgJHRyZWVIICR0cmVlTScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEsIDIsIDMgLSBubyBjYXJyeSBmb3J3YXJkJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4xLTMub3V0ICYmCisgICAgIGRpZmYgLXUgTS5vdXQgMS0zLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgZGlydHkgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogZGlydHkgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGRpcnR5JworCitlY2hvICcrMTAwNjQ0IFggMAl5b21pbicgPmV4cGVjdGVkCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc0IC0gY2FycnkgZm9yd2FyZCBsb2NhbCBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB5b21pbiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjQub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLXUgTS5vdXQgNC5vdXQgPjRkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSA0ZGlmZi5vdXQgZXhwZWN0ZWQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgeW9taW4gY2xlYW4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc1IC0gY2FycnkgZm9yd2FyZCBsb2NhbCBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB5b21pbiAmJgorICAgICBlY2hvIHlvbWluIHlvbWluID55b21pbiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjUub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLXUgTS5vdXQgNS5vdXQgPjVkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSA1ZGlmZi5vdXQgZXhwZWN0ZWQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgeW9taW4gZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc2IC0gbG9jYWwgYWRkaXRpb24gYWxyZWFkeSBoYXMgdGhlIHNhbWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID42Lm91dCAmJgorICAgICBkaWZmIC11IE0ub3V0IDYub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGNsZWFuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNyAtIGxvY2FsIGFkZGl0aW9uIGFscmVhZHkgaGFzIHRoZSBzYW1lLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6ICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+Ny5vdXQgJiYKKyAgICAgZGlmZiAtdSBNLm91dCA3Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBmcm90eiBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzggLSBjb25mbGljdGluZyBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBmcm90eiBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc5IC0gY29uZmxpY3RpbmcgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTAgLSBwYXRoIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4xMC5vdXQgJiYKKyAgICAgZGlmZiAtdSBNLm91dCAxMC5vdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMSAtIGRpcnR5IHBhdGggcmVtb3ZlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMiAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMyAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKworY2F0ID5leHBlY3RlZCA8PEVPRgorLTEwMDY0NCBYIDAJbml0Zm9sCisrMTAwNjQ0IFggMAluaXRmb2wKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTQgLSB1bmNoYW5nZWQgaW4gdHdvIGhlYWRzLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE0Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC11IE0ub3V0IDE0Lm91dCA+MTRkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBjbGVhbicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE1IC0gdW5jaGFuZ2VkIGluIHR3byBoZWFkcy4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTUub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLXUgTS5vdXQgMTUub3V0ID4xNWRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDE1ZGlmZi5vdXQgZXhwZWN0ZWQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGRpcnR5JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTYgLSBjb25mbGljdGluZyBsb2NhbCBjaGFuZ2UuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE3IC0gY29uZmxpY3RpbmcgbG9jYWwgY2hhbmdlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBlY2hvIGJvemJhciBib3piYXIgYm96YmFyID5ib3piYXIgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTggLSBsb2NhbCBjaGFuZ2UgYWxyZWFkeSBoYXZpbmcgYSBnb29kIHJlc3VsdC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgY2F0IGJvemJhci1uZXcgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE4Lm91dCAmJgorICAgICBkaWZmIC11IE0ub3V0IDE4Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxOSAtIGxvY2FsIGNoYW5nZSBhbHJlYWR5IGhhdmluZyBhIGdvb2QgcmVzdWx0LCBmdXJ0aGVyIG1vZGlmaWVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBjYXQgYm96YmFyLW5ldyA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gZ251c3RvIGdudXN0byA+Ym96YmFyICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTkub3V0ICYmCisgICAgIGRpZmYgLXUgTS5vdXQgMTkub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIwIC0gbm8gbG9jYWwgY2hhbmdlLCB1c2UgbmV3IHRyZWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGNhdCBib3piYXItb2xkID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4yMC5vdXQgJiYKKyAgICAgZGlmZiAtdSBNLm91dCAyMC5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgYm96YmFyIGRpcnR5JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMjEgLSBubyBsb2NhbCBjaGFuZ2UsIGRpcnR5IGNhY2hlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBjYXQgYm96YmFyLW9sZCA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gZ251c3RvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKworIyBUaGlzIGZhaWxzIHdpdGggc3RyYWlnaHQgdHdvLXdheSBmYXN0IGZvcndhcmQuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMjIgLSBsb2NhbCBjaGFuZ2UgY2FjaGUgdXBkYXRlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgc2VkIC1lICJzL3N1Y2ggYXMvU1VDSCBBUy8iIGJvemJhci1vbGQgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKKyMgQWxzbyBtYWtlIHN1cmUgd2UgZGlkIG5vdCBicmVhayBERiB2cyBERi9ERiBjYXNlLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0RGIHZzIERGL0RGIGNhc2Ugc2V0dXAuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZWNobyBERiA+REYgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERiAmJgorICAgICB0cmVlREY9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVERiAkdHJlZURGICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlREYgJiYKKworICAgICBybSAtZiBERiAmJgorICAgICBta2RpciBERiAmJgorICAgICBlY2hvIERGL0RGID5ERi9ERiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIERGIERGL0RGICYmCisgICAgIHRyZWVERkRGPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlREZERiAkdHJlZURGREYgJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVERkRGICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5ERkRGLm91dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0RGIHZzIERGL0RGIGNhc2UgdGVzdC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBybSAtZnIgREYgJiYKKyAgICAgZWNobyBERiA+REYgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlREYgJHRyZWVERkRGICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5ERkRGY2hlY2sub3V0ICYmCisgICAgIGRpZmYgLXUgREZERi5vdXQgREZERmNoZWNrLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBERi9ERiBkaXJ0eSAmJgorICAgICA6JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEwMDItcmVhZC10cmVlLW0tdS0yd2F5LnNoIGIvdC90MTAwMi1yZWFkLXRyZWUtbS11LTJ3YXkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGEzYzgxMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEwMDItcmVhZC10cmVlLW0tdS0yd2F5LnNoCkBAIC0wLDAgKzEsMzQ0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1R3byB3YXkgbWVyZ2Ugd2l0aCByZWFkLXRyZWUgLW0gLXUgJEggJE0KKworVGhpcyBpcyBpZGVudGljYWwgdG8gdDEwMDEsIGJ1dCB1c2VzIC11IHRvIHVwZGF0ZSB0aGUgd29yayB0cmVlIGFzIHdlbGwuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK2NvbXBhcmVfY2hhbmdlICgpIHsKKwlzZWQgPmN1cnJlbnQgXAorCSAgICAtZSAnL14tLS0gL2Q7IC9eKysrIC9kOyAvXkBAIC9kOycgXAorCSAgICAtZSAncy9eXCguWzAtN11bMC03XVswLTddWzAtN11bMC03XVswLTddXCkgJyIkX3g0MCInIC9cMSBYIC8nICIkMSIKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQKK30KKworY2hlY2tfY2FjaGVfYXQgKCkgeworCWNsZWFuX2lmX2VtcHR5PWBnaXQtZGlmZi1maWxlcyAtLSAiJDEiYAorCWNhc2UgIiRjbGVhbl9pZl9lbXB0eSIgaW4KKwknJykgIGVjaG8gIiQxOiBjbGVhbiIgOzsKKwk/KikgIGVjaG8gIiQxOiBkaXJ0eSIgOzsKKwllc2FjCisJY2FzZSAiJDIsJGNsZWFuX2lmX2VtcHR5IiBpbgorCWNsZWFuLCkJCTogICAgIDs7CisJY2xlYW4sPyopCWZhbHNlIDs7CisJZGlydHksKQkJZmFsc2UgOzsKKwlkaXJ0eSw/KikJOiAgICAgOzsKKwllc2FjCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgIHNldHVwIFwKKyAgICAnZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZWNobyBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBlY2hvIGJvemJhciA+Ym96YmFyICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgYm96YmFyIHJlenJvdiAmJgorICAgICB0cmVlSD1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZUggJHRyZWVIICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlSCAmJgorCisgICAgIGVjaG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiBib3piYXIgLS1mb3JjZS1yZW1vdmUgcmV6cm92ICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5NLm91dCAmJgorICAgICB0cmVlTT1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZU0gJHRyZWVNICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlTSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+TS5zdW0gJiYKKyAgICAgZ2l0LWRpZmYtdHJlZSAkdHJlZUggJHRyZWVNJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMSwgMiwgMyAtIG5vIGNhcnJ5IGZvcndhcmQnIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MS0zLm91dCAmJgorICAgICBjbXAgTS5vdXQgMS0zLm91dCAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsMy5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDMuc3VtICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBjbGVhbiAmJgorICAgICBjaGVja19jYWNoZV9hdCBmcm90eiBjbGVhbiAmJgorICAgICBjaGVja19jYWNoZV9hdCBuaXRmb2wgY2xlYW4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc0IC0gY2FycnkgZm9yd2FyZCBsb2NhbCBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gIisxMDA2NDQgWCAwCXlvbWluIiA+ZXhwZWN0ZWQgJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB5b21pbiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjQub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDQub3V0ID40ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IHlvbWluIGNsZWFuICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWw0LnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsNC5zdW0gJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4xICYmCisgICAgIGRpZmYgeW9taW4geW9taW4xICYmCisgICAgIHJtIC1mIHlvbWluMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzUgLSBjYXJyeSBmb3J3YXJkIGxvY2FsIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB5b21pbiAmJgorICAgICBlY2hvIHlvbWluIHlvbWluID55b21pbiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjUub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDUub3V0ID41ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgNWRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IHlvbWluIGRpcnR5ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWw1LnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsNS5zdW0gJiYKKyAgICAgOiBkaXJ0eSBpbmRleCBzaG91bGQgaGF2ZSBwcmV2ZW50ZWQgLXUgZnJvbSBjaGVja2luZyBpdCBvdXQuICYmCisgICAgIGVjaG8geW9taW4geW9taW4gPnlvbWluMSAmJgorICAgICBkaWZmIHlvbWluIHlvbWluMSAmJgorICAgICBybSAtZiB5b21pbjEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc2IC0gbG9jYWwgYWRkaXRpb24gYWxyZWFkeSBoYXMgdGhlIHNhbWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+Ni5vdXQgJiYKKyAgICAgZGlmZiAtVTAgTS5vdXQgNi5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogY2xlYW4gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDMuc3VtICYmCisgICAgIGNtcCBNLnN1bSBhY3R1YWwzLnN1bSAmJgorICAgICBlY2hvIGZyb3R6ID5mcm90ejEgJiYKKyAgICAgZGlmZiBmcm90eiBmcm90ejEgJiYKKyAgICAgcm0gLWYgZnJvdHoxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNyAtIGxvY2FsIGFkZGl0aW9uIGFscmVhZHkgaGFzIHRoZSBzYW1lLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjcub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDcub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGRpcnR5ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWw3LnN1bSAmJgorICAgICBpZiBjbXAgTS5zdW0gYWN0dWFsNy5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgOiBkaXJ0eSBpbmRleCBzaG91bGQgaGF2ZSBwcmV2ZW50ZWQgLXUgZnJvbSBjaGVja2luZyBpdCBvdXQuICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6MSAmJgorICAgICBkaWZmIGZyb3R6IGZyb3R6MSAmJgorICAgICBybSAtZiBmcm90ejEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc4IC0gY29uZmxpY3RpbmcgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGlmIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzkgLSBjb25mbGljdGluZyBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgaWYgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTAgLSBwYXRoIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTAub3V0ICYmCisgICAgIGNtcCBNLm91dCAxMC5vdXQgJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDEwLnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMTAuc3VtJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTEgLSBkaXJ0eSBwYXRoIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGVjaG8gcmV6cm92IHJlenJvdiA+cmV6cm92ICYmCisgICAgIGlmIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEyIC0gdW5tYXRjaGluZyBsb2NhbCBjaGFuZ2VzIGJlaW5nIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMyAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK2NhdCA+ZXhwZWN0ZWQgPDxFT0YKKy0xMDA2NDQgWCAwCW5pdGZvbAorKzEwMDY0NCBYIDAJbml0Zm9sCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE0IC0gdW5jaGFuZ2VkIGluIHR3byBoZWFkcy4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTQub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDE0Lm91dCA+MTRkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogPmFjdHVhbDE0LnN1bSAmJgorICAgICBncmVwIC12IG5pdGZvbCBNLnN1bSA+IGV4cGVjdGVkMTQuc3VtICYmCisgICAgIGNtcCBleHBlY3RlZDE0LnN1bSBhY3R1YWwxNC5zdW0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE0YS5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDE0YS5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGNsZWFuICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCA+bml0Zm9sMSAmJgorICAgICBkaWZmIG5pdGZvbCBuaXRmb2wxICYmCisgICAgIHJtIC1mIG5pdGZvbDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAtIHVuY2hhbmdlZCBpbiB0d28gaGVhZHMuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4xNS5vdXQgfHwgcmV0dXJuIDEKKyAgICAgZGlmZiAtVTAgTS5vdXQgMTUub3V0ID4xNWRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDE1ZGlmZi5vdXQgZXhwZWN0ZWQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGRpcnR5ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogPmFjdHVhbDE1LnN1bSAmJgorICAgICBncmVwIC12IG5pdGZvbCBNLnN1bSA+IGV4cGVjdGVkMTUuc3VtICYmCisgICAgIGNtcCBleHBlY3RlZDE1LnN1bSBhY3R1YWwxNS5zdW0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE1YS5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDE1YS5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sIG5pdGZvbCA+bml0Zm9sMSAmJgorICAgICBkaWZmIG5pdGZvbCBuaXRmb2wxICYmCisgICAgIHJtIC1mIG5pdGZvbDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNiAtIGNvbmZsaWN0aW5nIGxvY2FsIGNoYW5nZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGlmIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE3IC0gY29uZmxpY3RpbmcgbG9jYWwgY2hhbmdlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGlmIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE4IC0gbG9jYWwgY2hhbmdlIGFscmVhZHkgaGF2aW5nIGEgZ29vZCByZXN1bHQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTgub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDE4Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE4LnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMTguc3VtJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTkgLSBsb2NhbCBjaGFuZ2UgYWxyZWFkeSBoYXZpbmcgYSBnb29kIHJlc3VsdCwgZnVydGhlciBtb2RpZmllZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBnbnVzdG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4xOS5vdXQgJiYKKyAgICAgZGlmZiAtVTAgTS5vdXQgMTkub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBkaXJ0eSAmJgorICAgICBzdW0gZnJvdHogbml0Zm9sID5hY3R1YWwxOS5zdW0gJiYKKyAgICAgZ3JlcCAtdiBib3piYXIgIE0uc3VtID4gZXhwZWN0ZWQxOS5zdW0gJiYKKyAgICAgY21wIGV4cGVjdGVkMTkuc3VtIGFjdHVhbDE5LnN1bSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsMTlhLnN1bSAmJgorICAgICBpZiBjbXAgTS5zdW0gYWN0dWFsMTlhLnN1bTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaSAmJgorICAgICBlY2hvIGdudXN0byBnbnVzdG8gPmJvemJhcjEgJiYKKyAgICAgZGlmZiBib3piYXIgYm96YmFyMSAmJgorICAgICBybSAtZiBib3piYXIxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMjAgLSBubyBsb2NhbCBjaGFuZ2UsIHVzZSBuZXcgdHJlZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gYm96YmFyID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4yMC5vdXQgJiYKKyAgICAgZGlmZiAtVTAgTS5vdXQgMjAub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBjbGVhbiAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsMjAuc3VtICYmCisgICAgIGNtcCBNLnN1bSBhY3R1YWwyMC5zdW0nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyMSAtIG5vIGxvY2FsIGNoYW5nZSwgZGlydHkgY2FjaGUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gZ251c3RvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGlmIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKworIyBBbHNvIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGJyZWFrIERGIHZzIERGL0RGIGNhc2UuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnREYgdnMgREYvREYgY2FzZSBzZXR1cC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleAorICAgICBlY2hvIERGID5ERiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIERGICYmCisgICAgIHRyZWVERj1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZURGICR0cmVlREYgJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVERiAmJgorCisgICAgIHJtIC1mIERGICYmCisgICAgIG1rZGlyIERGICYmCisgICAgIGVjaG8gREYvREYgPkRGL0RGICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgREYgREYvREYgJiYKKyAgICAgdHJlZURGREY9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVERkRGICR0cmVlREZERiAmJgorICAgICBnaXQtbHMtdHJlZSAkdHJlZURGREYgJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPkRGREYub3V0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnREYgdnMgREYvREYgY2FzZSB0ZXN0LicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIHJtIC1mciBERiAmJgorICAgICBlY2hvIERGID5ERiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIERGICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVERiAkdHJlZURGREYgJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPkRGREZjaGVjay5vdXQgJiYKKyAgICAgZGlmZiAtVTAgREZERi5vdXQgREZERmNoZWNrLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBERi9ERiBjbGVhbicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMTAwLWNvbW1pdC10cmVlLW9wdGlvbnMuc2ggYi90L3QxMTAwLWNvbW1pdC10cmVlLW9wdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTlhMGVkNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDExMDAtY29tbWl0LXRyZWUtb3B0aW9ucy5zaApAQCAtMCwwICsxLDQ1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IFJlbmUgU2NoYXJmZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY29tbWl0LXRyZWUgb3B0aW9ucyB0ZXN0CisKK1RoaXMgdGVzdCBjaGVja3MgdGhhdCBnaXQtY29tbWl0LXRyZWUgY2FuIGNyZWF0ZSBhIHNwZWNpZmljIGNvbW1pdAorb2JqZWN0IGJ5IGRlZmluaW5nIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBpdCB1bmRlcnN0YW5kcy4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK2NhdCA+ZXhwZWN0ZWQgPDxFT0YKK3RyZWUgNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNAorYXV0aG9yIEF1dGhvciBOYW1lIDxhdXRob3JAZW1haWw+IDExMTcxNDg0MDAgKzAwMDAKK2NvbW1pdHRlciBDb21taXR0ZXIgTmFtZSA8Y29tbWl0dGVyQGVtYWlsPiAxMTE3MTUwMjAwICswMDAwCisKK2NvbW1lbnQgdGV4dAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd0ZXN0IHByZXBhcmF0aW9uOiB3cml0ZSBlbXB0eSB0cmVlJyBcCisgICAgJ2dpdC13cml0ZS10cmVlID50cmVlaWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb25zdHJ1Y3QgY29tbWl0JyBcCisgICAgJ2VjaG8gY29tbWVudCB0ZXh0IHwKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJBdXRob3IgTmFtZSIgXAorICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRob3JAZW1haWwiIFwKKyAgICAgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjAwIiBcCisgICAgIEdJVF9DT01NSVRURVJfTkFNRT0iQ29tbWl0dGVyIE5hbWUiIFwKKyAgICAgR0lUX0NPTU1JVFRFUl9FTUFJTD0iY29tbWl0dGVyQGVtYWlsIiBcCisgICAgIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgXAorICAgICBUWj1HTVQgZ2l0LWNvbW1pdC10cmVlIGBjYXQgdHJlZWlkYCA+Y29tbWl0aWQgMj4vZGV2L251bGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkIGNvbW1pdCcgXAorICAgICdnaXQtY2F0LWZpbGUgY29tbWl0IGBjYXQgY29tbWl0aWRgID5jb21taXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb21wYXJlIGNvbW1pdCcgXAorICAgICdkaWZmIGV4cGVjdGVkIGNvbW1pdCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMjAwLXR1dG9yaWFsLnNoIGIvdC90MTIwMC10dXRvcmlhbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jN2RiMjBlCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTIwMC10dXRvcmlhbC5zaApAQCAtMCwwICsxLDE2MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZ2l0LXJldi1wYXJzZSB3aXRoIGRpZmZlcmVudCBwYXJlbnQgb3B0aW9ucycKKworLiAuL3Rlc3QtbGliLnNoCisKK2VjaG8gIkhlbGxvIFdvcmxkIiA+IGhlbGxvCitlY2hvICJTaWxseSBleGFtcGxlIiA+IGV4YW1wbGUKKworZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBoZWxsbyBleGFtcGxlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jsb2InICJ0ZXN0IGJsb2IgPSBcIiQoZ2l0LWNhdC1maWxlIC10IDU1N2RiMDMpXCIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jsb2IgNTU3ZGIwMycgInRlc3QgXCJIZWxsbyBXb3JsZFwiID0gXCIkKGdpdC1jYXQtZmlsZSBibG9iIDU1N2RiMDMpXCIiCisKK2VjaG8gIkl0J3MgYSBuZXcgZGF5IGZvciBnaXQiID4+aGVsbG8KK2NhdCA+IGRpZmYuZXhwZWN0IDw8IEVPRgorZGlmZiAtLWdpdCBhL2hlbGxvIGIvaGVsbG8KK2luZGV4IDU1N2RiMDMuLjI2MzQxNGYgMTAwNjQ0CistLS0gYS9oZWxsbworKysrIGIvaGVsbG8KK0BAIC0xICsxLDIgQEAKKyBIZWxsbyBXb3JsZAorK0l0J3MgYSBuZXcgZGF5IGZvciBnaXQKK0VPRgorZ2l0LWRpZmYtZmlsZXMgLXAgPiBkaWZmLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtZmlsZXMgLXAnICdjbXAgZGlmZi5leHBlY3QgZGlmZi5vdXRwdXQnCitnaXQgZGlmZiA+IGRpZmYub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZicgJ2NtcCBkaWZmLmV4cGVjdCBkaWZmLm91dHB1dCcKKwordHJlZT0kKGdpdC13cml0ZS10cmVlIDI+L2Rldi9udWxsKQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0cmVlJyAidGVzdCA4OTg4ZGExNWQwNzdkNDgyOWZjNTFkODU0NGMwOTdkZWY2NjQ0ZGJiID0gJHRyZWUiCisKK291dHB1dD0iJChlY2hvICJJbml0aWFsIGNvbW1pdCIgfCBnaXQtY29tbWl0LXRyZWUgJChnaXQtd3JpdGUtdHJlZSkgMj4mMSA+IC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIpIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQnICJ0ZXN0ICdDb21taXR0aW5nIGluaXRpYWwgdHJlZSA4OTg4ZGExNWQwNzdkNDgyOWZjNTFkODU0NGMwOTdkZWY2NjQ0ZGJiJyA9IFwiJG91dHB1dFwiIgorCitnaXQtZGlmZi1pbmRleCAtcCBIRUFEID4gZGlmZi5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLWluZGV4IC1wIEhFQUQnICdjbXAgZGlmZi5leHBlY3QgZGlmZi5vdXRwdXQnCisKK2dpdCBkaWZmIEhFQUQgPiBkaWZmLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYgSEVBRCcgJ2NtcCBkaWZmLmV4cGVjdCBkaWZmLm91dHB1dCcKKworI3JtIGhlbGxvCisjdGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IEhFQUQnICJnaXQtcmVhZC10cmVlIC0tcmVzZXQgSEVBRCA7IHRlc3QgXCJoZWxsbzogbmVlZHMgdXBkYXRlXCIgPSBcIiQoZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2gpXCIiCisKK2NhdCA+IHdoYXRjaGFuZ2VkLmV4cGVjdCA8PCBFT0YKK2NvbW1pdCBWQVJJQUJMRQorQXV0aG9yOiBWQVJJQUJMRQorRGF0ZTogICBWQVJJQUJMRQorCisgICAgSW5pdGlhbCBjb21taXQKKworZGlmZiAtLWdpdCBhL2V4YW1wbGUgYi9leGFtcGxlCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uZjI0Yzc0YQorLS0tIC9kZXYvbnVsbAorKysrIGIvZXhhbXBsZQorQEAgLTAsMCArMSBAQAorK1NpbGx5IGV4YW1wbGUKK2RpZmYgLS1naXQgYS9oZWxsbyBiL2hlbGxvCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNTU3ZGIwMworLS0tIC9kZXYvbnVsbAorKysrIGIvaGVsbG8KK0BAIC0wLDAgKzEgQEAKKytIZWxsbyBXb3JsZAorRU9GCisKK2dpdC13aGF0Y2hhbmdlZCAtcCAtLXJvb3QgfCBcCisJc2VkIC1lICIxcy9eXCguXHs3XH1cKS5cezQwXH0vXDFWQVJJQUJMRS8iIFwKKwkJLWUgIjIsM3MvXlwoLlx7OFx9XCkuKiQvXDFWQVJJQUJMRS8iIFwKKz4gd2hhdGNoYW5nZWQub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtd2hhdGNoYW5nZWQgLXAgLS1yb290JyAnY21wIHdoYXRjaGFuZ2VkLmV4cGVjdCB3aGF0Y2hhbmdlZC5vdXRwdXQnCisKK2dpdCB0YWcgbXktZmlyc3QtdGFnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgdGFnIG15LWZpcnN0LXRhZycgJ2NtcCAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy90YWdzL215LWZpcnN0LXRhZycKKworIyBUT0RPOiB0ZXN0IGdpdC1jbG9uZQorCitnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2gKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBjaGVja291dCAtYiBteWJyYW5jaCcgJ2NtcCAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy9oZWFkcy9teWJyYW5jaCcKKworY2F0ID4gYnJhbmNoLmV4cGVjdCA8PEVPRgorICBtYXN0ZXIKKyogbXlicmFuY2gKK0VPRgorCitnaXQgYnJhbmNoID4gYnJhbmNoLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGJyYW5jaCcgJ2NtcCBicmFuY2guZXhwZWN0IGJyYW5jaC5vdXRwdXQnCisKK2dpdCBjaGVja291dCBteWJyYW5jaAorZWNobyAiV29yaywgd29yaywgd29yayIgPj5oZWxsbworZ2l0IGNvbW1pdCAtbSAnU29tZSB3b3JrLicgLWkgaGVsbG8KKworZ2l0IGNoZWNrb3V0IG1hc3RlcgorCitlY2hvICJQbGF5LCBwbGF5LCBwbGF5IiA+PmhlbGxvCitlY2hvICJMb3RzIG9mIGZ1biIgPj5leGFtcGxlCitnaXQgY29tbWl0IC1tICdTb21lIGZ1bi4nIC1pIGhlbGxvIGV4YW1wbGUKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnZ2l0IHJlc29sdmUgbm93IGZhaWxzJyAnZ2l0IHJlc29sdmUgSEVBRCBteWJyYW5jaCAiTWVyZ2Ugd29yayBpbiBteWJyYW5jaCInCisKK2NhdCA+IGhlbGxvIDw8IEVPRgorSGVsbG8gV29ybGQKK0l0J3MgYSBuZXcgZGF5IGZvciBnaXQKK1BsYXksIHBsYXksIHBsYXkKK1dvcmssIHdvcmssIHdvcmsKK0VPRgorCitnaXQgY29tbWl0IC1tICdNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLicgLWkgaGVsbG8KKwordGVzdF9kb25lCisKK2NhdCA+IHNob3ctYnJhbmNoLmV4cGVjdCA8PCBFT0YKKyogW21hc3Rlcl0gTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4KKyAhIFtteWJyYW5jaF0gU29tZSB3b3JrLgorLS0KKy0gIFttYXN0ZXJdIE1lcmdlZCAibXlicmFuY2giIGNoYW5nZXMuCisqKyBbbXlicmFuY2hdIFNvbWUgd29yay4KK0VPRgorCitnaXQgc2hvdy1icmFuY2ggLS10b3BvLW9yZGVyIG1hc3RlciBteWJyYW5jaCA+IHNob3ctYnJhbmNoLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHNob3ctYnJhbmNoJyAnY21wIHNob3ctYnJhbmNoLmV4cGVjdCBzaG93LWJyYW5jaC5vdXRwdXQnCisKK2dpdCBjaGVja291dCBteWJyYW5jaAorCitjYXQgPiByZXNvbHZlLmV4cGVjdCA8PCBFT0YKK1VwZGF0aW5nIGZyb20gVkFSSUFCTEUgdG8gVkFSSUFCTEUKKyBleGFtcGxlIHwgICAgMSArCisgaGVsbG8gICB8ICAgIDEgKworIDIgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorRU9GCisKK2dpdCByZXNvbHZlIEhFQUQgbWFzdGVyICJNZXJnZSB1cHN0cmVhbSBjaGFuZ2VzLiIgfCBcCisJc2VkIC1lICIxcy9bMC05YS1mXVx7NDBcfS9WQVJJQUJMRS9nIiA+IHJlc29sdmUub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcmVzb2x2ZScgJ2NtcCByZXNvbHZlLmV4cGVjdCByZXNvbHZlLm91dHB1dCcKKworY2F0ID4gc2hvdy1icmFuY2gyLmV4cGVjdCA8PCBFT0YKKyEgW21hc3Rlcl0gTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4KKyAqIFtteWJyYW5jaF0gTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4KKy0tCistLSBbbWFzdGVyXSBNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLgorRU9GCisKK2dpdCBzaG93LWJyYW5jaCAtLXRvcG8tb3JkZXIgbWFzdGVyIG15YnJhbmNoID4gc2hvdy1icmFuY2gyLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHNob3ctYnJhbmNoJyAnY21wIHNob3ctYnJhbmNoMi5leHBlY3Qgc2hvdy1icmFuY2gyLm91dHB1dCcKKworIyBUT0RPOiB0ZXN0IGdpdCBmZXRjaAorCisjIFRPRE86IHRlc3QgZ2l0IHB1c2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHJlcGFjaycgJ2dpdCByZXBhY2snCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcHJ1bmUtcGFja2VkJyAnZ2l0IHBydW5lLXBhY2tlZCcKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJy0+IG9ubHkgcGFja2VkIG9iamVjdHMnICdmaW5kIC10eXBlIGYgLmdpdC9vYmplY3RzL1swLTlhLWZdWzAtOWEtZl0nCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3QxMzAwLXJlcG8tY29uZmlnLnNoIGIvdC90MTMwMC1yZXBvLWNvbmZpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjYwZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MTMwMC1yZXBvLWNvbmZpZy5zaApAQCAtMCwwICsxLDMxMyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZ2l0LXJlcG8tY29uZmlnIGluIGRpZmZlcmVudCBzZXR0aW5ncycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3QgLWYgLmdpdC9jb25maWcgJiYgcm0gLmdpdC9jb25maWcKKworZ2l0LXJlcG8tY29uZmlnIGNvcmUucGVuZ3VpbiAibGl0dGxlIGJsdWUiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luaXRpYWwnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtcmVwby1jb25maWcgQ29yZS5Nb3ZpZSBCYWRQaHlzaWNzCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21peGVkIGNhc2UnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtcmVwby1jb25maWcgQ29yZXMuV2hhdEV2ZXIgU2Vjb25kCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworW0NvcmVzXQorCVdoYXRFdmVyID0gU2Vjb25kCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2ltaWxhciBzZWN0aW9uJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LXJlcG8tY29uZmlnIENPUkUuVVBQRVJDQVNFIHRydWUKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2NvcmVdCisJcGVuZ3VpbiA9IGxpdHRsZSBibHVlCisJTW92aWUgPSBCYWRQaHlzaWNzCisJVVBQRVJDQVNFID0gdHJ1ZQorW0NvcmVzXQorCVdoYXRFdmVyID0gU2Vjb25kCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2ltaWxhciBzZWN0aW9uJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVwbGFjZSB3aXRoIG5vbi1tYXRjaCcgXAorCSdnaXQtcmVwby1jb25maWcgY29yZS5wZW5ndWluIGtpbmdwaW4gIWJsdWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcGxhY2Ugd2l0aCBub24tbWF0Y2ggKGFjdHVhbGx5IG1hdGNoaW5nKScgXAorCSdnaXQtcmVwby1jb25maWcgY29yZS5wZW5ndWluICJ2ZXJ5IGJsdWUiICFraW5ncGluJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gdmVyeSBibHVlCisJTW92aWUgPSBCYWRQaHlzaWNzCisJVVBQRVJDQVNFID0gdHJ1ZQorCXBlbmd1aW4gPSBraW5ncGluCitbQ29yZXNdCisJV2hhdEV2ZXIgPSBTZWNvbmQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdub24tbWF0Y2ggcmVzdWx0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworY2F0ID4gLmdpdC9jb25maWcgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CisJCWhhaGEgICA9ImJldGEiICMgbGFzdCBzaWxseSBjb21tZW50CitoYWhhID0gaGVsbG8KKwloYWhhID0gYmVsbG8KK1tuZXh0U2VjdGlvbl0gbm9OZXdsaW5lID0gb3VjaAorRU9GCisKK2NwIC5naXQvY29uZmlnIC5naXQvY29uZmlnMgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSB1bnNldCcgXAorCSdnaXQtcmVwby1jb25maWcgLS11bnNldC1hbGwgYmV0YS5oYWhhJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dIG5vTmV3bGluZSA9IG91Y2gKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSB1bnNldCBpcyBjb3JyZWN0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworbXYgLmdpdC9jb25maWcyIC5naXQvY29uZmlnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tcmVwbGFjZS1hbGwnIFwKKwknZ2l0LXJlcG8tY29uZmlnIC0tcmVwbGFjZS1hbGwgYmV0YS5oYWhhIGdhbW1hJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CisJaGFoYSA9IGdhbW1hCitbbmV4dFNlY3Rpb25dIG5vTmV3bGluZSA9IG91Y2gKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbGwgcmVwbGFjZWQnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtcmVwby1jb25maWcgYmV0YS5oYWhhIGFscGhhCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKKwloYWhhID0gYWxwaGEKK1tuZXh0U2VjdGlvbl0gbm9OZXdsaW5lID0gb3VjaAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYWxseSBtZWFuIHRlc3QnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtcmVwby1jb25maWcgbmV4dHNlY3Rpb24ubm9uZXdsaW5lIHdvdworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CisJaGFoYSA9IGFscGhhCitbbmV4dFNlY3Rpb25dCisJbm9uZXdsaW5lID0gd293CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVhbGx5IHJlYWxseSBtZWFuIHRlc3QnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnZXQgdmFsdWUnICd0ZXN0IGFscGhhID0gJChnaXQtcmVwby1jb25maWcgYmV0YS5oYWhhKScKK2dpdC1yZXBvLWNvbmZpZyAtLXVuc2V0IGJldGEuaGFoYQorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJbm9uZXdsaW5lID0gd293CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5zZXQnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtcmVwby1jb25maWcgbmV4dHNlY3Rpb24uTm9OZXdMaW5lICJ3b3cyIGZvciBtZSIgImZvciBtZSQiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKK1tuZXh0U2VjdGlvbl0KKwlub25ld2xpbmUgPSB3b3cKKwlOb05ld0xpbmUgPSB3b3cyIGZvciBtZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpdmFyJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm9uLW1hdGNoJyBcCisJJ2dpdC1yZXBvLWNvbmZpZyAtLWdldCBuZXh0c2VjdGlvbi5ub25ld2xpbmUgIWZvcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm9uLW1hdGNoIHZhbHVlJyBcCisJJ3Rlc3Qgd293ID0gJChnaXQtcmVwby1jb25maWcgLS1nZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lICFmb3IpJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdhbWJpZ3VvdXMgZ2V0JyBcCisJJ2dpdC1yZXBvLWNvbmZpZyAtLWdldCBuZXh0c2VjdGlvbi5ub25ld2xpbmUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dldCBtdWx0aXZhcicgXAorCSdnaXQtcmVwby1jb25maWcgLS1nZXQtYWxsIG5leHRzZWN0aW9uLm5vbmV3bGluZScKKworZ2l0LXJlcG8tY29uZmlnIG5leHRzZWN0aW9uLm5vbmV3bGluZSAid293MyIgIndvdyQiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKK1tuZXh0U2VjdGlvbl0KKwlub25ld2xpbmUgPSB3b3czCisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXZhciByZXBsYWNlJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYW1iaWd1b3VzIHZhbHVlJyAnZ2l0LXJlcG8tY29uZmlnIG5leHRzZWN0aW9uLm5vbmV3bGluZScKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYW1iaWd1b3VzIHVuc2V0JyBcCisJJ2dpdC1yZXBvLWNvbmZpZyAtLXVuc2V0IG5leHRzZWN0aW9uLm5vbmV3bGluZScKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnaW52YWxpZCB1bnNldCcgXAorCSdnaXQtcmVwby1jb25maWcgLS11bnNldCBzb21lc2VjdGlvbi5ub25ld2xpbmUnCisKK2dpdC1yZXBvLWNvbmZpZyAtLXVuc2V0IG5leHRzZWN0aW9uLm5vbmV3bGluZSAid293MyQiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKK1tuZXh0U2VjdGlvbl0KKwlOb05ld0xpbmUgPSB3b3cyIGZvciBtZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpdmFyIHVuc2V0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnaW52YWxpZCBrZXknICdnaXQtcmVwby1jb25maWcgaW52YWwuMmtleSBibGFibGEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvcnJlY3Qga2V5JyAnZ2l0LXJlcG8tY29uZmlnIDEyMzQ1Ni5hMTIzIDk4NycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaGllcmFyY2hpY2FsIHNlY3Rpb24nIFwKKwknZ2l0LXJlcG8tY29uZmlnIFZlcnNpb24uMS4yLjNlWC5BbHBoYSBiZXRhJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK1sxMjM0NTZdCisJYTEyMyA9IDk4NworW1ZlcnNpb24gIjEuMi4zZVgiXQorCUFscGhhID0gYmV0YQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2hpZXJhcmNoaWNhbCBzZWN0aW9uIHZhbHVlJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorYmV0YS5ub2luZGVudD1zaWxseVZhbHVlCituZXh0c2VjdGlvbi5ub25ld2xpbmU9d293MiBmb3IgbWUKKzEyMzQ1Ni5hMTIzPTk4NwordmVyc2lvbi4xLjIuM2VYLmFscGhhPWJldGEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3b3JraW5nIC0tbGlzdCcgXAorCSdnaXQtcmVwby1jb25maWcgLS1saXN0ID4gb3V0cHV0ICYmIGNtcCBvdXRwdXQgZXhwZWN0JworCitjYXQgPiBleHBlY3QgPDwgRU9GCitiZXRhLm5vaW5kZW50IHNpbGx5VmFsdWUKK25leHRzZWN0aW9uLm5vbmV3bGluZSB3b3cyIGZvciBtZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tZ2V0LXJlZ2V4cCcgXAorCSdnaXQtcmVwby1jb25maWcgLS1nZXQtcmVnZXhwIGluID4gb3V0cHV0ICYmIGNtcCBvdXRwdXQgZXhwZWN0JworCitjYXQgPiAuZ2l0L2NvbmZpZyA8PCBFT0YKK1tub3ZhbHVlXQorCXZhcmlhYmxlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2V0IHZhcmlhYmxlIHdpdGggbm8gdmFsdWUnIFwKKwknZ2l0LXJlcG8tY29uZmlnIC0tZ2V0IG5vdmFsdWUudmFyaWFibGUgXiQnCisKK2dpdC1yZXBvLWNvbmZpZyA+IG91dHB1dCAyPiYxCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vIGFyZ3VtZW50cywgYnV0IG5vIGNyYXNoJyBcCisJInRlc3QgJD8gPSAxMjkgJiYgZ3JlcCB1c2FnZSBvdXRwdXQiCisKK2NhdCA+IC5naXQvY29uZmlnIDw8IEVPRgorW2EuYl0KKwljID0gZAorRU9GCisKK2dpdC1yZXBvLWNvbmZpZyBhLnggeQorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYS5iXQorCWMgPSBkCitbYV0KKwl4ID0geQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25ldyBzZWN0aW9uIGlzIHBhcnRpYWwgbWF0Y2ggb2YgYW5vdGhlcicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdC1yZXBvLWNvbmZpZyBiLnggeQorZ2l0LXJlcG8tY29uZmlnIGEuYiBjCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1thLmJdCisJYyA9IGQKK1thXQorCXggPSB5CisJYiA9IGMKK1tiXQorCXggPSB5CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbmV3IHZhcmlhYmxlIGluc2VydHMgaW50byBwcm9wZXIgc2VjdGlvbicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3QxNDAwLXVwZGF0ZS1yZWYuc2ggYi90L3QxNDAwLXVwZGF0ZS1yZWYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGYzZTk5MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDE0MDAtdXBkYXRlLXJlZi5zaApAQCAtMCwwICsxLDIxMyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBTaGF3biBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBnaXQtdXBkYXRlLXJlZiBhbmQgYmFzaWMgcmVmIGxvZ2dpbmcnCisuIC4vdGVzdC1saWIuc2gKKworWj0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitBPTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK0I9MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgorQz0zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzCitEPTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQKK0U9NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NQorRj02NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2CittPXJlZnMvaGVhZHMvbWFzdGVyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0iIFwKKwknZ2l0LXVwZGF0ZS1yZWYgJG0gJEEgJiYKKwkgdGVzdCAkQSA9ICQoY2F0IC5naXQvJG0pJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSIgXAorCSdnaXQtdXBkYXRlLXJlZiAkbSAkQiAkQSAmJgorCSB0ZXN0ICRCID0gJChjYXQgLmdpdC8kbSknCitybSAtZiAuZ2l0LyRtCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0gKGJ5IEhFQUQpIiBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEEgJiYKKwkgdGVzdCAkQSA9ICQoY2F0IC5naXQvJG0pJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAoYnkgSEVBRCkiIFwKKwknZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkQiAkQSAmJgorCSB0ZXN0ICRCID0gJChjYXQgLmdpdC8kbSknCitybSAtZiAuZ2l0LyRtCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorCScobm90KSBjcmVhdGUgSEVBRCB3aXRoIG9sZCBzaGExJyBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEEgJEInCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwkiKG5vdCkgcHJpb3IgY3JlYXRlZCAuZ2l0LyRtIiBcCisJJ3Rlc3QgLWYgLmdpdC8kbScKK3JtIC1mIC5naXQvJG0KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSBIRUFEIiBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEEnCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwknKG5vdCkgY2hhbmdlIEhFQUQgd2l0aCB3cm9uZyBTSEExJyBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEIgJFonCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwkiKG5vdCkgY2hhbmdlZCAuZ2l0LyRtIiBcCisJJ3Rlc3QgJEIgPSAkKGNhdCAuZ2l0LyRtKScKK3JtIC1mIC5naXQvJG0KKworbWtkaXIgLXAgLmdpdC9sb2dzL3JlZnMvaGVhZHMKK3RvdWNoIC5naXQvbG9ncy9yZWZzL2hlYWRzL21hc3RlcgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAobG9nZ2VkIGJ5IHRvdWNoKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzAiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkQSAtbSAiSW5pdGlhbCBDcmVhdGlvbiIgJiYKKwkgdGVzdCAkQSA9ICQoY2F0IC5naXQvJG0pJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInVwZGF0ZSAkbSAobG9nZ2VkIGJ5IHRvdWNoKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzEiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkQiAkQSAtbSAiU3dpdGNoIiAmJgorCSB0ZXN0ICRCID0gJChjYXQgLmdpdC8kbSknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkic2V0ICRtIChsb2dnZWQgYnkgdG91Y2gpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MSIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEICRBICYmCisJIHRlc3QgJEEgPSAkKGNhdCAuZ2l0LyRtKScKKworY2F0ID5leHBlY3QgPDxFT0YKKyRaICRBICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMjAwICswMDAwCUluaXRpYWwgQ3JlYXRpb24KKyRBICRCICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMjYwICswMDAwCVN3aXRjaAorJEIgJEEgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTA4NjAgKzAwMDAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInZlcmlmeWluZyAkbSdzIGxvZyIgXAorCSdkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvJG0nCitybSAtcmYgLmdpdC8kbSAuZ2l0L2xvZ3MgZXhwZWN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdlbmFibGUgY29yZS5sb2dBbGxSZWZVcGRhdGVzJyBcCisJJ2dpdC1yZXBvLWNvbmZpZyBjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMgdHJ1ZSAmJgorCSB0ZXN0IHRydWUgPSAkKGdpdC1yZXBvLWNvbmZpZyAtLWJvb2wgLS1nZXQgY29yZS5sb2dBbGxSZWZVcGRhdGVzKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAobG9nZ2VkIGJ5IGNvbmZpZykiIFwKKwknR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMyIiBcCisJIGdpdC11cGRhdGUtcmVmIEhFQUQgJEEgLW0gIkluaXRpYWwgQ3JlYXRpb24iICYmCisJIHRlc3QgJEEgPSAkKGNhdCAuZ2l0LyRtKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJ1cGRhdGUgJG0gKGxvZ2dlZCBieSBjb25maWcpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMyIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEICRCICRBIC1tICJTd2l0Y2giICYmCisJIHRlc3QgJEIgPSAkKGNhdCAuZ2l0LyRtKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJzZXQgJG0gKGxvZ2dlZCBieSBjb25maWcpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MyIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEICRBICYmCisJIHRlc3QgJEEgPSAkKGNhdCAuZ2l0LyRtKScKKworY2F0ID5leHBlY3QgPDxFT0YKKyRaICRBICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMzIwICswMDAwCUluaXRpYWwgQ3JlYXRpb24KKyRBICRCICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMzgwICswMDAwCVN3aXRjaAorJEIgJEEgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTA5ODAgKzAwMDAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInZlcmlmeWluZyAkbSdzIGxvZyIgXAorCSdkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvJG0nCitybSAtZiAuZ2l0LyRtIC5naXQvbG9ncy8kbSBleHBlY3QKKworZ2l0LXVwZGF0ZS1yZWYgJG0gJEQKK2NhdCA+LmdpdC9sb2dzLyRtIDw8RU9GCiskQyAkQSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDMyMCAtMDUwMAorJEEgJEIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAzODAgLTA1MDAKKyRGICRaICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwNjgwIC0wNTAwCiskWiAkRSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDk4MCAtMDUwMAorRU9GCisKK2VkPSJUaHUsIDI2IE1heSAyMDA1IDE4OjMyOjAwIC0wNTAwIgorZ2Q9IlRodSwgMjYgTWF5IDIwMDUgMTg6MzM6MDAgLTA1MDAiCitsZD0iVGh1LCAyNiBNYXkgMjAwNSAxODo0MzowMCAtMDUwMCIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHtNYXkgMjUgMjAwNX0iIChiZWZvcmUgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI1IDIwMDV9IiA+byAyPmUgJiYKKwkgdGVzdCAkQyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJG0gb25seSBnb2VzIGJhY2sgdG8gJGVkLiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJIlF1ZXJ5IG1hc3RlckB7MjAwNS0wNS0yNX0gKGJlZm9yZSBoaXN0b3J5KSIgXAorCSdybSAtZiBvIGUKKwkgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXJAezIwMDUtMDUtMjV9ID5vIDI+ZSAmJgorCSB0ZXN0ICRDID0gJChjYXQgbykgJiYKKwkgZWNobyB0ZXN0ICJ3YXJuaW5nOiBMb2cgLmdpdC9sb2dzLyRtIG9ubHkgZ29lcyBiYWNrIHRvICRlZC4iID0gIiQoY2F0IGUpIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHtNYXkgMjYgMjAwNSAyMzozMTo1OX0iICgxIHNlY29uZCBiZWZvcmUgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI2IDIwMDUgMjM6MzE6NTl9IiA+byAyPmUgJiYKKwkgdGVzdCAkQyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJG0gb25seSBnb2VzIGJhY2sgdG8gJGVkLiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAe01heSAyNiAyMDA1IDIzOjMyOjAwfSIgKGV4YWN0bHkgaGlzdG9yeSBzdGFydCknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI2IDIwMDUgMjM6MzI6MDB9IiA+byAyPmUgJiYKKwkgdGVzdCAkQSA9ICQoY2F0IG8pICYmCisJIHRlc3QgIiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzM6MDF9IiAobWlkZGxlIG9mIGhpc3Rvcnkgd2l0aCBnYXApJyBcCisJJ3JtIC1mIG8gZQorCSBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzM6MDF9IiA+byAyPmUgJiYKKwkgdGVzdCAkQiA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJG0gaGFzIGdhcCBhZnRlciAkZ2QuIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzozODowMH0iIChtaWRkbGUgb2YgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzozODowMH0iID5vIDI+ZSAmJgorCSB0ZXN0ICRaID0gJChjYXQgbykgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0MzowMH0iIChleGFjdCBlbmQgb2YgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0MzowMH0iID5vIDI+ZSAmJgorCSB0ZXN0ICRFID0gJChjYXQgbykgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yOH0iIChwYXN0IGVuZCBvZiBoaXN0b3J5KScgXAorCSdybSAtZiBvIGUKKwkgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAibWFzdGVyQHsyMDA1LTA1LTI4fSIgPm8gMj5lICYmCisJIHRlc3QgJEQgPSAkKGNhdCBvKSAmJgorCSB0ZXN0ICJ3YXJuaW5nOiBMb2cgLmdpdC9sb2dzLyRtIHVuZXhwZWN0ZWRseSBlbmRlZCBvbiAkbGQuIiA9ICIkKGNhdCBlKSInCisKKworcm0gLWYgLmdpdC8kbSAuZ2l0L2xvZ3MvJG0gZXhwZWN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBpbml0aWFsIGZpbGVzJyBcCisgICAgJ2VjaG8gVEVTVCA+RiAmJgorICAgICBnaXQtYWRkIEYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgZ2l0LWNvbW1pdCAtbSBhZGQgLWEgJiYKKwkgaF9URVNUPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQorCSBlY2hvIFRoZSBvdGhlciBkYXkgdGhpcyBkaWQgbm90IHdvcmsuID5NICYmCisJIGVjaG8gQW5kIHRoZW4gQm9iIHRvbGQgbWUgaG93IHRvIGZpeCBpdC4gPj5NICYmCisJIGVjaG8gT1RIRVIgPkYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQxIiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MSIgZ2l0LWNvbW1pdCAtRiBNIC1hICYmCisJIGhfT1RIRVI9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisJIHJtIC1mIE0nCisKK2NhdCA+ZXhwZWN0IDw8RU9GCiskWiAkaF9URVNUICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMjAwICswMDAwCWNvbW1pdDogYWRkCiskaF9URVNUICRoX09USEVSICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwODYwICswMDAwCWNvbW1pdDogVGhlIG90aGVyIGRheSB0aGlzIGRpZCBub3Qgd29yay4KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2dpdC1jb21taXQgbG9nZ2VkIHVwZGF0ZXMnIFwKKwknZGlmZiBleHBlY3QgLmdpdC9sb2dzLyRtJwordW5zZXQgaF9URVNUIGhfT1RIRVIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2dpdC1jYXQtZmlsZSBibG9iIG1hc3RlcjpGIChleHBlY3QgT1RIRVIpJyBcCisJJ3Rlc3QgT1RIRVIgPSAkKGdpdC1jYXQtZmlsZSBibG9iIG1hc3RlcjpGKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzB9OkYgKGV4cGVjdCBURVNUKScgXAorCSd0ZXN0IFRFU1QgPSAkKGdpdC1jYXQtZmlsZSBibG9iICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzB9OkYiKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXJAezIwMDUtMDUtMjYgMjM6NDJ9OkYgKGV4cGVjdCBPVEhFUiknIFwKKwkndGVzdCBPVEhFUiA9ICQoZ2l0LWNhdC1maWxlIGJsb2IgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0Mn06RiIpJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDAtY2hlY2tvdXQtY2FjaGUtY2xhc2guc2ggYi90L3QyMDAwLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAzZWE0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDAwLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWNoZWNrb3V0LWluZGV4IHRlc3QuCisKK1RoaXMgdGVzdCByZWdpc3RlcnMgdGhlIGZvbGxvd2luZyBmaWxlc3lzdGVtIHN0cnVjdHVyZSBpbiB0aGUKK2NhY2hlOgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMS9maWxlMSAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorCitBbmQgdGhlbiB0cmllcyB0byBjaGVja291dCBpbiBhIHdvcmsgdHJlZSB0aGF0IGhhcyB0aGUgZm9sbG93aW5nOgorCisgICAgcGF0aDAvZmlsZTAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMSAgICAgICAtIGEgZmlsZQorCitUaGUgZ2l0LWNoZWNrb3V0LWluZGV4IGNvbW1hbmQgc2hvdWxkIGZhaWwgd2hlbiBhdHRlbXB0aW5nIHRvIGNoZWNrb3V0CitwYXRoMCwgZmluZGluZyBpdCBpcyBvY2N1cGllZCBieSBhIGRpcmVjdG9yeSwgYW5kIHBhdGgxL2ZpbGUxLCBmaW5kaW5nCitwYXRoMSBpcyBvY2N1cGllZCBieSBhIG5vbi1kaXJlY3RvcnkuICBXaXRoICItZiIgZmxhZywgaXQgc2hvdWxkIHJlbW92ZQordGhlIGNvbmZsaWN0aW5nIHBhdGhzIGFuZCBzdWNjZWVkLgorJworLiAuL3Rlc3QtbGliLnNoCisKK2RhdGUgPnBhdGgwCitta2RpciBwYXRoMQorZGF0ZSA+cGF0aDEvZmlsZTEKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgdmFyaW91cyBwYXRocy4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMS9maWxlMScKKworcm0gLWZyIHBhdGgwIHBhdGgxCitta2RpciBwYXRoMAorZGF0ZSA+cGF0aDAvZmlsZTAKK2RhdGUgPnBhdGgxCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdnaXQtY2hlY2tvdXQtaW5kZXggd2l0aG91dCAtZiBzaG91bGQgZmFpbCBvbiBjb25mbGljdGluZyB3b3JrIHRyZWUuJyBcCisgICAgJ2dpdC1jaGVja291dC1pbmRleCAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1jaGVja291dC1pbmRleCB3aXRoIC1mIHNob3VsZCBzdWNjZWVkLicgXAorICAgICdnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtY2hlY2tvdXQtaW5kZXggY29uZmxpY3RpbmcgcGF0aHMuJyBcCisgICAgJ3Rlc3QgLWYgcGF0aDAgJiYgdGVzdCAtZCBwYXRoMSAmJiB0ZXN0IC1mIHBhdGgxL2ZpbGUxJworCit0ZXN0X2RvbmUKKworCmRpZmYgLS1naXQgYS90L3QyMDAxLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoIGIvdC90MjAwMS1jaGVja291dC1jYWNoZS1jbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZGNhYjhmCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwMS1jaGVja291dC1jYWNoZS1jbGFzaC5zaApAQCAtMCwwICsxLDg3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dC1pbmRleCB0ZXN0LgorCitUaGlzIHRlc3QgcmVnaXN0ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXN5c3RlbSBzdHJ1Y3R1cmUgaW4gdGhlIGNhY2hlOgorCisgICAgcGF0aDAvZmlsZTAJLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMS9maWxlMSAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorCithbmQgYXR0ZW1wdHMgdG8gY2hlY2sgaXQgb3V0IHdoZW4gdGhlIHdvcmsgdHJlZSBoYXM6CisKKyAgICBwYXRoMC9maWxlMCAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgxICAgICAgIC0gYSBzeW1saW5rIHBvaW50aW5nIGF0ICJwYXRoMCIKKworQ2hlY2tvdXQgY2FjaGUgc2hvdWxkIGZhaWwgdG8gZXh0cmFjdCBwYXRoMS9maWxlMSBiZWNhdXNlIHRoZSBsZWFkaW5nCitwYXRoIHBhdGgxIGlzIG9jY3VwaWVkIGJ5IGEgbm9uLWRpcmVjdG9yeS4gIFdpdGggIi1mIiBpdCBzaG91bGQgcmVtb3ZlCit0aGUgc3ltbGluayBwYXRoMSBhbmQgY3JlYXRlIGRpcmVjdG9yeSBwYXRoMSBhbmQgZmlsZSBwYXRoMS9maWxlMS4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitzaG93X2ZpbGVzKCkgeworCSMgc2hvdyBmaWxlc3lzdGVtIGZpbGVzLCBqdXN0IFstZGxdIGZvciB0eXBlIGFuZCBuYW1lCisJZmluZCBwYXRoPyAtbHMgfAorCXNlZCAtZSAncy9eWzAtOV0qICogWzAtOV0qICogXChbLWJjZGxdXClbXiBdKiAqWzAtOV0qICpbXiBdKiAqW14gXSogKlswLTldKiBbQS1aXVthLXpdW2Etel0gWzAtOV1bMC05XSBbXiBdKiAvZnM6IFwxIC8nCisJIyB3aGF0J3MgaW4gdGhlIGNhY2hlLCBqdXN0IG1vZGUgYW5kIG5hbWUKKwlnaXQtbHMtZmlsZXMgLS1zdGFnZSB8CisJc2VkIC1lICdzL15cKFswLTldKlwpIFswLTlhLWZdKiBbMC0zXSAvY2E6IFwxIC8nCisJIyB3aGF0J3MgaW4gdGhlIHRyZWUsIGp1c3QgbW9kZSBhbmQgbmFtZS4KKwlnaXQtbHMtdHJlZSAtciAiJDEiIHwKKwlzZWQgLWUgJ3MvXlwoWzAtOV0qXCkJW14gXSoJWzAtOWEtZl0qCS90cjogXDEgLycKK30KKworbWtkaXIgcGF0aDAKK2RhdGUgPnBhdGgwL2ZpbGUwCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMC9maWxlMCcgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwL2ZpbGUwJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgdHJlZSBvdXQgd2l0aCBnaXQtd3JpdGUtdHJlZScgXAorICAgICd0cmVlMT0kKGdpdC13cml0ZS10cmVlKScKK3Rlc3RfZGVidWcgJ3Nob3dfZmlsZXMgJHRyZWUxJworCitta2RpciBwYXRoMQorZGF0ZSA+cGF0aDEvZmlsZTEKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgxL2ZpbGUxJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDEvZmlsZTEnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdC13cml0ZS10cmVlJyBcCisgICAgJ3RyZWUyPSQoZ2l0LXdyaXRlLXRyZWUpJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTInCisKK3JtIC1mciBwYXRoMQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlYWQgcHJldmlvdXNseSB3cml0dGVuIHRyZWUgYW5kIGNoZWNrb3V0LicgXAorICAgICdnaXQtcmVhZC10cmVlIC1tICR0cmVlMSAmJiBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWEnCit0ZXN0X2RlYnVnICdzaG93X2ZpbGVzICR0cmVlMScKKworbG4gLXMgcGF0aDAgcGF0aDEKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGEgc3ltbGluay4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0aW5nIHRyZWUgb3V0IHdpdGggZ2l0LXdyaXRlLXRyZWUnIFwKKyAgICAndHJlZTM9JChnaXQtd3JpdGUtdHJlZSknCit0ZXN0X2RlYnVnICdzaG93X2ZpbGVzICR0cmVlMycKKworIyBNb3J0ZW4gc2F5cyAiR290IHRoYXQ/IiBoZXJlLgorIyBUZXN0IGJlZ2lucy4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlYWQgcHJldmlvdXNseSB3cml0dGVuIHRyZWUgYW5kIGNoZWNrb3V0LicgXAorICAgICdnaXQtcmVhZC10cmVlICR0cmVlMiAmJiBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWEnCit0ZXN0X2RlYnVnICdzaG93X2ZpbGVzICR0cmVlMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIG91dCBjb25mbGljdGluZyBwYXRoIHdpdGggLWYnIFwKKyAgICAndGVzdCAhIC1oIHBhdGgwICYmIHRlc3QgLWQgcGF0aDAgJiYKKyAgICAgdGVzdCAhIC1oIHBhdGgxICYmIHRlc3QgLWQgcGF0aDEgJiYKKyAgICAgdGVzdCAhIC1oIHBhdGgwL2ZpbGUwICYmIHRlc3QgLWYgcGF0aDAvZmlsZTAgJiYKKyAgICAgdGVzdCAhIC1oIHBhdGgxL2ZpbGUxICYmIHRlc3QgLWYgcGF0aDEvZmlsZTEnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3QyMDAyLWNoZWNrb3V0LWNhY2hlLXUuc2ggYi90L3QyMDAyLWNoZWNrb3V0LWNhY2hlLXUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM1MmRkYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwMDItY2hlY2tvdXQtY2FjaGUtdS5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dC1pbmRleCAtdSB0ZXN0LgorCitXaXRoIC11IGZsYWcsIGdpdC1jaGVja291dC1pbmRleCBpbnRlcm5hbGx5IHJ1bnMgdGhlIGVxdWl2YWxlbnQgb2YKK2dpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIG9uIHRoZSBjaGVja2VkIG91dCBlbnRyeS4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydwcmVwYXJhdGlvbicgJworZWNobyBmcm90eiA+cGF0aDAgJiYKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgJiYKK3Q9JChnaXQtd3JpdGUtdHJlZSknCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorJ3dpdGhvdXQgLXUsIGdpdC1jaGVja291dC1pbmRleCBzbXVkZ2VzIHN0YXQgaW5mb3JtYXRpb24uJyAnCitybSAtZiBwYXRoMCAmJgorZ2l0LXJlYWQtdHJlZSAkdCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hICYmCitnaXQtZGlmZi1maWxlcyB8IGRpZmYgLSAvZGV2L251bGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3dpdGggLXUsIGdpdC1jaGVja291dC1pbmRleCBwaWNrcyB1cCBzdGF0IGluZm9ybWF0aW9uIGZyb20gbmV3IGZpbGVzLicgJworcm0gLWYgcGF0aDAgJiYKK2dpdC1yZWFkLXRyZWUgJHQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtdSAtZiAtYSAmJgorZ2l0LWRpZmYtZmlsZXMgfCBkaWZmIC0gL2Rldi9udWxsJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDMtY2hlY2tvdXQtY2FjaGUtbWtkaXIuc2ggYi90L3QyMDAzLWNoZWNrb3V0LWNhY2hlLW1rZGlyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5YmM5MGEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDAzLWNoZWNrb3V0LWNhY2hlLW1rZGlyLnNoCkBAIC0wLDAgKzEsOTYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4IHRlc3QuCisKK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgLS1wcmVmaXggb3B0aW9uIHdvcmtzIGFzIGFkdmVydGlzZWQsIGFuZAorYWxzbyB2ZXJpZmllcyB0aGF0IHN1Y2ggbGVhZGluZyBwYXRoIG1heSBjb250YWluIHN5bWxpbmtzLCB1bmxpa2UKK3RoZSBHSVQgY29udHJvbGxlZCBwYXRocy4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZXR1cCcgXAorICAgICdta2RpciBwYXRoMSAmJgorICAgIGVjaG8gZnJvdHogPnBhdGgwICYmCisgICAgZWNobyByZXpyb3YgPnBhdGgxL2ZpbGUxICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMS9maWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2hhdmUgc3ltbGluayBpbiBwbGFjZSB3aGVyZSBkaXIgaXMgZXhwZWN0ZWQuJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSAmJgorICAgICBta2RpciBwYXRoMiAmJgorICAgICBsbiAtcyBwYXRoMiBwYXRoMSAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWEgJiYKKyAgICAgdGVzdCAhIC1oIHBhdGgxICYmIHRlc3QgLWQgcGF0aDEgJiYKKyAgICAgdGVzdCAtZiBwYXRoMS9maWxlMSAmJiB0ZXN0ICEgLWYgcGF0aDIvZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgLS1wcmVmaXg9cGF0aDIvJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSBwYXRoMiAmJgorICAgICBta2RpciBwYXRoMiAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9cGF0aDIvIC1mIC1hICYmCisgICAgIHRlc3QgLWYgcGF0aDIvcGF0aDAgJiYKKyAgICAgdGVzdCAtZiBwYXRoMi9wYXRoMS9maWxlMSAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDAgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgxL2ZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIC0tcHJlZml4PXRtcC0nIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PXRtcC0gLWYgLWEgJiYKKyAgICAgdGVzdCAtZiB0bXAtcGF0aDAgJiYKKyAgICAgdGVzdCAtZiB0bXAtcGF0aDEvZmlsZTEgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgwICYmCisgICAgIHRlc3QgISAtZiBwYXRoMS9maWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAtIGJ1dCB3aXRoIGEgY29uZmxpY3RpbmcgZmlsZSBhbmQgZGlyJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSBwYXRoMiB0bXAqICYmCisgICAgIGVjaG8gbml0Zm9sID50bXAtcGF0aDEgJiYKKyAgICAgbWtkaXIgdG1wLXBhdGgwICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD10bXAtIC1mIC1hICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgwICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgISAtZiBwYXRoMCAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDEvZmlsZTEnCisKKyMgTGludXMgZml4ICMxCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIC0tcHJlZml4PXRtcC9vcmFyeS8gd2hlcmUgdG1wIGlzIGEgc3ltbGluaycgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgdG1wKiAmJgorICAgICBta2RpciB0bXAxIHRtcDEvb3JhcnkgJiYKKyAgICAgbG4gLXMgdG1wMSB0bXAgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PXRtcC9vcmFyeS8gLWYgLWEgJiYKKyAgICAgdGVzdCAtZCB0bXAxL29yYXJ5ICYmCisgICAgIHRlc3QgLWYgdG1wMS9vcmFyeS9wYXRoMCAmJgorICAgICB0ZXN0IC1mIHRtcDEvb3JhcnkvcGF0aDEvZmlsZTEgJiYKKyAgICAgdGVzdCAtaCB0bXAnCisKKyMgTGludXMgZml4ICMyCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIC0tcHJlZml4PXRtcC9vcmFyeS0gd2hlcmUgdG1wIGlzIGEgc3ltbGluaycgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgdG1wKiAmJgorICAgICBta2RpciB0bXAxICYmCisgICAgIGxuIC1zIHRtcDEgdG1wICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD10bXAvb3JhcnktIC1mIC1hICYmCisgICAgIHRlc3QgLWYgdG1wMS9vcmFyeS1wYXRoMCAmJgorICAgICB0ZXN0IC1mIHRtcDEvb3JhcnktcGF0aDEvZmlsZTEgJiYKKyAgICAgdGVzdCAtaCB0bXAnCisKKyMgTGludXMgZml4ICMzCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIC0tcHJlZml4PXRtcC0gd2hlcmUgdG1wLXBhdGgxIGlzIGEgc3ltbGluaycgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgdG1wKiAmJgorICAgICBta2RpciB0bXAxICYmCisgICAgIGxuIC1zIHRtcDEgdG1wLXBhdGgxICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD10bXAtIC1mIC1hICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgwICYmCisgICAgIHRlc3QgISAtaCB0bXAtcGF0aDEgJiYKKyAgICAgdGVzdCAtZCB0bXAtcGF0aDEgJiYKKyAgICAgdGVzdCAtZiB0bXAtcGF0aDEvZmlsZTEnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MjAwNC1jaGVja291dC1jYWNoZS10ZW1wLnNoIGIvdC90MjAwNC1jaGVja291dC1jYWNoZS10ZW1wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxMDA5NTkKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDA0LWNoZWNrb3V0LWNhY2hlLXRlbXAuc2gKQEAgLTAsMCArMSwyMTIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgU2hhd24gUGVhcmNlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dC1pbmRleCAtLXRlbXAgdGVzdC4KKworV2l0aCAtLXRlbXAgZmxhZywgZ2l0LWNoZWNrb3V0LWluZGV4IHdyaXRlcyB0byB0ZW1wb3JhcnkgbWVyZ2UgZmlsZXMKK3JhdGhlciB0aGFuIHRoZSB0cmFja2VkIHBhdGguJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyYXRpb24nICcKK21rZGlyIGFzdWJkaXIgJiYKK2VjaG8gdHJlZTFwYXRoMCA+cGF0aDAgJiYKK2VjaG8gdHJlZTFwYXRoMSA+cGF0aDEgJiYKK2VjaG8gdHJlZTFwYXRoMyA+cGF0aDMgJiYKK2VjaG8gdHJlZTFwYXRoNCA+cGF0aDQgJiYKK2VjaG8gdHJlZTFhc3ViZGlyL3BhdGg1ID5hc3ViZGlyL3BhdGg1ICYmCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwIHBhdGgxIHBhdGgzIHBhdGg0IGFzdWJkaXIvcGF0aDUgJiYKK3QxPSQoZ2l0LXdyaXRlLXRyZWUpICYmCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorZWNobyB0cmVlMnBhdGgwID5wYXRoMCAmJgorZWNobyB0cmVlMnBhdGgxID5wYXRoMSAmJgorZWNobyB0cmVlMnBhdGgyID5wYXRoMiAmJgorZWNobyB0cmVlMnBhdGg0ID5wYXRoNCAmJgorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMSBwYXRoMiBwYXRoNCAmJgordDI9JChnaXQtd3JpdGUtdHJlZSkgJiYKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAuZ2l0L2luZGV4ICYmCitlY2hvIHRyZWUycGF0aDAgPnBhdGgwICYmCitlY2hvIHRyZWUzcGF0aDEgPnBhdGgxICYmCitlY2hvIHRyZWUzcGF0aDIgPnBhdGgyICYmCitlY2hvIHRyZWUzcGF0aDMgPnBhdGgzICYmCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwIHBhdGgxIHBhdGgyIHBhdGgzICYmCit0Mz0kKGdpdC13cml0ZS10cmVlKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgb25lIHN0YWdlIDAgdG8gdGVtcG9yYXJ5IGZpbGUnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAuZ2l0L2luZGV4ICYmCitnaXQtcmVhZC10cmVlICR0MSAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tdGVtcCAtLSBwYXRoMSA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gcGF0aDEgJiYKK3A9JChjdXQgIi1kCSIgLWYxIG91dCkgJiYKK3Rlc3QgLWYgJHAgJiYKK3Rlc3QgJChjYXQgJHApID0gdHJlZTFwYXRoMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlIDAgdG8gdGVtcG9yYXJ5IGZpbGVzJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorZ2l0LXJlYWQtdHJlZSAkdDEgJiYKK2dpdC1jaGVja291dC1pbmRleCAtYSAtLXRlbXAgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gNSAmJgorZm9yIGYgaW4gcGF0aDAgcGF0aDEgcGF0aDMgcGF0aDQgYXN1YmRpci9wYXRoNQorZG8KKwl0ZXN0ICQoZ3JlcCAkZiBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9ICRmICYmCisJcD0kKGdyZXAgJGYgb3V0IHwgY3V0ICItZAkiIC1mMSkgJiYKKwl0ZXN0IC1mICRwICYmCisJdGVzdCAkKGNhdCAkcCkgPSB0cmVlMSRmCitkb25lJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydwcmVwYXJlIDMtd2F5IG1lcmdlJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorZ2l0LXJlYWQtdHJlZSAtbSAkdDEgJHQyICR0MycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgb25lIHN0YWdlIDIgdG8gdGVtcG9yYXJ5IGZpbGUnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tc3RhZ2U9MiAtLXRlbXAgLS0gcGF0aDEgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMSAmJgordGVzdCAkKGN1dCAiLWQJIiAtZjIgb3V0KSA9IHBhdGgxICYmCitwPSQoY3V0ICItZAkiIC1mMSBvdXQpICYmCit0ZXN0IC1mICRwICYmCit0ZXN0ICQoY2F0ICRwKSA9IHRyZWUycGF0aDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IGFsbCBzdGFnZSAyIHRvIHRlbXBvcmFyeSBmaWxlcycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0ICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLS1hbGwgLS1zdGFnZT0yIC0tdGVtcCA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAzICYmCitmb3IgZiBpbiBwYXRoMSBwYXRoMiBwYXRoNAorZG8KKwl0ZXN0ICQoZ3JlcCAkZiBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9ICRmICYmCisJcD0kKGdyZXAgJGYgb3V0IHwgY3V0ICItZAkiIC1mMSkgJiYKKwl0ZXN0IC1mICRwICYmCisJdGVzdCAkKGNhdCAkcCkgPSB0cmVlMiRmCitkb25lJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBhbGwgc3RhZ2VzL29uZSBmaWxlIHRvIG5vdGhpbmcnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tc3RhZ2U9YWxsIC0tdGVtcCAtLSBwYXRoMCA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAwJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBhbGwgc3RhZ2VzL29uZSBmaWxlIHRvIHRlbXBvcmFyeSBmaWxlcycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0ICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLS1zdGFnZT1hbGwgLS10ZW1wIC0tIHBhdGgxID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKK3Rlc3QgJChjdXQgIi1kCSIgLWYyIG91dCkgPSBwYXRoMSAmJgorY3V0ICItZAkiIC1mMSBvdXQgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAtZiAkczEgJiYKK3Rlc3QgLWYgJHMyICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFwYXRoMSAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoMSAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IHNvbWUgc3RhZ2VzL29uZSBmaWxlIHRvIHRlbXBvcmFyeSBmaWxlcycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0ICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLS1zdGFnZT1hbGwgLS10ZW1wIC0tIHBhdGgyID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKK3Rlc3QgJChjdXQgIi1kCSIgLWYyIG91dCkgPSBwYXRoMiAmJgorY3V0ICItZAkiIC1mMSBvdXQgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAkczEgPSAuICYmCit0ZXN0IC1mICRzMiAmJgordGVzdCAtZiAkczMgJiYKK3Rlc3QgJChjYXQgJHMyKSA9IHRyZWUycGF0aDIgJiYKK3Rlc3QgJChjYXQgJHMzKSA9IHRyZWUzcGF0aDIpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBhbGwgc3RhZ2VzL2FsbCBmaWxlcyB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC1hIC0tc3RhZ2U9YWxsIC0tdGVtcCA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSA1JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyctLSBwYXRoMDogbm8gZW50cnknICcKK3Rlc3QgeCQoZ3JlcCBwYXRoMCBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHgnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGgxOiBhbGwgMyBzdGFnZXMnICcKK3Rlc3QgJChncmVwIHBhdGgxIG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDEgJiYKK2dyZXAgcGF0aDEgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0IC1mICRzMSAmJgordGVzdCAtZiAkczIgJiYKK3Rlc3QgLWYgJHMzICYmCit0ZXN0ICQoY2F0ICRzMSkgPSB0cmVlMXBhdGgxICYmCit0ZXN0ICQoY2F0ICRzMikgPSB0cmVlMnBhdGgxICYmCit0ZXN0ICQoY2F0ICRzMykgPSB0cmVlM3BhdGgxKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnLS0gcGF0aDI6IG5vIHN0YWdlIDEsIGhhdmUgc3RhZ2UgMiBhbmQgMycgJwordGVzdCAkKGdyZXAgcGF0aDIgb3V0IHwgY3V0ICItZAkiIC1mMikgPSBwYXRoMiAmJgorZ3JlcCBwYXRoMiBvdXQgfCBjdXQgIi1kCSIgLWYxIHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgJHMxID0gLiAmJgordGVzdCAtZiAkczIgJiYKK3Rlc3QgLWYgJHMzICYmCit0ZXN0ICQoY2F0ICRzMikgPSB0cmVlMnBhdGgyICYmCit0ZXN0ICQoY2F0ICRzMykgPSB0cmVlM3BhdGgyKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnLS0gcGF0aDM6IG5vIHN0YWdlIDIsIGhhdmUgc3RhZ2UgMSBhbmQgMycgJwordGVzdCAkKGdyZXAgcGF0aDMgb3V0IHwgY3V0ICItZAkiIC1mMikgPSBwYXRoMyAmJgorZ3JlcCBwYXRoMyBvdXQgfCBjdXQgIi1kCSIgLWYxIHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgLWYgJHMxICYmCit0ZXN0ICRzMiA9IC4gJiYKK3Rlc3QgLWYgJHMzICYmCit0ZXN0ICQoY2F0ICRzMSkgPSB0cmVlMXBhdGgzICYmCit0ZXN0ICQoY2F0ICRzMykgPSB0cmVlM3BhdGgzKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnLS0gcGF0aDQ6IG5vIHN0YWdlIDMsIGhhdmUgc3RhZ2UgMSBhbmQgMycgJwordGVzdCAkKGdyZXAgcGF0aDQgb3V0IHwgY3V0ICItZAkiIC1mMikgPSBwYXRoNCAmJgorZ3JlcCBwYXRoNCBvdXQgfCBjdXQgIi1kCSIgLWYxIHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgLWYgJHMxICYmCit0ZXN0IC1mICRzMiAmJgordGVzdCAkczMgPSAuICYmCit0ZXN0ICQoY2F0ICRzMSkgPSB0cmVlMXBhdGg0ICYmCit0ZXN0ICQoY2F0ICRzMikgPSB0cmVlMnBhdGg0KScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnLS0gYXN1YmRpci9wYXRoNTogbm8gc3RhZ2UgMiBhbmQgMyBoYXZlIHN0YWdlIDEnICcKK3Rlc3QgJChncmVwIGFzdWJkaXIvcGF0aDUgb3V0IHwgY3V0ICItZAkiIC1mMikgPSBhc3ViZGlyL3BhdGg1ICYmCitncmVwIGFzdWJkaXIvcGF0aDUgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0IC1mICRzMSAmJgordGVzdCAkczIgPSAuICYmCit0ZXN0ICRzMyA9IC4gJiYKK3Rlc3QgJChjYXQgJHMxKSA9IHRyZWUxYXN1YmRpci9wYXRoNSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IC0tdGVtcCB3aXRoaW4gc3ViZGlyJyAnCisoY2QgYXN1YmRpciAmJgorIGdpdC1jaGVja291dC1pbmRleCAtYSAtLXN0YWdlPWFsbCA+b3V0ICYmCisgdGVzdCAkKHdjIC1sIDxvdXQpID0gMSAmJgorIHRlc3QgJChncmVwIHBhdGg1IG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDUgJiYKKyBncmVwIHBhdGg1IG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgorIHRlc3QgLWYgLi4vJHMxICYmCisgdGVzdCAkczIgPSAuICYmCisgdGVzdCAkczMgPSAuICYmCisgdGVzdCAkKGNhdCAuLi8kczEpID0gdHJlZTFhc3ViZGlyL3BhdGg1KQorKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgLS10ZW1wIHN5bWxpbmsnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAuZ2l0L2luZGV4ICYmCitsbiAtcyBiIGEgJiYKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgYSAmJgordDQ9JChnaXQtd3JpdGUtdHJlZSkgJiYKK3JtIC1mIC5naXQvaW5kZXggJiYKK2dpdC1yZWFkLXRyZWUgJHQ0ICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLS10ZW1wIC1hID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKK3Rlc3QgJChjdXQgIi1kCSIgLWYyIG91dCkgPSBhICYmCitwPSQoY3V0ICItZAkiIC1mMSBvdXQpICYmCit0ZXN0IC1mICRwICYmCit0ZXN0ICQoY2F0ICRwKSA9IGInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MjEwMC11cGRhdGUtY2FjaGUtYmFkcGF0aC5zaCBiL3QvdDIxMDAtdXBkYXRlLWNhY2hlLWJhZHBhdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWJjMGEzYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIxMDAtdXBkYXRlLWNhY2hlLWJhZHBhdGguc2gKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtdXBkYXRlLWluZGV4IG5vbnNlbnNlLXBhdGggdGVzdC4KKworVGhpcyB0ZXN0IGNyZWF0ZXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIGNhY2hlOgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMSAgICAgICAtIGEgc3ltbGluaworICAgIHBhdGgyL2ZpbGUyIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvZmlsZTMgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworYW5kIHRyaWVzIHRvIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgdGhlIGZvbGxvd2luZzoKKworICAgIHBhdGgwL2ZpbGUwIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMiAgICAgICAtIGEgZmlsZQorICAgIHBhdGgzICAgICAgIC0gYSBzeW1saW5rCisKK0FsbCBvZiB0aGUgYXR0ZW1wdHMgc2hvdWxkIGZhaWwuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitta2RpciBwYXRoMiBwYXRoMworZGF0ZSA+cGF0aDAKK2xuIC1zIHh5enp5IHBhdGgxCitkYXRlID5wYXRoMi9maWxlMgorZGF0ZSA+cGF0aDMvZmlsZTMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgdG8gYWRkIHZhcmlvdXMgcGF0aHMuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgLS0gcGF0aDAgcGF0aDEgcGF0aDIvZmlsZTIgcGF0aDMvZmlsZTMnCisKK3JtIC1mciBwYXRoPworCitta2RpciBwYXRoMCBwYXRoMQorZGF0ZSA+cGF0aDIKK2xuIC1zIGZyb3R6IHBhdGgzCitkYXRlID5wYXRoMC9maWxlMAorZGF0ZSA+cGF0aDEvZmlsZTEKKworZm9yIHAgaW4gcGF0aDAvZmlsZTAgcGF0aDEvZmlsZTEgcGF0aDIgcGF0aDMKK2RvCisJdGVzdF9leHBlY3RfZmFpbHVyZSBcCisJICAgICJnaXQtdXBkYXRlLWluZGV4IHRvIGFkZCBjb25mbGljdGluZyBwYXRoICRwIHNob3VsZCBmYWlsLiIgXAorCSAgICAiZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLSAkcCIKK2RvbmUKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MjEwMS11cGRhdGUtaW5kZXgtcmV1cGRhdGUuc2ggYi90L3QyMTAxLXVwZGF0ZS1pbmRleC1yZXVwZGF0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNzhlYTdmCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjEwMS11cGRhdGUtaW5kZXgtcmV1cGRhdGUuc2gKQEAgLTAsMCArMSw4NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtdXBkYXRlLWluZGV4IC0tYWdhaW4gdGVzdC4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IDNiMThlNTEyZGJhNzllNGM4MzAwZGQwOGFlYjM3ZjhlNzI4YjhkYWQgMAlmaWxlMQorMTAwNjQ0IDlkYjg4OTM4NTZhOGEwMmVhYTczNDcwMDU0YjdjMWM1YTdjODJlNDcgMAlmaWxlMgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggLS1hZGQnIFwKKwknZWNobyBoZWxsbyB3b3JsZCA+ZmlsZTEgJiYKKwkgZWNobyBnb29kYnllIHBlb3BsZSA+ZmlsZTIgJiYKKwkgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlMSBmaWxlMiAmJgorCSBnaXQtbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwkgY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCAtLWFnYWluJyBcCisJJ3JtIC1mIGZpbGUxICYmCisJZWNobyBoZWxsbyBldmVyeWJvZHkgPmZpbGUyICYmCisJaWYgZ2l0LXVwZGF0ZS1pbmRleCAtLWFnYWluCisJdGhlbgorCQllY2hvIHNob3VsZCBoYXZlIHJlZnVzZWQgdG8gcmVtb3ZlIGZpbGUxCisJCWV4aXQgMQorCWVsc2UKKwkJZWNobyBoYXBweSAtIGZhaWxlZCBhcyBleHBlY3RlZAorCWZpICYmCisJIGdpdC1scy1maWxlcyAtcyA+Y3VycmVudCAmJgorCSBjbXAgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgMGYxYWUxNDIyYzJiZjQzZjExN2QzZGJkNzE1Yzk4OGE5ZWQyMTAzZiAwCWZpbGUyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLWFnYWluJyBcCisJJ2dpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLS1hZ2FpbiAmJgorCSBnaXQtbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwkgY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpcnN0IGNvbW1pdCcgJ2dpdC1jb21taXQgLW0gaW5pdGlhbCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgNTNhYjQ0NmMzZjRlNDJjZTliYjcyOGEwY2NiMjgzYTEwMWJlNDk3OSAwCWRpcjEvZmlsZTMKKzEwMDY0NCAwZjFhZTE0MjJjMmJmNDNmMTE3ZDNkYmQ3MTVjOTg4YTllZDIxMDNmIDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IGFnYWluJyBcCisJJ21rZGlyIC1wIGRpcjEgJiYKKwllY2hvIGhlbGxvIHdvcmxkID5kaXIxL2ZpbGUzICYmCisJZWNobyBnb29kYnllIHBlb3BsZSA+ZmlsZTIgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUyIGRpcjEvZmlsZTMgJiYKKwllY2hvIGhlbGxvIGV2ZXJ5Ym9keSA+ZmlsZTIKKwllY2hvIGhhcHB5ID5kaXIxL2ZpbGUzICYmCisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFnYWluICYmCisJZ2l0LWxzLWZpbGVzIC1zID5jdXJyZW50ICYmCisJY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IGQ3ZmIzZjY5NWYwNmM3NTlkYmYzYWIwMDA0NmU3Y2MyZGEyMmQxMGYgMAlkaXIxL2ZpbGUzCisxMDA2NDQgMGYxYWUxNDIyYzJiZjQzZjExN2QzZGJkNzE1Yzk4OGE5ZWQyMTAzZiAwCWZpbGUyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCAtLXVwZGF0ZSBmcm9tIHN1YmRpcicgXAorCSdlY2hvIG5vdCBzbyBoYXBweSA+ZmlsZTIgJiYKKwljZCBkaXIxICYmCisJY2F0IC4uL2ZpbGUyID5maWxlMyAmJgorCWdpdC11cGRhdGUtaW5kZXggLS1hZ2FpbiAmJgorCWNkIC4uICYmCisJZ2l0LWxzLWZpbGVzIC1zID5jdXJyZW50ICYmCisJY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IDU5NGZiNWJiMTc1OWQ5MDk5OGUyYmYyYTM4MjYxYWU4ZTI0M2M3NjAgMAlkaXIxL2ZpbGUzCisxMDA2NDQgMGYxYWUxNDIyYzJiZjQzZjExN2QzZGJkNzE1Yzk4OGE5ZWQyMTAzZiAwCWZpbGUyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCAtLXVwZGF0ZSB3aXRoIHBhdGhzcGVjJyBcCisJJ2VjaG8gdmVyeSBoYXBweSA+ZmlsZTIgJiYKKwljYXQgZmlsZTIgPmRpcjEvZmlsZTMgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWdhaW4gZGlyMS8gJiYKKwlnaXQtbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwljbXAgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDAwLWxzLWZpbGVzLW90aGVycy5zaCBiL3QvdDMwMDAtbHMtZmlsZXMtb3RoZXJzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkY2JlMDMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAwLWxzLWZpbGVzLW90aGVycy5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy1maWxlcyB0ZXN0ICgtLW90aGVycyBzaG91bGQgcGljayB1cCBzeW1saW5rcykuCisKK1RoaXMgdGVzdCBydW5zIGdpdC1scy1maWxlcyAtLW90aGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgb24gdGhlCitmaWxlc3lzdGVtLgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMQktIGEgc3ltbGluaworICAgIHBhdGgyL2ZpbGUyIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMtanVuayAgLSBhIGZpbGUgdG8gY29uZnVzZSB0aGluZ3MKKyAgICBwYXRoMy9maWxlMyAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorJworLiAuL3Rlc3QtbGliLnNoCisKK2RhdGUgPnBhdGgwCitsbiAtcyB4eXp6eSBwYXRoMQorbWtkaXIgcGF0aDIgcGF0aDMKK2RhdGUgPnBhdGgyL2ZpbGUyCitkYXRlID5wYXRoMi1qdW5rCitkYXRlID5wYXRoMy9maWxlMworZGF0ZSA+cGF0aDMtanVuaworZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMy1qdW5rIHBhdGgzL2ZpbGUzCisKK2NhdCA+ZXhwZWN0ZWQxIDw8RU9GCitleHBlY3RlZDEKK2V4cGVjdGVkMgorb3V0cHV0CitwYXRoMAorcGF0aDEKK3BhdGgyLWp1bmsKK3BhdGgyL2ZpbGUyCitFT0YKK3NlZCAtZSAnc3xwYXRoMi9maWxlMnxwYXRoMi98JyA8ZXhwZWN0ZWQxID5leHBlY3RlZDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyB0byBzaG93IG91dHB1dC4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzID5vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgc2hvdWxkIHBpY2sgdXAgc3ltbGlua3MuJyBcCisgICAgJ2RpZmYgb3V0cHV0IGV4cGVjdGVkMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLWRpcmVjdG9yeSB0byBzaG93IG91dHB1dC4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tZGlyZWN0b3J5ID5vdXRwdXQnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLWRpcmVjdG9yeSBzaG91bGQgbm90IGdldCBjb25mdXNlZC4nIFwKKyAgICAnZGlmZiBvdXRwdXQgZXhwZWN0ZWQyJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwMDEtbHMtZmlsZXMtb3RoZXJzLWV4Y2x1ZGUuc2ggYi90L3QzMDAxLWxzLWZpbGVzLW90aGVycy1leGNsdWRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5NzliN2MKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAxLWxzLWZpbGVzLW90aGVycy1leGNsdWRlLnNoCkBAIC0wLDAgKzEsODIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZQorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtZmlsZXMgLS1vdGhlcnMgYW5kIHRlc3RzIC0tZXhjbHVkZSBwYXR0ZXJucy4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3JtIC1mciBvbmUgdGhyZWUKK2ZvciBkaXIgaW4gLiBvbmUgb25lL3R3byB0aHJlZQorZG8KKyAgbWtkaXIgLXAgJGRpciAmJgorICBmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDgKKyAgZG8KKyAgICA+JGRpci9hLiRpCisgIGRvbmUKK2RvbmUKKworY2F0ID5leHBlY3QgPDxFT0YKK2EuMgorYS40CithLjUKK2EuOAorb25lL2EuMworb25lL2EuNAorb25lL2EuNQorb25lL2EuNworb25lL3R3by9hLjIKK29uZS90d28vYS4zCitvbmUvdHdvL2EuNQorb25lL3R3by9hLjcKK29uZS90d28vYS44Cit0aHJlZS9hLjIKK3RocmVlL2EuMwordGhyZWUvYS40Cit0aHJlZS9hLjUKK3RocmVlL2EuOAorRU9GCisKK2VjaG8gJy5naXRpZ25vcmUKK291dHB1dAorZXhwZWN0CisuZ2l0aWdub3JlCisqLjcKKyEqLjgnID4uZ2l0L2lnbm9yZQorCitlY2hvICcqLjEKKy8qLjMKKyEqLjYnID4uZ2l0aWdub3JlCitlY2hvICcqLjIKK3R3by8qLjQKKyEqLjcKKyouOCcgPm9uZS8uZ2l0aWdub3JlCitlY2hvICchKi4yCishKi44JyA+b25lL3R3by8uZ2l0aWdub3JlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgd2l0aCB2YXJpb3VzIGV4Y2x1ZGUgb3B0aW9ucy4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIFwKKyAgICAgICAtLWV4Y2x1ZGU9XCouNiBcCisgICAgICAgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSBcCisgICAgICAgLS1leGNsdWRlLWZyb209LmdpdC9pZ25vcmUgXAorICAgICAgID5vdXRwdXQgJiYKKyAgICAgZGlmZiAtdSBleHBlY3Qgb3V0cHV0JworCisjIFRlc3QgXHJcbiAoTVNET1MtbGlrZSBzeXN0ZW1zKQorcHJpbnRmICcqLjFcclxuLyouM1xyXG4hKi42XHJcbicgPi5naXRpZ25vcmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyB3aXRoIFxyXG4gbGluZSBlbmRpbmdzLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgXAorICAgICAgIC0tZXhjbHVkZT1cKi42IFwKKyAgICAgICAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlIFwKKyAgICAgICAtLWV4Y2x1ZGUtZnJvbT0uZ2l0L2lnbm9yZSBcCisgICAgICAgPm91dHB1dCAmJgorICAgICBkaWZmIC11IGV4cGVjdCBvdXRwdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzAwMi1scy1maWxlcy1kYXNocGF0aC5zaCBiL3QvdDMwMDItbHMtZmlsZXMtZGFzaHBhdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjQyZjEzOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMwMDItbHMtZmlsZXMtZGFzaHBhdGguc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbHMtZmlsZXMgdGVzdCAoLS0gdG8gdGVybWluYXRlIHRoZSBwYXRoIGxpc3QpLgorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtZmlsZXMgLS1vdGhlcnMgd2l0aCB0aGUgZm9sbG93aW5nIG9uIHRoZQorZmlsZXN5c3RlbS4KKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgLWZvbwktIGEgZmlsZSB3aXRoIGEgZnVubnkgbmFtZS4KKyAgICAtLQkJLSBhbm90aGVyIGZpbGUgd2l0aCBhIGZ1bm55IG5hbWUuCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJc2V0dXAgXAorCSdlY2hvIGZyb3R6ID5wYXRoMCAmJgorCWVjaG8gZnJvdHogPi4vLWZvbyAmJgorCWVjaG8gZnJvdHogPi4vLS0nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgd2l0aG91dCBwYXRoIHJlc3RyaWN0aW9uLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgPm91dHB1dCAmJgorICAgICBkaWZmIC11IG91dHB1dCAtIDw8RU9GCistLQorLWZvbworb3V0cHV0CitwYXRoMAorRU9GCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgd2l0aCBwYXRoIHJlc3RyaWN0aW9uLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgcGF0aDAgPm91dHB1dCAmJgorCWRpZmYgLXUgb3V0cHV0IC0gPDxFT0YKK3BhdGgwCitFT0YKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyB3aXRoIHBhdGggcmVzdHJpY3Rpb24gd2l0aCAtLS4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tIHBhdGgwID5vdXRwdXQgJiYKKwlkaWZmIC11IG91dHB1dCAtIDw8RU9GCitwYXRoMAorRU9GCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgd2l0aCBwYXRoIHJlc3RyaWN0aW9uIHdpdGggLS0gLS0uJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLSAtLSA+b3V0cHV0ICYmCisJZGlmZiAtdSBvdXRwdXQgLSA8PEVPRgorLS0KK0VPRgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIHdpdGggbm8gcGF0aCByZXN0cmljdGlvbi4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tID5vdXRwdXQgJiYKKwlkaWZmIC11IG91dHB1dCAtIDw8RU9GCistLQorLWZvbworb3V0cHV0CitwYXRoMAorRU9GCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzAxMC1scy1maWxlcy1raWxsZWQtbW9kaWZpZWQuc2ggYi90L3QzMDEwLWxzLWZpbGVzLWtpbGxlZC1tb2RpZmllZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZmMxOTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzAxMC1scy1maWxlcy1raWxsZWQtbW9kaWZpZWQuc2gKQEAgLTAsMCArMSw5NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbHMtZmlsZXMgLWsgYW5kIC1tIGZsYWdzIHRlc3QuCisKK1RoaXMgdGVzdCBwcmVwYXJlcyB0aGUgZm9sbG93aW5nIGluIHRoZSBjYWNoZToKKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDEgICAgICAgLSBhIHN5bWxpbmsKKyAgICBwYXRoMi9maWxlMiAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgzL2ZpbGUzIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK2FuZCB0aGUgZm9sbG93aW5nIG9uIHRoZSBmaWxlc3lzdGVtOgorCisgICAgcGF0aDAvZmlsZTAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMS9maWxlMSAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgyICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDMgICAgICAgLSBhIHN5bWxpbmsKKyAgICBwYXRoNAktIGEgZmlsZQorICAgIHBhdGg1CS0gYSBzeW1saW5rCisgICAgcGF0aDYvZmlsZTYgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworZ2l0LWxzLWZpbGVzIC1rIHNob3VsZCByZXBvcnQgdGhhdCBleGlzdGluZyBmaWxlc3lzdGVtCitvYmplY3RzIGV4Y2VwdCBwYXRoNCwgcGF0aDUgYW5kIHBhdGg2L2ZpbGU2IHRvIGJlIGtpbGxlZC4KKworQWxzbyBmb3IgbW9kaWZpY2F0aW9uIHRlc3QsIHRoZSBjYWNoZSBhbmQgd29ya2luZyB0cmVlIGhhdmU6CisKKyAgICBwYXRoNyAgICAgICAtIGFuIGVtcHR5IGZpbGUsIG1vZGlmaWVkIHRvIGEgbm9uLWVtcHR5IGZpbGUuCisgICAgcGF0aDggICAgICAgLSBhIG5vbi1lbXB0eSBmaWxlLCBtb2RpZmllZCB0byBhbiBlbXB0eSBmaWxlLgorICAgIHBhdGg5CS0gYW4gZW1wdHkgZmlsZSwgY2FjaGUgZGlydGllZC4KKyAgICBwYXRoMTAJLSBhIG5vbi1lbXB0eSBmaWxlLCBjYWNoZSBkaXJ0aWVkLgorCitXZSBzaG91bGQgcmVwb3J0IHBhdGgwLCBwYXRoMSwgcGF0aDIvZmlsZTIsIHBhdGgzL2ZpbGUzLCBwYXRoNyBhbmQgcGF0aDgKK21vZGlmaWVkIHdpdGhvdXQgcmVwb3J0aW5nIHBhdGg5IGFuZCBwYXRoMTAuCisnCisuIC4vdGVzdC1saWIuc2gKKworZGF0ZSA+cGF0aDAKK2xuIC1zIHh5enp5IHBhdGgxCitta2RpciBwYXRoMiBwYXRoMworZGF0ZSA+cGF0aDIvZmlsZTIKK2RhdGUgPnBhdGgzL2ZpbGUzCis6ID5wYXRoNworZGF0ZSA+cGF0aDgKKzogPnBhdGg5CitkYXRlID5wYXRoMTAKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHRvIGFkZCB2YXJpb3VzIHBhdGhzLicgXAorICAgICJnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tIHBhdGgwIHBhdGgxIHBhdGg/L2ZpbGU/IHBhdGg3IHBhdGg4IHBhdGg5IHBhdGgxMCIKKworcm0gLWZyIHBhdGg/IDsjIGxlYXZlIHBhdGgxMCBhbG9uZQorZGF0ZSA+cGF0aDIKK2xuIC1zIGZyb3R6IHBhdGgzCitsbiAtcyBuaXRmb2wgcGF0aDUKK21rZGlyIHBhdGgwIHBhdGgxIHBhdGg2CitkYXRlID5wYXRoMC9maWxlMAorZGF0ZSA+cGF0aDEvZmlsZTEKK2RhdGUgPnBhdGg2L2ZpbGU2CitkYXRlID5wYXRoNworOiA+cGF0aDgKKzogPnBhdGg5Cit0b3VjaCBwYXRoMTAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyAtayB0byBzaG93IGtpbGxlZCBmaWxlcy4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC1rID4ub3V0cHV0JworY2F0ID4uZXhwZWN0ZWQgPDxFT0YKK3BhdGgwL2ZpbGUwCitwYXRoMS9maWxlMQorcGF0aDIKK3BhdGgzCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdC1scy1maWxlcyAtayBvdXRwdXQuJyBcCisgICAgJ2RpZmYgLm91dHB1dCAuZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLW0gdG8gc2hvdyBtb2RpZmllZCBmaWxlcy4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC1tID4ub3V0cHV0JworY2F0ID4uZXhwZWN0ZWQgPDxFT0YKK3BhdGgwCitwYXRoMQorcGF0aDIvZmlsZTIKK3BhdGgzL2ZpbGUzCitwYXRoNworcGF0aDgKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZ2l0LWxzLWZpbGVzIC1tIG91dHB1dC4nIFwKKyAgICAnZGlmZiAub3V0cHV0IC5leHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDIwLWxzLWZpbGVzLWVycm9yLXVubWF0Y2guc2ggYi90L3QzMDIwLWxzLWZpbGVzLWVycm9yLXVubWF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDU1NTU5ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMwMjAtbHMtZmlsZXMtZXJyb3ItdW5tYXRjaC5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IENhcmwgRC4gV29ydGgKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWxzLWZpbGVzIHRlc3QgZm9yIC0tZXJyb3ItdW5tYXRjaCBvcHRpb24KKworVGhpcyB0ZXN0IHJ1bnMgZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCB0byBlbnN1cmUgaXQgY29ycmVjdGx5CityZXR1cm5zIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcGF0aCBpcyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZAorbGluZS4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0b3VjaCBmb28gYmFyCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZvbyBiYXIKK2dpdC1jb21taXQgLW0gImFkZCBmb28gYmFyIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBzaG91bGQgZmFpbCB3aXRoIHVubWF0Y2hlZCBwYXRoLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbyBiYXItZG9lcy1ub3QtbWF0Y2gnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIHNob3VsZCBzdWNjZWVkIGVpdGggbWF0Y2hlZCBwYXRocy4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBmb28gYmFyJworCit0ZXN0X2RvbmUKKzEKZGlmZiAtLWdpdCBhL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZWMwNmQzCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCkBAIC0wLDAgKzEsMTU4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy10cmVlIHRlc3QuCisKK1RoaXMgdGVzdCBydW5zIGdpdC1scy10cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbiBhIHRyZWUuCisKKyAgICBwYXRoMCAgICAgICAtIGEgZmlsZQorICAgIHBhdGgxCS0gYSBzeW1saW5rCisgICAgcGF0aDIvZm9vICAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMi9iYXpibyAtIGEgc3ltbGluayBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgyL2Jhei9iIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5CisKK1RoZSBuZXcgcGF0aCByZXN0cmljdGlvbiBjb2RlIHNob3VsZCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHBhdGgyIGFuZAorcGF0aDIvYmF6LiAgQWxzbyBwYXRoMC8gc2hvdWxkIHNub3cgbm90aGluZy4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnbWtkaXIgcGF0aDIgcGF0aDIvYmF6ICYmCisgICAgIGVjaG8gSGkgPnBhdGgwICYmCisgICAgIGxuIC1zIHBhdGgwIHBhdGgxICYmCisgICAgIGVjaG8gTG8gPnBhdGgyL2ZvbyAmJgorICAgICBsbiAtcyAuLi9wYXRoMSBwYXRoMi9iYXpibyAmJgorICAgICBlY2hvIE1pID5wYXRoMi9iYXovYiAmJgorICAgICBmaW5kIHBhdGg/IFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtcHJpbnQgfAorICAgICB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Rlc3Rfb3V0cHV0ICgpIHsKKyAgICBzZWQgLWUgInMvICRfeDQwCS8gWAkvIiA8Y3VycmVudCA+Y2hlY2sKKyAgICBkaWZmIC11IGV4cGVjdGVkIGNoZWNrCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIHBsYWluJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCXBhdGgwCisxMjAwMDAgYmxvYiBYCXBhdGgxCiswNDAwMDAgdHJlZSBYCXBhdGgyCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIHJlY3Vyc2l2ZScgXAorICAgICdnaXQtbHMtdHJlZSAtciAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMAorMTIwMDAwIGJsb2IgWAlwYXRoMQorMTAwNjQ0IGJsb2IgWAlwYXRoMi9iYXovYgorMTIwMDAwIGJsb2IgWAlwYXRoMi9iYXpibworMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgcmVjdXJzaXZlIHdpdGggLXQnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgLXQgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJcGF0aDAKKzEyMDAwMCBibG9iIFgJcGF0aDEKKzA0MDAwMCB0cmVlIFgJcGF0aDIKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CisxMDA2NDQgYmxvYiBYCXBhdGgyL2Jhei9iCisxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisxMDA2NDQgYmxvYiBYCXBhdGgyL2ZvbworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSByZWN1cnNpdmUgd2l0aCAtZCcgXAorICAgICdnaXQtbHMtdHJlZSAtciAtZCAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMDQwMDAwIHRyZWUgWAlwYXRoMgorMDQwMDAwIHRyZWUgWAlwYXRoMi9iYXoKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGggPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworCisjIGl0IHVzZWQgdG8gYmUgcGF0aDEgYW5kIHRoZW4gcGF0aDAsIGJ1dCB3aXRoIHBhdGhzcGVjIHNlbWFudGljcworIyB0aGV5IGFyZSBzaG93biBpbiBjYW5vbmljYWwgb3JkZXIuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgxIHBhdGgwJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGgxIHBhdGgwID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCXBhdGgwCisxMjAwMDAgYmxvYiBYCXBhdGgxCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aDAvJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGgwLyA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIEl0IHVzZWQgdG8gc2hvdyBwYXRoMiBhbmQgaXRzIGltbWVkaWF0ZSBjaGlsZHJlbiBidXQKKyMgd2l0aCBwYXRoc3BlYyBzZW1hbnRpY3MgaXQgc2hvd3Mgb25seSBwYXRoMgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoMicgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMiA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMDQwMDAwIHRyZWUgWAlwYXRoMgorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIC4uLiBhbmQgcGF0aDIvIHNob3dzIHRoZSBjaGlsZHJlbi4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aDIvJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGgyLyA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMDQwMDAwIHRyZWUgWAlwYXRoMi9iYXoKKzEyMDAwMCBibG9iIFgJcGF0aDIvYmF6Ym8KKzEwMDY0NCBibG9iIFgJcGF0aDIvZm9vCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKKyMgVGhlIHNhbWUgY2hhbmdlIC0tIGV4YWN0IG1hdGNoIGRvZXMgbm90IHNob3cgY2hpbGRyZW4gb2YKKyMgcGF0aDIvYmF6Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgyL2JheicgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMi9iYXogPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aDIvYmFrJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGgyL2JhayA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSAtdCBmaWx0ZXJlZCB3aXRoIHBhdGgyL2JhaycgXAorICAgICdnaXQtbHMtdHJlZSAtdCAkdHJlZSBwYXRoMi9iYWsgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMTAxLWxzLXRyZWUtZGlybmFtZS5zaCBiL3QvdDMxMDEtbHMtdHJlZS1kaXJuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3OGRlYjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMTAxLWxzLXRyZWUtZGlybmFtZS5zaApAQCAtMCwwICsxLDEzOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIyBDb3B5cmlnaHQgKGMpIDIwMDUgUm9iZXJ0IEZpdHpzaW1vbnMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWxzLXRyZWUgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZXMgaGFuZGxpbmcuCisKK1RoaXMgdGVzdCBydW5zIGdpdC1scy10cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbiBhIHRyZWUuCisKKyAgICAxLnR4dCAgICAgICAgICAgICAgLSBhIGZpbGUKKyAgICAyLnR4dCAgICAgICAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMC9hL2IvYy8xLnR4dCAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMS9iL2MvMS50eHQgICAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMi8xLnR4dCAgICAgICAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMy8xLnR4dCAgICAgICAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMy8yLnR4dCAgICAgICAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworVGVzdCB0aGUgaGFuZGxpbmcgb2YgbXVsaXRwbGUgZGlyZWN0b3JpZXMgd2hpY2ggaGF2ZSBtYXRjaGluZyBmaWxlCitlbnRyaWVzLiAgQWxzbyB0ZXN0IG9kZCBmaWxlbmFtZSBhbmQgbWlzc2luZyBlbnRyaWVzIGhhbmRsaW5nLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZXR1cCcgXAorICAgICdlY2hvIDExMSA+MS50eHQgJiYKKyAgICAgZWNobyAyMjIgPjIudHh0ICYmCisgICAgIG1rZGlyIHBhdGgwIHBhdGgwL2EgcGF0aDAvYS9iIHBhdGgwL2EvYi9jICYmCisgICAgIGVjaG8gMTExID5wYXRoMC9hL2IvYy8xLnR4dCAmJgorICAgICBta2RpciBwYXRoMSBwYXRoMS9iIHBhdGgxL2IvYyAmJgorICAgICBlY2hvIDExMSA+cGF0aDEvYi9jLzEudHh0ICYmCisgICAgIG1rZGlyIHBhdGgyICYmCisgICAgIGVjaG8gMTExID5wYXRoMi8xLnR4dCAmJgorICAgICBta2RpciBwYXRoMyAmJgorICAgICBlY2hvIDExMSA+cGF0aDMvMS50eHQgJiYKKyAgICAgZWNobyAyMjIgPnBhdGgzLzIudHh0ICYmCisgICAgIGZpbmQgKi50eHQgcGF0aCogXCggLXR5cGUgZiAtbyAtdHlwZSBsIFwpIC1wcmludCB8CisgICAgIHhhcmdzIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgJiYKKyAgICAgdHJlZT1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gJHRyZWUnCisKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgordGVzdF9vdXRwdXQgKCkgeworICAgIHNlZCAtZSAicy8gJF94NDAJLyBYCS8iIDxjdXJyZW50ID5jaGVjaworICAgIGRpZmYgLXUgZXhwZWN0ZWQgY2hlY2sKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgcGxhaW4nIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJMS50eHQKKzEwMDY0NCBibG9iIFgJMi50eHQKKzA0MDAwMCB0cmVlIFgJcGF0aDAKKzA0MDAwMCB0cmVlIFgJcGF0aDEKKzA0MDAwMCB0cmVlIFgJcGF0aDIKKzA0MDAwMCB0cmVlIFgJcGF0aDMKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyBSZWN1cnNpdmUgZG9lcyBub3Qgc2hvdyB0cmVlIG5vZGVzIGFueW1vcmUuLi4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIHJlY3Vyc2l2ZScgXAorICAgICdnaXQtbHMtdHJlZSAtciAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAkxLnR4dAorMTAwNjQ0IGJsb2IgWAkyLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMC9hL2IvYy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMS9iL2MvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDIvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDMvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDMvMi50eHQKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIDEudHh0JyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIDEudHh0ID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciBwYXRoMS9iL2MvMS50eHQnIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDEvYi9jLzEudHh0ID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCXBhdGgxL2IvYy8xLnR4dAorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgYWxsIDEudHh0IGZpbGVzJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIDEudHh0IHBhdGgwL2EvYi9jLzEudHh0IHBhdGgxL2IvYy8xLnR4dCBwYXRoMi8xLnR4dCBwYXRoMy8xLnR4dCA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAkxLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMC9hL2IvYy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMS9iL2MvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDIvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDMvMS50eHQKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyBJIGFtIG5vdCBzbyBzdXJlIGFib3V0IHRoaXMgb25lIGFmdGVyIGxzLXRyZWUgZG9pbmcgcGF0aHNwZWMgbWF0Y2guCisjIEhhdmluZyBib3RoIHBhdGgwL2EgYW5kIHBhdGgwL2EvYi9jIG1ha2VzIHBhdGgwL2EgcmVkdW5kYW50LCBhbmQKKyMgaXQgYmVoYXZlcyBhcyBpZiBwYXRoMC9hL2IvYywgcGF0aDEvYi9jLCBwYXRoMiBhbmQgcGF0aDMgYXJlIHNwZWNpZmllZC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciBkaXJlY3RvcmllcycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMyBwYXRoMiBwYXRoMC9hL2IvYyBwYXRoMS9iL2MgcGF0aDAvYSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMDQwMDAwIHRyZWUgWAlwYXRoMC9hL2IvYworMDQwMDAwIHRyZWUgWAlwYXRoMS9iL2MKKzA0MDAwMCB0cmVlIFgJcGF0aDIKKzA0MDAwMCB0cmVlIFgJcGF0aDMKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyBBZ2FpbiwgZHVwbGljYXRlcyBhcmUgZmlsdGVyZWQgYXdheSBzbyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyMgaGF2aW5nIDEudHh0IGFuZCBwYXRoMwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIG9kZCBuYW1lcycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSAxLnR4dCAvMS50eHQgLy8xLnR4dCBwYXRoMy8xLnR4dCAvcGF0aDMvMS50eHQgLy9wYXRoMy8vMS50eHQgcGF0aDMgL3BhdGgzLyBwYXRoMy8vID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgzLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgzLzIudHh0CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciBtaXNzaW5nIGZpbGVzIGFuZCBleHRyYSBzbGFzaGVzJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIDEudHh0LyBhYmMudHh0IHBhdGgzLy8yMy50eHQgcGF0aDMvMi50eHQvLy8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMjAwLWJyYW5jaC5zaCBiL3QvdDMyMDAtYnJhbmNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMDRlZmMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMjAwLWJyYW5jaC5zaApAQCAtMCwwICsxLDY0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBicmFuY2ggLS1mb28gc2hvdWxkIG5vdCBjcmVhdGUgYm9ndXMgYnJhbmNoCisKK1RoaXMgdGVzdCBydW5zIGdpdCBicmFuY2ggLS1oZWxwIGFuZCBjaGVja3MgdGhhdCB0aGUgYXJndW1lbnQgaXMgcHJvcGVybHkKK2hhbmRsZWQuICBTcGVjaWZpY2FsbHksIHRoYXQgYSBib2d1cyBicmFuY2ggaXMgbm90IGNyZWF0ZWQuCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgYW4gdHJpdmlhbCByZXBvc2l0b3J5JyBcCisgICAgJ2VjaG8gSGVsbG8gPiBBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdC4iICYmCisgICAgIEhFQUQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCAtLWhlbHAgc2hvdWxkIHJldHVybiBzdWNjZXNzIG5vdy4nIFwKKyAgICAnZ2l0LWJyYW5jaCAtLWhlbHAnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdnaXQgYnJhbmNoIC0taGVscCBzaG91bGQgbm90IGhhdmUgY3JlYXRlZCBhIGJvZ3VzIGJyYW5jaCcgXAorICAgICd0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy8tLWhlbHAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIGFiYyBzaG91bGQgY3JlYXRlIGEgYnJhbmNoJyBcCisgICAgJ2dpdC1icmFuY2ggYWJjICYmIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL2FiYycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggYS9iL2Mgc2hvdWxkIGNyZWF0ZSBhIGJyYW5jaCcgXAorICAgICdnaXQtYnJhbmNoIGEvYi9jICYmIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL2EvYi9jJworCitjYXQgPmV4cGVjdCA8PEVPRgorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAkSEVBRCAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDIwMCArMDAwMAlicmFuY2g6IENyZWF0ZWQgZnJvbSBIRUFECitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIC1sIGQvZS9mIHNob3VsZCBjcmVhdGUgYSBicmFuY2ggYW5kIGEgbG9nJyBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgXAorICAgICBnaXQtYnJhbmNoIC1sIGQvZS9mICYmCisJIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL2QvZS9mICYmCisJIHRlc3QgLWYgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZC9lL2YgJiYKKwkgZGlmZiBleHBlY3QgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZC9lL2YnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIC1kIGQvZS9mIHNob3VsZCBkZWxldGUgYSBicmFuY2ggYW5kIGEgbG9nJyBcCisJJ2dpdC1icmFuY2ggLWQgZC9lL2YgJiYKKwkgdGVzdCAhIC1mIC5naXQvcmVmcy9oZWFkcy9kL2UvZiAmJgorCSB0ZXN0ICEgLWYgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZC9lL2YnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICRIRUFEICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMjAwICswMDAwCWNoZWNrb3V0OiBDcmVhdGVkIGZyb20gbWFzdGVyXjAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBjaGVja291dCAtYiBnL2gvaSAtbCBzaG91bGQgY3JlYXRlIGEgYnJhbmNoIGFuZCBhIGxvZycgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzAiIFwKKyAgICAgZ2l0LWNoZWNrb3V0IC1iIGcvaC9pIC1sIG1hc3RlciAmJgorCSB0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy9nL2gvaSAmJgorCSB0ZXN0IC1mIC5naXQvbG9ncy9yZWZzL2hlYWRzL2cvaC9pICYmCisJIGRpZmYgZXhwZWN0IC5naXQvbG9ncy9yZWZzL2hlYWRzL2cvaC9pJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMzMDAtZnVubnktbmFtZXMuc2ggYi90L3QzMzAwLWZ1bm55LW5hbWVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxMjI3MGUKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMzAwLWZ1bm55LW5hbWVzLnNoCkBAIC0wLDAgKzEsMTYwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1BhdGhuYW1lcyB3aXRoIGZ1bm55IGNoYXJhY3RlcnMuCisKK1RoaXMgdGVzdCB0cmllcyBwYXRobmFtZXMgd2l0aCBmdW5ueSBjaGFyYWN0ZXJzIGluIHRoZSB3b3JraW5nCit0cmVlLCBpbmRleCwgYW5kIHRyZWUgb2JqZWN0cy4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3AwPSduby1mdW5ueScKK3AxPSd0YWJzCSwiIChkcSkgYW5kIHNwYWNlcycKK3AyPSdqdXN0IHNwYWNlJworCitjYXQgPiIkcDAiIDw8XEVPRgorMS4gQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBjYXQsIG9vcHMgZG9nLgorMi4gQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBjYXQsIG9vcHMgZG9nLgorMy4gQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBjYXQsIG9vcHMgZG9nLgorRU9GCisKK2NhdCA+IiRwMSIgIiRwMCIKK2VjaG8gJ0ZvbyBCYXIgQmF6JyA+IiRwMiIKKwordGVzdCAtZiAiJHAxIiAmJiBjbXAgIiRwMCIgIiRwMSIgfHwgeworCSMgc2luY2UgRkFUL05URlMgZG9lcyBub3QgYWxsb3cgdGFicyBpbiBmaWxlbmFtZXMsIHNraXAgdGhpcyB0ZXN0CisJc2F5ICdZb3VyIGZpbGVzeXN0ZW0gZG9lcyBub3QgYWxsb3cgdGFicyBpbiBmaWxlbmFtZXMsIHRlc3Qgc2tpcHBlZC4nCisJdGVzdF9kb25lCit9CisKK2VjaG8gJ2p1c3Qgc3BhY2UKK25vLWZ1bm55JyA+ZXhwZWN0ZWQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1scy1maWxlcyBuby1mdW5ueScgXAorCSdnaXQtdXBkYXRlLWluZGV4IC0tYWRkICIkcDAiICIkcDIiICYmCisJZ2l0LWxzLWZpbGVzID5jdXJyZW50ICYmCisJZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCit0MD1gZ2l0LXdyaXRlLXRyZWVgCitlY2hvICIkdDAiID50MAorCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK2p1c3Qgc3BhY2UKK25vLWZ1bm55CisidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWxzLWZpbGVzIHdpdGgtZnVubnknIFwKKwknZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAiJHAxIiAmJgorCWdpdC1scy1maWxlcyA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworZWNobyAnanVzdCBzcGFjZQorbm8tZnVubnkKK3RhYnMJLCIgKGRxKSBhbmQgc3BhY2VzJyA+ZXhwZWN0ZWQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1scy1maWxlcyAteiB3aXRoLWZ1bm55JyBcCisJJ2dpdC1scy1maWxlcyAteiB8IHRyIFxcMCBcXDAxMiA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKwordDE9YGdpdC13cml0ZS10cmVlYAorZWNobyAiJHQxIiA+dDEKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitqdXN0IHNwYWNlCituby1mdW5ueQorInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1scy10cmVlIHdpdGggZnVubnknIFwKKwknZ2l0LWxzLXRyZWUgLXIgJHQxIHwgc2VkIC1lICJzL15bXgldKgkvLyIgPmN1cnJlbnQgJiYKKwkgZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK0EJInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLWluZGV4IHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtaW5kZXggLS1uYW1lLXN0YXR1cyAkdDAgPmN1cnJlbnQgJiYKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLXRyZWUgd2l0aC1mdW5ueScgXAorCSdnaXQtZGlmZi10cmVlIC0tbmFtZS1zdGF0dXMgJHQwICR0MSA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworZWNobyAnQQordGFicwksIiAoZHEpIGFuZCBzcGFjZXMnID5leHBlY3RlZAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtaW5kZXggLXogd2l0aC1mdW5ueScgXAorCSdnaXQtZGlmZi1pbmRleCAteiAtLW5hbWUtc3RhdHVzICR0MCB8IHRyIFxcMCBcXDAxMiA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtdHJlZSAteiB3aXRoLWZ1bm55JyBcCisJJ2dpdC1kaWZmLXRyZWUgLXogLS1uYW1lLXN0YXR1cyAkdDAgJHQxIHwgdHIgXFwwIFxcMDEyID5jdXJyZW50ICYmCisJZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK0NOVU0Jbm8tZnVubnkJInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLXRyZWUgLUMgd2l0aC1mdW5ueScgXAorCSdnaXQtZGlmZi10cmVlIC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tbmFtZS1zdGF0dXMgXAorCQkkdDAgJHQxIHwgc2VkIC1lICdzL15DWzAtOV0qL0NOVU0vJyA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitSTlVNCW5vLWZ1bm55CSJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIGRlbGV0ZSB3aXRoLWZ1bm55JyBcCisJJ2dpdC11cGRhdGUtaW5kZXggLS1mb3JjZS1yZW1vdmUgIiRwMCIgJiYKKwlnaXQtZGlmZi1pbmRleCAtTSAtLW5hbWUtc3RhdHVzIFwKKwkJJHQwIHwgc2VkIC1lICdzL15SWzAtOV0qL1JOVU0vJyA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvbm8tZnVubnkgImIvdGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK3NpbWlsYXJpdHkgaW5kZXggTlVNJQorcmVuYW1lIGZyb20gbm8tZnVubnkKK3JlbmFtZSB0byAidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtdHJlZSBkZWxldGUgd2l0aC1mdW5ueScgXAorCSdnaXQtZGlmZi1pbmRleCAtTSAtcCAkdDAgfAorCSBzZWQgLWUgInMvaW5kZXggWzAtOV0qJS9pbmRleCBOVU0lLyIgPmN1cnJlbnQgJiYKKwkgZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCitjaG1vZCAreCAiJHAxIgorY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvbm8tZnVubnkgImIvdGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CitzaW1pbGFyaXR5IGluZGV4IE5VTSUKK3JlbmFtZSBmcm9tIG5vLWZ1bm55CityZW5hbWUgdG8gInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLXRyZWUgZGVsZXRlIHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHQwIHwKKwkgc2VkIC1lICJzL2luZGV4IFswLTldKiUvaW5kZXggTlVNJS8iID5jdXJyZW50ICYmCisJIGRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKyAidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKKyAxIGZpbGVzIGNoYW5nZWQsIDAgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtdHJlZSByZW5hbWUgd2l0aC1mdW5ueSBhcHBsaWVkJyBcCisJJ2dpdC1kaWZmLWluZGV4IC1NIC1wICR0MCB8CisJIGdpdC1hcHBseSAtLXN0YXQgfCBzZWQgLWUgInMvfC4qLy8iIC1lICJzLyAqXCQvLyIgPmN1cnJlbnQgJiYKKwkgZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKyBuby1mdW5ueQorICJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorIDIgZmlsZXMgY2hhbmdlZCwgMyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIGRlbGV0ZSB3aXRoLWZ1bm55IGFwcGxpZWQnIFwKKwknZ2l0LWRpZmYtaW5kZXggLXAgJHQwIHwKKwkgZ2l0LWFwcGx5IC0tc3RhdCB8IHNlZCAtZSAicy98LiovLyIgLWUgInMvICpcJC8vIiA+Y3VycmVudCAmJgorCSBkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1hcHBseSBub24tZ2l0IGRpZmYnIFwKKwknZ2l0LWRpZmYtaW5kZXggLXAgJHQwIHwKKwkgc2VkIC1uZSAiL15bLStAXS9wIiB8CisJIGdpdC1hcHBseSAtLXN0YXQgfCBzZWQgLWUgInMvfC4qLy8iIC1lICJzLyAqXCQvLyIgPmN1cnJlbnQgJiYKKwkgZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM0MDAtcmViYXNlLnNoIGIvdC90MzQwMC1yZWJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjlkMzEzMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM0MDAtcmViYXNlLnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgQW1vcyBXYXRlcmxhbmQKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IHJlYmFzZSBzaG91bGQgbm90IGRlc3Ryb3kgYXV0aG9yIGluZm9ybWF0aW9uCisKK1RoaXMgdGVzdCBydW5zIGdpdCByZWJhc2UgYW5kIGNoZWNrcyB0aGF0IHRoZSBhdXRob3IgaW5mb3JtYXRpb24gaXMgbm90IGxvc3QuCisnCisuIC4vdGVzdC1saWIuc2gKKworZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9Ym9ndXNfZW1haWxfYWRkcmVzcworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZXBvc2l0b3J5IHdpdGggdG9waWMgYnJhbmNoLCB0aGVuIHJlYmFzZSBhZ2FpbnN0IG1hc3RlcicgXAorICAgICdlY2hvIEZpcnN0ID4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEEuIiAmJgorICAgICBnaXQgY2hlY2tvdXQgLWIgbXktdG9waWMtYnJhbmNoICYmCisgICAgIGVjaG8gU2Vjb25kID4gQiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEIgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEIuIiAmJgorICAgICBnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmCisgICAgIGVjaG8gVGhpcmQgPj4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiTW9kaWZ5IEEuIiAmJgorICAgICBnaXQgY2hlY2tvdXQgLWYgbXktdG9waWMtYnJhbmNoICYmCisgICAgIGdpdCByZWJhc2UgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAndGhlIHJlYmFzZSBvcGVyYXRpb24gc2hvdWxkIG5vdCBoYXZlIGRlc3Ryb3llZCBhdXRob3IgaW5mb3JtYXRpb24nIFwKKyAgICAnZ2l0IGxvZyB8IGdyZXAgIkF1dGhvcjoiIHwgZ3JlcCAiPD4iJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM0MDEtcmViYXNlLXBhcnRpYWwuc2ggYi90L3QzNDAxLXJlYmFzZS1wYXJ0aWFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyZGM5YzUKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNDAxLXJlYmFzZS1wYXJ0aWFsLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgWWFubiBEaXJzb24sIGJhc2VkIG9uIHQzNDAwIGJ5IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCByZWJhc2Ugc2hvdWxkIGRldGVjdCBwYXRjaGVzIGludGVncmF0ZWQgdXBzdHJlYW0KKworVGhpcyB0ZXN0IGNoZXJyeS1waWNrcyBvbmUgbG9jYWwgY2hhbmdlIG9mIHR3byBpbnRvIG1hc3RlciBicmFuY2gsIGFuZAorY2hlY2tzIHRoYXQgZ2l0IHJlYmFzZSBzdWNjZWVkcyB3aXRoIG9ubHkgdGhlIHNlY29uZCBwYXRjaCBpbiB0aGUKK2xvY2FsIGJyYW5jaC4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZXBvc2l0b3J5IHdpdGggdG9waWMgYnJhbmNoJyBcCisgICAgJ2VjaG8gRmlyc3QgPiBBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQS4iICYmCisKKyAgICAgZ2l0LWNoZWNrb3V0IC1iIG15LXRvcGljLWJyYW5jaCAmJgorCisgICAgIGVjaG8gU2Vjb25kID4gQiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEIgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEIuIiAmJgorCisgICAgIGVjaG8gQW5vdGhlclNlY29uZCA+IEMgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBDICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBDLiIgJiYKKworICAgICBnaXQtY2hlY2tvdXQgLWYgbWFzdGVyICYmCisKKyAgICAgZWNobyBUaGlyZCA+PiBBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJNb2RpZnkgQS4iCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwaWNrIHRvcCBwYXRjaCBmcm9tIHRvcGljIGJyYW5jaCBpbnRvIG1hc3RlcicgXAorICAgICdnaXQtY2hlcnJ5LXBpY2sgbXktdG9waWMtYnJhbmNoXjAgJiYKKyAgICAgZ2l0LWNoZWNrb3V0IC1mIG15LXRvcGljLWJyYW5jaAorJworCit0ZXN0X2RlYnVnIFwKKyAgICAnZ2l0LWNoZXJyeSBtYXN0ZXIgJiYKKyAgICAgZ2l0LWZvcm1hdC1wYXRjaCAtayAtLXN0ZG91dCAtLWZ1bGwtaW5kZXggbWFzdGVyID4vZGV2L251bGwgJiYKKyAgICAgZ2l0ayAtLWFsbCAmIHNsZWVwIDEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlYmFzZSB0b3BpYyBicmFuY2ggYWdhaW5zdCBuZXcgbWFzdGVyIGFuZCBjaGVjayBnaXQtYW0gZGlkIG5vdCBnZXQgaGFsdGVkJyBcCisgICAgJ2dpdC1yZWJhc2UgbWFzdGVyICYmIHRlc3QgISAtZCAuZG90ZXN0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM1MDAtY2hlcnJ5LnNoIGIvdC90MzUwMC1jaGVycnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTgzYmJlZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM1MDAtY2hlcnJ5LnNoCkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgWWFubiBEaXJzb24sIGJhc2VkIG9uIHQzNDAwIGJ5IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVycnkgc2hvdWxkIGRldGVjdCBwYXRjaGVzIGludGVncmF0ZWQgdXBzdHJlYW0KKworVGhpcyB0ZXN0IGNoZXJyeS1waWNrcyBvbmUgbG9jYWwgY2hhbmdlIG9mIHR3byBpbnRvIG1hc3RlciBicmFuY2gsIGFuZAorY2hlY2tzIHRoYXQgZ2l0LWNoZXJyeSBvbmx5IHJldHVybnMgdGhlIHNlY29uZCBwYXRjaCBpbiB0aGUgbG9jYWwgYnJhbmNoCisnCisuIC4vdGVzdC1saWIuc2gKKworZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9Ym9ndXNfZW1haWxfYWRkcmVzcworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZXBvc2l0b3J5IHdpdGggdG9waWMgYnJhbmNoLCBhbmQgY2hlY2sgY2hlcnJ5IGZpbmRzIHRoZSAyIHBhdGNoZXMgZnJvbSB0aGVyZScgXAorICAgICdlY2hvIEZpcnN0ID4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEEuIiAmJgorCisgICAgIGdpdC1jaGVja291dCAtYiBteS10b3BpYy1icmFuY2ggJiYKKworICAgICBlY2hvIFNlY29uZCA+IEIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBCICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBCLiIgJiYKKworICAgICBzbGVlcCAyICYmCisgICAgIGVjaG8gQW5vdGhlclNlY29uZCA+IEMgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBDICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBDLiIgJiYKKworICAgICBnaXQtY2hlY2tvdXQgLWYgbWFzdGVyICYmCisgICAgIHJtIC1mIEIgQyAmJgorCisgICAgIGVjaG8gVGhpcmQgPj4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiTW9kaWZ5IEEuIiAmJgorCisgICAgIGV4cHIgIiQoZWNobyAkKGdpdC1jaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCkgKSIgOiAiKyBbXiBdKiArIC4qIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgdGhhdCBjaGVycnkgd2l0aCBsaW1pdCByZXR1cm5zIG9ubHkgdGhlIHRvcCBwYXRjaCdcCisgICAgJ2V4cHIgIiQoZWNobyAkKGdpdC1jaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCBteS10b3BpYy1icmFuY2heMSkgKSIgOiAiKyBbXiBdKiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZXJyeS1waWNrIG9uZSBvZiB0aGUgMiBwYXRjaGVzLCBhbmQgY2hlY2sgY2hlcnJ5IHJlY29nbml6ZWQgb25lIGFuZCBvbmx5IG9uZSBhcyBuZXcnIFwKKyAgICAnZ2l0LWNoZXJyeS1waWNrIG15LXRvcGljLWJyYW5jaF4wICYmCisgICAgIGVjaG8gJChnaXQtY2hlcnJ5IG1hc3RlciBteS10b3BpYy1icmFuY2gpICYmCisgICAgIGV4cHIgIiQoZWNobyAkKGdpdC1jaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCkgKSIgOiAiKyBbXiBdKiAtIC4qIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM2MDAtcm0uc2ggYi90L3QzNjAwLXJtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwMWQxNjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNjAwLXJtLnNoCkBAIC0wLDAgKzEsODcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgQ2FybCBELiBXb3J0aAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IG9mIHRoZSB2YXJpb3VzIG9wdGlvbnMgdG8gZ2l0LXJtLicKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgU2V0dXAgc29tZSBmaWxlcyB0byBiZSByZW1vdmVkLCBzb21lIHdpdGggZnVubnkgY2hhcmFjdGVycwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0luaXRpYWxpemUgdGVzdCBkaXJlY3RvcnknIFwKKyAgICAidG91Y2ggLS0gZm9vIGJhciBiYXogJ3NwYWNlIGVtYmVkZGVkJyAtcSAmJgorICAgICBnaXQtYWRkIC0tIGZvbyBiYXIgYmF6ICdzcGFjZSBlbWJlZGRlZCcgLXEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAnYWRkIG5vcm1hbCBmaWxlcycgJiYKKyAgICAgdGVzdF90YWJzPXkgJiYKKyAgICAgaWYgdG91Y2ggLS0gJ3RhYgllbWJlZGRlZCcgJ25ld2xpbmUKK2VtYmVkZGVkJworICAgICB0aGVuCisgICAgIGdpdC1hZGQgLS0gJ3RhYgllbWJlZGRlZCcgJ25ld2xpbmUKK2VtYmVkZGVkJyAmJgorICAgICBnaXQtY29tbWl0IC1tICdhZGQgZmlsZXMgd2l0aCB0YWJzIGFuZCBuZXdsaW5lcycKKyAgICAgZWxzZQorICAgICAgICAgc2F5ICdZb3VyIGZpbGVzeXN0ZW0gZG9lcyBub3QgYWxsb3cgdGFicyBpbiBmaWxlbmFtZXMuJworICAgICAgICAgdGVzdF90YWJzPW4KKyAgICAgZmkiCisKKyMgTGF0ZXIgd2Ugd2lsbCB0cnkgcmVtb3ZpbmcgYW4gdW5yZW1vdmFibGUgcGF0aCB0byBtYWtlIHN1cmUKKyMgZ2l0LXJtIGJhcmZzLCBidXQgaWYgdGhlIHRlc3QgaXMgcnVuIGFzIHJvb3QgdGhhdCBjYW5ub3QgYmUKKyMgYXJyYW5nZWQuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnRGV0ZXJtaW5lIHJtIGJlaGF2aW9yJyBcCisgICAgJzogPnRlc3QtZmlsZQorICAgICBjaG1vZCBhLXcgLgorICAgICBybSAtZiB0ZXN0LWZpbGUKKyAgICAgdGVzdCAtZiB0ZXN0LWZpbGUgJiYgdGVzdF9mYWlsZWRfcmVtb3ZlPXkKKyAgICAgY2htb2QgNzc1IC4KKyAgICAgcm0gLWYgdGVzdC1maWxlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUHJlLWNoZWNrIHRoYXQgZm9vIGV4aXN0cyBhbmQgaXMgaW4gaW5kZXggYmVmb3JlIGdpdC1ybSBmb28nIFwKKyAgICAnWyAtZiBmb28gXSAmJiBnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCBnaXQtcm0gZm9vIHN1Y2NlZWRzJyBcCisgICAgJ2dpdC1ybSBmb28nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdQb3N0LWNoZWNrIHRoYXQgZm9vIGV4aXN0cyBidXQgaXMgbm90IGluIGluZGV4IGFmdGVyIGdpdC1ybSBmb28nIFwKKyAgICAnWyAtZiBmb28gXSAmJiAhIGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUHJlLWNoZWNrIHRoYXQgYmFyIGV4aXN0cyBhbmQgaXMgaW4gaW5kZXggYmVmb3JlICJnaXQtcm0gLWYgYmFyIicgXAorICAgICdbIC1mIGJhciBdICYmIGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggYmFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0ICJnaXQtcm0gLWYgYmFyIiBzdWNjZWVkcycgXAorICAgICdnaXQtcm0gLWYgYmFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUG9zdC1jaGVjayB0aGF0IGJhciBkb2VzIG5vdCBleGlzdCBhbmQgaXMgbm90IGluIGluZGV4IGFmdGVyICJnaXQtcm0gLWYgYmFyIicgXAorICAgICchIFsgLWYgYmFyIF0gJiYgISBnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCAiZ2l0LXJtIC0tIC1xIiBzdWNjZWVkcyAocmVtb3ZlIGEgZmlsZSB0aGF0IGxvb2tzIGxpa2UgYW4gb3B0aW9uKScgXAorICAgICdnaXQtcm0gLS0gLXEnCisKK3Rlc3QgIiR0ZXN0X3RhYnMiID0geSAmJiB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAiVGVzdCB0aGF0IFwiZ2l0LXJtIC1mXCIgc3VjY2VlZHMgd2l0aCBlbWJlZGRlZCBzcGFjZSwgdGFiLCBvciBuZXdsaW5lIGNoYXJhY3RlcnMuIiBcCisgICAgImdpdC1ybSAtZiAnc3BhY2UgZW1iZWRkZWQnICd0YWIJZW1iZWRkZWQnICduZXdsaW5lCitlbWJlZGRlZCciCisKK2lmIHRlc3QgIiR0ZXN0X2ZhaWxlZF9yZW1vdmUiID0geTsgdGhlbgorY2htb2QgYS13IC4KK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdUZXN0IHRoYXQgImdpdC1ybSAtZiIgZmFpbHMgaWYgaXRzIHJtIGZhaWxzJyBcCisgICAgJ2dpdC1ybSAtZiBiYXonCitjaG1vZCA3NzUgLgorZWxzZQorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NraXBwaW5nIHJlbW92YWwgZmFpbHVyZSAocGVyaGFwcyBydW5uaW5nIGFzIHJvb3Q/KScgOgorZmkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1doZW4gdGhlIHJtIGluICJnaXQtcm0gLWYiIGZhaWxzLCBpdCBzaG91bGQgbm90IHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBpbmRleCcgXAorICAgICdnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJheicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNzAwLWFkZC5zaCBiL3QvdDM3MDAtYWRkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjZDA1YzMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNzAwLWFkZC5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IENhcmwgRC4gV29ydGgKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBvZiBnaXQtYWRkLCBpbmNsdWRpbmcgdGhlIC0tIG9wdGlvbi4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCBvZiBnaXQtYWRkJyBcCisgICAgJ3RvdWNoIGZvbyAmJiBnaXQtYWRkIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Bvc3QtY2hlY2sgdGhhdCBmb28gaXMgaW4gdGhlIGluZGV4JyBcCisgICAgJ2dpdC1scy1maWxlcyBmb28gfCBncmVwIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCAiZ2l0LWFkZCAtLSAtcSIgd29ya3MnIFwKKyAgICAndG91Y2ggLS0gLXEgJiYgZ2l0LWFkZCAtLSAtcScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDAwLWRpZmYtZm9ybWF0LnNoIGIvdC90NDAwMC1kaWZmLWZvcm1hdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42N2I5NjgxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwMC1kaWZmLWZvcm1hdC5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgYnVpbHQtaW4gZGlmZiBvdXRwdXQgZW5naW5lLgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKworZWNobyA+cGF0aDAgJ0xpbmUgMQorTGluZSAyCitsaW5lIDMnCitjYXQgcGF0aDAgPnBhdGgxCitjaG1vZCAreCBwYXRoMQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXBkYXRlLWNhY2hlIC0tYWRkIHR3byBmaWxlcyB3aXRoIGFuZCB3aXRob3V0ICt4LicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwIHBhdGgxJworCittdiBwYXRoMCBwYXRoMC0KK3NlZCAtZSAncy9saW5lL0xpbmUvJyA8cGF0aDAtID5wYXRoMAorY2htb2QgK3ggcGF0aDAKK3JtIC1mIHBhdGgxCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWRpZmYtZmlsZXMgLXAgYWZ0ZXIgZWRpdGluZyB3b3JrIHRyZWUuJyBcCisgICAgJ2dpdC1kaWZmLWZpbGVzIC1wID5jdXJyZW50JworCisjIHRoYXQncyBhcyBmYXIgYXMgaXQgY29tZXMKK2lmIFsgIiQoZ2l0IHJlcG8tY29uZmlnIC0tZ2V0IGNvcmUuZmlsZW1vZGUpIiA9IGZhbHNlIF0KK3RoZW4KKwlzYXkgJ2ZpbGVtb2RlIGRpc2FibGVkIG9uIHRoZSBmaWxlc3lzdGVtJworCXRlc3RfZG9uZQorZmkKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKK2RpZmYgLS1naXQgYS9wYXRoMCBiL3BhdGgwCitvbGQgbW9kZSAxMDA2NDQKK25ldyBtb2RlIDEwMDc1NQorLS0tIGEvcGF0aDAKKysrKyBiL3BhdGgwCitAQCAtMSwzICsxLDMgQEAKKyBMaW5lIDEKKyBMaW5lIDIKKy1saW5lIDMKKytMaW5lIDMKK2RpZmYgLS1naXQgYS9wYXRoMSBiL3BhdGgxCitkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKKy0tLSBhL3BhdGgxCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy1MaW5lIDEKKy1MaW5lIDIKKy1saW5lIDMKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZ2l0LWRpZmYtZmlsZXMgLXAgb3V0cHV0LicgXAorICAgICdjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDAxLWRpZmYtcmVuYW1lLnNoIGIvdC90NDAwMS1kaWZmLXJlbmFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZTNjMjBkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwMS1kaWZmLXJlbmFtZS5zaApAQCAtMCwwICsxLDY3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgcmVuYW1lIGRldGVjdGlvbiBpbiBkaWZmIGVuZ2luZS4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoCisKK2VjaG8gPnBhdGgwICdMaW5lIDEKK0xpbmUgMgorTGluZSAzCitMaW5lIDQKK0xpbmUgNQorTGluZSA2CitMaW5lIDcKK0xpbmUgOAorTGluZSA5CitMaW5lIDEwCitsaW5lIDExCitMaW5lIDEyCitMaW5lIDEzCitMaW5lIDE0CitMaW5lIDE1CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1cGRhdGUtY2FjaGUgLS1hZGQgYSBmaWxlLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGUgdGhhdCB0cmVlLicgXAorICAgICd0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmIGVjaG8gJHRyZWUnCisKK3NlZCAtZSAncy9saW5lL0xpbmUvJyA8cGF0aDAgPnBhdGgxCitybSAtZiBwYXRoMAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlbmFtZWQgYW5kIGVkaXRlZCB0aGUgZmlsZS4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBwYXRoMCBwYXRoMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1wIC1NIGFmdGVyIHJlbmFtZSBhbmQgZWRpdGluZy4nIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLXAgLU0gJHRyZWUgPmN1cnJlbnQnCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL3BhdGgwIGIvcGF0aDEKK3JlbmFtZSBmcm9tIHBhdGgwCityZW5hbWUgdG8gcGF0aDEKKy0tLSBhL3BhdGgwCisrKysgYi9wYXRoMQorQEAgLTgsNyArOCw3IEBAIExpbmUgNworIExpbmUgOAorIExpbmUgOQorIExpbmUgMTAKKy1saW5lIDExCisrTGluZSAxMQorIExpbmUgMTIKKyBMaW5lIDEzCisgTGluZSAxNAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSB0aGUgb3V0cHV0LicgXAorICAgICdjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDAyLWRpZmYtYmFzaWMuc2ggYi90L3Q0MDAyLWRpZmYtYmFzaWMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTZlZGE2MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDItZGlmZi1iYXNpYy5zaApAQCAtMCwwICsxLDI0NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGRpZmYgcmF3LW91dHB1dC4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoCisKK2NhdCA+LnRlc3QtcGxhaW4tT0EgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGNjYmE3MmFkMzg4OGEzNTIwYjM5ZWZjZjc4MGI5ZWU2NDE2NzUzNWQgQQlBQQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3ZTQyNmZiMDc5NDc5ZmQ2N2Y2ZDgxZjk4NGU0ZWM2NDlhNDRiYzI1IEEJQU4KKzoxMDA2NDQgMDAwMDAwIGJjYzY4ZWY5OTcwMTc0NjZkNWM5MDk0YmNmNzY5MjI5NWY1ODhjOWEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURECis6MDAwMDAwIDA0MDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZkNTBmNjVkM2JkYWI5MWM2MzQ0NDI5NGQzOGYwOGFlZmYzMjhlNDIgQQlERgorOjEwMDY0NCAwMDAwMDAgMTQxYzFmMTY0MjMyOGU0YmM0NmE3ZDgwMWE3MWRhMzkyZTY2NzkxZSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJRE0KKzoxMDA2NDQgMDAwMDAwIDM1YWJkZTE1MDZkZGY4MDY1NzJmZjRkNDA3YmQwNjg4NWQwZjhlZTkgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECUROCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDFkNDExMjJlYmRkN2E2NDBmMjlkM2M5Y2M0ZjlkNzAwOTQzNzQ3NjIgQQlMTAorOjEwMDY0NCAxMDA2NDQgMDNmMjRjOGM0NzAwYmFiY2NmZDI4YjY1NGU3ZThlYWM0MDJhZDZjZCAxMDNkOWY4OWI1MGI5YWFkMDMwNTRiNTc5YmU1ZTdhYTY2NWYyZDU3IE0JTUQKKzoxMDA2NDQgMTAwNjQ0IGIyNTg1MDhhZmI3Y2ViNDQ5OTgxYmQ5ZDYzZDJkM2U5NzFiZjhkMzQgYjQzMWIyNzJkODI5ZmYzYWE0ZDFhNTA4NWY0Mzk0YWI0ZDMzMDViNiBNCU1NCis6MTAwNjQ0IDEwMDY0NCBiZDA4NGIwYzI3YzdiNmNjMzRmMTFkNmQwNTA5YTI5YmUzY2FmOTcwIGE3MTZkNThkZTRhNTcwZTAwMzhmNWMzMDdiZDhkYjM0ZGFlYTAyMWYgTQlNTgorOjEwMDY0NCAxMDA2NDQgNDBjOTU5Zjk4NGM4Yjg5YTJiMDI1MjBkMTdmMDBkNzE3ZjAyNDM5NyAyYWM1NDdhZTk2MTRhMDBkMWIyODI3NWRlNjA4MTMxZjdhMGUyNTlmIE0JU1MKKzoxMDA2NDQgMTAwNjQ0IDRhYzEzNDU4ODk5YWI5MDhlZjNiMTEyOGZhMzc4ZGFlZmM4OGQzNTYgNGM4NmY5YTg1ZmJjNWU2ODA0ZWUyZTE3YTc5NzUzOGZiZTc4NWJjYSBNCVRUCis6MDQwMDAwIDA0MDAwMCA3ZDY3MGZkY2RiOTkyOWY2YzdkYWMxOTZmZjc4Njg5Y2QxYzU2NmExIDVlNWYyMjA3MmJiMzlmNmUxMmNmNjYzYTU3Y2I2MzRjNzZlZWZiNDkgTQlaCitFT0YKKworY2F0ID4udGVzdC1yZWN1cnNpdmUtT0EgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGNjYmE3MmFkMzg4OGEzNTIwYjM5ZWZjZjc4MGI5ZWU2NDE2NzUzNWQgQQlBQQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3ZTQyNmZiMDc5NDc5ZmQ2N2Y2ZDgxZjk4NGU0ZWM2NDlhNDRiYzI1IEEJQU4KKzoxMDA2NDQgMDAwMDAwIGJjYzY4ZWY5OTcwMTc0NjZkNWM5MDk0YmNmNzY5MjI5NWY1ODhjOWEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURECis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDY4YTZkOGI5MWRhMTEwNDVjZjRhYTNhNWFiOWYyYTc4MWM3MDEyNDkgQQlERi9ERgorOjEwMDY0NCAwMDAwMDAgMTQxYzFmMTY0MjMyOGU0YmM0NmE3ZDgwMWE3MWRhMzkyZTY2NzkxZSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJRE0KKzoxMDA2NDQgMDAwMDAwIDM1YWJkZTE1MDZkZGY4MDY1NzJmZjRkNDA3YmQwNjg4NWQwZjhlZTkgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECUROCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDFkNDExMjJlYmRkN2E2NDBmMjlkM2M5Y2M0ZjlkNzAwOTQzNzQ3NjIgQQlMTAorOjEwMDY0NCAxMDA2NDQgMDNmMjRjOGM0NzAwYmFiY2NmZDI4YjY1NGU3ZThlYWM0MDJhZDZjZCAxMDNkOWY4OWI1MGI5YWFkMDMwNTRiNTc5YmU1ZTdhYTY2NWYyZDU3IE0JTUQKKzoxMDA2NDQgMTAwNjQ0IGIyNTg1MDhhZmI3Y2ViNDQ5OTgxYmQ5ZDYzZDJkM2U5NzFiZjhkMzQgYjQzMWIyNzJkODI5ZmYzYWE0ZDFhNTA4NWY0Mzk0YWI0ZDMzMDViNiBNCU1NCis6MTAwNjQ0IDEwMDY0NCBiZDA4NGIwYzI3YzdiNmNjMzRmMTFkNmQwNTA5YTI5YmUzY2FmOTcwIGE3MTZkNThkZTRhNTcwZTAwMzhmNWMzMDdiZDhkYjM0ZGFlYTAyMWYgTQlNTgorOjEwMDY0NCAxMDA2NDQgNDBjOTU5Zjk4NGM4Yjg5YTJiMDI1MjBkMTdmMDBkNzE3ZjAyNDM5NyAyYWM1NDdhZTk2MTRhMDBkMWIyODI3NWRlNjA4MTMxZjdhMGUyNTlmIE0JU1MKKzoxMDA2NDQgMTAwNjQ0IDRhYzEzNDU4ODk5YWI5MDhlZjNiMTEyOGZhMzc4ZGFlZmM4OGQzNTYgNGM4NmY5YTg1ZmJjNWU2ODA0ZWUyZTE3YTc5NzUzOGZiZTc4NWJjYSBNCVRUCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDhhY2I4ZTk3NTBlM2Y2NDRiZjMyM2ZjZjNkMzM4ODQ5ZGIxMDZjNzcgQQlaL0FBCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDA4NzQ5NDI2MjA4NGNlZmVlN2VkNDg0ZDIwYzhkYzA1ODA3OTEyNzIgQQlaL0FOCis6MTAwNjQ0IDAwMDAwMCA4NzkwMDdlZmFlNjI0ZDJiMTMwNzIxNGIyNGE5NTZmMGE4ZDY4NmE4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL0RECis6MTAwNjQ0IDAwMDAwMCA5YjU0MWIyMjc1YzA2ZTNhN2IxM2YyOGJhZGY1Mjk0ZTJhZTYzZGY0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL0RNCis6MTAwNjQ0IDAwMDAwMCBiZWI1ZDM4YzU1MjgzZDI4MDY4NWVhMjFhMGU1MGNmY2MwY2EwNjRhIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL0ROCis6MTAwNjQ0IDEwMDY0NCBkNDFmZGE0MWI3ZWM0ZGU0NmI0M2NiN2VhNDJhNDUwMDFhZTM5M2Q1IGE3OWFjM2JlOTM3NzYzOWUxYzdkMWVkZjFhZTFiM2E1ZjBjY2Q4YTkgTQlaL01ECis6MTAwNjQ0IDEwMDY0NCA0Y2EyMmJhZTI1MjdkM2Q5ZTE2NzY0OThhMGZiYTNiMzU1YmQxMjc4IDYxNDIyYmE5YzJjODczNDE2MDYxYTg4Y2Q0MGE1OWEzNWI1NzY0NzQgTQlaL01NCis6MTAwNjQ0IDEwMDY0NCBiMTZkN2IyNWI4NjlmMmJlYjEyNGVmYTUzNDY3ZDhhMTU1MGFkNjk0IGE1YzU0NGMyMWNmY2IwN2ViODBhNGQ4OWE1YjdkMTU3MDAwMmVkZmQgTQlaL01OCitFT0YKK2NhdCA+LnRlc3QtcGxhaW4tT0IgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZhYTJiNTMzNWIxNjQzMWEwZWY3MWU1YzBhMjhiZTY5MTgzY2Y2YTIgQQlBQQorOjEwMDY0NCAwMDAwMDAgYmNjNjhlZjk5NzAxNzQ2NmQ1YzkwOTRiY2Y3NjkyMjk1ZjU4OGM5YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzE0MjBhYjgxZTI1NDE0NWQyNmQ2ZmMwY2RkZWU2NGMxYWNkNDc4NyBBCURGCis6MTAwNjQ0IDEwMDY0NCAxNDFjMWYxNjQyMzI4ZTRiYzQ2YTdkODAxYTcxZGEzOTJlNjY3OTFlIDNjNGQ4ZGU1ZmJhZDA4NTcyYmFiOGUxMGVlZjhkYmIyNjRjZjAyMzEgTQlETQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxZDQxMTIyZWJkZDdhNjQwZjI5ZDNjOWNjNGY5ZDcwMDk0Mzc0NzYyIEEJTEwKKzoxMDA2NDQgMDAwMDAwIDAzZjI0YzhjNDcwMGJhYmNjZmQyOGI2NTRlN2U4ZWFjNDAyYWQ2Y2QgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU1ECis6MTAwNjQ0IDEwMDY0NCBiMjU4NTA4YWZiN2NlYjQ0OTk4MWJkOWQ2M2QyZDNlOTcxYmY4ZDM0IDE5OTg5ZDQ1NTlhYWU0MTdmZWRlZTI0MGNjZjJiYTMxNWVhNGRjMmIgTQlNTQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxNTg4NTg4MWVhNjkxMTUzNTFjMDliMzgzNzFmMDM0OGEzZmI4YzY3IEEJTkEKKzoxMDA2NDQgMDAwMDAwIGE0ZTE3OWU0MjkxZTU1MzZhNWUxYzgyZTA5MTA1Mjc3MmQyYzVhOTMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU5ECis6MTAwNjQ0IDEwMDY0NCBjOGYyNTc4MWU4ZjE3OTJlM2U0MGI3NDIyNWUyMDU1MzA0MWI1MjI2IGNkYjlhOGMzZGE1NzE1MDJhYzMwMjI1ZTljMTdiZWNjYjgzODc5ODMgTQlOTQorOjEwMDY0NCAxMDA2NDQgNDBjOTU5Zjk4NGM4Yjg5YTJiMDI1MjBkMTdmMDBkNzE3ZjAyNDM5NyAyYWM1NDdhZTk2MTRhMDBkMWIyODI3NWRlNjA4MTMxZjdhMGUyNTlmIE0JU1MKKzoxMDA2NDQgMTAwNjQ0IDRhYzEzNDU4ODk5YWI5MDhlZjNiMTEyOGZhMzc4ZGFlZmM4OGQzNTYgYzRlNGExMjIzMWI5ZmE3OWEwMDUzY2I2MDc3ZmNiMjFiYjViMTM1YSBNCVRUCis6MDQwMDAwIDA0MDAwMCA3ZDY3MGZkY2RiOTkyOWY2YzdkYWMxOTZmZjc4Njg5Y2QxYzU2NmExIDFiYTUyMzk1NWQ1MTYwNjgxYWY2NWNiNzc2NDExZjU3NGMxZTgxNTUgTQlaCitFT0YKK2NhdCA+LnRlc3QtcmVjdXJzaXZlLU9CIDw8XEVPRgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2YWEyYjUzMzViMTY0MzFhMGVmNzFlNWMwYTI4YmU2OTE4M2NmNmEyIEEJQUEKKzoxMDA2NDQgMDAwMDAwIGJjYzY4ZWY5OTcwMTc0NjZkNWM5MDk0YmNmNzY5MjI5NWY1ODhjOWEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURECis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDcxNDIwYWI4MWUyNTQxNDVkMjZkNmZjMGNkZGVlNjRjMWFjZDQ3ODcgQQlERgorOjEwMDY0NCAxMDA2NDQgMTQxYzFmMTY0MjMyOGU0YmM0NmE3ZDgwMWE3MWRhMzkyZTY2NzkxZSAzYzRkOGRlNWZiYWQwODU3MmJhYjhlMTBlZWY4ZGJiMjY0Y2YwMjMxIE0JRE0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMWQ0MTEyMmViZGQ3YTY0MGYyOWQzYzljYzRmOWQ3MDA5NDM3NDc2MiBBCUxMCis6MTAwNjQ0IDAwMDAwMCAwM2YyNGM4YzQ3MDBiYWJjY2ZkMjhiNjU0ZTdlOGVhYzQwMmFkNmNkIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlNRAorOjEwMDY0NCAxMDA2NDQgYjI1ODUwOGFmYjdjZWI0NDk5ODFiZDlkNjNkMmQzZTk3MWJmOGQzNCAxOTk4OWQ0NTU5YWFlNDE3ZmVkZWUyNDBjY2YyYmEzMTVlYTRkYzJiIE0JTU0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTU4ODU4ODFlYTY5MTE1MzUxYzA5YjM4MzcxZjAzNDhhM2ZiOGM2NyBBCU5BCis6MTAwNjQ0IDAwMDAwMCBhNGUxNzllNDI5MWU1NTM2YTVlMWM4MmUwOTEwNTI3NzJkMmM1YTkzIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlORAorOjEwMDY0NCAxMDA2NDQgYzhmMjU3ODFlOGYxNzkyZTNlNDBiNzQyMjVlMjA1NTMwNDFiNTIyNiBjZGI5YThjM2RhNTcxNTAyYWMzMDIyNWU5YzE3YmVjY2I4Mzg3OTgzIE0JTk0KKzoxMDA2NDQgMTAwNjQ0IDQwYzk1OWY5ODRjOGI4OWEyYjAyNTIwZDE3ZjAwZDcxN2YwMjQzOTcgMmFjNTQ3YWU5NjE0YTAwZDFiMjgyNzVkZTYwODEzMWY3YTBlMjU5ZiBNCVNTCis6MTAwNjQ0IDEwMDY0NCA0YWMxMzQ1ODg5OWFiOTA4ZWYzYjExMjhmYTM3OGRhZWZjODhkMzU2IGM0ZTRhMTIyMzFiOWZhNzlhMDA1M2NiNjA3N2ZjYjIxYmI1YjEzNWEgTQlUVAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2YzBiOTkyODZkMGJjZTU1MWFjNGE3YjNkZmY4YjcwNmVkZmYzNzE1IEEJWi9BQQorOjEwMDY0NCAwMDAwMDAgODc5MDA3ZWZhZTYyNGQyYjEzMDcyMTRiMjRhOTU2ZjBhOGQ2ODZhOCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9ERAorOjEwMDY0NCAxMDA2NDQgOWI1NDFiMjI3NWMwNmUzYTdiMTNmMjhiYWRmNTI5NGUyYWU2M2RmNCBkNzczNzFkMTU4MTdmY2FhNTdlZWVjMjdmNzcwYzUwNWJhOTc0ZWMxIE0JWi9ETQorOjEwMDY0NCAwMDAwMDAgZDQxZmRhNDFiN2VjNGRlNDZiNDNjYjdlYTQyYTQ1MDAxYWUzOTNkNSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9NRAorOjEwMDY0NCAxMDA2NDQgNGNhMjJiYWUyNTI3ZDNkOWUxNjc2NDk4YTBmYmEzYjM1NWJkMTI3OCA2OTdhYWQ3NzE1YTFlNzMwNmNhNzYyOTBhM2RkNDIwOGZiYWVkZGZhIE0JWi9NTQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBkMTI5NzljMjJmZmY2OWM1OWNhOTQwOWU3YThmZTNlZTI1ZWFlZTgwIEEJWi9OQQorOjEwMDY0NCAwMDAwMDAgYTE4MzkzYzYzNmI5OGU5YmQ3Mjk2YjhiNDM3ZWE0OTkyYjcyNDQwYyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9ORAorOjEwMDY0NCAxMDA2NDQgM2ZkYmUxN2ZkMDEzMzAzYTJlOTgxZTFjYTFjNmNkNmU3Mjc4OTA4NyA3ZTA5ZDZhM2ExNGJkNjMwOTEzZThjNzU2OTNjZWEzMjE1N2I2MDZkIE0JWi9OTQorRU9GCitjYXQgPi50ZXN0LXBsYWluLUFCIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgY2NiYTcyYWQzODg4YTM1MjBiMzllZmNmNzgwYjllZTY0MTY3NTM1ZCA2YWEyYjUzMzViMTY0MzFhMGVmNzFlNWMwYTI4YmU2OTE4M2NmNmEyIE0JQUEKKzoxMDA2NDQgMDAwMDAwIDdlNDI2ZmIwNzk0NzlmZDY3ZjZkODFmOTg0ZTRlYzY0OWE0NGJjMjUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECUFOCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDcxNDIwYWI4MWUyNTQxNDVkMjZkNmZjMGNkZGVlNjRjMWFjZDQ3ODcgQQlERgorOjA0MDAwMCAwMDAwMDAgNmQ1MGY2NWQzYmRhYjkxYzYzNDQ0Mjk0ZDM4ZjA4YWVmZjMyOGU0MiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREYKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgM2M0ZDhkZTVmYmFkMDg1NzJiYWI4ZTEwZWVmOGRiYjI2NGNmMDIzMSBBCURNCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1YWJkZTE1MDZkZGY4MDY1NzJmZjRkNDA3YmQwNjg4NWQwZjhlZTkgQQlETgorOjEwMDY0NCAwMDAwMDAgMTAzZDlmODliNTBiOWFhZDAzMDU0YjU3OWJlNWU3YWE2NjVmMmQ1NyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTUQKKzoxMDA2NDQgMTAwNjQ0IGI0MzFiMjcyZDgyOWZmM2FhNGQxYTUwODVmNDM5NGFiNGQzMzA1YjYgMTk5ODlkNDU1OWFhZTQxN2ZlZGVlMjQwY2NmMmJhMzE1ZWE0ZGMyYiBNCU1NCis6MTAwNjQ0IDEwMDY0NCBhNzE2ZDU4ZGU0YTU3MGUwMDM4ZjVjMzA3YmQ4ZGIzNGRhZWEwMjFmIGJkMDg0YjBjMjdjN2I2Y2MzNGYxMWQ2ZDA1MDlhMjliZTNjYWY5NzAgTQlNTgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxNTg4NTg4MWVhNjkxMTUzNTFjMDliMzgzNzFmMDM0OGEzZmI4YzY3IEEJTkEKKzoxMDA2NDQgMDAwMDAwIGE0ZTE3OWU0MjkxZTU1MzZhNWUxYzgyZTA5MTA1Mjc3MmQyYzVhOTMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU5ECis6MTAwNjQ0IDEwMDY0NCBjOGYyNTc4MWU4ZjE3OTJlM2U0MGI3NDIyNWUyMDU1MzA0MWI1MjI2IGNkYjlhOGMzZGE1NzE1MDJhYzMwMjI1ZTljMTdiZWNjYjgzODc5ODMgTQlOTQorOjEwMDY0NCAxMDA2NDQgNGM4NmY5YTg1ZmJjNWU2ODA0ZWUyZTE3YTc5NzUzOGZiZTc4NWJjYSBjNGU0YTEyMjMxYjlmYTc5YTAwNTNjYjYwNzdmY2IyMWJiNWIxMzVhIE0JVFQKKzowNDAwMDAgMDQwMDAwIDVlNWYyMjA3MmJiMzlmNmUxMmNmNjYzYTU3Y2I2MzRjNzZlZWZiNDkgMWJhNTIzOTU1ZDUxNjA2ODFhZjY1Y2I3NzY0MTFmNTc0YzFlODE1NSBNCVoKK0VPRgorY2F0ID4udGVzdC1yZWN1cnNpdmUtQUIgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBjY2JhNzJhZDM4ODhhMzUyMGIzOWVmY2Y3ODBiOWVlNjQxNjc1MzVkIDZhYTJiNTMzNWIxNjQzMWEwZWY3MWU1YzBhMjhiZTY5MTgzY2Y2YTIgTQlBQQorOjEwMDY0NCAwMDAwMDAgN2U0MjZmYjA3OTQ3OWZkNjdmNmQ4MWY5ODRlNGVjNjQ5YTQ0YmMyNSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJQU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzE0MjBhYjgxZTI1NDE0NWQyNmQ2ZmMwY2RkZWU2NGMxYWNkNDc4NyBBCURGCis6MTAwNjQ0IDAwMDAwMCA2OGE2ZDhiOTFkYTExMDQ1Y2Y0YWEzYTVhYjlmMmE3ODFjNzAxMjQ5IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERi9ERgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzYzRkOGRlNWZiYWQwODU3MmJhYjhlMTBlZWY4ZGJiMjY0Y2YwMjMxIEEJRE0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMzVhYmRlMTUwNmRkZjgwNjU3MmZmNGQ0MDdiZDA2ODg1ZDBmOGVlOSBBCUROCis6MTAwNjQ0IDAwMDAwMCAxMDNkOWY4OWI1MGI5YWFkMDMwNTRiNTc5YmU1ZTdhYTY2NWYyZDU3IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlNRAorOjEwMDY0NCAxMDA2NDQgYjQzMWIyNzJkODI5ZmYzYWE0ZDFhNTA4NWY0Mzk0YWI0ZDMzMDViNiAxOTk4OWQ0NTU5YWFlNDE3ZmVkZWUyNDBjY2YyYmEzMTVlYTRkYzJiIE0JTU0KKzoxMDA2NDQgMTAwNjQ0IGE3MTZkNThkZTRhNTcwZTAwMzhmNWMzMDdiZDhkYjM0ZGFlYTAyMWYgYmQwODRiMGMyN2M3YjZjYzM0ZjExZDZkMDUwOWEyOWJlM2NhZjk3MCBNCU1OCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDE1ODg1ODgxZWE2OTExNTM1MWMwOWIzODM3MWYwMzQ4YTNmYjhjNjcgQQlOQQorOjEwMDY0NCAwMDAwMDAgYTRlMTc5ZTQyOTFlNTUzNmE1ZTFjODJlMDkxMDUyNzcyZDJjNWE5MyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTkQKKzoxMDA2NDQgMTAwNjQ0IGM4ZjI1NzgxZThmMTc5MmUzZTQwYjc0MjI1ZTIwNTUzMDQxYjUyMjYgY2RiOWE4YzNkYTU3MTUwMmFjMzAyMjVlOWMxN2JlY2NiODM4Nzk4MyBNCU5NCis6MTAwNjQ0IDEwMDY0NCA0Yzg2ZjlhODVmYmM1ZTY4MDRlZTJlMTdhNzk3NTM4ZmJlNzg1YmNhIGM0ZTRhMTIyMzFiOWZhNzlhMDA1M2NiNjA3N2ZjYjIxYmI1YjEzNWEgTQlUVAorOjEwMDY0NCAxMDA2NDQgOGFjYjhlOTc1MGUzZjY0NGJmMzIzZmNmM2QzMzg4NDlkYjEwNmM3NyA2YzBiOTkyODZkMGJjZTU1MWFjNGE3YjNkZmY4YjcwNmVkZmYzNzE1IE0JWi9BQQorOjEwMDY0NCAwMDAwMDAgMDg3NDk0MjYyMDg0Y2VmZWU3ZWQ0ODRkMjBjOGRjMDU4MDc5MTI3MiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9BTgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBkNzczNzFkMTU4MTdmY2FhNTdlZWVjMjdmNzcwYzUwNWJhOTc0ZWMxIEEJWi9ETQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBiZWI1ZDM4YzU1MjgzZDI4MDY4NWVhMjFhMGU1MGNmY2MwY2EwNjRhIEEJWi9ETgorOjEwMDY0NCAwMDAwMDAgYTc5YWMzYmU5Mzc3NjM5ZTFjN2QxZWRmMWFlMWIzYTVmMGNjZDhhOSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9NRAorOjEwMDY0NCAxMDA2NDQgNjE0MjJiYTljMmM4NzM0MTYwNjFhODhjZDQwYTU5YTM1YjU3NjQ3NCA2OTdhYWQ3NzE1YTFlNzMwNmNhNzYyOTBhM2RkNDIwOGZiYWVkZGZhIE0JWi9NTQorOjEwMDY0NCAxMDA2NDQgYTVjNTQ0YzIxY2ZjYjA3ZWI4MGE0ZDg5YTViN2QxNTcwMDAyZWRmZCBiMTZkN2IyNWI4NjlmMmJlYjEyNGVmYTUzNDY3ZDhhMTU1MGFkNjk0IE0JWi9NTgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBkMTI5NzljMjJmZmY2OWM1OWNhOTQwOWU3YThmZTNlZTI1ZWFlZTgwIEEJWi9OQQorOjEwMDY0NCAwMDAwMDAgYTE4MzkzYzYzNmI5OGU5YmQ3Mjk2YjhiNDM3ZWE0OTkyYjcyNDQwYyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9ORAorOjEwMDY0NCAxMDA2NDQgM2ZkYmUxN2ZkMDEzMzAzYTJlOTgxZTFjYTFjNmNkNmU3Mjc4OTA4NyA3ZTA5ZDZhM2ExNGJkNjMwOTEzZThjNzU2OTNjZWEzMjE1N2I2MDZkIE0JWi9OTQorRU9GCisKK3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK3g0MD0iJHg0MCR4NDAkeDQwJHg0MCR4NDAkeDQwJHg0MCR4NDAiCit6NDA9JzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitjbXBfZGlmZl9maWxlc19vdXRwdXQgKCkgeworICAgICMgZGlmZi1maWxlcyBuZXZlciByZXBvcnRzIGFkZGl0aW9ucy4gIEFsc28gaXQgZG9lcyBub3QgZmlsbCBpbiB0aGUKKyAgICAjIG9iamVjdCBJRCBmb3IgdGhlIGNoYW5nZWQgZmlsZXMgYmVjYXVzZSBpdCB3YW50cyB5b3UgdG8gbG9vayBhdCB0aGUKKyAgICAjIGZpbGVzeXN0ZW0uCisgICAgc2VkIDwiJDIiID4udGVzdC10bXAgXAorCS1lICcvXjowMDAwMDAgL2Q7cy8nJHg0MCdcKCBbTUNSTkRVXVswLTldKlwpCS8nJHo0MCdcMQkvJyAmJgorICAgIGRpZmYgIiQxIiAudGVzdC10bXAKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAkdHJlZV9PICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcGxhaW4tT0EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgb2Yga25vd24gdHJlZXMuJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgJHRyZWVfTyAkdHJlZV9BID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAkdHJlZV9PICR0cmVlX0IgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcGxhaW4tT0InCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgb2Yga25vd24gdHJlZXMuJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgJHRyZWVfTyAkdHJlZV9CID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAkdHJlZV9BICR0cmVlX0IgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcGxhaW4tQUInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgb2Yga25vd24gdHJlZXMuJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgJHRyZWVfQSAkdHJlZV9CID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1BQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtY2FjaGUgTyB3aXRoIEEgaW4gY2FjaGUnIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAkdHJlZV9BICYmCisgICAgIGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlX08gPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9BJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1jYWNoZSBPIHdpdGggQiBpbiBjYWNoZScgXAorICAgICdnaXQtcmVhZC10cmVlICR0cmVlX0IgJiYKKyAgICAgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWVfTyA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0InCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWNhY2hlIEEgd2l0aCBCIGluIGNhY2hlJyBcCisgICAgJ2dpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZV9BID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1BQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtZmlsZXMgd2l0aCBPIGluIGNhY2hlIGFuZCBBIGNoZWNrZWQgb3V0JyBcCisgICAgJ3JtIC1mciBaIFtBLVpdW0EtWl0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZV9BICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtZiAtYSAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgJHRyZWVfTyB8fCByZXR1cm4gMQorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCA+L2Rldi9udWxsIDsjIHRoaXMgY2FuIGV4aXQgbm9uLXplcm8KKyAgICAgZ2l0LWRpZmYtZmlsZXMgPi50ZXN0LWEgJiYKKyAgICAgY21wX2RpZmZfZmlsZXNfb3V0cHV0IC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9BJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1maWxlcyB3aXRoIE8gaW4gY2FjaGUgYW5kIEIgY2hlY2tlZCBvdXQnIFwKKyAgICAncm0gLWZyIFogW0EtWl1bQS1aXSAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlX0IgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAkdHJlZV9PIHx8IHJldHVybiAxCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoID4vZGV2L251bGwgOyMgdGhpcyBjYW4gZXhpdCBub24temVybworICAgICBnaXQtZGlmZi1maWxlcyA+LnRlc3QtYSAmJgorICAgICBjbXBfZGlmZl9maWxlc19vdXRwdXQgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0InCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWZpbGVzIHdpdGggQSBpbiBjYWNoZSBhbmQgQiBjaGVja2VkIG91dCcgXAorICAgICdybSAtZnIgWiBbQS1aXVtBLVpdICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0ICR0cmVlX0EgfHwgcmV0dXJuIDEKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggPi9kZXYvbnVsbCA7IyB0aGlzIGNhbiBleGl0IG5vbi16ZXJvCisgICAgIGdpdC1kaWZmLWZpbGVzID4udGVzdC1hICYmCisgICAgIGNtcF9kaWZmX2ZpbGVzX291dHB1dCAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1BQicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3cgd2UgaGF2ZSBlc3RhYmxpc2hlZCB0aGUgYmFzZWxpbmUsIHdlIGRvIG5vdCBoYXZlIHRvCisjIHJlbHkgb24gaW5kaXZpZHVhbCBvYmplY3QgSUQgdmFsdWVzIHRoYXQgbXVjaC4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBPIEEgPT0gZGlmZi10cmVlIC1SIEEgTycgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX08gJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgIGdpdC1kaWZmLXRyZWUgLVIgJHRyZWVfQSAkdHJlZV9PID4udGVzdC1iICYmCisgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtYicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSAtciBPIEEgPT0gZGlmZi10cmVlIC1yIC1SIEEgTycgXAorICAgICdnaXQtZGlmZi10cmVlIC1yICR0cmVlX08gJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgIGdpdC1kaWZmLXRyZWUgLXIgLVIgJHRyZWVfQSAkdHJlZV9PID4udGVzdC1iICYmCisgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtYicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBCIEEgPT0gZGlmZi10cmVlIC1SIEEgQicgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX0IgJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgIGdpdC1kaWZmLXRyZWUgLVIgJHRyZWVfQSAkdHJlZV9CID4udGVzdC1iICYmCisgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtYicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSAtciBCIEEgPT0gZGlmZi10cmVlIC1yIC1SIEEgQicgXAorICAgICdnaXQtZGlmZi10cmVlIC1yICR0cmVlX0IgJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgIGdpdC1kaWZmLXRyZWUgLXIgLVIgJHRyZWVfQSAkdHJlZV9CID4udGVzdC1iICYmCisgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtYicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDAzLWRpZmYtcmVuYW1lLTEuc2ggYi90L3Q0MDAzLWRpZmYtcmVuYW1lLTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc1MTk3MAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDMtZGlmZi1yZW5hbWUtMS5zaApAQCAtMCwwICsxLDEyOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdNb3JlIHJlbmFtZSBkZXRlY3Rpb24KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBlY2hvIGZyb3R6ID5yZXpyb3YgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIENPUFlJTkcgcmV6cm92ICYmCisgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGVjaG8gJHRyZWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZScgXAorICAgICdzZWQgLWUgJ3MvSE9XRVZFUi9Ib3dldmVyLycgPENPUFlJTkcgPkNPUFlJTkcuMSAmJgorICAgIHNlZCAtZSAncy9HUEwvRy5QLkwvZycgPENPUFlJTkcgPkNPUFlJTkcuMiAmJgorICAgIHJtIC1mIENPUFlJTkcgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4/JworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORy4xIGFuZCBDT1BZSU5HLjIsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBTbyB3ZSBzYXkgeW91CisjIGNvcHktYW5kLWVkaXQgb25lLCBhbmQgcmVuYW1lLWFuZC1lZGl0IHRoZSBvdGhlci4gIFdlIGRvIG5vdCBzYXkKKyMgYW55dGhpbmcgYWJvdXQgcmV6cm92LgorCitHSVRfRElGRl9PUFRTPS0tdW5pZmllZD0wIGdpdC1kaWZmLWluZGV4IC1NIC1wICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HLjEKK2NvcHkgZnJvbSBDT1BZSU5HCitjb3B5IHRvIENPUFlJTkcuMQorLS0tIGEvQ09QWUlORworKysrIGIvQ09QWUlORy4xCitAQCAtNiArNiBAQAorLSBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKKysgSG93ZXZlciwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcuMgorcmVuYW1lIGZyb20gQ09QWUlORworcmVuYW1lIHRvIENPUFlJTkcuMgorLS0tIGEvQ09QWUlORworKysrIGIvQ09QWUlORy4yCitAQCAtMiArMiBAQAorLSBOb3RlIHRoYXQgdGhlIG9ubHkgdmFsaWQgdmVyc2lvbiBvZiB0aGUgR1BMIGFzIGZhciBhcyB0aGlzIHByb2plY3QKKysgTm90ZSB0aGF0IHRoZSBvbmx5IHZhbGlkIHZlcnNpb24gb2YgdGhlIEcuUC5MIGFzIGZhciBhcyB0aGlzIHByb2plY3QKK0BAIC02ICs2IEBACistIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorKyBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHLlAuTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorQEAgLTEyICsxMiBAQAorLQlUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCisrCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgRy5QLkwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMxKScgXAorICAgICdjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlIGFnYWluJyBcCisgICAgJ212IENPUFlJTkcuMiBDT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEgQ09QWUlORy4yJworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORyBhbmQgQ09QWUlORy4xLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgU28gd2Ugc2F5IHlvdQorIyBlZGl0ZWQgb25lLCBhbmQgY29weS1hbmQtZWRpdCB0aGUgb3RoZXIuICBXZSBkbyBub3Qgc2F5CisjIGFueXRoaW5nIGFib3V0IHJlenJvdi4KKworR0lUX0RJRkZfT1BUUz0tLXVuaWZpZWQ9MCBnaXQtZGlmZi1pbmRleCAtQyAtcCAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKK2RpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORworLS0tIGEvQ09QWUlORworKysrIGIvQ09QWUlORworQEAgLTIgKzIgQEAKKy0gTm90ZSB0aGF0IHRoZSBvbmx5IHZhbGlkIHZlcnNpb24gb2YgdGhlIEdQTCBhcyBmYXIgYXMgdGhpcyBwcm9qZWN0CisrIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHLlAuTCBhcyBmYXIgYXMgdGhpcyBwcm9qZWN0CitAQCAtNiArNiBAQAorLSBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKKysgSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gRy5QLkx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKK0BAIC0xMiArMTIgQEAKKy0JVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorKwlUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEcuUC5MIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KK2RpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORy4xCitjb3B5IGZyb20gQ09QWUlORworY29weSB0byBDT1BZSU5HLjEKKy0tLSBhL0NPUFlJTkcKKysrKyBiL0NPUFlJTkcuMQorQEAgLTYgKzYgQEAKKy0gSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCisrIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMyKScgXAorICAgICdjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlIG9uY2UgYWdhaW4nIFwKKyAgICAnY2F0IC4uLy4uL0NPUFlJTkcgPkNPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMScKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcgYW5kIENPUFlJTkcuMSwKKyMgYnV0IENPUFlJTkcgaXMgbm90IGVkaXRlZC4gIFdlIHNheSB5b3UgY29weS1hbmQtZWRpdCBDT1BZSU5HLjE7IHRoaXMKKyMgaXMgb25seSBwb3NzaWJsZSBiZWNhdXNlIC1DIG1vZGUgbm93IHJlcG9ydHMgdGhlIHVubW9kaWZpZWQgZmlsZSB0bworIyB0aGUgZGlmZi1jb3JlLiAgVW5jaGFuZ2VkIHJlenJvdiwgYWx0aG91Z2ggYmVpbmcgZmVkIHRvCisjIGdpdC1kaWZmLWluZGV4IGFzIHdlbGwsIHNob3VsZCBub3QgYmUgbWVudGlvbmVkLgorCitHSVRfRElGRl9PUFRTPS0tdW5pZmllZD0wIFwKKyAgICBnaXQtZGlmZi1pbmRleCAtQyAtLWZpbmQtY29waWVzLWhhcmRlciAtcCAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKK2RpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORy4xCitjb3B5IGZyb20gQ09QWUlORworY29weSB0byBDT1BZSU5HLjEKKy0tLSBhL0NPUFlJTkcKKysrKyBiL0NPUFlJTkcuMQorQEAgLTYgKzYgQEAKKy0gSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCisrIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMzKScgXAorICAgICdjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDA0LWRpZmYtcmVuYW1lLXN5bWxpbmsuc2ggYi90L3Q0MDA0LWRpZmYtcmVuYW1lLXN5bWxpbmsuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTIzYWFhMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDQtZGlmZi1yZW5hbWUtc3ltbGluay5zaApAQCAtMCwwICsxLDY3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J01vcmUgcmVuYW1lIGRldGVjdGlvbiB0ZXN0cy4KKworVGhlIHJlbmFtZSBkZXRlY3Rpb24gbG9naWMgc2hvdWxkIGJlIGFibGUgdG8gZGV0ZWN0IHB1cmUgcmVuYW1lIG9yCitjb3B5IG9mIHN5bWJvbGljIGxpbmtzLCBidXQgc2hvdWxkIG5vdCBwcm9kdWNlIHJlbmFtZS9jb3B5IGZvbGxvd2VkCitieSBhbiBlZGl0IGZvciB0aGVtLgorJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ2VjaG8geHl6enkgfCB0ciAtZCAnXFxcXCcwMTIgPnlvbWluICYmCisgICAgIGxuIC1zIHh5enp5IGZyb3R6ICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiB5b21pbiAmJgorICAgIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICR0cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUnIFwKKyAgICAnbXYgZnJvdHogcmV6cm92ICYmCisgICAgIHJtIC1mIHlvbWluICYmCisgICAgIGxuIC1zIHh5enp5IG5pdGZvbCAmJgorICAgICBsbiAtcyB4enp6eSBib3piYXIgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGZyb3R6IHJlenJvdiBuaXRmb2wgYm96YmFyIHlvbWluJworCisjIHRyZWUgaGFzIGZyb3R6IHBvaW50aW5nIGF0IHh5enp5LCBhbmQgeW9taW4gdGhhdCBjb250YWlucyB4eXp6eSB0bworIyBjb25mdXNlIHRoaW5ncy4gIHdvcmsgdHJlZSBoYXMgcmV6cm92ICh4eXp6eSkgbml0Zm9sICh4eXp6eSkgYW5kCisjIGJvemJhciAoeHp6enkpLgorIyByZXpyb3YgYW5kIG5pdGZvbCBhcmUgcmVuYW1lL2NvcHkgb2YgZnJvdHogYW5kIGJvemJhciBzaG91bGQgYmUKKyMgYSBuZXcgY3JlYXRpb24uCisKK0dJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvYm96YmFyIGIvYm96YmFyCituZXcgZmlsZSBtb2RlIDEyMDAwMAorLS0tIC9kZXYvbnVsbAorKysrIGIvYm96YmFyCitAQCAtMCwwICsxIEBACisreHp6enkKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvbml0Zm9sCitzaW1pbGFyaXR5IGluZGV4IDEwMCUKK2NvcHkgZnJvbSBmcm90egorY29weSB0byBuaXRmb2wKK2RpZmYgLS1naXQgYS9mcm90eiBiL3JlenJvdgorc2ltaWxhcml0eSBpbmRleCAxMDAlCityZW5hbWUgZnJvbSBmcm90egorcmVuYW1lIHRvIHJlenJvdgorZGlmZiAtLWdpdCBhL3lvbWluIGIveW9taW4KK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAorLS0tIGEveW9taW4KKysrKyAvZGV2L251bGwKK0BAIC0xICswLDAgQEAKKy14eXp6eQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGRpZmYgb3V0cHV0JyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDUtZGlmZi1yZW5hbWUtMi5zaCBiL3QvdDQwMDUtZGlmZi1yZW5hbWUtMi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ODRmZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwNS1kaWZmLXJlbmFtZS0yLnNoCkBAIC0wLDAgKzEsODYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nU2FtZSByZW5hbWUgZGV0ZWN0aW9uIGFzIHQ0MDAzIGJ1dCB0ZXN0aW5nIGRpZmYtcmF3LgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGVjaG8gZnJvdHogPnJlenJvdiAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQ09QWUlORyByZXpyb3YgJiYKKyAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZWNobyAkdHJlZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlJyBcCisgICAgJ3NlZCAtZSAncy9IT1dFVkVSL0hvd2V2ZXIvJyA8Q09QWUlORyA+Q09QWUlORy4xICYmCisgICAgc2VkIC1lICdzL0dQTC9HLlAuTC9nJyA8Q09QWUlORyA+Q09QWUlORy4yICYmCisgICAgcm0gLWYgQ09QWUlORyAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLj8nCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HLjEgYW5kIENPUFlJTkcuMiwKKyMgYm90aCBhcmUgc2xpZ2h0bHkgZWRpdGVkLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFdlIHNheSBDT1BZSU5HLjEKKyMgYW5kIENPUFlJTkcuMiBhcmUgYmFzZWQgb24gQ09QWUlORywgYW5kIGRvIG5vdCBzYXkgYW55dGhpbmcgYWJvdXQKKyMgcmV6cm92LgorCitnaXQtZGlmZi1pbmRleCAtTSAkdHJlZSA+Y3VycmVudAorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CUNPUFlJTkcJQ09QWUlORy4xCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2YzY3OTYxYmJhZWQzNGExMjdmNzZkMjYxZjRjMGJmNzNlZGE0NzEgUjEyMzQJQ09QWUlORwlDT1BZSU5HLjIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZSBhZ2FpbicgXAorICAgICdtdiBDT1BZSU5HLjIgQ09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xIENPUFlJTkcuMicKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcgYW5kIENPUFlJTkcuMSwKKyMgYm90aCBhcmUgc2xpZ2h0bHkgZWRpdGVkLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFdlIHNheSBDT1BZSU5HLjEKKyMgaXMgYmFzZWQgb24gQ09QWUlORyBhbmQgQ09QWUlORyBpcyBzdGlsbCB0aGVyZSwgYW5kIGRvIG5vdCBzYXkgYW55dGhpbmcKKyMgYWJvdXQgcmV6cm92LgorCitnaXQtZGlmZi1pbmRleCAtQyAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDZjNjc5NjFiYmFlZDM0YTEyN2Y3NmQyNjFmNGMwYmY3M2VkYTQ3MSBNCUNPUFlJTkcKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAlDT1BZSU5HCUNPUFlJTkcuMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMyKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIHRoZSBzYW1lIENPUFlJTkcgYW5kCisjIGNvcHktZWRpdGVkIENPUFlJTkcuMSwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzaG91bGQgbm90IHNheQorIyBhbnl0aGluZyBhYm91dCByZXpyb3Ygbm9yIENPUFlJTkcsIHNpbmNlIHRoZSByZXZpc2VkIGFnYWluIGRpZmYtcmF3CisjIG5vd3MgaG93IHRvIHNheSBDb3B5LgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgb25jZSBhZ2FpbicgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xJworCitnaXQtZGlmZi1pbmRleCAtQyAtLWZpbmQtY29waWVzLWhhcmRlciAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAlDT1BZSU5HCUNPUFlJTkcuMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMzKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwNi1kaWZmLW1vZGUuc2ggYi90L3Q0MDA2LWRpZmYtbW9kZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YWQ2OWQxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwNi1kaWZmLW1vZGUuc2gKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IG1vZGUgY2hhbmdlIGRpZmZzLgorCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NldHVwJyBcCisgICAgJ2VjaG8gZnJvdHogPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICB0cmVlPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyAkdHJlZScKKworaWYgWyAiJChnaXQgcmVwby1jb25maWcgLS1nZXQgY29yZS5maWxlbW9kZSkiID0gZmFsc2UgXQordGhlbgorCXNheSAnZmlsZW1vZGUgZGlzYWJsZWQgb24gdGhlIGZpbGVzeXN0ZW0sIHVzaW5nIHVwZGF0ZS1pbmRleCAtLWNobW9kPSt4JworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWNobW9kPSt4JyBcCisJICAgICdnaXQtdXBkYXRlLWluZGV4IHJlenJvdiAmJgorCSAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWNobW9kPSt4IHJlenJvdiAmJgorCSAgICAgZ2l0LWRpZmYtaW5kZXggJHRyZWUgPmN1cnJlbnQnCitlbHNlCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICdjaG1vZCcgXAorCSAgICAnY2htb2QgK3ggcmV6cm92ICYmCisJICAgICBnaXQtdXBkYXRlLWluZGV4IHJlenJvdiAmJgorCSAgICAgZ2l0LWRpZmYtaW5kZXggJHRyZWUgPmN1cnJlbnQnCitmaQorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3NlZCAtZSAncy9cKDoxMDA2NDQgMTAwNzU1XCkgXCgnIiRfeDQwIidcKSBcMiAvXDEgWCBYIC8nIDxjdXJyZW50ID5jaGVjaworZWNobyAiOjEwMDY0NCAxMDA3NTUgWCBYIE0JcmV6cm92IiA+ZXhwZWN0ZWQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZlcmlmeScgXAorICAgICdkaWZmIC11IGV4cGVjdGVkIGNoZWNrJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NDAwNy1yZW5hbWUtMy5zaCBiL3QvdDQwMDctcmVuYW1lLTMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmI2YmE2OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDctcmVuYW1lLTMuc2gKQEAgLTAsMCArMSw5MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdSZW5hbWUgaW50ZXJhY3Rpb24gd2l0aCBwYXRoc3BlYy4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdta2RpciBwYXRoMCBwYXRoMSAmJgorICAgICBjcCAuLi8uLi9DT1BZSU5HIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMC9DT1BZSU5HICYmCisgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGVjaG8gJHRyZWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZScgXAorICAgICdjcCBwYXRoMC9DT1BZSU5HIHBhdGgxL0NPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBwYXRoMC9DT1BZSU5HIHBhdGgxL0NPUFlJTkcnCisKKyMgSW4gdGhlIHRyZWUsIHRoZXJlIGlzIG9ubHkgcGF0aDAvQ09QWUlORy4gIEluIHRoZSBjYWNoZSwgcGF0aDAgYW5kCisjIHBhdGgxIGJvdGggaGF2ZSBDT1BZSU5HIGFuZCB0aGUgbGF0dGVyIGlzIGEgY29weSBvZiBwYXRoMC9DT1BZSU5HLgorIyBDb21wYXJpbmcgdGhlIGZ1bGwgdHJlZSB3aXRoIGNhY2hlIHNob3VsZCB0ZWxsIHVzIHNvLgorCitnaXQtZGlmZi1pbmRleCAtQyAtLWZpbmQtY29waWVzLWhhcmRlciAkdHJlZSA+Y3VycmVudAorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIEMxMDAJcGF0aDAvQ09QWUlORwlwYXRoMS9DT1BZSU5HCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSByZXN1bHQgKCMxKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMgSW4gdGhlIHRyZWUsIHRoZXJlIGlzIG9ubHkgcGF0aDAvQ09QWUlORy4gIEluIHRoZSBjYWNoZSwgcGF0aDAgYW5kCisjIHBhdGgxIGJvdGggaGF2ZSBDT1BZSU5HIGFuZCB0aGUgbGF0dGVyIGlzIGEgY29weSBvZiBwYXRoMC9DT1BZSU5HLgorIyBIb3dldmVyIHdoZW4gd2Ugc2F5IHdlIGNhcmUgb25seSBhYm91dCBwYXRoMSwgd2Ugc2hvdWxkIGp1c3Qgc2VlCisjIHBhdGgxL0NPUFlJTkcgc3VkZGVubHkgYXBwZWFyaW5nIGZyb20gbm93aGVyZSwgbm90IGRldGVjdGVkIGFzCisjIGEgY29weSBmcm9tIHBhdGgwL0NPUFlJTkcuCisKK2dpdC1kaWZmLWluZGV4IC1DICR0cmVlIHBhdGgxID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgQQlwYXRoMS9DT1BZSU5HCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSByZXN1bHQgKCMyKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd0d2VhayB3b3JrIHRyZWUnIFwKKyAgICAncm0gLWYgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlIHBhdGgwL0NPUFlJTkcnCisKKyMgSW4gdGhlIHRyZWUsIHRoZXJlIGlzIG9ubHkgcGF0aDAvQ09QWUlORy4gIEluIHRoZSBjYWNoZSwgcGF0aDAgZG9lcworIyBub3QgaGF2ZSBDT1BZSU5HIGFueW1vcmUgYW5kIHBhdGgxIGhhcyBDT1BZSU5HIHdoaWNoIGlzIGEgY29weSBvZgorIyBwYXRoMC9DT1BZSU5HLiAgU2hvd2luZyB0aGUgZnVsbCB0cmVlIHdpdGggY2FjaGUgc2hvdWxkIHRlbGwgdXMgYWJvdXQKKyMgdGhlIHJlbmFtZS4KKworZ2l0LWRpZmYtaW5kZXggLUMgJHRyZWUgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBSMTAwCXBhdGgwL0NPUFlJTkcJcGF0aDEvQ09QWUlORworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSB0aGUgcmVzdWx0ICgjMyknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCisjIEluIHRoZSB0cmVlLCB0aGVyZSBpcyBvbmx5IHBhdGgwL0NPUFlJTkcuICBJbiB0aGUgY2FjaGUsIHBhdGgwIGRvZXMKKyMgbm90IGhhdmUgQ09QWUlORyBhbnltb3JlIGFuZCBwYXRoMSBoYXMgQ09QWUlORyB3aGljaCBpcyBhIGNvcHkgb2YKKyMgcGF0aDAvQ09QWUlORy4gIFdoZW4gd2Ugc2F5IHdlIGNhcmUgb25seSBhYm91dCBwYXRoMSwgd2Ugc2hvdWxkIGp1c3QKKyMgc2VlIHBhdGgxL0NPUFlJTkcgYXBwZWFyaW5nIGZyb20gbm93aGVyZS4KKworZ2l0LWRpZmYtaW5kZXggLUMgJHRyZWUgcGF0aDEgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBBCXBhdGgxL0NPUFlJTkcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgdGhlIHJlc3VsdCAoIzQpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDA4LWRpZmYtYnJlYWstcmV3cml0ZS5zaCBiL3QvdDQwMDgtZGlmZi1icmVhay1yZXdyaXRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2M2FjMWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA4LWRpZmYtYnJlYWstcmV3cml0ZS5zaApAQCAtMCwwICsxLDE4OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdCcmVhayBhbmQgdGhlbiByZW5hbWUKKworV2UgaGF2ZSB0d28gdmVyeSBkaWZmZXJlbnQgZmlsZXMsIGZpbGUwIGFuZCBmaWxlMSwgcmVnaXN0ZXJlZCBpbiBhIHRyZWUuCisKK1dlIHVwZGF0ZSBmaWxlMSBzbyBkcmFzdGljYWxseSB0aGF0IGl0IGlzIG1vcmUgc2ltaWxhciB0byBmaWxlMCwgYW5kCit0aGVuIHJlbW92ZSBmaWxlMC4gIFdpdGggLUIsIGNoYW5nZXMgdG8gZmlsZTEgc2hvdWxkIGJlIGJyb2tlbiBpbnRvCitzZXBhcmF0ZSBkZWxldGUgYW5kIGNyZWF0ZSwgcmVzdWx0aW5nIGluIHJlbW92YWwgb2YgZmlsZTAsIHJlbW92YWwgb2YKK29yaWdpbmFsIGZpbGUxIGFuZCBjcmVhdGlvbiBvZiBjb21wbGV0ZWx5IHJld3JpdHRlbiBmaWxlMS4KKworRnVydGhlciwgd2l0aCAtQiBhbmQgLU0gdG9nZXRoZXIsIHRoZXNlIHRocmVlIG1vZGlmaWNhdGlvbnMgc2hvdWxkCit0dXJuIGludG8gcmVuYW1lLWVkaXQgb2YgZmlsZTAgaW50byBmaWxlMS4KKworU3RhcnRpbmcgZnJvbSB0aGUgc2FtZSB0d28gZmlsZXMgaW4gdGhlIHRyZWUsIHdlIHN3YXAgZmlsZTAgYW5kIGZpbGUxLgorV2l0aCAtQiwgdGhpcyBzaG91bGQgYmUgZGV0ZWN0ZWQgYXMgdHdvIGNvbXBsZXRlIHJld3JpdGVzLCByZXN1bHRpbmcgaW4KK2ZvdXIgY2hhbmdlcyBpbiB0b3RhbC4KKworRnVydGhlciwgd2l0aCAtQiBhbmQgLU0gdG9nZXRoZXIsIHRoZXNlIHNob3VsZCB0dXJuIGludG8gdHdvIHJlbmFtZXMuCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgIHNldHVwIFwKKyAgICAnY2F0IC4uLy4uL1JFQURNRSA+ZmlsZTAgJiYKKyAgICAgY2F0IC4uLy4uL0NPUFlJTkcgPmZpbGUxICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlMCBmaWxlMSAmJgorICAgIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICIkdHJlZSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgZmlsZTEgd2l0aCBjb3B5LWVkaXQgb2YgZmlsZTAgYW5kIHJlbW92ZSBmaWxlMCcgXAorICAgICdzZWQgLWUgInMvZ2l0L0dJVC8iIGZpbGUwID5maWxlMSAmJgorICAgICBybSAtZiBmaWxlMCAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgZmlsZTAgZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CIC0tY2FjaGVkICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDAwMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAxMWUzMzE0NjVhODljMzk0ZGMyNWM3ODBkZTIzMDA0Mzc1MGMxZWM4IE0xMDAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CICgjMSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQiBhbmQgLU0nIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgLU0gIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgMDhiYjJmYjY3MWRlZmY0YzAzYTRkNGEwYTEzMTVkZmY5OGQ1NzMyYyBSMTAwCWZpbGUwCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAtTSAoIzIpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3N3YXAgZmlsZTAgYW5kIGZpbGUxJyBcCisgICAgJ3JtIC1mIGZpbGUwIGZpbGUxICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWUgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11IC1hICYmCisgICAgIG12IGZpbGUwIHRtcCAmJgorICAgICBtdiBmaWxlMSBmaWxlMCAmJgorICAgICBtdiB0bXAgZmlsZTEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBmaWxlMCBmaWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUInIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBNMTAwCWZpbGUwCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgTTEwMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgKCMzKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CIGFuZCAtTScgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAtTSAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIFIxMDAJZmlsZTEJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBSMTAwCWZpbGUwCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAtTSAoIzQpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21ha2UgZmlsZTAgaW50byBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQnIFwKKyAgICAncm0gLWYgZmlsZTAgJiYKKyAgICAgbG4gLXMgZnJvdHogZmlsZTAgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBmaWxlMCBmaWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUInIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTIwMDAwIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgNjdiZTQyMWY4ODgyNDU3ODg1NzYyNGY3YjNkYzc1ZTk5YThhMTQ4MSBUCWZpbGUwCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgTTEwMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgKCM1KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CIC1NICIkdHJlZSIgPmN1cnJlbnQnCisKKyMgVGhpcyBzaG91bGQgbm90IG1pc3Rha2UgZmlsZTAgYXMgdGhlIGNvcHkgc291cmNlIG9mIG5ldyBmaWxlMQorIyBkdWUgdG8gdHlwZSBkaWZmZXJlbmNlcy4KK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEyMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDY3YmU0MjFmODg4MjQ1Nzg4NTc2MjRmN2IzZGM3NWU5OWE4YTE0ODEgVAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIE0xMDAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CIC1NICgjNiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtTScgXAorICAgICdnaXQtZGlmZi1pbmRleCAtTSAiJHRyZWUiID5jdXJyZW50JworCisjIFRoaXMgc2hvdWxkIG5vdCBtaXN0YWtlIGZpbGUwIGFzIHRoZSBjb3B5IHNvdXJjZSBvZiBuZXcgZmlsZTEKKyMgZHVlIHRvIHR5cGUgZGlmZmVyZW5jZXMuCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMjAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiA2N2JlNDIxZjg4ODI0NTc4ODU3NjI0ZjdiM2RjNzVlOTlhOGExNDgxIFQJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBNCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtTSAoIzcpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2ZpbGUxIGVkaXRlZCB0byBsb29rIGxpa2UgZmlsZTAgYW5kIGZpbGUwIHJlbmFtZS1lZGl0ZWQgdG8gZmlsZTInIFwKKyAgICAncm0gLWYgZmlsZTAgZmlsZTEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZSAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJiYKKyAgICAgc2VkIC1lICJzL2dpdC9HSVQvIiBmaWxlMCA+ZmlsZTEgJiYKKyAgICAgc2VkIC1lICJzL2dpdC9HRVQvIiBmaWxlMCA+ZmlsZTIgJiYKKyAgICAgcm0gLWYgZmlsZTAKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBmaWxlMCBmaWxlMSBmaWxlMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUInIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMDAwMDAwIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECWZpbGUwCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA4YmIyZmI2NzFkZWZmNGMwM2E0ZDRhMGExMzE1ZGZmOThkNTczMmMgTTEwMAlmaWxlMQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIEEJZmlsZTIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CICgjOCknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQiAtTScgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAtTSAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiAwOGJiMmZiNjcxZGVmZjRjMDNhNGQ0YTBhMTMxNWRmZjk4ZDU3MzJjIEMwOTUJZmlsZTAJZmlsZTEKKzoxMDA2NDQgMTAwNjQ0IGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgNTlmODMyZTVjOGIzZjdlNDg2YmUxNWFkMGNkM2U5NWJhOWFmODk5OCBSMDk1CWZpbGUwCWZpbGUyCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAtTSAoIzkpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDA5LWRpZmYtcmVuYW1lLTQuc2ggYi90L3Q0MDA5LWRpZmYtcmVuYW1lLTQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmYyZjhiMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDktZGlmZi1yZW5hbWUtNC5zaApAQCAtMCwwICsxLDk1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1NhbWUgcmVuYW1lIGRldGVjdGlvbiBhcyB0NDAwMyBidXQgdGVzdGluZyBkaWZmLXJhdyAtei4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBlY2hvIGZyb3R6ID5yZXpyb3YgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIENPUFlJTkcgcmV6cm92ICYmCisgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGVjaG8gJHRyZWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZScgXAorICAgICdzZWQgLWUgJ3MvSE9XRVZFUi9Ib3dldmVyLycgPENPUFlJTkcgPkNPUFlJTkcuMSAmJgorICAgIHNlZCAtZSAncy9HUEwvRy5QLkwvZycgPENPUFlJTkcgPkNPUFlJTkcuMiAmJgorICAgIHJtIC1mIENPUFlJTkcgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4/JworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORy4xIGFuZCBDT1BZSU5HLjIsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzYXkgQ09QWUlORy4xCisjIGFuZCBDT1BZSU5HLjIgYXJlIGJhc2VkIG9uIENPUFlJTkcsIGFuZCBkbyBub3Qgc2F5IGFueXRoaW5nIGFib3V0CisjIHJlenJvdi4KKworZ2l0LWRpZmYtaW5kZXggLXogLU0gJHRyZWUgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAorQ09QWUlORworQ09QWUlORy4xCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2YzY3OTYxYmJhZWQzNGExMjdmNzZkMjYxZjRjMGJmNzNlZGE0NzEgUjEyMzQKK0NPUFlJTkcKK0NPUFlJTkcuMgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMxKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3X3ogY3VycmVudCBleHBlY3RlZCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgYWdhaW4nIFwKKyAgICAnbXYgQ09QWUlORy4yIENPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMSBDT1BZSU5HLjInCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HIGFuZCBDT1BZSU5HLjEsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzYXkgQ09QWUlORy4xCisjIGlzIGJhc2VkIG9uIENPUFlJTkcgYW5kIENPUFlJTkcgaXMgc3RpbGwgdGhlcmUsIGFuZCBkbyBub3Qgc2F5IGFueXRoaW5nCisjIGFib3V0IHJlenJvdi4KKworZ2l0LWRpZmYtaW5kZXggLXogLUMgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2YzY3OTYxYmJhZWQzNGExMjdmNzZkMjYxZjRjMGJmNzNlZGE0NzEgTQorQ09QWUlORworOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CitDT1BZSU5HCitDT1BZSU5HLjEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3Jhd196IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIHRoZSBzYW1lIENPUFlJTkcgYW5kCisjIGNvcHktZWRpdGVkIENPUFlJTkcuMSwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzaG91bGQgbm90IHNheQorIyBhbnl0aGluZyBhYm91dCByZXpyb3Ygbm9yIENPUFlJTkcsIHNpbmNlIHRoZSByZXZpc2VkIGFnYWluIGRpZmYtcmF3CisjIG5vd3MgaG93IHRvIHNheSBDb3B5LgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgb25jZSBhZ2FpbicgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xJworCitnaXQtZGlmZi1pbmRleCAteiAtQyAtLWZpbmQtY29waWVzLWhhcmRlciAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAorQ09QWUlORworQ09QWUlORy4xCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXdfeiBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTAtZGlmZi1wYXRoc3BlYy5zaCBiL3QvdDQwMTAtZGlmZi1wYXRoc3BlYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZTE1NDRkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMC1kaWZmLXBhdGhzcGVjLnNoCkBAIC0wLDAgKzEsNjUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nUGF0aHNwZWMgcmVzdHJpY3Rpb25zCisKK1ByZXBhcmU6CisgICAgICAgIGZpbGUwCisgICAgICAgIHBhdGgxL2ZpbGUxCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgIHNldHVwIFwKKyAgICAnZWNobyBmcm90eiA+ZmlsZTAgJiYKKyAgICAgbWtkaXIgcGF0aDEgJiYKKyAgICAgZWNobyByZXpyb3YgPnBhdGgxL2ZpbGUxICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZTAgcGF0aDEvZmlsZTEgJiYKKyAgICAgdHJlZT1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gIiR0cmVlIiAmJgorICAgICBlY2hvIG5pdGZvbCA+ZmlsZTAgJiYKKyAgICAgZWNobyB5b21pbiA+cGF0aDEvZmlsZTEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBmaWxlMCBwYXRoMS9maWxlMScKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbWl0IHRvIHBhdGggc2hvdWxkIHNob3cgbm90aGluZycgXAorICAgICdnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZSAtLSBwYXRoID5jdXJyZW50ICYmCisgICAgIGNvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDc2NjQ5OGQ5M2E0YjA2MDU3YThlNDlkMjNmNDA2OGYxMTcwZmYzOGYgMGE0MWUxMTVhYjYxYmUwMzI4YTE5YjI5ZjE4Y2RjYjQ5MzM4ZDUxNiBNCXBhdGgxL2ZpbGUxCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdsaW1pdCB0byBwYXRoMSBzaG91bGQgc2hvdyBwYXRoMS9maWxlMScgXAorICAgICdnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZSAtLSBwYXRoMSA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA3NjY0OThkOTNhNGIwNjA1N2E4ZTQ5ZDIzZjQwNjhmMTE3MGZmMzhmIDBhNDFlMTE1YWI2MWJlMDMyOGExOWIyOWYxOGNkY2I0OTMzOGQ1MTYgTQlwYXRoMS9maWxlMQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gcGF0aDEvIHNob3VsZCBzaG93IHBhdGgxL2ZpbGUxJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlIC0tIHBhdGgxLyA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA3NjY0OThkOTNhNGIwNjA1N2E4ZTQ5ZDIzZjQwNjhmMTE3MGZmMzhmIDBhNDFlMTE1YWI2MWJlMDMyOGExOWIyOWYxOGNkY2I0OTMzOGQ1MTYgTQlmaWxlMAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gZmlsZTAgc2hvdWxkIHNob3cgZmlsZTAnIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWUgLS0gZmlsZTAgPmN1cnJlbnQgJiYKKyAgICAgY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gZmlsZTAvIHNob3VsZCBlbWl0IG5vdGhpbmcuJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlIC0tIGZpbGUwLyA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxMS1kaWZmLXN5bWxpbmsuc2ggYi90L3Q0MDExLWRpZmYtc3ltbGluay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNzlhODMxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMS1kaWZmLXN5bWxpbmsuc2gKQEAgLTAsMCArMSw4NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZGlmZiBvZiBzeW1saW5rcy4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoCisKK2NhdCA+IGV4cGVjdGVkIDw8IEVPRgorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvZnJvdHoKK25ldyBmaWxlIG1vZGUgMTIwMDAwCitpbmRleCAwMDAwMDAwLi43YzQ2NWFmCistLS0gL2Rldi9udWxsCisrKysgYi9mcm90egorQEAgLTAsMCArMSBAQAorK3h5enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZiBuZXcgc3ltbGluaycgXAorICAgICdsbiAtcyB4eXp6eSBmcm90eiAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggJiYKKyAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgIEdJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPiBjdXJyZW50ICYmCisgICAgY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmIHVuY2hhbmdlZCBzeW1saW5rJyBcCisgICAgJ3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IGZyb3R6ICYmCisgICAgdGVzdCAteiAiJChnaXQtZGlmZi1pbmRleCAtLW5hbWUtb25seSAkdHJlZSkiJworCitjYXQgPiBleHBlY3RlZCA8PCBFT0YKK2RpZmYgLS1naXQgYS9mcm90eiBiL2Zyb3R6CitkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKK2luZGV4IDdjNDY1YWYuLjAwMDAwMDAKKy0tLSBhL2Zyb3R6CisrKysgL2Rldi9udWxsCitAQCAtMSArMCwwIEBACisteHl6enkKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmIHJlbW92ZWQgc3ltbGluaycgXAorICAgICdybSBmcm90eiAmJgorICAgIGdpdC1kaWZmLWluZGV4IC1NIC1wICR0cmVlID4gY3VycmVudCAmJgorICAgIGNvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PCBFT0YKK2RpZmYgLS1naXQgYS9mcm90eiBiL2Zyb3R6CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYgaWRlbnRpY2FsLCBidXQgbmV3bHkgY3JlYXRlZCBzeW1saW5rJyBcCisgICAgJ3NsZWVwIDMgJiYKKyAgICBsbiAtcyB4eXp6eSBmcm90eiAmJgorICAgIGdpdC1kaWZmLWluZGV4IC1NIC1wICR0cmVlID4gY3VycmVudCAmJgorICAgIGNvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PCBFT0YKK2RpZmYgLS1naXQgYS9mcm90eiBiL2Zyb3R6CitpbmRleCA3YzQ2NWFmLi5kZjFkYjU0IDEyMDAwMAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSArMSBAQAorLXh5enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyt5eHl5egorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYgZGlmZmVyZW50IHN5bWxpbmsnIFwKKyAgICAncm0gZnJvdHogJiYKKyAgICBsbiAtcyB5eHl5eiBmcm90eiAmJgorICAgIGdpdC1kaWZmLWluZGV4IC1NIC1wICR0cmVlID4gY3VycmVudCAmJgorICAgIGNvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTItZGlmZi1iaW5hcnkuc2ggYi90L3Q0MDEyLWRpZmYtYmluYXJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyMzYwNmMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEyLWRpZmYtYmluYXJ5LnNoCkBAIC0wLDAgKzEsODAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nQmluYXJ5IGRpZmYgYW5kIGFwcGx5CisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJlIHJlcG9zaXRvcnknIFwKKwknZWNobyBBSVQgPmEgJiYgZWNobyBCSVQgPmIgJiYgZWNobyBDSVQgPmMgJiYgZWNobyBESVQgPmQgJiYKKwkgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBhIGIgYyBkICYmCisJIGVjaG8gZ2l0ID5hICYmCisJIGNhdCAuLi90ZXN0NDAxMi5wbmcgPmIgJiYKKwkgZWNobyBnaXQgPmMgJiYKKwkgY2F0IGIgYiA+ZCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisgYSB8ICAgIDIgKy0KKyBiIHwgIEJpbgorIGMgfCAgICAyICstCisgZCB8ICBCaW4KKyA0IGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiB3aXRob3V0IC0tYmluYXJ5JyBcCisJJ2dpdC1kaWZmIHwgZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPmN1cnJlbnQgJiYKKwkgY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYgd2l0aCAtLWJpbmFyeScgXAorCSdnaXQtZGlmZiAtLWJpbmFyeSB8IGdpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5ID5jdXJyZW50ICYmCisJIGNtcCBjdXJyZW50IGV4cGVjdGVkJworCisjIGFwcGx5IG5lZWRzIHRvIGJlIGFibGUgdG8gc2tpcCB0aGUgYmluYXJ5IG1hdGVyaWFsIGNvcnJlY3RseQorIyBpbiBvcmRlciB0byByZXBvcnQgdGhlIGxpbmUgbnVtYmVyIG9mIGEgY29ycnVwdCBwYXRjaC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGRldGVjdGluZyBjb3JydXB0IHBhdGNoIGNvcnJlY3RseScgXAorCSdnaXQtZGlmZiB8IHNlZCAtZSAncy8tQ0lUL3hDSVQvJyA+YnJva2VuICYmCisJIGlmIGdpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IGJyb2tlbiAyPmRldGVjdGVkCisJIHRoZW4KKwkJZWNobyB1bmhhcHB5IC0gc2hvdWxkIGhhdmUgZGV0ZWN0ZWQgYW4gZXJyb3IKKwkJKGV4aXQgMSkKKwkgZWxzZQorCQllY2hvIGhhcHB5CisJIGZpICYmCisJIGRldGVjdGVkPWBjYXQgZGV0ZWN0ZWRgICYmCisJIGRldGVjdGVkPWBleHByICIkZGV0ZWN0ZWQiIDogImZhdGFsLiphdCBsaW5lIFxcKFswLTldKlxcKVwkImAgJiYKKwkgZGV0ZWN0ZWQ9YHNlZCAtbmUgIiR7ZGV0ZWN0ZWR9cCIgYnJva2VuYCAmJgorCSB0ZXN0ICIkZGV0ZWN0ZWQiID0geENJVCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgZGV0ZWN0aW5nIGNvcnJ1cHQgcGF0Y2ggY29ycmVjdGx5JyBcCisJJ2dpdC1kaWZmIC0tYmluYXJ5IHwgc2VkIC1lICdzLy1DSVQveENJVC8nID5icm9rZW4gJiYKKwkgaWYgZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgYnJva2VuIDI+ZGV0ZWN0ZWQKKwkgdGhlbgorCQllY2hvIHVuaGFwcHkgLSBzaG91bGQgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvcgorCQkoZXhpdCAxKQorCSBlbHNlCisJCWVjaG8gaGFwcHkKKwkgZmkgJiYKKwkgZGV0ZWN0ZWQ9YGNhdCBkZXRlY3RlZGAgJiYKKwkgZGV0ZWN0ZWQ9YGV4cHIgIiRkZXRlY3RlZCIgOiAiZmF0YWwuKmF0IGxpbmUgXFwoWzAtOV0qXFwpXCQiYCAmJgorCSBkZXRlY3RlZD1gc2VkIC1uZSAiJHtkZXRlY3RlZH1wIiBicm9rZW5gICYmCisJIHRlc3QgIiRkZXRlY3RlZCIgPSB4Q0lUJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsIGNvbW1pdCcgJ2dpdC1jb21taXQgLWEgLW0gaW5pdGlhbCcKKworIyBUcnkgcmVtb3ZhbCAoYiksIG1vZGlmaWNhdGlvbiAoZCksIGFuZCBjcmVhdGlvbiAoZSkuCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaWZmLWluZGV4IHdpdGggLS1iaW5hcnknIFwKKwknZWNobyBBSVQgPmEgJiYgbXYgYiBlICYmIGVjaG8gQ0lUID5jICYmIGNhdCBlID5kICYmCisJIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgYSBiIGMgZCBlICYmCisJIHRyZWUwPWBnaXQtd3JpdGUtdHJlZWAgJiYKKwkgZ2l0LWRpZmYgLS1jYWNoZWQgLS1iaW5hcnkgPmN1cnJlbnQgJiYKKwkgZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgYmluYXJ5IHBhdGNoJyBcCisJJ2dpdC1yZXNldCAtLWhhcmQgJiYKKwkgZ2l0LWFwcGx5IC0tYmluYXJ5IC0taW5kZXggPGN1cnJlbnQgJiYKKwkgdHJlZTE9YGdpdC13cml0ZS10cmVlYCAmJgorCSB0ZXN0ICIkdHJlZTEiID0gIiR0cmVlMCInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwMC1hcHBseS1zdGF0LnNoIGIvdC90NDEwMC1hcHBseS1zdGF0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1NzlmMDYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwLWFwcGx5LXN0YXQuc2gKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSB0ZXN0LgorCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlbmFtZScgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0xLnBhdGNoID5jdXJyZW50ICYmCisgICAgZGlmZiAtdSAuLi90NDEwMC90LWFwcGx5LTEuZXhwZWN0IGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb3B5JyBcCisgICAgJ2dpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IDwuLi90NDEwMC90LWFwcGx5LTIucGF0Y2ggPmN1cnJlbnQgJiYKKyAgICBkaWZmIC11IC4uL3Q0MTAwL3QtYXBwbHktMi5leHBlY3QgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Jld3JpdGUnIFwKKyAgICAnZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPC4uL3Q0MTAwL3QtYXBwbHktMy5wYXRjaCA+Y3VycmVudCAmJgorICAgIGRpZmYgLXUgLi4vdDQxMDAvdC1hcHBseS0zLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbW9kZScgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS00LnBhdGNoID5jdXJyZW50ICYmCisgICAgZGlmZiAtdSAuLi90NDEwMC90LWFwcGx5LTQuZXhwZWN0IGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdub24gZ2l0JyBcCisgICAgJ2dpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IDwuLi90NDEwMC90LWFwcGx5LTUucGF0Y2ggPmN1cnJlbnQgJiYKKyAgICBkaWZmIC11IC4uL3Q0MTAwL3QtYXBwbHktNS5leHBlY3QgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ25vbiBnaXQnIFwKKyAgICAnZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPC4uL3Q0MTAwL3QtYXBwbHktNi5wYXRjaCA+Y3VycmVudCAmJgorICAgIGRpZmYgLXUgLi4vdDQxMDAvdC1hcHBseS02LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS03LnBhdGNoID5jdXJyZW50ICYmCisgICAgZGlmZiAtdSAuLi90NDEwMC90LWFwcGx5LTcuZXhwZWN0IGN1cnJlbnQnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktMS5leHBlY3QgYi90L3Q0MTAwL3QtYXBwbHktMS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwZTY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS0xLmV4cGVjdApAQCAtMCwwICsxLDExIEBACisgRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0IHwgICAxMiArKysrKystLS0tLS0KKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQgfCAgIDEwICsrKysrLS0tLS0KKyBEb2N1bWVudGF0aW9uL2dpdC50eHQgICAgICAgICAgfCAgICA2ICsrKy0tLQorIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKysrLS0tCisgc3NoLXB1bGwuYyAgICAgICAgICAgICAgICAgICAgIHwgICAgNCArKy0tCisgc3NoLXB1c2guYyAgICAgICAgICAgICAgICAgICAgIHwgICAxNCArKysrKysrLS0tLS0tLQorIDYgZmlsZXMgY2hhbmdlZCwgMjYgaW5zZXJ0aW9ucygrKSwgMjYgZGVsZXRpb25zKC0pCisgcmVuYW1lIERvY3VtZW50YXRpb24ve2dpdC1ycHVsbC50eHQgPT4gZ2l0LXNzaC1wdWxsLnR4dH0gKDkwJSkKKyByZW5hbWUgRG9jdW1lbnRhdGlvbi97Z2l0LXJwdXNoLnR4dCA9PiBnaXQtc3NoLXB1c2gudHh0fSAoNzElKQorIHJlbmFtZSBycHVsbC5jID0+IHNzaC1wdWxsLmMgKDk3JSkKKyByZW5hbWUgcnB1c2guYyA9PiBzc2gtcHVzaC5jICg5MyUpCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktMS5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS0xLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTg3NTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktMS5wYXRjaApAQCAtMCwwICsxLDE5NCBAQAorNDE4YWFmODQ3YThiM2ZmZmZiNGY3NzdhMmRkNTI2MmNhNWNlMGVmNyAoZnJvbSBkYzkzODQxNzE1ZGZhOWE5Y2RkYTZmMmM0YTI1ZWVjODMxZWE3YWEwKQorZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dAorc2ltaWxhcml0eSBpbmRleCA5MCUKK3JlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1bGwudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKK0BAIC0xLDIxICsxLDIxIEBACistZ2l0LXJwdWxsKDEpCistPT09PT09PT09PT09CisrZ2l0LXNzaC1wdWxsKDEpCisrPT09PT09PT09PT09PT09CisgdjAuMSwgTWF5IDIwMDUKKyAKKyBOQU1FCisgLS0tLQorLWdpdC1ycHVsbCAtIFB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCisrZ2l0LXNzaC1wdWxsIC0gUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKyAKKyAKKyAKKyBTWU5PUFNJUworIC0tLS0tLS0tCistJ2dpdC1ycHVsbCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwKKysnZ2l0LXNzaC1wdWxsJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorIAorIERFU0NSSVBUSU9OCisgLS0tLS0tLS0tLS0KKy1QdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbiwgaW52b2tpbmcgZ2l0LXJwdXNoIG9uCistdGhlIG90aGVyIGVuZC4KKytQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbiwgaW52b2tpbmcgZ2l0LXNzaC1wdXNoCisrb24gdGhlIG90aGVyIGVuZC4KKyAKKyBPUFRJT05TCisgLS0tLS0tLQorZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdXNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dAorc2ltaWxhcml0eSBpbmRleCA3MSUKK3JlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZ2l0LXJwdXNoLnR4dAorcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKK0BAIC0xLDE5ICsxLDE5IEBACistZ2l0LXJwdXNoKDEpCistPT09PT09PT09PT09CisrZ2l0LXNzaC1wdXNoKDEpCisrPT09PT09PT09PT09PT09CisgdjAuMSwgTWF5IDIwMDUKKyAKKyBOQU1FCisgLS0tLQorLWdpdC1ycHVzaCAtIEhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwKKytnaXQtc3NoLXB1c2ggLSBIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXNzaC1wdWxsCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtcnB1c2gnCisrJ2dpdC1zc2gtcHVzaCcKKyAKKyBERVNDUklQVElPTgorIC0tLS0tLS0tLS0tCistSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1ycHVsbC4KKytIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXNzaC1wdWxsLgorIAorIAorIEF1dGhvcgorZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC50eHQKK0BAIC0xNDgsNyArMTQ4LDcgQEAgbGluazpnaXQtcmVzb2x2ZS1zY3JpcHQuaHRtbFtnaXQtcmVzb2x2ZQorIGxpbms6Z2l0LXRhZy1zY3JpcHQuaHRtbFtnaXQtdGFnLXNjcmlwdF06OgorIAlBbiBleGFtcGxlIHNjcmlwdCB0byBjcmVhdGUgYSB0YWcgb2JqZWN0IHNpZ25lZCB3aXRoIEdQRworIAorLWxpbms6Z2l0LXJwdWxsLmh0bWxbZ2l0LXJwdWxsXTo6CisrbGluazpnaXQtc3NoLXB1bGwuaHRtbFtnaXQtc3NoLXB1bGxdOjoKKyAJUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKyAKKyBJbnRlcm9nYXRvcnM6CitAQCAtMTU2LDggKzE1Niw4IEBAIEludGVyb2dhdG9yczoKKyBsaW5rOmdpdC1kaWZmLWhlbHBlci5odG1sW2dpdC1kaWZmLWhlbHBlcl06OgorIAlHZW5lcmF0ZXMgcGF0Y2ggZm9ybWF0IG91dHB1dCBmb3IgZ2l0LWRpZmYtKgorIAorLWxpbms6Z2l0LXJwdXNoLmh0bWxbZ2l0LXJwdXNoXTo6CistCUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwKKytsaW5rOmdpdC1zc2gtcHVzaC5odG1sW2dpdC1zc2gtcHVzaF06OgorKwlIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXNzaC1wdWxsCisgCisgCisgCitkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQorLS0tIGEvTWFrZWZpbGUKKysrKyBiL01ha2VmaWxlCitAQCAtMzAsNyArMzAsNyBAQCBQUk9HPSAgIGdpdC11cGRhdGUtY2FjaGUgZ2l0LWRpZmYtZmlsZXMgCisgCWdpdC1jaGVja291dC1jYWNoZSBnaXQtZGlmZi10cmVlIGdpdC1yZXYtdHJlZSBnaXQtbHMtZmlsZXMgXAorIAlnaXQtY2hlY2stZmlsZXMgZ2l0LWxzLXRyZWUgZ2l0LW1lcmdlLWJhc2UgZ2l0LW1lcmdlLWNhY2hlIFwKKyAJZ2l0LXVucGFjay1maWxlIGdpdC1leHBvcnQgZ2l0LWRpZmYtY2FjaGUgZ2l0LWNvbnZlcnQtY2FjaGUgXAorLQlnaXQtaHR0cC1wdWxsIGdpdC1ycHVzaCBnaXQtcnB1bGwgZ2l0LXJldi1saXN0IGdpdC1ta3RhZyBcCisrCWdpdC1odHRwLXB1bGwgZ2l0LXNzaC1wdXNoIGdpdC1zc2gtcHVsbCBnaXQtcmV2LWxpc3QgZ2l0LW1rdGFnIFwKKyAJZ2l0LWRpZmYtaGVscGVyIGdpdC10YXItdHJlZSBnaXQtbG9jYWwtcHVsbCBnaXQtd3JpdGUtYmxvYiBcCisgCWdpdC1nZXQtdGFyLWNvbW1pdC1pZCBnaXQtbWtkZWx0YSBnaXQtYXBwbHkgZ2l0LXN0cmlwc3BhY2UKKyAKK0BAIC0xMDUsOCArMTA1LDggQEAgZ2l0LWRpZmYtY2FjaGU6IGRpZmYtY2FjaGUuYworIGdpdC1jb252ZXJ0LWNhY2hlOiBjb252ZXJ0LWNhY2hlLmMKKyBnaXQtaHR0cC1wdWxsOiBodHRwLXB1bGwuYyBwdWxsLmMKKyBnaXQtbG9jYWwtcHVsbDogbG9jYWwtcHVsbC5jIHB1bGwuYworLWdpdC1ycHVzaDogcnNoLmMKKy1naXQtcnB1bGw6IHJzaC5jIHB1bGwuYworK2dpdC1zc2gtcHVzaDogcnNoLmMKKytnaXQtc3NoLXB1bGw6IHJzaC5jIHB1bGwuYworIGdpdC1yZXYtbGlzdDogcmV2LWxpc3QuYworIGdpdC1ta3RhZzogbWt0YWcuYworIGdpdC1kaWZmLWhlbHBlcjogZGlmZi1oZWxwZXIuYworZGlmZiAtLWdpdCBhL3JwdWxsLmMgYi9zc2gtcHVsbC5jCitzaW1pbGFyaXR5IGluZGV4IDk3JQorcmVuYW1lIGZyb20gcnB1bGwuYworcmVuYW1lIHRvIHNzaC1wdWxsLmMKKy0tLSBhL3JwdWxsLmMKKysrKyBiL3NzaC1wdWxsLmMKK0BAIC02NCwxMyArNjQsMTMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIAkJYXJnKys7CisgCX0KKyAJaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CistCQl1c2FnZSgiZ2l0LXJwdWxsIFstY10gWy10XSBbLWFdIFstdl0gWy1kXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsIik7CisrCQl1c2FnZSgiZ2l0LXNzaC1wdWxsIFstY10gWy10XSBbLWFdIFstdl0gWy1kXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsIik7CisgCQlyZXR1cm4gMTsKKyAJfQorIAljb21taXRfaWQgPSBhcmd2W2FyZ107CisgCXVybCA9IGFyZ3ZbYXJnICsgMV07CisgCistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVzaCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVzaCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisgCQlyZXR1cm4gMTsKKyAKKyAJaWYgKGdldF92ZXJzaW9uKCkpCitkaWZmIC0tZ2l0IGEvcnB1c2guYyBiL3NzaC1wdXNoLmMKK3NpbWlsYXJpdHkgaW5kZXggOTMlCityZW5hbWUgZnJvbSBycHVzaC5jCityZW5hbWUgdG8gc3NoLXB1c2guYworLS0tIGEvcnB1c2guYworKysrIGIvc3NoLXB1c2guYworQEAgLTE2LDcgKzE2LDcgQEAgaW50IHNlcnZlX29iamVjdChpbnQgZmRfaW4sIGludCBmZF9vdXQpIAorIAlkbyB7CisgCQlzaXplID0gcmVhZChmZF9pbiwgc2hhMSArIHBvc24sIDIwIC0gcG9zbik7CisgCQlpZiAoc2l6ZSA8IDApIHsKKy0JCQlwZXJyb3IoImdpdC1ycHVzaDogcmVhZCAiKTsKKysJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogcmVhZCAiKTsKKyAJCQlyZXR1cm4gLTE7CisgCQl9CisgCQlpZiAoIXNpemUpCitAQCAtMzAsNyArMzAsNyBAQCBpbnQgc2VydmVfb2JqZWN0KGludCBmZF9pbiwgaW50IGZkX291dCkgCisgCWJ1ZiA9IG1hcF9zaGExX2ZpbGUoc2hhMSwgJm9ianNpemUpOworIAkKKyAJaWYgKCFidWYpIHsKKy0JCWZwcmludGYoc3RkZXJyLCAiZ2l0LXJwdXNoOiBjb3VsZCBub3QgZmluZCAlc1xuIiwgCisrCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1zc2gtcHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorIAkJCXNoYTFfdG9faGV4KHNoYTEpKTsKKyAJCXJlbW90ZSA9IC0xOworIAl9CitAQCAtNDUsOSArNDUsOSBAQCBpbnQgc2VydmVfb2JqZWN0KGludCBmZF9pbiwgaW50IGZkX291dCkgCisgCQlzaXplID0gd3JpdGUoZmRfb3V0LCBidWYgKyBwb3NuLCBvYmpzaXplIC0gcG9zbik7CisgCQlpZiAoc2l6ZSA8PSAwKSB7CisgCQkJaWYgKCFzaXplKSB7CistCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXJwdXNoOiB3cml0ZSBjbG9zZWQiKTsKKysJCQkJZnByaW50ZihzdGRlcnIsICJnaXQtc3NoLXB1c2g6IHdyaXRlIGNsb3NlZCIpOworIAkJCX0gZWxzZSB7CistCQkJCXBlcnJvcigiZ2l0LXJwdXNoOiB3cml0ZSAiKTsKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHdyaXRlICIpOworIAkJCX0KKyAJCQlyZXR1cm4gLTE7CisgCQl9CitAQCAtNzEsNyArNzEsNyBAQCB2b2lkIHNlcnZpY2UoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CisgCQlyZXR2YWwgPSByZWFkKGZkX2luLCAmdHlwZSwgMSk7CisgCQlpZiAocmV0dmFsIDwgMSkgeworIAkJCWlmIChyZXR2YWwgPCAwKQorLQkJCQlwZXJyb3IoInJwdXNoOiByZWFkICIpOworKwkJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogcmVhZCAiKTsKKyAJCQlyZXR1cm47CisgCQl9CisgCQlpZiAodHlwZSA9PSAndicgJiYgc2VydmVfdmVyc2lvbihmZF9pbiwgZmRfb3V0KSkKK0BAIC05MSwxMiArOTEsMTIgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorICAgICAgICAgICAgICAgICBhcmcrKzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChhcmdjIDwgYXJnICsgMikgeworLQkJdXNhZ2UoImdpdC1ycHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CisrCQl1c2FnZSgiZ2l0LXNzaC1wdXNoIFstY10gWy10XSBbLWFdIGNvbW1pdC1pZCB1cmwiKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKyAJdXJsID0gYXJndlthcmcgKyAxXTsKKy0JaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXJwdWxsIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKysJaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXNzaC1wdWxsIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKyAJCXJldHVybiAxOworIAorIAlzZXJ2aWNlKGZkX2luLCBmZF9vdXQpOwpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTIuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTIuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTY0NTkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktMi5leHBlY3QKQEAgLTAsMCArMSw1IEBACisgTWFrZWZpbGUgICAgICAgICB8ICAgIDIgKy0KKyBnaXQtZmV0Y2gtc2NyaXB0IHwgICAgNSAtLS0tLQorIGdpdC1wdWxsLXNjcmlwdCAgfCAgIDM0ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMzkgZGVsZXRpb25zKC0pCisgY29weSBnaXQtcHVsbC1zY3JpcHQgPT4gZ2l0LWZldGNoLXNjcmlwdCAoODclKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTIucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktMi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmRjODA4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTIucGF0Y2gKQEAgLTAsMCArMSw3MiBAQAorN2VmNzY5MjVkOWMxOWVmNzQ4NzRlMTczNWUyNDM2ZTU2ZDBjNDg5NyAoZnJvbSA2YjE0ZDdmYWYwYmFkMDI2YTgxYTI3YmFjMDdiNDc2OTFmNjIxYjhmKQorZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKKy0tLSBhL01ha2VmaWxlCisrKysgYi9NYWtlZmlsZQorQEAgLTIwLDcgKzIwLDcgQEAgSU5TVEFMTD1pbnN0YWxsCisgCisgU0NSSVBUUz1naXQtYXBwbHktcGF0Y2gtc2NyaXB0IGdpdC1tZXJnZS1vbmUtZmlsZS1zY3JpcHQgZ2l0LXBydW5lLXNjcmlwdCBcCisgCWdpdC1wdWxsLXNjcmlwdCBnaXQtdGFnLXNjcmlwdCBnaXQtcmVzb2x2ZS1zY3JpcHQgZ2l0LXdoYXRjaGFuZ2VkIFwKKy0JZ2l0LWRlbHRhZnktc2NyaXB0CisrCWdpdC1kZWx0YWZ5LXNjcmlwdCBnaXQtZmV0Y2gtc2NyaXB0CisgCisgUFJPRz0gICBnaXQtdXBkYXRlLWNhY2hlIGdpdC1kaWZmLWZpbGVzIGdpdC1pbml0LWRiIGdpdC13cml0ZS10cmVlIFwKKyAJZ2l0LXJlYWQtdHJlZSBnaXQtY29tbWl0LXRyZWUgZ2l0LWNhdC1maWxlIGdpdC1mc2NrLWNhY2hlIFwKK2RpZmYgLS1naXQgYS9naXQtcHVsbC1zY3JpcHQgYi9naXQtZmV0Y2gtc2NyaXB0CitzaW1pbGFyaXR5IGluZGV4IDg3JQorY29weSBmcm9tIGdpdC1wdWxsLXNjcmlwdAorY29weSB0byBnaXQtZmV0Y2gtc2NyaXB0CistLS0gYS9naXQtcHVsbC1zY3JpcHQKKysrKyBiL2dpdC1mZXRjaC1zY3JpcHQKK0BAIC0zOSw4ICszOSwzIEBAIGRvd25sb2FkX29uZSAiJG1lcmdlX3JlcG8vJG1lcmdlX25hbWUiICIKKyAKKyBlY2hvICJHZXR0aW5nIG9iamVjdCBkYXRhYmFzZSIKKyBkb3dubG9hZF9vYmplY3RzICIkbWVyZ2VfcmVwbyIgIiQoY2F0ICIkR0lUX0RJUiIvTUVSR0VfSEVBRCkiCistCistZ2l0LXJlc29sdmUtc2NyaXB0IFwKKy0JIiQoY2F0ICIkR0lUX0RJUiIvSEVBRCkiIFwKKy0JIiQoY2F0ICIkR0lUX0RJUiIvTUVSR0VfSEVBRCkiIFwKKy0JIiRtZXJnZV9yZXBvIgorZGlmZiAtLWdpdCBhL2dpdC1wdWxsLXNjcmlwdCBiL2dpdC1wdWxsLXNjcmlwdAorLS0tIGEvZ2l0LXB1bGwtc2NyaXB0CisrKysgYi9naXQtcHVsbC1zY3JpcHQKK0BAIC02LDM5ICs2LDcgQEAgbWVyZ2VfbmFtZT0kezI6LUhFQUR9CisgOiAke0dJVF9ESVI9LmdpdH0KKyA6ICR7R0lUX09CSkVDVF9ESVJFQ1RPUlk9IiR7U0hBMV9GSUxFX0RJUkVDVE9SWS0iJEdJVF9ESVIvb2JqZWN0cyJ9In0KKyAKKy1kb3dubG9hZF9vbmUgKCkgeworLQkjIHJlbW90ZV9wYXRoPSIkMSIgbG9jYWxfZmlsZT0iJDIiCistCWNhc2UgIiQxIiBpbgorLQlodHRwOi8vKikKKy0JCXdnZXQgLXEgLU8gIiQyIiAiJDEiIDs7CistCS8qKQorLQkJdGVzdCAtZiAiJDEiICYmIGNhdCA+IiQyIiAiJDEiIDs7CistCSopCistCQlyc3luYyAtTCAiJDEiICIkMiIgOzsKKy0JZXNhYworLX0KKy0KKy1kb3dubG9hZF9vYmplY3RzICgpIHsKKy0JIyByZW1vdGVfcmVwbz0iJDEiIGhlYWRfc2hhMT0iJDIiCistCWNhc2UgIiQxIiBpbgorLQlodHRwOi8vKikKKy0JCWdpdC1odHRwLXB1bGwgLWEgIiQyIiAiJDEvIgorLQkJOzsKKy0JLyopCistCQlnaXQtbG9jYWwtcHVsbCAtbCAtYSAiJDIiICIkMS8iCistCQk7OworLQkqKQorLQkJcnN5bmMgLWF2eiAtLWlnbm9yZS1leGlzdGluZyBcCistCQkJIiQxL29iamVjdHMvLiIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIvLgorLQkJOzsKKy0JZXNhYworLX0KKy0KKy1lY2hvICJHZXR0aW5nIHJlbW90ZSAkbWVyZ2VfbmFtZSIKKy1kb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiJEdJVF9ESVIiL01FUkdFX0hFQUQKKy0KKy1lY2hvICJHZXR0aW5nIG9iamVjdCBkYXRhYmFzZSIKKy1kb3dubG9hZF9vYmplY3RzICIkbWVyZ2VfcmVwbyIgIiQoY2F0ICIkR0lUX0RJUiIvTUVSR0VfSEVBRCkiCisrZ2l0LWZldGNoLXNjcmlwdCAiJG1lcmdlX3JlcG8iICIkbWVyZ2VfbmFtZSIKKyAKKyBnaXQtcmVzb2x2ZS1zY3JpcHQgXAorIAkiJChjYXQgIiRHSVRfRElSIi9IRUFEKSIgXApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTMuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTMuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMmE1NTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktMy5leHBlY3QKQEAgLTAsMCArMSw3IEBACisgRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQgfCAgIDIwICstCisgbHMtdHJlZS5jICAgICAgICAgICAgICAgICAgICAgfCAgNDU5ICsrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tCisgdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoICAgfCAgICAzIAorIHRyZWUuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiAKKyB0cmVlLmggICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgCisgNSBmaWxlcyBjaGFuZ2VkLCAyNjIgaW5zZXJ0aW9ucygrKSwgMjIzIGRlbGV0aW9ucygtKQorIHJld3JpdGUgbHMtdHJlZS5jICg4MiUpCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktMy5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS0zLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2RiYWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktMy5wYXRjaApAQCAtMCwwICsxLDU2NyBAQAorNmFmMWYwMTkyZmY4NzQwZmU3N2RiN2NmMDJjNzM5Y2NmYmRmMTE5YyAoZnJvbSAyYmMyNTY0MTQ1ODM1OTk2NzM0ZDZlZDVkMTg4MGY4NWIxNzIzM2Q2KQorZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorQEAgLTQsMjMgKzQsMjYgQEAgdjAuMSwgTWF5IDIwMDUKKyAKKyBOQU1FCisgLS0tLQorLWdpdC1scy10cmVlIC0gRGlzcGxheXMgYSB0cmVlIG9iamVjdCBpbiBodW1hbiByZWFkYWJsZSBmb3JtCisrZ2l0LWxzLXRyZWUgLSBMaXN0cyB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdC4KKyAKKyAKKyBTWU5PUFNJUworIC0tLS0tLS0tCistJ2dpdC1scy10cmVlJyBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisrJ2dpdC1scy10cmVlJyBbLWRdIFstcl0gWy16XSA8dHJlZS1pc2g+IFtwYXRocy4uLl0KKyAKKyBERVNDUklQVElPTgorIC0tLS0tLS0tLS0tCistQ29udmVydHMgdGhlIHRyZWUgb2JqZWN0IHRvIGEgaHVtYW4gcmVhZGFibGUgKGFuZCBzY3JpcHQgcHJvY2Vzc2FibGUpCistZm9ybS4KKytMaXN0cyB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdCwgbGlrZSB3aGF0ICIvYmluL2xzIC1hIiBkb2VzCisraW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgCisgT1BUSU9OUworIC0tLS0tLS0KKyA8dHJlZS1pc2g+OjoKKyAJSWQgb2YgYSB0cmVlLgorIAorKy1kOjoKKysJc2hvdyBvbmx5IHRoZSBuYW1lZCB0cmVlIGVudHJ5IGl0c2VsZiwgbm90IGl0cyBjaGlsZHJlbgorKworIC1yOjoKKyAJcmVjdXJzZSBpbnRvIHN1Yi10cmVlcworIAorQEAgLTI4LDE4ICszMSwxOSBAQCBPUFRJT05TCisgCVwwIGxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0CisgCisgcGF0aHM6OgorLQlPcHRpb25hbGx5LCByZXN0cmljdCB0aGUgb3V0cHV0IG9mIGdpdC1scy10cmVlIHRvIHNwZWNpZmljCistCXBhdGhzLiBEaXJlY3RvcmllcyB3aWxsIG9ubHkgbGlzdCB0aGVpciB0cmVlIGJsb2IgaWRzLgorLQlJbXBsaWVzIC1yLgorKwlXaGVuIHBhdGhzIGFyZSBnaXZlbiwgc2hvd3MgdGhlbS4gIE90aGVyd2lzZSBpbXBsaWNpdGx5CisrCXVzZXMgdGhlIHJvb3QgbGV2ZWwgb2YgdGhlIHRyZWUgYXMgdGhlIHNvbGUgcGF0aCBhcmd1bWVudC4KKysKKyAKKyBPdXRwdXQgRm9ybWF0CisgLS0tLS0tLS0tLS0tLQorLSAgICAgICAgPG1vZGU+XHQJPHR5cGU+XHQJPG9iamVjdD5cdAk8ZmlsZT4KKysgICAgICAgIDxtb2RlPiBTUCA8dHlwZT4gU1AgPG9iamVjdD4gVEFCIDxmaWxlPgorIAorIAorIEF1dGhvcgorIC0tLS0tLQorIFdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorK0NvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gc2NyYXRjaCBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisgCisgRG9jdW1lbnRhdGlvbgorIC0tLS0tLS0tLS0tLS0tCitkaWZmIC0tZ2l0IGEvbHMtdHJlZS5jIGIvbHMtdHJlZS5jCitkaXNzaW1pbGFyaXR5IGluZGV4IDgyJQorLS0tIGxzLXRyZWUuYworKysrIGxzLXRyZWUuYworQEAgLTEsMjEyICsxLDI0NyBAQAorLS8qCistICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCistICoKKy0gKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CistICovCistI2luY2x1ZGUgImNhY2hlLmgiCistCistc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKy1zdGF0aWMgaW50IHJlY3Vyc2l2ZSA9IDA7CistCistc3RydWN0IHBhdGhfcHJlZml4IHsKKy0Jc3RydWN0IHBhdGhfcHJlZml4ICpwcmV2OworLQljb25zdCBjaGFyICpuYW1lOworLX07CistCistI2RlZmluZSBERUJVRyhmbXQsIC4uLikJCistCistc3RhdGljIGludCBzdHJpbmdfcGF0aF9wcmVmaXgoY2hhciAqYnVmZiwgc2l6ZV90IGJsZW4sIHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorLXsKKy0JaW50IGxlbiA9IDA7CistCWlmIChwcmVmaXgpIHsKKy0JCWlmIChwcmVmaXgtPnByZXYpIHsKKy0JCQlsZW4gPSBzdHJpbmdfcGF0aF9wcmVmaXgoYnVmZixibGVuLHByZWZpeC0+cHJldik7CistCQkJYnVmZiArPSBsZW47CistCQkJYmxlbiAtPSBsZW47CistCQkJaWYgKGJsZW4gPiAwKSB7CistCQkJCSpidWZmID0gJy8nOworLQkJCQlsZW4rKzsKKy0JCQkJYnVmZisrOworLQkJCQlibGVuLS07CistCQkJfQorLQkJfQorLQkJc3RybmNweShidWZmLHByZWZpeC0+bmFtZSxibGVuKTsKKy0JCXJldHVybiBsZW4gKyBzdHJsZW4ocHJlZml4LT5uYW1lKTsKKy0JfQorLQorLQlyZXR1cm4gMDsKKy19CistCistc3RhdGljIHZvaWQgcHJpbnRfcGF0aF9wcmVmaXgoc3RydWN0IHBhdGhfcHJlZml4ICpwcmVmaXgpCisteworLQlpZiAocHJlZml4KSB7CistCQlpZiAocHJlZml4LT5wcmV2KSB7CistCQkJcHJpbnRfcGF0aF9wcmVmaXgocHJlZml4LT5wcmV2KTsKKy0JCQlwdXRjaGFyKCcvJyk7CistCQl9CistCQlmcHV0cyhwcmVmaXgtPm5hbWUsIHN0ZG91dCk7CistCX0KKy19CistCistLyoKKy0gKiByZXR1cm46CistICogCS0xIGlmIHByZWZpeCBpcyAqbm90KiBhIHN1YnNldCBvZiBwYXRoCistICogCSAwIGlmIHByZWZpeCA9PSBwYXRoCistICogCSAxIGlmIHByZWZpeCBpcyBhIHN1YnNldCBvZiBwYXRoCistICovCistc3RhdGljIGludCBwYXRoY21wKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorLXsKKy0JY2hhciBidWZmW1BBVEhfTUFYXTsKKy0JaW50IGxlbixzbGVuOworLQorLQlpZiAocHJlZml4ID09IE5VTEwpCistCQlyZXR1cm4gMTsKKy0KKy0JbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsIHNpemVvZiBidWZmLCBwcmVmaXgpOworLQlzbGVuID0gc3RybGVuKHBhdGgpOworLQorLQlpZiAoc2xlbiA8IGxlbikKKy0JCXJldHVybiAtMTsKKy0KKy0JaWYgKHN0cm5jbXAocGF0aCxidWZmLGxlbikgPT0gMCkgeworLQkJaWYgKHNsZW4gPT0gbGVuKQorLQkJCXJldHVybiAwOworLQkJZWxzZQorLQkJCXJldHVybiAxOworLQl9CistCistCXJldHVybiAtMTsKKy19CQorLQorLS8qCistICogbWF0Y2ggbWF5IGJlIE5VTEwsIG9yIGEgKnNvcnRlZCogbGlzdCBvZiBwYXRocworLSAqLworLXN0YXRpYyB2b2lkIGxpc3RfcmVjdXJzaXZlKHZvaWQgKmJ1ZmZlciwKKy0JCQkgICBjb25zdCBjaGFyICp0eXBlLAorLQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKy0JCQkgICBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCwKKy0JCQkgICBjaGFyICoqbWF0Y2gsIGludCBtYXRjaGVzKQorLXsKKy0Jc3RydWN0IHBhdGhfcHJlZml4IHRoaXNfcHJlZml4OworLQl0aGlzX3ByZWZpeC5wcmV2ID0gcHJlZml4OworLQorLQlpZiAoc3RyY21wKHR5cGUsICJ0cmVlIikpCistCQlkaWUoImV4cGVjdGVkIGEgJ3RyZWUnIG5vZGUiKTsKKy0KKy0JaWYgKG1hdGNoZXMpCistCQlyZWN1cnNpdmUgPSAxOworLQorLQl3aGlsZSAoc2l6ZSkgeworLQkJaW50IG5hbWVsZW4gPSBzdHJsZW4oYnVmZmVyKSsxOworLQkJdm9pZCAqZWx0YnVmID0gTlVMTDsKKy0JCWNoYXIgZWx0dHlwZVsyMF07CistCQl1bnNpZ25lZCBsb25nIGVsdHNpemU7CistCQl1bnNpZ25lZCBjaGFyICpzaGExID0gYnVmZmVyICsgbmFtZWxlbjsKKy0JCWNoYXIgKnBhdGggPSBzdHJjaHIoYnVmZmVyLCAnICcpICsgMTsKKy0JCXVuc2lnbmVkIGludCBtb2RlOworLQkJY29uc3QgY2hhciAqbWF0Y2hlZCA9IE5VTEw7CistCQlpbnQgbXR5cGUgPSAtMTsKKy0JCWludCBtaW5kZXg7CistCistCQlpZiAoc2l6ZSA8IG5hbWVsZW4gKyAyMCB8fCBzc2NhbmYoYnVmZmVyLCAiJW8iLCAmbW9kZSkgIT0gMSkKKy0JCQlkaWUoImNvcnJ1cHQgJ3RyZWUnIGZpbGUiKTsKKy0JCWJ1ZmZlciA9IHNoYTEgKyAyMDsKKy0JCXNpemUgLT0gbmFtZWxlbiArIDIwOworLQorLQkJdGhpc19wcmVmaXgubmFtZSA9IHBhdGg7CistCQlmb3IgKCBtaW5kZXggPSAwOyBtaW5kZXggPCBtYXRjaGVzOyBtaW5kZXgrKykgeworLQkJCW10eXBlID0gcGF0aGNtcChtYXRjaFttaW5kZXhdLCZ0aGlzX3ByZWZpeCk7CistCQkJaWYgKG10eXBlID49IDApIHsKKy0JCQkJbWF0Y2hlZCA9IG1hdGNoW21pbmRleF07CistCQkJCWJyZWFrOworLQkJCX0KKy0JCX0KKy0KKy0JCS8qCistCQkgKiBJZiB3ZSdyZSBub3QgbWF0Y2hpbmcsIG9yIGlmIHRoaXMgaXMgYW4gZXhhY3QgbWF0Y2gsCistCQkgKiBwcmludCBvdXQgdGhlIGluZm8KKy0JCSAqLworLQkJaWYgKCFtYXRjaGVzIHx8IChtYXRjaGVkICE9IE5VTEwgJiYgbXR5cGUgPT0gMCkpIHsKKy0JCQlwcmludGYoIiUwNm8gJXMgJXNcdCIsIG1vZGUsCistCQkJICAgICAgIFNfSVNESVIobW9kZSkgPyAidHJlZSIgOiAiYmxvYiIsCistCQkJICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQlwcmludF9wYXRoX3ByZWZpeCgmdGhpc19wcmVmaXgpOworLQkJCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CistCQl9CistCistCQlpZiAoISByZWN1cnNpdmUgfHwgISBTX0lTRElSKG1vZGUpKQorLQkJCWNvbnRpbnVlOworLQorLQkJaWYgKG1hdGNoZXMgJiYgISBtYXRjaGVkKQorLQkJCWNvbnRpbnVlOworLQorLQkJaWYgKCEgKGVsdGJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIGVsdHR5cGUsICZlbHRzaXplKSkgKSB7CistCQkJZXJyb3IoImNhbm5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworLQkJCWNvbnRpbnVlOworLQkJfQorLQorLQkJLyogSWYgdGhpcyBpcyBhbiBleGFjdCBkaXJlY3RvcnkgbWF0Y2gsIHdlIG1heSBoYXZlCistCQkgKiBkaXJlY3RvcnkgZmlsZXMgZm9sbG93aW5nIHRoaXMgcGF0aC4gTWF0Y2ggb24gdGhlbS4KKy0JCSAqIE90aGVyd2lzZSwgd2UncmUgYXQgYSBwYWNoIHN1YmNvbXBvbmVudCwgYW5kIHdlIG5lZWQKKy0JCSAqIHRvIHRyeSB0byBtYXRjaCBhZ2Fpbi4KKy0JCSAqLworLQkJaWYgKG10eXBlID09IDApCistCQkJbWluZGV4Kys7CistCistCQlsaXN0X3JlY3Vyc2l2ZShlbHRidWYsIGVsdHR5cGUsIGVsdHNpemUsICZ0aGlzX3ByZWZpeCwgJm1hdGNoW21pbmRleF0sIG1hdGNoZXMtbWluZGV4KTsKKy0JCWZyZWUoZWx0YnVmKTsKKy0JfQorLX0KKy0KKy1zdGF0aWMgaW50IHFjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKKy17CistCXJldHVybiBzdHJjbXAoKihjaGFyICoqKWEsICooY2hhciAqKiliKTsKKy19CistCistc3RhdGljIGludCBsaXN0KHVuc2lnbmVkIGNoYXIgKnNoYTEsY2hhciAqKnBhdGgpCisteworLQl2b2lkICpidWZmZXI7CistCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKy0JaW50IG5wYXRoczsKKy0KKy0JZm9yIChucGF0aHMgPSAwOyBwYXRoW25wYXRoc10gIT0gTlVMTDsgbnBhdGhzKyspCistCQk7CistCistCXFzb3J0KHBhdGgsbnBhdGhzLHNpemVvZihjaGFyICopLHFjbXApOworLQorLQlidWZmZXIgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCAidHJlZSIsICZzaXplLCBOVUxMKTsKKy0JaWYgKCFidWZmZXIpCistCQlkaWUoInVuYWJsZSB0byByZWFkIHNoYTEgZmlsZSIpOworLQlsaXN0X3JlY3Vyc2l2ZShidWZmZXIsICJ0cmVlIiwgc2l6ZSwgTlVMTCwgcGF0aCwgbnBhdGhzKTsKKy0JZnJlZShidWZmZXIpOworLQlyZXR1cm4gMDsKKy19CistCistc3RhdGljIGNvbnN0IGNoYXIgKmxzX3RyZWVfdXNhZ2UgPSAiZ2l0LWxzLXRyZWUgWy1yXSBbLXpdIDxrZXk+IFtwYXRocy4uLl0iOworLQorLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKy17CistCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CistCistCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworLQkJc3dpdGNoIChhcmd2WzFdWzFdKSB7CistCQljYXNlICd6JzoKKy0JCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKy0JCQlicmVhazsKKy0JCWNhc2UgJ3InOgorLQkJCXJlY3Vyc2l2ZSA9IDE7CistCQkJYnJlYWs7CistCQlkZWZhdWx0OgorLQkJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworLQkJfQorLQkJYXJnYy0tOyBhcmd2Kys7CistCX0KKy0KKy0JaWYgKGFyZ2MgPCAyKQorLQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CistCWlmIChnZXRfc2hhMShhcmd2WzFdLCBzaGExKSA8IDApCistCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKy0JaWYgKGxpc3Qoc2hhMSwgJmFyZ3ZbMl0pIDwgMCkKKy0JCWRpZSgibGlzdCBmYWlsZWQiKTsKKy0JcmV0dXJuIDA7CistfQorKy8qCisrICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisrICoKKysgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisrICovCisrI2luY2x1ZGUgImNhY2hlLmgiCisrI2luY2x1ZGUgImJsb2IuaCIKKysjaW5jbHVkZSAidHJlZS5oIgorKworK3N0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CisrI2RlZmluZSBMU19SRUNVUlNJVkUgMQorKyNkZWZpbmUgTFNfVFJFRV9PTkxZIDIKKytzdGF0aWMgaW50IGxzX29wdGlvbnMgPSAwOworKworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0IHJvb3RfZW50cnk7CisrCisrc3RhdGljIHZvaWQgcHJlcGFyZV9yb290KHVuc2lnbmVkIGNoYXIgKnNoYTEpCisreworKwl1bnNpZ25lZCBjaGFyIHJzaGFbMjBdOworKwl1bnNpZ25lZCBsb25nIHNpemU7CisrCXZvaWQgKmJ1ZjsKKysJc3RydWN0IHRyZWUgKnJvb3RfdHJlZTsKKysKKysJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgcnNoYSk7CisrCWZyZWUoYnVmKTsKKysJaWYgKCFidWYpCisrCQlkaWUoIkNvdWxkIG5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworKworKwlyb290X3RyZWUgPSBsb29rdXBfdHJlZShyc2hhKTsKKysJaWYgKCFyb290X3RyZWUpCisrCQlkaWUoIkNvdWxkIG5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworKworKwkvKiBQcmVwYXJlIGEgZmFrZSBlbnRyeSAqLworKwlyb290X2VudHJ5LmRpcmVjdG9yeSA9IDE7CisrCXJvb3RfZW50cnkuZXhlY3V0YWJsZSA9IHJvb3RfZW50cnkuc3ltbGluayA9IDA7CisrCXJvb3RfZW50cnkubW9kZSA9IFNfSUZESVI7CisrCXJvb3RfZW50cnkubmFtZSA9ICIiOworKwlyb290X2VudHJ5Lml0ZW0udHJlZSA9IHJvb3RfdHJlZTsKKysJcm9vdF9lbnRyeS5wYXJlbnQgPSBOVUxMOworK30KKysKKytzdGF0aWMgaW50IHByZXBhcmVfY2hpbGRyZW4oc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZWxlbSkKKyt7CisrCWlmICghZWxlbS0+ZGlyZWN0b3J5KQorKwkJcmV0dXJuIC0xOworKwlpZiAoIWVsZW0tPml0ZW0udHJlZS0+b2JqZWN0LnBhcnNlZCkgeworKwkJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZTsKKysJCWlmIChwYXJzZV90cmVlKGVsZW0tPml0ZW0udHJlZSkpCisrCQkJcmV0dXJuIC0xOworKwkJLyogU2V0IHVwIHRoZSBwYXJlbnQgbGluayAqLworKwkJZm9yIChlID0gZWxlbS0+aXRlbS50cmVlLT5lbnRyaWVzOyBlOyBlID0gZS0+bmV4dCkKKysJCQllLT5wYXJlbnQgPSBlbGVtOworKwl9CisrCXJldHVybiAwOworK30KKysKKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZmluZF9lbnRyeV8wKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmVsZW0sCisrCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aCwKKysJCQkJCSAgICBjb25zdCBjaGFyICpwYXRoX2VuZCkKKyt7CisrCWNvbnN0IGNoYXIgKmVwOworKwlpbnQgbGVuOworKworKwl3aGlsZSAocGF0aCA8IHBhdGhfZW5kKSB7CisrCQlpZiAocHJlcGFyZV9jaGlsZHJlbihlbGVtKSkKKysJCQlyZXR1cm4gTlVMTDsKKysKKysJCS8qIEluIGVsZW0tPnRyZWUtPmVudHJpZXMsIGZpbmQgdGhlIG9uZSB0aGF0IGhhcyBuYW1lCisrCQkgKiB0aGF0IG1hdGNoZXMgd2hhdCBpcyBiZXR3ZWVuIHBhdGggYW5kIGVwLgorKwkJICovCisrCQllbGVtID0gZWxlbS0+aXRlbS50cmVlLT5lbnRyaWVzOworKworKwkJZXAgPSBzdHJjaHIocGF0aCwgJy8nKTsKKysJCWlmICghZXAgfHwgcGF0aF9lbmQgPD0gZXApCisrCQkJZXAgPSBwYXRoX2VuZDsKKysJCWxlbiA9IGVwIC0gcGF0aDsKKysKKysJCXdoaWxlIChlbGVtKSB7CisrCQkJaWYgKChzdHJsZW4oZWxlbS0+bmFtZSkgPT0gbGVuKSAmJgorKwkJCSAgICAhc3RybmNtcChlbGVtLT5uYW1lLCBwYXRoLCBsZW4pKQorKwkJCQlicmVhazsKKysJCQllbGVtID0gZWxlbS0+bmV4dDsKKysJCX0KKysJCWlmIChwYXRoX2VuZCA8PSBlcCB8fCAhZWxlbSkKKysJCQlyZXR1cm4gZWxlbTsKKysJCXdoaWxlICgqZXAgPT0gJy8nICYmIGVwIDwgcGF0aF9lbmQpCisrCQkJZXArKzsKKysJCXBhdGggPSBlcDsKKysJfQorKwlyZXR1cm4gTlVMTDsKKyt9CisrCisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmZpbmRfZW50cnkoY29uc3QgY2hhciAqcGF0aCwKKysJCQkJCSAgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwkvKiBGaW5kIHRyZWUgZWxlbWVudCwgZGVzY2VuZGluZyBmcm9tIHJvb3QsIHRoYXQKKysJICogY29ycmVzcG9uZHMgdG8gdGhlIG5hbWVkIHBhdGgsIGxhemlseSBleHBhbmRpbmcKKysJICogdGhlIHRyZWUgaWYgcG9zc2libGUuCisrCSAqLworKwlpZiAocGF0aCA9PSBwYXRoX2VuZCkgeworKwkJLyogU3BlY2lhbC4gIFRoaXMgaXMgdGhlIHJvb3QgbGV2ZWwgKi8KKysJCXJldHVybiAmcm9vdF9lbnRyeTsKKysJfQorKwlyZXR1cm4gZmluZF9lbnRyeV8wKCZyb290X2VudHJ5LCBwYXRoLCBwYXRoX2VuZCk7CisrfQorKworK3N0YXRpYyB2b2lkIHNob3dfZW50cnlfbmFtZShzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplKQorK3sKKysJLyogVGhpcyBpcyB5dWNreS4gIFRoZSByb290IGxldmVsIGlzIHRoZXJlIGZvcgorKwkgKiBvdXIgY29udmVuaWVuY2UgYnV0IHdlIHJlYWxseSB3YW50IHRvIGRvIGEKKysJICogZm9yZXN0LgorKwkgKi8KKysJaWYgKGUtPnBhcmVudCAmJiBlLT5wYXJlbnQgIT0gJnJvb3RfZW50cnkpIHsKKysJCXNob3dfZW50cnlfbmFtZShlLT5wYXJlbnQpOworKwkJcHV0Y2hhcignLycpOworKwl9CisrCXByaW50ZigiJXMiLCBlLT5uYW1lKTsKKyt9CisrCisrc3RhdGljIGNvbnN0IGNoYXIgKmVudHJ5X3R5cGUoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiAoZS0+ZGlyZWN0b3J5ID8gInRyZWUiIDogImJsb2IiKTsKKyt9CisrCisrc3RhdGljIGNvbnN0IGNoYXIgKmVudHJ5X2hleChzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplKQorK3sKKysJcmV0dXJuIHNoYTFfdG9faGV4KGUtPmRpcmVjdG9yeQorKwkJCSAgID8gZS0+aXRlbS50cmVlLT5vYmplY3Quc2hhMQorKwkJCSAgIDogZS0+aXRlbS5ibG9iLT5vYmplY3Quc2hhMSk7CisrfQorKworKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIG11dHVhbGx5IHJlY3Vyc2l2ZSByb3V0aW5lcyAqLworK3N0YXRpYyBpbnQgc2hvd19lbnRyeShzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICosIGludCk7CisrCisrc3RhdGljIGludCBzaG93X2NoaWxkcmVuKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWlmIChwcmVwYXJlX2NoaWxkcmVuKGUpKQorKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogbHMtdHJlZSBzaG93X2NoaWxkcmVuIGNhbGxlZCB3aXRoIG5vbiB0cmVlIik7CisrCWUgPSBlLT5pdGVtLnRyZWUtPmVudHJpZXM7CisrCXdoaWxlIChlKSB7CisrCQlzaG93X2VudHJ5KGUsIGxldmVsKTsKKysJCWUgPSBlLT5uZXh0OworKwl9CisrCXJldHVybiAwOworK30KKysKKytzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSwgaW50IGxldmVsKQorK3sKKysJaW50IGVyciA9IDA7IAorKworKwlpZiAoZSAhPSAmcm9vdF9lbnRyeSkgeworKwkJcHJpbnRmKCIlMDZvICVzICVzCSIsIGUtPm1vZGUsIGVudHJ5X3R5cGUoZSksCisrCQkgICAgICAgZW50cnlfaGV4KGUpKTsKKysJCXNob3dfZW50cnlfbmFtZShlKTsKKysJCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CisrCX0KKysKKysJaWYgKGUtPmRpcmVjdG9yeSkgeworKwkJLyogSWYgdGhpcyBpcyBhIGRpcmVjdG9yeSwgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIGNhc2VzOgorKwkJICogKDEpIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCByZXF1ZXN0IChleHBsaWNpdCBwYXRoIGZyb20gdGhlCisrCQkgKiAgICAgY29tbWFuZCBsaW5lLCBvciAicm9vdCIgaWYgdGhlcmUgaXMgbm8gY29tbWFuZCBsaW5lKS4KKysJCSAqICBhLiBXaXRob3V0IGFueSBmbGFnLiAgV2Ugc2hvdyBkaXJlY3QgY2hpbGRyZW4uICBXZSBkbyBub3QgCisrCQkgKiAgICAgcmVjdXJzZSBpbnRvIHRoZW0uCisrCQkgKiAgYi4gV2l0aCAtci4gIFdlIGRvIHJlY3Vyc2UgaW50byBjaGlsZHJlbi4KKysJCSAqICBjLiBXaXRoIC1kLiAgV2UgZG8gbm90IHJlY3Vyc2UgaW50byBjaGlsZHJlbi4KKysJCSAqICgyKSBXZSBjYW1lIGhlcmUgYmVjYXVzZSBvdXIgY2FsbGVyIGlzIGVpdGhlciAoMS1hKSBvcgorKwkJICogICAgICgxLWIpLgorKwkJICogIGEuIFdpdGhvdXQgYW55IGZsYWcuICBXZSBkbyBub3Qgc2hvdyBvdXIgY2hpbGRyZW4gKHdoaWNoCisrCQkgKiAgICAgYXJlIGdyYW5kY2hpbGRyZW4gZm9yIHRoZSBvcmlnaW5hbCByZXF1ZXN0KS4KKysJCSAqICBiLiBXaXRoIC1yLiAgV2UgY29udGludWUgdG8gcmVjdXJzZSBpbnRvIG91ciBjaGlsZHJlbi4KKysJCSAqICBjLiBXaXRoIC1kLiAgV2Ugc2hvdWxkIG5vdCBoYXZlIGNvbWUgaGVyZSB0byBiZWdpbiB3aXRoLgorKwkJICovCisrCQlpZiAobGV2ZWwgPT0gMCAmJiAhKGxzX29wdGlvbnMgJiBMU19UUkVFX09OTFkpKQorKwkJCS8qIGNhc2UgKDEpLWEgYW5kICgxKS1iICovCisrCQkJZXJyID0gZXJyIHwgc2hvd19jaGlsZHJlbihlLCBsZXZlbCsxKTsKKysJCWVsc2UgaWYgKGxldmVsICYmIGxzX29wdGlvbnMgJiBMU19SRUNVUlNJVkUpCisrCQkJLyogY2FzZSAoMiktYiAqLworKwkJCWVyciA9IGVyciB8IHNob3dfY2hpbGRyZW4oZSwgbGV2ZWwrMSk7CisrCX0KKysJcmV0dXJuIGVycjsKKyt9CisrCisrc3RhdGljIGludCBsaXN0X29uZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwYXRoX2VuZCkKKyt7CisrCWludCBlcnIgPSAwOworKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplID0gZmluZF9lbnRyeShwYXRoLCBwYXRoX2VuZCk7CisrCWlmICghZSkgeworKwkJLyogdHJhZGl0aW9uYWxseSBscy10cmVlIGRvZXMgbm90IGNvbXBsYWluIGFib3V0CisrCQkgKiBtaXNzaW5nIHBhdGguICBXZSBtYXkgY2hhbmdlIHRoaXMgbGF0ZXIgdG8gbWF0Y2gKKysJCSAqIHdoYXQgIi9iaW4vbHMgLWEiIGRvZXMsIHdoaWNoIGlzIHRvIGNvbXBsYWluLgorKwkJICovCisrCQlyZXR1cm4gZXJyOworKwl9CisrCWVyciA9IGVyciB8IHNob3dfZW50cnkoZSwgMCk7CisrCXJldHVybiBlcnI7CisrfQorKworK3N0YXRpYyBpbnQgbGlzdChjaGFyICoqcGF0aCkKKyt7CisrCWludCBpOworKwlpbnQgZXJyID0gMDsKKysJZm9yIChpID0gMDsgcGF0aFtpXTsgaSsrKSB7CisrCQlpbnQgbGVuID0gc3RybGVuKHBhdGhbaV0pOworKwkJd2hpbGUgKDAgPD0gbGVuICYmIHBhdGhbaV1bbGVuXSA9PSAnLycpCisrCQkJbGVuLS07CisrCQllcnIgPSBlcnIgfCBsaXN0X29uZShwYXRoW2ldLCBwYXRoW2ldICsgbGVuKTsKKysJfQorKwlyZXR1cm4gZXJyOworK30KKysKKytzdGF0aWMgY29uc3QgY2hhciAqbHNfdHJlZV91c2FnZSA9CisrCSJnaXQtbHMtdHJlZSBbLWRdIFstcl0gWy16XSA8dHJlZS1pc2g+IFtwYXRoLi4uXSI7CisrCisraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorK3sKKysJc3RhdGljIGNoYXIgKnBhdGgwW10gPSB7ICIiLCBOVUxMIH07CisrCWNoYXIgKipwYXRoOworKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworKworKwl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKysJCXN3aXRjaCAoYXJndlsxXVsxXSkgeworKwkJY2FzZSAneic6CisrCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CisrCQkJYnJlYWs7CisrCQljYXNlICdyJzoKKysJCQlsc19vcHRpb25zIHw9IExTX1JFQ1VSU0lWRTsKKysJCQlicmVhazsKKysJCWNhc2UgJ2QnOgorKwkJCWxzX29wdGlvbnMgfD0gTFNfVFJFRV9PTkxZOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKysJCX0KKysJCWFyZ2MtLTsgYXJndisrOworKwl9CisrCisrCWlmIChhcmdjIDwgMikKKysJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworKwlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkgPCAwKQorKwkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisrCisrCXBhdGggPSAoYXJnYyA9PSAyKSA/IHBhdGgwIDogKGFyZ3YgKyAyKTsKKysJcHJlcGFyZV9yb290KHNoYTEpOworKwlpZiAobGlzdChwYXRoKSA8IDApCisrCQlkaWUoImxpc3QgZmFpbGVkIik7CisrCXJldHVybiAwOworK30KK2RpZmYgLS1naXQgYS90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2ggYi90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKKy0tLSBhL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorKysrIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCitAQCAtNzQsOCArNzQsOCBAQCB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAgJ2xzLXRyZWUgZmlsdGVyZWQnIFwKKyAgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGgxIHBhdGgwID5jdXJyZW50ICYmCisgICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorLTEwMDY0NCBibG9iIFgJcGF0aDAKKyAxMjAwMDAgYmxvYiBYCXBhdGgxCisrMTAwNjQ0IGJsb2IgWAlwYXRoMAorIEVPRgorICAgICAgdGVzdF9vdXRwdXQnCisgCitAQCAtODUsNyArODUsNiBAQCB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisgMDQwMDAwIHRyZWUgWAlwYXRoMgorIDA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CistMTAwNjQ0IGJsb2IgWAlwYXRoMi9iYXovYgorIDEyMDAwMCBibG9iIFgJcGF0aDIvYmF6Ym8KKyAxMDA2NDQgYmxvYiBYCXBhdGgyL2ZvbworIEVPRgorZGlmZiAtLWdpdCBhL3RyZWUuYyBiL3RyZWUuYworLS0tIGEvdHJlZS5jCisrKysgYi90cmVlLmMKK0BAIC0xMzMsNyArMTMzLDcgQEAgaW50IHBhcnNlX3RyZWVfYnVmZmVyKHN0cnVjdCB0cmVlICppdGVtLAorIAkJfQorIAkJaWYgKG9iaikKKyAJCQlhZGRfcmVmKCZpdGVtLT5vYmplY3QsIG9iaik7CistCisrCQllbnRyeS0+cGFyZW50ID0gTlVMTDsgLyogbmVlZHMgdG8gYmUgZmlsbGVkIGJ5IHRoZSB1c2VyICovCisgCQkqbGlzdF9wID0gZW50cnk7CisgCQlsaXN0X3AgPSAmZW50cnktPm5leHQ7CisgCX0KK2RpZmYgLS1naXQgYS90cmVlLmggYi90cmVlLmgKKy0tLSBhL3RyZWUuaAorKysrIGIvdHJlZS5oCitAQCAtMTYsNiArMTYsNyBAQCBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0IHsKKyAJCXN0cnVjdCB0cmVlICp0cmVlOworIAkJc3RydWN0IGJsb2IgKmJsb2I7CisgCX0gaXRlbTsKKysJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqcGFyZW50OworIH07CisgCisgc3RydWN0IHRyZWUgewpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTQuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTQuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzAyOGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNC5leHBlY3QKQEAgLTAsMCArMSw1IEBACisgdC90MDAwMC1iYXNpYy5zaCB8ICAgIDAgCisgdC90ZXN0LWxpYi5zaCAgICB8ICAgIDAgCisgMiBmaWxlcyBjaGFuZ2VkLCAwIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgbW9kZSBjaGFuZ2UgMTAwNjQ0ID0+IDEwMDc1NSB0L3QwMDAwLWJhc2ljLnNoCisgbW9kZSBjaGFuZ2UgMTAwNjQ0ID0+IDEwMDc1NSB0L3Rlc3QtbGliLnNoCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNC5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS00LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTZhYjUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNC5wYXRjaApAQCAtMCwwICsxLDcgQEAKK2NlZWRlNTllYTkwY2ViYWQ1MmJhOWM4MjYzZmVmM2ZiNmVmMTc1OTMgKGZyb20gMzY4Zjk5ZDU3ZThlZDE3MjQzZjJlMTY0NDMxNDQ5ZDQ4YmZjYTJmYikKK2RpZmYgLS1naXQgYS90L3QwMDAwLWJhc2ljLnNoIGIvdC90MDAwMC1iYXNpYy5zaAorb2xkIG1vZGUgMTAwNjQ0CituZXcgbW9kZSAxMDA3NTUKK2RpZmYgLS1naXQgYS90L3Rlc3QtbGliLnNoIGIvdC90ZXN0LWxpYi5zaAorb2xkIG1vZGUgMTAwNjQ0CituZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS01LmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS01LmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg3ZGYxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTUuZXhwZWN0CkBAIC0wLDAgKzEsMTkgQEAKKyBEb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQgICAgfCAgIDUwIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyBEb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQgICAgfCAgIDMwIC0tLS0tLS0tLS0tLQorIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dCB8ICAgNTAgKysrKysrKysrKysrKysrKysrKworIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dCB8ICAgMzAgKysrKysrKysrKysrCisgRG9jdW1lbnRhdGlvbi9naXQudHh0ICAgICAgICAgIHwgICAgNiArLQorIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKy0KKyBycHVsbC5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDgzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgcnB1c2guYyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEwNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgc3NoLXB1bGwuYyAgICAgICAgICAgICAgICAgICAgIHwgICA4MyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIHNzaC1wdXNoLmMgICAgICAgICAgICAgICAgICAgICB8ICAxMDQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIDEwIGZpbGVzIGNoYW5nZWQsIDI3MyBpbnNlcnRpb25zKCspLCAyNzMgZGVsZXRpb25zKC0pCisgZGVsZXRlIERvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorIGRlbGV0ZSBEb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKKyBjcmVhdGUgRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CisgY3JlYXRlIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dAorIGRlbGV0ZSBycHVsbC5jCisgZGVsZXRlIHJwdXNoLmMKKyBjcmVhdGUgc3NoLXB1bGwuYworIGNyZWF0ZSBzc2gtcHVzaC5jCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNS5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS01LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTE2MjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNS5wYXRjaApAQCAtMCwwICsxLDYxMiBAQAorZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1bGwudHh0CisrKysgL2Rldi9udWxsCitAQCAtMSw1MCArMCwwIEBACistZ2l0LXJwdWxsKDEpCistPT09PT09PT09PT09CistdjAuMSwgTWF5IDIwMDUKKy0KKy1OQU1FCistLS0tLQorLWdpdC1ycHVsbCAtIFB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCistCistCistCistU1lOT1BTSVMKKy0tLS0tLS0tLQorLSdnaXQtcnB1bGwnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsCistCistREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tLQorLVB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uLCBpbnZva2luZyBnaXQtcnB1c2ggb24KKy10aGUgb3RoZXIgZW5kLgorLQorLU9QVElPTlMKKy0tLS0tLS0tCistLWM6OgorLQlHZXQgdGhlIGNvbW1pdCBvYmplY3RzLgorLS10OjoKKy0JR2V0IHRyZWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWl0IG9iamVjdHMuCistLWE6OgorLQlHZXQgYWxsIHRoZSBvYmplY3RzLgorLS1kOjoKKy0JRG8gbm90IGNoZWNrIGZvciBkZWx0YSBiYXNlIG9iamVjdHMgKHVzZSB0aGlzIG9wdGlvbgorLQlvbmx5IHdoZW4geW91IGtub3cgdGhlIHJlbW90ZSByZXBvc2l0b3J5IGlzIG5vdAorLQlkZWx0aWZpZWQpLgorLS0tcmVjb3Zlcjo6CistCUNoZWNrIGRlcGVuZGVuY3kgb2YgZGVsdGlmaWVkIG9iamVjdCBtb3JlIGNhcmVmdWxseSB0aGFuCistCXVzdWFsLCB0byByZWNvdmVyIGFmdGVyIGVhcmxpZXIgcHVsbCB0aGF0IHdhcyBpbnRlcnJ1cHRlZC4KKy0tdjo6CistCVJlcG9ydCB3aGF0IGlzIGRvd25sb2FkZWQuCistCistCistQXV0aG9yCistLS0tLS0tCistV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CistCistRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tCistRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKy0KKy1HSVQKKy0tLS0KKy1QYXJ0IG9mIHRoZSBsaW5rOmdpdC5odG1sW2dpdF0gc3VpdGUKKy0KK2RpZmYgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdXNoLnR4dAorKysrIC9kZXYvbnVsbAorQEAgLTEsMzAgKzAsMCBAQAorLWdpdC1ycHVzaCgxKQorLT09PT09PT09PT09PQorLXYwLjEsIE1heSAyMDA1CistCistTkFNRQorLS0tLS0KKy1naXQtcnB1c2ggLSBIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsCistCistCistU1lOT1BTSVMKKy0tLS0tLS0tLQorLSdnaXQtcnB1c2gnCistCistREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tLQorLUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwuCistCistCistQXV0aG9yCistLS0tLS0tCistV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CistCistRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tCistRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKy0KKy1HSVQKKy0tLS0KKy1QYXJ0IG9mIHRoZSBsaW5rOmdpdC5odG1sW2dpdF0gc3VpdGUKKy0KK2RpZmYgYS9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKKy0tLSAvZGV2L251bGwKKysrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dAorQEAgLTAsMCArMSw1MCBAQAorK2dpdC1zc2gtcHVsbCgxKQorKz09PT09PT09PT09PT09PQorK3YwLjEsIE1heSAyMDA1CisrCisrTkFNRQorKy0tLS0KKytnaXQtc3NoLXB1bGwgLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorKworKworKworK1NZTk9QU0lTCisrLS0tLS0tLS0KKysnZ2l0LXNzaC1wdWxsJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorKworK0RFU0NSSVBUSU9OCisrLS0tLS0tLS0tLS0KKytQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbiwgaW52b2tpbmcgZ2l0LXNzaC1wdXNoCisrb24gdGhlIG90aGVyIGVuZC4KKysKKytPUFRJT05TCisrLS0tLS0tLQorKy1jOjoKKysJR2V0IHRoZSBjb21taXQgb2JqZWN0cy4KKystdDo6CisrCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorKy1hOjoKKysJR2V0IGFsbCB0aGUgb2JqZWN0cy4KKystZDo6CisrCURvIG5vdCBjaGVjayBmb3IgZGVsdGEgYmFzZSBvYmplY3RzICh1c2UgdGhpcyBvcHRpb24KKysJb25seSB3aGVuIHlvdSBrbm93IHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpcyBub3QKKysJZGVsdGlmaWVkKS4KKystLXJlY292ZXI6OgorKwlDaGVjayBkZXBlbmRlbmN5IG9mIGRlbHRpZmllZCBvYmplY3QgbW9yZSBjYXJlZnVsbHkgdGhhbgorKwl1c3VhbCwgdG8gcmVjb3ZlciBhZnRlciBlYXJsaWVyIHB1bGwgdGhhdCB3YXMgaW50ZXJydXB0ZWQuCisrLXY6OgorKwlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorKworKworK0F1dGhvcgorKy0tLS0tLQorK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorKworK0RvY3VtZW50YXRpb24KKystLS0tLS0tLS0tLS0tLQorK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisrCisrR0lUCisrLS0tCisrUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCisrCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CistLS0gL2Rldi9udWxsCisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKK0BAIC0wLDAgKzEsMzAgQEAKKytnaXQtc3NoLXB1c2goMSkKKys9PT09PT09PT09PT09PT0KKyt2MC4xLCBNYXkgMjAwNQorKworK05BTUUKKystLS0tCisrZ2l0LXNzaC1wdXNoIC0gSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbAorKworKworK1NZTk9QU0lTCisrLS0tLS0tLS0KKysnZ2l0LXNzaC1wdXNoJworKworK0RFU0NSSVBUSU9OCisrLS0tLS0tLS0tLS0KKytIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXNzaC1wdWxsLgorKworKworK0F1dGhvcgorKy0tLS0tLQorK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorKworK0RvY3VtZW50YXRpb24KKystLS0tLS0tLS0tLS0tLQorK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisrCisrR0lUCisrLS0tCisrUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCisrCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC50eHQKKysrKyBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorQEAgLTE0OCw3ICsxNDgsNyBAQCBsaW5rOmdpdC1yZXNvbHZlLXNjcmlwdC5odG1sW2dpdC1yZXNvbHZlCisgbGluazpnaXQtdGFnLXNjcmlwdC5odG1sW2dpdC10YWctc2NyaXB0XTo6CisgCUFuIGV4YW1wbGUgc2NyaXB0IHRvIGNyZWF0ZSBhIHRhZyBvYmplY3Qgc2lnbmVkIHdpdGggR1BHCisgCistbGluazpnaXQtcnB1bGwuaHRtbFtnaXQtcnB1bGxdOjoKKytsaW5rOmdpdC1zc2gtcHVsbC5odG1sW2dpdC1zc2gtcHVsbF06OgorIAlQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorIAorIEludGVyb2dhdG9yczoKK0BAIC0xNTYsOCArMTU2LDggQEAgSW50ZXJvZ2F0b3JzOgorIGxpbms6Z2l0LWRpZmYtaGVscGVyLmh0bWxbZ2l0LWRpZmYtaGVscGVyXTo6CisgCUdlbmVyYXRlcyBwYXRjaCBmb3JtYXQgb3V0cHV0IGZvciBnaXQtZGlmZi0qCisgCistbGluazpnaXQtcnB1c2guaHRtbFtnaXQtcnB1c2hdOjoKKy0JSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1ycHVsbAorK2xpbms6Z2l0LXNzaC1wdXNoLmh0bWxbZ2l0LXNzaC1wdXNoXTo6CisrCUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLXB1bGwKKyAKKyAKKyAKK2RpZmYgYS9NYWtlZmlsZSBiL01ha2VmaWxlCistLS0gYS9NYWtlZmlsZQorKysrIGIvTWFrZWZpbGUKK0BAIC0zMCw3ICszMCw3IEBAIFBST0c9ICAgZ2l0LXVwZGF0ZS1jYWNoZSBnaXQtZGlmZi1maWxlcyAKKyAJZ2l0LWNoZWNrb3V0LWNhY2hlIGdpdC1kaWZmLXRyZWUgZ2l0LXJldi10cmVlIGdpdC1scy1maWxlcyBcCisgCWdpdC1jaGVjay1maWxlcyBnaXQtbHMtdHJlZSBnaXQtbWVyZ2UtYmFzZSBnaXQtbWVyZ2UtY2FjaGUgXAorIAlnaXQtdW5wYWNrLWZpbGUgZ2l0LWV4cG9ydCBnaXQtZGlmZi1jYWNoZSBnaXQtY29udmVydC1jYWNoZSBcCistCWdpdC1odHRwLXB1bGwgZ2l0LXJwdXNoIGdpdC1ycHVsbCBnaXQtcmV2LWxpc3QgZ2l0LW1rdGFnIFwKKysJZ2l0LWh0dHAtcHVsbCBnaXQtc3NoLXB1c2ggZ2l0LXNzaC1wdWxsIGdpdC1yZXYtbGlzdCBnaXQtbWt0YWcgXAorIAlnaXQtZGlmZi1oZWxwZXIgZ2l0LXRhci10cmVlIGdpdC1sb2NhbC1wdWxsIGdpdC13cml0ZS1ibG9iIFwKKyAJZ2l0LWdldC10YXItY29tbWl0LWlkIGdpdC1ta2RlbHRhIGdpdC1hcHBseSBnaXQtc3RyaXBzcGFjZQorIAorQEAgLTEwNSw4ICsxMDUsOCBAQCBnaXQtZGlmZi1jYWNoZTogZGlmZi1jYWNoZS5jCisgZ2l0LWNvbnZlcnQtY2FjaGU6IGNvbnZlcnQtY2FjaGUuYworIGdpdC1odHRwLXB1bGw6IGh0dHAtcHVsbC5jIHB1bGwuYworIGdpdC1sb2NhbC1wdWxsOiBsb2NhbC1wdWxsLmMgcHVsbC5jCistZ2l0LXJwdXNoOiByc2guYworLWdpdC1ycHVsbDogcnNoLmMgcHVsbC5jCisrZ2l0LXNzaC1wdXNoOiByc2guYworK2dpdC1zc2gtcHVsbDogcnNoLmMgcHVsbC5jCisgZ2l0LXJldi1saXN0OiByZXYtbGlzdC5jCisgZ2l0LW1rdGFnOiBta3RhZy5jCisgZ2l0LWRpZmYtaGVscGVyOiBkaWZmLWhlbHBlci5jCitkaWZmIGEvcnB1bGwuYyBiL3JwdWxsLmMKKy0tLSBhL3JwdWxsLmMKKysrKyAvZGV2L251bGwKK0BAIC0xLDgzICswLDAgQEAKKy0jaW5jbHVkZSAiY2FjaGUuaCIKKy0jaW5jbHVkZSAiY29tbWl0LmgiCistI2luY2x1ZGUgInJzaC5oIgorLSNpbmNsdWRlICJwdWxsLmgiCistCistc3RhdGljIGludCBmZF9pbjsKKy1zdGF0aWMgaW50IGZkX291dDsKKy0KKy1zdGF0aWMgdW5zaWduZWQgY2hhciByZW1vdGVfdmVyc2lvbiA9IDA7Cistc3RhdGljIHVuc2lnbmVkIGNoYXIgbG9jYWxfdmVyc2lvbiA9IDE7CistCistaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCisteworLQlpbnQgcmV0OworLQlzaWduZWQgY2hhciByZW1vdGU7CistCWNoYXIgdHlwZSA9ICdvJzsKKy0JaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpCistCQlyZXR1cm4gMDsKKy0Jd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CistCXdyaXRlKGZkX291dCwgc2hhMSwgMjApOworLQlpZiAocmVhZChmZF9pbiwgJnJlbW90ZSwgMSkgPCAxKQorLQkJcmV0dXJuIC0xOworLQlpZiAocmVtb3RlIDwgMCkKKy0JCXJldHVybiByZW1vdGU7CistCXJldCA9IHdyaXRlX3NoYTFfZnJvbV9mZChzaGExLCBmZF9pbik7CistCWlmICghcmV0KQorLQkJcHVsbF9zYXkoImdvdCAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworLQlyZXR1cm4gcmV0OworLX0KKy0KKy1pbnQgZ2V0X3ZlcnNpb24odm9pZCkKKy17CistCWNoYXIgdHlwZSA9ICd2JzsKKy0Jd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CistCXdyaXRlKGZkX291dCwgJmxvY2FsX3ZlcnNpb24sIDEpOworLQlpZiAocmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpIHsKKy0JCXJldHVybiBlcnJvcigiQ291bGRuJ3QgcmVhZCB2ZXJzaW9uIGZyb20gcmVtb3RlIGVuZCIpOworLQl9CistCXJldHVybiAwOworLX0KKy0KKy1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisteworLQljaGFyICpjb21taXRfaWQ7CistCWNoYXIgKnVybDsKKy0JaW50IGFyZyA9IDE7CistCistCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKy0JCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CistCQkJZ2V0X3RyZWUgPSAxOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2MnKSB7CistCQkJZ2V0X2hpc3RvcnkgPSAxOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2QnKSB7CistCQkJZ2V0X2RlbHRhID0gMDsKKy0JCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworLQkJCWdldF9kZWx0YSA9IDI7CistCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKy0JCQlnZXRfYWxsID0gMTsKKy0JCQlnZXRfdHJlZSA9IDE7CistCQkJZ2V0X2hpc3RvcnkgPSAxOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3YnKSB7CistCQkJZ2V0X3ZlcmJvc2VseSA9IDE7CistCQl9CistCQlhcmcrKzsKKy0JfQorLQlpZiAoYXJnYyA8IGFyZyArIDIpIHsKKy0JCXVzYWdlKCJnaXQtcnB1bGwgWy1jXSBbLXRdIFstYV0gWy12XSBbLWRdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwiKTsKKy0JCXJldHVybiAxOworLQl9CistCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKy0JdXJsID0gYXJndlthcmcgKyAxXTsKKy0KKy0JaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXJwdXNoIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKy0JCXJldHVybiAxOworLQorLQlpZiAoZ2V0X3ZlcnNpb24oKSkKKy0JCXJldHVybiAxOworLQorLQlpZiAocHVsbChjb21taXRfaWQpKQorLQkJcmV0dXJuIDE7CistCistCXJldHVybiAwOworLX0KK2RpZmYgYS9ycHVzaC5jIGIvcnB1c2guYworLS0tIGEvcnB1c2guYworKysrIC9kZXYvbnVsbAorQEAgLTEsMTA0ICswLDAgQEAKKy0jaW5jbHVkZSAiY2FjaGUuaCIKKy0jaW5jbHVkZSAicnNoLmgiCistI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKy0jaW5jbHVkZSA8ZXJybm8uaD4KKy0KKy11bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworLXVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworLQorLWludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CistCXNzaXplX3Qgc2l6ZTsKKy0JaW50IHBvc24gPSAwOworLQljaGFyIHNoYTFbMjBdOworLQl1bnNpZ25lZCBsb25nIG9ianNpemU7CistCXZvaWQgKmJ1ZjsKKy0Jc2lnbmVkIGNoYXIgcmVtb3RlOworLQlkbyB7CistCQlzaXplID0gcmVhZChmZF9pbiwgc2hhMSArIHBvc24sIDIwIC0gcG9zbik7CistCQlpZiAoc2l6ZSA8IDApIHsKKy0JCQlwZXJyb3IoImdpdC1ycHVzaDogcmVhZCAiKTsKKy0JCQlyZXR1cm4gLTE7CistCQl9CistCQlpZiAoIXNpemUpCistCQkJcmV0dXJuIC0xOworLQkJcG9zbiArPSBzaXplOworLQl9IHdoaWxlIChwb3NuIDwgMjApOworLQkKKy0JLyogZnByaW50ZihzdGRlcnIsICJTZXJ2aW5nICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7ICovCistCXJlbW90ZSA9IDA7CistCQorLQlidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKy0JCistCWlmICghYnVmKSB7CistCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorLQkJCXNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCXJlbW90ZSA9IC0xOworLQl9CistCQorLQl3cml0ZShmZF9vdXQsICZyZW1vdGUsIDEpOworLQkKKy0JaWYgKHJlbW90ZSA8IDApCistCQlyZXR1cm4gMDsKKy0JCistCXBvc24gPSAwOworLQlkbyB7CistCQlzaXplID0gd3JpdGUoZmRfb3V0LCBidWYgKyBwb3NuLCBvYmpzaXplIC0gcG9zbik7CistCQlpZiAoc2l6ZSA8PSAwKSB7CistCQkJaWYgKCFzaXplKSB7CistCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXJwdXNoOiB3cml0ZSBjbG9zZWQiKTsKKy0JCQl9IGVsc2UgeworLQkJCQlwZXJyb3IoImdpdC1ycHVzaDogd3JpdGUgIik7CistCQkJfQorLQkJCXJldHVybiAtMTsKKy0JCX0KKy0JCXBvc24gKz0gc2l6ZTsKKy0JfSB3aGlsZSAocG9zbiA8IG9ianNpemUpOworLQlyZXR1cm4gMDsKKy19CistCistaW50IHNlcnZlX3ZlcnNpb24oaW50IGZkX2luLCBpbnQgZmRfb3V0KQorLXsKKy0JaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKQorLQkJcmV0dXJuIC0xOworLQl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKy0JcmV0dXJuIDA7CistfQorLQorLXZvaWQgc2VydmljZShpbnQgZmRfaW4sIGludCBmZF9vdXQpIHsKKy0JY2hhciB0eXBlOworLQlpbnQgcmV0dmFsOworLQlkbyB7CistCQlyZXR2YWwgPSByZWFkKGZkX2luLCAmdHlwZSwgMSk7CistCQlpZiAocmV0dmFsIDwgMSkgeworLQkJCWlmIChyZXR2YWwgPCAwKQorLQkJCQlwZXJyb3IoInJwdXNoOiByZWFkICIpOworLQkJCXJldHVybjsKKy0JCX0KKy0JCWlmICh0eXBlID09ICd2JyAmJiBzZXJ2ZV92ZXJzaW9uKGZkX2luLCBmZF9vdXQpKQorLQkJCXJldHVybjsKKy0JCWlmICh0eXBlID09ICdvJyAmJiBzZXJ2ZV9vYmplY3QoZmRfaW4sIGZkX291dCkpCistCQkJcmV0dXJuOworLQl9IHdoaWxlICgxKTsKKy19CistCistaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorLXsKKy0JaW50IGFyZyA9IDE7CistICAgICAgICBjaGFyICpjb21taXRfaWQ7CistICAgICAgICBjaGFyICp1cmw7CistCWludCBmZF9pbiwgZmRfb3V0OworLQl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CistICAgICAgICAgICAgICAgIGFyZysrOworLSAgICAgICAgfQorLSAgICAgICAgaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CistCQl1c2FnZSgiZ2l0LXJwdXNoIFstY10gWy10XSBbLWFdIGNvbW1pdC1pZCB1cmwiKTsKKy0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CistICAgICAgICB9CistCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKy0JdXJsID0gYXJndlthcmcgKyAxXTsKKy0JaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXJwdWxsIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKy0JCXJldHVybiAxOworLQorLQlzZXJ2aWNlKGZkX2luLCBmZF9vdXQpOworLQlyZXR1cm4gMDsKKy19CitkaWZmIGEvc3NoLXB1bGwuYyBiL3NzaC1wdWxsLmMKKy0tLSAvZGV2L251bGwKKysrKyBiL3NzaC1wdWxsLmMKK0BAIC0wLDAgKzEsODMgQEAKKysjaW5jbHVkZSAiY2FjaGUuaCIKKysjaW5jbHVkZSAiY29tbWl0LmgiCisrI2luY2x1ZGUgInJzaC5oIgorKyNpbmNsdWRlICJwdWxsLmgiCisrCisrc3RhdGljIGludCBmZF9pbjsKKytzdGF0aWMgaW50IGZkX291dDsKKysKKytzdGF0aWMgdW5zaWduZWQgY2hhciByZW1vdGVfdmVyc2lvbiA9IDA7Cisrc3RhdGljIHVuc2lnbmVkIGNoYXIgbG9jYWxfdmVyc2lvbiA9IDE7CisrCisraW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCisreworKwlpbnQgcmV0OworKwlzaWduZWQgY2hhciByZW1vdGU7CisrCWNoYXIgdHlwZSA9ICdvJzsKKysJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpCisrCQlyZXR1cm4gMDsKKysJd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CisrCXdyaXRlKGZkX291dCwgc2hhMSwgMjApOworKwlpZiAocmVhZChmZF9pbiwgJnJlbW90ZSwgMSkgPCAxKQorKwkJcmV0dXJuIC0xOworKwlpZiAocmVtb3RlIDwgMCkKKysJCXJldHVybiByZW1vdGU7CisrCXJldCA9IHdyaXRlX3NoYTFfZnJvbV9mZChzaGExLCBmZF9pbik7CisrCWlmICghcmV0KQorKwkJcHVsbF9zYXkoImdvdCAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworKwlyZXR1cm4gcmV0OworK30KKysKKytpbnQgZ2V0X3ZlcnNpb24odm9pZCkKKyt7CisrCWNoYXIgdHlwZSA9ICd2JzsKKysJd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CisrCXdyaXRlKGZkX291dCwgJmxvY2FsX3ZlcnNpb24sIDEpOworKwlpZiAocmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpIHsKKysJCXJldHVybiBlcnJvcigiQ291bGRuJ3QgcmVhZCB2ZXJzaW9uIGZyb20gcmVtb3RlIGVuZCIpOworKwl9CisrCXJldHVybiAwOworK30KKysKKytpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisreworKwljaGFyICpjb21taXRfaWQ7CisrCWNoYXIgKnVybDsKKysJaW50IGFyZyA9IDE7CisrCisrCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKysJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CisrCQkJZ2V0X3RyZWUgPSAxOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2MnKSB7CisrCQkJZ2V0X2hpc3RvcnkgPSAxOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2QnKSB7CisrCQkJZ2V0X2RlbHRhID0gMDsKKysJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworKwkJCWdldF9kZWx0YSA9IDI7CisrCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKysJCQlnZXRfYWxsID0gMTsKKysJCQlnZXRfdHJlZSA9IDE7CisrCQkJZ2V0X2hpc3RvcnkgPSAxOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3YnKSB7CisrCQkJZ2V0X3ZlcmJvc2VseSA9IDE7CisrCQl9CisrCQlhcmcrKzsKKysJfQorKwlpZiAoYXJnYyA8IGFyZyArIDIpIHsKKysJCXVzYWdlKCJnaXQtc3NoLXB1bGwgWy1jXSBbLXRdIFstYV0gWy12XSBbLWRdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwiKTsKKysJCXJldHVybiAxOworKwl9CisrCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKysJdXJsID0gYXJndlthcmcgKyAxXTsKKysKKysJaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXNzaC1wdXNoIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKysJCXJldHVybiAxOworKworKwlpZiAoZ2V0X3ZlcnNpb24oKSkKKysJCXJldHVybiAxOworKworKwlpZiAocHVsbChjb21taXRfaWQpKQorKwkJcmV0dXJuIDE7CisrCisrCXJldHVybiAwOworK30KK2RpZmYgYS9zc2gtcHVzaC5jIGIvc3NoLXB1c2guYworLS0tIC9kZXYvbnVsbAorKysrIGIvc3NoLXB1c2guYworQEAgLTAsMCArMSwxMDQgQEAKKysjaW5jbHVkZSAiY2FjaGUuaCIKKysjaW5jbHVkZSAicnNoLmgiCisrI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKysjaW5jbHVkZSA8ZXJybm8uaD4KKysKKyt1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworK3Vuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworKworK2ludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CisrCXNzaXplX3Qgc2l6ZTsKKysJaW50IHBvc24gPSAwOworKwljaGFyIHNoYTFbMjBdOworKwl1bnNpZ25lZCBsb25nIG9ianNpemU7CisrCXZvaWQgKmJ1ZjsKKysJc2lnbmVkIGNoYXIgcmVtb3RlOworKwlkbyB7CisrCQlzaXplID0gcmVhZChmZF9pbiwgc2hhMSArIHBvc24sIDIwIC0gcG9zbik7CisrCQlpZiAoc2l6ZSA8IDApIHsKKysJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogcmVhZCAiKTsKKysJCQlyZXR1cm4gLTE7CisrCQl9CisrCQlpZiAoIXNpemUpCisrCQkJcmV0dXJuIC0xOworKwkJcG9zbiArPSBzaXplOworKwl9IHdoaWxlIChwb3NuIDwgMjApOworKwkKKysJLyogZnByaW50ZihzdGRlcnIsICJTZXJ2aW5nICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7ICovCisrCXJlbW90ZSA9IDA7CisrCQorKwlidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKysJCisrCWlmICghYnVmKSB7CisrCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1zc2gtcHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorKwkJCXNoYTFfdG9faGV4KHNoYTEpKTsKKysJCXJlbW90ZSA9IC0xOworKwl9CisrCQorKwl3cml0ZShmZF9vdXQsICZyZW1vdGUsIDEpOworKwkKKysJaWYgKHJlbW90ZSA8IDApCisrCQlyZXR1cm4gMDsKKysJCisrCXBvc24gPSAwOworKwlkbyB7CisrCQlzaXplID0gd3JpdGUoZmRfb3V0LCBidWYgKyBwb3NuLCBvYmpzaXplIC0gcG9zbik7CisrCQlpZiAoc2l6ZSA8PSAwKSB7CisrCQkJaWYgKCFzaXplKSB7CisrCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXNzaC1wdXNoOiB3cml0ZSBjbG9zZWQiKTsKKysJCQl9IGVsc2UgeworKwkJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogd3JpdGUgIik7CisrCQkJfQorKwkJCXJldHVybiAtMTsKKysJCX0KKysJCXBvc24gKz0gc2l6ZTsKKysJfSB3aGlsZSAocG9zbiA8IG9ianNpemUpOworKwlyZXR1cm4gMDsKKyt9CisrCisraW50IHNlcnZlX3ZlcnNpb24oaW50IGZkX2luLCBpbnQgZmRfb3V0KQorK3sKKysJaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKQorKwkJcmV0dXJuIC0xOworKwl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKysJcmV0dXJuIDA7CisrfQorKworK3ZvaWQgc2VydmljZShpbnQgZmRfaW4sIGludCBmZF9vdXQpIHsKKysJY2hhciB0eXBlOworKwlpbnQgcmV0dmFsOworKwlkbyB7CisrCQlyZXR2YWwgPSByZWFkKGZkX2luLCAmdHlwZSwgMSk7CisrCQlpZiAocmV0dmFsIDwgMSkgeworKwkJCWlmIChyZXR2YWwgPCAwKQorKwkJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogcmVhZCAiKTsKKysJCQlyZXR1cm47CisrCQl9CisrCQlpZiAodHlwZSA9PSAndicgJiYgc2VydmVfdmVyc2lvbihmZF9pbiwgZmRfb3V0KSkKKysJCQlyZXR1cm47CisrCQlpZiAodHlwZSA9PSAnbycgJiYgc2VydmVfb2JqZWN0KGZkX2luLCBmZF9vdXQpKQorKwkJCXJldHVybjsKKysJfSB3aGlsZSAoMSk7CisrfQorKworK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyt7CisrCWludCBhcmcgPSAxOworKyAgICAgICAgY2hhciAqY29tbWl0X2lkOworKyAgICAgICAgY2hhciAqdXJsOworKwlpbnQgZmRfaW4sIGZkX291dDsKKysJd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworKyAgICAgICAgICAgICAgICBhcmcrKzsKKysgICAgICAgIH0KKysgICAgICAgIGlmIChhcmdjIDwgYXJnICsgMikgeworKwkJdXNhZ2UoImdpdC1zc2gtcHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CisrICAgICAgICAgICAgICAgIHJldHVybiAxOworKyAgICAgICAgfQorKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisrCXVybCA9IGFyZ3ZbYXJnICsgMV07CisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCQlyZXR1cm4gMTsKKysKKysJc2VydmljZShmZF9pbiwgZmRfb3V0KTsKKysJcmV0dXJuIDA7CisrfQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTYuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTYuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzQzZDQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNi5leHBlY3QKQEAgLTAsMCArMSw1IEBACisgTWFrZWZpbGUgICAgICAgICB8ICAgIDIgKy0KKyBnaXQtZmV0Y2gtc2NyaXB0IHwgICA0MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIGdpdC1wdWxsLXNjcmlwdCAgfCAgIDM0ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDQzIGluc2VydGlvbnMoKyksIDM0IGRlbGV0aW9ucygtKQorIGNyZWF0ZSBnaXQtZmV0Y2gtc2NyaXB0CmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNi5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS02LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzUzNjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNi5wYXRjaApAQCAtMCwwICsxLDEwMSBAQAorZGlmZiBhL01ha2VmaWxlIGIvTWFrZWZpbGUKKy0tLSBhL01ha2VmaWxlCisrKysgYi9NYWtlZmlsZQorQEAgLTIwLDcgKzIwLDcgQEAgSU5TVEFMTD1pbnN0YWxsCisgCisgU0NSSVBUUz1naXQtYXBwbHktcGF0Y2gtc2NyaXB0IGdpdC1tZXJnZS1vbmUtZmlsZS1zY3JpcHQgZ2l0LXBydW5lLXNjcmlwdCBcCisgCWdpdC1wdWxsLXNjcmlwdCBnaXQtdGFnLXNjcmlwdCBnaXQtcmVzb2x2ZS1zY3JpcHQgZ2l0LXdoYXRjaGFuZ2VkIFwKKy0JZ2l0LWRlbHRhZnktc2NyaXB0CisrCWdpdC1kZWx0YWZ5LXNjcmlwdCBnaXQtZmV0Y2gtc2NyaXB0CisgCisgUFJPRz0gICBnaXQtdXBkYXRlLWNhY2hlIGdpdC1kaWZmLWZpbGVzIGdpdC1pbml0LWRiIGdpdC13cml0ZS10cmVlIFwKKyAJZ2l0LXJlYWQtdHJlZSBnaXQtY29tbWl0LXRyZWUgZ2l0LWNhdC1maWxlIGdpdC1mc2NrLWNhY2hlIFwKK2RpZmYgYS9naXQtZmV0Y2gtc2NyaXB0IGIvZ2l0LWZldGNoLXNjcmlwdAorLS0tIC9kZXYvbnVsbAorKysrIGIvZ2l0LWZldGNoLXNjcmlwdAorQEAgLTAsMCArMSw0MSBAQAorKyMhL2Jpbi9zaAorKyMKKyttZXJnZV9yZXBvPSQxCisrbWVyZ2VfbmFtZT0kezI6LUhFQUR9CisrCisrOiAke0dJVF9ESVI9LmdpdH0KKys6ICR7R0lUX09CSkVDVF9ESVJFQ1RPUlk9IiR7U0hBMV9GSUxFX0RJUkVDVE9SWS0iJEdJVF9ESVIvb2JqZWN0cyJ9In0KKysKKytkb3dubG9hZF9vbmUgKCkgeworKwkjIHJlbW90ZV9wYXRoPSIkMSIgbG9jYWxfZmlsZT0iJDIiCisrCWNhc2UgIiQxIiBpbgorKwlodHRwOi8vKikKKysJCXdnZXQgLXEgLU8gIiQyIiAiJDEiIDs7CisrCS8qKQorKwkJdGVzdCAtZiAiJDEiICYmIGNhdCA+IiQyIiAiJDEiIDs7CisrCSopCisrCQlyc3luYyAtTCAiJDEiICIkMiIgOzsKKysJZXNhYworK30KKysKKytkb3dubG9hZF9vYmplY3RzICgpIHsKKysJIyByZW1vdGVfcmVwbz0iJDEiIGhlYWRfc2hhMT0iJDIiCisrCWNhc2UgIiQxIiBpbgorKwlodHRwOi8vKikKKysJCWdpdC1odHRwLXB1bGwgLWEgIiQyIiAiJDEvIgorKwkJOzsKKysJLyopCisrCQlnaXQtbG9jYWwtcHVsbCAtbCAtYSAiJDIiICIkMS8iCisrCQk7OworKwkqKQorKwkJcnN5bmMgLWF2eiAtLWlnbm9yZS1leGlzdGluZyBcCisrCQkJIiQxL29iamVjdHMvLiIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIvLgorKwkJOzsKKysJZXNhYworK30KKysKKytlY2hvICJHZXR0aW5nIHJlbW90ZSAkbWVyZ2VfbmFtZSIKKytkb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiJEdJVF9ESVIiL01FUkdFX0hFQUQKKysKKytlY2hvICJHZXR0aW5nIG9iamVjdCBkYXRhYmFzZSIKKytkb3dubG9hZF9vYmplY3RzICIkbWVyZ2VfcmVwbyIgIiQoY2F0ICIkR0lUX0RJUiIvTUVSR0VfSEVBRCkiCitkaWZmIGEvZ2l0LXB1bGwtc2NyaXB0IGIvZ2l0LXB1bGwtc2NyaXB0CistLS0gYS9naXQtcHVsbC1zY3JpcHQKKysrKyBiL2dpdC1wdWxsLXNjcmlwdAorQEAgLTYsMzkgKzYsNyBAQCBtZXJnZV9uYW1lPSR7MjotSEVBRH0KKyA6ICR7R0lUX0RJUj0uZ2l0fQorIDogJHtHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJHtTSEExX0ZJTEVfRElSRUNUT1JZLSIkR0lUX0RJUi9vYmplY3RzIn0ifQorIAorLWRvd25sb2FkX29uZSAoKSB7CistCSMgcmVtb3RlX3BhdGg9IiQxIiBsb2NhbF9maWxlPSIkMiIKKy0JY2FzZSAiJDEiIGluCistCWh0dHA6Ly8qKQorLQkJd2dldCAtcSAtTyAiJDIiICIkMSIgOzsKKy0JLyopCistCQl0ZXN0IC1mICIkMSIgJiYgY2F0ID4iJDIiICIkMSIgOzsKKy0JKikKKy0JCXJzeW5jIC1MICIkMSIgIiQyIiA7OworLQllc2FjCistfQorLQorLWRvd25sb2FkX29iamVjdHMgKCkgeworLQkjIHJlbW90ZV9yZXBvPSIkMSIgaGVhZF9zaGExPSIkMiIKKy0JY2FzZSAiJDEiIGluCistCWh0dHA6Ly8qKQorLQkJZ2l0LWh0dHAtcHVsbCAtYSAiJDIiICIkMS8iCistCQk7OworLQkvKikKKy0JCWdpdC1sb2NhbC1wdWxsIC1sIC1hICIkMiIgIiQxLyIKKy0JCTs7CistCSopCistCQlyc3luYyAtYXZ6IC0taWdub3JlLWV4aXN0aW5nIFwKKy0JCQkiJDEvb2JqZWN0cy8uIiAiJEdJVF9PQkpFQ1RfRElSRUNUT1JZIi8uCistCQk7OworLQllc2FjCistfQorLQorLWVjaG8gIkdldHRpbmcgcmVtb3RlICRtZXJnZV9uYW1lIgorLWRvd25sb2FkX29uZSAiJG1lcmdlX3JlcG8vJG1lcmdlX25hbWUiICIkR0lUX0RJUiIvTUVSR0VfSEVBRAorLQorLWVjaG8gIkdldHRpbmcgb2JqZWN0IGRhdGFiYXNlIgorLWRvd25sb2FkX29iamVjdHMgIiRtZXJnZV9yZXBvIiAiJChjYXQgIiRHSVRfRElSIi9NRVJHRV9IRUFEKSIKKytnaXQtZmV0Y2gtc2NyaXB0ICIkbWVyZ2VfcmVwbyIgIiRtZXJnZV9uYW1lIgorIAorIGdpdC1yZXNvbHZlLXNjcmlwdCBcCisgCSIkKGNhdCAiJEdJVF9ESVIiL0hFQUQpIiBcCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNy5leHBlY3QgYi90L3Q0MTAwL3QtYXBwbHktNy5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4MzE2NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS03LmV4cGVjdApAQCAtMCwwICsxLDYgQEAKKyBEb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCB8ICAgMjAgKy0KKyBscy10cmVlLmMgICAgICAgICAgICAgICAgICAgICB8ICAzMzMgKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0KKyB0L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2ggICB8ICAgIDMgCisgdHJlZS5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyIAorIHRyZWUuaCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSAKKyA1IGZpbGVzIGNoYW5nZWQsIDE5OSBpbnNlcnRpb25zKCspLCAxNjAgZGVsZXRpb25zKC0pCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNy5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS03LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzY1ODkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNy5wYXRjaApAQCAtMCwwICsxLDQ5NCBAQAorZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorQEAgLTQsMjMgKzQsMjYgQEAgdjAuMSwgTWF5IDIwMDUKKyAKKyBOQU1FCisgLS0tLQorLWdpdC1scy10cmVlIC0gRGlzcGxheXMgYSB0cmVlIG9iamVjdCBpbiBodW1hbiByZWFkYWJsZSBmb3JtCisrZ2l0LWxzLXRyZWUgLSBMaXN0cyB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdC4KKyAKKyAKKyBTWU5PUFNJUworIC0tLS0tLS0tCistJ2dpdC1scy10cmVlJyBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisrJ2dpdC1scy10cmVlJyBbLWRdIFstcl0gWy16XSA8dHJlZS1pc2g+IFtwYXRocy4uLl0KKyAKKyBERVNDUklQVElPTgorIC0tLS0tLS0tLS0tCistQ29udmVydHMgdGhlIHRyZWUgb2JqZWN0IHRvIGEgaHVtYW4gcmVhZGFibGUgKGFuZCBzY3JpcHQgcHJvY2Vzc2FibGUpCistZm9ybS4KKytMaXN0cyB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdCwgbGlrZSB3aGF0ICIvYmluL2xzIC1hIiBkb2VzCisraW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgCisgT1BUSU9OUworIC0tLS0tLS0KKyA8dHJlZS1pc2g+OjoKKyAJSWQgb2YgYSB0cmVlLgorIAorKy1kOjoKKysJc2hvdyBvbmx5IHRoZSBuYW1lZCB0cmVlIGVudHJ5IGl0c2VsZiwgbm90IGl0cyBjaGlsZHJlbgorKworIC1yOjoKKyAJcmVjdXJzZSBpbnRvIHN1Yi10cmVlcworIAorQEAgLTI4LDE4ICszMSwxOSBAQCBPUFRJT05TCisgCVwwIGxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0CisgCisgcGF0aHM6OgorLQlPcHRpb25hbGx5LCByZXN0cmljdCB0aGUgb3V0cHV0IG9mIGdpdC1scy10cmVlIHRvIHNwZWNpZmljCistCXBhdGhzLiBEaXJlY3RvcmllcyB3aWxsIG9ubHkgbGlzdCB0aGVpciB0cmVlIGJsb2IgaWRzLgorLQlJbXBsaWVzIC1yLgorKwlXaGVuIHBhdGhzIGFyZSBnaXZlbiwgc2hvd3MgdGhlbS4gIE90aGVyd2lzZSBpbXBsaWNpdGx5CisrCXVzZXMgdGhlIHJvb3QgbGV2ZWwgb2YgdGhlIHRyZWUgYXMgdGhlIHNvbGUgcGF0aCBhcmd1bWVudC4KKysKKyAKKyBPdXRwdXQgRm9ybWF0CisgLS0tLS0tLS0tLS0tLQorLSAgICAgICAgPG1vZGU+XHQJPHR5cGU+XHQJPG9iamVjdD5cdAk8ZmlsZT4KKysgICAgICAgIDxtb2RlPiBTUCA8dHlwZT4gU1AgPG9iamVjdD4gVEFCIDxmaWxlPgorIAorIAorIEF1dGhvcgorIC0tLS0tLQorIFdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorK0NvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gc2NyYXRjaCBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisgCisgRG9jdW1lbnRhdGlvbgorIC0tLS0tLS0tLS0tLS0tCitkaWZmIGEvbHMtdHJlZS5jIGIvbHMtdHJlZS5jCistLS0gYS9scy10cmVlLmMKKysrKyBiL2xzLXRyZWUuYworQEAgLTQsMTg4ICs0LDIxNyBAQAorICAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAgKi8KKyAjaW5jbHVkZSAiY2FjaGUuaCIKKysjaW5jbHVkZSAiYmxvYi5oIgorKyNpbmNsdWRlICJ0cmVlLmgiCisgCisgc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKy1zdGF0aWMgaW50IHJlY3Vyc2l2ZSA9IDA7CisrI2RlZmluZSBMU19SRUNVUlNJVkUgMQorKyNkZWZpbmUgTFNfVFJFRV9PTkxZIDIKKytzdGF0aWMgaW50IGxzX29wdGlvbnMgPSAwOworIAorLXN0cnVjdCBwYXRoX3ByZWZpeCB7CistCXN0cnVjdCBwYXRoX3ByZWZpeCAqcHJldjsKKy0JY29uc3QgY2hhciAqbmFtZTsKKy19OworLQorLSNkZWZpbmUgREVCVUcoZm10LCAuLi4pCQorLQorLXN0YXRpYyBpbnQgc3RyaW5nX3BhdGhfcHJlZml4KGNoYXIgKmJ1ZmYsIHNpemVfdCBibGVuLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWludCBsZW4gPSAwOworLQlpZiAocHJlZml4KSB7CistCQlpZiAocHJlZml4LT5wcmV2KSB7CistCQkJbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsYmxlbixwcmVmaXgtPnByZXYpOworLQkJCWJ1ZmYgKz0gbGVuOworLQkJCWJsZW4gLT0gbGVuOworLQkJCWlmIChibGVuID4gMCkgeworLQkJCQkqYnVmZiA9ICcvJzsKKy0JCQkJbGVuKys7CistCQkJCWJ1ZmYrKzsKKy0JCQkJYmxlbi0tOworLQkJCX0KKy0JCX0KKy0JCXN0cm5jcHkoYnVmZixwcmVmaXgtPm5hbWUsYmxlbik7CistCQlyZXR1cm4gbGVuICsgc3RybGVuKHByZWZpeC0+bmFtZSk7CistCX0KKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCByb290X2VudHJ5OworIAorLQlyZXR1cm4gMDsKKytzdGF0aWMgdm9pZCBwcmVwYXJlX3Jvb3QodW5zaWduZWQgY2hhciAqc2hhMSkKKyt7CisrCXVuc2lnbmVkIGNoYXIgcnNoYVsyMF07CisrCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKysJdm9pZCAqYnVmOworKwlzdHJ1Y3QgdHJlZSAqcm9vdF90cmVlOworKworKwlidWYgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCAidHJlZSIsICZzaXplLCByc2hhKTsKKysJZnJlZShidWYpOworKwlpZiAoIWJ1ZikKKysJCWRpZSgiQ291bGQgbm90IHJlYWQgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisrCisrCXJvb3RfdHJlZSA9IGxvb2t1cF90cmVlKHJzaGEpOworKwlpZiAoIXJvb3RfdHJlZSkKKysJCWRpZSgiQ291bGQgbm90IHJlYWQgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisrCisrCS8qIFByZXBhcmUgYSBmYWtlIGVudHJ5ICovCisrCXJvb3RfZW50cnkuZGlyZWN0b3J5ID0gMTsKKysJcm9vdF9lbnRyeS5leGVjdXRhYmxlID0gcm9vdF9lbnRyeS5zeW1saW5rID0gMDsKKysJcm9vdF9lbnRyeS5tb2RlID0gU19JRkRJUjsKKysJcm9vdF9lbnRyeS5uYW1lID0gIiI7CisrCXJvb3RfZW50cnkuaXRlbS50cmVlID0gcm9vdF90cmVlOworKwlyb290X2VudHJ5LnBhcmVudCA9IE5VTEw7CisgfQorIAorLXN0YXRpYyB2b2lkIHByaW50X3BhdGhfcHJlZml4KHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorK3N0YXRpYyBpbnQgcHJlcGFyZV9jaGlsZHJlbihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplbGVtKQorIHsKKy0JaWYgKHByZWZpeCkgeworLQkJaWYgKHByZWZpeC0+cHJldikgeworLQkJCXByaW50X3BhdGhfcHJlZml4KHByZWZpeC0+cHJldik7CistCQkJcHV0Y2hhcignLycpOworLQkJfQorLQkJZnB1dHMocHJlZml4LT5uYW1lLCBzdGRvdXQpOworKwlpZiAoIWVsZW0tPmRpcmVjdG9yeSkKKysJCXJldHVybiAtMTsKKysJaWYgKCFlbGVtLT5pdGVtLnRyZWUtPm9iamVjdC5wYXJzZWQpIHsKKysJCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmU7CisrCQlpZiAocGFyc2VfdHJlZShlbGVtLT5pdGVtLnRyZWUpKQorKwkJCXJldHVybiAtMTsKKysJCS8qIFNldCB1cCB0aGUgcGFyZW50IGxpbmsgKi8KKysJCWZvciAoZSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsgZTsgZSA9IGUtPm5leHQpCisrCQkJZS0+cGFyZW50ID0gZWxlbTsKKyAJfQorKwlyZXR1cm4gMDsKKyB9CisgCistLyoKKy0gKiByZXR1cm46CistICogCS0xIGlmIHByZWZpeCBpcyAqbm90KiBhIHN1YnNldCBvZiBwYXRoCistICogCSAwIGlmIHByZWZpeCA9PSBwYXRoCistICogCSAxIGlmIHByZWZpeCBpcyBhIHN1YnNldCBvZiBwYXRoCistICovCistc3RhdGljIGludCBwYXRoY21wKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorLXsKKy0JY2hhciBidWZmW1BBVEhfTUFYXTsKKy0JaW50IGxlbixzbGVuOworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpmaW5kX2VudHJ5XzAoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZWxlbSwKKysJCQkJCSAgICBjb25zdCBjaGFyICpwYXRoLAorKwkJCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorK3sKKysJY29uc3QgY2hhciAqZXA7CisrCWludCBsZW47CisrCisrCXdoaWxlIChwYXRoIDwgcGF0aF9lbmQpIHsKKysJCWlmIChwcmVwYXJlX2NoaWxkcmVuKGVsZW0pKQorKwkJCXJldHVybiBOVUxMOworIAorLQlpZiAocHJlZml4ID09IE5VTEwpCistCQlyZXR1cm4gMTsKKysJCS8qIEluIGVsZW0tPnRyZWUtPmVudHJpZXMsIGZpbmQgdGhlIG9uZSB0aGF0IGhhcyBuYW1lCisrCQkgKiB0aGF0IG1hdGNoZXMgd2hhdCBpcyBiZXR3ZWVuIHBhdGggYW5kIGVwLgorKwkJICovCisrCQllbGVtID0gZWxlbS0+aXRlbS50cmVlLT5lbnRyaWVzOworIAorLQlsZW4gPSBzdHJpbmdfcGF0aF9wcmVmaXgoYnVmZiwgc2l6ZW9mIGJ1ZmYsIHByZWZpeCk7CistCXNsZW4gPSBzdHJsZW4ocGF0aCk7CisrCQllcCA9IHN0cmNocihwYXRoLCAnLycpOworKwkJaWYgKCFlcCB8fCBwYXRoX2VuZCA8PSBlcCkKKysJCQllcCA9IHBhdGhfZW5kOworKwkJbGVuID0gZXAgLSBwYXRoOworKworKwkJd2hpbGUgKGVsZW0pIHsKKysJCQlpZiAoKHN0cmxlbihlbGVtLT5uYW1lKSA9PSBsZW4pICYmCisrCQkJICAgICFzdHJuY21wKGVsZW0tPm5hbWUsIHBhdGgsIGxlbikpCisrCQkJCWJyZWFrOworKwkJCWVsZW0gPSBlbGVtLT5uZXh0OworKwkJfQorKwkJaWYgKHBhdGhfZW5kIDw9IGVwIHx8ICFlbGVtKQorKwkJCXJldHVybiBlbGVtOworKwkJd2hpbGUgKCplcCA9PSAnLycgJiYgZXAgPCBwYXRoX2VuZCkKKysJCQllcCsrOworKwkJcGF0aCA9IGVwOworKwl9CisrCXJldHVybiBOVUxMOworK30KKyAKKy0JaWYgKHNsZW4gPCBsZW4pCistCQlyZXR1cm4gLTE7Cisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmZpbmRfZW50cnkoY29uc3QgY2hhciAqcGF0aCwKKysJCQkJCSAgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwkvKiBGaW5kIHRyZWUgZWxlbWVudCwgZGVzY2VuZGluZyBmcm9tIHJvb3QsIHRoYXQKKysJICogY29ycmVzcG9uZHMgdG8gdGhlIG5hbWVkIHBhdGgsIGxhemlseSBleHBhbmRpbmcKKysJICogdGhlIHRyZWUgaWYgcG9zc2libGUuCisrCSAqLworKwlpZiAocGF0aCA9PSBwYXRoX2VuZCkgeworKwkJLyogU3BlY2lhbC4gIFRoaXMgaXMgdGhlIHJvb3QgbGV2ZWwgKi8KKysJCXJldHVybiAmcm9vdF9lbnRyeTsKKysJfQorKwlyZXR1cm4gZmluZF9lbnRyeV8wKCZyb290X2VudHJ5LCBwYXRoLCBwYXRoX2VuZCk7CisrfQorIAorLQlpZiAoc3RybmNtcChwYXRoLGJ1ZmYsbGVuKSA9PSAwKSB7CistCQlpZiAoc2xlbiA9PSBsZW4pCistCQkJcmV0dXJuIDA7CistCQllbHNlCistCQkJcmV0dXJuIDE7Cisrc3RhdGljIHZvaWQgc2hvd19lbnRyeV9uYW1lKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwkvKiBUaGlzIGlzIHl1Y2t5LiAgVGhlIHJvb3QgbGV2ZWwgaXMgdGhlcmUgZm9yCisrCSAqIG91ciBjb252ZW5pZW5jZSBidXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8gYQorKwkgKiBmb3Jlc3QuCisrCSAqLworKwlpZiAoZS0+cGFyZW50ICYmIGUtPnBhcmVudCAhPSAmcm9vdF9lbnRyeSkgeworKwkJc2hvd19lbnRyeV9uYW1lKGUtPnBhcmVudCk7CisrCQlwdXRjaGFyKCcvJyk7CisgCX0KKysJcHJpbnRmKCIlcyIsIGUtPm5hbWUpOworK30KKyAKKy0JcmV0dXJuIC0xOworLX0JCisrc3RhdGljIGNvbnN0IGNoYXIgKmVudHJ5X3R5cGUoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiAoZS0+ZGlyZWN0b3J5ID8gInRyZWUiIDogImJsb2IiKTsKKyt9CisgCistLyoKKy0gKiBtYXRjaCBtYXkgYmUgTlVMTCwgb3IgYSAqc29ydGVkKiBsaXN0IG9mIHBhdGhzCistICovCistc3RhdGljIHZvaWQgbGlzdF9yZWN1cnNpdmUodm9pZCAqYnVmZmVyLAorLQkJCSAgIGNvbnN0IGNoYXIgKnR5cGUsCistCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLAorLQkJCSAgIHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4LAorLQkJCSAgIGNoYXIgKiptYXRjaCwgaW50IG1hdGNoZXMpCisteworLQlzdHJ1Y3QgcGF0aF9wcmVmaXggdGhpc19wcmVmaXg7CistCXRoaXNfcHJlZml4LnByZXYgPSBwcmVmaXg7CistCistCWlmIChzdHJjbXAodHlwZSwgInRyZWUiKSkKKy0JCWRpZSgiZXhwZWN0ZWQgYSAndHJlZScgbm9kZSIpOworLQorLQlpZiAobWF0Y2hlcykKKy0JCXJlY3Vyc2l2ZSA9IDE7CistCistCXdoaWxlIChzaXplKSB7CistCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihidWZmZXIpKzE7CistCQl2b2lkICplbHRidWYgPSBOVUxMOworLQkJY2hhciBlbHR0eXBlWzIwXTsKKy0JCXVuc2lnbmVkIGxvbmcgZWx0c2l6ZTsKKy0JCXVuc2lnbmVkIGNoYXIgKnNoYTEgPSBidWZmZXIgKyBuYW1lbGVuOworLQkJY2hhciAqcGF0aCA9IHN0cmNocihidWZmZXIsICcgJykgKyAxOworLQkJdW5zaWduZWQgaW50IG1vZGU7CistCQljb25zdCBjaGFyICptYXRjaGVkID0gTlVMTDsKKy0JCWludCBtdHlwZSA9IC0xOworLQkJaW50IG1pbmRleDsKKy0KKy0JCWlmIChzaXplIDwgbmFtZWxlbiArIDIwIHx8IHNzY2FuZihidWZmZXIsICIlbyIsICZtb2RlKSAhPSAxKQorLQkJCWRpZSgiY29ycnVwdCAndHJlZScgZmlsZSIpOworLQkJYnVmZmVyID0gc2hhMSArIDIwOworLQkJc2l6ZSAtPSBuYW1lbGVuICsgMjA7CistCistCQl0aGlzX3ByZWZpeC5uYW1lID0gcGF0aDsKKy0JCWZvciAoIG1pbmRleCA9IDA7IG1pbmRleCA8IG1hdGNoZXM7IG1pbmRleCsrKSB7CistCQkJbXR5cGUgPSBwYXRoY21wKG1hdGNoW21pbmRleF0sJnRoaXNfcHJlZml4KTsKKy0JCQlpZiAobXR5cGUgPj0gMCkgeworLQkJCQltYXRjaGVkID0gbWF0Y2hbbWluZGV4XTsKKy0JCQkJYnJlYWs7CistCQkJfQorLQkJfQorK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV9oZXgoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiBzaGExX3RvX2hleChlLT5kaXJlY3RvcnkKKysJCQkgICA/IGUtPml0ZW0udHJlZS0+b2JqZWN0LnNoYTEKKysJCQkgICA6IGUtPml0ZW0uYmxvYi0+b2JqZWN0LnNoYTEpOworK30KKyAKKy0JCS8qCistCQkgKiBJZiB3ZSdyZSBub3QgbWF0Y2hpbmcsIG9yIGlmIHRoaXMgaXMgYW4gZXhhY3QgbWF0Y2gsCistCQkgKiBwcmludCBvdXQgdGhlIGluZm8KKy0JCSAqLworLQkJaWYgKCFtYXRjaGVzIHx8IChtYXRjaGVkICE9IE5VTEwgJiYgbXR5cGUgPT0gMCkpIHsKKy0JCQlwcmludGYoIiUwNm8gJXMgJXNcdCIsIG1vZGUsCistCQkJICAgICAgIFNfSVNESVIobW9kZSkgPyAidHJlZSIgOiAiYmxvYiIsCistCQkJICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQlwcmludF9wYXRoX3ByZWZpeCgmdGhpc19wcmVmaXgpOworLQkJCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CistCQl9CisrLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgbXV0dWFsbHkgcmVjdXJzaXZlIHJvdXRpbmVzICovCisrc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKiwgaW50KTsKKyAKKy0JCWlmICghIHJlY3Vyc2l2ZSB8fCAhIFNfSVNESVIobW9kZSkpCistCQkJY29udGludWU7Cisrc3RhdGljIGludCBzaG93X2NoaWxkcmVuKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWlmIChwcmVwYXJlX2NoaWxkcmVuKGUpKQorKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogbHMtdHJlZSBzaG93X2NoaWxkcmVuIGNhbGxlZCB3aXRoIG5vbiB0cmVlIik7CisrCWUgPSBlLT5pdGVtLnRyZWUtPmVudHJpZXM7CisrCXdoaWxlIChlKSB7CisrCQlzaG93X2VudHJ5KGUsIGxldmVsKTsKKysJCWUgPSBlLT5uZXh0OworKwl9CisrCXJldHVybiAwOworK30KKyAKKy0JCWlmIChtYXRjaGVzICYmICEgbWF0Y2hlZCkKKy0JCQljb250aW51ZTsKKytzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSwgaW50IGxldmVsKQorK3sKKysJaW50IGVyciA9IDA7IAorIAorLQkJaWYgKCEgKGVsdGJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIGVsdHR5cGUsICZlbHRzaXplKSkgKSB7CistCQkJZXJyb3IoImNhbm5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworLQkJCWNvbnRpbnVlOworLQkJfQorKwlpZiAoZSAhPSAmcm9vdF9lbnRyeSkgeworKwkJcHJpbnRmKCIlMDZvICVzICVzCSIsIGUtPm1vZGUsIGVudHJ5X3R5cGUoZSksCisrCQkgICAgICAgZW50cnlfaGV4KGUpKTsKKysJCXNob3dfZW50cnlfbmFtZShlKTsKKysJCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CisrCX0KKyAKKy0JCS8qIElmIHRoaXMgaXMgYW4gZXhhY3QgZGlyZWN0b3J5IG1hdGNoLCB3ZSBtYXkgaGF2ZQorLQkJICogZGlyZWN0b3J5IGZpbGVzIGZvbGxvd2luZyB0aGlzIHBhdGguIE1hdGNoIG9uIHRoZW0uCistCQkgKiBPdGhlcndpc2UsIHdlJ3JlIGF0IGEgcGFjaCBzdWJjb21wb25lbnQsIGFuZCB3ZSBuZWVkCistCQkgKiB0byB0cnkgdG8gbWF0Y2ggYWdhaW4uCisrCWlmIChlLT5kaXJlY3RvcnkpIHsKKysJCS8qIElmIHRoaXMgaXMgYSBkaXJlY3RvcnksIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBjYXNlczoKKysJCSAqICgxKSBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgcmVxdWVzdCAoZXhwbGljaXQgcGF0aCBmcm9tIHRoZQorKwkJICogICAgIGNvbW1hbmQgbGluZSwgb3IgInJvb3QiIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgbGluZSkuCisrCQkgKiAgYS4gV2l0aG91dCBhbnkgZmxhZy4gIFdlIHNob3cgZGlyZWN0IGNoaWxkcmVuLiAgV2UgZG8gbm90IAorKwkJICogICAgIHJlY3Vyc2UgaW50byB0aGVtLgorKwkJICogIGIuIFdpdGggLXIuICBXZSBkbyByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIGRvIG5vdCByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAoMikgV2UgY2FtZSBoZXJlIGJlY2F1c2Ugb3VyIGNhbGxlciBpcyBlaXRoZXIgKDEtYSkgb3IKKysJCSAqICAgICAoMS1iKS4KKysJCSAqICBhLiBXaXRob3V0IGFueSBmbGFnLiAgV2UgZG8gbm90IHNob3cgb3VyIGNoaWxkcmVuICh3aGljaAorKwkJICogICAgIGFyZSBncmFuZGNoaWxkcmVuIGZvciB0aGUgb3JpZ2luYWwgcmVxdWVzdCkuCisrCQkgKiAgYi4gV2l0aCAtci4gIFdlIGNvbnRpbnVlIHRvIHJlY3Vyc2UgaW50byBvdXIgY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIHNob3VsZCBub3QgaGF2ZSBjb21lIGhlcmUgdG8gYmVnaW4gd2l0aC4KKyAJCSAqLworLQkJaWYgKG10eXBlID09IDApCistCQkJbWluZGV4Kys7CistCistCQlsaXN0X3JlY3Vyc2l2ZShlbHRidWYsIGVsdHR5cGUsIGVsdHNpemUsICZ0aGlzX3ByZWZpeCwgJm1hdGNoW21pbmRleF0sIG1hdGNoZXMtbWluZGV4KTsKKy0JCWZyZWUoZWx0YnVmKTsKKysJCWlmIChsZXZlbCA9PSAwICYmICEobHNfb3B0aW9ucyAmIExTX1RSRUVfT05MWSkpCisrCQkJLyogY2FzZSAoMSktYSBhbmQgKDEpLWIgKi8KKysJCQllcnIgPSBlcnIgfCBzaG93X2NoaWxkcmVuKGUsIGxldmVsKzEpOworKwkJZWxzZSBpZiAobGV2ZWwgJiYgbHNfb3B0aW9ucyAmIExTX1JFQ1VSU0lWRSkKKysJCQkvKiBjYXNlICgyKS1iICovCisrCQkJZXJyID0gZXJyIHwgc2hvd19jaGlsZHJlbihlLCBsZXZlbCsxKTsKKyAJfQorKwlyZXR1cm4gZXJyOworIH0KKyAKKy1zdGF0aWMgaW50IHFjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKKytzdGF0aWMgaW50IGxpc3Rfb25lKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorIHsKKy0JcmV0dXJuIHN0cmNtcCgqKGNoYXIgKiopYSwgKihjaGFyICoqKWIpOworKwlpbnQgZXJyID0gMDsKKysJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSA9IGZpbmRfZW50cnkocGF0aCwgcGF0aF9lbmQpOworKwlpZiAoIWUpIHsKKysJCS8qIHRyYWRpdGlvbmFsbHkgbHMtdHJlZSBkb2VzIG5vdCBjb21wbGFpbiBhYm91dAorKwkJICogbWlzc2luZyBwYXRoLiAgV2UgbWF5IGNoYW5nZSB0aGlzIGxhdGVyIHRvIG1hdGNoCisrCQkgKiB3aGF0ICIvYmluL2xzIC1hIiBkb2VzLCB3aGljaCBpcyB0byBjb21wbGFpbi4KKysJCSAqLworKwkJcmV0dXJuIGVycjsKKysJfQorKwllcnIgPSBlcnIgfCBzaG93X2VudHJ5KGUsIDApOworKwlyZXR1cm4gZXJyOworIH0KKyAKKy1zdGF0aWMgaW50IGxpc3QodW5zaWduZWQgY2hhciAqc2hhMSxjaGFyICoqcGF0aCkKKytzdGF0aWMgaW50IGxpc3QoY2hhciAqKnBhdGgpCisgeworLQl2b2lkICpidWZmZXI7CistCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKy0JaW50IG5wYXRoczsKKy0KKy0JZm9yIChucGF0aHMgPSAwOyBwYXRoW25wYXRoc10gIT0gTlVMTDsgbnBhdGhzKyspCistCQk7CistCistCXFzb3J0KHBhdGgsbnBhdGhzLHNpemVvZihjaGFyICopLHFjbXApOworLQorLQlidWZmZXIgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCAidHJlZSIsICZzaXplLCBOVUxMKTsKKy0JaWYgKCFidWZmZXIpCistCQlkaWUoInVuYWJsZSB0byByZWFkIHNoYTEgZmlsZSIpOworLQlsaXN0X3JlY3Vyc2l2ZShidWZmZXIsICJ0cmVlIiwgc2l6ZSwgTlVMTCwgcGF0aCwgbnBhdGhzKTsKKy0JZnJlZShidWZmZXIpOworLQlyZXR1cm4gMDsKKysJaW50IGk7CisrCWludCBlcnIgPSAwOworKwlmb3IgKGkgPSAwOyBwYXRoW2ldOyBpKyspIHsKKysJCWludCBsZW4gPSBzdHJsZW4ocGF0aFtpXSk7CisrCQl3aGlsZSAoMCA8PSBsZW4gJiYgcGF0aFtpXVtsZW5dID09ICcvJykKKysJCQlsZW4tLTsKKysJCWVyciA9IGVyciB8IGxpc3Rfb25lKHBhdGhbaV0sIHBhdGhbaV0gKyBsZW4pOworKwl9CisrCXJldHVybiBlcnI7CisgfQorIAorLXN0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3VzYWdlID0gImdpdC1scy10cmVlIFstcl0gWy16XSA8a2V5PiBbcGF0aHMuLi5dIjsKKytzdGF0aWMgY29uc3QgY2hhciAqbHNfdHJlZV91c2FnZSA9CisrCSJnaXQtbHMtdHJlZSBbLWRdIFstcl0gWy16XSA8dHJlZS1pc2g+IFtwYXRoLi4uXSI7CisgCisgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIHsKKysJc3RhdGljIGNoYXIgKnBhdGgwW10gPSB7ICIiLCBOVUxMIH07CisrCWNoYXIgKipwYXRoOworIAl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworIAorIAl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKK0BAIC0xOTQsNyArMjIzLDEwIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKyAJCQlicmVhazsKKyAJCWNhc2UgJ3InOgorLQkJCXJlY3Vyc2l2ZSA9IDE7CisrCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisrCQkJYnJlYWs7CisrCQljYXNlICdkJzoKKysJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKyAJCQlicmVhazsKKyAJCWRlZmF1bHQ6CisgCQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CitAQCAtMjA2LDcgKzIzOCwxMCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKyAJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpIDwgMCkKKyAJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworLQlpZiAobGlzdChzaGExLCAmYXJndlsyXSkgPCAwKQorKworKwlwYXRoID0gKGFyZ2MgPT0gMikgPyBwYXRoMCA6IChhcmd2ICsgMik7CisrCXByZXBhcmVfcm9vdChzaGExKTsKKysJaWYgKGxpc3QocGF0aCkgPCAwKQorIAkJZGllKCJsaXN0IGZhaWxlZCIpOworIAlyZXR1cm4gMDsKKyB9CitkaWZmIGEvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCistLS0gYS90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKKysrKyBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorQEAgLTc0LDggKzc0LDggQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdscy10cmVlIGZpbHRlcmVkJyBcCisgICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKy0xMDA2NDQgYmxvYiBYCXBhdGgwCisgMTIwMDAwIGJsb2IgWAlwYXRoMQorKzEwMDY0NCBibG9iIFgJcGF0aDAKKyBFT0YKKyAgICAgIHRlc3Rfb3V0cHV0JworIAorQEAgLTg1LDcgKzg1LDYgQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorIDA0MDAwMCB0cmVlIFgJcGF0aDIKKyAwNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorLTEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKyAxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisgMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KKyBFT0YKK2RpZmYgYS90cmVlLmMgYi90cmVlLmMKKy0tLSBhL3RyZWUuYworKysrIGIvdHJlZS5jCitAQCAtMTMzLDcgKzEzMyw3IEBAIGludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwKKyAJCX0KKyAJCWlmIChvYmopCisgCQkJYWRkX3JlZigmaXRlbS0+b2JqZWN0LCBvYmopOworLQorKwkJZW50cnktPnBhcmVudCA9IE5VTEw7IC8qIG5lZWRzIHRvIGJlIGZpbGxlZCBieSB0aGUgdXNlciAqLworIAkJKmxpc3RfcCA9IGVudHJ5OworIAkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworIAl9CitkaWZmIGEvdHJlZS5oIGIvdHJlZS5oCistLS0gYS90cmVlLmgKKysrKyBiL3RyZWUuaAorQEAgLTE2LDYgKzE2LDcgQEAgc3RydWN0IHRyZWVfZW50cnlfbGlzdCB7CisgCQlzdHJ1Y3QgdHJlZSAqdHJlZTsKKyAJCXN0cnVjdCBibG9iICpibG9iOworIAl9IGl0ZW07CisrCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKnBhcmVudDsKKyB9OworIAorIHN0cnVjdCB0cmVlIHsKZGlmZiAtLWdpdCBhL3QvdDQxMDEtYXBwbHktbm9ubC5zaCBiL3QvdDQxMDEtYXBwbHktbm9ubC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNmIxMzFkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS1hcHBseS1ub25sLnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IHNob3VsZCBoYW5kbGUgZmlsZXMgd2l0aCBpbmNvbXBsZXRlIGxpbmVzLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCisoZWNobyBhOyBlY2hvIGIpID5mcm90ei4wCisoZWNobyBhOyBlY2hvIGI7IGVjaG8gYykgPmZyb3R6LjEKKyhlY2hvIGE7IGVjaG8gYiB8IHRyIC1kICdcMDEyJykgPmZyb3R6LjIKKyhlY2hvIGE7IGVjaG8gYzsgZWNobyBiIHwgdHIgLWQgJ1wwMTInKSA+ZnJvdHouMworCitmb3IgaSBpbiAwIDEgMiAzCitkbworICBmb3IgaiBpbiAwIDEgMiAzCisgIGRvCisgICAgdGVzdCAkaSAtZXEgJGogJiYgY29udGludWUKKyAgICBkaWZmIC11IGZyb3R6LiRpIGZyb3R6LiRqIHwKKyAgICBzZWQgLWUgJworCS9eLS0tL3N8Lip8LS0tIGEvZnJvdHp8CisJL14rKysvc3wuKnwrKysgYi9mcm90enwnID5kaWZmLiRpLSRqCisgICAgY2F0IGZyb3R6LiRpID5mcm90egorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAiYXBwbHkgZGlmZiBiZXR3ZWVuICRpIGFuZCAkaiIgXAorCSJnaXQtYXBwbHkgPGRpZmYuJGktJGogJiYgZGlmZiBmcm90ei4kaiBmcm90eiIKKyAgZG9uZQorZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDItYXBwbHktcmVuYW1lLnNoIGIvdC90NDEwMi1hcHBseS1yZW5hbWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmJiNTA4ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDItYXBwbHktcmVuYW1lLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IGhhbmRsaW5nIGNvcHkvcmVuYW1lIHBhdGNoLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitjYXQgPnRlc3QtcGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvZm9vIGIvYmFyCitzaW1pbGFyaXR5IGluZGV4IDQ3JQorY29weSBmcm9tIGZvbworY29weSB0byBiYXIKKy0tLSBhL2ZvbworKysrIGIvYmFyCitAQCAtMSArMSBAQAorLVRoaXMgaXMgZm9vCisrVGhpcyBpcyBiYXIKK0VPRgorCitlY2hvICdUaGlzIGlzIGZvbycgPmZvbworY2htb2QgK3ggZm9vCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBhcHBseSBcCisgICAgJ2dpdC1hcHBseSAtLWluZGV4IC0tc3RhdCAtLXN1bW1hcnkgLS1hcHBseSB0ZXN0LXBhdGNoJworCitpZiBbICIkKGdpdCByZXBvLWNvbmZpZyAtLWdldCBjb3JlLmZpbGVtb2RlKSIgPSBmYWxzZSBdCit0aGVuCisJc2F5ICdmaWxlbW9kZSBkaXNhYmxlZCBvbiB0aGUgZmlsZXN5c3RlbScKK2Vsc2UKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIHZhbGlkYXRlIFwKKwkgICAgJ3Rlc3QgLWYgYmFyICYmIGxzIC1sIGJhciB8IGdyZXAgIl4tLi54Li4uLi4uIicKK2ZpCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwMy1hcHBseS1iaW5hcnkuc2ggYi90L3Q0MTAzLWFwcGx5LWJpbmFyeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMGJkOGIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMy1hcHBseS1iaW5hcnkuc2gKQEAgLTAsMCArMSwxMTUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IGhhbmRsaW5nIGJpbmFyeSBwYXRjaGVzCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+ZmlsZTEgPDxFT0YKK0EgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLgorQSB0aW55IGxpdHRsZSBwZW5ndWluIHJ1bnMgYXJvdW5kIGluIGNpcmNsZXMuCitUaGVyZSBpcyBhIGZsYWcgd2l0aCBMaW51eCB3cml0dGVuIG9uIGl0LgorQSBzbG93IGJsYWNrLWFuZC13aGl0ZSBwYW5kYSBqdXN0IHNpdHMgdGhlcmUsCittdW5jaGluZyBvbiBoaXMgYmFtYm9vLgorRU9GCitjYXQgZmlsZTEgPmZpbGUyCitjYXQgZmlsZTEgPmZpbGU0CisKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgZmlsZTEgZmlsZTIgZmlsZTQKK2dpdC1jb21taXQgLW0gJ0luaXRpYWwgVmVyc2lvbicgMj4vZGV2L251bGwKKworZ2l0LWNoZWNrb3V0IC1iIGJpbmFyeQordHIgJ3gnICdcMCcgPGZpbGUxID5maWxlMworY2F0IGZpbGUzID5maWxlNAorZ2l0LWFkZCBmaWxlMgordHIgJ1wwJyAndicgPGZpbGUzID5maWxlMQorcm0gLWYgZmlsZTIKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgZmlsZTEgZmlsZTIgZmlsZTMgZmlsZTQKK2dpdC1jb21taXQgLW0gJ1NlY29uZCBWZXJzaW9uJworCitnaXQtZGlmZi10cmVlIC1wIG1hc3RlciBiaW5hcnkgPkIuZGlmZgorZ2l0LWRpZmYtdHJlZSAtcCAtQyBtYXN0ZXIgYmluYXJ5ID5DLmRpZmYKKworZ2l0LWRpZmYtdHJlZSAtcCAtLWZ1bGwtaW5kZXggbWFzdGVyIGJpbmFyeSA+QkYuZGlmZgorZ2l0LWRpZmYtdHJlZSAtcCAtLWZ1bGwtaW5kZXggLUMgbWFzdGVyIGJpbmFyeSA+Q0YuZGlmZgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0IGJpbmFyeSBkaWZmIC0tIHNob3VsZCBub3QgZmFpbC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXQgYmluYXJ5IGRpZmYgKGNvcHkpIC0tIHNob3VsZCBub3QgZmFpbC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBDLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2NoZWNrIGJpbmFyeSBkaWZmIC0tIHNob3VsZCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLWNoZWNrIEIuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY2hlY2sgYmluYXJ5IGRpZmYgKGNvcHkpIC0tIHNob3VsZCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLWNoZWNrIEMuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY2hlY2sgaW5jb21wbGV0ZSBiaW5hcnkgZGlmZiB3aXRoIHJlcGxhY2VtZW50IC0tIHNob3VsZCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLWNoZWNrIC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50IEIuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY2hlY2sgaW5jb21wbGV0ZSBiaW5hcnkgZGlmZiB3aXRoIHJlcGxhY2VtZW50IChjb3B5KSAtLSBzaG91bGQgZmFpbC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBDLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGJpbmFyeSBkaWZmIHdpdGggcmVwbGFjZW1lbnQuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIKKwkgZ2l0LWFwcGx5IC0tY2hlY2sgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgQkYuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgYmluYXJ5IGRpZmYgd2l0aCByZXBsYWNlbWVudCAoY29weSkuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIKKwkgZ2l0LWFwcGx5IC0tY2hlY2sgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgQ0YuZGlmZicKKworIyBOb3cgd2Ugc3RhcnQgYXBwbHlpbmcgdGhlbS4KKworZG9fcmVzZXQgKCkgeworCXJtIC1mIGZpbGU/CisJZ2l0LXJlc2V0IC0taGFyZAorCWdpdC1jaGVja291dCAtZiBtYXN0ZXIKK30KKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYmluYXJ5IGRpZmYgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGJpbmFyeSBkaWZmIC0tIHNob3VsZCBmYWlsLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1pbmRleCBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGJpbmFyeSBkaWZmIChjb3B5KSAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQKKwkgZ2l0LWFwcGx5IEMuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYmluYXJ5IGRpZmYgKGNvcHkpIC0tIHNob3VsZCBmYWlsLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1pbmRleCBDLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGJpbmFyeSBkaWZmIHdpdGhvdXQgcmVwbGFjZW1lbnQgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSBCRi5kaWZmJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdhcHBseSBiaW5hcnkgZGlmZiB3aXRob3V0IHJlcGxhY2VtZW50IChjb3B5KSAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQKKwkgZ2l0LWFwcGx5IENGLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGJpbmFyeSBkaWZmLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgLS1pbmRleCBCRi5kaWZmICYmCisJIHRlc3QgLXogIiQoZ2l0LWRpZmYgLS1uYW1lLXN0YXR1cyBiaW5hcnkpIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgYmluYXJ5IGRpZmYgKGNvcHkpLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgLS1pbmRleCBDRi5kaWZmICYmCisJIHRlc3QgLXogIiQoZ2l0LWRpZmYgLS1uYW1lLXN0YXR1cyBiaW5hcnkpIicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTA5LWFwcGx5LW11bHRpZnJhZy5zaCBiL3QvdDQxMDktYXBwbHktbXVsdGlmcmFnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5ODhlMWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTA5LWFwcGx5LW11bHRpZnJhZy5zaApAQCAtMCwwICsxLDE3NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIyBDb3B5cmlnaHQgKGMpIDIwMDUgUm9iZXJ0IEZpdHpzaW1vbnMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IHRlc3QgcGF0Y2hlcyB3aXRoIG11bHRpcGxlIGZyYWdtZW50cy4KKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworY2F0ID4gcGF0Y2gxLnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL21haW4uYyBiL21haW4uYworbmV3IGZpbGUgbW9kZSAxMDA2NDQKKy0tLSAvZGV2L251bGwKKysrKyBiL21haW4uYworQEAgLTAsMCArMSwyMyBAQAorKyNpbmNsdWRlIDxzdGRpby5oPgorKworK2ludCBmdW5jKGludCBudW0pOworK3ZvaWQgcHJpbnRfaW50KGludCBudW0pOworKworK2ludCBtYWluKCkgeworKwlpbnQgaTsKKysKKysJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKysJCXByaW50X2ludChmdW5jKGkpKTsKKysJfQorKworKwlyZXR1cm4gMDsKKyt9CisrCisraW50IGZ1bmMoaW50IG51bSkgeworKwlyZXR1cm4gbnVtICogbnVtOworK30KKysKKyt2b2lkIHByaW50X2ludChpbnQgbnVtKSB7CisrCXByaW50ZigiJWQiLCBudW0pOworK30KKysKK0VPRgorY2F0ID4gcGF0Y2gyLnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL21haW4uYyBiL21haW4uYworLS0tIGEvbWFpbi5jCisrKysgYi9tYWluLmMKK0BAIC0xLDcgKzEsOSBAQAorKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAKKyBpbnQgZnVuYyhpbnQgbnVtKTsKKyB2b2lkIHByaW50X2ludChpbnQgbnVtKTsKKyt2b2lkIHByaW50X2xuKCk7CisgCisgaW50IG1haW4oKSB7CisgCWludCBpOworQEAgLTEwLDYgKzEyLDggQEAKKyAJCXByaW50X2ludChmdW5jKGkpKTsKKyAJfQorIAorKwlwcmludF9sbigpOworKworIAlyZXR1cm4gMDsKKyB9CisgCitAQCAtMjEsMyArMjUsNyBAQAorIAlwcmludGYoIiVkIiwgbnVtKTsKKyB9CisgCisrdm9pZCBwcmludF9sbigpIHsKKysJcHJpbnRmKCJcbiIpOworK30KKysKK0VPRgorY2F0ID4gcGF0Y2gzLnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL21haW4uYyBiL21haW4uYworLS0tIGEvbWFpbi5jCisrKysgYi9tYWluLmMKK0BAIC0xLDkgKzEsNyBAQAorLSNpbmNsdWRlIDxzdGRsaWIuaD4KKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAKKyBpbnQgZnVuYyhpbnQgbnVtKTsKKyB2b2lkIHByaW50X2ludChpbnQgbnVtKTsKKy12b2lkIHByaW50X2xuKCk7CisgCisgaW50IG1haW4oKSB7CisgCWludCBpOworQEAgLTEyLDggKzEwLDYgQEAKKyAJCXByaW50X2ludChmdW5jKGkpKTsKKyAJfQorIAorLQlwcmludF9sbigpOworLQorIAlyZXR1cm4gMDsKKyB9CisgCitAQCAtMjUsNyArMjEsMyBAQAorIAlwcmludGYoIiVkIiwgbnVtKTsKKyB9CisgCistdm9pZCBwcmludF9sbigpIHsKKy0JcHJpbnRmKCJcbiIpOworLX0KKy0KK0VPRgorY2F0ID4gcGF0Y2g0LnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL21haW4uYyBiL21haW4uYworLS0tIGEvbWFpbi5jCisrKysgYi9tYWluLmMKK0BAIC0xLDEzICsxLDE0IEBACisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgCisgaW50IGZ1bmMoaW50IG51bSk7Cistdm9pZCBwcmludF9pbnQoaW50IG51bSk7CisraW50IGZ1bmMyKGludCBudW0pOworIAorIGludCBtYWluKCkgeworIAlpbnQgaTsKKyAKKyAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKy0JCXByaW50X2ludChmdW5jKGkpKTsKKysJCXByaW50ZigiJWQiLCBmdW5jKGkpKTsKKysJCXByaW50ZigiJWQiLCBmdW5jMyhpKSk7CisgCX0KKyAKKyAJcmV0dXJuIDA7CitAQCAtMTcsNyArMTgsNyBAQAorIAlyZXR1cm4gbnVtICogbnVtOworIH0KKyAKKy12b2lkIHByaW50X2ludChpbnQgbnVtKSB7CistCXByaW50ZigiJWQiLCBudW0pOworK2ludCBmdW5jMihpbnQgbnVtKSB7CisrCXJldHVybiBudW0gKiBudW0gKiBudW07CisgfQorIAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBnaXQtYXBwbHkgKDEpIiBcCisgICAgJ2dpdC1hcHBseSBwYXRjaDEucGF0Y2ggcGF0Y2gyLnBhdGNoJworbXYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IHBhdGNoICgxKSIgXAorICAgICdjYXQgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCB8IHBhdGNoIC1wMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGNtcCAoMSkiIFwKKyAgICAnY21wIG1haW4uYy5naXQgbWFpbi5jJworCitybSAtZiBtYWluLmMgbWFpbi5jLmdpdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gZ2l0LWFwcGx5ICgyKSIgXAorICAgICdnaXQtYXBwbHkgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCBwYXRjaDMucGF0Y2gnCittdiBtYWluLmMgbWFpbi5jLmdpdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gcGF0Y2ggKDIpIiBcCisgICAgJ2NhdCBwYXRjaDEucGF0Y2ggcGF0Y2gyLnBhdGNoIHBhdGNoMy5wYXRjaCB8IHBhdGNoIC1wMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGNtcCAoMikiIFwKKyAgICAnY21wIG1haW4uYy5naXQgbWFpbi5jJworCitybSAtZiBtYWluLmMgbWFpbi5jLmdpdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gZ2l0LWFwcGx5ICgzKSIgXAorICAgICdnaXQtYXBwbHkgcGF0Y2gxLnBhdGNoIHBhdGNoNC5wYXRjaCcKK212IG1haW4uYyBtYWluLmMuZ2l0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBwYXRjaCAoMykiIFwKKyAgICAnY2F0IHBhdGNoMS5wYXRjaCBwYXRjaDQucGF0Y2ggfCBwYXRjaCAtcDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBjbXAgKDMpIiBcCisgICAgJ2NtcCBtYWluLmMuZ2l0IG1haW4uYycKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDQxMTAtYXBwbHktc2Nhbi5zaCBiL3QvdDQxMTAtYXBwbHktc2Nhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDVmNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDExMC1hcHBseS1zY2FuLnNoCkBAIC0wLDAgKzEsMTAxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjIENvcHlyaWdodCAoYykgMjAwNSBSb2JlcnQgRml0enNpbW9ucworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgdGVzdCBmb3IgcGF0Y2hlcyB3aGljaCByZXF1aXJlIHNjYW5uaW5nIGZvcndhcmRzIGFuZCBiYWNrd2FyZHMuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+IHBhdGNoMS5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9uZXcudHh0IGIvbmV3LnR4dAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKKy0tLSAvZGV2L251bGwKKysrKyBiL25ldy50eHQKK0BAIC0wLDAgKzEsMTIgQEAKKythMQorK2ExMQorK2ExMTEKKythMTExMQorK2IxCisrYjExCisrYjExMQorK2IxMTExCisrYzEKKytjMTEKKytjMTExCisrYzExMTEKK0VPRgorY2F0ID4gcGF0Y2gyLnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL25ldy50eHQgYi9uZXcudHh0CistLS0gYS9uZXcudHh0CisrKysgYi9uZXcudHh0CitAQCAtMSw3ICsxLDMgQEAKKy1hMQorLWExMQorLWExMTEKKy1hMTExMQorIGIxCisgYjExCisgYjExMQorRU9GCitjYXQgPiBwYXRjaDMucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbmV3LnR4dCBiL25ldy50eHQKKy0tLSBhL25ldy50eHQKKysrKyBiL25ldy50eHQKK0BAIC02LDYgKzYsMTAgQEAKKyBiMTEKKyBiMTExCisgYjExMTEKKytiMgorK2IyMgorK2IyMjIKKytiMjIyMgorIGMxCisgYzExCisgYzExMQorRU9GCitjYXQgPiBwYXRjaDQucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbmV3LnR4dCBiL25ldy50eHQKKy0tLSBhL25ldy50eHQKKysrKyBiL25ldy50eHQKK0BAIC0xLDMgKzEsNyBAQAorK2ExCisrYTExCisrYTExMQorK2ExMTExCisgYjEKKyBiMTEKKyBiMTExCitFT0YKK2NhdCA+IHBhdGNoNS5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9uZXcudHh0IGIvbmV3LnR4dAorLS0tIGEvbmV3LnR4dAorKysrIGIvbmV3LnR4dAorQEAgLTEwLDMgKzEwLDcgQEAKKyBjMTEKKyBjMTExCisgYzExMTEKKytjMgorK2MyMgorK2MyMjIKKytjMjIyMgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBnaXQtYXBwbHkgc2NhbiIgXAorICAgICdnaXQtYXBwbHkgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCBwYXRjaDMucGF0Y2ggcGF0Y2g0LnBhdGNoIHBhdGNoNS5wYXRjaCcKK212IG5ldy50eHQgYXBwbHkudHh0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBwYXRjaCBzY2FuIiBcCisgICAgJ2NhdCBwYXRjaDEucGF0Y2ggcGF0Y2gyLnBhdGNoIHBhdGNoMy5wYXRjaCBwYXRjaDQucGF0Y2ggcGF0Y2g1LnBhdGNoIHwgcGF0Y2gnCittdiBuZXcudHh0IHBhdGNoLnR4dAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gY21wIiBcCisgICAgJ2NtcCBhcHBseS50eHQgcGF0Y2gudHh0JworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NDExMi1hcHBseS1yZW5hbWVzLnNoIGIvdC90NDExMi1hcHBseS1yZW5hbWVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwNmY2OTUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTEyLWFwcGx5LXJlbmFtZXMuc2gKQEAgLTAsMCArMSwxNDggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IHNob3VsZCBub3QgZ2V0IGNvbmZ1c2VkIHdpdGggcmVuYW1lL2NvcHkuCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworbWtkaXIgLXAgaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYyBrbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjCisKK2NhdCA+aW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc2V0am1wLmggPDxcRU9GCisvKgorICogYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKyAgdW5zaWduZWQgbG9uZyBfX3JieDsKKyAgdW5zaWduZWQgbG9uZyBfX3JzcDsKKyAgdW5zaWduZWQgbG9uZyBfX3JicDsKKyAgdW5zaWduZWQgbG9uZyBfX3IxMjsKKyAgdW5zaWduZWQgbG9uZyBfX3IxMzsKKyAgdW5zaWduZWQgbG9uZyBfX3IxNDsKKyAgdW5zaWduZWQgbG9uZyBfX3IxNTsKKyAgdW5zaWduZWQgbG9uZyBfX3JpcDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYgLyogX1NFVEpNUF9IICovCitFT0YKKworY2F0ID5rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCA8PFxFT0YKKy8qCisgKiBhcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworICB1bnNpZ25lZCBsb25nIF9fcmJ4OworICB1bnNpZ25lZCBsb25nIF9fcnNwOworICB1bnNpZ25lZCBsb25nIF9fcmJwOworICB1bnNpZ25lZCBsb25nIF9fcjEyOworICB1bnNpZ25lZCBsb25nIF9fcjEzOworICB1bnNpZ25lZCBsb25nIF9fcjE0OworICB1bnNpZ25lZCBsb25nIF9fcjE1OworICB1bnNpZ25lZCBsb25nIF9fcmlwOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZiAvKiBfU0VUSk1QX0ggKi8KK0VPRgorCitjYXQgPnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL2tsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oIGIvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHNldGptcC5oCitzaW1pbGFyaXR5IGluZGV4IDc2JQorY29weSBmcm9tIGtsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCitjb3B5IHRvIGluY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaAorLS0tIGEva2xpYmMvYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKysrKyBiL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaAorQEAgLTEsMjEgKzEsMjQgQEAKKyAvKgorLSAqIGFyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisrICogYXJjaC9jcmlzL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgICovCisgCisgI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisgI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisgCisgc3RydWN0IF9fam1wX2J1ZiB7CistICB1bnNpZ25lZCBsb25nIF9fcmJ4OworLSAgdW5zaWduZWQgbG9uZyBfX3JzcDsKKy0gIHVuc2lnbmVkIGxvbmcgX19yYnA7CistICB1bnNpZ25lZCBsb25nIF9fcjEyOworLSAgdW5zaWduZWQgbG9uZyBfX3IxMzsKKy0gIHVuc2lnbmVkIGxvbmcgX19yMTQ7CistICB1bnNpZ25lZCBsb25nIF9fcjE1OworLSAgdW5zaWduZWQgbG9uZyBfX3JpcDsKKysgIHVuc2lnbmVkIGxvbmcgX19yMDsKKysgIHVuc2lnbmVkIGxvbmcgX19yMTsKKysgIHVuc2lnbmVkIGxvbmcgX19yMjsKKysgIHVuc2lnbmVkIGxvbmcgX19yMzsKKysgIHVuc2lnbmVkIGxvbmcgX19yNDsKKysgIHVuc2lnbmVkIGxvbmcgX19yNTsKKysgIHVuc2lnbmVkIGxvbmcgX19yNjsKKysgIHVuc2lnbmVkIGxvbmcgX19yNzsKKysgIHVuc2lnbmVkIGxvbmcgX19yODsKKysgIHVuc2lnbmVkIGxvbmcgX19zcDsKKysgIHVuc2lnbmVkIGxvbmcgX19zcnA7CisgfTsKKyAKKyB0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKyAKKy0jZW5kaWYgLyogX1NFVEpNUF9IICovCisrI2VuZGlmIC8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KK2RpZmYgLS1naXQgYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCBiL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzZXRqbXAuaAorc2ltaWxhcml0eSBpbmRleCA2NiUKK3JlbmFtZSBmcm9tIGtsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCityZW5hbWUgdG8gaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCistLS0gYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorKysrIGIvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCitAQCAtMSwyMSArMSwyMSBAQAorIC8qCistICogYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKysgKiBhcmNoL20zMnIvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAgKi8KKyAKKyAjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyAjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKyAKKyBzdHJ1Y3QgX19qbXBfYnVmIHsKKy0gIHVuc2lnbmVkIGxvbmcgX19yYng7CistICB1bnNpZ25lZCBsb25nIF9fcnNwOworLSAgdW5zaWduZWQgbG9uZyBfX3JicDsKKysgIHVuc2lnbmVkIGxvbmcgX19yODsKKysgIHVuc2lnbmVkIGxvbmcgX19yOTsKKysgIHVuc2lnbmVkIGxvbmcgX19yMTA7CisrICB1bnNpZ25lZCBsb25nIF9fcjExOworICAgdW5zaWduZWQgbG9uZyBfX3IxMjsKKyAgIHVuc2lnbmVkIGxvbmcgX19yMTM7CisgICB1bnNpZ25lZCBsb25nIF9fcjE0OworICAgdW5zaWduZWQgbG9uZyBfX3IxNTsKKy0gIHVuc2lnbmVkIGxvbmcgX19yaXA7CisgfTsKKyAKKyB0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKyAKKy0jZW5kaWYgLyogX1NFVEpNUF9IICovCisrI2VuZGlmIC8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KK0VPRgorCitmaW5kIGluY2x1ZGUga2xpYmMgLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHJlbmFtZS9jb3B5IHBhdGNoJyAnZ2l0LWFwcGx5IC0tY2hlY2sgcGF0Y2gnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHJlbmFtZS9jb3B5IHBhdGNoJyAnZ2l0LWFwcGx5IC0taW5kZXggcGF0Y2gnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDExMy1hcHBseS1lbmRpbmcuc2ggYi90L3Q0MTEzLWFwcGx5LWVuZGluZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZmQwY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDExMy1hcHBseS1lbmRpbmcuc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBDYXRhbGluIE1hcmluYXMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IHRyeWluZyB0byBhZGQgYW4gZW5kaW5nIGxpbmUuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+dGVzdC1wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9maWxlIGIvZmlsZQorLS0tIGEvZmlsZQorKysrIGIvZmlsZQorQEAgLTEsMiArMSwzIEBACisgYQorIGIKKytjCitFT0YKKworZWNobyAnYScgPmZpbGUKK2VjaG8gJ2InID4+ZmlsZQorZWNobyAnYycgPj5maWxlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUnCisKKyMgdGVzdAorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdhcHBseSBhdCB0aGUgZW5kJyBcCisgICAgJ2dpdC1hcHBseSAtLWluZGV4IHRlc3QtcGF0Y2gnCisKK2NhdCA+dGVzdC1wYXRjaCA8PFxFT0YKK2RpZmYgYS9maWxlIGIvZmlsZQorLS0tIGEvZmlsZQorKysrIGIvZmlsZQorQEAgLTEsMiArMSwzIEBACisrYQorIGIKKyBjCitFT0YKKworZWNobyA+ZmlsZSAnYQorYgorYycKK2dpdC11cGRhdGUtaW5kZXggZmlsZQorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdhcHBseSBhdCB0aGUgYmVnaW5uaW5nJyBcCisJJ2dpdC1hcHBseSAtLWluZGV4IHRlc3QtcGF0Y2gnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTAwMC10YXItdHJlZS5zaCBiL3QvdDUwMDAtdGFyLXRyZWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc4ZWI2NgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUwMDAtdGFyLXRyZWUuc2gKQEAgLTAsMCArMSw5OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBSZW5lIFNjaGFyZmUKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXRhci10cmVlIGFuZCBnaXQtZ2V0LXRhci1jb21taXQtaWQgdGVzdAorCitUaGlzIHRlc3QgY292ZXJzIHRoZSB0b3BpY3Mgb2YgZmlsZSBjb250ZW50cywgY29tbWl0IGRhdGUgaGFuZGxpbmcgYW5kCitjb21taXQgaWQgZW1iZWRkaW5nOgorCisgIFRoZSBjb250ZW50cyBvZiB0aGUgcmVwb3NpdG9yeSBpcyBjb21wYXJlZCB0byB0aGUgZXh0cmFjdGVkIHRhcgorICBhcmNoaXZlLiAgVGhlIHJlcG9zaXRvcnkgY29udGFpbnMgc2ltcGxlIHRleHQgZmlsZXMsIHN5bWxpbmtzIGFuZCBhCisgIGJpbmFyeSBmaWxlICgvYmluL3NoKS4gIE9ubHkgcGF0aGVzIHNob3J0ZXIgdGhhbiA5OSBjaGFyYWN0ZXJzIGFyZQorICB1c2VkLgorCisgIGdpdC10YXItdHJlZSBhcHBsaWVzIHRoZSBjb21taXQgZGF0ZSB0byBldmVyeSBmaWxlIGluIHRoZSBhcmNoaXZlIGl0CisgIGNyZWF0ZXMuICBUaGUgdGVzdCBzZXRzIHRoZSBjb21taXQgZGF0ZSB0byBhIHNwZWNpZmljIHZhbHVlIGFuZCBjaGVja3MKKyAgaWYgdGhlIHRhciBhcmNoaXZlIGNvbnRhaW5zIHRoYXQgdmFsdWUuCisKKyAgV2hlbiBnaXZpbmcgZ2l0LXRhci10cmVlIGEgY29tbWl0IGlkIChpbiBjb250cmFzdCB0byBhIHRyZWUgaWQpIGl0CisgIGVtYmVkcyB0aGlzIGNvbW1pdCBpZCBpbnRvIHRoZSB0YXIgYXJjaGl2ZSBhcyBhIGNvbW1lbnQuICBUaGUgdGVzdAorICBjaGVja3MgdGhlIGFiaWxpdHkgb2YgZ2l0LWdldC10YXItY29tbWl0LWlkIHRvIGZpZ3VyZSBpdCBvdXQgZnJvbSB0aGUKKyAgdGFyIGZpbGUuCisKKycKKworLiAuL3Rlc3QtbGliLnNoCitUQVI9JHtUQVI6LXRhcn0KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BvcHVsYXRlIHdvcmtkaXInIFwKKyAgICAnbWtkaXIgYSBiIGMgJiYKKyAgICAgZWNobyBzaW1wbGUgdGV4dGZpbGUgPmEvYSAmJgorICAgICBta2RpciBhL2JpbiAmJgorICAgICBjcCAvYmluL3NoIGEvYmluICYmCisgICAgIGxuIC1zIGEgYS9sMSAmJgorICAgICAocD1sb25nX3BhdGhfdG9fYV9maWxlICYmIGNkIGEgJiYKKyAgICAgIGZvciBkZXB0aCBpbiAxIDIgMyA0IDU7IGRvIG1rZGlyICRwICYmIGNkICRwOyBkb25lICYmCisgICAgICBlY2hvIHRleHQgPmZpbGVfd2l0aF9sb25nX3BhdGgpICYmCisgICAgIChjZCBhICYmIGZpbmQgLikgfCBzb3J0ID5hLmxzdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FkZCBmaWxlcyB0byByZXBvc2l0b3J5JyBcCisgICAgJ2ZpbmQgYSAtdHlwZSBmIHwgeGFyZ3MgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAmJgorICAgICBmaW5kIGEgLXR5cGUgbCB8IHhhcmdzIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgJiYKKyAgICAgdHJlZWlkPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyAkdHJlZWlkID50cmVlaWQgJiYKKyAgICAgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkKFRaPUdNVCBHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjcgMjI6MDA6MDAiIFwKKyAgICAgZ2l0LWNvbW1pdC10cmVlICR0cmVlaWQgPC9kZXYvbnVsbCknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdGFyLXRyZWUnIFwKKyAgICAnZ2l0LXRhci10cmVlIEhFQUQgPmIudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZSBtb2RpZmljYXRpb24gdGltZScgXAorICAgICdUWj1HTVQgJFRBUiB0dmYgYi50YXIgYS9hIHwKKyAgICAgYXdrIFx7cHJpbnRcIFwkNCxcIFwobGVuZ3RoXChcJDVcKVw8N1wpXCA/XCBcJDVcIjowMFwiXCA6XCBcJDVcfSBcCisgICAgID5iLm10aW1lICYmCisgICAgIGVjaG8gIjIwMDUtMDUtMjcgMjI6MDA6MDAiID5leHBlY3RlZC5tdGltZSAmJgorICAgICBkaWZmIGV4cGVjdGVkLm10aW1lIGIubXRpbWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtZ2V0LXRhci1jb21taXQtaWQnIFwKKyAgICAnZ2l0LWdldC10YXItY29tbWl0LWlkIDxiLnRhciA+Yi5jb21taXRpZCAmJgorICAgICBkaWZmIC5naXQvJChnaXQtc3ltYm9saWMtcmVmIEhFQUQpIGIuY29tbWl0aWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdleHRyYWN0IHRhciBhcmNoaXZlJyBcCisgICAgJyhjZCBiICYmICRUQVIgeGYgLSkgPGIudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZW5hbWVzJyBcCisgICAgJyhjZCBiL2EgJiYgZmluZCAuKSB8IHNvcnQgPmIubHN0ICYmCisgICAgIGRpZmYgYS5sc3QgYi5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlIGNvbnRlbnRzJyBcCisgICAgJ2RpZmYgLXIgYSBiL2EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdGFyLXRyZWUgd2l0aCBwcmVmaXgnIFwKKyAgICAnZ2l0LXRhci10cmVlIEhFQUQgcHJlZml4ID5jLnRhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2V4dHJhY3QgdGFyIGFyY2hpdmUgd2l0aCBwcmVmaXgnIFwKKyAgICAnKGNkIGMgJiYgJFRBUiB4ZiAtKSA8Yy50YXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlbmFtZXMgd2l0aCBwcmVmaXgnIFwKKyAgICAnKGNkIGMvcHJlZml4L2EgJiYgZmluZCAuKSB8IHNvcnQgPmMubHN0ICYmCisgICAgIGRpZmYgYS5sc3QgYy5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlIGNvbnRlbnRzIHdpdGggcHJlZml4JyBcCisgICAgJ2RpZmYgLXIgYSBjL3ByZWZpeC9hJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDUzMDAtcGFjay1vYmplY3Quc2ggYi90L3Q1MzAwLXBhY2stb2JqZWN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlNDVhYzQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MzAwLXBhY2stb2JqZWN0LnNoCkBAIC0wLDAgKzEsMTk5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1wYWNrLW9iamVjdAorCisnCisuIC4vdGVzdC1saWIuc2gKKworVFJBU0g9YHB3ZGAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NldHVwJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXgqCisgICAgIGZvciBpIGluIGEgYiBjCisgICAgIGRvCisJICAgICBkZCBpZj0vZGV2L3plcm8gYnM9NGsgY291bnQ9MSB8IHRyICJcXDAiICRpID4kaSAmJgorCSAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAkaSB8fCByZXR1cm4gMQorICAgICBkb25lICYmCisgICAgIGNhdCBjID5kICYmIGVjaG8gZm9vID4+ZCAmJiBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGQgJiYKKyAgICAgdHJlZT1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGNvbW1pdD1gZ2l0LWNvbW1pdC10cmVlICR0cmVlIDwvZGV2L251bGxgICYmIHsKKwkgZWNobyAkdHJlZSAmJgorCSBlY2hvICRjb21taXQgJiYKKwkgZ2l0LWxzLXRyZWUgJHRyZWUgfCBzZWQgLWUgInMvLiogXFwoWzAtOWEtZl0qXFwpCS4qL1xcMS8iCisgICAgIH0gPm9iai1saXN0ICYmIHsKKwkgZ2l0LWRpZmYtdHJlZSAtLXJvb3QgLXAgJGNvbW1pdCAmJgorCSB3aGlsZSByZWFkIG9iamVjdAorCSBkbworCSAgICB0PWBnaXQtY2F0LWZpbGUgLXQgJG9iamVjdGAgJiYKKwkgICAgZ2l0LWNhdC1maWxlICR0ICRvYmplY3QgfHwgcmV0dXJuIDEKKwkgZG9uZSA8b2JqLWxpc3QKKyAgICAgfSA+ZXhwZWN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncGFjayB3aXRob3V0IGRlbHRhJyBcCisgICAgJ3BhY2tuYW1lXzE9JChnaXQtcGFjay1vYmplY3RzIC0td2luZG93PTAgdGVzdC0xIDxvYmotbGlzdCknCisKK3JtIC1mciAuZ2l0MgorbWtkaXIgLmdpdDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VucGFjayB3aXRob3V0IGRlbHRhJyBcCisgICAgIkdJVF9PQkpFQ1RfRElSRUNUT1JZPS5naXQyL29iamVjdHMgJiYKKyAgICAgZXhwb3J0IEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisgICAgIGdpdC1pbml0LWRiICYmCisgICAgIGdpdC11bnBhY2stb2JqZWN0cyAtbiA8dGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayAmJgorICAgICBnaXQtdW5wYWNrLW9iamVjdHMgPHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2siCisKK3Vuc2V0IEdJVF9PQkpFQ1RfRElSRUNUT1JZCitjZCAiJFRSQVNILy5naXQyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgdW5wYWNrIHdpdGhvdXQgZGVsdGEnIFwKKyAgICAnKGNkIC4uLy5naXQgJiYgZmluZCBvYmplY3RzIC10eXBlIGYgLXByaW50KSB8CisgICAgIHdoaWxlIHJlYWQgcGF0aAorICAgICBkbworICAgICAgICAgY21wICRwYXRoIC4uLy5naXQvJHBhdGggfHwgeworCSAgICAgZWNobyAkcGF0aCBkaWZmZXJzLgorCSAgICAgcmV0dXJuIDEKKwkgfQorICAgICBkb25lJworY2QgIiRUUkFTSCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BhY2sgd2l0aCBkZWx0YScgXAorICAgICdwd2QgJiYKKyAgICAgcGFja25hbWVfMj0kKGdpdC1wYWNrLW9iamVjdHMgdGVzdC0yIDxvYmotbGlzdCknCisKK3JtIC1mciAuZ2l0MgorbWtkaXIgLmdpdDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VucGFjayB3aXRoIGRlbHRhJyBcCisgICAgJ0dJVF9PQkpFQ1RfRElSRUNUT1JZPS5naXQyL29iamVjdHMgJiYKKyAgICAgZXhwb3J0IEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisgICAgIGdpdC1pbml0LWRiICYmCisgICAgIGdpdC11bnBhY2stb2JqZWN0cyAtbiA8dGVzdC0yLSR7cGFja25hbWVfMn0ucGFjayAmJgorICAgICBnaXQtdW5wYWNrLW9iamVjdHMgPHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2snCisKK3Vuc2V0IEdJVF9PQkpFQ1RfRElSRUNUT1JZCitjZCAiJFRSQVNILy5naXQyIgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNrIHVucGFjayB3aXRoIGRlbHRhJyBcCisgICAgJyhjZCAuLi8uZ2l0ICYmIGZpbmQgb2JqZWN0cyAtdHlwZSBmIC1wcmludCkgfAorICAgICB3aGlsZSByZWFkIHBhdGgKKyAgICAgZG8KKyAgICAgICAgIGNtcCAkcGF0aCAuLi8uZ2l0LyRwYXRoIHx8IHsKKwkgICAgIGVjaG8gJHBhdGggZGlmZmVycy4KKwkgICAgIHJldHVybiAxCisJIH0KKyAgICAgZG9uZScKK2NkICIkVFJBU0giCisKK3JtIC1mciAuZ2l0MgorbWtkaXIgLmdpdDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSBwYWNrZWQgb2JqZWN0cycgXAorICAgICdHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBnaXQtaW5pdC1kYiAmJgorICAgICBjcCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrIHRlc3QtMS0ke3BhY2tuYW1lXzF9LmlkeCAuZ2l0Mi9vYmplY3RzL3BhY2sgJiYgeworCSBnaXQtZGlmZi10cmVlIC0tcm9vdCAtcCAkY29tbWl0ICYmCisJIHdoaWxlIHJlYWQgb2JqZWN0CisJIGRvCisJICAgIHQ9YGdpdC1jYXQtZmlsZSAtdCAkb2JqZWN0YCAmJgorCSAgICBnaXQtY2F0LWZpbGUgJHQgJG9iamVjdCB8fCByZXR1cm4gMQorCSBkb25lIDxvYmotbGlzdAorICAgIH0gPmN1cnJlbnQgJiYKKyAgICBkaWZmIGV4cGVjdCBjdXJyZW50JworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgcGFja2VkIGRlbHRpZmllZCBvYmplY3RzJyBcCisgICAgJ0dJVF9PQkpFQ1RfRElSRUNUT1JZPS5naXQyL29iamVjdHMgJiYKKyAgICAgZXhwb3J0IEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisgICAgIHJtIC1mIC5naXQyL29iamVjdHMvcGFjay90ZXN0LT8uaWR4ICYmCisgICAgIGNwIHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2sgdGVzdC0yLSR7cGFja25hbWVfMn0uaWR4IC5naXQyL29iamVjdHMvcGFjayAmJiB7CisJIGdpdC1kaWZmLXRyZWUgLS1yb290IC1wICRjb21taXQgJiYKKwkgd2hpbGUgcmVhZCBvYmplY3QKKwkgZG8KKwkgICAgdD1gZ2l0LWNhdC1maWxlIC10ICRvYmplY3RgICYmCisJICAgIGdpdC1jYXQtZmlsZSAkdCAkb2JqZWN0IHx8IHJldHVybiAxCisJIGRvbmUgPG9iai1saXN0CisgICAgfSA+Y3VycmVudCAmJgorICAgIGRpZmYgZXhwZWN0IGN1cnJlbnQnCisKK3Vuc2V0IEdJVF9PQkpFQ1RfRElSRUNUT1JZCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2ZXJpZnkgcGFjaycgXAorICAgICdnaXQtdmVyaWZ5LXBhY2sgdGVzdC0xLSR7cGFja25hbWVfMX0uaWR4IHRlc3QtMi0ke3BhY2tuYW1lXzJ9LmlkeCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvcnJ1cHQgYSBwYWNrIGFuZCBzZWUgaWYgdmVyaWZ5IGNhdGNoZXMnIFwKKyAgICAnY3AgdGVzdC0xLSR7cGFja25hbWVfMX0uaWR4IHRlc3QtMy5pZHggJiYKKyAgICAgY3AgdGVzdC0yLSR7cGFja25hbWVfMn0ucGFjayB0ZXN0LTMucGFjayAmJgorICAgICBpZiBnaXQtdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmkgJiYKKworICAgICA6IFBBQ0tfU0lHTkFUVVJFICYmCisgICAgIGNwIHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgZGQgaWY9L2Rldi96ZXJvIG9mPXRlc3QtMy5wYWNrIGNvdW50PTEgYnM9MSBjb252PW5vdHJ1bmMgc2Vlaz0yICYmCisgICAgIGlmIGdpdC12ZXJpZnktcGFjayB0ZXN0LTMuaWR4CisgICAgIHRoZW4gZmFsc2UKKyAgICAgZWxzZSA6OworICAgICBmaSAmJgorCisgICAgIDogUEFDS19WRVJTSU9OICYmCisgICAgIGNwIHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgZGQgaWY9L2Rldi96ZXJvIG9mPXRlc3QtMy5wYWNrIGNvdW50PTEgYnM9MSBjb252PW5vdHJ1bmMgc2Vlaz03ICYmCisgICAgIGlmIGdpdC12ZXJpZnktcGFjayB0ZXN0LTMuaWR4CisgICAgIHRoZW4gZmFsc2UKKyAgICAgZWxzZSA6OworICAgICBmaSAmJgorCisgICAgIDogVFlQRS9TSVpFIGJ5dGUgb2YgdGhlIGZpcnN0IHBhY2tlZCBvYmplY3QgZGF0YSAmJgorICAgICBjcCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMucGFjayBjb3VudD0xIGJzPTEgY29udj1ub3RydW5jIHNlZWs9MTIgJiYKKyAgICAgaWYgZ2l0LXZlcmlmeS1wYWNrIHRlc3QtMy5pZHgKKyAgICAgdGhlbiBmYWxzZQorICAgICBlbHNlIDo7CisgICAgIGZpICYmCisKKyAgICAgOiBzdW0gb2YgdGhlIGluZGV4IGZpbGUgaXRzZWxmICYmCisgICAgIGw9YHdjIC1jIDx0ZXN0LTMuaWR4YCAmJgorICAgICBsPWBleHByICRsIC0gMjBgICYmCisgICAgIGNwIHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgZGQgaWY9L2Rldi96ZXJvIG9mPXRlc3QtMy5pZHggY291bnQ9MjAgYnM9MSBjb252PW5vdHJ1bmMgc2Vlaz0kbCAmJgorICAgICBpZiBnaXQtdmVyaWZ5LXBhY2sgdGVzdC0zLnBhY2sKKyAgICAgdGhlbiBmYWxzZQorICAgICBlbHNlIDo7CisgICAgIGZpICYmCisKKyAgICAgOicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2J1aWxkIHBhY2sgaW5kZXggZm9yIGFuIGV4aXN0aW5nIHBhY2snIFwKKyAgICAnY3AgdGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayB0ZXN0LTMucGFjayAmJgorICAgICBnaXQtaW5kZXgtcGFjayAtbyB0bXAuaWR4IHRlc3QtMy5wYWNrICYmCisgICAgIGNtcCB0bXAuaWR4IHRlc3QtMS0ke3BhY2tuYW1lXzF9LmlkeCAmJgorCisgICAgIGdpdC1pbmRleC1wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGNtcCB0ZXN0LTMuaWR4IHRlc3QtMS0ke3BhY2tuYW1lXzF9LmlkeCAmJgorCisgICAgIGNwIHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgZ2l0LWluZGV4LXBhY2sgLW8gdG1wLmlkeCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrICYmCisgICAgIGNtcCB0bXAuaWR4IHRlc3QtMi0ke3BhY2tuYW1lXzJ9LmlkeCAmJgorCisgICAgIGdpdC1pbmRleC1wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGNtcCB0ZXN0LTMuaWR4IHRlc3QtMi0ke3BhY2tuYW1lXzJ9LmlkeCAmJgorCisgICAgIDonCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTQwMC1zZW5kLXBhY2suc2ggYi90L3Q1NDAwLXNlbmQtcGFjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMzY5NGFjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTQwMC1zZW5kLXBhY2suc2gKQEAgLTAsMCArMSw2NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdTZWUgd2h5IHJld2luZGluZyBoZWFkIGJyZWFrcyBzZW5kLXBhY2sKKworJworLiAuL3Rlc3QtbGliLnNoCisKK3RvdWNoIGNwaW8tdGVzdAordGVzdF9leHBlY3Rfc3VjY2VzcyAnd29ya2luZyBjcGlvJyAnZWNobyBjcGlvLXRlc3QgfCBjcGlvIC1vID4gL2Rldi9udWxsJworCitjbnQ9JzEnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwl0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisJY29tbWl0PSQoZWNobyAiQ29tbWl0ICMwIiB8IGdpdC1jb21taXQtdHJlZSAkdHJlZSkgJiYKKwl6ZXJvPSRjb21taXQgJiYKKwlwYXJlbnQ9JHplcm8gJiYKKwlmb3IgaSBpbiAkY250CisJZG8KKwkgICAgc2xlZXAgMSAmJgorCSAgICBjb21taXQ9JChlY2hvICJDb21taXQgIyRpIiB8IGdpdC1jb21taXQtdHJlZSAkdHJlZSAtcCAkcGFyZW50KSAmJgorCSAgICBwYXJlbnQ9JGNvbW1pdCB8fCByZXR1cm4gMQorCWRvbmUgJiYKKwlnaXQtdXBkYXRlLXJlZiBIRUFEICIkY29tbWl0IiAmJgorCWdpdC1jbG9uZSAtbCAuLy4gdmljdGltICYmCisJY2QgdmljdGltICYmCisJZ2l0LWxvZyAmJgorCWNkIC4uICYmCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAiJHplcm8iICYmCisJcGFyZW50PSR6ZXJvICYmCisJZm9yIGkgaW4gJGNudAorCWRvCisJICAgIHNsZWVwIDEgJiYKKwkgICAgY29tbWl0PSQoZWNobyAiUmViYXNlICMkaSIgfCBnaXQtY29tbWl0LXRyZWUgJHRyZWUgLXAgJHBhcmVudCkgJiYKKwkgICAgcGFyZW50PSRjb21taXQgfHwgcmV0dXJuIDEKKwlkb25lICYmCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAiJGNvbW1pdCIgJiYKKwllY2hvIFJlYmFzZSAmJgorCWdpdC1sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAncHVzaGluZyByZXdvdW5kIGhlYWQgc2hvdWxkIG5vdCBiYXJmIGJ1dCByZXF1aXJlIC0tZm9yY2UnICcgCisJIyBzaG91bGQgbm90IGZhaWwgYnV0IHJlZnVzZSB0byB1cGRhdGUuCisJaWYgZ2l0LXNlbmQtcGFjayAuL3ZpY3RpbS8uZ2l0LyBtYXN0ZXIKKwl0aGVuCisJCSMgbm93IGl0IHNob3VsZCBmYWlsIHdpdGggUGFza3kgcGF0Y2gKKwkJZWNobyA+JjIgR2FhaCwgaXQgc2hvdWxkIGhhdmUgZmFpbGVkLgorCQlmYWxzZQorCWVsc2UKKwkJZWNobyA+JjIgVGhhbmtzLCBpdCBjb3JyZWN0bHkgZmFpbGVkLgorCQl0cnVlCisJZmkgJiYKKwlpZiBjbXAgdmljdGltLy5naXQvcmVmcy9oZWFkcy9tYXN0ZXIgLmdpdC9yZWZzL2hlYWRzL21hc3RlcgorCXRoZW4KKwkJIyBzaG91bGQgaGF2ZSBiZWVuIGxlZnQgYXMgaXQgd2FzIQorCQlmYWxzZQorCWVsc2UKKwkJdHJ1ZQorCWZpICYmCisJIyB0aGlzIHNob3VsZCB1cGRhdGUKKwlnaXQtc2VuZC1wYWNrIC0tZm9yY2UgLi92aWN0aW0vLmdpdC8gbWFzdGVyICYmCisJY21wIHZpY3RpbS8uZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NTAwLWZldGNoLXBhY2suc2ggYi90L3Q1NTAwLWZldGNoLXBhY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc2MjVhNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MDAtZmV0Y2gtcGFjay5zaApAQCAtMCwwICsxLDEzMSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3RpbmcgbXVsdGlfYWNrIHBhY2sgZmV0Y2hpbmcKKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgVGVzdCBmZXRjaC1wYWNrL3VwbG9hZC1wYWNrIHBhaXIuCisKKyMgU29tZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKworYWRkICgpIHsKKwluYW1lPSQxCisJdGV4dD0iJEAiCisJYnJhbmNoPWBlY2hvICRuYW1lIHwgc2VkIC1lICdzL15cKC5cKS4qJC9cMS8nYAorCXBhcmVudHM9IiIKKworCXNoaWZ0CisJd2hpbGUgdGVzdCAkMTsgZG8KKwkJcGFyZW50cz0iJHBhcmVudHMgLXAgJDEiCisJCXNoaWZ0CisJZG9uZQorCisJZWNobyAiJHRleHQiID4gdGVzdC50eHQKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHRlc3QudHh0CisJdHJlZT0kKGdpdC13cml0ZS10cmVlKQorCSMgbWFrZSBzdXJlIHRpbWVzdGFtcHMgYXJlIGluIGNvcnJlY3Qgb3JkZXIKKwlzZWM9JCgoJHNlYysxKSkKKwljb21taXQ9JChlY2hvICIkdGV4dCIgfCBHSVRfQVVUSE9SX0RBVEU9JHNlYyBcCisJCWdpdC1jb21taXQtdHJlZSAkdHJlZSAkcGFyZW50cyAyPj5sb2cyLnR4dCkKKwlleHBvcnQgJG5hbWU9JGNvbW1pdAorCWVjaG8gJGNvbW1pdCA+IC5naXQvcmVmcy9oZWFkcy8kYnJhbmNoCisJZXZhbCAke2JyYW5jaH1USVA9JGNvbW1pdAorfQorCitjb3VudF9vYmplY3RzICgpIHsKKwlscyAuZ2l0L29iamVjdHMvPz8vKiAyPj5sb2cyLnR4dCB8IHdjIC1sIHwgdHIgLWQgIiAiCit9CisKK3Rlc3RfZXhwZWN0X29iamVjdF9jb3VudCAoKSB7CisJbWVzc2FnZT0kMQorCWNvdW50PSQyCisKKwlvdXRwdXQ9IiQoY291bnRfb2JqZWN0cykiCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJCSJuZXcgb2JqZWN0IGNvdW50ICRtZXNzYWdlIiBcCisJCSJ0ZXN0ICRjb3VudCA9ICRvdXRwdXQiCit9CisKK3B1bGxfdG9fY2xpZW50ICgpIHsKKwludW1iZXI9JDEKKwloZWFkcz0kMgorCWNvdW50PSQzCisJbm9fc3RyaWN0X2NvdW50X2NoZWNrPSQ0CisKKwljZCBjbGllbnQKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbnVtYmVyIHB1bGwiIFwKKwkJImdpdC1mZXRjaC1wYWNrIC1rIC12IC4uICRoZWFkcyIKKwljYXNlICIkaGVhZHMiIGluICpBKikgZWNobyAkQVRJUCA+IC5naXQvcmVmcy9oZWFkcy9BOzsgZXNhYworCWNhc2UgIiRoZWFkcyIgaW4gKkIqKSBlY2hvICRCVElQID4gLmdpdC9yZWZzL2hlYWRzL0I7OyBlc2FjCisJZ2l0LXN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvYGVjaG8gJGhlYWRzIHwgc2VkIC1lICdzL15cKC5cKS4qJC9cMS8nYAorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZnNjayIgJ2dpdC1mc2NrLW9iamVjdHMgLS1mdWxsID4gZnNjay50eHQgMj4mMScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGRvd25sb2FkZWQgcmVzdWx0cycgXAorCSdtdiAuZ2l0L29iamVjdHMvcGFjay9wYWNrLSogLiAmJgorCSBwPWBscyAtMSBwYWNrLSoucGFja2AgJiYKKwkgZ2l0LXVucGFjay1vYmplY3RzIDwkcCAmJgorCSBnaXQtZnNjay1vYmplY3RzIC0tZnVsbCcKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIm5ldyBvYmplY3QgY291bnQgYWZ0ZXIgJG51bWJlciBwdWxsIiBcCisJJ2lkeD1gZWNobyBwYWNrLSouaWR4YCAmJgorCSBwYWNrX2NvdW50PWBnaXQtc2hvdy1pbmRleCA8JGlkeCB8IHdjIC1sYCAmJgorCSB0ZXN0ICRwYWNrX2NvdW50ID0gJGNvdW50JworCXRlc3QgLXogIiRwYWNrX2NvdW50IiAmJiBwYWNrX2NvdW50PTAKKwlpZiBbIC16ICIkbm9fc3RyaWN0X2NvdW50X2NoZWNrIiBdOyB0aGVuCisJCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIm1pbmltYWwgY291bnQiICJ0ZXN0ICRjb3VudCA9ICRwYWNrX2NvdW50IgorCWVsc2UKKwkJdGVzdCAkY291bnQgIT0gJHBhY2tfY291bnQgJiYgXAorCQkJZWNobyAiV0FSTklORzogJHBhY2tfY291bnQgb2JqZWN0cyB0cmFuc21pdHRlZCwgb25seSAkY291bnQgb2Ygd2hpY2ggd2VyZSBuZWVkZWQiCisJZmkKKwlybSAtZiBwYWNrLSoKKwljZCAuLgorfQorCisjIEhlcmUgYmVnaW5zIHRoZSBhY3R1YWwgdGVzdGluZworCisjIEExIC0gLi4uIC0gQTIwIC0gQTIxCisjICAgIFwKKyMgICAgICBCMSAgLSAgIEIyIC0gLi4gLSBCNzAKKworIyBjbGllbnQgcHVsbHMgQTIwLCBCMS4gVGhlbiB0cmFja3Mgb25seSBCLiBUaGVuIHB1bGxzIEEuCisKKygKKwlta2RpciBjbGllbnQgJiYKKwljZCBjbGllbnQgJiYKKwlnaXQtaW5pdC1kYiAyPj4gbG9nMi50eHQKKykKKworYWRkIEExCisKK3ByZXY9MTsgY3VyPTI7IHdoaWxlIFsgJGN1ciAtbGUgMTAgXTsgZG8KKwlhZGQgQSRjdXIgJChldmFsIGVjaG8gXCRBJHByZXYpCisJcHJldj0kY3VyCisJY3VyPSQoKCRjdXIrMSkpCitkb25lCisKK2FkZCBCMSAkQTEKKworZWNobyAkQVRJUCA+IC5naXQvcmVmcy9oZWFkcy9BCitlY2hvICRCVElQID4gLmdpdC9yZWZzL2hlYWRzL0IKK2dpdC1zeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzL0IKKworcHVsbF90b19jbGllbnQgMXN0ICJCIEEiICQoKDExKjMpKQorCithZGQgQTExICRBMTAKKworcHJldj0xOyBjdXI9Mjsgd2hpbGUgWyAkY3VyIC1sZSA2NSBdOyBkbworCWFkZCBCJGN1ciAkKGV2YWwgZWNobyBcJEIkcHJldikKKwlwcmV2PSRjdXIKKwljdXI9JCgoJGN1cisxKSkKK2RvbmUKKworcHVsbF90b19jbGllbnQgMm5kICJCIiAkKCg2NCozKSkKKworcHVsbF90b19jbGllbnQgM3JkICJBIiAkKCgxKjMpKSAjIG9sZCBmYWlscworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU2MDAtY2xvbmUtZmFpbC1jbGVhbnVwLnNoIGIvdC90NTYwMC1jbG9uZS1mYWlsLWNsZWFudXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGM2YTM2MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU2MDAtY2xvbmUtZmFpbC1jbGVhbnVwLnNoCkBAIC0wLDAgKzEsMzYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgQ2FybCBELiBXb3J0aCA8Y3dvcnRoQGN3b3J0aC5vcmc+CisjCisKK3Rlc3RfZGVzY3JpcHRpb249J3Rlc3QgZ2l0LWNsb25lIHRvIGNsZWFudXAgYWZ0ZXIgZmFpbHVyZQorCitUaGlzIHRlc3QgY292ZXJzIHRoZSBmYWN0IHRoYXQgaWYgZ2l0LWNsb25lIGZhaWxzLCBpdCBzaG91bGQgcmVtb3ZlCit0aGUgZGlyZWN0b3J5IGl0IGNyZWF0ZWQsIHRvIGF2b2lkIHRoZSB1c2VyIGhhdmluZyB0byBtYW51YWxseQorcmVtb3ZlIHRoZSBkaXJlY3RvcnkgYmVmb3JlIGF0dGVtcHRpbmcgYSBjbG9uZSBhZ2Fpbi4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2xvbmUgb2Ygbm9uLWV4aXN0ZW50IHNvdXJjZSBzaG91bGQgZmFpbCcgXAorICAgICdnaXQtY2xvbmUgZm9vIGJhcicKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2ZhaWxlZCBjbG9uZSBzaG91bGQgbm90IGxlYXZlIGEgZGlyZWN0b3J5JyBcCisgICAgJ2NkIGJhcicKKworIyBOZWVkIGEgcmVwbyB0byBjbG9uZQordGVzdF9jcmVhdGVfcmVwbyBmb28KKworIyBjbG9uZSBkb2Vzbid0IGxpa2UgaXQgaWYgdGhlcmUgaXMgbm8gSEVBRC4gSXMgdGhhdCBhIGJ1Zz8KKyhjZCBmb28gJiYgdG91Y2ggZmlsZSAmJiBnaXQgYWRkIGZpbGUgJiYgZ2l0IGNvbW1pdCAtbSAnYWRkIGZpbGUnID4vZGV2L251bGwgMj4mMSkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2Nsb25lIHNob3VsZCB3b3JrIG5vdyB0aGF0IHNvdXJjZSBleGlzdHMnIFwKKyAgICAnZ2l0LWNsb25lIGZvbyBiYXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzdWNjZXNzZnVsbCBjbG9uZSBtdXN0IGxlYXZlIHRoZSBkaXJlY3RvcnknIFwKKyAgICAnY2QgYmFyJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU3MDAtY2xvbmUtcmVmZXJlbmNlLnNoIGIvdC90NTcwMC1jbG9uZS1yZWZlcmVuY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTE2ZWUxNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU3MDAtY2xvbmUtcmVmZXJlbmNlLnNoCkBAIC0wLDAgKzEsNzggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgTWFydGluIFdhaXR6IDx0YWxpQGFkbWluZ2lsZGUub3JnPgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGNsb25lIC0tcmVmZXJlbmNlJworLiAuL3Rlc3QtbGliLnNoCisKK2Jhc2VfZGlyPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmluZyBmaXJzdCByZXBvc2l0b3J5JyBcCisndGVzdF9jcmVhdGVfcmVwbyBBICYmIGNkIEEgJiYKK2VjaG8gZmlyc3QgPiBmaWxlMSAmJgorZ2l0IGFkZCBmaWxlMSAmJgorZ2l0IGNvbW1pdCAtbSBpbml0aWFsJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgc2Vjb25kIHJlcG9zaXRvcnknIFwKKydnaXQgY2xvbmUgQSBCICYmIGNkIEIgJiYKK2VjaG8gc2Vjb25kID4gZmlsZTIgJiYKK2dpdCBhZGQgZmlsZTIgJiYKK2dpdCBjb21taXQgLW0gYWRkaXRpb24gJiYKK2dpdCByZXBhY2sgLWEgLWQgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmluZyB3aXRoIHJlZmVyZW5jZScgXAorJ2dpdCBjbG9uZSAtbCAtcyAtLXJlZmVyZW5jZSBCIEEgQycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZXhpc3RhbmNlIG9mIGluZm8vYWx0ZXJuYXRlcycgXAorJ3Rlc3QgYHdjIC1sIDxDLy5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXNgID0gMicKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbGluZyBmcm9tIHJlZmVyZW5jZScgXAorJ2NkIEMgJiYKK2dpdCBwdWxsIC4uL0InCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RoYXQgcmVmZXJlbmNlIGdldHMgdXNlZCcgXAorJ2NkIEMgJiYKK2VjaG8gIjAgb2JqZWN0cywgMCBraWxvYnl0ZXMiID4gZXhwZWN0ZWQgJiYKK2dpdCBjb3VudC1vYmplY3RzID4gY3VycmVudCAmJgorZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGluZyBvcmlnaW4nIFwKKydjZCBBICYmCitlY2hvIHRoaXJkID4gZmlsZTMgJiYKK2dpdCBhZGQgZmlsZTMgJiYKK2dpdCBjb21taXQgLW0gdXBkYXRlICYmCitnaXQgcmVwYWNrIC1hIC1kICYmCitnaXQgcHJ1bmUnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1bGxpbmcgY2hhbmdlcyBmcm9tIG9yaWdpbicgXAorJ2NkIEMgJiYKK2dpdCBwdWxsIG9yaWdpbicKKworY2QgIiRiYXNlX2RpciIKKworIyB0aGUgMiBsb2NhbCBvYmplY3RzIGFyZSBjb21taXQgYW5kIHRyZWUgZnJvbSB0aGUgbWVyZ2UKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RoYXQgYWx0ZXJuYXRlIHRvIG9yaWdpbiBnZXRzIHVzZWQnIFwKKydjZCBDICYmCitlY2hvICIyIG9iamVjdHMiID4gZXhwZWN0ZWQgJiYKK2dpdCBjb3VudC1vYmplY3RzIHwgY3V0IC1kLCAtZjEgPiBjdXJyZW50ICYmCitkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTcxMC1pbmZvLWFsdGVybmF0ZS5zaCBiL3QvdDU3MTAtaW5mby1hbHRlcm5hdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk3ZDAzNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU3MTAtaW5mby1hbHRlcm5hdGUuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgTWFydGluIFdhaXR6IDx0YWxpQGFkbWluZ2lsZGUub3JnPgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IHRyYW5zaXRpdmUgaW5mby9hbHRlcm5hdGUgZW50cmllcycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHRlc3QgdGhhdCBhIGZpbGUgaXMgbm90IHJlYWNoYWJsZSBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5CisjIGJ1dCB0aGF0IGl0IGlzIGFmdGVyIGNyZWF0aW5nIGEgaW5mby9hbHRlcm5hdGUgZW50cnkKK3JlYWNoYWJsZV92aWEoKSB7CisJYWx0ZXJuYXRlPSIkMSIKKwlmaWxlPSIkMiIKKwlpZiBnaXQgY2F0LWZpbGUgLWUgIkhFQUQ6JGZpbGUiOyB0aGVuIHJldHVybiAxOyBmaQorCWVjaG8gIiRhbHRlcm5hdGUiID4+IC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZQorCWdpdCBjYXQtZmlsZSAtZSAiSEVBRDokZmlsZSIKK30KKwordGVzdF92YWxpZF9yZXBvKCkgeworCWdpdCBmc2NrLW9iamVjdHMgLS1mdWxsID4gZnNjay5sb2cgJiYKKwl0ZXN0IGB3YyAtbCA8IGZzY2subG9nYCA9IDAKK30KKworYmFzZV9kaXI9YHB3ZGAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIGZpcnN0IHJlcG9zaXRvcnknIFwKKyd0ZXN0X2NyZWF0ZV9yZXBvIEEgJiYgY2QgQSAmJgorZWNobyAiSGVsbG8gV29ybGQiID4gZmlsZTEgJiYKK2dpdCBhZGQgZmlsZTEgJiYKK2dpdCBjb21taXQgLW0gIkluaXRpYWwgY29tbWl0IiBmaWxlMSAmJgorZ2l0IHJlcGFjayAtYSAtZCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgc2Vjb25kIHJlcG9zaXRvcnknIFwKKydnaXQgY2xvbmUgLWwgLXMgQSBCICYmIGNkIEIgJiYKK2VjaG8gImZvbyBiYXIiID4gZmlsZTIgJiYKK2dpdCBhZGQgZmlsZTIgJiYKK2dpdCBjb21taXQgLW0gIm5leHQgY29tbWl0IiBmaWxlMiAmJgorZ2l0IHJlcGFjayAtYSAtZCAtbCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgdGhpcmQgcmVwb3NpdG9yeScgXAorJ2dpdCBjbG9uZSAtbCAtcyBCIEMgJiYgY2QgQyAmJgorZWNobyAiR29vZGJ5ZSwgY3J1ZWwgd29ybGQiID4gZmlsZTMgJiYKK2dpdCBhZGQgZmlsZTMgJiYKK2dpdCBjb21taXQgLW0gIm9uZSBtb3JlIiBmaWxlMyAmJgorZ2l0IHJlcGFjayAtYSAtZCAtbCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdjcmVhdGluZyB0b28gZGVlcCBuZXN0aW5nJyBcCisnZ2l0IGNsb25lIC1sIC1zIEMgRCAmJgorZ2l0IGNsb25lIC1sIC1zIEQgRSAmJgorZ2l0IGNsb25lIC1sIC1zIEUgRiAmJgorZ2l0IGNsb25lIC1sIC1zIEYgRyAmJgordGVzdF92YWxpZF9yZXBvJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2YWxpZGl0eSBvZiB0aGlyZCByZXBvc2l0b3J5JyBcCisnY2QgQyAmJgordGVzdF92YWxpZF9yZXBvJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2YWxpZGl0eSBvZiBmb3VydGggcmVwb3NpdG9yeScgXAorJ2NkIEQgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnJlYWtpbmcgb2YgbG9vcHMnIFwKKyJlY2hvICckYmFzZV9kaXIvQi8uZ2l0L29iamVjdHMnID4+ICckYmFzZV9kaXInL0EvLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyYmCitjZCBDICYmCit0ZXN0X3ZhbGlkX3JlcG8iCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ3RoYXQgaW5mby9hbHRlcm5hdGVzIGlzIG5lY2Nlc3NhcnknIFwKKydjZCBDICYmCitybSAuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzICYmCit0ZXN0X3ZhbGlkX3JlcG8nCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RoYXQgcmVsYXRpdmUgYWx0ZXJuYXRlIGlzIHBvc3NpYmxlIGZvciBjdXJyZW50IGRpcicgXAorJ2NkIEMgJiYKK2VjaG8gIi4uLy4uLy4uL0IvLmdpdC9vYmplY3RzIiA+IC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3RfZmFpbHVyZSAndGhhdCByZWxhdGl2ZSBhbHRlcm5hdGUgaXMgb25seSBwb3NzaWJsZSBmb3IgY3VycmVudCBkaXInIFwKKydjZCBEICYmCit0ZXN0X3ZhbGlkX3JlcG8nCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q2MDAwbGliLnNoIGIvdC90NjAwMGxpYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDAyNjIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAwMGxpYi5zaApAQCAtMCwwICsxLDExNiBAQAorWyAtZCAuZ2l0L3JlZnMvdGFncyBdIHx8IG1rZGlyIC1wIC5naXQvcmVmcy90YWdzCisKKzo+IHNlZC5zY3JpcHQKKworIyBBbnN3ZXIgdGhlIHNoYTEgaGFzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFnLiBUaGUgdGFnIG11c3QgZXhpc3QgaW4gLmdpdCBvciAuZ2l0L3JlZnMvdGFncwordGFnKCkKK3sKKwlfdGFnPSQxCisJWyAtZiAuZ2l0L3JlZnMvdGFncy8kX3RhZyBdIHx8IGVycm9yICJ0YWc6IFwiJF90YWdcIiBkb2VzIG5vdCBleGlzdCIKKwljYXQgLmdpdC9yZWZzL3RhZ3MvJF90YWcKK30KKworIyBHZW5lcmF0ZSBhIGNvbW1pdCB1c2luZyB0aGUgdGV4dCBzcGVjaWZpZWQgdG8gbWFrZSBpdCB1bmlxdWUgYW5kIHRoZSB0cmVlCisjIG5hbWVkIGJ5IHRoZSB0YWcgc3BlY2lmaWVkLgordW5pcXVlX2NvbW1pdCgpCit7CisJX3RleHQ9JDEKKyAgICAgICAgX3RyZWU9JDIKKwlzaGlmdCAyCisgICAgCWVjaG8gJF90ZXh0IHwgZ2l0LWNvbW1pdC10cmVlICQodGFnICRfdHJlZSkgIiRAIgorfQorCisjIFNhdmUgdGhlIG91dHB1dCBvZiBhIGNvbW1hbmQgaW50byB0aGUgdGFnIHNwZWNpZmllZC4gUHJlcGVuZAorIyBhIHN1YnN0aXR1dGlvbiBzY3JpcHQgZm9yIHRoZSB0YWcgb250byB0aGUgZnJvbnQgb2Ygc2VkLnNjcmlwdAorc2F2ZV90YWcoKQoreworCV90YWc9JDEJCisJWyAtbiAiJF90YWciIF0gfHwgZXJyb3IgInVzYWdlOiBzYXZlX3RhZyB0YWcgY29tbWl0LWFyZ3MgLi4uIgorCXNoaWZ0IDEKKyAgICAJIiRAIiA+LmdpdC9yZWZzL3RhZ3MvJF90YWcKKworICAgICAgICBlY2hvICJzLyQodGFnICRfdGFnKS8kX3RhZy9nIiA+IHNlZC5zY3JpcHQudG1wCisJY2F0IHNlZC5zY3JpcHQgPj4gc2VkLnNjcmlwdC50bXAKKwlybSBzZWQuc2NyaXB0CisJbXYgc2VkLnNjcmlwdC50bXAgc2VkLnNjcmlwdAorfQorCisjIFJlcGxhY2UgdW5oZWxwZnVsIHNoYTEgaGFzaHNlcyB3aXRoIHRoZWlyIHN5bWJvbGljIGVxdWl2YWxlbnRzIAorZW50YWcoKQoreworCXNlZCAtZiBzZWQuc2NyaXB0Cit9CisKKyMgRXhlY3V0ZSBhIGNvbW1hbmQgYWZ0ZXIgZmlyc3Qgc2F2aW5nLCB0aGVuIHNldHRpbmcgdGhlIEdJVF9BVVRIT1JfRU1BSUwKKyMgdGFnIHRvIGEgc3BlY2lmaWVkIHZhbHVlLiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvbiByZXR1cm4uCithc19hdXRob3IoKQoreworCV9hdXRob3I9JDEKKwlzaGlmdCAxCisgICAgICAgIF9zYXZlPSRHSVRfQVVUSE9SX0VNQUlMCisKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJF9hdXRob3IiCisJIiRAIgorCWlmIHRlc3QgLXogIiRfc2F2ZSIKKwl0aGVuCisJCXVuc2V0IEdJVF9BVVRIT1JfRU1BSUwKKwllbHNlCisJCWV4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIkX3NhdmUiCisJZmkKK30KKworY29tbWl0X2RhdGUoKQoreworICAgICAgICBfY29tbWl0PSQxCisJZ2l0LWNhdC1maWxlIGNvbW1pdCAkX2NvbW1pdCB8IHNlZCAtbiAicy9eY29tbWl0dGVyIC4qPiBcKFswLTldKlwpIC4qL1wxL3AiIAorfQorCitvbl9jb21taXR0ZXJfZGF0ZSgpCit7CisgICAgX2RhdGU9JDEKKyAgICBzaGlmdCAxCisgICAgZXhwb3J0IEdJVF9DT01NSVRURVJfREFURT0iJF9kYXRlIgorICAgICIkQCIKKyAgICB1bnNldCBHSVRfQ09NTUlUVEVSX0RBVEUKK30KKworIyBFeGVjdXRlIGEgY29tbWFuZCBhbmQgc3VwcHJlc3MgYW55IGVycm9yIG91dHB1dC4KK2hpZGVfZXJyb3IoKQoreworCSIkQCIgMj4vZGV2L251bGwKK30KKworY2hlY2tfb3V0cHV0KCkKK3sKKwlfbmFtZT0kMQorCXNoaWZ0IDEKKwlpZiBldmFsICIkKiIgfCBlbnRhZyA+ICRfbmFtZS5hY3R1YWwKKwl0aGVuCisJCWRpZmYgJF9uYW1lLmV4cGVjdGVkICRfbmFtZS5hY3R1YWwKKwllbHNlCisJCXJldHVybiAxOworCWZpCit9CisKKyMgVHVybiBhIHJlYXNvbmFibGUgdGVzdCBkZXNjcmlwdGlvbiBpbnRvIGEgcmVhc29uYWJsZSB0ZXN0IG5hbWUuCisjIEFsbCBhbHBoYW51bXMgdHJhbnNsYXRlZCBpbnRvIC0ncyB3aGljaCBhcmUgdGhlbiBjb21wcmVzc2VkIGFuZCBzdHJpcHBlZAorIyBmcm9tIGZyb250IGFuZCBiYWNrLgorbmFtZV9mcm9tX2Rlc2NyaXB0aW9uKCkKK3sKKyAgICAgICAgdHIgIiciICctJyB8IHRyICd+YCFAIyQlXiYqKClfKz17fVtdfFw7OiI8PiwvPyAnICctJyB8IHRyIC1zICctJyB8IHRyICdbQS1aXScgJ1thLXpdJyB8IHNlZCAicy9eLSovLztzLy0qXCQvLyIKK30KKworCisjIEV4ZWN1dGUgdGhlIHRlc3QgZGVzY3JpYmVkIGJ5IHRoZSBmaXJzdCBhcmd1bWVudCwgYnkgZXZhbCdpbmcKKyMgY29tbWFuZCBsaW5lIHNwZWNpZmllZCBpbiB0aGUgMm5kIGFyZ3VtZW50LiBDaGVjayB0aGUgc3RhdHVzIGNvZGUKKyMgaXMgemVybyBhbmQgdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIHN0cmVhbSByZWFkIGZyb20gCisjIHN0ZGluLgordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MoKQorewkKKwlfZGVzY3JpcHRpb249JDEKKyAgICAgICAgX3Rlc3Q9JDIKKyAgICAgICAgWyAkIyAtZXEgMiBdIHx8IGVycm9yICJ1c2FnZTogdGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgZGVzY3JpcHRpb24gdGVzdCA8PEVPRiAuLi4gRU9GIgorICAgICAgICBfbmFtZT0kKGVjaG8gJF9kZXNjcmlwdGlvbiB8IG5hbWVfZnJvbV9kZXNjcmlwdGlvbikKKwljYXQgPiAkX25hbWUuZXhwZWN0ZWQKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkX2Rlc2NyaXB0aW9uIiAiY2hlY2tfb3V0cHV0ICRfbmFtZSBcIiRfdGVzdFwiIiAKK30KZGlmZiAtLWdpdCBhL3QvdDYwMDItcmV2LWxpc3QtYmlzZWN0LnNoIGIvdC90NjAwMi1yZXYtbGlzdC1iaXNlY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjkzZGU5YgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDItcmV2LWxpc3QtYmlzZWN0LnNoCkBAIC0wLDAgKzEsMjM4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvbiBTZXltb3VyCisjCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0cyBnaXQtcmV2LWxpc3QgLS1iaXNlY3QgZnVuY3Rpb25hbGl0eScKKworLiAuL3Rlc3QtbGliLnNoCisuIC4uL3Q2MDAwbGliLnNoICMgdDZ4eHggc3BlY2lmaWMgZnVuY3Rpb25zCisKKyMgdXNhZ2U6IHRlc3RfYmlzZWN0aW9uIG1heC1kaWZmIGJpc2VjdC1vcHRpb24gaGVhZCBecHJ1bmUuLi4KKyMKKyMgZS5nLiB0ZXN0X2Jpc2VjdGlvbiAxIC0tYmlzZWN0IGwxIF5sMAorIwordGVzdF9iaXNlY3Rpb25fZGlmZigpCit7CisJX21heF9kaWZmPSQxCisJX2Jpc2VjdF9vcHRpb249JDIKKwlzaGlmdCAyCisJX2Jpc2VjdGlvbj0kKGdpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gIiRAIikKKwlfbGlzdF9zaXplPSQoZ2l0LXJldi1saXN0ICIkQCIgfCB3YyAtbCkKKyAgICAgICAgX2hlYWQ9JDEKKwlzaGlmdCAxCisJX2Jpc2VjdGlvbl9zaXplPSQoZ2l0LXJldi1saXN0ICRfYmlzZWN0aW9uICIkQCIgfCB3YyAtbCkKKwlbIC1uICIkX2xpc3Rfc2l6ZSIgLWEgLW4gIiRfYmlzZWN0aW9uX3NpemUiIF0gfHwKKwllcnJvciAidGVzdF9iaXNlY3Rpb25fZGlmZiBmYWlsZWQiCisKKwkjIFRlc3QgaWYgYmlzZWN0aW9uIHNpemUgaXMgY2xvc2UgdG8gaGFsZiBvZiBsaXN0IHNpemUgd2l0aGluCisJIyB0b2xlcmFuY2UuCisJIyAKKwlfYmlzZWN0X2Vycj1gZXhwciAkX2xpc3Rfc2l6ZSAtICRfYmlzZWN0aW9uX3NpemUgXCogMmAKKwl0ZXN0ICIkX2Jpc2VjdF9lcnIiIC1sdCAwICYmIF9iaXNlY3RfZXJyPWBleHByIDAgLSAkX2Jpc2VjdF9lcnJgCisJX2Jpc2VjdF9lcnI9YGV4cHIgJF9iaXNlY3RfZXJyIC8gMmAgOyAjIGZsb29yCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiYmlzZWN0aW9uIGRpZmYgJF9iaXNlY3Rfb3B0aW9uICRfaGVhZCAkKiA8PSAkX21heF9kaWZmIiBcCisJJ3Rlc3QgJF9iaXNlY3RfZXJyIC1sZSAkX21heF9kaWZmJworfQorCitkYXRlID5wYXRoMAorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMAorc2F2ZV90YWcgdHJlZSBnaXQtd3JpdGUtdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDAiIGhpZGVfZXJyb3Igc2F2ZV90YWcgcm9vdCB1bmlxdWVfY29tbWl0IHJvb3QgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIGwwIHVuaXF1ZV9jb21taXQgbDAgdHJlZSAtcCByb290Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMiIgc2F2ZV90YWcgbDEgdW5pcXVlX2NvbW1pdCBsMSB0cmVlIC1wIGwwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMyIgc2F2ZV90YWcgbDIgdW5pcXVlX2NvbW1pdCBsMiB0cmVlIC1wIGwxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNCIgc2F2ZV90YWcgYTAgdW5pcXVlX2NvbW1pdCBhMCB0cmVlIC1wIGwyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNSIgc2F2ZV90YWcgYTEgdW5pcXVlX2NvbW1pdCBhMSB0cmVlIC1wIGEwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNiIgc2F2ZV90YWcgYjEgdW5pcXVlX2NvbW1pdCBiMSB0cmVlIC1wIGEwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNyIgc2F2ZV90YWcgYzEgdW5pcXVlX2NvbW1pdCBjMSB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOCIgc2F2ZV90YWcgYjIgdW5pcXVlX2NvbW1pdCBiMiB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOSIgc2F2ZV90YWcgYjMgdW5pcXVlX2NvbW1pdCBiMiB0cmVlIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMCIgc2F2ZV90YWcgYzIgdW5pcXVlX2NvbW1pdCBjMiB0cmVlIC1wIGMxIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMSIgc2F2ZV90YWcgYzMgdW5pcXVlX2NvbW1pdCBjMyB0cmVlIC1wIGMyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMiIgc2F2ZV90YWcgYTIgdW5pcXVlX2NvbW1pdCBhMiB0cmVlIC1wIGExCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMyIgc2F2ZV90YWcgYTMgdW5pcXVlX2NvbW1pdCBhMyB0cmVlIC1wIGEyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNCIgc2F2ZV90YWcgYjQgdW5pcXVlX2NvbW1pdCBiNCB0cmVlIC1wIGIzIC1wIGEzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNSIgc2F2ZV90YWcgYTQgdW5pcXVlX2NvbW1pdCBhNCB0cmVlIC1wIGEzIC1wIGI0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNiIgc2F2ZV90YWcgbDMgdW5pcXVlX2NvbW1pdCBsMyB0cmVlIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNyIgc2F2ZV90YWcgbDQgdW5pcXVlX2NvbW1pdCBsNCB0cmVlIC1wIGwzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOCIgc2F2ZV90YWcgbDUgdW5pcXVlX2NvbW1pdCBsNSB0cmVlIC1wIGw0CitnaXQtdXBkYXRlLXJlZiBIRUFEICQodGFnIGw1KQorCisKKyMgICAgIEUKKyMgICAgLyBcCisjICAgZTEgIHwKKyMgICB8ICAgfAorIyAgIGUyICB8CisjICAgfCAgIHwKKyMgICBlMyAgfAorIyAgIHwgICB8CisjICAgZTQgIHwKKyMgICB8ICAgfAorIyAgIHwgICBmMQorIyAgIHwgICB8CisjICAgfCAgIGYyCisjICAgfCAgIHwKKyMgICB8ICAgZjMKKyMgICB8ICAgfAorIyAgIHwgICBmNAorIyAgIHwgICB8CisjICAgZTUgIHwKKyMgICB8ICAgfAorIyAgIGU2ICB8CisjICAgfCAgIHwKKyMgICBlNyAgfAorIyAgIHwgICB8CisjICAgZTggIHwKKyMgICAgXCAvCisjICAgICBGCisKKworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDAiIGhpZGVfZXJyb3Igc2F2ZV90YWcgRiB1bmlxdWVfY29tbWl0IEYgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIGU4IHVuaXF1ZV9jb21taXQgZTggdHJlZSAtcCBGCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMiIgc2F2ZV90YWcgZTcgdW5pcXVlX2NvbW1pdCBlNyB0cmVlIC1wIGU4Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMyIgc2F2ZV90YWcgZTYgdW5pcXVlX2NvbW1pdCBlNiB0cmVlIC1wIGU3Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNCIgc2F2ZV90YWcgZTUgdW5pcXVlX2NvbW1pdCBlNSB0cmVlIC1wIGU2Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNSIgc2F2ZV90YWcgZjQgdW5pcXVlX2NvbW1pdCBmNCB0cmVlIC1wIEYKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA2IiBzYXZlX3RhZyBmMyB1bmlxdWVfY29tbWl0IGYzIHRyZWUgLXAgZjQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA3IiBzYXZlX3RhZyBmMiB1bmlxdWVfY29tbWl0IGYyIHRyZWUgLXAgZjMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA4IiBzYXZlX3RhZyBmMSB1bmlxdWVfY29tbWl0IGYxIHRyZWUgLXAgZjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA5IiBzYXZlX3RhZyBlNCB1bmlxdWVfY29tbWl0IGU0IHRyZWUgLXAgZTUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEwIiBzYXZlX3RhZyBlMyB1bmlxdWVfY29tbWl0IGUzIHRyZWUgLXAgZTQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjExIiBzYXZlX3RhZyBlMiB1bmlxdWVfY29tbWl0IGUyIHRyZWUgLXAgZTMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEyIiBzYXZlX3RhZyBlMSB1bmlxdWVfY29tbWl0IGUxIHRyZWUgLXAgZTIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEzIiBzYXZlX3RhZyBFIHVuaXF1ZV9jb21taXQgRSB0cmVlIC1wIGUxIC1wIGYxCisKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAwIiBoaWRlX2Vycm9yIHNhdmVfdGFnIFUgdW5pcXVlX2NvbW1pdCBVIHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAxIiBzYXZlX3RhZyB1MCB1bmlxdWVfY29tbWl0IHUwIHRyZWUgLXAgVQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIHUxIHVuaXF1ZV9jb21taXQgdTEgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDIiIHNhdmVfdGFnIHUyIHVuaXF1ZV9jb21taXQgdTIgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDMiIHNhdmVfdGFnIHUzIHVuaXF1ZV9jb21taXQgdTMgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDQiIHNhdmVfdGFnIHU0IHVuaXF1ZV9jb21taXQgdTQgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDUiIHNhdmVfdGFnIHU1IHVuaXF1ZV9jb21taXQgdTUgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDYiIHNhdmVfdGFnIFYgdW5pcXVlX2NvbW1pdCBWIHRyZWUgLXAgdTEgLXAgdTIgLXAgdTMgLXAgdTQgLXAgdTUKKwordGVzdF9zZXF1ZW5jZSgpCit7CisJX2Jpc2VjdF9vcHRpb249JDEJCisJCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBsMCBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gbDEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGwyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBhMCBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYTEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGEyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBhMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYjEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGIyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBiMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYzEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGMyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBjMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gRSBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTEgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGUyIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlMyBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTQgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGU1IF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlNiBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTcgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGYxIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBmMiBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZjMgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGY0IF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBFIF5GCisKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDEgJF9iaXNlY3Rfb3B0aW9uIFYgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIFYgXlUgXnUxIF51MiBedTMKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHUxIF5VCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiB1MiBeVQorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gdTMgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHU0IF5VCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiB1NSBeVQorCQorIworIyB0aGUgZm9sbG93aW5nIGlsbHVzdHJhdGUncyBMaW51cycgYmluYXJ5IGJ1ZyBibGF0dCBpZGVhLiAKKyMKKyMgYXNzdW1lIHRoZSBidWcgaXMgYWN0dWFsbHkgYXQgbDMsIGJ1dCB5b3UgZG9uJ3Qga25vdyB0aGF0IC0gYWxsIHlvdSBrbm93IGlzIHRoYXQgbDMgaXMgYnJva2VuCisjIGFuZCBpdCB3YXNuJ3QgYnJva2VuIGJlZm9yZQorIworIyBrZWVwIGJpc2VjdGluZyB0aGUgbGlzdCwgYWR2YW5jaW5nIHRoZSAiYmFkIiBoZWFkIGFuZCBhY2N1bXVsYXRpbmcgImdvb2QiIGhlYWRzIHVudGlsCisjIHRoZSBiaXNlY3Rpb24gcG9pbnQgaXMgdGhlIGhlYWQgLSB0aGlzIGlzIHRoZSBiYWQgcG9pbnQuCisjCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICItLWJpc2VjdCBsNSBecm9vdCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QnIDw8RU9GCitjMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QgXmMzIiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBsNSBecm9vdCBeYzMnIDw8RU9GCitiNAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QgXmMzIF5iNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDUgXmMzIF5iNCcgPDxFT0YKK2wzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBsMyBecm9vdCBeYzMgXmI0IiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBsMyBecm9vdCBeYzMgXmI0JyA8PEVPRgorYTQKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw1IF5iMyBeYTMgXmI0IF5hNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDMgXmIzIF5hMyBeYTQnIDw8RU9GCitsMworRU9GCisKKyMKKyMgaWYgbDMgaXMgYmFkLCB0aGVuIGw0IGlzIGJhZCB0b28gLSBzbyBhZHZhbmNlIHRoZSBiYWQgcG9pbnRlciBieSBtYWtpbmcgYjQgdGhlIGtub3duIGJhZCBoZWFkCisjCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDQgXmEyIF5hMyBeYiBeYTQiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGw0IF5hMiBeYTMgXmE0JyA8PEVPRgorbDMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGwzIF5hMiBeYTMgXmIgXmE0IiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBsMyBeYTIgXmEzIF5hNCcgPDxFT0YKK2wzCitFT0YKKworIyBmb3VuZCEKKworIworIyBhcyBhbm90aGVyIGV4YW1wbGUsIGxldCdzIGNvbnNpZGVyIGE0IHRvIGJlIHRoZSBiYWQgaGVhZCwgaW4gd2hpY2ggY2FzZQorIworCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGE0IF5hMiBeYTMgXmI0IiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCcgPDxFT0YKK2MyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCBeYzIiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGE0IF5hMiBeYTMgXmI0IF5jMicgPDxFT0YKK2MzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCBeYzIgXmMzIiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCBeYzIgXmMzJyA8PEVPRgorYTQKK0VPRgorCisjIGZvdW5kIQorCisjCisjIG9yIGNvbnNpZGVyIGMzIHRvIGJlIHRoZSBiYWQgaGVhZAorIworCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGE0IF5hMiBeYTMgXmI0IiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCcgPDxFT0YKK2MyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBjMyBeYTIgXmEzIF5iNCBeYzIiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGMzIF5hMiBeYTMgXmI0IF5jMicgPDxFT0YKK2MzCitFT0YKKworIyBmb3VuZCEKKworfQorCit0ZXN0X3NlcXVlbmNlICItLWJpc2VjdCIKKworIworIwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDAzLXJldi1saXN0LXRvcG8tb3JkZXIuc2ggYi90L3Q2MDAzLXJldi1saXN0LXRvcG8tb3JkZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDk5YTlhZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDMtcmV2LWxpc3QtdG9wby1vcmRlci5zaApAQCAtMCwwICsxLDQwOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb24gU2V5bW91cgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0cyBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGZ1bmN0aW9uYWxpdHknCisKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi90NjAwMGxpYi5zaCAjIHQ2eHh4IHNwZWNpZmljIGZ1bmN0aW9ucworCitsaXN0X2R1cGxpY2F0ZXMoKQoreworICAgICIkQCIgfCBzb3J0IHwgdW5pcSAtZAorfQorCitkYXRlID5wYXRoMAorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMAorc2F2ZV90YWcgdHJlZSBnaXQtd3JpdGUtdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDAiIGhpZGVfZXJyb3Igc2F2ZV90YWcgcm9vdCB1bmlxdWVfY29tbWl0IHJvb3QgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIGwwIHVuaXF1ZV9jb21taXQgbDAgdHJlZSAtcCByb290Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMiIgc2F2ZV90YWcgbDEgdW5pcXVlX2NvbW1pdCBsMSB0cmVlIC1wIGwwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMyIgc2F2ZV90YWcgbDIgdW5pcXVlX2NvbW1pdCBsMiB0cmVlIC1wIGwxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNCIgc2F2ZV90YWcgYTAgdW5pcXVlX2NvbW1pdCBhMCB0cmVlIC1wIGwyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNSIgc2F2ZV90YWcgYTEgdW5pcXVlX2NvbW1pdCBhMSB0cmVlIC1wIGEwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNiIgc2F2ZV90YWcgYjEgdW5pcXVlX2NvbW1pdCBiMSB0cmVlIC1wIGEwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNyIgc2F2ZV90YWcgYzEgdW5pcXVlX2NvbW1pdCBjMSB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOCIgYXNfYXV0aG9yIGZvb2JhckBleGFtcGxlLmNvbSBzYXZlX3RhZyBiMiB1bmlxdWVfY29tbWl0IGIyIHRyZWUgLXAgYjEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA5IiBzYXZlX3RhZyBiMyB1bmlxdWVfY29tbWl0IGIzIHRyZWUgLXAgYjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEwIiBzYXZlX3RhZyBjMiB1bmlxdWVfY29tbWl0IGMyIHRyZWUgLXAgYzEgLXAgYjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjExIiBzYXZlX3RhZyBjMyB1bmlxdWVfY29tbWl0IGMzIHRyZWUgLXAgYzIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEyIiBzYXZlX3RhZyBhMiB1bmlxdWVfY29tbWl0IGEyIHRyZWUgLXAgYTEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEzIiBzYXZlX3RhZyBhMyB1bmlxdWVfY29tbWl0IGEzIHRyZWUgLXAgYTIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE0IiBzYXZlX3RhZyBiNCB1bmlxdWVfY29tbWl0IGI0IHRyZWUgLXAgYjMgLXAgYTMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE1IiBzYXZlX3RhZyBhNCB1bmlxdWVfY29tbWl0IGE0IHRyZWUgLXAgYTMgLXAgYjQgLXAgYzMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE2IiBzYXZlX3RhZyBsMyB1bmlxdWVfY29tbWl0IGwzIHRyZWUgLXAgYTQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE3IiBzYXZlX3RhZyBsNCB1bmlxdWVfY29tbWl0IGw0IHRyZWUgLXAgbDMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE4IiBzYXZlX3RhZyBsNSB1bmlxdWVfY29tbWl0IGw1IHRyZWUgLXAgbDQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE5IiBzYXZlX3RhZyBtMSB1bmlxdWVfY29tbWl0IG0xIHRyZWUgLXAgYTQgLXAgYzMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIwIiBzYXZlX3RhZyBtMiB1bmlxdWVfY29tbWl0IG0yIHRyZWUgLXAgYzMgLXAgYTQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIxIiBoaWRlX2Vycm9yIHNhdmVfdGFnIGFsdF9yb290IHVuaXF1ZV9jb21taXQgYWx0X3Jvb3QgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MjIiIHNhdmVfdGFnIHIwIHVuaXF1ZV9jb21taXQgcjAgdHJlZSAtcCBhbHRfcm9vdAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MjMiIHNhdmVfdGFnIHIxIHVuaXF1ZV9jb21taXQgcjEgdHJlZSAtcCByMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MjQiIHNhdmVfdGFnIGw1cjEgdW5pcXVlX2NvbW1pdCBsNXIxIHRyZWUgLXAgbDUgLXAgcjEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjI1IiBzYXZlX3RhZyByMWw1IHVuaXF1ZV9jb21taXQgcjFsNSB0cmVlIC1wIHIxIC1wIGw1CisKKworIworIyBub3RlOiBhcyBvZiAyMC82LCBpdCBpc24ndCBwb3NzaWJsZSB0byBjcmVhdGUgZHVwbGljYXRlIHBhcmVudHMsIHNvIHRoaXMKKyMgY2FuJ3QgYmUgdGVzdGVkLgorIworI29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIwIiBzYXZlX3RhZyBtMyB1bmlxdWVfY29tbWl0IG0zIHRyZWUgLXAgYzMgLXAgYTQgLXAgYzMKK2hpZGVfZXJyb3Igc2F2ZV90YWcgZTEgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlMSB0cmVlCitzYXZlX3RhZyBlMiBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGUyIHRyZWUgLXAgZTEKK3NhdmVfdGFnIGYxIGFzX2F1dGhvciBmQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZjEgdHJlZSAtcCBlMQorc2F2ZV90YWcgZTMgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlMyB0cmVlIC1wIGUyCitzYXZlX3RhZyBmMiBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGYyIHRyZWUgLXAgZjEKK3NhdmVfdGFnIGU0IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTQgdHJlZSAtcCBlMyAtcCBmMgorc2F2ZV90YWcgZTUgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlNSB0cmVlIC1wIGU0CitzYXZlX3RhZyBmMyBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGYzIHRyZWUgLXAgZjIKK3NhdmVfdGFnIGY0IGFzX2F1dGhvciBmQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZjQgdHJlZSAtcCBmMworc2F2ZV90YWcgZTYgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlNiB0cmVlIC1wIGU1IC1wIGY0CitzYXZlX3RhZyBmNSBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY1IHRyZWUgLXAgZjQKK3NhdmVfdGFnIGY2IGFzX2F1dGhvciBmQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZjYgdHJlZSAtcCBmNSAtcCBlNgorc2F2ZV90YWcgZTcgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlNyB0cmVlIC1wIGU2CitzYXZlX3RhZyBlOCBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGU4IHRyZWUgLXAgZTcKK3NhdmVfdGFnIGU5IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTkgdHJlZSAtcCBlOAorc2F2ZV90YWcgZjcgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmNyB0cmVlIC1wIGY2CitzYXZlX3RhZyBmOCBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY4IHRyZWUgLXAgZjcKK3NhdmVfdGFnIGY5IGFzX2F1dGhvciBmQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZjkgdHJlZSAtcCBmOAorc2F2ZV90YWcgZTEwIGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTEgdHJlZSAtcCBlOSAtcCBmOAorCitoaWRlX2Vycm9yIHNhdmVfdGFnIGcwIHVuaXF1ZV9jb21taXQgZzAgdHJlZQorc2F2ZV90YWcgZzEgdW5pcXVlX2NvbW1pdCBnMSB0cmVlIC1wIGcwCitzYXZlX3RhZyBoMSB1bmlxdWVfY29tbWl0IGcyIHRyZWUgLXAgZzAKK3NhdmVfdGFnIGcyIHVuaXF1ZV9jb21taXQgZzMgdHJlZSAtcCBnMSAtcCBoMQorc2F2ZV90YWcgaDIgdW5pcXVlX2NvbW1pdCBnNCB0cmVlIC1wIGcyCitzYXZlX3RhZyBnMyB1bmlxdWVfY29tbWl0IGc1IHRyZWUgLXAgZzIKK3NhdmVfdGFnIGc0IHVuaXF1ZV9jb21taXQgZzYgdHJlZSAtcCBnMyAtcCBoMgorCitnaXQtdXBkYXRlLXJlZiBIRUFEICQodGFnIGw1KQorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAncmV2LWxpc3QgaGFzIGNvcnJlY3QgbnVtYmVyIG9mIGVudHJpZXMnICdnaXQtcmV2LWxpc3QgSEVBRCB8IHdjIC1sIHwgdHIgLWQgXCIgXCInIDw8RU9GCisxOQorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdzaW1wbGUgdG9wbyBvcmRlcicgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIEhFQUQnIDw8RU9GCitsNQorbDQKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3R3byBkaWFtb25kcyB0b3BvIG9yZGVyIChnNiknICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBnNCcgPDxFT0YKK2c0CitoMgorZzMKK2cyCitoMQorZzEKK2cwCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpcGxlIGhlYWRzJyAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciBhMyBiMyBjMycgPDxFT0YKK2EzCithMgorYTEKK2MzCitjMgorYzEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpcGxlIGhlYWRzLCBwcnVuZSBhdCBhMScgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTMgYjMgYzMgXmExJyA8PEVPRgorYTMKK2EyCitjMworYzIKK2MxCitiMworYjIKK2IxCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpcGxlIGhlYWRzLCBwcnVuZSBhdCBsMScgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTMgYjMgYzMgXmwxJyA8PEVPRgorYTMKK2EyCithMQorYzMKK2MyCitjMQorYjMKK2IyCitiMQorYTAKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ2Nyb3NzLWVwb2NoLCBoZWFkIGF0IGw1LCBwcnVuZSBhdCBsMScgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgbDUgXmwxJyA8PEVPRgorbDUKK2w0CitsMworYTQKK2MzCitjMgorYzEKK2I0CithMworYTIKK2ExCitiMworYjIKK2IxCithMAorbDIKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnZHVwbGljYXRlZCBoZWFkIGFyZ3VtZW50cycgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgbDUgbDUgXmwxJyA8PEVPRgorbDUKK2w0CitsMworYTQKK2MzCitjMgorYzEKK2I0CithMworYTIKK2ExCitiMworYjIKK2IxCithMAorbDIKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAncHJ1bmUgbmVhciB0b3BvJyAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciBhNCBeYzMnIDw8RU9GCithNAorYjQKK2EzCithMgorYTEKK2IzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImhlYWQgaGFzIG5vIHBhcmVudCIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIHJvb3QnIDw8RU9GCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgInR3byBub2RlcyAtIG9uZSBoZWFkLCBvbmUgYmFzZSIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGwwJyA8PEVPRgorbDAKK3Jvb3QKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAidGhyZWUgbm9kZXMgb25lIGhlYWQsIG9uZSBpbnRlcm5hbCwgb25lIGJhc2UiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMScgPDxFT0YKK2wxCitsMAorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJsaW5lYXIgcHJ1bmUgbDIgXnJvb3QiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMiBecm9vdCcgPDxFT0YKK2wyCitsMQorbDAKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGwyIF5sMCIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGwyIF5sMCcgPDxFT0YKK2wyCitsMQorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJsaW5lYXIgcHJ1bmUgbDIgXmwxIiAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgbDIgXmwxJyA8PEVPRgorbDIKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGw1IF5hNCIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1IF5hNCcgPDxFT0YKK2w1CitsNAorbDMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGw1IF5sMyIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1IF5sMycgPDxFT0YKK2w1CitsNAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJsaW5lYXIgcHJ1bmUgbDUgXmw0IiAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgbDUgXmw0JyA8PEVPRgorbDUKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibWF4LWNvdW50IDEwIC0gdG9wbyBvcmRlciIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIC0tbWF4LWNvdW50PTEwIGw1JyA8PEVPRgorbDUKK2w0CitsMworYTQKK2MzCitjMgorYzEKK2I0CithMworYTIKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibWF4LWNvdW50IDEwIC0gbm9uIHRvcG8gb3JkZXIiICdnaXQtcmV2LWxpc3QgLS1tYXgtY291bnQ9MTAgbDUnIDw8RU9GCitsNQorbDQKK2wzCithNAorYjQKK2EzCithMgorYzMKK2MyCitiMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICctLW1heC1hZ2U9YzMsIG5vIC0tdG9wby1vcmRlcicgImdpdC1yZXYtbGlzdCAtLW1heC1hZ2U9JChjb21taXRfZGF0ZSBjMykgbDUiIDw8RU9GCitsNQorbDQKK2wzCithNAorYjQKK2EzCithMgorYzMKK0VPRgorCisjCisjIHRoaXMgdGVzdCBmYWlscyBvbiAtLXRvcG8tb3JkZXIgLSBhIGZpeCBpcyByZXF1aXJlZAorIworI3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICctLW1heC1hZ2U9YzMsIC0tdG9wby1vcmRlcicgImdpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgLS1tYXgtYWdlPSQoY29tbWl0X2RhdGUgYzMpIGw1IiA8PEVPRgorI2w1CisjbDQKKyNsMworI2E0CisjYzMKKyNiNAorI2EzCisjYTIKKyNFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ29uZSBzcGVjaWZpZWQgaGVhZCByZWFjaGFibGUgZnJvbSBhbm90aGVyIGE0LCBjMywgLS10b3BvLW9yZGVyJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTQgYzMiIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ29uZSBzcGVjaWZpZWQgaGVhZCByZWFjaGFibGUgZnJvbSBhbm90aGVyIGMzLCBhNCwgLS10b3BvLW9yZGVyJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYzMgYTQiIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ29uZSBzcGVjaWZpZWQgaGVhZCByZWFjaGFibGUgZnJvbSBhbm90aGVyIGE0LCBjMywgbm8gLS10b3BvLW9yZGVyJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCBhNCBjMyIgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnb25lIHNwZWNpZmllZCBoZWFkIHJlYWNoYWJsZSBmcm9tIGFub3RoZXIgYzMsIGE0LCBubyAtLXRvcG8tb3JkZXInICJsaXN0X2R1cGxpY2F0ZXMgZ2l0LXJldi1saXN0IGMzIGE0IiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdncmFwaCB3aXRoIGMzIGFuZCBhNCBwYXJlbnRzIG9mIGhlYWQnICJsaXN0X2R1cGxpY2F0ZXMgZ2l0LXJldi1saXN0IG0xIiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdncmFwaCB3aXRoIGE0IGFuZCBjMyBwYXJlbnRzIG9mIGhlYWQnICJsaXN0X2R1cGxpY2F0ZXMgZ2l0LXJldi1saXN0IG0yIiA8PEVPRgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImhlYWQgXmhlYWQgLS10b3BvLW9yZGVyIiAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgYTMgXmEzJyA8PEVPRgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImhlYWQgXmhlYWQgbm8gLS10b3BvLW9yZGVyIiAnZ2l0LXJldi1saXN0IGEzIF5hMycgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnc2ltcGxlIHRvcG8gb3JkZXIgKGw1cjEpJyAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgbDVyMScgPDxFT0YKK2w1cjEKK3IxCityMAorYWx0X3Jvb3QKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitsMQorbDAKK3Jvb3QKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnc2ltcGxlIHRvcG8gb3JkZXIgKHIxbDUpJyAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgcjFsNScgPDxFT0YKK3IxbDUKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitsMQorbDAKK3Jvb3QKK3IxCityMAorYWx0X3Jvb3QKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiZG9uJ3QgcHJpbnQgdGhpbmdzIHVucmVhY2hhYmxlIGZyb20gb25lIGJyYW5jaCIgImdpdC1yZXYtbGlzdCBhMyBeYjMgLS10b3BvLW9yZGVyIiA8PEVPRgorYTMKK2EyCithMQorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICItLXRvcG8tb3JkZXIgYTQgbDMiICJnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGE0IGwzIiA8PEVPRgorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitsMQorbDAKK3Jvb3QKK0VPRgorCisjCisjCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAxMC1tZXJnZS1iYXNlLnNoIGIvdC90NjAxMC1tZXJnZS1iYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkY2UxMjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDEwLW1lcmdlLWJhc2Uuc2gKQEAgLTAsMCArMSw1OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdNZXJnZSBiYXNlIGNvbXB1dGF0aW9uLgorJworCisuIC4vdGVzdC1saWIuc2gKKworVD0kKGdpdC13cml0ZS10cmVlKQorCitNPTExMzAwMDAwMDAKK1o9KzAwMDAKKworZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUw9Z2l0QGNvbW0uaXRlci54egorZXhwb3J0IEdJVF9DT01NSVRURVJfTkFNRT0nQyBPIE1taXRlcicKK2V4cG9ydCBHSVRfQVVUSE9SX05BTUU9J0EgVSBUaG9yJworZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9Z2l0QGF1LnRob3IueHoKKworZG9pdCgpIHsKKwlPRkZTRVQ9JDE7IHNoaWZ0CisJTkFNRT0kMTsgc2hpZnQKKwlQQVJFTlRTPQorCWZvciBQCisJZG8KKwkJUEFSRU5UUz0iJHtQQVJFTlRTfS1wICRQICIKKwlkb25lCisJR0lUX0NPTU1JVFRFUl9EQVRFPSIkKCgkTSArICRPRkZTRVQpKSAkWiIKKwlHSVRfQVVUSE9SX0RBVEU9JEdJVF9DT01NSVRURVJfREFURQorCWV4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEUgR0lUX0FVVEhPUl9EQVRFCisJY29tbWl0PSQoZWNobyAkTkFNRSB8IGdpdC1jb21taXQtdHJlZSAkVCAkUEFSRU5UUykKKwllY2hvICRjb21taXQgPi5naXQvcmVmcy90YWdzLyROQU1FCisJZWNobyAkY29tbWl0Cit9CisKKyMgU2V0dXAuLi4KK0U9JChkb2l0IDUgRSkKK0Q9JChkb2l0IDQgRCAkRSkKK0Y9JChkb2l0IDYgRiAkRSkKK0M9JChkb2l0IDMgQyAkRCkKK0I9JChkb2l0IDIgQiAkQykKK0E9JChkb2l0IDEgQSAkQikKK0c9JChkb2l0IDcgRyAkQiAkRSkKK0g9JChkb2l0IDggSCAkQSAkRikKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tcHV0ZSBtZXJnZS1iYXNlIChzaW5nbGUpJyBcCisgICAgJ01CPSQoZ2l0LW1lcmdlLWJhc2UgRyBIKSAmJgorICAgICBleHByICIkKGdpdC1uYW1lLXJldiAiJE1CIikiIDogIlswLTlhLWZdKiB0YWdzL0IiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21wdXRlIG1lcmdlLWJhc2UgKGFsbCknIFwKKyAgICAnTUI9JChnaXQtbWVyZ2UtYmFzZSAtLWFsbCBHIEgpICYmCisgICAgIGV4cHIgIiQoZ2l0LW5hbWUtcmV2ICIkTUIiKSIgOiAiWzAtOWEtZl0qIHRhZ3MvQiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbXB1dGUgbWVyZ2UtYmFzZSB3aXRoIHNob3ctYnJhbmNoJyBcCisgICAgJ01CPSQoZ2l0LXNob3ctYnJhbmNoIC0tbWVyZ2UtYmFzZSBHIEgpICYmCisgICAgIGV4cHIgIiQoZ2l0LW5hbWUtcmV2ICIkTUIiKSIgOiAiWzAtOWEtZl0qIHRhZ3MvQiInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyMC1tZXJnZS1kZi5zaCBiL3QvdDYwMjAtbWVyZ2UtZGYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTE5ZDQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjAtbWVyZ2UtZGYuc2gKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBGcmVkcmlrIEt1aXZpbmVuCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgbWVyZ2Ugd2l0aCBkaXJlY3RvcnkvZmlsZSBjb25mbGljdHMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyZSByZXBvc2l0b3J5JyBcCisnZWNobyAiSGVsbG8iID4gaW5pdCAmJgorZ2l0IGFkZCBpbml0ICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgJiYKK2dpdCBicmFuY2ggQiAmJgorbWtkaXIgZGlyICYmCitlY2hvICJmb28iID4gZGlyL2ZvbyAmJgorZ2l0IGFkZCBkaXIvZm9vICYmCitnaXQgY29tbWl0IC1tICJGaWxlOiBkaXIvZm9vIiAmJgorZ2l0IGNoZWNrb3V0IEIgJiYKK2VjaG8gImZpbGUgZGlyIiA+IGRpciAmJgorZ2l0IGFkZCBkaXIgJiYKK2dpdCBjb21taXQgLW0gIkZpbGU6IGRpciInCisKK3Rlc3RfZXhwZWN0X2NvZGUgMSAnTWVyZ2Ugd2l0aCBkL2YgY29uZmxpY3RzJyAnZ2l0IG1lcmdlICJtZXJnZSBtc2ciIEIgbWFzdGVyJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMjEtbWVyZ2UtY3Jpc3MtY3Jvc3Muc2ggYi90L3Q2MDIxLW1lcmdlLWNyaXNzLWNyb3NzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2MjM4MTMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDIxLW1lcmdlLWNyaXNzLWNyb3NzLnNoCkBAIC0wLDAgKzEsOTggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgRnJlZHJpayBLdWl2aW5lbgorIworCisjIFNlZSBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWdpdCZtPTExMTQ2MzM1ODUwMDM2MiZ3PTIgZm9yIGEKKyMgbmljZSBkZWNyaXB0aW9uIG9mIHdoYXQgdGhpcyBpcyBhYm91dC4KKworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGNyaXNzLWNyb3NzIG1lcmdlJworLiAuL3Rlc3QtbGliLnNoCisKK2lmIHRlc3QgIiRub19weXRob24iOyB0aGVuCisJZWNobyAiU2tpcHBpbmc6IG5vIHB5dGhvbiA9PiBubyByZWN1cnNpdmUgbWVyZ2UiCisJdGVzdF9kb25lCisJZXhpdCAwCitmaQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJlIHJlcG9zaXRvcnknIFwKKydlY2hvICIxCisyCiszCis0Cis1Cis2Cis3Cis4Cis5IiA+IGZpbGUgJiYKK2dpdCBhZGQgZmlsZSAmJiAKK2dpdCBjb21taXQgLW0gIkluaXRpYWwgY29tbWl0IiBmaWxlICYmCitnaXQgYnJhbmNoIEEgJiYKK2dpdCBicmFuY2ggQiAmJgorZ2l0IGNoZWNrb3V0IEEgJiYKK2VjaG8gIjEKKzIKKzMKKzQKKzUKKzYKKzcKKzggY2hhbmdlZCBpbiBCOCwgYnJhbmNoIEEKKzkiID4gZmlsZSAmJgorZ2l0IGNvbW1pdCAtbSAiQjgiIGZpbGUgJiYKK2dpdCBjaGVja291dCBCICYmCitlY2hvICIxCisyCiszIGNoYW5nZWQgaW4gQzMsIGJyYW5jaCBCCis0Cis1Cis2Cis3Cis4Cis5CisiID4gZmlsZSAmJgorZ2l0IGNvbW1pdCAtbSAiQzMiIGZpbGUgJiYKK2dpdCBicmFuY2ggQzMgJiYKK2dpdCBtZXJnZSAicHJlIEUzIG1lcmdlIiBCIEEgJiYKK2VjaG8gIjEKKzIKKzMgY2hhbmdlZCBpbiBFMywgYnJhbmNoIEIuIE5ldyBmaWxlIHNpemUKKzQKKzUKKzYKKzcKKzggY2hhbmdlZCBpbiBCOCwgYnJhbmNoIEEKKzkKKyIgPiBmaWxlICYmCitnaXQgY29tbWl0IC1tICJFMyIgZmlsZSAmJgorZ2l0IGNoZWNrb3V0IEEgJiYKK2dpdCBtZXJnZSAicHJlIEQ4IG1lcmdlIiBBIEMzICYmCitlY2hvICIxCisyCiszIGNoYW5nZWQgaW4gQzMsIGJyYW5jaCBCCis0Cis1Cis2Cis3Cis4IGNoYW5nZWQgaW4gRDgsIGJyYW5jaCBBLiBOZXcgZmlsZSBzaXplIDIKKzkiID4gZmlsZSAmJgorZ2l0IGNvbW1pdCAtbSBEOCBmaWxlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDcmlzcy1jcm9zcyBtZXJnZScgJ2dpdCBtZXJnZSAiZmluYWwgbWVyZ2UiIEEgQicKKworY2F0ID4gZmlsZS1leHBlY3QgPDxFT0YKKzEKKzIKKzMgY2hhbmdlZCBpbiBFMywgYnJhbmNoIEIuIE5ldyBmaWxlIHNpemUKKzQKKzUKKzYKKzcKKzggY2hhbmdlZCBpbiBEOCwgYnJhbmNoIEEuIE5ldyBmaWxlIHNpemUgMgorOQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NyaXNzLWNyb3NzIG1lcmdlIHJlc3VsdCcgJ2NtcCBmaWxlIGZpbGUtZXhwZWN0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMjItbWVyZ2UtcmVuYW1lLnNoIGIvdC90NjAyMi1tZXJnZS1yZW5hbWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWFjMjU2NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjItbWVyZ2UtcmVuYW1lLnNoCkBAIC0wLDAgKzEsMjA4IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nTWVyZ2UtcmVjdXJzaXZlIG1lcmdpbmcgcmVuYW1lcycKKy4gLi90ZXN0LWxpYi5zaAorCitpZiB0ZXN0ICIkbm9fcHl0aG9uIjsgdGhlbgorCWVjaG8gIlNraXBwaW5nOiBubyBweXRob24gPT4gbm8gcmVjdXJzaXZlIG1lcmdlIgorCXRlc3RfZG9uZQorCWV4aXQgMAorZmkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCBcCisnCitjYXQgPkEgPDxcRU9GICYmCithIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorYiBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKK2MgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCitkIGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZAorZSBlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWUKK2YgZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCitnIGdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZworaCBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGgKK2kgaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpCitqIGpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqagorayBra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2sKK2wgbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsCittIG1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbQorbiBubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm4KK28gb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vCitFT0YKKworY2F0ID5NIDw8XEVPRiAmJgorQSBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0IgQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCCitDIENDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQworRCBEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQKK0UgRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFCitGIEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgorRyBHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cKK0ggSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhICitJIElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSQorSiBKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkoKK0sgS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLCitMIExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAorTSBNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0KK04gTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCitPIE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTworRU9GCisKK2dpdCBhZGQgQSBNICYmCitnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKK2dpdCBicmFuY2ggd2hpdGUgJiYKK2dpdCBicmFuY2ggcmVkICYmCitnaXQgYnJhbmNoIGJsdWUgJiYKKworc2VkIC1lICIvXmcgL3MvLiovZyA6IG1hc3RlciBjaGFuZ2VzIGEgbGluZS8iIDxBID5BKyAmJgorbXYgQSsgQSAmJgorZ2l0IGNvbW1pdCAtYSAtbSAibWFzdGVyIHVwZGF0ZXMgQSIgJiYKKworZ2l0IGNoZWNrb3V0IHdoaXRlICYmCitzZWQgLWUgIi9eZyAvcy8uKi9nIDogd2hpdGUgY2hhbmdlcyBhIGxpbmUvIiA8QSA+QiAmJgorc2VkIC1lICIvXkcgL3MvLiovRyA6IGNvbG9yZWQgYnJhbmNoIGNoYW5nZXMgYSBsaW5lLyIgPE0gPk4gJiYKK3JtIC1mIEEgTSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBBIEIgTSBOICYmCitnaXQgY29tbWl0IC1tICJ3aGl0ZSByZW5hbWVzIEEtPkIsIE0tPk4iICYmCisKK2dpdCBjaGVja291dCByZWQgJiYKK3NlZCAtZSAiL15nIC9zLy4qL2cgOiByZWQgY2hhbmdlcyBhIGxpbmUvIiA8QSA+QiAmJgorc2VkIC1lICIvXkcgL3MvLiovRyA6IGNvbG9yZWQgYnJhbmNoIGNoYW5nZXMgYSBsaW5lLyIgPE0gPk4gJiYKK3JtIC1mIEEgTSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBBIEIgTSBOICYmCitnaXQgY29tbWl0IC1tICJyZWQgcmVuYW1lcyBBLT5CLCBNLT5OIiAmJgorCitnaXQgY2hlY2tvdXQgYmx1ZSAmJgorc2VkIC1lICIvXmcgL3MvLiovZyA6IGJsdWUgY2hhbmdlcyBhIGxpbmUvIiA8QSA+QyAmJgorc2VkIC1lICIvXkcgL3MvLiovRyA6IGNvbG9yZWQgYnJhbmNoIGNoYW5nZXMgYSBsaW5lLyIgPE0gPk4gJiYKK3JtIC1mIEEgTSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBBIEMgTSBOICYmCitnaXQgY29tbWl0IC1tICJibHVlIHJlbmFtZXMgQS0+QywgTS0+TiIgJiYKKworZ2l0IGNoZWNrb3V0IG1hc3RlcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbCByZW5hbWluZyBicmFuY2ggaW50byB1bnJlbmFtaW5nIG9uZScgXAorJworCWdpdCBzaG93LWJyYW5jaAorCWdpdCBwdWxsIC4gd2hpdGUgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbmZsaWN0ZWQiCisJCWV4aXQgMQorCX0KKwlnaXQgbHMtZmlsZXMgLXMKKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtdSBCIHwgd2MgLWwpIiAtZXEgMyB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBzdGFnZXMgZm9yIEIiCisJCWV4aXQgMQkKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXMgTiB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIG1lcmdlZCBOIgorCQlleGl0IDEJCisJfQorCXNlZCAtbmUgIi9eZy97CisJcAorCXEKKwl9IiBCIHwgZ3JlcCBtYXN0ZXIgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxpc3RlZCBvdXIgY2hhbmdlIGZpcnN0IgorCQlleGl0IDEKKwl9CisJdGVzdCAiJChnaXQgZGlmZiB3aGl0ZSBOIHwgd2MgLWwpIiAtZXEgMCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgdGFrZW4gY29sb3JlZCBicmFuY2giCisJCWV4aXQgMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbCByZW5hbWluZyBicmFuY2ggaW50byBhbm90aGVyIHJlbmFtaW5nIG9uZScgXAorJworCXJtIC1mIEIKKwlnaXQgcmVzZXQgLS1oYXJkCisJZ2l0IGNoZWNrb3V0IHJlZAorCWdpdCBwdWxsIC4gd2hpdGUgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbmZsaWN0ZWQiCisJCWV4aXQgMQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtdSBCIHwgd2MgLWwpIiAtZXEgMyB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBzdGFnZXMiCisJCWV4aXQgMQkKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXMgTiB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIG1lcmdlZCBOIgorCQlleGl0IDEJCisJfQorCXNlZCAtbmUgIi9eZy97CisJcAorCXEKKwl9IiBCIHwgZ3JlcCByZWQgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxpc3RlZCBvdXIgY2hhbmdlIGZpcnN0IgorCQlleGl0IDEKKwl9CisJdGVzdCAiJChnaXQgZGlmZiB3aGl0ZSBOIHwgd2MgLWwpIiAtZXEgMCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgdGFrZW4gY29sb3JlZCBicmFuY2giCisJCWV4aXQgMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbCB1bnJlbmFtaW5nIGJyYW5jaCBpbnRvIHJlbmFtaW5nIG9uZScgXAorJworCWdpdCByZXNldCAtLWhhcmQKKwlnaXQgc2hvdy1icmFuY2gKKwlnaXQgcHVsbCAuIG1hc3RlciAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29uZmxpY3RlZCIKKwkJZXhpdCAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEIgfCB3YyAtbCkiIC1lcSAzIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IHN0YWdlcyIKKwkJZXhpdCAxCQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtcyBOIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbWVyZ2VkIE4iCisJCWV4aXQgMQkKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIHJlZCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCWV4aXQgMQorCX0KKwl0ZXN0ICIkKGdpdCBkaWZmIHdoaXRlIE4gfCB3YyAtbCkiIC1lcSAwIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSB0YWtlbiBjb2xvcmVkIGJyYW5jaCIKKwkJZXhpdCAxCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsIGNvbmZsaWN0aW5nIHJlbmFtZXMnIFwKKycKKwlnaXQgcmVzZXQgLS1oYXJkCisJZ2l0IHNob3ctYnJhbmNoCisJZ2l0IHB1bGwgLiBibHVlICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlleGl0IDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQSB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgYSBzdGFnZSIKKwkJZXhpdCAxCQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtdSBCIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBhIHN0YWdlIgorCQlleGl0IDEJCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEMgfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IGEgc3RhZ2UiCisJCWV4aXQgMQkKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXMgTiB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIG1lcmdlZCBOIgorCQlleGl0IDEJCisJfQorCXNlZCAtbmUgIi9eZy97CisJcAorCXEKKwl9IiBCIHwgZ3JlcCByZWQgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxpc3RlZCBvdXIgY2hhbmdlIGZpcnN0IgorCQlleGl0IDEKKwl9CisJdGVzdCAiJChnaXQgZGlmZiB3aGl0ZSBOIHwgd2MgLWwpIiAtZXEgMCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgdGFrZW4gY29sb3JlZCBicmFuY2giCisJCWV4aXQgMQorCX0KKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MTAxLXJldi1wYXJzZS1wYXJlbnRzLnNoIGIvdC90NjEwMS1yZXYtcGFyc2UtcGFyZW50cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZDM1NGExCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjEwMS1yZXYtcGFyc2UtcGFyZW50cy5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvaGFubmVzIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBnaXQtcmV2LXBhcnNlIHdpdGggZGlmZmVyZW50IHBhcmVudCBvcHRpb25zJworCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vdDYwMDBsaWIuc2ggIyB0Nnh4eCBzcGVjaWZpYyBmdW5jdGlvbnMKKworZGF0ZSA+cGF0aDAKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAKK3NhdmVfdGFnIHRyZWUgZ2l0LXdyaXRlLXRyZWUKK2hpZGVfZXJyb3Igc2F2ZV90YWcgc3RhcnQgdW5pcXVlX2NvbW1pdCAic3RhcnQiIHRyZWUKK3NhdmVfdGFnIHNlY29uZCB1bmlxdWVfY29tbWl0ICJzZWNvbmQiIHRyZWUgLXAgc3RhcnQKK2hpZGVfZXJyb3Igc2F2ZV90YWcgc3RhcnQyIHVuaXF1ZV9jb21taXQgInN0YXJ0MiIgdHJlZQorc2F2ZV90YWcgdHdvX3BhcmVudHMgdW5pcXVlX2NvbW1pdCAibmV4dCIgdHJlZSAtcCBzZWNvbmQgLXAgc3RhcnQyCitzYXZlX3RhZyBmaW5hbCB1bmlxdWVfY29tbWl0ICJmaW5hbCIgdHJlZSAtcCB0d29fcGFyZW50cworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGFydCBpcyB2YWxpZCcgJ2dpdC1yZXYtcGFyc2Ugc3RhcnQgfCBncmVwICJeWzAtOWEtZl1cezQwXH0kIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXJ0XjAnICJ0ZXN0ICQoY2F0IC5naXQvcmVmcy90YWdzL3N0YXJ0KSA9ICQoZ2l0LXJldi1wYXJzZSBzdGFydF4wKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXJ0XjEgbm90IHZhbGlkJyAiaWYgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBzdGFydF4xOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2Vjb25kXjEgPSBzZWNvbmReJyAidGVzdCAkKGdpdC1yZXYtcGFyc2Ugc2Vjb25kXjEpID0gJChnaXQtcmV2LXBhcnNlIHNlY29uZF4pIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmluYWxeMV4xXjEnICJ0ZXN0ICQoZ2l0LXJldi1wYXJzZSBzdGFydCkgPSAkKGdpdC1yZXYtcGFyc2UgZmluYWxeMV4xXjEpIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmluYWxeMV4xXjEgPSBmaW5hbF5eXicgInRlc3QgJChnaXQtcmV2LXBhcnNlIGZpbmFsXjFeMV4xKSA9ICQoZ2l0LXJldi1wYXJzZSBmaW5hbF5eXikiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaW5hbF4xXjInICJ0ZXN0ICQoZ2l0LXJldi1wYXJzZSBzdGFydDIpID0gJChnaXQtcmV2LXBhcnNlIGZpbmFsXjFeMikiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaW5hbF4xXjIgIT0gZmluYWxeMV4xJyAidGVzdCAkKGdpdC1yZXYtcGFyc2UgZmluYWxeMV4yKSAhPSAkKGdpdC1yZXYtcGFyc2UgZmluYWxeMV4xKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbmFsXjFeMyBub3QgdmFsaWQnICJpZiBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IGZpbmFsXjFeMzsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaSIKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJy0tdmVyaWZ5IHN0YXJ0Ml4xJyAnZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBzdGFydDJeMScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tdmVyaWZ5IHN0YXJ0Ml4wJyAnZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBzdGFydDJeMCcKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDcwMDEtbXYuc2ggYi90L3Q3MDAxLW12LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgxMWE0NzkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDAxLW12LnNoCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbXYgaW4gc3ViZGlycycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdta2RpciBwYXRoMCBwYXRoMSAmJgorICAgICBjcCAuLi8uLi9DT1BZSU5HIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWFkZCBwYXRoMC9DT1BZSU5HICYmCisgICAgIGdpdC1jb21taXQgLW0gYWRkIC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbW92aW5nIHRoZSBmaWxlIG91dCBvZiBzdWJkaXJlY3RvcnknIFwKKyAgICAnY2QgcGF0aDAgJiYgZ2l0LW12IENPUFlJTkcgLi4vcGF0aDEvQ09QWUlORycKKworIyBpbiBwYXRoMCBjdXJyZW50bHkKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb21taXRpbmcgdGhlIGNoYW5nZScgXAorICAgICdjZCAuLiAmJiBnaXQtY29tbWl0IC1tIG1vdmUtb3V0IC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgdGhlIGNvbW1pdCcgXAorICAgICdnaXQtZGlmZi10cmVlIC1yIC1NIC0tbmFtZS1zdGF0dXMgIEhFQUReIEhFQUQgfCBcCisgICAgZ3JlcCAtRSAiXlIxMDAuK3BhdGgwL0NPUFlJTkcuK3BhdGgxL0NPUFlJTkciJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbW92aW5nIHRoZSBmaWxlIGJhY2sgaW50byBzdWJkaXJlY3RvcnknIFwKKyAgICAnY2QgcGF0aDAgJiYgZ2l0LW12IC4uL3BhdGgxL0NPUFlJTkcgQ09QWUlORycKKworIyBpbiBwYXRoMCBjdXJyZW50bHkKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb21taXRpbmcgdGhlIGNoYW5nZScgXAorICAgICdjZCAuLiAmJiBnaXQtY29tbWl0IC1tIG1vdmUtaW4gLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyB0aGUgY29tbWl0JyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICBncmVwIC1FICJeUjEwMC4rcGF0aDEvQ09QWUlORy4rcGF0aDAvQ09QWUlORyInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzEwMS1yZXNldC5zaCBiL3QvdDcxMDEtcmVzZXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTkxOTE0MAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcxMDEtcmVzZXQuc2gKQEAgLTAsMCArMSw2MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBTaGF3biBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXJlc2V0IHNob3VsZCBjdWxsIGVtcHR5IHN1YmRpcnMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NyZWF0aW5nIGluaXRpYWwgZmlsZXMnIFwKKyAgICAnbWtkaXIgcGF0aDAgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HICYmCisgICAgIGdpdC1hZGQgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtY29tbWl0IC1tIGFkZCAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NyZWF0aW5nIHNlY29uZCBmaWxlcycgXAorICAgICdta2RpciBwYXRoMSAmJgorICAgICBta2RpciBwYXRoMS9wYXRoMiAmJgorICAgICBjcCAuLi8uLi9DT1BZSU5HIHBhdGgxL3BhdGgyL0NPUFlJTkcgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMS9DT1BZSU5HICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgQ09QWUlORyAmJgorICAgICBjcCAuLi8uLi9DT1BZSU5HIHBhdGgwL0NPUFlJTkctVE9PICYmCisgICAgIGdpdC1hZGQgcGF0aDEvcGF0aDIvQ09QWUlORyAmJgorICAgICBnaXQtYWRkIHBhdGgxL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWFkZCBDT1BZSU5HICYmCisgICAgIGdpdC1hZGQgcGF0aDAvQ09QWUlORy1UT08gJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSBjaGFuZ2UgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZXNldHRpbmcgdHJlZSBIRUFEXicgXAorICAgICdnaXQtcmVzZXQgLS1oYXJkIEhFQUReJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgaW5pdGlhbCBmaWxlcyBleGlzdCBhZnRlciByZXdpbmQnIFwKKyAgICAndGVzdCAtZCBwYXRoMCAmJgorICAgICB0ZXN0IC1mIHBhdGgwL0NPUFlJTkcnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjaGVja2luZyBsYWNrIG9mIHBhdGgxL3BhdGgyL0NPUFlJTkcnIFwKKyAgICAndGVzdCAtZiBwYXRoMS9wYXRoMi9DT1BZSU5HJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9DT1BZSU5HJyBcCisgICAgJ3Rlc3QgLWYgcGF0aDEvQ09QWUlORycKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2NoZWNraW5nIGxhY2sgb2YgQ09QWUlORycgXAorICAgICd0ZXN0IC1mIENPUFlJTkcnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjaGVja2luZyBjaGVja2luZyBsYWNrIG9mIHBhdGgxL0NPUFlJTkctVE9PJyBcCisgICAgJ3Rlc3QgLWYgcGF0aDAvQ09QWUlORy1UT08nCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjaGVja2luZyBsYWNrIG9mIHBhdGgxL3BhdGgyJyBcCisgICAgJ3Rlc3QgLWQgcGF0aDEvcGF0aDInCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjaGVja2luZyBsYWNrIG9mIHBhdGgxJyBcCisgICAgJ3Rlc3QgLWQgcGF0aDEnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90ODAwMS1hbm5vdGF0ZS5zaCBiL3QvdDgwMDEtYW5ub3RhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjQ5NjM5NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDgwMDEtYW5ub3RhdGUuc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFubm90YXRlJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBhbm5vdGF0ZScKKy4gLi4vYW5ub3RhdGUtdGVzdHMuc2gKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q4MDAyLWJsYW1lLnNoIGIvdC90ODAwMi1ibGFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45Nzc3MzkzCi0tLSAvZGV2L251bGwKKysrIGIvdC90ODAwMi1ibGFtZS5zaApAQCAtMCwwICsxLDkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYmxhbWUnCisuIC4vdGVzdC1saWIuc2gKKworUFJPRz0nZ2l0IGJsYW1lIC1jJworLiAuLi9hbm5vdGF0ZS10ZXN0cy5zaAorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkwMDEtc2VuZC1lbWFpbC5zaCBiL3QvdDkwMDEtc2VuZC1lbWFpbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNjFkYTFlCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTAwMS1zZW5kLWVtYWlsLnNoCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc2VuZC1lbWFpbCcKKy4gLi90ZXN0LWxpYi5zaAorCitQUk9HPSdnaXQgc2VuZC1lbWFpbCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ2VjaG8gIjFBIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSIgPmZpbGUgJiYKKyAgICAgZWNobyAibGF6eSBkb2ciID4+ZmlsZSAmJgorICAgICBnaXQgYWRkIGZpbGUKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJBIiBnaXQgY29tbWl0IC1hIC1tICJJbml0aWFsLiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdTZXR1cCBoZWxwZXIgdG9vbCcgXAorICAgICcoZWNobyAiIyEvYmluL3NoIgorICAgICAgZWNobyBzaGlmdAorICAgICAgZWNobyBmb3IgYQorICAgICAgZWNobyBkbworICAgICAgZWNobyAiICBlY2hvIFwiIVwkYSFcIiIKKyAgICAgIGVjaG8gImRvbmUgPmNvbW1hbmRsaW5lIgorICAgICAgZWNobyAiY2F0ID4gbXNndHh0IgorICAgICAgKSA+ZmFrZS5zZW5kbWFpbAorICAgICBjaG1vZCAreCAuL2Zha2Uuc2VuZG1haWwKKyAgICAgZ2l0IGFkZCBmYWtlLnNlbmRtYWlsCisgICAgIEdJVF9BVVRIT1JfTkFNRT0iQSIgZ2l0IGNvbW1pdCAtYSAtbSAiU2Vjb25kLiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdFeHRyYWN0IHBhdGNoZXMgYW5kIHNlbmQnIFwKKyAgICAnZ2l0IGZvcm1hdC1wYXRjaCAtbiBIRUFEXjEKKyAgICAgZ2l0IHNlbmQtZW1haWwgLWZyb209IkV4YW1wbGUgPG5vYm9keUBleGFtcGxlLmNvbT4iIC0tdG89bm9ib2R5QGV4YW1wbGUuY29tIC0tc210cC1zZXJ2ZXI9IiQocHdkKS9mYWtlLnNlbmRtYWlsIiAuLzAwMDEqdHh0JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorIW5vYm9keUBleGFtcGxlLmNvbSEKKyFhdXRob3JAZXhhbXBsZS5jb20hCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdWZXJpZnkgY29tbWFuZGxpbmUnIFwKKyAgICAnZGlmZiBjb21tYW5kbGluZSBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Rlc3QtbGliLnNoIGIvdC90ZXN0LWxpYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWY2ZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90ZXN0LWxpYi5zaApAQCAtMCwwICsxLDIxNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCisjIEZvciByZXBlYXRhYmlsaXR5LCByZXNldCB0aGUgZW52aXJvbm1lbnQgdG8ga25vd24gdmFsdWUuCitMQU5HPUMKK0xDX0FMTD1DCitQQUdFUj1jYXQKK1RaPVVUQworZXhwb3J0IExBTkcgTENfQUxMIFBBR0VSIFRaCit1bnNldCBBVVRIT1JfREFURQordW5zZXQgQVVUSE9SX0VNQUlMCit1bnNldCBBVVRIT1JfTkFNRQordW5zZXQgQ09NTUlUX0FVVEhPUl9FTUFJTAordW5zZXQgQ09NTUlUX0FVVEhPUl9OQU1FCit1bnNldCBHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUwordW5zZXQgR0lUX0FVVEhPUl9EQVRFCitHSVRfQVVUSE9SX0VNQUlMPWF1dGhvckBleGFtcGxlLmNvbQorR0lUX0FVVEhPUl9OQU1FPSdBIFUgVGhvcicKK3Vuc2V0IEdJVF9DT01NSVRURVJfREFURQorR0lUX0NPTU1JVFRFUl9FTUFJTD1jb21taXR0ZXJAZXhhbXBsZS5jb20KK0dJVF9DT01NSVRURVJfTkFNRT0nQyBPIE1pdHRlcicKK3Vuc2V0IEdJVF9ESUZGX09QVFMKK3Vuc2V0IEdJVF9ESVIKK3Vuc2V0IEdJVF9FWFRFUk5BTF9ESUZGCit1bnNldCBHSVRfSU5ERVhfRklMRQordW5zZXQgR0lUX09CSkVDVF9ESVJFQ1RPUlkKK3Vuc2V0IFNIQTFfRklMRV9ESVJFQ1RPUklFUwordW5zZXQgU0hBMV9GSUxFX0RJUkVDVE9SWQorZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwgR0lUX0FVVEhPUl9OQU1FCitleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTCBHSVRfQ09NTUlUVEVSX05BTUUKKworIyBFYWNoIHRlc3Qgc2hvdWxkIHN0YXJ0IHdpdGggc29tZXRoaW5nIGxpa2UgdGhpcywgYWZ0ZXIgY29weXJpZ2h0IG5vdGljZXM6CisjCisjIHRlc3RfZGVzY3JpcHRpb249J0Rlc2NyaXB0aW9uIG9mIHRoaXMgdGVzdC4uLgorIyBUaGlzIHRlc3QgY2hlY2tzIGlmIGNvbW1hbmQgeHl6enkgZG9lcyB0aGUgcmlnaHQgdGhpbmcuLi4KKyMgJworIyAuIC4vdGVzdC1saWIuc2gKKworZXJyb3IgKCkgeworCWVjaG8gIiogZXJyb3I6ICQqIgorCXRyYXAgLSBleGl0CisJZXhpdCAxCit9CisKK3NheSAoKSB7CisJZWNobyAiKiAkKiIKK30KKwordGVzdCAiJHt0ZXN0X2Rlc2NyaXB0aW9ufSIgIT0gIiIgfHwKK2Vycm9yICJUZXN0IHNjcmlwdCBkaWQgbm90IHNldCB0ZXN0X2Rlc2NyaXB0aW9uLiIKKword2hpbGUgdGVzdCAiJCMiIC1uZSAwCitkbworCWNhc2UgIiQxIiBpbgorCS1kfC0tZHwtLWRlfC0tZGVifC0tZGVidXwtLWRlYnVnKQorCQlkZWJ1Zz10OyBzaGlmdCA7OworCS1pfC0taXwtLWltfC0taW1tfC0taW1tZXwtLWltbWVkfC0taW1tZWRpfC0taW1tZWRpYXwtLWltbWVkaWF0fC0taW1tZWRpYXRlKQorCQlpbW1lZGlhdGU9dDsgc2hpZnQgOzsKKwktaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisJCWVjaG8gIiR0ZXN0X2Rlc2NyaXB0aW9uIgorCQlleGl0IDAgOzsKKwktdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcmJ8LS12ZXJib3wtLXZlcmJvc3wtLXZlcmJvc2UpCisJCXZlcmJvc2U9dDsgc2hpZnQgOzsKKwktLW5vLXB5dGhvbikKKwkJbm9fcHl0aG9uPXQ7IHNoaWZ0IDs7CisJKikKKwkJYnJlYWsgOzsKKwllc2FjCitkb25lCisKK2V4ZWMgNT4mMQoraWYgdGVzdCAiJHZlcmJvc2UiID0gInQiCit0aGVuCisJZXhlYyA0PiYyIDM+JjEKK2Vsc2UKKwlleGVjIDQ+L2Rldi9udWxsIDM+L2Rldi9udWxsCitmaQorCit0ZXN0X2ZhaWx1cmU9MAordGVzdF9jb3VudD0wCisKK3RyYXAgJ2VjaG8gPiY1ICJGQVRBTDogVW5leHBlY3RlZCBleGl0IHdpdGggY29kZSAkPyI7IGV4aXQgMScgZXhpdAorCisKKyMgWW91IGFyZSBub3QgZXhwZWN0ZWQgdG8gY2FsbCB0ZXN0X29rXyBhbmQgdGVzdF9mYWlsdXJlXyBkaXJlY3RseSwgdXNlCisjIHRoZSB0ZXh0X2V4cGVjdF8qIGZ1bmN0aW9ucyBpbnN0ZWFkLgorCit0ZXN0X29rXyAoKSB7CisJdGVzdF9jb3VudD0kKGV4cHIgIiR0ZXN0X2NvdW50IiArIDEpCisJc2F5ICIgIG9rICR0ZXN0X2NvdW50OiAkQCIKK30KKwordGVzdF9mYWlsdXJlXyAoKSB7CisJdGVzdF9jb3VudD0kKGV4cHIgIiR0ZXN0X2NvdW50IiArIDEpCisJdGVzdF9mYWlsdXJlPSQoZXhwciAiJHRlc3RfZmFpbHVyZSIgKyAxKTsKKwlzYXkgIkZBSUwgJHRlc3RfY291bnQ6ICQxIgorCXNoaWZ0CisJZWNobyAiJEAiIHwgc2VkIC1lICdzL14vCS8nCisJdGVzdCAiJGltbWVkaWF0ZSIgPSAiIiB8fCB7IHRyYXAgLSBleGl0OyBleGl0IDE7IH0KK30KKworCit0ZXN0X2RlYnVnICgpIHsKKwl0ZXN0ICIkZGVidWciID0gIiIgfHwgZXZhbCAiJDEiCit9CisKK3Rlc3RfcnVuXyAoKSB7CisJZXZhbCA+JjMgMj4mNCAiJDEiCisJZXZhbF9yZXQ9IiQ/IgorCXJldHVybiAwCit9CisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgKCkgeworCXRlc3QgIiQjIiA9IDIgfHwKKwllcnJvciAiYnVnIGluIHRoZSB0ZXN0IHNjcmlwdDogbm90IDIgcGFyYW1ldGVycyB0byB0ZXN0LWV4cGVjdC1mYWlsdXJlIgorCXNheSA+JjMgImV4cGVjdGluZyBmYWlsdXJlOiAkMiIKKwl0ZXN0X3J1bl8gIiQyIgorCWlmIFsgIiQ/IiA9IDAgLWEgIiRldmFsX3JldCIgIT0gMCBdCisJdGhlbgorCQl0ZXN0X29rXyAiJDEiCisJZWxzZQorCQl0ZXN0X2ZhaWx1cmVfICIkQCIKKwlmaQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICgpIHsKKwl0ZXN0ICIkIyIgPSAyIHx8CisJZXJyb3IgImJ1ZyBpbiB0aGUgdGVzdCBzY3JpcHQ6IG5vdCAyIHBhcmFtZXRlcnMgdG8gdGVzdC1leHBlY3Qtc3VjY2VzcyIKKwlzYXkgPiYzICJleHBlY3Rpbmcgc3VjY2VzczogJDIiCisJdGVzdF9ydW5fICIkMiIKKwlpZiBbICIkPyIgPSAwIC1hICIkZXZhbF9yZXQiID0gMCBdCisJdGhlbgorCQl0ZXN0X29rXyAiJDEiCisJZWxzZQorCQl0ZXN0X2ZhaWx1cmVfICIkQCIKKwlmaQorfQorCit0ZXN0X2V4cGVjdF9jb2RlICgpIHsKKwl0ZXN0ICIkIyIgPSAzIHx8CisJZXJyb3IgImJ1ZyBpbiB0aGUgdGVzdCBzY3JpcHQ6IG5vdCAzIHBhcmFtZXRlcnMgdG8gdGVzdC1leHBlY3QtY29kZSIKKwlzYXkgPiYzICJleHBlY3RpbmcgZXhpdCBjb2RlICQxOiAkMyIKKwl0ZXN0X3J1bl8gIiQzIgorCWlmIFsgIiQ/IiA9IDAgLWEgIiRldmFsX3JldCIgPSAiJDEiIF0KKwl0aGVuCisJCXRlc3Rfb2tfICIkMiIKKwllbHNlCisJCXRlc3RfZmFpbHVyZV8gIiRAIgorCWZpCit9CisKKyMgTW9zdCB0ZXN0cyBjYW4gdXNlIHRoZSBjcmVhdGVkIHJlcG9zaXRvcnksIGJ1dCBzb21lIGFteSBuZWVkIHRvIGNyZWF0ZSBtb3JlLgorIyBVc2FnZTogdGVzdF9jcmVhdGVfcmVwbyA8ZGlyZWN0b3J5PgordGVzdF9jcmVhdGVfcmVwbyAoKSB7CisJdGVzdCAiJCMiID0gMSB8fAorCWVycm9yICJidWcgaW4gdGhlIHRlc3Qgc2NyaXB0OiBub3QgMSBwYXJhbWV0ZXIgdG8gdGVzdC1jcmVhdGUtcmVwbyIKKwlvd2Q9YHB3ZGAKKwlyZXBvPSIkMSIKKwlta2RpciAiJHJlcG8iCisJY2QgIiRyZXBvIiB8fCBlcnJvciAiQ2Fubm90IHNldHVwIHRlc3QgZW52aXJvbm1lbnQiCisJIiRHSVRfRVhFQ19QQVRIL2dpdCIgaW5pdC1kYiAtLXRlbXBsYXRlPSRHSVRfRVhFQ19QQVRIL3RlbXBsYXRlcy9ibHQvIDI+L2Rldi9udWxsIHx8CisJZXJyb3IgImNhbm5vdCBydW4gZ2l0IGluaXQtZGIgLS0gaGF2ZSB5b3UgYnVpbHQgdGhpbmdzIHlldD8iCisJbXYgLmdpdC9ob29rcyAuZ2l0L2hvb2tzLWRpc2FibGVkCisJY2QgIiRvd2QiCit9CisJCit0ZXN0X2RvbmUgKCkgeworCXRyYXAgLSBleGl0CisJY2FzZSAiJHRlc3RfZmFpbHVyZSIgaW4KKwkwKQorCQkjIFdlIGNvdWxkOgorCQkjIGNkIC4uICYmIHJtIC1mciB0cmFzaAorCQkjIGJ1dCB0aGF0IG1lYW5zIHdlIGZvcmJpZCBhbnkgdGVzdHMgdGhhdCB1c2UgdGhlaXIgb3duCisJCSMgc3ViZGlyZWN0b3J5IGZyb20gY2FsbGluZyB0ZXN0X2RvbmUgd2l0aG91dCBjb21pbmcgYmFjaworCQkjIHRvIHdoZXJlIHRoZXkgc3RhcnRlZCBmcm9tLgorCQkjIFRoZSBNYWtlZmlsZSBwcm92aWRlZCB3aWxsIGNsZWFuIHRoaXMgdGVzdCBhcmVhIHNvCisJCSMgd2Ugd2lsbCBsZWF2ZSB0aGluZ3MgYXMgdGhleSBhcmUuCisKKwkJc2F5ICJwYXNzZWQgYWxsICR0ZXN0X2NvdW50IHRlc3QocykiCisJCWV4aXQgMCA7OworCisJKikKKwkJc2F5ICJmYWlsZWQgJHRlc3RfZmFpbHVyZSBhbW9uZyAkdGVzdF9jb3VudCB0ZXN0KHMpIgorCQlleGl0IDEgOzsKKworCWVzYWMKK30KKworIyBUZXN0IHRoZSBiaW5hcmllcyB3ZSBoYXZlIGp1c3QgYnVpbHQuICBUaGUgdGVzdHMgYXJlIGtlcHQgaW4KKyMgdC8gc3ViZGlyZWN0b3J5IGFuZCBhcmUgcnVuIGluIHRyYXNoIHN1YmRpcmVjdG9yeS4KK1BBVEg9JChwd2QpLy4uOiRQQVRICitHSVRfRVhFQ19QQVRIPSQocHdkKS8uLgorZXhwb3J0IFBBVEggR0lUX0VYRUNfUEFUSAorCisjIFNpbWlsYXJseSB1c2UgLi4vY29tcGF0L3N1YnByb2Nlc3MucHkgaWYgb3VyIHB5dGhvbiBkb2VzIG5vdAorIyBoYXZlIHN1YnByb2Nlc3MucHkgb24gaXRzIG93bi4KK1BZVEhPTj1gc2VkIC1lICcxeworCXMvXiMhLy8KKwlxCit9JyAuLi9naXQtbWVyZ2UtcmVjdXJzaXZlYCB8fCB7CisJZXJyb3IgIllvdSBoYXZlbid0IGJ1aWx0IHRoaW5ncyB5ZXQsIGhhdmUgeW91PyIKK30KKyIkUFlUSE9OIiAtYyAnaW1wb3J0IHN1YnByb2Nlc3MnIDI+L2Rldi9udWxsIHx8IHsKKwlQWVRIT05QQVRIPSQocHdkKS8uLi9jb21wYXQKKwlleHBvcnQgUFlUSE9OUEFUSAorfQordGVzdCAtZCAuLi90ZW1wbGF0ZXMvYmx0IHx8IHsKKwllcnJvciAiWW91IGhhdmVuJ3QgYnVpbHQgdGhpbmdzIHlldCwgaGF2ZSB5b3U/IgorfQorCisjIFRlc3QgcmVwb3NpdG9yeQordGVzdD10cmFzaAorcm0gLWZyICIkdGVzdCIKK3Rlc3RfY3JlYXRlX3JlcG8gJHRlc3QKK2NkICIkdGVzdCIKZGlmZiAtLWdpdCBhL3QvdGVzdDQwMTIucG5nIGIvdC90ZXN0NDAxMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxODFkMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdGVzdDQwMTIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RhZy5jIGIvdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MGVlNwotLS0gL2Rldi9udWxsCisrKyBiL3RhZy5jCkBAIC0wLDAgKzEsMTA3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworY29uc3QgY2hhciAqdGFnX3R5cGUgPSAidGFnIjsKKworc3RydWN0IG9iamVjdCAqZGVyZWZfdGFnKHN0cnVjdCBvYmplY3QgKm8sIGNvbnN0IGNoYXIgKndhcm4sIGludCB3YXJubGVuKQoreworCXdoaWxlIChvICYmIG8tPnR5cGUgPT0gdGFnX3R5cGUpCisJCW8gPSBwYXJzZV9vYmplY3QoKChzdHJ1Y3QgdGFnICopbyktPnRhZ2dlZC0+c2hhMSk7CisJaWYgKCFvICYmIHdhcm4pIHsKKwkJaWYgKCF3YXJubGVuKQorCQkJd2FybmxlbiA9IHN0cmxlbih3YXJuKTsKKwkJZXJyb3IoIm1pc3Npbmcgb2JqZWN0IHJlZmVyZW5jZWQgYnkgJyUuKnMnIiwgd2Fybmxlbiwgd2Fybik7CisJfQorCXJldHVybiBvOworfQorCitzdHJ1Y3QgdGFnICpsb29rdXBfdGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisgICAgICAgIHN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisgICAgICAgIGlmICghb2JqKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHRhZyAqcmV0ID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRhZykpOworICAgICAgICAgICAgICAgIGNyZWF0ZWRfb2JqZWN0KHNoYTEsICZyZXQtPm9iamVjdCk7CisgICAgICAgICAgICAgICAgcmV0LT5vYmplY3QudHlwZSA9IHRhZ190eXBlOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKwlpZiAoIW9iai0+dHlwZSkKKwkJb2JqLT50eXBlID0gdGFnX3R5cGU7CisgICAgICAgIGlmIChvYmotPnR5cGUgIT0gdGFnX3R5cGUpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiT2JqZWN0ICVzIGlzIGEgJXMsIG5vdCBhIHRyZWUiLCAKKyAgICAgICAgICAgICAgICAgICAgICBzaGExX3RvX2hleChzaGExKSwgb2JqLT50eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHN0cnVjdCB0YWcgKikgb2JqOworfQorCitpbnQgcGFyc2VfdGFnX2J1ZmZlcihzdHJ1Y3QgdGFnICppdGVtLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHR5cGVsZW4sIHRhZ2xlbjsKKwl1bnNpZ25lZCBjaGFyIG9iamVjdFsyMF07CisJY29uc3QgY2hhciAqdHlwZV9saW5lLCAqdGFnX2xpbmUsICpzaWdfbGluZTsKKwljaGFyIHR5cGVbMjBdOworCisgICAgICAgIGlmIChpdGVtLT5vYmplY3QucGFyc2VkKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpdGVtLT5vYmplY3QucGFyc2VkID0gMTsKKworCWlmIChzaXplIDwgNjQpCisJCXJldHVybiAtMTsKKwlpZiAobWVtY21wKCJvYmplY3QgIiwgZGF0YSwgNykgfHwgZ2V0X3NoYTFfaGV4KGRhdGEgKyA3LCBvYmplY3QpKQorCQlyZXR1cm4gLTE7CisKKwl0eXBlX2xpbmUgPSBkYXRhICsgNDg7CisJaWYgKG1lbWNtcCgiXG50eXBlICIsIHR5cGVfbGluZS0xLCA2KSkKKwkJcmV0dXJuIC0xOworCisJdGFnX2xpbmUgPSBzdHJjaHIodHlwZV9saW5lLCAnXG4nKTsKKwlpZiAoIXRhZ19saW5lIHx8IG1lbWNtcCgidGFnICIsICsrdGFnX2xpbmUsIDQpKQorCQlyZXR1cm4gLTE7CisKKwlzaWdfbGluZSA9IHN0cmNocih0YWdfbGluZSwgJ1xuJyk7CisJaWYgKCFzaWdfbGluZSkKKwkJcmV0dXJuIC0xOworCXNpZ19saW5lKys7CisKKwl0eXBlbGVuID0gdGFnX2xpbmUgLSB0eXBlX2xpbmUgLSBzdHJsZW4oInR5cGUgXG4iKTsKKwlpZiAodHlwZWxlbiA+PSAyMCkKKwkJcmV0dXJuIC0xOworCW1lbWNweSh0eXBlLCB0eXBlX2xpbmUgKyA1LCB0eXBlbGVuKTsKKwl0eXBlW3R5cGVsZW5dID0gJ1wwJzsKKwl0YWdsZW4gPSBzaWdfbGluZSAtIHRhZ19saW5lIC0gc3RybGVuKCJ0YWcgXG4iKTsKKwlpdGVtLT50YWcgPSB4bWFsbG9jKHRhZ2xlbiArIDEpOworCW1lbWNweShpdGVtLT50YWcsIHRhZ19saW5lICsgNCwgdGFnbGVuKTsKKwlpdGVtLT50YWdbdGFnbGVuXSA9ICdcMCc7CisKKwlpdGVtLT50YWdnZWQgPSBsb29rdXBfb2JqZWN0X3R5cGUob2JqZWN0LCB0eXBlKTsKKwlpZiAoaXRlbS0+dGFnZ2VkICYmIHRyYWNrX29iamVjdF9yZWZzKSB7CisJCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcyA9IGFsbG9jX29iamVjdF9yZWZzKDEpOworCQlyZWZzLT5yZWZbMF0gPSBpdGVtLT50YWdnZWQ7CisJCXNldF9vYmplY3RfcmVmcygmaXRlbS0+b2JqZWN0LCByZWZzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX3RhZyhzdHJ1Y3QgdGFnICppdGVtKQoreworCWNoYXIgdHlwZVsyMF07CisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKworCWlmIChpdGVtLT5vYmplY3QucGFyc2VkKQorCQlyZXR1cm4gMDsKKwlkYXRhID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgJXMiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCWlmIChzdHJjbXAodHlwZSwgdGFnX3R5cGUpKSB7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiBlcnJvcigiT2JqZWN0ICVzIG5vdCBhIHRhZyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJfQorCXJldCA9IHBhcnNlX3RhZ19idWZmZXIoaXRlbSwgZGF0YSwgc2l6ZSk7CisJZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGFnLmggYi90YWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBjYjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGFnLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBUQUdfSAorI2RlZmluZSBUQUdfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK2V4dGVybiBjb25zdCBjaGFyICp0YWdfdHlwZTsKKworc3RydWN0IHRhZyB7CisJc3RydWN0IG9iamVjdCBvYmplY3Q7CisJc3RydWN0IG9iamVjdCAqdGFnZ2VkOworCWNoYXIgKnRhZzsKKwljaGFyICpzaWduYXR1cmU7IC8qIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCB0YWcgKmxvb2t1cF90YWcoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IHBhcnNlX3RhZ19idWZmZXIoc3RydWN0IHRhZyAqaXRlbSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgcGFyc2VfdGFnKHN0cnVjdCB0YWcgKml0ZW0pOworZXh0ZXJuIHN0cnVjdCBvYmplY3QgKmRlcmVmX3RhZyhzdHJ1Y3Qgb2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2VuZGlmIC8qIFRBR19IICovCmRpZmYgLS1naXQgYS90YXIuaCBiL3Rhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Njc3MDUKLS0tIC9kZXYvbnVsbAorKysgYi90YXIuaApAQCAtMCwwICsxLDI1IEBACisjZGVmaW5lIFRZUEVGTEFHX0FVVE8JCSdcMCcKKyNkZWZpbmUgVFlQRUZMQUdfUkVHCQknMCcKKyNkZWZpbmUgVFlQRUZMQUdfTE5LCQknMicKKyNkZWZpbmUgVFlQRUZMQUdfRElSCQknNScKKyNkZWZpbmUgVFlQRUZMQUdfR0xPQkFMX0hFQURFUgknZycKKyNkZWZpbmUgVFlQRUZMQUdfRVhUX0hFQURFUgkneCcKKworc3RydWN0IHVzdGFyX2hlYWRlciB7CisJY2hhciBuYW1lWzEwMF07CQkvKiAgIDAgKi8KKwljaGFyIG1vZGVbOF07CQkvKiAxMDAgKi8KKwljaGFyIHVpZFs4XTsJCS8qIDEwOCAqLworCWNoYXIgZ2lkWzhdOwkJLyogMTE2ICovCisJY2hhciBzaXplWzEyXTsJCS8qIDEyNCAqLworCWNoYXIgbXRpbWVbMTJdOwkJLyogMTM2ICovCisJY2hhciBjaGtzdW1bOF07CQkvKiAxNDggKi8KKwljaGFyIHR5cGVmbGFnWzFdOwkvKiAxNTYgKi8KKwljaGFyIGxpbmtuYW1lWzEwMF07CS8qIDE1NyAqLworCWNoYXIgbWFnaWNbNl07CQkvKiAyNTcgKi8KKwljaGFyIHZlcnNpb25bMl07CS8qIDI2MyAqLworCWNoYXIgdW5hbWVbMzJdOwkJLyogMjY1ICovCisJY2hhciBnbmFtZVszMl07CQkvKiAyOTcgKi8KKwljaGFyIGRldm1ham9yWzhdOwkvKiAzMjkgKi8KKwljaGFyIGRldm1pbm9yWzhdOwkvKiAzMzcgKi8KKwljaGFyIHByZWZpeFsxNTVdOwkvKiAzNDUgKi8KK307CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvLmdpdGlnbm9yZSBiL3RlbXBsYXRlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTllY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2JsdAorYm9pbGVycGxhdGVzLm1hZGUKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9NYWtlZmlsZSBiL3RlbXBsYXRlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdmNGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDggQEAKKyMgbWFrZSBhbmQgaW5zdGFsbCBzYW1wbGUgdGVtcGxhdGVzCisKK0lOU1RBTEwgPz0gaW5zdGFsbAorVEFSID89IHRhcgorcHJlZml4ID89ICQoSE9NRSkKK3RlbXBsYXRlX2RpciA/PSAkKHByZWZpeCkvc2hhcmUvZ2l0LWNvcmUvdGVtcGxhdGVzLworIyBERVNURElSPQorCisjIFNoZWxsIHF1b3RlOworIyBSZXN1bHQgb2YgdGhpcyBuZWVkcyB0byBiZSBwbGFjZWQgaW5zaWRlICcnCitzaHEgPSAkKHN1YnN0ICcsJ1wnJywkKDEpKQorIyBUaGlzIGhhcyBzdXJyb3VuZGluZyAnJworc2hlbGxxdW90ZSA9ICckKGNhbGwgc2hxLCQoMSkpJworCithbGw6IGJvaWxlcnBsYXRlcy5tYWRlIGN1c3RvbQorCisjIFB1dCB0ZW1wbGF0ZXMgdGhhdCBjYW4gYmUgY29waWVkIHN0cmFpZ2h0IGZyb20gdGhlIHNvdXJjZQorIyBpbiBhIGZpbGUgZGlyZWMtLXRvcnktLWZpbGUgaW4gdGhlIHNvdXJjZS4gIFRoZXkgd2lsbCBiZQorIyBqdXN0IGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCisKK2Jwc3JjID0gJChmaWx0ZXItb3V0ICV+LCQod2lsZGNhcmQgKi0tKikpCitib2lsZXJwbGF0ZXMubWFkZSA6ICQoYnBzcmMpCisJbHMgKi0tKiAyPi9kZXYvbnVsbCB8IFwKKwl3aGlsZSByZWFkIGJvaWxlcnBsYXRlOyBcCisJZG8gXAorCQljYXNlICIkJGJvaWxlcnBsYXRlIiBpbiAqfikgY29udGludWUgOzsgZXNhYyAmJiBcCisJCWRzdD1gZWNobyAiJCRib2lsZXJwbGF0ZSIgfCBzZWQgLWUgJ3N8XnRoaXN8Lnw7c3wtLXwvfGcnYCAmJiBcCisJCWRpcj1gZXhwciAiJCRkc3QiIDogJ1woLipcKS8nYCAmJiBcCisJCW1rZGlyIC1wIGJsdC8kJGRpciAmJiBcCisJCWNhc2UgIiQkYm9pbGVycGxhdGUiIGluIFwKKwkJKi0tKSA7OyBcCisJCSopIGNwICQkYm9pbGVycGxhdGUgYmx0LyQkZHN0IDs7IFwKKwkJZXNhYyB8fCBleGl0OyBcCisJZG9uZSB8fCBleGl0CisJZGF0ZSA+JEAKKworIyBJZiB5b3UgbmVlZCBidWlsZC10YWlsb3JlZCB0ZW1wbGF0ZXMsIGJ1aWxkIHRoZW0gaW50byBibHQvCisjIGRpcmVjdG9yeSB5b3Vyc2VsZiBoZXJlLgorY3VzdG9tOgorCTogbm8gY3VzdG9tIHRlbXBsYXRlcyB5ZXQKKworY2xlYW46CisJcm0gLXJmIGJsdCBib2lsZXJwbGF0ZXMubWFkZQorCitpbnN0YWxsOiBhbGwKKwkkKElOU1RBTEwpIC1kIC1tNzU1ICQoY2FsbCBzaGVsbHF1b3RlLCQoREVTVERJUikkKHRlbXBsYXRlX2RpcikpCisJKGNkIGJsdCAmJiAkKFRBUikgY2YgLSAuKSB8IFwKKwkoY2QgJChjYWxsIHNoZWxscXVvdGUsJChERVNURElSKSQodGVtcGxhdGVfZGlyKSkgJiYgJChUQVIpIHhmIC0pCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvYnJhbmNoZXMtLSBiL3RlbXBsYXRlcy9icmFuY2hlcy0tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTg4NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvYnJhbmNoZXMtLQpAQCAtMCwwICsxIEBACis6IHRoaXMgaXMganVzdCB0byBlbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLWFwcGx5cGF0Y2gtbXNnIGIvdGVtcGxhdGVzL2hvb2tzLS1hcHBseXBhdGNoLW1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRlMWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS1hcHBseXBhdGNoLW1zZwpAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBjaGVjayB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIHRha2VuIGJ5CisjIGFwcGx5cGF0Y2ggZnJvbSBhbiBlLW1haWwgbWVzc2FnZS4KKyMKKyMgVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbgorIyBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIGl0IHdhbnRzIHRvIHN0b3AgdGhlIGNvbW1pdC4gIFRoZSBob29rIGlzCisjIGFsbG93ZWQgdG8gZWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgZmlsZS4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworLiBnaXQtc2gtc2V0dXAKK3Rlc3QgLXggIiRHSVRfRElSL2hvb2tzL2NvbW1pdC1tc2ciICYmCisJZXhlYyAiJEdJVF9ESVIvaG9va3MvY29tbWl0LW1zZyIgJHsxKyIkQCJ9Cis6CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLWNvbW1pdC1tc2cgYi90ZW1wbGF0ZXMvaG9va3MtLWNvbW1pdC1tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzODIyZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tY29tbWl0LW1zZwpAQCAtMCwwICsxLDE0IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBjaGVjayB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLgorIyBDYWxsZWQgYnkgZ2l0LWNvbW1pdCB3aXRoIG9uZSBhcmd1bWVudCwgdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyMgdGhhdCBoYXMgdGhlIGNvbW1pdCBtZXNzYWdlLiAgVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybworIyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIGl0IHdhbnRzIHRvIHN0b3AgdGhlCisjIGNvbW1pdC4gIFRoZSBob29rIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgZmlsZS4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworIyBUaGlzIGV4YW1wbGUgY2F0Y2hlcyBkdXBsaWNhdGUgU2lnbmVkLW9mZi1ieSBsaW5lcy4KKwordGVzdCAiIiA9ICIkKGdyZXAgJ15TaWduZWQtb2ZmLWJ5OiAnICIkMSIgfAorCSBzb3J0IHwgdW5pcSAtYyB8IHNlZCAtZSAnL15bIAldKjEgL2QnKSIKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1jb21taXQgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtY29tbWl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTZmMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtY29tbWl0CkBAIC0wLDAgKzEsOCBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGNvbW1pdCBpcyBtYWRlLgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlLgorCis6IE5vdGhpbmcKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcG9zdC11cGRhdGUgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtdXBkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmE4OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtdXBkYXRlCkBAIC0wLDAgKzEsOCBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdG8gcHJlcGFyZSBhIHBhY2tlZCByZXBvc2l0b3J5IGZvciB1c2Ugb3ZlcgorIyBkdW1iIHRyYW5zcG9ydHMuCisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUgYnkgImNobW9kICt4IHBvc3QtdXBkYXRlIi4KKworZXhlYyBnaXQtdXBkYXRlLXNlcnZlci1pbmZvCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXByZS1hcHBseXBhdGNoIGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtYXBwbHlwYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjU2Y2U4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtYXBwbHlwYXRjaApAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byB2ZXJpZnkgd2hhdCBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQKKyMgYnkgYXBwbHlwYXRjaCBmcm9tIGFuIGUtbWFpbCBtZXNzYWdlLgorIworIyBUaGUgaG9vayBzaG91bGQgZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyBhZnRlciBpc3N1aW5nIGFuCisjIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaWYgaXQgd2FudHMgdG8gc3RvcCB0aGUgY29tbWl0LgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlLgorCisuIGdpdC1zaC1zZXR1cAordGVzdCAteCAiJEdJVF9ESVIvaG9va3MvcHJlLWNvbW1pdCIgJiYKKwlleGVjICIkR0lUX0RJUi9ob29rcy9wcmUtY29tbWl0IiAkezErIiRAIn0KKzoKKwpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS1wcmUtY29tbWl0IGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtY29tbWl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyM2E5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdG8gdmVyaWZ5IHdoYXQgaXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkLgorIyBDYWxsZWQgYnkgZ2l0LWNvbW1pdCB3aXRoIG5vIGFyZ3VtZW50cy4gIFRoZSBob29rIHNob3VsZAorIyBleGl0IHdpdGggbm9uLXplcm8gc3RhdHVzIGFmdGVyIGlzc3VpbmcgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBpZgorIyBpdCB3YW50cyB0byBzdG9wIHRoZSBjb21taXQuCisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUuCisKKyMgVGhpcyBpcyBzbGlnaHRseSBtb2RpZmllZCBmcm9tIEFuZHJldyBNb3J0b24ncyBQZXJmZWN0IFBhdGNoLgorIyBMaW5lcyB5b3UgaW50cm9kdWNlIHNob3VsZCBub3QgaGF2ZSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorIyBBbHNvIGNoZWNrIGZvciBhbiBpbmRlbnRhdGlvbiB0aGF0IGhhcyBTUCBiZWZvcmUgYSBUQUIuCisKK2lmIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCAyPi9kZXYvbnVsbAordGhlbgorCWdpdC1kaWZmLWluZGV4IC1wIC1NIC0tY2FjaGVkIEhFQUQKK2Vsc2UKKwkjIE5FRURTV09SSzogd2Ugc2hvdWxkIHByb2R1Y2UgYSBkaWZmIHdpdGggYW4gZW1wdHkgdHJlZSBoZXJlCisJIyBpZiB3ZSB3YW50IHRvIGRvIHRoZSBzYW1lIHZlcmlmaWNhdGlvbiBmb3IgdGhlIGluaXRpYWwgaW1wb3J0LgorCToKK2ZpIHwKK3BlcmwgLWUgJworICAgIG15ICRmb3VuZF9iYWQgPSAwOworICAgIG15ICRmaWxlbmFtZTsKKyAgICBteSAkcmVwb3J0ZWRfZmlsZW5hbWUgPSAiIjsKKyAgICBteSAkbGluZW5vOworICAgIHN1YiBiYWRfbGluZSB7CisJbXkgKCR3aHksICRsaW5lKSA9IEBfOworCWlmICghJGZvdW5kX2JhZCkgeworCSAgICBwcmludCBTVERFUlIgIipcbiI7CisJICAgIHByaW50IFNUREVSUiAiKiBZb3UgaGF2ZSBzb21lIHN1c3BpY2lvdXMgcGF0Y2ggbGluZXM6XG4iOworCSAgICBwcmludCBTVERFUlIgIipcbiI7CisJICAgICRmb3VuZF9iYWQgPSAxOworCX0KKwlpZiAoJHJlcG9ydGVkX2ZpbGVuYW1lIG5lICRmaWxlbmFtZSkgeworCSAgICBwcmludCBTVERFUlIgIiogSW4gJGZpbGVuYW1lXG4iOworCSAgICAkcmVwb3J0ZWRfZmlsZW5hbWUgPSAkZmlsZW5hbWU7CisJfQorCXByaW50IFNUREVSUiAiKiAkd2h5IChsaW5lICRsaW5lbm8pXG4iOworCXByaW50IFNUREVSUiAiJGZpbGVuYW1lOiRsaW5lbm86JGxpbmVcbiI7CisgICAgfQorICAgIHdoaWxlICg8PikgeworCWlmIChtfF5kaWZmIC0tZ2l0IGEvKC4qKSBiL1wxJHwpIHsKKwkgICAgJGZpbGVuYW1lID0gJDE7CisJICAgIG5leHQ7CisJfQorCWlmICgvXkBAIC1cUysgXCsoXGQrKS8pIHsKKwkgICAgJGxpbmVubyA9ICQxIC0gMTsKKwkgICAgbmV4dDsKKwl9CisJaWYgKC9eIC8pIHsKKwkgICAgJGxpbmVubysrOworCSAgICBuZXh0OworCX0KKwlpZiAocy9eXCsvLykgeworCSAgICAkbGluZW5vKys7CisJICAgIGNob21wOworCSAgICBpZiAoL1xzJC8pIHsKKwkJYmFkX2xpbmUoInRyYWlsaW5nIHdoaXRlc3BhY2UiLCAkXyk7CisJICAgIH0KKwkgICAgaWYgKC9eXHMqIAkvKSB7CisJCWJhZF9saW5lKCJpbmRlbnQgU1AgZm9sbG93ZWQgYnkgYSBUQUIiLCAkXyk7CisJICAgIH0KKwkgICAgaWYgKC9eKD86Wzw+PV0pezd9LykgeworCQliYWRfbGluZSgidW5yZXNvbHZlZCBtZXJnZSBjb25mbGljdCIsICRfKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZXhpdCgkZm91bmRfYmFkKTsKKycKKwpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS1wcmUtcmViYXNlIGIvdGVtcGxhdGVzL2hvb2tzLS1wcmUtcmViYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MWM0NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1yZWJhc2UKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKworcHVibGlzaD1uZXh0CitiYXNlYnJhbmNoPSIkMSIKK2lmIHRlc3QgIiQjIiA9IDIKK3RoZW4KKwl0b3BpYz0icmVmcy9oZWFkcy8kMiIKK2Vsc2UKKwl0b3BpYz1gZ2l0IHN5bWJvbGljLXJlZiBIRUFEYAorZmkKKworY2FzZSAiJGJhc2VicmFuY2gsJHRvcGljIiBpbgorbWFzdGVyLHJlZnMvaGVhZHMvPz8vKikKKwk7OworKikKKwlleGl0IDAgOyMgd2UgZG8gbm90IGludGVycnVwdCBvdGhlcnMuCisJOzsKK2VzYWMKKworIyBOb3cgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHRvcGljIGJyYW5jaCBiZWluZyByZWJhc2VkCisjIG9uIHRvcCBvZiBtYXN0ZXIuICBJcyBpdCBPSyB0byByZWJhc2UgaXQ/CisKKyMgSXMgdG9waWMgZnVsbHkgbWVyZ2VkIHRvIG1hc3Rlcj8KK25vdF9pbl9tYXN0ZXI9YGdpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIF5tYXN0ZXIgIiR0b3BpYyJgCitpZiB0ZXN0IC16ICIkbm90X2luX21hc3RlciIKK3RoZW4KKwllY2hvID4mMiAiJHRvcGljIGlzIGZ1bGx5IG1lcmdlZCB0byBtYXN0ZXI7IGJldHRlciByZW1vdmUgaXQuIgorCWV4aXQgMSA7IyB3ZSBjb3VsZCBhbGxvdyBpdCwgYnV0IHRoZXJlIGlzIG5vIHBvaW50LgorZmkKKworIyBJcyB0b3BpYyBldmVyIG1lcmdlZCB0byBuZXh0PyAgSWYgc28geW91IHNob3VsZCBub3QgYmUgcmViYXNpbmcgaXQuCitvbmx5X25leHRfMT1gZ2l0LXJldi1saXN0IF5tYXN0ZXIgIl4kdG9waWMiICR7cHVibGlzaH0gfCBzb3J0YAorb25seV9uZXh0XzI9YGdpdC1yZXYtbGlzdCBebWFzdGVyICAgICAgICAgICAke3B1Ymxpc2h9IHwgc29ydGAKK2lmIHRlc3QgIiRvbmx5X25leHRfMSIgPSAiJG9ubHlfbmV4dF8yIgordGhlbgorCW5vdF9pbl90b3BpYz1gZ2l0LXJldi1saXN0ICJeJHRvcGljIiBtYXN0ZXJgCisJaWYgdGVzdCAteiAiJG5vdF9pbl90b3BpYyIKKwl0aGVuCisJCWVjaG8gPiYyICIkdG9waWMgaXMgYWxyZWFkeSB1cC10by1kYXRlIHdpdGggbWFzdGVyIgorCQlleGl0IDEgOyMgd2UgY291bGQgYWxsb3cgaXQsIGJ1dCB0aGVyZSBpcyBubyBwb2ludC4KKwllbHNlCisJCWV4aXQgMAorCWZpCitlbHNlCisJbm90X2luX25leHQ9YGdpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIF4ke3B1Ymxpc2h9ICIkdG9waWMiYAorCXBlcmwgLWUgJworCQlteSAkdG9waWMgPSAkQVJHVlswXTsKKwkJbXkgJG1zZyA9ICIqICR0b3BpYyBoYXMgY29tbWl0cyBhbHJlYWR5IG1lcmdlZCB0byBwdWJsaWMgYnJhbmNoOlxuIjsKKwkJbXkgKCVub3RfaW5fbmV4dCkgPSBtYXAgeworCQkJL14oWzAtOWEtZl0rKSAvOworCQkJKCQxID0+IDEpOworCQl9IHNwbGl0KC9cbi8sICRBUkdWWzFdKTsKKwkJZm9yIG15ICRlbGVtIChtYXAgeworCQkJCS9eKFswLTlhLWZdKykgKC4qKSQvOworCQkJCVskMSA9PiAkMl07CisJCQl9IHNwbGl0KC9cbi8sICRBUkdWWzJdKSkgeworCQkJaWYgKCFleGlzdHMgJG5vdF9pbl9uZXh0eyRlbGVtLT5bMF19KSB7CisJCQkJaWYgKCRtc2cpIHsKKwkJCQkJcHJpbnQgU1RERVJSICRtc2c7CisJCQkJCXVuZGVmICRtc2c7CisJCQkJfQorCQkJCXByaW50IFNUREVSUiAiICRlbGVtLT5bMV1cbiI7CisJCQl9CisJCX0KKwknICIkdG9waWMiICIkbm90X2luX25leHQiICIkbm90X2luX21hc3RlciIKKwlleGl0IDEKK2ZpCisKK2V4aXQgMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1RoaXMgc2FtcGxlIGhvb2sgc2FmZWd1YXJkcyB0b3BpYyBicmFuY2hlcyB0aGF0IGhhdmUgYmVlbgorcHVibGlzaGVkIGZyb20gYmVpbmcgcmV3b3VuZC4KKworVGhlIHdvcmtmbG93IGFzc3VtZWQgaGVyZSBpczoKKworICogT25jZSBhIHRvcGljIGJyYW5jaCBmb3JrcyBmcm9tICJtYXN0ZXIiLCAibWFzdGVyIiBpcyBuZXZlcgorICAgbWVyZ2VkIGludG8gaXQgYWdhaW4gKGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5KS4KKworICogT25jZSBhIHRvcGljIGJyYW5jaCBpcyBmdWxseSBjb29rZWQgYW5kIG1lcmdlZCBpbnRvICJtYXN0ZXIiLAorICAgaXQgaXMgZGVsZXRlZC4gIElmIHlvdSBuZWVkIHRvIGJ1aWxkIG9uIHRvcCBvZiBpdCB0byBjb3JyZWN0CisgICBlYXJsaWVyIG1pc3Rha2VzLCBhIG5ldyB0b3BpYyBicmFuY2ggaXMgY3JlYXRlZCBieSBmb3JraW5nIGF0CisgICB0aGUgdGlwIG9mIHRoZSAibWFzdGVyIi4gIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0CisgICBpdCBtYWtlcyBpdCBlYXNpZXIgdG8ga2VlcCB5b3VyIGhpc3Rvcnkgc2ltcGxlLgorCisgKiBXaGVuZXZlciB5b3UgbmVlZCB0byB0ZXN0IG9yIHB1Ymxpc2ggeW91ciBjaGFuZ2VzIHRvIHRvcGljCisgICBicmFuY2hlcywgbWVyZ2UgdGhlbSBpbnRvICJuZXh0IiBicmFuY2guCisKK1RoZSBzY3JpcHQsIGJlaW5nIGFuIGV4YW1wbGUsIGhhcmRjb2RlcyB0aGUgcHVibGlzaCBicmFuY2ggbmFtZQordG8gYmUgIm5leHQiLCBidXQgaXQgaXMgdHJpdmlhbCB0byBtYWtlIGl0IGNvbmZpZ3VyYWJsZSB2aWEKKyRHSVRfRElSL2NvbmZpZyBtZWNoYW5pc20uCisKK1dpdGggdGhpcyB3b3JrZmxvdywgeW91IHdvdWxkIHdhbnQgdG8ga25vdzoKKworKDEpIC4uLiBpZiBhIHRvcGljIGJyYW5jaCBoYXMgZXZlciBiZWVuIG1lcmdlZCB0byAibmV4dCIuICBZb3VuZworICAgIHRvcGljIGJyYW5jaGVzIGNhbiBoYXZlIHN0dXBpZCBtaXN0YWtlcyB5b3Ugd291bGQgcmF0aGVyCisgICAgY2xlYW4gdXAgYmVmb3JlIHB1Ymxpc2hpbmcsIGFuZCB0aGluZ3MgdGhhdCBoYXZlIG5vdCBiZWVuCisgICAgbWVyZ2VkIGludG8gb3RoZXIgYnJhbmNoZXMgY2FuIGJlIGVhc2lseSByZWJhc2VkIHdpdGhvdXQKKyAgICBhZmZlY3Rpbmcgb3RoZXIgcGVvcGxlLiAgQnV0IG9uY2UgaXQgaXMgcHVibGlzaGVkLCB5b3Ugd291bGQKKyAgICBub3Qgd2FudCB0byByZXdpbmQgaXQuCisKKygyKSAuLi4gaWYgYSB0b3BpYyBicmFuY2ggaGFzIGJlZW4gZnVsbHkgbWVyZ2VkIHRvICJtYXN0ZXIiLgorICAgIFRoZW4geW91IGNhbiBkZWxldGUgaXQuICBNb3JlIGltcG9ydGFudGx5LCB5b3Ugc2hvdWxkIG5vdAorICAgIGJ1aWxkIG9uIHRvcCBvZiBpdCAtLSBvdGhlciBwZW9wbGUgbWF5IGFscmVhZHkgd2FudCB0bworICAgIGNoYW5nZSB0aGluZ3MgcmVsYXRlZCB0byB0aGUgdG9waWMgYXMgcGF0Y2hlcyBhZ2FpbnN0IHlvdXIKKyAgICAibWFzdGVyIiwgc28gaWYgeW91IG5lZWQgZnVydGhlciBjaGFuZ2VzLCBpdCBpcyBiZXR0ZXIgdG8KKyAgICBmb3JrIHRoZSB0b3BpYyAocGVyaGFwcyB3aXRoIHRoZSBzYW1lIG5hbWUpIGFmcmVzaCBmcm9tIHRoZQorICAgIHRpcCBvZiAibWFzdGVyIi4KKworTGV0J3MgbG9vayBhdCB0aGlzIGV4YW1wbGU6CisKKwkJICAgby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tbyAibmV4dCIKKwkJICAvICAgICAgIC8gICAgICAgICAgIC8gICAgICAgICAgIC8KKwkJIC8gICBhLS0tYS0tLWIgQSAgICAgLyAgICAgICAgICAgLworCQkvICAgLyAgICAgICAgICAgICAgIC8gICAgICAgICAgIC8KKwkgICAgICAgLyAgIC8gICBjLS0tYy0tLWMtLS1jIEIgICAgICAgICAvCisJICAgICAgLyAgIC8gICAvICAgICAgICAgICAgIFwgICAgICAgICAvCisJICAgICAvICAgLyAgIC8gICBiLS0tYiBDICAgICBcICAgICAgIC8KKwkgICAgLyAgIC8gICAvICAgLyAgICAgICAgICAgICBcICAgICAvCisgICAgLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8gIm1hc3RlciIKKworCitBLCBCIGFuZCBDIGFyZSB0b3BpYyBicmFuY2hlcy4KKworICogQSBoYXMgb25lIGZpeCBzaW5jZSBpdCB3YXMgbWVyZ2VkIHVwIHRvICJuZXh0Ii4KKworICogQiBoYXMgZmluaXNoZWQuICBJdCBoYXMgYmVlbiBmdWxseSBtZXJnZWQgdXAgdG8gIm1hc3RlciIgYW5kICJuZXh0IiwKKyAgIGFuZCBpcyByZWFkeSB0byBiZSBkZWxldGVkLgorCisgKiBDIGhhcyBub3QgbWVyZ2VkIHRvICJuZXh0IiBhdCBhbGwuCisKK1dlIHdvdWxkIHdhbnQgdG8gYWxsb3cgQyB0byBiZSByZWJhc2VkLCByZWZ1c2UgQSwgYW5kIGVuY291cmFnZQorQiB0byBiZSBkZWxldGVkLgorCitUbyBjb21wdXRlICgxKToKKworCWdpdC1yZXYtbGlzdCBebWFzdGVyIF50b3BpYyBuZXh0CisJZ2l0LXJldi1saXN0IF5tYXN0ZXIgICAgICAgIG5leHQKKworCWlmIHRoZXNlIG1hdGNoLCB0b3BpYyBoYXMgbm90IG1lcmdlZCBpbiBuZXh0IGF0IGFsbC4KKworVG8gY29tcHV0ZSAoMik6CisKKwlnaXQtcmV2LWxpc3QgbWFzdGVyLi50b3BpYworCisJaWYgdGhpcyBpcyBlbXB0eSwgaXQgaXMgZnVsbHkgbWVyZ2VkIHRvICJtYXN0ZXIiLgpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS11cGRhdGUgYi90ZW1wbGF0ZXMvaG9va3MtLXVwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E4ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS11cGRhdGUKQEAgLTAsMCArMSw4OSBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdG8gbWFpbCBvdXQgY29tbWl0IHVwZGF0ZSBpbmZvcm1hdGlvbi4KKyMgSXQgYWxzbyBibG9ja3MgdGFncyB0aGF0IGFyZW4ndCBhbm5vdGF0ZWQuCisjIENhbGxlZCBieSBnaXQtcmVjZWl2ZS1wYWNrIHdpdGggYXJndW1lbnRzOiByZWZuYW1lIHNoYTEtb2xkIHNoYTEtbmV3CisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2s6CisjICgxKSBjaGFuZ2UgdGhlIHJlY2lwaWVudCBlLW1haWwgYWRkcmVzcworIyAoMikgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZSBieSAiY2htb2QgK3ggdXBkYXRlIi4KKyMKKworcHJvamVjdD0kKGNhdCAkR0lUX0RJUi9kZXNjcmlwdGlvbikKK3JlY2lwaWVudHM9ImNvbW1pdC1saXN0QHNvbWV3aGVyZS5jb20gY29tbWl0LWxpc3RAc29tZXdoZXJlZWxzZS5jb20iCisKK3JlZl90eXBlPSQoZ2l0IGNhdC1maWxlIC10ICIkMyIpCisKKyMgT25seSBhbGxvdyBhbm5vdGF0ZWQgdGFncyBpbiBhIHNoYXJlZCByZXBvCisjIFJlbW92ZSB0aGlzIGNvZGUgdG8gdHJlYXQgZHVtYiB0YWdzIHRoZSBzYW1lIGFzIGV2ZXJ5dGhpbmcgZWxzZQorY2FzZSAiJDEiLCIkcmVmX3R5cGUiIGluCityZWZzL3RhZ3MvKixjb21taXQpCisJZWNobyAiKioqIFVuLWFubm90YXRlZCB0YWdzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHJlcG8iID4mMgorCWVjaG8gIioqKiBVc2UgJ2dpdCB0YWcgWyAtYSB8IC1zIF0nIGZvciB0YWdzIHlvdSB3YW50IHRvIHByb3BhZ2F0ZS4iCisJZXhpdCAxOzsKK3JlZnMvdGFncy8qLHRhZykKKwllY2hvICIjIyMgUHVzaGluZyB2ZXJzaW9uICckezEjI3JlZnMvdGFncy99JyB0byB0aGUgbWFzc2VzIiA+JjIKKwkjIHJlY2lwaWVudHM9InJlbGVhc2UtYW5ub3VuY2VAc29td2VoZXJlLmNvbSBhbm5vdW5jZUBzb21ld2hlcmVlbHNlLmNvbSIKKwk7OworZXNhYworCisjIHNldCB0aGlzICB0byAnY2F0JyB0byBnZXQgYSB2ZXJ5IGRldGFpbGVkIGxpc3RpbmcuCisjIHNob3J0IG9ubHkga2lja3MgaW4gd2hlbiBhbiBhbm5vdGF0ZWQgdGFnIGlzIGFkZGVkCitzaG9ydD0nZ2l0IHNob3J0bG9nJworCisjIHNlZSAnZGF0ZSAtLWhlbHAnIGZvciBpbmZvIG9uIGhvdyB0byB3cml0ZSB0aGlzCisjIFRoZSBkZWZhdWx0IGlzIGEgaHVtYW4tcmVhZGFibGUgaXNvODYwMS1saWtlIGZvcm1hdCB3aXRoIG1pbnV0ZQorIyBwcmVjaXNpb24gKCcyMDA2LTAxLTI1IDE1OjU4ICswMTAwJyBmb3IgZXhhbXBsZSkKK2RhdGVfZm9ybWF0PSIlRiAlUiAleiIKKworKGlmIGV4cHIgIiQyIiA6ICcwKiQnID4vZGV2L251bGwKK3RoZW4KKwkjIG5ldyByZWYKKwljYXNlICIkMSIgaW4KKwlyZWZzL3RhZ3MvKikKKwkJIyBhIHB1c2hlZCBhbmQgYW5ub3RhdGVkIHRhZyAodXN1YWxseSkgbWVhbnMgYSBuZXcgdmVyc2lvbgorCQl0YWc9IiR7MSMjcmVmcy90YWdzL30iCisJCWlmIFsgIiRyZWZfdHlwZSIgPSB0YWcgXTsgdGhlbgorCQkJZXZhbCAkKGdpdCBjYXQtZmlsZSB0YWcgJDMgfCBcCisJCQkJc2VkIC1uICc0cy90YWdnZXIgXChbXj5dKj5cKVteMC05XSpcKFswLTldKlwpLiovdGFnZ2VyPSJcMSIgdHM9IlwyIi9wJykKKwkJCWRhdGU9JChkYXRlIC0tZGF0ZT0iMTk3MC0wMS0wMSAwMDowMDowMCAkdHMgc2Vjb25kcyIgKyIkZGF0ZV9mb3JtYXQiKQorCQkJZWNobyAiVGFnICckdGFnJyBjcmVhdGVkIGJ5ICR0YWdnZXIgYXQgJGRhdGUiCisJCQlnaXQgY2F0LWZpbGUgdGFnICQzIHwgc2VkIC1uICc1LCRwJworCQkJZWNobworCQlmaQorCQlwcmV2PSQoZ2l0IGRlc2NyaWJlICIkM14iIHwgc2VkICdzLy1nLiovLycpCisJCSMgdGhlIGZpcnN0IHRhZyBpbiBhIHJlcG8gd2lsbCB5aWVsZCBubyAkcHJldgorCQlpZiBbIC16ICIkcHJldiIgXTsgdGhlbgorCQkJZWNobyAiQ2hhbmdlcyBzaW5jZSB0aGUgZGF3biBvZiB0aW1lOiIKKwkJCWdpdCByZXYtbGlzdCAtLXByZXR0eSAkMyB8ICRzaG9ydAorCQllbHNlCisJCQllY2hvICJDaGFuZ2VzIHNpbmNlICRwcmV2OiIKKwkJCWdpdCByZXYtbGlzdCAtLXByZXR0eSAkcHJldi4uJDMgfCAkc2hvcnQKKwkJCWVjaG8gLS0tCisJCQlnaXQgZGlmZiAkcHJldi4uJDMgfCBkaWZmc3RhdCAtcDEKKwkJCWVjaG8gLS0tCisJCWZpCisJCTs7CisKKwlyZWZzL2hlYWRzLyopCisJCWJyYW5jaD0iJHsxIyNyZWZzL2hlYWRzL30iCisJCWVjaG8gIk5ldyBicmFuY2ggJyRicmFuY2gnIGF2YWlsYWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWl0czoiCisJCWdpdC1yZXYtbGlzdCAtLXByZXR0eSAiJDMiICQoZ2l0LXJldi1wYXJzZSAtLW5vdCAtLWFsbCkKKwkJOzsKKwllc2FjCitlbHNlCisJYmFzZT0kKGdpdC1tZXJnZS1iYXNlICIkMiIgIiQzIikKKwljYXNlICIkYmFzZSIgaW4KKwkiJDIiKQorCQlnaXQgZGlmZiAiJDMiICJeJGJhc2UiIHwgZGlmZnN0YXQgLXAxCisJCWVjaG8KKwkJZWNobyAiTmV3IGNvbW1pdHM6IgorCQk7OworCSopCisJCWVjaG8gIlJlYmFzZWQgcmVmLCBjb21taXRzIGZyb20gY29tbW9uIGFuY2VzdG9yOiIKKwkJOzsKKwllc2FjCisJZ2l0LXJldi1saXN0IC0tcHJldHR5ICIkMyIgIl4kYmFzZSIKK2ZpKSB8CittYWlsIC1zICIkcHJvamVjdDogQ2hhbmdlcyB0byAnJHsxIyNyZWZzL2hlYWRzL30nIiAkcmVjaXBpZW50cworZXhpdCAwCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaW5mby0tZXhjbHVkZSBiL3RlbXBsYXRlcy9pbmZvLS1leGNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODdiNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaW5mby0tZXhjbHVkZQpAQCAtMCwwICsxLDYgQEAKKyMgZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZS1mcm9tPS5naXQvaW5mby9leGNsdWRlCisjIExpbmVzIHRoYXQgc3RhcnQgd2l0aCAnIycgYXJlIGNvbW1lbnRzLgorIyBGb3IgYSBwcm9qZWN0IG1vc3RseSBpbiBDLCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIGEgZ29vZCBzZXQgb2YKKyMgZXhjbHVkZSBwYXR0ZXJucyAodW5jb21tZW50IHRoZW0gaWYgeW91IHdhbnQgdG8gdXNlIHRoZW0pOgorIyAqLltvYV0KKyMgKn4KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9yZW1vdGVzLS0gYi90ZW1wbGF0ZXMvcmVtb3Rlcy0tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTg4NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvcmVtb3Rlcy0tCkBAIC0wLDAgKzEgQEAKKzogdGhpcyBpcyBqdXN0IHRvIGVuc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy90aGlzLS1kZXNjcmlwdGlvbiBiL3RlbXBsYXRlcy90aGlzLS1kZXNjcmlwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYyNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL3RoaXMtLWRlc2NyaXB0aW9uCkBAIC0wLDAgKzEgQEAKK1VubmFtZWQgcmVwb3NpdG9yeTsgZWRpdCB0aGlzIGZpbGUgdG8gbmFtZSBpdCBmb3IgZ2l0d2ViLgpkaWZmIC0tZ2l0IGEvdGVzdC1kYXRlLmMgYi90ZXN0LWRhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U4MDI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1kYXRlLmMKQEAgLTAsMCArMSwyMyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyIHJlc3VsdFsxMDBdOworCQl0aW1lX3QgdDsKKworCQltZW1jcHkocmVzdWx0LCAiYmFkIiwgNCk7CisJCXBhcnNlX2RhdGUoYXJndltpXSwgcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisJCXQgPSBzdHJ0b3VsKHJlc3VsdCwgTlVMTCwgMCk7CisJCXByaW50ZigiJXMgLT4gJXMgLT4gJXMiLCBhcmd2W2ldLCByZXN1bHQsIGN0aW1lKCZ0KSk7CisKKwkJdCA9IGFwcHJveGlkYXRlKGFyZ3ZbaV0pOworCQlwcmludGYoIiVzIC0+ICVzXG4iLCBhcmd2W2ldLCBjdGltZSgmdCkpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZGVsdGEuYyBiL3Rlc3QtZGVsdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU4ZWUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1kZWx0YS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiB0ZXN0LWRlbHRhLmM6IHRlc3QgY29kZSB0byBleGVyY2lzZSBkaWZmLWRlbHRhLmMgYW5kIHBhdGNoLWRlbHRhLmMKKyAqCisgKiAoQykgMjAwNSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJkZWx0YS5oIgorCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZVtdID0KKwkidGVzdC1kZWx0YSAoLWR8LXApIDxmcm9tX2ZpbGU+IDxkYXRhX2ZpbGU+IDxvdXRfZmlsZT4iOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl2b2lkICpmcm9tX2J1ZiwgKmRhdGFfYnVmLCAqb3V0X2J1ZjsKKwl1bnNpZ25lZCBsb25nIGZyb21fc2l6ZSwgZGF0YV9zaXplLCBvdXRfc2l6ZTsKKworCWlmIChhcmdjICE9IDUgfHwgKHN0cmNtcChhcmd2WzFdLCAiLWQiKSAmJiBzdHJjbXAoYXJndlsxXSwgIi1wIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzXG4iLCB1c2FnZSk7CisJCXJldHVybiAxOworCX0KKworCWZkID0gb3Blbihhcmd2WzJdLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCB8fCBmc3RhdChmZCwgJnN0KSkgeworCQlwZXJyb3IoYXJndlsyXSk7CisJCXJldHVybiAxOworCX0KKwlmcm9tX3NpemUgPSBzdC5zdF9zaXplOworCWZyb21fYnVmID0gbW1hcChOVUxMLCBmcm9tX3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoZnJvbV9idWYgPT0gTUFQX0ZBSUxFRCkgeworCQlwZXJyb3IoYXJndlsyXSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDE7CisJfQorCWNsb3NlKGZkKTsKKworCWZkID0gb3Blbihhcmd2WzNdLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCB8fCBmc3RhdChmZCwgJnN0KSkgeworCQlwZXJyb3IoYXJndlszXSk7CisJCXJldHVybiAxOworCX0KKwlkYXRhX3NpemUgPSBzdC5zdF9zaXplOworCWRhdGFfYnVmID0gbW1hcChOVUxMLCBkYXRhX3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoZGF0YV9idWYgPT0gTUFQX0ZBSUxFRCkgeworCQlwZXJyb3IoYXJndlszXSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDE7CisJfQorCWNsb3NlKGZkKTsKKworCWlmIChhcmd2WzFdWzFdID09ICdkJykKKwkJb3V0X2J1ZiA9IGRpZmZfZGVsdGEoZnJvbV9idWYsIGZyb21fc2l6ZSwKKwkJCQkgICAgIGRhdGFfYnVmLCBkYXRhX3NpemUsCisJCQkJICAgICAmb3V0X3NpemUsIDApOworCWVsc2UKKwkJb3V0X2J1ZiA9IHBhdGNoX2RlbHRhKGZyb21fYnVmLCBmcm9tX3NpemUsCisJCQkJICAgICAgZGF0YV9idWYsIGRhdGFfc2l6ZSwKKwkJCQkgICAgICAmb3V0X3NpemUpOworCWlmICghb3V0X2J1ZikgeworCQlmcHJpbnRmKHN0ZGVyciwgImRlbHRhIG9wZXJhdGlvbiBmYWlsZWQgKHJldHVybmVkIE5VTEwpXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZmQgPSBvcGVuIChhcmd2WzRdLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIDA2NjYpOworCWlmIChmZCA8IDAgfHwgd3JpdGUoZmQsIG91dF9idWYsIG91dF9zaXplKSAhPSBvdXRfc2l6ZSkgeworCQlwZXJyb3IoYXJndls0XSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdHJlZS1kaWZmLmMgYi90cmVlLWRpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2RmOGFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS1kaWZmLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmVlIGRpZmYgZ2VuZXJhdGlvbgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdGF0aWMgY2hhciAqbWFsbG9jX2Jhc2UoY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4pCit7CisJaW50IGJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJY2hhciAqbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIHBhdGhsZW4gKyAyKTsKKwltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBwYXRoLCBwYXRobGVuKTsKKwltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4gKyBwYXRobGVuLCAiLyIsIDIpOworCXJldHVybiBuZXdiYXNlOworfQorCitzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKmJhc2UpOworCitzdGF0aWMgaW50IGNvbXBhcmVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICp0MSwgc3RydWN0IHRyZWVfZGVzYyAqdDIsIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwl1bnNpZ25lZCBtb2RlMSwgbW9kZTI7CisJY29uc3QgY2hhciAqcGF0aDEsICpwYXRoMjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCAqc2hhMjsKKwlpbnQgY21wLCBwYXRobGVuMSwgcGF0aGxlbjI7CisKKwlzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KHQxLCAmcGF0aDEsICZtb2RlMSk7CisJc2hhMiA9IHRyZWVfZW50cnlfZXh0cmFjdCh0MiwgJnBhdGgyLCAmbW9kZTIpOworCisJcGF0aGxlbjEgPSBzdHJsZW4ocGF0aDEpOworCXBhdGhsZW4yID0gc3RybGVuKHBhdGgyKTsKKwljbXAgPSBiYXNlX25hbWVfY29tcGFyZShwYXRoMSwgcGF0aGxlbjEsIG1vZGUxLCBwYXRoMiwgcGF0aGxlbjIsIG1vZGUyKTsKKwlpZiAoY21wIDwgMCkgeworCQlzaG93X2VudHJ5KG9wdCwgIi0iLCB0MSwgYmFzZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGNtcCA+IDApIHsKKwkJc2hvd19lbnRyeShvcHQsICIrIiwgdDIsIGJhc2UpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFvcHQtPmZpbmRfY29waWVzX2hhcmRlciAmJgorCSAgICAhbWVtY21wKHNoYTEsIHNoYTIsIDIwKSAmJiBtb2RlMSA9PSBtb2RlMikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBmaWxlbW9kZSBoYXMgY2hhbmdlZCB0by9mcm9tIGEgZGlyZWN0b3J5IGZyb20vdG8gYSByZWd1bGFyCisJICogZmlsZSwgd2UgbmVlZCB0byBjb25zaWRlciBpdCBhIHJlbW92ZSBhbmQgYW4gYWRkLgorCSAqLworCWlmIChTX0lTRElSKG1vZGUxKSAhPSBTX0lTRElSKG1vZGUyKSkgeworCQlzaG93X2VudHJ5KG9wdCwgIi0iLCB0MSwgYmFzZSk7CisJCXNob3dfZW50cnkob3B0LCAiKyIsIHQyLCBiYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9wdC0+cmVjdXJzaXZlICYmIFNfSVNESVIobW9kZTEpKSB7CisJCWludCByZXR2YWw7CisJCWNoYXIgKm5ld2Jhc2UgPSBtYWxsb2NfYmFzZShiYXNlLCBwYXRoMSwgcGF0aGxlbjEpOworCQlpZiAob3B0LT50cmVlX2luX3JlY3Vyc2l2ZSkKKwkJCW9wdC0+Y2hhbmdlKG9wdCwgbW9kZTEsIG1vZGUyLAorCQkJCSAgICBzaGExLCBzaGEyLCBiYXNlLCBwYXRoMSk7CisJCXJldHZhbCA9IGRpZmZfdHJlZV9zaGExKHNoYTEsIHNoYTIsIG5ld2Jhc2UsIG9wdCk7CisJCWZyZWUobmV3YmFzZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJb3B0LT5jaGFuZ2Uob3B0LCBtb2RlMSwgbW9kZTIsIHNoYTEsIHNoYTIsIGJhc2UsIHBhdGgxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlcmVzdGluZyhzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJY29uc3QgY2hhciAqcGF0aDsKKwl1bnNpZ25lZCBtb2RlOworCWludCBpOworCWludCBiYXNlbGVuLCBwYXRobGVuOworCisJaWYgKCFvcHQtPm5yX3BhdGhzKQorCQlyZXR1cm4gMTsKKworCSh2b2lkKXRyZWVfZW50cnlfZXh0cmFjdChkZXNjLCAmcGF0aCwgJm1vZGUpOworCisJcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKwliYXNlbGVuID0gc3RybGVuKGJhc2UpOworCisJZm9yIChpPTA7IGkgPCBvcHQtPm5yX3BhdGhzOyBpKyspIHsKKwkJY29uc3QgY2hhciAqbWF0Y2ggPSBvcHQtPnBhdGhzW2ldOworCQlpbnQgbWF0Y2hsZW4gPSBvcHQtPnBhdGhsZW5zW2ldOworCisJCWlmIChiYXNlbGVuID49IG1hdGNobGVuKSB7CisJCQkvKiBJZiBpdCBkb2Vzbid0IG1hdGNoLCBtb3ZlIGFsb25nLi4uICovCisJCQlpZiAoc3RybmNtcChiYXNlLCBtYXRjaCwgbWF0Y2hsZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBUaGUgYmFzZSBpcyBhIHN1YmRpcmVjdG9yeSBvZiBhIHBhdGggd2hpY2ggd2FzIHNwZWNpZmllZC4gKi8KKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogRG9lcyB0aGUgYmFzZSBtYXRjaD8gKi8KKwkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIGJhc2VsZW4pKQorCQkJY29udGludWU7CisKKwkJbWF0Y2ggKz0gYmFzZWxlbjsKKwkJbWF0Y2hsZW4gLT0gYmFzZWxlbjsKKworCQlpZiAocGF0aGxlbiA+IG1hdGNobGVuKQorCQkJY29udGludWU7CisKKwkJaWYgKG1hdGNobGVuID4gcGF0aGxlbikgeworCQkJaWYgKG1hdGNoW3BhdGhsZW5dICE9ICcvJykKKwkJCQljb250aW51ZTsKKwkJCWlmICghU19JU0RJUihtb2RlKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJuY21wKHBhdGgsIG1hdGNoLCBwYXRobGVuKSkKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsgLyogTm8gbWF0Y2hlcyAqLworfQorCisvKiBBIHdob2xlIHN1Yi10cmVlIHdlbnQgYXdheSBvciBhcHBlYXJlZCAqLworc3RhdGljIHZvaWQgc2hvd190cmVlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpiYXNlKQoreworCXdoaWxlIChkZXNjLT5zaXplKSB7CisJCWlmIChpbnRlcmVzdGluZyhkZXNjLCBiYXNlLCBvcHQpKQorCQkJc2hvd19lbnRyeShvcHQsIHByZWZpeCwgZGVzYywgYmFzZSk7CisJCXVwZGF0ZV90cmVlX2VudHJ5KGRlc2MpOworCX0KK30KKworLyogQSBmaWxlIGVudHJ5IHdlbnQgYXdheSBvciBhcHBlYXJlZCAqLworc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpiYXNlKQoreworCXVuc2lnbmVkIG1vZGU7CisJY29uc3QgY2hhciAqcGF0aDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KGRlc2MsICZwYXRoLCAmbW9kZSk7CisKKwlpZiAob3B0LT5yZWN1cnNpdmUgJiYgU19JU0RJUihtb2RlKSkgeworCQljaGFyIHR5cGVbMjBdOworCQljaGFyICpuZXdiYXNlID0gbWFsbG9jX2Jhc2UoYmFzZSwgcGF0aCwgc3RybGVuKHBhdGgpKTsKKwkJc3RydWN0IHRyZWVfZGVzYyBpbm5lcjsKKwkJdm9pZCAqdHJlZTsKKworCQl0cmVlID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJmlubmVyLnNpemUpOworCQlpZiAoIXRyZWUgfHwgc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpCisJCQlkaWUoImNvcnJ1cHQgdHJlZSBzaGEgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwkJaW5uZXIuYnVmID0gdHJlZTsKKwkJc2hvd190cmVlKG9wdCwgcHJlZml4LCAmaW5uZXIsIG5ld2Jhc2UpOworCisJCWZyZWUodHJlZSk7CisJCWZyZWUobmV3YmFzZSk7CisJCXJldHVybiAwOworCX0KKworCW9wdC0+YWRkX3JlbW92ZShvcHQsIHByZWZpeFswXSwgbW9kZSwgc2hhMSwgYmFzZSwgcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWZmX3RyZWUoc3RydWN0IHRyZWVfZGVzYyAqdDEsIHN0cnVjdCB0cmVlX2Rlc2MgKnQyLCBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJd2hpbGUgKHQxLT5zaXplIHwgdDItPnNpemUpIHsKKwkJaWYgKG9wdC0+bnJfcGF0aHMgJiYgdDEtPnNpemUgJiYgIWludGVyZXN0aW5nKHQxLCBiYXNlLCBvcHQpKSB7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0MSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob3B0LT5ucl9wYXRocyAmJiB0Mi0+c2l6ZSAmJiAhaW50ZXJlc3RpbmcodDIsIGJhc2UsIG9wdCkpIHsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdDEtPnNpemUpIHsKKwkJCXNob3dfZW50cnkob3B0LCAiKyIsIHQyLCBiYXNlKTsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdDItPnNpemUpIHsKKwkJCXNob3dfZW50cnkob3B0LCAiLSIsIHQxLCBiYXNlKTsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAoY29tcGFyZV90cmVlX2VudHJ5KHQxLCB0MiwgYmFzZSwgb3B0KSkgeworCQljYXNlIC0xOgorCQkJdXBkYXRlX3RyZWVfZW50cnkodDEpOworCQkJY29udGludWU7CisJCWNhc2UgMDoKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQxKTsKKwkJCS8qIEZhbGx0aHJvdWdoICovCisJCWNhc2UgMToKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgiZ2l0LWRpZmYtdHJlZTogaW50ZXJuYWwgZXJyb3IiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWZmX3RyZWVfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpvbGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldywgY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCXZvaWQgKnRyZWUxLCAqdHJlZTI7CisJc3RydWN0IHRyZWVfZGVzYyB0MSwgdDI7CisJaW50IHJldHZhbDsKKworCXRyZWUxID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uob2xkLCB0cmVlX3R5cGUsICZ0MS5zaXplLCBOVUxMKTsKKwlpZiAoIXRyZWUxKQorCQlkaWUoInVuYWJsZSB0byByZWFkIHNvdXJjZSB0cmVlICglcykiLCBzaGExX3RvX2hleChvbGQpKTsKKwl0cmVlMiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG5ldywgdHJlZV90eXBlLCAmdDIuc2l6ZSwgTlVMTCk7CisJaWYgKCF0cmVlMikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBkZXN0aW5hdGlvbiB0cmVlICglcykiLCBzaGExX3RvX2hleChuZXcpKTsKKwl0MS5idWYgPSB0cmVlMTsKKwl0Mi5idWYgPSB0cmVlMjsKKwlyZXR2YWwgPSBkaWZmX3RyZWUoJnQxLCAmdDIsIGJhc2UsIG9wdCk7CisJZnJlZSh0cmVlMSk7CisJZnJlZSh0cmVlMik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjb3VudF9wYXRocyhjb25zdCBjaGFyICoqcGF0aHMpCit7CisJaW50IGkgPSAwOworCXdoaWxlICgqcGF0aHMrKykKKwkJaSsrOworCXJldHVybiBpOworfQorCit2b2lkIGRpZmZfdHJlZV9yZWxlYXNlX3BhdGhzKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlmcmVlKG9wdC0+cGF0aGxlbnMpOworfQorCit2b2lkIGRpZmZfdHJlZV9zZXR1cF9wYXRocyhjb25zdCBjaGFyICoqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCW9wdC0+bnJfcGF0aHMgPSAwOworCW9wdC0+cGF0aGxlbnMgPSBOVUxMOworCW9wdC0+cGF0aHMgPSBOVUxMOworCisJaWYgKHApIHsKKwkJaW50IGk7CisKKwkJb3B0LT5wYXRocyA9IHA7CisJCW9wdC0+bnJfcGF0aHMgPSBjb3VudF9wYXRocyhwKTsKKwkJaWYgKG9wdC0+bnJfcGF0aHMgPT0gMCkgeworCQkJb3B0LT5wYXRobGVucyA9IE5VTEw7CisJCQlyZXR1cm47CisJCX0KKwkJb3B0LT5wYXRobGVucyA9IHhtYWxsb2Mob3B0LT5ucl9wYXRocyAqIHNpemVvZihpbnQpKTsKKwkJZm9yIChpPTA7IGkgPCBvcHQtPm5yX3BhdGhzOyBpKyspCisJCQlvcHQtPnBhdGhsZW5zW2ldID0gc3RybGVuKHBbaV0pOworCX0KK30KZGlmZiAtLWdpdCBhL3RyZWUtd2Fsay5jIGIvdHJlZS13YWxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3YzY5NwotLS0gL2Rldi9udWxsCisrKyBiL3RyZWUtd2Fsay5jCkBAIC0wLDAgKzEsMjExIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKK3ZvaWQgKmZpbGxfdHJlZV9kZXNjcmlwdG9yKHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKKwl2b2lkICpidWYgPSBOVUxMOworCisJaWYgKHNoYTEpIHsKKwkJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgdHJlZV90eXBlLCAmc2l6ZSwgTlVMTCk7CisJCWlmICghYnVmKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwlkZXNjLT5zaXplID0gc2l6ZTsKKwlkZXNjLT5idWYgPSBidWY7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBlbnRyeV9jb21wYXJlKHN0cnVjdCBuYW1lX2VudHJ5ICphLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqYikKK3sKKwlyZXR1cm4gYmFzZV9uYW1lX2NvbXBhcmUoCisJCQlhLT5wYXRoLCBhLT5wYXRobGVuLCBhLT5tb2RlLAorCQkJYi0+cGF0aCwgYi0+cGF0aGxlbiwgYi0+bW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVudHJ5X2NsZWFyKHN0cnVjdCBuYW1lX2VudHJ5ICphKQoreworCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKK30KKworc3RhdGljIHZvaWQgZW50cnlfZXh0cmFjdChzdHJ1Y3QgdHJlZV9kZXNjICp0LCBzdHJ1Y3QgbmFtZV9lbnRyeSAqYSkKK3sKKwlhLT5zaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KHQsICZhLT5wYXRoLCAmYS0+bW9kZSk7CisJYS0+cGF0aGxlbiA9IHN0cmxlbihhLT5wYXRoKTsKK30KKwordm9pZCB1cGRhdGVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjKQoreworCWNvbnN0IHZvaWQgKmJ1ZiA9IGRlc2MtPmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBkZXNjLT5zaXplOworCWludCBsZW4gPSBzdHJsZW4oYnVmKSArIDEgKyAyMDsKKworCWlmIChzaXplIDwgbGVuKQorCQlkaWUoImNvcnJ1cHQgdHJlZSBmaWxlIik7CisJZGVzYy0+YnVmID0gYnVmICsgbGVuOworCWRlc2MtPnNpemUgPSBzaXplIC0gbGVuOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X21vZGUoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQgKm1vZGVwKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IDA7CisKKwl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICcgJykgeworCQlpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQorCQkJcmV0dXJuIE5VTEw7CisJCW1vZGUgPSAobW9kZSA8PCAzKSArIChjIC0gJzAnKTsKKwl9CisJKm1vZGVwID0gbW9kZTsKKwlyZXR1cm4gc3RyOworfQorCitjb25zdCB1bnNpZ25lZCBjaGFyICp0cmVlX2VudHJ5X2V4dHJhY3Qoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqKnBhdGhwLCB1bnNpZ25lZCBpbnQgKm1vZGVwKQoreworCWNvbnN0IHZvaWQgKnRyZWUgPSBkZXNjLT5idWY7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZGVzYy0+c2l6ZTsKKwlpbnQgbGVuID0gc3RybGVuKHRyZWUpKzE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSA9IHRyZWUgKyBsZW47CisJY29uc3QgY2hhciAqcGF0aDsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCXBhdGggPSBnZXRfbW9kZSh0cmVlLCAmbW9kZSk7CisJaWYgKCFwYXRoIHx8IHNpemUgPCBsZW4gKyAyMCkKKwkJZGllKCJjb3JydXB0IHRyZWUgZmlsZSIpOworCSpwYXRocCA9IHBhdGg7CisJKm1vZGVwID0gY2Fub25fbW9kZShtb2RlKTsKKwlyZXR1cm4gc2hhMTsKK30KKworaW50IHRyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgc3RydWN0IG5hbWVfZW50cnkgKmVudHJ5KQoreworCWNvbnN0IHZvaWQgKnRyZWUgPSBkZXNjLT5idWYsICpwYXRoOworCXVuc2lnbmVkIGxvbmcgbGVuLCBzaXplID0gZGVzYy0+c2l6ZTsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlwYXRoID0gZ2V0X21vZGUodHJlZSwgJmVudHJ5LT5tb2RlKTsKKwlpZiAoIXBhdGgpCisJCWRpZSgiY29ycnVwdCB0cmVlIGZpbGUiKTsKKworCWVudHJ5LT5wYXRoID0gcGF0aDsKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJZW50cnktPnBhdGhsZW4gPSBsZW47CisKKwlwYXRoICs9IGxlbiArIDE7CisJZW50cnktPnNoYTEgPSBwYXRoOworCisJcGF0aCArPSAyMDsKKwlsZW4gPSBwYXRoIC0gdHJlZTsKKwlpZiAobGVuID4gc2l6ZSkKKwkJZGllKCJjb3JydXB0IHRyZWUgZmlsZSIpOworCisJZGVzYy0+YnVmID0gcGF0aDsKKwlkZXNjLT5zaXplID0gc2l6ZSAtIGxlbjsKKwlyZXR1cm4gMTsKK30KKwordm9pZCB0cmF2ZXJzZV90cmVlcyhpbnQgbiwgc3RydWN0IHRyZWVfZGVzYyAqdCwgY29uc3QgY2hhciAqYmFzZSwgdHJhdmVyc2VfY2FsbGJhY2tfdCBjYWxsYmFjaykKK3sKKwlzdHJ1Y3QgbmFtZV9lbnRyeSAqZW50cnkgPSB4bWFsbG9jKG4qc2l6ZW9mKCplbnRyeSkpOworCisJZm9yICg7OykgeworCQlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeVszXTsKKwkJdW5zaWduZWQgbG9uZyBtYXNrID0gMDsKKwkJaW50IGksIGxhc3Q7CisKKwkJbGFzdCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlpZiAoIXRbaV0uc2l6ZSkKKwkJCQljb250aW51ZTsKKwkJCWVudHJ5X2V4dHJhY3QodCtpLCBlbnRyeStpKTsKKwkJCWlmIChsYXN0ID49IDApIHsKKwkJCQlpbnQgY21wID0gZW50cnlfY29tcGFyZShlbnRyeStpLCBlbnRyeStsYXN0KTsKKworCQkJCS8qCisJCQkJICogSXMgdGhlIG5ldyBuYW1lIGJpZ2dlciB0aGFuIHRoZSBvbGQgb25lPworCQkJCSAqIElnbm9yZSBpdAorCQkJCSAqLworCQkJCWlmIChjbXAgPiAwKQorCQkJCQljb250aW51ZTsKKwkJCQkvKgorCQkJCSAqIElzIHRoZSBuZXcgbmFtZSBzbWFsbGVyIHRoYW4gdGhlIG9sZCBvbmU/CisJCQkJICogSWdub3JlIGFsbCBvbGQgb25lcworCQkJCSAqLworCQkJCWlmIChjbXAgPCAwKQorCQkJCQltYXNrID0gMDsKKwkJCX0KKwkJCW1hc2sgfD0gMXVsIDw8IGk7CisJCQlsYXN0ID0gaTsKKwkJfQorCQlpZiAoIW1hc2spCisJCQlicmVhazsKKworCQkvKgorCQkgKiBVcGRhdGUgdGhlIHRyZWUgZW50cmllcyB3ZSd2ZSB3YWxrZWQsIGFuZCBjbGVhcgorCQkgKiBhbGwgdGhlIHVudXNlZCBuYW1lLWVudHJpZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlpZiAobWFzayAmICgxdWwgPDwgaSkpIHsKKwkJCQl1cGRhdGVfdHJlZV9lbnRyeSh0K2kpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZW50cnlfY2xlYXIoZW50cnkgKyBpKTsKKwkJfQorCQljYWxsYmFjayhuLCBtYXNrLCBlbnRyeSwgYmFzZSk7CisJfQorCWZyZWUoZW50cnkpOworfQorCitzdGF0aWMgaW50IGZpbmRfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICp0LCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIHVuc2lnbmVkICptb2RlKQoreworCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworCXdoaWxlICh0LT5zaXplKSB7CisJCWNvbnN0IGNoYXIgKmVudHJ5OworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCQlpbnQgZW50cnlsZW4sIGNtcDsKKworCQlzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KHQsICZlbnRyeSwgbW9kZSk7CisJCXVwZGF0ZV90cmVlX2VudHJ5KHQpOworCQllbnRyeWxlbiA9IHN0cmxlbihlbnRyeSk7CisJCWlmIChlbnRyeWxlbiA+IG5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJY21wID0gbWVtY21wKG5hbWUsIGVudHJ5LCBlbnRyeWxlbik7CisJCWlmIChjbXAgPiAwKQorCQkJY29udGludWU7CisJCWlmIChjbXAgPCAwKQorCQkJYnJlYWs7CisJCWlmIChlbnRyeWxlbiA9PSBuYW1lbGVuKSB7CisJCQltZW1jcHkocmVzdWx0LCBzaGExLCAyMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobmFtZVtlbnRyeWxlbl0gIT0gJy8nKQorCQkJY29udGludWU7CisJCWlmICghU19JU0RJUigqbW9kZSkpCisJCQlicmVhazsKKwkJaWYgKCsrZW50cnlsZW4gPT0gbmFtZWxlbikgeworCQkJbWVtY3B5KHJlc3VsdCwgc2hhMSwgMjApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIGdldF90cmVlX2VudHJ5KHNoYTEsIG5hbWUgKyBlbnRyeWxlbiwgcmVzdWx0LCBtb2RlKTsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgZ2V0X3RyZWVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqdHJlZV9zaGExLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCAqbW9kZSkKK3sKKwlpbnQgcmV0dmFsOworCXZvaWQgKnRyZWU7CisJc3RydWN0IHRyZWVfZGVzYyB0OworCisJdHJlZSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHRyZWVfc2hhMSwgdHJlZV90eXBlLCAmdC5zaXplLCBOVUxMKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiAtMTsKKwl0LmJ1ZiA9IHRyZWU7CisJcmV0dmFsID0gZmluZF90cmVlX2VudHJ5KCZ0LCBuYW1lLCBzaGExLCBtb2RlKTsKKwlmcmVlKHRyZWUpOworCXJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL3RyZWUtd2Fsay5oIGIvdHJlZS13YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3YmVmYQotLS0gL2Rldi9udWxsCisrKyBiL3RyZWUtd2Fsay5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgVFJFRV9XQUxLX0gKKyNkZWZpbmUgVFJFRV9XQUxLX0gKKworc3RydWN0IHRyZWVfZGVzYyB7CisJY29uc3Qgdm9pZCAqYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKK307CisKK3N0cnVjdCBuYW1lX2VudHJ5IHsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCWNvbnN0IGNoYXIgKnBhdGg7CisJdW5zaWduZWQgaW50IG1vZGU7CisJaW50IHBhdGhsZW47Cit9OworCit2b2lkIHVwZGF0ZV90cmVlX2VudHJ5KHN0cnVjdCB0cmVlX2Rlc2MgKik7Citjb25zdCB1bnNpZ25lZCBjaGFyICp0cmVlX2VudHJ5X2V4dHJhY3Qoc3RydWN0IHRyZWVfZGVzYyAqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKik7CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0aGF0IGRvZXMgYm90aCBvZiB0aGUgYWJvdmUgYW5kIHJldHVybnMgdHJ1ZSBmb3Igc3VjY2VzcyAqLworaW50IHRyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqKTsKKwordm9pZCAqZmlsbF90cmVlX2Rlc2NyaXB0b3Ioc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK3R5cGVkZWYgdm9pZCAoKnRyYXZlcnNlX2NhbGxiYWNrX3QpKGludCBuLCB1bnNpZ25lZCBsb25nIG1hc2ssIHN0cnVjdCBuYW1lX2VudHJ5ICplbnRyeSwgY29uc3QgY2hhciAqYmFzZSk7CisKK3ZvaWQgdHJhdmVyc2VfdHJlZXMoaW50IG4sIHN0cnVjdCB0cmVlX2Rlc2MgKnQsIGNvbnN0IGNoYXIgKmJhc2UsIHRyYXZlcnNlX2NhbGxiYWNrX3QgY2FsbGJhY2spOworCitpbnQgZ2V0X3RyZWVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdHJlZS5jIGIvdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmUyZGEKLS0tIC9kZXYvbnVsbAorKysgYi90cmVlLmMKQEAgLTAsMCArMSwyMzAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2NvbnN0IGNoYXIgKnRyZWVfdHlwZSA9ICJ0cmVlIjsKKworc3RhdGljIGludCByZWFkX29uZV9lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aG5hbWUsIHVuc2lnbmVkIG1vZGUsIGludCBzdGFnZSkKK3sKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIFJFQURfVFJFRV9SRUNVUlNJVkU7CisKKwlsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKGJhc2VsZW4gKyBsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKworCWNlLT5jZV9tb2RlID0gY3JlYXRlX2NlX21vZGUobW9kZSk7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKGJhc2VsZW4gKyBsZW4sIHN0YWdlKTsKKwltZW1jcHkoY2UtPm5hbWUsIGJhc2UsIGJhc2VsZW4pOworCW1lbWNweShjZS0+bmFtZSArIGJhc2VsZW4sIHBhdGhuYW1lLCBsZW4rMSk7CisJbWVtY3B5KGNlLT5zaGExLCBzaGExLCAyMCk7CisJcmV0dXJuIGFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERHxBRERfQ0FDSEVfU0tJUF9ERkNIRUNLKTsKK30KKworc3RhdGljIGludCBtYXRjaF90cmVlX2VudHJ5KGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3QgY2hhciAqKnBhdGhzKQoreworCWNvbnN0IGNoYXIgKm1hdGNoOworCWludCBwYXRobGVuOworCisJaWYgKCFwYXRocykKKwkJcmV0dXJuIDE7CisJcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKwl3aGlsZSAoKG1hdGNoID0gKnBhdGhzKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKworCQlpZiAoYmFzZWxlbiA+PSBtYXRjaGxlbikgeworCQkJLyogSWYgaXQgZG9lc24ndCBtYXRjaCwgbW92ZSBhbG9uZy4uLiAqLworCQkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIG1hdGNobGVuKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIFRoZSBiYXNlIGlzIGEgc3ViZGlyZWN0b3J5IG9mIGEgcGF0aCB3aGljaCB3YXMgc3BlY2lmaWVkLiAqLworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBEb2VzIHRoZSBiYXNlIG1hdGNoPyAqLworCQlpZiAoc3RybmNtcChiYXNlLCBtYXRjaCwgYmFzZWxlbikpCisJCQljb250aW51ZTsKKworCQltYXRjaCArPSBiYXNlbGVuOworCQltYXRjaGxlbiAtPSBiYXNlbGVuOworCisJCWlmIChwYXRobGVuID4gbWF0Y2hsZW4pCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2hsZW4gPiBwYXRobGVuKSB7CisJCQlpZiAobWF0Y2hbcGF0aGxlbl0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFTX0lTRElSKG1vZGUpKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cm5jbXAocGF0aCwgbWF0Y2gsIHBhdGhsZW4pKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVhZF90cmVlX3JlY3Vyc2l2ZShzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCWNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkJaW50IHN0YWdlLCBjb25zdCBjaGFyICoqbWF0Y2gsCisJCQlyZWFkX3RyZWVfZm5fdCBmbikKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSkKKwkJcmV0dXJuIC0xOworCisJZGVzYy5idWYgPSB0cmVlLT5idWZmZXI7CisJZGVzYy5zaXplID0gdHJlZS0+c2l6ZTsKKworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmICghbWF0Y2hfdHJlZV9lbnRyeShiYXNlLCBiYXNlbGVuLCBlbnRyeS5wYXRoLCBlbnRyeS5tb2RlLCBtYXRjaCkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGZuKGVudHJ5LnNoYTEsIGJhc2UsIGJhc2VsZW4sIGVudHJ5LnBhdGgsIGVudHJ5Lm1vZGUsIHN0YWdlKSkgeworCQljYXNlIDA6CisJCQljb250aW51ZTsKKwkJY2FzZSBSRUFEX1RSRUVfUkVDVVJTSVZFOgorCQkJYnJlYWs7OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKSB7CisJCQlpbnQgcmV0dmFsOworCQkJY2hhciAqbmV3YmFzZTsKKworCQkJbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIDEgKyBlbnRyeS5wYXRobGVuKTsKKwkJCW1lbWNweShuZXdiYXNlLCBiYXNlLCBiYXNlbGVuKTsKKwkJCW1lbWNweShuZXdiYXNlICsgYmFzZWxlbiwgZW50cnkucGF0aCwgZW50cnkucGF0aGxlbik7CisJCQluZXdiYXNlW2Jhc2VsZW4gKyBlbnRyeS5wYXRobGVuXSA9ICcvJzsKKwkJCXJldHZhbCA9IHJlYWRfdHJlZV9yZWN1cnNpdmUobG9va3VwX3RyZWUoZW50cnkuc2hhMSksCisJCQkJCQkgICAgIG5ld2Jhc2UsCisJCQkJCQkgICAgIGJhc2VsZW4gKyBlbnRyeS5wYXRobGVuICsgMSwKKwkJCQkJCSAgICAgc3RhZ2UsIG1hdGNoLCBmbik7CisJCQlmcmVlKG5ld2Jhc2UpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gLTE7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJlYWRfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IHN0YWdlLCBjb25zdCBjaGFyICoqbWF0Y2gpCit7CisJcmV0dXJuIHJlYWRfdHJlZV9yZWN1cnNpdmUodHJlZSwgIiIsIDAsIHN0YWdlLCBtYXRjaCwgcmVhZF9vbmVfZW50cnkpOworfQorCitzdHJ1Y3QgdHJlZSAqbG9va3VwX3RyZWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBsb29rdXBfb2JqZWN0KHNoYTEpOworCWlmICghb2JqKSB7CisJCXN0cnVjdCB0cmVlICpyZXQgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOworCQljcmVhdGVkX29iamVjdChzaGExLCAmcmV0LT5vYmplY3QpOworCQlyZXQtPm9iamVjdC50eXBlID0gdHJlZV90eXBlOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoIW9iai0+dHlwZSkKKwkJb2JqLT50eXBlID0gdHJlZV90eXBlOworCWlmIChvYmotPnR5cGUgIT0gdHJlZV90eXBlKSB7CisJCWVycm9yKCJPYmplY3QgJXMgaXMgYSAlcywgbm90IGEgdHJlZSIsIAorCQkgICAgICBzaGExX3RvX2hleChzaGExKSwgb2JqLT50eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAoc3RydWN0IHRyZWUgKikgb2JqOworfQorCitzdGF0aWMgaW50IHRyYWNrX3RyZWVfcmVmcyhzdHJ1Y3QgdHJlZSAqaXRlbSkKK3sKKwlpbnQgbl9yZWZzID0gMCwgaTsKKwlzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnM7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCisJLyogQ291bnQgaG93IG1hbnkgZW50cmllcyB0aGVyZSBhcmUuLiAqLworCWRlc2MuYnVmID0gaXRlbS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IGl0ZW0tPnNpemU7CisJd2hpbGUgKGRlc2Muc2l6ZSkgeworCQluX3JlZnMrKzsKKwkJdXBkYXRlX3RyZWVfZW50cnkoJmRlc2MpOworCX0KKworCS8qIEFsbG9jYXRlIG9iamVjdCByZWZzIGFuZCB3YWxrIGl0IGFnYWluLi4gKi8KKwlpID0gMDsKKwlyZWZzID0gYWxsb2Nfb2JqZWN0X3JlZnMobl9yZWZzKTsKKwlkZXNjLmJ1ZiA9IGl0ZW0tPmJ1ZmZlcjsKKwlkZXNjLnNpemUgPSBpdGVtLT5zaXplOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iajsKKworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCW9iaiA9ICZsb29rdXBfdHJlZShlbnRyeS5zaGExKS0+b2JqZWN0OworCQllbHNlCisJCQlvYmogPSAmbG9va3VwX2Jsb2IoZW50cnkuc2hhMSktPm9iamVjdDsKKwkJcmVmcy0+cmVmW2krK10gPSBvYmo7CisJfQorCXNldF9vYmplY3RfcmVmcygmaXRlbS0+b2JqZWN0LCByZWZzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX3RyZWVfYnVmZmVyKHN0cnVjdCB0cmVlICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKwkJcmV0dXJuIDA7CisJaXRlbS0+b2JqZWN0LnBhcnNlZCA9IDE7CisJaXRlbS0+YnVmZmVyID0gYnVmZmVyOworCWl0ZW0tPnNpemUgPSBzaXplOworCisJaWYgKHRyYWNrX29iamVjdF9yZWZzKQorCQl0cmFja190cmVlX3JlZnMoaXRlbSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXJzZV90cmVlKHN0cnVjdCB0cmVlICppdGVtKQoreworCSBjaGFyIHR5cGVbMjBdOworCSB2b2lkICpidWZmZXI7CisJIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChpdGVtLT5vYmplY3QucGFyc2VkKQorCQlyZXR1cm4gMDsKKwlidWZmZXIgPSByZWFkX3NoYTFfZmlsZShpdGVtLT5vYmplY3Quc2hhMSwgdHlwZSwgJnNpemUpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCByZWFkICVzIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpZiAoc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSB0cmVlIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwl9CisJcmV0dXJuIHBhcnNlX3RyZWVfYnVmZmVyKGl0ZW0sIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0cnVjdCB0cmVlICpwYXJzZV90cmVlX2luZGlyZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCWRvIHsKKwkJaWYgKCFvYmopCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKG9iai0+dHlwZSA9PSB0cmVlX3R5cGUpCisJCQlyZXR1cm4gKHN0cnVjdCB0cmVlICopIG9iajsKKwkJZWxzZSBpZiAob2JqLT50eXBlID09IGNvbW1pdF90eXBlKQorCQkJb2JqID0gJigoKHN0cnVjdCBjb21taXQgKikgb2JqKS0+dHJlZS0+b2JqZWN0KTsKKwkJZWxzZSBpZiAob2JqLT50eXBlID09IHRhZ190eXBlKQorCQkJb2JqID0gKChzdHJ1Y3QgdGFnICopIG9iaiktPnRhZ2dlZDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghb2JqLT5wYXJzZWQpCisJCQlwYXJzZV9vYmplY3Qob2JqLT5zaGExKTsKKwl9IHdoaWxlICgxKTsKK30KZGlmZiAtLWdpdCBhL3RyZWUuaCBiL3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI1YzUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgVFJFRV9ICisjZGVmaW5lIFRSRUVfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK2V4dGVybiBjb25zdCBjaGFyICp0cmVlX3R5cGU7CisKK3N0cnVjdCB0cmVlIHsKKwlzdHJ1Y3Qgb2JqZWN0IG9iamVjdDsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworfTsKKworc3RydWN0IHRyZWUgKmxvb2t1cF90cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitpbnQgcGFyc2VfdHJlZV9idWZmZXIoc3RydWN0IHRyZWUgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUpOworCisvKiBQYXJzZXMgYW5kIHJldHVybnMgdGhlIHRyZWUgaW4gdGhlIGdpdmVuIGVudCwgY2hhc2luZyB0YWdzIGFuZCBjb21taXRzLiAqLworc3RydWN0IHRyZWUgKnBhcnNlX3RyZWVfaW5kaXJlY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKKyNkZWZpbmUgUkVBRF9UUkVFX1JFQ1VSU0lWRSAxCit0eXBlZGVmIGludCAoKnJlYWRfdHJlZV9mbl90KShjb25zdCB1bnNpZ25lZCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgaW50KTsKKworZXh0ZXJuIGludCByZWFkX3RyZWVfcmVjdXJzaXZlKHN0cnVjdCB0cmVlICp0cmVlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkJICAgICAgIGludCBzdGFnZSwgY29uc3QgY2hhciAqKm1hdGNoLAorCQkJICAgICAgIHJlYWRfdHJlZV9mbl90IGZuKTsKKworZXh0ZXJuIGludCByZWFkX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUsIGludCBzdGFnZSwgY29uc3QgY2hhciAqKnBhdGhzKTsKKworI2VuZGlmIC8qIFRSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvdW5wYWNrLWZpbGUuYyBiL3VucGFjay1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkZGYxZAotLS0gL2Rldi9udWxsCisrKyBiL3VucGFjay1maWxlLmMKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgY2hhciAqY3JlYXRlX3RlbXBfZmlsZSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjaGFyIHBhdGhbNTBdOworCXZvaWQgKmJ1ZjsKKwljaGFyIHR5cGVbMTAwXTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IGZkOworCisJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJnNpemUpOworCWlmICghYnVmIHx8IHN0cmNtcCh0eXBlLCBibG9iX3R5cGUpKQorCQlkaWUoInVuYWJsZSB0byByZWFkIGJsb2Igb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJc3RyY3B5KHBhdGgsICIubWVyZ2VfZmlsZV9YWFhYWFgiKTsKKwlmZCA9IG1rc3RlbXAocGF0aCk7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHRlbXAtZmlsZSIpOworCWlmICh3cml0ZShmZCwgYnVmLCBzaXplKSAhPSBzaXplKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSB0ZW1wLWZpbGUiKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIHBhdGg7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoImdpdC11bnBhY2stZmlsZSA8c2hhMT4iKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlwdXRzKGNyZWF0ZV90ZW1wX2ZpbGUoc2hhMSkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5wYWNrLW9iamVjdHMuYyBiL3VucGFjay1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4MjRiMAotLS0gL2Rldi9udWxsCisrKyBiL3VucGFjay1vYmplY3RzLmMKQEAgLTAsMCArMSwzMTYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitzdGF0aWMgaW50IGRyeV9ydW4sIHF1aWV0Oworc3RhdGljIGNvbnN0IGNoYXIgdW5wYWNrX3VzYWdlW10gPSAiZ2l0LXVucGFjay1vYmplY3RzIFstbl0gWy1xXSA8IHBhY2stZmlsZSI7CisKKy8qIFdlIGFsd2F5cyByZWFkIGluIDRrQiBjaHVua3MuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJbNDA5Nl07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxlbiwgZW9mOworc3RhdGljIFNIQV9DVFggY3R4OworCisvKgorICogTWFrZSBzdXJlIGF0IGxlYXN0ICJtaW4iIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciwgYW5kCisgKiByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgKiBmaWxsKGludCBtaW4pCit7CisJaWYgKG1pbiA8PSBsZW4pCisJCXJldHVybiBidWZmZXIgKyBvZmZzZXQ7CisJaWYgKGVvZikKKwkJZGllKCJ1bmFibGUgdG8gZmlsbCBpbnB1dCIpOworCWlmIChtaW4gPiBzaXplb2YoYnVmZmVyKSkKKwkJZGllKCJjYW5ub3QgZmlsbCAlZCBieXRlcyIsIG1pbik7CisJaWYgKG9mZnNldCkgeworCQlTSEExX1VwZGF0ZSgmY3R4LCBidWZmZXIsIG9mZnNldCk7CisJCW1lbWNweShidWZmZXIsIGJ1ZmZlciArIG9mZnNldCwgbGVuKTsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJZG8geworCQlpbnQgcmV0ID0geHJlYWQoMCwgYnVmZmVyICsgbGVuLCBzaXplb2YoYnVmZmVyKSAtIGxlbik7CisJCWlmIChyZXQgPD0gMCkgeworCQkJaWYgKCFyZXQpCisJCQkJZGllKCJlYXJseSBFT0YiKTsKKwkJCWRpZSgicmVhZCBlcnJvciBvbiBpbnB1dDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWxlbiArPSByZXQ7CisJfSB3aGlsZSAobGVuIDwgbWluKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdm9pZCB1c2UoaW50IGJ5dGVzKQoreworCWlmIChieXRlcyA+IGxlbikKKwkJZGllKCJ1c2VkIG1vcmUgYnl0ZXMgdGhhbiB3ZXJlIGF2YWlsYWJsZSIpOworCWxlbiAtPSBieXRlczsKKwlvZmZzZXQgKz0gYnl0ZXM7Cit9CisKK3N0YXRpYyB2b2lkICpnZXRfZGF0YSh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJel9zdHJlYW0gc3RyZWFtOworCXZvaWQgKmJ1ZiA9IHhtYWxsb2Moc2l6ZSk7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCisJc3RyZWFtLm5leHRfb3V0ID0gYnVmOworCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplOworCXN0cmVhbS5uZXh0X2luID0gZmlsbCgxKTsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisKKwlmb3IgKDs7KSB7CisJCWludCByZXQgPSBpbmZsYXRlKCZzdHJlYW0sIDApOworCQl1c2UobGVuIC0gc3RyZWFtLmF2YWlsX2luKTsKKwkJaWYgKHN0cmVhbS50b3RhbF9vdXQgPT0gc2l6ZSAmJiByZXQgPT0gWl9TVFJFQU1fRU5EKQorCQkJYnJlYWs7CisJCWlmIChyZXQgIT0gWl9PSykKKwkJCWRpZSgiaW5mbGF0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCQlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJfQorCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RydWN0IGRlbHRhX2luZm8geworCXVuc2lnbmVkIGNoYXIgYmFzZV9zaGExWzIwXTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdm9pZCAqZGVsdGE7CisJc3RydWN0IGRlbHRhX2luZm8gKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGRlbHRhX2luZm8gKmRlbHRhX2xpc3Q7CisKK3N0YXRpYyB2b2lkIGFkZF9kZWx0YV90b19saXN0KHVuc2lnbmVkIGNoYXIgKmJhc2Vfc2hhMSwgdm9pZCAqZGVsdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVsdGFfaW5mbyAqaW5mbyA9IHhtYWxsb2Moc2l6ZW9mKCppbmZvKSk7CisKKwltZW1jcHkoaW5mby0+YmFzZV9zaGExLCBiYXNlX3NoYTEsIDIwKTsKKwlpbmZvLT5zaXplID0gc2l6ZTsKKwlpbmZvLT5kZWx0YSA9IGRlbHRhOworCWluZm8tPm5leHQgPSBkZWx0YV9saXN0OworCWRlbHRhX2xpc3QgPSBpbmZvOworfQorCitzdGF0aWMgdm9pZCBhZGRlZF9vYmplY3QodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqdHlwZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworc3RhdGljIHZvaWQgd3JpdGVfb2JqZWN0KHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICp0eXBlKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaWYgKHdyaXRlX3NoYTFfZmlsZShidWYsIHNpemUsIHR5cGUsIHNoYTEpIDwgMCkKKwkJZGllKCJmYWlsZWQgdG8gd3JpdGUgb2JqZWN0Iik7CisJYWRkZWRfb2JqZWN0KHNoYTEsIHR5cGUsIGJ1Ziwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVzb2x2ZV9kZWx0YShjb25zdCBjaGFyICp0eXBlLAorCXZvaWQgKmJhc2UsIHVuc2lnbmVkIGxvbmcgYmFzZV9zaXplLCAKKwl2b2lkICpkZWx0YSwgdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplKQoreworCXZvaWQgKnJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdF9zaXplOworCisJcmVzdWx0ID0gcGF0Y2hfZGVsdGEoYmFzZSwgYmFzZV9zaXplLAorCQkJICAgICBkZWx0YSwgZGVsdGFfc2l6ZSwKKwkJCSAgICAgJnJlc3VsdF9zaXplKTsKKwlpZiAoIXJlc3VsdCkKKwkJZGllKCJmYWlsZWQgdG8gYXBwbHkgZGVsdGEiKTsKKwlmcmVlKGRlbHRhKTsKKwl3cml0ZV9vYmplY3QocmVzdWx0LCByZXN1bHRfc2l6ZSwgdHlwZSk7CisJZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRlZF9vYmplY3QodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqdHlwZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBkZWx0YV9pbmZvICoqcCA9ICZkZWx0YV9saXN0OworCXN0cnVjdCBkZWx0YV9pbmZvICppbmZvOworCisJd2hpbGUgKChpbmZvID0gKnApICE9IE5VTEwpIHsKKwkJaWYgKCFtZW1jbXAoaW5mby0+YmFzZV9zaGExLCBzaGExLCAyMCkpIHsKKwkJCSpwID0gaW5mby0+bmV4dDsKKwkJCXAgPSAmZGVsdGFfbGlzdDsKKwkJCXJlc29sdmVfZGVsdGEodHlwZSwgZGF0YSwgc2l6ZSwgaW5mby0+ZGVsdGEsIGluZm8tPnNpemUpOworCQkJZnJlZShpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXAgPSAmaW5mby0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX25vbl9kZWx0YV9lbnRyeShlbnVtIG9iamVjdF90eXBlIGtpbmQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICpidWYgPSBnZXRfZGF0YShzaXplKTsKKwljb25zdCBjaGFyICp0eXBlOworCisJc3dpdGNoIChraW5kKSB7CisJY2FzZSBPQkpfQ09NTUlUOiB0eXBlID0gY29tbWl0X3R5cGU7IGJyZWFrOworCWNhc2UgT0JKX1RSRUU6ICAgdHlwZSA9IHRyZWVfdHlwZTsgYnJlYWs7CisJY2FzZSBPQkpfQkxPQjogICB0eXBlID0gYmxvYl90eXBlOyBicmVhazsKKwljYXNlIE9CSl9UQUc6ICAgIHR5cGUgPSB0YWdfdHlwZTsgYnJlYWs7CisJZGVmYXVsdDogZGllKCJiYWQgdHlwZSAlZCIsIGtpbmQpOworCX0KKwlpZiAoIWRyeV9ydW4pCisJCXdyaXRlX29iamVjdChidWYsIHNpemUsIHR5cGUpOworCWZyZWUoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bnBhY2tfZGVsdGFfZW50cnkodW5zaWduZWQgbG9uZyBkZWx0YV9zaXplKQoreworCXZvaWQgKmRlbHRhX2RhdGEsICpiYXNlOworCXVuc2lnbmVkIGxvbmcgYmFzZV9zaXplOworCWNoYXIgdHlwZVsyMF07CisJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCWludCByZXN1bHQ7CisKKwltZW1jcHkoYmFzZV9zaGExLCBmaWxsKDIwKSwgMjApOworCXVzZSgyMCk7CisKKwlkZWx0YV9kYXRhID0gZ2V0X2RhdGEoZGVsdGFfc2l6ZSk7CisJaWYgKGRyeV9ydW4pIHsKKwkJZnJlZShkZWx0YV9kYXRhKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFoYXNfc2hhMV9maWxlKGJhc2Vfc2hhMSkpIHsKKwkJYWRkX2RlbHRhX3RvX2xpc3QoYmFzZV9zaGExLCBkZWx0YV9kYXRhLCBkZWx0YV9zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCWJhc2UgPSByZWFkX3NoYTFfZmlsZShiYXNlX3NoYTEsIHR5cGUsICZiYXNlX3NpemUpOworCWlmICghYmFzZSkKKwkJZGllKCJmYWlsZWQgdG8gcmVhZCBkZWx0YS1wYWNrIGJhc2Ugb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisJcmVzdWx0ID0gcmVzb2x2ZV9kZWx0YSh0eXBlLCBiYXNlLCBiYXNlX3NpemUsIGRlbHRhX2RhdGEsIGRlbHRhX3NpemUpOworCWZyZWUoYmFzZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgdW5wYWNrX29uZSh1bnNpZ25lZCBuciwgdW5zaWduZWQgdG90YWwpCit7CisJdW5zaWduZWQgc2hpZnQ7CisJdW5zaWduZWQgY2hhciAqcGFjaywgYzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCisJcGFjayA9IGZpbGwoMSk7CisJYyA9ICpwYWNrOworCXVzZSgxKTsKKwl0eXBlID0gKGMgPj4gNCkgJiA3OworCXNpemUgPSAoYyAmIDE1KTsKKwlzaGlmdCA9IDQ7CisJd2hpbGUgKGMgJiAweDgwKSB7CisJCXBhY2sgPSBmaWxsKDEpOworCQljID0gKnBhY2srKzsKKwkJdXNlKDEpOworCQlzaXplICs9IChjICYgMHg3ZikgPDwgc2hpZnQ7CisJCXNoaWZ0ICs9IDc7CisJfQorCWlmICghcXVpZXQpIHsKKwkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9zZWM7CisJCXN0YXRpYyB1bnNpZ25lZCBsYXN0X3BlcmNlbnQ7CisJCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwkJdW5zaWduZWQgcGVyY2VudGFnZSA9IChuciAqIDEwMCkgLyB0b3RhbDsKKworCQlnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisJCWlmIChwZXJjZW50YWdlICE9IGxhc3RfcGVyY2VudCB8fCBub3cudHZfc2VjICE9IGxhc3Rfc2VjKSB7CisJCQlsYXN0X3NlYyA9IG5vdy50dl9zZWM7CisJCQlsYXN0X3BlcmNlbnQgPSBwZXJjZW50YWdlOworCQkJZnByaW50ZihzdGRlcnIsICIlNHUlJSAoJXUvJXUpIGRvbmVcciIsIHBlcmNlbnRhZ2UsIG5yLCB0b3RhbCk7CisJCX0KKwl9CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPQkpfQ09NTUlUOgorCWNhc2UgT0JKX1RSRUU6CisJY2FzZSBPQkpfQkxPQjoKKwljYXNlIE9CSl9UQUc6CisJCXVucGFja19ub25fZGVsdGFfZW50cnkodHlwZSwgc2l6ZSk7CisJCXJldHVybjsKKwljYXNlIE9CSl9ERUxUQToKKwkJdW5wYWNrX2RlbHRhX2VudHJ5KHNpemUpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGllKCJiYWQgb2JqZWN0IHR5cGUgJWQiLCB0eXBlKTsKKwl9Cit9CisKKy8qCisgKiBXZSB1bnBhY2sgZnJvbSB0aGUgZW5kLCBvbGRlciBmaWxlcyBmaXJzdC4gTm93LCB1c3VhbGx5CisgKiB0aGVyZSBhcmUgZGVsdGFzIGV0Yywgc28gd2UnbGwgbm90IGFjdHVhbGx5IHdyaXRlIHRoZQorICogb2JqZWN0cyBpbiB0aGF0IG9yZGVyLCBidXQgd2UgbWlnaHQgYXMgd2VsbCB0cnkuLgorICovCitzdGF0aWMgdm9pZCB1bnBhY2tfYWxsKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHBhY2tfaGVhZGVyICpoZHIgPSBmaWxsKHNpemVvZihzdHJ1Y3QgcGFja19oZWFkZXIpKTsKKwl1bnNpZ25lZCBucl9vYmplY3RzID0gbnRvaGwoaGRyLT5oZHJfZW50cmllcyk7CisKKwlpZiAobnRvaGwoaGRyLT5oZHJfc2lnbmF0dXJlKSAhPSBQQUNLX1NJR05BVFVSRSkKKwkJZGllKCJiYWQgcGFjayBmaWxlIik7CisJaWYgKCFwYWNrX3ZlcnNpb25fb2soaGRyLT5oZHJfdmVyc2lvbikpCisJCWRpZSgidW5rbm93biBwYWNrIGZpbGUgdmVyc2lvbiAlZCIsIG50b2hsKGhkci0+aGRyX3ZlcnNpb24pKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVucGFja2luZyAlZCBvYmplY3RzXG4iLCBucl9vYmplY3RzKTsKKworCXVzZShzaXplb2Yoc3RydWN0IHBhY2tfaGVhZGVyKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykKKwkJdW5wYWNrX29uZShpKzEsIG5yX29iamVjdHMpOworCWlmIChkZWx0YV9saXN0KQorCQlkaWUoInVucmVzb2x2ZWQgZGVsdGFzIGxlZnQgYWZ0ZXIgdW5wYWNraW5nIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJcXVpZXQgPSAhaXNhdHR5KDIpOworCisJZm9yIChpID0gMSA7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGFyZywgIi1uIikpIHsKKwkJCQlkcnlfcnVuID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1xIikpIHsKKwkJCQlxdWlldCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1c2FnZSh1bnBhY2tfdXNhZ2UpOworCQl9CisKKwkJLyogV2UgZG9uJ3QgdGFrZSBhbnkgbm9uLWZsYWcgYXJndW1lbnRzIG5vdy4uIE1heWJlIHNvbWUgZGF5ICovCisJCXVzYWdlKHVucGFja191c2FnZSk7CisJfQorCVNIQTFfSW5pdCgmY3R4KTsKKwl1bnBhY2tfYWxsKCk7CisJU0hBMV9VcGRhdGUoJmN0eCwgYnVmZmVyLCBvZmZzZXQpOworCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7CisJaWYgKG1lbWNtcChmaWxsKDIwKSwgc2hhMSwgMjApKQorCQlkaWUoImZpbmFsIHNoYTEgZGlkIG5vdCBtYXRjaCIpOworCXVzZSgyMCk7CisKKwkvKiBXcml0ZSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBidWZmZXIgdG8gc3Rkb3V0ICovCisJd2hpbGUgKGxlbikgeworCQlpbnQgcmV0ID0geHdyaXRlKDEsIGJ1ZmZlciArIG9mZnNldCwgbGVuKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJYnJlYWs7CisJCWxlbiAtPSByZXQ7CisJCW9mZnNldCArPSByZXQ7CisJfQorCisJLyogQWxsIGRvbmUgKi8KKwlpZiAoIXF1aWV0KQorCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUtaW5kZXguYyBiL3VwZGF0ZS1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2NjNGEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUtaW5kZXguYwpAQCAtMCwwICsxLDY1MyBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisKKy8qCisgKiBEZWZhdWx0IHRvIG5vdCBhbGxvd2luZyBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mIGZpbGVzLiBUaGUKKyAqIHRvb2wgZG9lc24ndCBhY3R1YWxseSBjYXJlLCBidXQgdGhpcyBtYWtlcyBpdCBoYXJkZXIgdG8gYWRkCisgKiBmaWxlcyB0byB0aGUgcmV2aXNpb24gY29udHJvbCBieSBtaXN0YWtlIGJ5IGRvaW5nIHNvbWV0aGluZworICogbGlrZSAiZ2l0LXVwZGF0ZS1pbmRleCAqIiBhbmQgc3VkZGVubHkgaGF2aW5nIGFsbCB0aGUgb2JqZWN0CisgKiBmaWxlcyBiZSByZXZpc2lvbiBjb250cm9sbGVkLgorICovCitzdGF0aWMgaW50IGFsbG93X2FkZDsKK3N0YXRpYyBpbnQgYWxsb3dfcmVtb3ZlOworc3RhdGljIGludCBhbGxvd19yZXBsYWNlOworc3RhdGljIGludCBpbmZvX29ubHk7CitzdGF0aWMgaW50IGZvcmNlX3JlbW92ZTsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgbWFya192YWxpZF9vbmx5ID0gMDsKKyNkZWZpbmUgTUFSS19WQUxJRCAxCisjZGVmaW5lIFVOTUFSS19WQUxJRCAyCisKK3N0YXRpYyB2b2lkIHJlcG9ydChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZwOworCisJaWYgKCF2ZXJib3NlKQorCQlyZXR1cm47CisKKwl2YV9zdGFydCh2cCwgZm10KTsKKwl2cHJpbnRmKGZtdCwgdnApOworCXB1dGNoYXIoJ1xuJyk7CisJdmFfZW5kKHZwKTsKK30KKworc3RhdGljIGludCBtYXJrX3ZhbGlkKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIG5hbWVsZW4pOworCWlmICgwIDw9IHBvcykgeworCQlzd2l0Y2ggKG1hcmtfdmFsaWRfb25seSkgeworCQljYXNlIE1BUktfVkFMSUQ6CisJCQlhY3RpdmVfY2FjaGVbcG9zXS0+Y2VfZmxhZ3MgfD0gaHRvbnMoQ0VfVkFMSUQpOworCQkJYnJlYWs7CisJCWNhc2UgVU5NQVJLX1ZBTElEOgorCQkJYWN0aXZlX2NhY2hlW3Bvc10tPmNlX2ZsYWdzICY9IH5odG9ucyhDRV9WQUxJRCk7CisJCQlicmVhazsKKwkJfQorCQljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7CisJCWFjdGl2ZV9jYWNoZV9jaGFuZ2VkID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBhZGRfZmlsZV90b19jYWNoZShjb25zdCBjaGFyICpwYXRoKQoreworCWludCBzaXplLCBuYW1lbGVuLCBvcHRpb24sIHN0YXR1czsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCXN0cnVjdCBzdGF0IHN0OworCisJc3RhdHVzID0gbHN0YXQocGF0aCwgJnN0KTsKKworCS8qIFdlIHByb2JhYmx5IHdhbnQgdG8gZG8gdGhpcyBpbiByZW1vdmVfZmlsZV9mcm9tX2NhY2hlKCkgYW5kCisJICogYWRkX2NhY2hlX2VudHJ5KCkgaW5zdGVhZC4uLgorCSAqLworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKworCWlmIChzdGF0dXMgPCAwIHx8IFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJLyogV2hlbiB3ZSB1c2VkIHRvIGhhdmUgInBhdGgiIGFuZCBub3cgd2Ugd2FudCB0byBhZGQKKwkJICogInBhdGgvZmlsZSIsIHdlIG5lZWQgYSB3YXkgdG8gcmVtb3ZlICJwYXRoIiBiZWZvcmUKKwkJICogYmVpbmcgYWJsZSB0byBhZGQgInBhdGgvZmlsZSIuICBIb3dldmVyLAorCQkgKiAiZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSBwYXRoIiB3b3VsZCBub3Qgd29yay4KKwkJICogLS1mb3JjZS1yZW1vdmUgY2FuIGJlIHVzZWQgYnV0IHRoaXMgaXMgbW9yZSB1c2VyCisJCSAqIGZyaWVuZGx5LCBlc3BlY2lhbGx5IHNpbmNlIHdlIGNhbiBkbyB0aGUgb3Bwb3NpdGUKKwkJICogY2FzZSBqdXN0IGZpbmUgd2l0aG91dCAtLWZvcmNlLXJlbW92ZS4KKwkJICovCisJCWlmIChzdGF0dXMgPT0gMCB8fCAoZXJybm8gPT0gRU5PRU5UIHx8IGVycm5vID09IEVOT1RESVIpKSB7CisJCQlpZiAoYWxsb3dfcmVtb3ZlKSB7CisJCQkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCkpCisJCQkJCXJldHVybiBlcnJvcigiJXM6IGNhbm5vdCByZW1vdmUgZnJvbSB0aGUgaW5kZXgiLAorCQkJCQkgICAgICAgICAgICAgcGF0aCk7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzIDwgMCkgeworCQkJCXJldHVybiBlcnJvcigiJXM6IGRvZXMgbm90IGV4aXN0IGFuZCAtLXJlbW92ZSBub3QgcGFzc2VkIiwKKwkJCQkgICAgICAgICAgICAgcGF0aCk7CisJCQl9CisJCX0KKwkJaWYgKDAgPT0gc3RhdHVzKQorCQkJcmV0dXJuIGVycm9yKCIlczogaXMgYSBkaXJlY3RvcnkgLSBhZGQgZmlsZXMgaW5zaWRlIGluc3RlYWQiLAorCQkJICAgICAgICAgICAgIHBhdGgpOworCQllbHNlCisJCQlyZXR1cm4gZXJyb3IoImxzdGF0KFwiJXNcIik6ICVzIiwgcGF0aCwKKwkJCQkgICAgIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJbmFtZWxlbiA9IHN0cmxlbihwYXRoKTsKKwlzaXplID0gY2FjaGVfZW50cnlfc2l6ZShuYW1lbGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBuYW1lbGVuKTsKKwljZS0+Y2VfZmxhZ3MgPSBodG9ucyhuYW1lbGVuKTsKKwlmaWxsX3N0YXRfY2FjaGVfaW5mbyhjZSwgJnN0KTsKKworCWNlLT5jZV9tb2RlID0gY3JlYXRlX2NlX21vZGUoc3Quc3RfbW9kZSk7CisJaWYgKCF0cnVzdF9leGVjdXRhYmxlX2JpdCkgeworCQkvKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBlbnRyeSwgcGljayB0aGUgbW9kZSBiaXRzCisJCSAqIGZyb20gaXQuCisJCSAqLworCQlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbmFtZWxlbik7CisJCWlmICgwIDw9IHBvcykKKwkJCWNlLT5jZV9tb2RlID0gYWN0aXZlX2NhY2hlW3Bvc10tPmNlX21vZGU7CisJfQorCisJaWYgKGluZGV4X3BhdGgoY2UtPnNoYTEsIHBhdGgsICZzdCwgIWluZm9fb25seSkpCisJCXJldHVybiAtMTsKKwlvcHRpb24gPSBhbGxvd19hZGQgPyBBRERfQ0FDSEVfT0tfVE9fQUREIDogMDsKKwlvcHRpb24gfD0gYWxsb3dfcmVwbGFjZSA/IEFERF9DQUNIRV9PS19UT19SRVBMQUNFIDogMDsKKwlpZiAoYWRkX2NhY2hlX2VudHJ5KGNlLCBvcHRpb24pKQorCQlyZXR1cm4gZXJyb3IoIiVzOiBjYW5ub3QgYWRkIHRvIHRoZSBpbmRleCAtIG1pc3NpbmcgLS1hZGQgb3B0aW9uPyIsCisJCQkgICAgIHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9jYWNoZWluZm8odW5zaWduZWQgaW50IG1vZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgY29uc3QgY2hhciAqcGF0aCwgaW50IHN0YWdlKQoreworCWludCBzaXplLCBsZW4sIG9wdGlvbjsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJaWYgKCF2ZXJpZnlfcGF0aChwYXRoKSkKKwkJcmV0dXJuIC0xOworCisJbGVuID0gc3RybGVuKHBhdGgpOworCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKGxlbik7CisJY2UgPSB4Y2FsbG9jKDEsIHNpemUpOworCisJbWVtY3B5KGNlLT5zaGExLCBzaGExLCAyMCk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBsZW4pOworCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhsZW4sIHN0YWdlKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWlmIChhc3N1bWVfdW5jaGFuZ2VkKQorCQljZS0+Y2VfZmxhZ3MgfD0gaHRvbnMoQ0VfVkFMSUQpOworCW9wdGlvbiA9IGFsbG93X2FkZCA/IEFERF9DQUNIRV9PS19UT19BREQgOiAwOworCW9wdGlvbiB8PSBhbGxvd19yZXBsYWNlID8gQUREX0NBQ0hFX09LX1RPX1JFUExBQ0UgOiAwOworCWlmIChhZGRfY2FjaGVfZW50cnkoY2UsIG9wdGlvbikpCisJCXJldHVybiBlcnJvcigiJXM6IGNhbm5vdCBhZGQgdG8gdGhlIGluZGV4IC0gbWlzc2luZyAtLWFkZCBvcHRpb24/IiwKKwkJCSAgICAgcGF0aCk7CisJcmVwb3J0KCJhZGQgJyVzJyIsIHBhdGgpOworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2htb2RfcGF0aChpbnQgZmxpcCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcG9zOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJdW5zaWduZWQgaW50IG1vZGU7CisKKwlwb3MgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBzdHJsZW4ocGF0aCkpOworCWlmIChwb3MgPCAwKQorCQlnb3RvIGZhaWw7CisJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwltb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCWlmICghU19JU1JFRyhtb2RlKSkKKwkJZ290byBmYWlsOworCXN3aXRjaCAoZmxpcCkgeworCWNhc2UgJysnOgorCQljZS0+Y2VfbW9kZSB8PSBodG9ubCgwMTExKTsgYnJlYWs7CisJY2FzZSAnLSc6CisJCWNlLT5jZV9tb2RlICY9IGh0b25sKH4wMTExKTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBmYWlsOworCX0KKwljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7CisJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAxOworCXJlcG9ydCgiY2htb2QgJWN4ICclcyciLCBmbGlwLCBwYXRoKTsKKwlyZXR1cm47CisgZmFpbDoKKwlkaWUoImdpdC11cGRhdGUtaW5kZXg6IGNhbm5vdCBjaG1vZCAlY3ggJyVzJyIsIGZsaXAsIHBhdGgpOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9vbmUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgcHJlZml4X2xlbmd0aCkKK3sKKwljb25zdCBjaGFyICpwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBwYXRoKTsKKwlpZiAoIXZlcmlmeV9wYXRoKHApKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgcGF0aCAlc1xuIiwgcGF0aCk7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCWlmIChtYXJrX3ZhbGlkX29ubHkpIHsKKwkJaWYgKG1hcmtfdmFsaWQocCkpCisJCQlkaWUoIlVuYWJsZSB0byBtYXJrIGZpbGUgJXMiLCBwYXRoKTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCisJaWYgKGZvcmNlX3JlbW92ZSkgeworCQlpZiAocmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwKSkKKwkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogdW5hYmxlIHRvIHJlbW92ZSAlcyIsIHBhdGgpOworCQlyZXBvcnQoInJlbW92ZSAnJXMnIiwgcGF0aCk7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCWlmIChhZGRfZmlsZV90b19jYWNoZShwKSkKKwkJZGllKCJVbmFibGUgdG8gcHJvY2VzcyBmaWxlICVzIiwgcGF0aCk7CisJcmVwb3J0KCJhZGQgJyVzJyIsIHBhdGgpOworIGZyZWVfcmV0dXJuOgorCWlmIChwIDwgcGF0aCB8fCBwID4gcGF0aCArIHN0cmxlbihwYXRoKSkKKwkJZnJlZSgoY2hhciopcCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfaW5kZXhfaW5mbyhpbnQgbGluZV90ZXJtaW5hdGlvbikKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwlzdHJidWZfaW5pdCgmYnVmKTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpwdHIsICp0YWI7CisJCWNoYXIgKnBhdGhfbmFtZTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJdW5zaWduZWQgaW50IG1vZGU7CisJCWludCBzdGFnZTsKKworCQkvKiBUaGlzIHJlYWRzIGxpbmVzIGZvcm1hdHRlZCBpbiBvbmUgb2YgdGhyZWUgZm9ybWF0czoKKwkJICoKKwkJICogKDEpIG1vZGUgICAgICAgICBTUCBzaGExICAgICAgICAgIFRBQiBwYXRoCisJCSAqIFRoZSBmaXJzdCBmb3JtYXQgaXMgd2hhdCAiZ2l0LWFwcGx5IC0taW5kZXgtaW5mbyIKKwkJICogcmVwb3J0cywgYW5kIHVzZWQgdG8gcmVjb25zdHJ1Y3QgYSBwYXJ0aWFsIHRyZWUKKwkJICogdGhhdCBpcyB1c2VkIGZvciBwaG9ueSBtZXJnZSBiYXNlIHRyZWUgd2hlbiBmYWxsaW5nCisJCSAqIGJhY2sgb24gMy13YXkgbWVyZ2UuCisJCSAqCisJCSAqICgyKSBtb2RlIFNQIHR5cGUgU1Agc2hhMSAgICAgICAgICBUQUIgcGF0aAorCQkgKiBUaGUgc2Vjb25kIGZvcm1hdCBpcyB0byBzdHVmZiBnaXQtbHMtdHJlZSBvdXRwdXQKKwkJICogaW50byB0aGUgaW5kZXggZmlsZS4KKwkJICogCisJCSAqICgzKSBtb2RlICAgICAgICAgU1Agc2hhMSBTUCBzdGFnZSBUQUIgcGF0aAorCQkgKiBUaGlzIGZvcm1hdCBpcyB0byBwdXQgaGlnaGVyIG9yZGVyIHN0YWdlcyBpbnRvIHRoZQorCQkgKiBpbmRleCBmaWxlIGFuZCBtYXRjaGVzIGdpdC1scy1maWxlcyAtLXN0YWdlIG91dHB1dC4KKwkJICovCisJCXJlYWRfbGluZSgmYnVmLCBzdGRpbiwgbGluZV90ZXJtaW5hdGlvbik7CisJCWlmIChidWYuZW9mKQorCQkJYnJlYWs7CisKKwkJbW9kZSA9IHN0cnRvdWwoYnVmLmJ1ZiwgJnB0ciwgOCk7CisJCWlmIChwdHIgPT0gYnVmLmJ1ZiB8fCAqcHRyICE9ICcgJykKKwkJCWdvdG8gYmFkX2xpbmU7CisKKwkJdGFiID0gc3RyY2hyKHB0ciwgJ1x0Jyk7CisJCWlmICghdGFiIHx8IHRhYiAtIHB0ciA8IDQxKQorCQkJZ290byBiYWRfbGluZTsKKworCQlpZiAodGFiWy0yXSA9PSAnICcgJiYgJzAnIDw9IHRhYlstMV0gJiYgdGFiWy0xXSA8PSAnMycpIHsKKwkJCXN0YWdlID0gdGFiWy0xXSAtICcwJzsKKwkJCXB0ciA9IHRhYiArIDE7IC8qIHBvaW50IGF0IHRoZSBoZWFkIG9mIHBhdGggKi8KKwkJCXRhYiA9IHRhYiAtIDI7IC8qIHBvaW50IGF0IHRhaWwgb2Ygc2hhMSAqLworCQl9CisJCWVsc2UgeworCQkJc3RhZ2UgPSAwOworCQkJcHRyID0gdGFiICsgMTsgLyogcG9pbnQgYXQgdGhlIGhlYWQgb2YgcGF0aCAqLworCQl9CisKKwkJaWYgKGdldF9zaGExX2hleCh0YWIgLSA0MCwgc2hhMSkgfHwgdGFiWy00MV0gIT0gJyAnKQorCQkJZ290byBiYWRfbGluZTsKKworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBwdHJbMF0gPT0gJyInKQorCQkJcGF0aF9uYW1lID0gdW5xdW90ZV9jX3N0eWxlKHB0ciwgTlVMTCk7CisJCWVsc2UKKwkJCXBhdGhfbmFtZSA9IHB0cjsKKworCQlpZiAoIXZlcmlmeV9wYXRoKHBhdGhfbmFtZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgcGF0aCAlc1xuIiwgcGF0aF9uYW1lKTsKKwkJCWlmIChwYXRoX25hbWUgIT0gcHRyKQorCQkJCWZyZWUocGF0aF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoX25hbWUpOworCisJCWlmICghbW9kZSkgeworCQkJLyogbW9kZSA9PSAwIG1lYW5zIHRoZXJlIGlzIG5vIHN1Y2ggcGF0aCAtLSByZW1vdmUgKi8KKwkJCWlmIChyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHBhdGhfbmFtZSkpCisJCQkJZGllKCJnaXQtdXBkYXRlLWluZGV4OiB1bmFibGUgdG8gcmVtb3ZlICVzIiwKKwkJCQkgICAgcHRyKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIG1vZGUgJyAnIHNoYTEgJ1x0JyBuYW1lCisJCQkgKiBwdHJbLTFdIHBvaW50cyBhdCB0YWIsCisJCQkgKiBwdHJbLTQxXSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHNoYTEKKwkJCSAqLworCQkJcHRyWy00Ml0gPSBwdHJbLTFdID0gMDsKKwkJCWlmIChhZGRfY2FjaGVpbmZvKG1vZGUsIHNoYTEsIHBhdGhfbmFtZSwgc3RhZ2UpKQorCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogdW5hYmxlIHRvIHVwZGF0ZSAlcyIsCisJCQkJICAgIHBhdGhfbmFtZSk7CisJCX0KKwkJaWYgKHBhdGhfbmFtZSAhPSBwdHIpCisJCQlmcmVlKHBhdGhfbmFtZSk7CisJCWNvbnRpbnVlOworCisJYmFkX2xpbmU6CisJCWRpZSgibWFsZm9ybWVkIGluZGV4IGluZm8gJXMiLCBidWYuYnVmKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHVwZGF0ZV9pbmRleF91c2FnZVtdID0KKyJnaXQtdXBkYXRlLWluZGV4IFstcV0gWy0tYWRkXSBbLS1yZXBsYWNlXSBbLS1yZW1vdmVdIFstLXVubWVyZ2VkXSBbLS1yZWZyZXNoXSBbLS1yZWFsbHktcmVmcmVzaF0gWy0tY2FjaGVpbmZvXSBbLS1jaG1vZD0oK3wtKXhdIFstLWFzc3VtZS11bmNoYW5nZWRdIFstLWluZm8tb25seV0gWy0tZm9yY2UtcmVtb3ZlXSBbLS1zdGRpbl0gWy0taW5kZXgtaW5mb10gWy0tdW5yZXNvbHZlXSBbLS1hZ2Fpbl0gWy0taWdub3JlLW1pc3NpbmddIFstel0gWy0tdmVyYm9zZV0gWy0tXSA8ZmlsZT4uLi4iOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBoZWFkX3NoYTFbMjBdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWVyZ2VfaGVhZF9zaGExWzIwXTsKKworc3RhdGljIHN0cnVjdCBjYWNoZV9lbnRyeSAqcmVhZF9vbmVfZW50KGNvbnN0IGNoYXIgKndoaWNoLAorCQkJCQl1bnNpZ25lZCBjaGFyICplbnQsIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJCWludCBuYW1lbGVuLCBpbnQgc3RhZ2UpCit7CisJdW5zaWduZWQgbW9kZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBzaXplOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoZ2V0X3RyZWVfZW50cnkoZW50LCBwYXRoLCBzaGExLCAmbW9kZSkpIHsKKwkJaWYgKHdoaWNoKQorCQkJZXJyb3IoIiVzOiBub3QgaW4gJXMgYnJhbmNoLiIsIHBhdGgsIHdoaWNoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChtb2RlID09IFNfSUZESVIpIHsKKwkJaWYgKHdoaWNoKQorCQkJZXJyb3IoIiVzOiBub3QgYSBibG9iIGluICVzIGJyYW5jaC4iLCBwYXRoLCB3aGljaCk7CisJCXJldHVybiBOVUxMOworCX0KKwlzaXplID0gY2FjaGVfZW50cnlfc2l6ZShuYW1lbGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisKKwltZW1jcHkoY2UtPnNoYTEsIHNoYTEsIDIwKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIG5hbWVsZW4pOworCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhuYW1lbGVuLCBzdGFnZSk7CisJY2UtPmNlX21vZGUgPSBjcmVhdGVfY2VfbW9kZShtb2RlKTsKKwlyZXR1cm4gY2U7Cit9CisKK3N0YXRpYyBpbnQgdW5yZXNvbHZlX29uZShjb25zdCBjaGFyICpwYXRoKQoreworCWludCBuYW1lbGVuID0gc3RybGVuKHBhdGgpOworCWludCBwb3M7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZV8yID0gTlVMTCwgKmNlXzMgPSBOVUxMOworCisJLyogU2VlIGlmIHRoZXJlIGlzIHN1Y2ggZW50cnkgaW4gdGhlIGluZGV4LiAqLworCXBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIG5hbWVsZW4pOworCWlmIChwb3MgPCAwKSB7CisJCS8qIElmIHRoZXJlIGlzbid0LCBlaXRoZXIgaXQgaXMgdW5tZXJnZWQsIG9yCisJCSAqIHJlc29sdmVkIGFzICJyZW1vdmVkIiBieSBtaXN0YWtlLiAgV2UgZG8gbm90CisJCSAqIHdhbnQgdG8gZG8gYW55dGhpbmcgaW4gdGhlIGZvcm1lciBjYXNlLgorCQkgKi8KKwkJcG9zID0gLXBvcy0xOworCQlpZiAocG9zIDwgYWN0aXZlX25yKSB7CisJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCQlpZiAoY2VfbmFtZWxlbihjZSkgPT0gbmFtZWxlbiAmJgorCQkJICAgICFtZW1jbXAoY2UtPm5hbWUsIHBhdGgsIG5hbWVsZW4pKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSIlczogc2tpcHBpbmcgc3RpbGwgdW5tZXJnZWQgcGF0aC5cbiIsCisJCQkJCXBhdGgpOworCQkJCWdvdG8gZnJlZV9yZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwkvKiBHcmFiIGJsb2JzIGZyb20gZ2l2ZW4gcGF0aCBmcm9tIEhFQUQgYW5kIE1FUkdFX0hFQUQsCisJICogc3R1ZmYgSEVBRCB2ZXJzaW9uIGluIHN0YWdlICMyLAorCSAqIHN0dWZmIE1FUkdFX0hFQUQgdmVyc2lvbiBpbiBzdGFnZSAjMy4KKwkgKi8KKwljZV8yID0gcmVhZF9vbmVfZW50KCJvdXIiLCBoZWFkX3NoYTEsIHBhdGgsIG5hbWVsZW4sIDIpOworCWNlXzMgPSByZWFkX29uZV9lbnQoInRoZWlyIiwgbWVyZ2VfaGVhZF9zaGExLCBwYXRoLCBuYW1lbGVuLCAzKTsKKworCWlmICghY2VfMiB8fCAhY2VfMykgeworCQlyZXQgPSAtMTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisJaWYgKCFtZW1jbXAoY2VfMi0+c2hhMSwgY2VfMy0+c2hhMSwgMjApICYmCisJICAgIGNlXzItPmNlX21vZGUgPT0gY2VfMy0+Y2VfbW9kZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpZGVudGljYWwgaW4gYm90aCwgc2tpcHBpbmcuXG4iLAorCQkJcGF0aCk7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCXJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCk7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZV8yLCBBRERfQ0FDSEVfT0tfVE9fQUREKSkgeworCQllcnJvcigiJXM6IGNhbm5vdCBhZGQgb3VyIHZlcnNpb24gdG8gdGhlIGluZGV4LiIsIHBhdGgpOworCQlyZXQgPSAtMTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisJaWYgKCFhZGRfY2FjaGVfZW50cnkoY2VfMywgQUREX0NBQ0hFX09LX1RPX0FERCkpCisJCXJldHVybiAwOworCWVycm9yKCIlczogY2Fubm90IGFkZCB0aGVpciB2ZXJzaW9uIHRvIHRoZSBpbmRleC4iLCBwYXRoKTsKKwlyZXQgPSAtMTsKKyBmcmVlX3JldHVybjoKKwlmcmVlKGNlXzIpOworCWZyZWUoY2VfMyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVhZF9oZWFkX3BvaW50ZXJzKHZvaWQpCit7CisJaWYgKHJlYWRfcmVmKGdpdF9wYXRoKCJIRUFEIiksIGhlYWRfc2hhMSkpCisJCWRpZSgiTm8gSEVBRCAtLSBubyBpbml0aWFsIGNvbW1pdCB5ZXQ/XG4iKTsKKwlpZiAocmVhZF9yZWYoZ2l0X3BhdGgoIk1FUkdFX0hFQUQiKSwgbWVyZ2VfaGVhZF9zaGExKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UuXG4iKTsKKwkJZXhpdCgwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9fdW5yZXNvbHZlKGludCBhYywgY29uc3QgY2hhciAqKmF2LAorCQkJY29uc3QgY2hhciAqcHJlZml4LCBpbnQgcHJlZml4X2xlbmd0aCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCS8qIFJlYWQgSEVBRCBhbmQgTUVSR0VfSEVBRDsgaWYgTUVSR0VfSEVBRCBkb2VzIG5vdCBleGlzdCwgd2UKKwkgKiBhcmUgbm90IGRvaW5nIGEgbWVyZ2UsIHNvIGV4aXQgd2l0aCBzdWNjZXNzIHN0YXR1cy4KKwkgKi8KKwlyZWFkX2hlYWRfcG9pbnRlcnMoKTsKKworCWZvciAoaSA9IDE7IGkgPCBhYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGF2W2ldOworCQljb25zdCBjaGFyICpwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBhcmcpOworCQllcnIgfD0gdW5yZXNvbHZlX29uZShwKTsKKwkJaWYgKHAgPCBhcmcgfHwgcCA+IGFyZyArIHN0cmxlbihhcmcpKQorCQkJZnJlZSgoY2hhciopcCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmV1cGRhdGUoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsCisJCSAgICAgICBjb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCS8qIFJlYWQgSEVBRCBhbmQgcnVuIHVwZGF0ZS1pbmRleCBvbiBwYXRocyB0aGF0IGFyZQorCSAqIG1lcmdlZCBhbmQgYWxyZWFkeSBkaWZmZXJlbnQgYmV0d2VlbiBpbmRleCBhbmQgSEVBRC4KKwkgKi8KKwlpbnQgcG9zOworCWludCBoYXNfaGVhZCA9IDE7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXYgKyAxKTsKKworCWlmIChyZWFkX3JlZihnaXRfcGF0aCgiSEVBRCIpLCBoZWFkX3NoYTEpKQorCQkvKiBJZiB0aGVyZSBpcyBubyBIRUFELCB0aGF0IG1lYW5zIGl0IGlzIGFuIGluaXRpYWwKKwkJICogY29tbWl0LiAgVXBkYXRlIGV2ZXJ5dGhpbmcgaW4gdGhlIGluZGV4LgorCQkgKi8KKwkJaGFzX2hlYWQgPSAwOworIHJlZG86CisJZm9yIChwb3MgPSAwOyBwb3MgPCBhY3RpdmVfbnI7IHBvcysrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQgPSBOVUxMOworCQlpbnQgc2F2ZV9ucjsKKworCQlpZiAoY2Vfc3RhZ2UoY2UpIHx8ICFjZV9wYXRoX21hdGNoKGNlLCBwYXRoc3BlYykpCisJCQljb250aW51ZTsKKwkJaWYgKGhhc19oZWFkKQorCQkJb2xkID0gcmVhZF9vbmVfZW50KE5VTEwsIGhlYWRfc2hhMSwKKwkJCQkJICAgY2UtPm5hbWUsIGNlX25hbWVsZW4oY2UpLCAwKTsKKwkJaWYgKG9sZCAmJiBjZS0+Y2VfbW9kZSA9PSBvbGQtPmNlX21vZGUgJiYKKwkJICAgICFtZW1jbXAoY2UtPnNoYTEsIG9sZC0+c2hhMSwgMjApKSB7CisJCQlmcmVlKG9sZCk7CisJCQljb250aW51ZTsgLyogdW5jaGFuZ2VkICovCisJCX0KKwkJLyogQmUgY2FyZWZ1bC4gIFRoZSB3b3JraW5nIHRyZWUgbWF5IG5vdCBoYXZlIHRoZQorCQkgKiBwYXRoIGFueW1vcmUsIGluIHdoaWNoIGNhc2UsIHVuZGVyICdhbGxvd19yZW1vdmUnLAorCQkgKiBvciB3b3JzZSB5ZXQgJ2FsbG93X3JlcGxhY2UnLCBhY3RpdmVfbnIgbWF5IGRlY3JlYXNlLgorCQkgKi8KKwkJc2F2ZV9uciA9IGFjdGl2ZV9ucjsKKwkJdXBkYXRlX29uZShjZS0+bmFtZSArIHByZWZpeF9sZW5ndGgsIHByZWZpeCwgcHJlZml4X2xlbmd0aCk7CisJCWlmIChzYXZlX25yICE9IGFjdGl2ZV9ucikKKwkJCWdvdG8gcmVkbzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgbmV3ZmQsIGVudHJpZXMsIGhhc19lcnJvcnMgPSAwLCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKwlpbnQgYWxsb3dfb3B0aW9ucyA9IDE7CisJaW50IHJlYWRfZnJvbV9zdGRpbiA9IDA7CisJY29uc3QgY2hhciAqcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWludCBwcmVmaXhfbGVuZ3RoID0gcHJlZml4ID8gc3RybGVuKHByZWZpeCkgOiAwOworCWNoYXIgc2V0X2V4ZWN1dGFibGVfYml0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVmcmVzaF9mbGFncyA9IDA7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwluZXdmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJmxvY2tfZmlsZSwgZ2V0X2luZGV4X2ZpbGUoKSk7CisJaWYgKG5ld2ZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIG5ldyBpbmRleCBmaWxlIik7CisKKwllbnRyaWVzID0gcmVhZF9jYWNoZSgpOworCWlmIChlbnRyaWVzIDwgMCkKKwkJZGllKCJjYWNoZSBjb3JydXB0ZWQiKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSBhcmd2W2ldOworCisJCWlmIChhbGxvd19vcHRpb25zICYmICpwYXRoID09ICctJykgeworCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tIikpIHsKKwkJCQlhbGxvd19vcHRpb25zID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItcSIpKSB7CisJCQkJcmVmcmVzaF9mbGFncyB8PSBSRUZSRVNIX1FVSUVUOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tYWRkIikpIHsKKwkJCQlhbGxvd19hZGQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVwbGFjZSIpKSB7CisJCQkJYWxsb3dfcmVwbGFjZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1yZW1vdmUiKSkgeworCQkJCWFsbG93X3JlbW92ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS11bm1lcmdlZCIpKSB7CisJCQkJcmVmcmVzaF9mbGFncyB8PSBSRUZSRVNIX1VOTUVSR0VEOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVmcmVzaCIpKSB7CisJCQkJaGFzX2Vycm9ycyB8PSByZWZyZXNoX2NhY2hlKHJlZnJlc2hfZmxhZ3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVhbGx5LXJlZnJlc2giKSkgeworCQkJCWhhc19lcnJvcnMgfD0gcmVmcmVzaF9jYWNoZShSRUZSRVNIX1JFQUxMWSB8IHJlZnJlc2hfZmxhZ3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tY2FjaGVpbmZvIikpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJCXVuc2lnbmVkIGludCBtb2RlOworCisJCQkJaWYgKGkrMyA+PSBhcmdjKQorCQkJCQlkaWUoImdpdC11cGRhdGUtaW5kZXg6IC0tY2FjaGVpbmZvIDxtb2RlPiA8c2hhMT4gPHBhdGg+Iik7CisKKwkJCQlpZiAoKHNzY2FuZihhcmd2W2krMV0sICIlbyIsICZtb2RlKSAhPSAxKSB8fAorCQkJCSAgICBnZXRfc2hhMV9oZXgoYXJndltpKzJdLCBzaGExKSB8fAorCQkJCSAgICBhZGRfY2FjaGVpbmZvKG1vZGUsIHNoYTEsIGFyZ3ZbaSszXSwgMCkpCisJCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogLS1jYWNoZWluZm8iCisJCQkJCSAgICAiIGNhbm5vdCBhZGQgJXMiLCBhcmd2W2krM10pOworCQkJCWkgKz0gMzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWNobW9kPS14IikgfHwKKwkJCSAgICAhc3RyY21wKHBhdGgsICItLWNobW9kPSt4IikpIHsKKwkJCQlpZiAoYXJnYyA8PSBpKzEpCisJCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogJXMgPHBhdGg+IiwgcGF0aCk7CisJCQkJc2V0X2V4ZWN1dGFibGVfYml0ID0gcGF0aFs4XTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWFzc3VtZS11bmNoYW5nZWQiKSkgeworCQkJCW1hcmtfdmFsaWRfb25seSA9IE1BUktfVkFMSUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1uby1hc3N1bWUtdW5jaGFuZ2VkIikpIHsKKwkJCQltYXJrX3ZhbGlkX29ubHkgPSBVTk1BUktfVkFMSUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1pbmZvLW9ubHkiKSkgeworCQkJCWluZm9fb25seSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1mb3JjZS1yZW1vdmUiKSkgeworCQkJCWZvcmNlX3JlbW92ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLXoiKSkgeworCQkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tc3RkaW4iKSkgeworCQkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCQlkaWUoIi0tc3RkaW4gbXVzdCBiZSBhdCB0aGUgZW5kIik7CisJCQkJcmVhZF9mcm9tX3N0ZGluID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWluZGV4LWluZm8iKSkgeworCQkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCQlkaWUoIi0taW5kZXgtaW5mbyBtdXN0IGJlIGF0IHRoZSBlbmQiKTsKKwkJCQlhbGxvd19hZGQgPSBhbGxvd19yZXBsYWNlID0gYWxsb3dfcmVtb3ZlID0gMTsKKwkJCQlyZWFkX2luZGV4X2luZm8obGluZV90ZXJtaW5hdGlvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS11bnJlc29sdmUiKSkgeworCQkJCWhhc19lcnJvcnMgPSBkb191bnJlc29sdmUoYXJnYyAtIGksIGFyZ3YgKyBpLAorCQkJCQkJCSAgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKTsKKwkJCQlpZiAoaGFzX2Vycm9ycykKKwkJCQkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAwOworCQkJCWdvdG8gZmluaXNoOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tYWdhaW4iKSkgeworCQkJCWhhc19lcnJvcnMgPSBkb19yZXVwZGF0ZShhcmdjIC0gaSwgYXJndiArIGksCisJCQkJCQkJIHByZWZpeCwgcHJlZml4X2xlbmd0aCk7CisJCQkJaWYgKGhhc19lcnJvcnMpCisJCQkJCWFjdGl2ZV9jYWNoZV9jaGFuZ2VkID0gMDsKKwkJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWlnbm9yZS1taXNzaW5nIikpIHsKKwkJCQlyZWZyZXNoX2ZsYWdzIHw9IFJFRlJFU0hfSUdOT1JFX01JU1NJTkc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS12ZXJib3NlIikpIHsKKwkJCQl2ZXJib3NlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItaCIpIHx8ICFzdHJjbXAocGF0aCwgIi0taGVscCIpKQorCQkJCXVzYWdlKHVwZGF0ZV9pbmRleF91c2FnZSk7CisJCQlkaWUoInVua25vd24gb3B0aW9uICVzIiwgcGF0aCk7CisJCX0KKwkJdXBkYXRlX29uZShwYXRoLCBwcmVmaXgsIHByZWZpeF9sZW5ndGgpOworCQlpZiAoc2V0X2V4ZWN1dGFibGVfYml0KQorCQkJY2htb2RfcGF0aChzZXRfZXhlY3V0YWJsZV9iaXQsIHBhdGgpOworCX0KKwlpZiAocmVhZF9mcm9tX3N0ZGluKSB7CisJCXN0cnVjdCBzdHJidWYgYnVmOworCQlzdHJidWZfaW5pdCgmYnVmKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWNoYXIgKnBhdGhfbmFtZTsKKwkJCWNvbnN0IGNoYXIgKnA7CisJCQlyZWFkX2xpbmUoJmJ1Ziwgc3RkaW4sIGxpbmVfdGVybWluYXRpb24pOworCQkJaWYgKGJ1Zi5lb2YpCisJCQkJYnJlYWs7CisJCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBidWYuYnVmWzBdID09ICciJykKKwkJCQlwYXRoX25hbWUgPSB1bnF1b3RlX2Nfc3R5bGUoYnVmLmJ1ZiwgTlVMTCk7CisJCQllbHNlCisJCQkJcGF0aF9uYW1lID0gYnVmLmJ1ZjsKKwkJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIHBhdGhfbmFtZSk7CisJCQl1cGRhdGVfb25lKHAsIE5VTEwsIDApOworCQkJaWYgKHNldF9leGVjdXRhYmxlX2JpdCkKKwkJCQljaG1vZF9wYXRoKHNldF9leGVjdXRhYmxlX2JpdCwgcCk7CisJCQlpZiAocCA8IHBhdGhfbmFtZSB8fCBwID4gcGF0aF9uYW1lICsgc3RybGVuKHBhdGhfbmFtZSkpCisJCQkJZnJlZSgoY2hhciopIHApOworCQkJaWYgKHBhdGhfbmFtZSAhPSBidWYuYnVmKQorCQkJCWZyZWUocGF0aF9uYW1lKTsKKwkJfQorCX0KKworIGZpbmlzaDoKKwlpZiAoYWN0aXZlX2NhY2hlX2NoYW5nZWQpIHsKKwkJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkJICAgIGNvbW1pdF9sb2NrX2ZpbGUoJmxvY2tfZmlsZSkpCisJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCX0KKworCXJldHVybiBoYXNfZXJyb3JzID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUtcmVmLmMgYi91cGRhdGUtcmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlNmJiOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS1yZWYuYwpAQCAtMCwwICsxLDU2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF91cGRhdGVfcmVmX3VzYWdlW10gPQorImdpdC11cGRhdGUtcmVmIDxyZWZuYW1lPiA8dmFsdWU+IFs8b2xkdmFsPl0gWy1tIDxyZWFzb24+XSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpyZWZuYW1lPU5VTEwsICp2YWx1ZT1OVUxMLCAqb2xkdmFsPU5VTEwsICptc2c9TlVMTDsKKwlzdHJ1Y3QgcmVmX2xvY2sgKmxvY2s7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgb2xkc2hhMVsyMF07CisJaW50IGk7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoIXN0cmNtcCgiLW0iLCBhcmd2W2ldKSkgeworCQkJaWYgKGkrMSA+PSBhcmdjKQorCQkJCXVzYWdlKGdpdF91cGRhdGVfcmVmX3VzYWdlKTsKKwkJCW1zZyA9IGFyZ3ZbKytpXTsKKwkJCWlmICghKm1zZykKKwkJCQlkaWUoIlJlZnVzaW5nIHRvIHBlcmZvcm0gdXBkYXRlIHdpdGggZW1wdHkgbWVzc2FnZS4iKTsKKwkJCWlmIChzdHJjaHIobXNnLCAnXG4nKSkKKwkJCQlkaWUoIlJlZnVzaW5nIHRvIHBlcmZvcm0gdXBkYXRlIHdpdGggXFxuIGluIG1lc3NhZ2UuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXJlZm5hbWUpIHsKKwkJCXJlZm5hbWUgPSBhcmd2W2ldOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCF2YWx1ZSkgeworCQkJdmFsdWUgPSBhcmd2W2ldOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFvbGR2YWwpIHsKKwkJCW9sZHZhbCA9IGFyZ3ZbaV07CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlpZiAoIXJlZm5hbWUgfHwgIXZhbHVlKQorCQl1c2FnZShnaXRfdXBkYXRlX3JlZl91c2FnZSk7CisKKwlpZiAoZ2V0X3NoYTEodmFsdWUsIHNoYTEpKQorCQlkaWUoIiVzOiBub3QgYSB2YWxpZCBTSEExIiwgdmFsdWUpOworCW1lbXNldChvbGRzaGExLCAwLCAyMCk7CisJaWYgKG9sZHZhbCAmJiBnZXRfc2hhMShvbGR2YWwsIG9sZHNoYTEpKQorCQlkaWUoIiVzOiBub3QgYSB2YWxpZCBvbGQgU0hBMSIsIG9sZHZhbCk7CisKKwlsb2NrID0gbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUocmVmbmFtZSwgb2xkdmFsID8gb2xkc2hhMSA6IE5VTEwsIDApOworCWlmICghbG9jaykKKwkJcmV0dXJuIDE7CisJaWYgKHdyaXRlX3JlZl9zaGExKGxvY2ssIHNoYTEsIG1zZykgPCAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS1zZXJ2ZXItaW5mby5jIGIvdXBkYXRlLXNlcnZlci1pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2YzM4MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS1zZXJ2ZXItaW5mby5jCkBAIC0wLDAgKzEsMjUgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciB1cGRhdGVfc2VydmVyX2luZm9fdXNhZ2VbXSA9CisiZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyBbLS1mb3JjZV0iOworCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlpbnQgaTsKKwlpbnQgZm9yY2UgPSAwOworCWZvciAoaSA9IDE7IGkgPCBhYzsgaSsrKSB7CisJCWlmIChhdltpXVswXSA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKCItLWZvcmNlIiwgYXZbaV0pIHx8CisJCQkgICAgIXN0cmNtcCgiLWYiLCBhdltpXSkpCisJCQkJZm9yY2UgPSAxOworCQkJZWxzZQorCQkJCXVzYWdlKHVwZGF0ZV9zZXJ2ZXJfaW5mb191c2FnZSk7CisJCX0KKwl9CisJaWYgKGkgIT0gYWMpCisJCXVzYWdlKHVwZGF0ZV9zZXJ2ZXJfaW5mb191c2FnZSk7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlyZXR1cm4gISF1cGRhdGVfc2VydmVyX2luZm8oZm9yY2UpOworfQpkaWZmIC0tZ2l0IGEvdXBsb2FkLXBhY2suYyBiL3VwbG9hZC1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1NjBjOQotLS0gL2Rldi9udWxsCisrKyBiL3VwbG9hZC1wYWNrLmMKQEAgLTAsMCArMSwyOTIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHVwbG9hZF9wYWNrX3VzYWdlW10gPSAiZ2l0LXVwbG9hZC1wYWNrIFstLXN0cmljdF0gWy0tdGltZW91dD1ubl0gPGRpcj4iOworCisjZGVmaW5lIFRIRVlfSEFWRSAoMVUgPDwgMCkKKyNkZWZpbmUgT1VSX1JFRiAoMVUgPDwgMSkKKyNkZWZpbmUgV0FOVEVEICgxVSA8PCAyKQorI2RlZmluZSBNQVhfSEFTIDI1NgorI2RlZmluZSBNQVhfTkVFRFMgMjU2CitzdGF0aWMgaW50IG5yX2hhcyA9IDAsIG5yX25lZWRzID0gMCwgbXVsdGlfYWNrID0gMCwgbnJfb3VyX3JlZnMgPSAwOworc3RhdGljIGludCB1c2VfdGhpbl9wYWNrID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhhc19zaGExW01BWF9IQVNdWzIwXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5lZWRzX3NoYTFbTUFYX05FRURTXVsyMF07CitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWVvdXQgPSAwOworCitzdGF0aWMgdm9pZCByZXNldF90aW1lb3V0KHZvaWQpCit7CisJYWxhcm0odGltZW91dCk7Cit9CisKK3N0YXRpYyBpbnQgc3RyaXAoY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwlpZiAobGVuICYmIGxpbmVbbGVuLTFdID09ICdcbicpCisJCWxpbmVbLS1sZW5dID0gMDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcGFja19maWxlKHZvaWQpCit7CisJaW50IGZkWzJdOworCXBpZF90IHBpZDsKKwlpbnQgY3JlYXRlX2Z1bGxfcGFjayA9IChucl9vdXJfcmVmcyA9PSBucl9uZWVkcyAmJiAhbnJfaGFzKTsKKworCWlmIChwaXBlKGZkKSA8IDApCisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiB1bmFibGUgdG8gY3JlYXRlIHBpcGUiKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiB1bmFibGUgdG8gZm9yayBnaXQtcmV2LWxpc3QiKTsKKworCWlmICghcGlkKSB7CisJCWludCBpOworCQlpbnQgYXJnczsKKwkJY29uc3QgY2hhciAqKmFyZ3Y7CisJCWNoYXIgKmJ1ZjsKKwkJY2hhciAqKnA7CisKKwkJaWYgKGNyZWF0ZV9mdWxsX3BhY2spIHsKKwkJCWFyZ3MgPSAxMDsKKwkJCXVzZV90aGluX3BhY2sgPSAwOyAvKiBubyBwb2ludCBkb2luZyBpdCAqLworCQl9CisJCWVsc2UKKwkJCWFyZ3MgPSBucl9oYXMgKyBucl9uZWVkcyArIDU7CisJCXAgPSB4bWFsbG9jKGFyZ3MgKiBzaXplb2YoY2hhciAqKSk7CisJCWFyZ3YgPSAoY29uc3QgY2hhciAqKikgcDsKKwkJYnVmID0geG1hbGxvYyhhcmdzICogNDUpOworCisJCWR1cDIoZmRbMV0sIDEpOworCQljbG9zZSgwKTsKKwkJY2xvc2UoZmRbMF0pOworCQljbG9zZShmZFsxXSk7CisJCSpwKysgPSAicmV2LWxpc3QiOworCQkqcCsrID0gdXNlX3RoaW5fcGFjayA/ICItLW9iamVjdHMtZWRnZSIgOiAiLS1vYmplY3RzIjsKKwkJaWYgKGNyZWF0ZV9mdWxsX3BhY2sgfHwgTUFYX05FRURTIDw9IG5yX25lZWRzKQorCQkJKnArKyA9ICItLWFsbCI7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IG5yX25lZWRzOyBpKyspIHsKKwkJCQkqcCsrID0gYnVmOworCQkJCW1lbWNweShidWYsIHNoYTFfdG9faGV4KG5lZWRzX3NoYTFbaV0pLCA0MSk7CisJCQkJYnVmICs9IDQxOworCQkJfQorCQl9CisJCWlmICghY3JlYXRlX2Z1bGxfcGFjaykKKwkJCWZvciAoaSA9IDA7IGkgPCBucl9oYXM7IGkrKykgeworCQkJCSpwKysgPSBidWY7CisJCQkJKmJ1ZisrID0gJ14nOworCQkJCW1lbWNweShidWYsIHNoYTFfdG9faGV4KGhhc19zaGExW2ldKSwgNDEpOworCQkJCWJ1ZiArPSA0MTsKKwkJCX0KKwkJKnArKyA9IE5VTEw7CisJCWV4ZWN2X2dpdF9jbWQoYXJndik7CisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiB1bmFibGUgdG8gZXhlYyBnaXQtcmV2LWxpc3QiKTsKKwl9CisJZHVwMihmZFswXSwgMCk7CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKKwlleGVjbF9naXRfY21kKCJwYWNrLW9iamVjdHMiLCAiLS1zdGRvdXQiLCBOVUxMKTsKKwlkaWUoImdpdC11cGxvYWQtcGFjazogdW5hYmxlIHRvIGV4ZWMgZ2l0LXBhY2stb2JqZWN0cyIpOworfQorCitzdGF0aWMgaW50IGdvdF9zaGExKGNoYXIgKmhleCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkpCisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiBleHBlY3RlZCBTSEExIG9iamVjdCwgZ290ICclcyciLCBoZXgpOworCWlmICghaGFzX3NoYTFfZmlsZShzaGExKSkKKwkJcmV0dXJuIDA7CisJaWYgKG5yX2hhcyA8IE1BWF9IQVMpIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJCWlmICghKG8gJiYgby0+cGFyc2VkKSkKKwkJCW8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCWlmICghbykKKwkJCWRpZSgib29wcyAoJXMpIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQlpZiAoby0+dHlwZSA9PSBjb21taXRfdHlwZSkgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCQkJaWYgKG8tPmZsYWdzICYgVEhFWV9IQVZFKQorCQkJCXJldHVybiAwOworCQkJby0+ZmxhZ3MgfD0gVEhFWV9IQVZFOworCQkJZm9yIChwYXJlbnRzID0gKChzdHJ1Y3QgY29tbWl0KilvKS0+cGFyZW50czsKKwkJCSAgICAgcGFyZW50czsKKwkJCSAgICAgcGFyZW50cyA9IHBhcmVudHMtPm5leHQpCisJCQkJcGFyZW50cy0+aXRlbS0+b2JqZWN0LmZsYWdzIHw9IFRIRVlfSEFWRTsKKwkJfQorCQltZW1jcHkoaGFzX3NoYTFbbnJfaGFzKytdLCBzaGExLCAyMCk7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdldF9jb21tb25fY29tbWl0cyh2b2lkKQoreworCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgbGFzdF9zaGExWzIwXTsKKwlpbnQgbGVuOworCisJdHJhY2tfb2JqZWN0X3JlZnMgPSAwOworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisKKwlmb3IoOzspIHsKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlyZXNldF90aW1lb3V0KCk7CisKKwkJaWYgKCFsZW4pIHsKKwkJCWlmIChucl9oYXMgPT0gMCB8fCBtdWx0aV9hY2spCisJCQkJcGFja2V0X3dyaXRlKDEsICJOQUtcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJbGVuID0gc3RyaXAobGluZSwgbGVuKTsKKwkJaWYgKCFzdHJuY21wKGxpbmUsICJoYXZlICIsIDUpKSB7CisJCQlpZiAoZ290X3NoYTEobGluZSs1LCBzaGExKSAmJgorCQkJCQkobXVsdGlfYWNrIHx8IG5yX2hhcyA9PSAxKSkgeworCQkJCWlmIChucl9oYXMgPj0gTUFYX0hBUykKKwkJCQkJbXVsdGlfYWNrID0gMDsKKwkJCQlwYWNrZXRfd3JpdGUoMSwgIkFDSyAlcyVzXG4iLAorCQkJCQlzaGExX3RvX2hleChzaGExKSwKKwkJCQkJbXVsdGlfYWNrID8gICIgY29udGludWUiIDogIiIpOworCQkJCWlmIChtdWx0aV9hY2spCisJCQkJCW1lbWNweShsYXN0X3NoYTEsIHNoYTEsIDIwKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGxpbmUsICJkb25lIikpIHsKKwkJCWlmIChucl9oYXMgPiAwKSB7CisJCQkJaWYgKG11bHRpX2FjaykKKwkJCQkJcGFja2V0X3dyaXRlKDEsICJBQ0sgJXNcbiIsCisJCQkJCQkJc2hhMV90b19oZXgobGFzdF9zaGExKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwYWNrZXRfd3JpdGUoMSwgIk5BS1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IGV4cGVjdGVkIFNIQTEgbGlzdCwgZ290ICclcyciLCBsaW5lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVjZWl2ZV9uZWVkcyh2b2lkKQoreworCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJaW50IGxlbiwgbmVlZHM7CisKKwluZWVkcyA9IDA7CisJZm9yICg7OykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCQl1bnNpZ25lZCBjaGFyIGR1bW15WzIwXSwgKnNoYTFfYnVmOworCQlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKDAsIGxpbmUsIHNpemVvZihsaW5lKSk7CisJCXJlc2V0X3RpbWVvdXQoKTsKKwkJaWYgKCFsZW4pCisJCQlyZXR1cm4gbmVlZHM7CisKKwkJc2hhMV9idWYgPSBkdW1teTsKKwkJaWYgKG5lZWRzID09IE1BWF9ORUVEUykgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIndhcm5pbmc6IHN1cHBvcnRpbmcgb25seSBhIG1heCBvZiAlZCByZXF1ZXN0cy4gIgorCQkJCSJzZW5kaW5nIGV2ZXJ5dGhpbmcgaW5zdGVhZC5cbiIsCisJCQkJTUFYX05FRURTKTsKKwkJfQorCQllbHNlIGlmIChuZWVkcyA8IE1BWF9ORUVEUykKKwkJCXNoYTFfYnVmID0gbmVlZHNfc2hhMVtuZWVkc107CisKKwkJaWYgKHN0cm5jbXAoIndhbnQgIiwgbGluZSwgNSkgfHwgZ2V0X3NoYTFfaGV4KGxpbmUrNSwgc2hhMV9idWYpKQorCQkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHByb3RvY29sIGVycm9yLCAiCisJCQkgICAgImV4cGVjdGVkIHRvIGdldCBzaGEsIG5vdCAnJXMnIiwgbGluZSk7CisJCWlmIChzdHJzdHIobGluZSs0NSwgIm11bHRpX2FjayIpKQorCQkJbXVsdGlfYWNrID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAidGhpbi1wYWNrIikpCisJCQl1c2VfdGhpbl9wYWNrID0gMTsKKworCQkvKiBXZSBoYXZlIHNlbnQgYWxsIG91ciByZWZzIGFscmVhZHksIGFuZCB0aGUgb3RoZXIgZW5kCisJCSAqIHNob3VsZCBoYXZlIGNob3NlbiBvdXQgb2YgdGhlbTsgb3RoZXJ3aXNlIHRoZXkgYXJlCisJCSAqIGFza2luZyBmb3Igbm9uc2Vuc2UuCisJCSAqCisJCSAqIEhtcGguICBXZSBtYXkgbGF0ZXIgd2FudCB0byBhbGxvdyAid2FudCIgbGluZSB0aGF0CisJCSAqIGFza3MgZm9yIHNvbWV0aGluZyBsaWtlICJtYXN0ZXJ+MTAiIChzeW1ib2xpYykuLi4KKwkJICogd291bGQgaXQgbWFrZSBzZW5zZT8gIEkgZG9uJ3Qga25vdy4KKwkJICovCisJCW8gPSBsb29rdXBfb2JqZWN0KHNoYTFfYnVmKTsKKwkJaWYgKCFvIHx8ICEoby0+ZmxhZ3MgJiBPVVJfUkVGKSkKKwkJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiBub3Qgb3VyIHJlZiAlcyIsIGxpbmUrNSk7CisJCWlmICghKG8tPmZsYWdzICYgV0FOVEVEKSkgeworCQkJby0+ZmxhZ3MgfD0gV0FOVEVEOworCQkJbmVlZHMrKzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzZW5kX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjaGFyICpjYXBhYmlsaXRpZXMgPSAibXVsdGlfYWNrIHRoaW4tcGFjayI7CisJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKworCWlmICghbykKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IGNhbm5vdCBmaW5kIG9iamVjdCAlczoiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwlpZiAoY2FwYWJpbGl0aWVzKQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzJWMlc1xuIiwgc2hhMV90b19oZXgoc2hhMSksIHJlZm5hbWUsCisJCQkwLCBjYXBhYmlsaXRpZXMpOworCWVsc2UKKwkJcGFja2V0X3dyaXRlKDEsICIlcyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSksIHJlZm5hbWUpOworCWNhcGFiaWxpdGllcyA9IE5VTEw7CisJaWYgKCEoby0+ZmxhZ3MgJiBPVVJfUkVGKSkgeworCQlvLT5mbGFncyB8PSBPVVJfUkVGOworCQlucl9vdXJfcmVmcysrOworCX0KKwlpZiAoby0+dHlwZSA9PSB0YWdfdHlwZSkgeworCQlvID0gZGVyZWZfdGFnKG8sIHJlZm5hbWUsIDApOworCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXnt9XG4iLCBzaGExX3RvX2hleChvLT5zaGExKSwgcmVmbmFtZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVwbG9hZF9wYWNrKHZvaWQpCit7CisJcmVzZXRfdGltZW91dCgpOworCWhlYWRfcmVmKHNlbmRfcmVmKTsKKwlmb3JfZWFjaF9yZWYoc2VuZF9yZWYpOworCXBhY2tldF9mbHVzaCgxKTsKKwlucl9uZWVkcyA9IHJlY2VpdmVfbmVlZHMoKTsKKwlpZiAoIW5yX25lZWRzKQorCQlyZXR1cm4gMDsKKwlnZXRfY29tbW9uX2NvbW1pdHMoKTsKKwljcmVhdGVfcGFja19maWxlKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpkaXI7CisJaW50IGk7CisJaW50IHN0cmljdCA9IDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKGFyZ1swXSAhPSAnLScpCisJCQlicmVhazsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdHJpY3QiKSkgeworCQkJc3RyaWN0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLXRpbWVvdXQ9IiwgMTApKSB7CisJCQl0aW1lb3V0ID0gYXRvaShhcmcrMTApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJaWYgKGkgIT0gYXJnYy0xKQorCQl1c2FnZSh1cGxvYWRfcGFja191c2FnZSk7CisJZGlyID0gYXJndltpXTsKKworCWlmICghZW50ZXJfcmVwbyhkaXIsIHN0cmljdCkpCisJCWRpZSgiJyVzJzogdW5hYmxlIHRvIGNoZGlyIG9yIG5vdCBhIGdpdCBhcmNoaXZlIiwgZGlyKTsKKworCXVwbG9hZF9wYWNrKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c2FnZS5jIGIvdXNhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE5MjRjCi0tLSAvZGV2L251bGwKKysrIGIvdXNhZ2UuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisKK3N0YXRpYyB2b2lkIHJlcG9ydChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJZnB1dHMocHJlZml4LCBzdGRlcnIpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBwYXJhbXMpOworCWZwdXRzKCJcbiIsIHN0ZGVycik7Cit9CisKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZXJyKQoreworCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzXG4iLCBlcnIpOworCWV4aXQoMTI5KTsKK30KKwordm9pZCBkaWUoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJcmVwb3J0KCJmYXRhbDogIiwgZXJyLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworCWV4aXQoMTI4KTsKK30KKworaW50IGVycm9yKGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCisJdmFfc3RhcnQocGFyYW1zLCBlcnIpOworCXJlcG9ydCgiZXJyb3I6ICIsIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS92YXIuYyBiL3Zhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1N2EzM2IKLS0tIC9kZXYvbnVsbAorKysgYi92YXIuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBFcmljIEJpZWRlcm1hbiwgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIHZhcl91c2FnZVtdID0gImdpdC12YXIgWy1sIHwgPHZhcmlhYmxlPl0iOworCitzdHJ1Y3QgZ2l0X3ZhciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICooKnJlYWQpKGludCk7Cit9Oworc3RhdGljIHN0cnVjdCBnaXRfdmFyIGdpdF92YXJzW10gPSB7CisJeyAiR0lUX0NPTU1JVFRFUl9JREVOVCIsIGdpdF9jb21taXR0ZXJfaW5mbyB9LAorCXsgIkdJVF9BVVRIT1JfSURFTlQiLCAgIGdpdF9hdXRob3JfaW5mbyB9LAorCXsgIiIsIE5VTEwgfSwKK307CisKK3N0YXRpYyB2b2lkIGxpc3RfdmFycyh2b2lkKQoreworCXN0cnVjdCBnaXRfdmFyICpwdHI7CisJZm9yKHB0ciA9IGdpdF92YXJzOyBwdHItPnJlYWQ7IHB0cisrKSB7CisJCXByaW50ZigiJXM9JXNcbiIsIHB0ci0+bmFtZSwgcHRyLT5yZWFkKDApKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpyZWFkX3Zhcihjb25zdCBjaGFyICp2YXIpCit7CisJc3RydWN0IGdpdF92YXIgKnB0cjsKKwljb25zdCBjaGFyICp2YWw7CisJdmFsID0gTlVMTDsKKwlmb3IocHRyID0gZ2l0X3ZhcnM7IHB0ci0+cmVhZDsgcHRyKyspIHsKKwkJaWYgKHN0cmNtcCh2YXIsIHB0ci0+bmFtZSkgPT0gMCkgeworCQkJdmFsID0gcHRyLT5yZWFkKDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzaG93X2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICh2YWx1ZSkKKwkJcHJpbnRmKCIlcz0lc1xuIiwgdmFyLCB2YWx1ZSk7CisJZWxzZQorCQlwcmludGYoIiVzXG4iLCB2YXIpOworCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICp2YWw7CisJaWYgKGFyZ2MgIT0gMikgeworCQl1c2FnZSh2YXJfdXNhZ2UpOworCX0KKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlzZXR1cF9pZGVudCgpOworCXZhbCA9IE5VTEw7CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICItbCIpID09IDApIHsKKwkJZ2l0X2NvbmZpZyhzaG93X2NvbmZpZyk7CisJCWxpc3RfdmFycygpOworCQlyZXR1cm4gMDsKKwl9CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCXZhbCA9IHJlYWRfdmFyKGFyZ3ZbMV0pOworCWlmICghdmFsKQorCQl1c2FnZSh2YXJfdXNhZ2UpOworCQorCXByaW50ZigiJXNcbiIsIHZhbCk7CisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS92ZXJpZnktcGFjay5jIGIvdmVyaWZ5LXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTlkYjlkZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlcmlmeS1wYWNrLmMKQEAgLTAsMCArMSw1NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorCitzdGF0aWMgaW50IHZlcmlmeV9vbmVfcGFjayhjaGFyICphcmcsIGludCB2ZXJib3NlKQoreworCWludCBsZW4gPSBzdHJsZW4oYXJnKTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqZzsKKwkKKwl3aGlsZSAoMSkgeworCQkvKiBTaG91bGQgbmFtZSBmb28uaWR4LCBidXQgZm9vLnBhY2sgbWF5IGJlIG5hbWVkOworCQkgKiBjb252ZXJ0IGl0IHRvIGZvby5pZHgKKwkJICovCisJCWlmICghc3RyY21wKGFyZyArIGxlbiAtIDUsICIucGFjayIpKSB7CisJCQlzdHJjcHkoYXJnICsgbGVuIC0gNSwgIi5pZHgiKTsKKwkJCWxlbi0tOworCQl9CisJCS8qIFNob3VsZCBuYW1lIGZvby5pZHggbm93ICovCisJCWlmICgoZyA9IGFkZF9wYWNrZWRfZ2l0KGFyZywgbGVuLCAxKSkpCisJCQlicmVhazsKKwkJLyogTm8/ICBkaWQgeW91IG5hbWUganVzdCBmb28/ICovCisJCXN0cmNweShhcmcgKyBsZW4sICIuaWR4Iik7CisJCWxlbiArPSA0OworCQlpZiAoKGcgPSBhZGRfcGFja2VkX2dpdChhcmcsIGxlbiwgMSkpKQorCQkJYnJlYWs7CisJCXJldHVybiBlcnJvcigicGFja2ZpbGUgJXMgbm90IGZvdW5kLiIsIGFyZyk7CisJfQorCXJldHVybiB2ZXJpZnlfcGFjayhnLCB2ZXJib3NlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyaWZ5X3BhY2tfdXNhZ2VbXSA9ICJnaXQtdmVyaWZ5LXBhY2sgWy12XSA8cGFjaz4uLi4iOworCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlpbnQgZXJycyA9IDA7CisJaW50IHZlcmJvc2UgPSAwOworCWludCBub19tb3JlX29wdGlvbnMgPSAwOworCisJd2hpbGUgKDEgPCBhYykgeworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCisJCWlmICghbm9fbW9yZV9vcHRpb25zICYmIGF2WzFdWzBdID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoIi12IiwgYXZbMV0pKQorCQkJCXZlcmJvc2UgPSAxOworCQkJZWxzZSBpZiAoIXN0cmNtcCgiLS0iLCBhdlsxXSkpCisJCQkJbm9fbW9yZV9vcHRpb25zID0gMTsKKwkJCWVsc2UKKwkJCQl1c2FnZSh2ZXJpZnlfcGFja191c2FnZSk7CisJCX0KKwkJZWxzZSB7CisJCQlzdHJjcHkocGF0aCwgYXZbMV0pOworCQkJaWYgKHZlcmlmeV9vbmVfcGFjayhwYXRoLCB2ZXJib3NlKSkKKwkJCQllcnJzKys7CisJCX0KKwkJYWMtLTsgYXYrKzsKKwl9CisJcmV0dXJuICEhZXJyczsKK30KZGlmZiAtLWdpdCBhL3dyaXRlLXRyZWUuYyBiL3dyaXRlLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE2MDU4Ci0tLSAvZGV2L251bGwKKysrIGIvd3JpdGUtdHJlZS5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisKK3N0YXRpYyBpbnQgbWlzc2luZ19vayA9IDA7CisKK3N0YXRpYyBjb25zdCBjaGFyIHdyaXRlX3RyZWVfdXNhZ2VbXSA9ICJnaXQtd3JpdGUtdHJlZSBbLS1taXNzaW5nLW9rXSI7CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGxvY2tfZmlsZTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBlbnRyaWVzLCB3YXNfdmFsaWQsIG5ld2ZkOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJbmV3ZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZsb2NrX2ZpbGUsIGdldF9pbmRleF9maWxlKCkpOworCWVudHJpZXMgPSByZWFkX2NhY2hlKCk7CisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1taXNzaW5nLW9rIikpCisJCQltaXNzaW5nX29rID0gMTsKKwkJZWxzZQorCQkJZGllKHdyaXRlX3RyZWVfdXNhZ2UpOworCX0KKwkKKwlpZiAoYXJnYyA+IDIpCisJCWRpZSgidG9vIG1hbnkgb3B0aW9ucyIpOworCisJaWYgKGVudHJpZXMgPCAwKQorCQlkaWUoImdpdC13cml0ZS10cmVlOiBlcnJvciByZWFkaW5nIGNhY2hlIik7CisKKwlpZiAoIWFjdGl2ZV9jYWNoZV90cmVlKQorCQlhY3RpdmVfY2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKworCXdhc192YWxpZCA9IGNhY2hlX3RyZWVfZnVsbHlfdmFsaWQoYWN0aXZlX2NhY2hlX3RyZWUpOworCWlmICghd2FzX3ZhbGlkKSB7CisJCWlmIChjYWNoZV90cmVlX3VwZGF0ZShhY3RpdmVfY2FjaGVfdHJlZSwKKwkJCQkgICAgICBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9uciwKKwkJCQkgICAgICBtaXNzaW5nX29rLCAwKSA8IDApCisJCQlkaWUoImdpdC13cml0ZS10cmVlOiBlcnJvciBidWlsZGluZyB0cmVlcyIpOworCQlpZiAoMCA8PSBuZXdmZCkgeworCQkJaWYgKCF3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpKQorCQkJCWNvbW1pdF9sb2NrX2ZpbGUoJmxvY2tfZmlsZSk7CisJCX0KKwkJLyogTm90IGJlaW5nIGFibGUgdG8gd3JpdGUgaXMgZmluZSAtLSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkCisJCSAqIGluIHVwZGF0aW5nIHRoZSBjYWNoZS10cmVlIHBhcnQsIGFuZCBpZiB0aGUgbmV4dCBjYWxsZXIKKwkJICogZW5kcyB1cCB1c2luZyB0aGUgb2xkIGluZGV4IHdpdGggdW51cGRhdGVkIGNhY2hlLXRyZWUgcGFydAorCQkgKiBpdCBtaXNzZXMgdGhlIHdvcmsgd2UgZGlkIGhlcmUsIGJ1dCB0aGF0IGlzIGp1c3QgYQorCQkgKiBwZXJmb3JtYW5jZSBwZW5hbHR5IGFuZCBub3QgYSBiaWcgZGVhbC4KKwkJICovCisJfQorCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KGFjdGl2ZV9jYWNoZV90cmVlLT5zaGExKSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS94ZGlmZi1pbnRlcmZhY2UuYyBiL3hkaWZmLWludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODJkYTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi1pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDEwNCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisKK3N0YXRpYyBpbnQgcGFyc2VfbnVtKGNoYXIgKipjcF9wLCBpbnQgKm51bV9wKQoreworCWNoYXIgKmNwID0gKmNwX3A7CisJaW50IG51bSA9IDA7CisJaW50IHJlYWRfc29tZTsKKworCXdoaWxlICgnMCcgPD0gKmNwICYmICpjcCA8PSAnOScpCisJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJaWYgKCEocmVhZF9zb21lID0gY3AgLSAqY3BfcCkpCisJCXJldHVybiAtMTsKKwkqY3BfcCA9IGNwOworCSpudW1fcCA9IG51bTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2h1bmtfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sCisJCSAgICAgIGludCAqb2IsIGludCAqb24sCisJCSAgICAgIGludCAqbmIsIGludCAqbm4pCit7CisJY2hhciAqY3A7CisJY3AgPSBsaW5lICsgNDsKKwlpZiAocGFyc2VfbnVtKCZjcCwgb2IpKSB7CisJYmFkX2xpbmU6CisJCXJldHVybiBlcnJvcigibWFsZm9ybWVkIGRpZmYgb3V0cHV0OiAlcyIsIGxpbmUpOworCX0KKwlpZiAoKmNwID09ICcsJykgeworCQljcCsrOworCQlpZiAocGFyc2VfbnVtKCZjcCwgb24pKQorCQkJZ290byBiYWRfbGluZTsKKwl9CisJZWxzZQorCQkqb24gPSAxOworCWlmICgqY3ArKyAhPSAnICcgfHwgKmNwKysgIT0gJysnKQorCQlnb3RvIGJhZF9saW5lOworCWlmIChwYXJzZV9udW0oJmNwLCBuYikpCisJCWdvdG8gYmFkX2xpbmU7CisJaWYgKCpjcCA9PSAnLCcpIHsKKwkJY3ArKzsKKwkJaWYgKHBhcnNlX251bSgmY3AsIG5uKSkKKwkJCWdvdG8gYmFkX2xpbmU7CisJfQorCWVsc2UKKwkJKm5uID0gMTsKKwlyZXR1cm4gLSEhbWVtY21wKGNwLCAiIEBAIiwgMyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnN1bWVfb25lKHZvaWQgKnByaXZfLCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgKnByaXYgPSBwcml2XzsKKwljaGFyICplcDsKKwl3aGlsZSAoc2l6ZSkgeworCQl1bnNpZ25lZCBsb25nIHRoaXNfc2l6ZTsKKwkJZXAgPSBtZW1jaHIocywgJ1xuJywgc2l6ZSk7CisJCXRoaXNfc2l6ZSA9IChlcCA9PSBOVUxMKSA/IHNpemUgOiAoZXAgLSBzICsgMSk7CisJCXByaXYtPmNvbnN1bWUocHJpdiwgcywgdGhpc19zaXplKTsKKwkJc2l6ZSAtPSB0aGlzX3NpemU7CisJCXMgKz0gdGhpc19zaXplOworCX0KK30KKworaW50IHhkaWZmX291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1ZikKK3sKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSAqcHJpdiA9IHByaXZfOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykgeworCQlpZiAobWJbaV0ucHRyW21iW2ldLnNpemUtMV0gIT0gJ1xuJykgeworCQkJLyogSW5jb21wbGV0ZSBsaW5lICovCisJCQlwcml2LT5yZW1haW5kZXIgPSByZWFsbG9jKHByaXYtPnJlbWFpbmRlciwKKwkJCQkJCSAgcHJpdi0+cmVtYWluZGVyX3NpemUgKworCQkJCQkJICBtYltpXS5zaXplKTsKKwkJCW1lbWNweShwcml2LT5yZW1haW5kZXIgKyBwcml2LT5yZW1haW5kZXJfc2l6ZSwKKwkJCSAgICAgICBtYltpXS5wdHIsIG1iW2ldLnNpemUpOworCQkJcHJpdi0+cmVtYWluZGVyX3NpemUgKz0gbWJbaV0uc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogd2UgaGF2ZSBhIGNvbXBsZXRlIGxpbmUgKi8KKwkJaWYgKCFwcml2LT5yZW1haW5kZXIpIHsKKwkJCWNvbnN1bWVfb25lKHByaXYsIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcml2LT5yZW1haW5kZXIgPSByZWFsbG9jKHByaXYtPnJlbWFpbmRlciwKKwkJCQkJICBwcml2LT5yZW1haW5kZXJfc2l6ZSArCisJCQkJCSAgbWJbaV0uc2l6ZSk7CisJCW1lbWNweShwcml2LT5yZW1haW5kZXIgKyBwcml2LT5yZW1haW5kZXJfc2l6ZSwKKwkJICAgICAgIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCWNvbnN1bWVfb25lKHByaXYsIHByaXYtPnJlbWFpbmRlciwKKwkJCSAgICBwcml2LT5yZW1haW5kZXJfc2l6ZSArIG1iW2ldLnNpemUpOworCQlmcmVlKHByaXYtPnJlbWFpbmRlcik7CisJCXByaXYtPnJlbWFpbmRlciA9IE5VTEw7CisJCXByaXYtPnJlbWFpbmRlcl9zaXplID0gMDsKKwl9CisJaWYgKHByaXYtPnJlbWFpbmRlcikgeworCQljb25zdW1lX29uZShwcml2LCBwcml2LT5yZW1haW5kZXIsIHByaXYtPnJlbWFpbmRlcl9zaXplKTsKKwkJZnJlZShwcml2LT5yZW1haW5kZXIpOworCQlwcml2LT5yZW1haW5kZXIgPSBOVUxMOworCQlwcml2LT5yZW1haW5kZXJfc2l6ZSA9IDA7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEveGRpZmYtaW50ZXJmYWNlLmggYi94ZGlmZi1pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ2OTA4Ci0tLSAvZGV2L251bGwKKysrIGIveGRpZmYtaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBYRElGRl9JTlRFUkZBQ0VfSAorI2RlZmluZSBYRElGRl9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSAieGRpZmYveGRpZmYuaCIKKworc3RydWN0IHhkaWZmX2VtaXRfc3RhdGU7CisKK3R5cGVkZWYgdm9pZCAoKnhkaWZmX2VtaXRfY29uc3VtZV9mbikodm9pZCAqLCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOworCitzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB7CisJeGRpZmZfZW1pdF9jb25zdW1lX2ZuIGNvbnN1bWU7CisJY2hhciAqcmVtYWluZGVyOworCXVuc2lnbmVkIGxvbmcgcmVtYWluZGVyX3NpemU7Cit9OworCitpbnQgeGRpZmZfb3V0Zih2b2lkICpwcml2XywgbW1idWZmZXJfdCAqbWIsIGludCBuYnVmKTsKK2ludCBwYXJzZV9odW5rX2hlYWRlcihjaGFyICpsaW5lLCBpbnQgbGVuLAorCQkgICAgICBpbnQgKm9iLCBpbnQgKm9uLAorCQkgICAgICBpbnQgKm5iLCBpbnQgKm5uKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ZGlmZi94ZGlmZi5oIGIveGRpZmYveGRpZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQwZThhCi0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveGRpZmYuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhESUZGX0gpCisjZGVmaW5lIFhESUZGX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiAjaWZkZWYgX19jcGx1c3BsdXMgKi8KKworCisjZGVmaW5lIFhERl9ORUVEX01JTklNQUwgKDEgPDwgMSkKKworI2RlZmluZSBYRExfUEFUQ0hfTk9STUFMICctJworI2RlZmluZSBYRExfUEFUQ0hfUkVWRVJTRSAnKycKKyNkZWZpbmUgWERMX1BBVENIX01PREVNQVNLICgoMSA8PCA4KSAtIDEpCisjZGVmaW5lIFhETF9QQVRDSF9JR05PUkVCU1BBQ0UgKDEgPDwgOCkKKworI2RlZmluZSBYRExfRU1JVF9GVU5DTkFNRVMgKDEgPDwgMCkKKworI2RlZmluZSBYRExfTU1CX1JFQURPTkxZICgxIDw8IDApCisKKyNkZWZpbmUgWERMX01NRl9BVE9NSUMgKDEgPDwgMCkKKworI2RlZmluZSBYRExfQkRPUF9JTlMgMQorI2RlZmluZSBYRExfQkRPUF9DUFkgMgorI2RlZmluZSBYRExfQkRPUF9JTlNCIDMKKworCit0eXBlZGVmIHN0cnVjdCBzX21tZmlsZSB7CisJY2hhciAqcHRyOworCWxvbmcgc2l6ZTsKK30gbW1maWxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfbW1idWZmZXIgeworCWNoYXIgKnB0cjsKKwlsb25nIHNpemU7Cit9IG1tYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeHBwYXJhbSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK30geHBwYXJhbV90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZW1pdGNiIHsKKwl2b2lkICpwcml2OworCWludCAoKm91dGYpKHZvaWQgKiwgbW1idWZmZXJfdCAqLCBpbnQpOworfSB4ZGVtaXRjYl90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZW1pdGNvbmYgeworCWxvbmcgY3R4bGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit9IHhkZW1pdGNvbmZfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19iZGlmZnBhcmFtIHsKKwlsb25nIGJzaXplOworfSBiZGlmZnBhcmFtX3Q7CisKKworI2RlZmluZSB4ZGxfbWFsbG9jKHgpIG1hbGxvYyh4KQorI2RlZmluZSB4ZGxfZnJlZShwdHIpIGZyZWUocHRyKQorI2RlZmluZSB4ZGxfcmVhbGxvYyhwdHIseCkgcmVhbGxvYyhwdHIseCkKKwordm9pZCAqeGRsX21tZmlsZV9maXJzdChtbWZpbGVfdCAqbW1mLCBsb25nICpzaXplKTsKK3ZvaWQgKnhkbF9tbWZpbGVfbmV4dChtbWZpbGVfdCAqbW1mLCBsb25nICpzaXplKTsKK2xvbmcgeGRsX21tZmlsZV9zaXplKG1tZmlsZV90ICptbWYpOworCitpbnQgeGRsX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJICAgICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnLCB4ZGVtaXRjYl90ICplY2IpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiAjaWZkZWYgX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYRElGRl9IKSAqLworCmRpZmYgLS1naXQgYS94ZGlmZi94ZGlmZmkuYyBiL3hkaWZmL3hkaWZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWFkZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZGlmZmkuYwpAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMwlEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2luY2x1ZGUgInhpbmNsdWRlLmgiCisKKworCisjZGVmaW5lIFhETF9NQVhfQ09TVF9NSU4gMjU2CisjZGVmaW5lIFhETF9IRVVSX01JTl9DT1NUIDI1NgorI2RlZmluZSBYRExfTElORV9NQVggKGxvbmcpKCgxVUwgPDwgKDggKiBzaXplb2YobG9uZykgLSAxKSkgLSAxKQorI2RlZmluZSBYRExfU05BS0VfQ05UIDIwCisjZGVmaW5lIFhETF9LX0hFVVIgNAorCisKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZHBzcGxpdCB7CisJbG9uZyBpMSwgaTI7CisJaW50IG1pbl9sbywgbWluX2hpOworfSB4ZHBzcGxpdF90OworCisKKworCitzdGF0aWMgbG9uZyB4ZGxfc3BsaXQodW5zaWduZWQgbG9uZyBjb25zdCAqaGExLCBsb25nIG9mZjEsIGxvbmcgbGltMSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBjb25zdCAqaGEyLCBsb25nIG9mZjIsIGxvbmcgbGltMiwKKwkJICAgICAgbG9uZyAqa3ZkZiwgbG9uZyAqa3ZkYiwgaW50IG5lZWRfbWluLCB4ZHBzcGxpdF90ICpzcGwsCisJCSAgICAgIHhkYWxnb2Vudl90ICp4ZW52KTsKK3N0YXRpYyB4ZGNoYW5nZV90ICp4ZGxfYWRkX2NoYW5nZSh4ZGNoYW5nZV90ICp4c2NyLCBsb25nIGkxLCBsb25nIGkyLCBsb25nIGNoZzEsIGxvbmcgY2hnMik7CitzdGF0aWMgaW50IHhkbF9jaGFuZ2VfY29tcGFjdCh4ZGZpbGVfdCAqeGRmLCB4ZGZpbGVfdCAqeGRmbyk7CisKKworCisKKworLyoKKyAqIFNlZSAiQW4gTyhORCkgRGlmZmVyZW5jZSBBbGdvcml0aG0gYW5kIGl0cyBWYXJpYXRpb25zIiwgYnkgRXVnZW5lIE15ZXJzLgorICogQmFzaWNhbGx5IGNvbnNpZGVycyBhICJib3giIChvZmYxLCBvZmYyLCBsaW0xLCBsaW0yKSBhbmQgc2NhbiBmcm9tIGJvdGgKKyAqIHRoZSBmb3J3YXJkIGRpYWdvbmFsIHN0YXJ0aW5nIGZyb20gKG9mZjEsIG9mZjIpIGFuZCB0aGUgYmFja3dhcmQgZGlhZ29uYWwKKyAqIHN0YXJ0aW5nIGZyb20gKGxpbTEsIGxpbTIpLiBJZiB0aGUgSyB2YWx1ZXMgb24gdGhlIHNhbWUgZGlhZ29uYWwgY3Jvc3NlcworICogcmV0dXJucyB0aGUgZnVydGhlc3QgcG9pbnQgb2YgcmVhY2guIFdlIG1pZ2h0IGVuZCB1cCBoYXZpbmcgdG8gZXhwZW5zaXZlCisgKiBjYXNlcyB1c2luZyB0aGlzIGFsZ29yaXRobSBpcyBmdWxsLCBzbyBhIGxpdHRsZSBiaXQgb2YgaGV1cmlzdGljIGlzIG5lZWRlZAorICogdG8gY3V0IHRoZSBzZWFyY2ggYW5kIHRvIHJldHVybiBhIHN1Ym9wdGltYWwgcG9pbnQuCisgKi8KK3N0YXRpYyBsb25nIHhkbF9zcGxpdCh1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTEsIGxvbmcgb2ZmMSwgbG9uZyBsaW0xLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTIsIGxvbmcgb2ZmMiwgbG9uZyBsaW0yLAorCQkgICAgICBsb25nICprdmRmLCBsb25nICprdmRiLCBpbnQgbmVlZF9taW4sIHhkcHNwbGl0X3QgKnNwbCwKKwkJICAgICAgeGRhbGdvZW52X3QgKnhlbnYpIHsKKwlsb25nIGRtaW4gPSBvZmYxIC0gbGltMiwgZG1heCA9IGxpbTEgLSBvZmYyOworCWxvbmcgZm1pZCA9IG9mZjEgLSBvZmYyLCBibWlkID0gbGltMSAtIGxpbTI7CisJbG9uZyBvZGQgPSAoZm1pZCAtIGJtaWQpICYgMTsKKwlsb25nIGZtaW4gPSBmbWlkLCBmbWF4ID0gZm1pZDsKKwlsb25nIGJtaW4gPSBibWlkLCBibWF4ID0gYm1pZDsKKwlsb25nIGVjLCBkLCBpMSwgaTIsIHByZXYxLCBiZXN0LCBkZCwgdiwgazsKKworCS8qCisJICogU2V0IGluaXRpYWwgZGlhZ29uYWwgdmFsdWVzIGZvciBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkIHBhdGguCisJICovCisJa3ZkZltmbWlkXSA9IG9mZjE7CisJa3ZkYltibWlkXSA9IGxpbTE7CisKKwlmb3IgKGVjID0gMTs7IGVjKyspIHsKKwkJaW50IGdvdF9zbmFrZSA9IDA7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBleHRlbnQgdGhlIGRpYWdvbmFsICJkb21haW4iIGJ5IG9uZS4gSWYgdGhlIG5leHQKKwkJICogdmFsdWVzIGV4aXRzIHRoZSBib3ggYm91bmRhcmllcyB3ZSBuZWVkIHRvIGNoYW5nZSBpdCBpbiB0aGUKKwkJICogb3Bwb3NpdGUgZGlyZWN0aW9uIGJlY2F1c2UgKG1heCAtIG1pbikgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKwkJICogQWxzbyB3ZSBpbml0aWFsaXplIHRoZSBleHRlbmFsIEsgdmFsdWUgdG8gLTEgc28gdGhhdCB3ZSBjYW4KKwkJICogYXZvaWQgZXh0cmEgY29uZGl0aW9ucyBjaGVjayBpbnNpZGUgdGhlIGNvcmUgbG9vcC4KKwkJICovCisJCWlmIChmbWluID4gZG1pbikKKwkJCWt2ZGZbLS1mbWluIC0gMV0gPSAtMTsKKwkJZWxzZQorCQkJKytmbWluOworCQlpZiAoZm1heCA8IGRtYXgpCisJCQlrdmRmWysrZm1heCArIDFdID0gLTE7CisJCWVsc2UKKwkJCS0tZm1heDsKKworCQlmb3IgKGQgPSBmbWF4OyBkID49IGZtaW47IGQgLT0gMikgeworCQkJaWYgKGt2ZGZbZCAtIDFdID49IGt2ZGZbZCArIDFdKQorCQkJCWkxID0ga3ZkZltkIC0gMV0gKyAxOworCQkJZWxzZQorCQkJCWkxID0ga3ZkZltkICsgMV07CisJCQlwcmV2MSA9IGkxOworCQkJaTIgPSBpMSAtIGQ7CisJCQlmb3IgKDsgaTEgPCBsaW0xICYmIGkyIDwgbGltMiAmJiBoYTFbaTFdID09IGhhMltpMl07IGkxKyssIGkyKyspOworCQkJaWYgKGkxIC0gcHJldjEgPiB4ZW52LT5zbmFrZV9jbnQpCisJCQkJZ290X3NuYWtlID0gMTsKKwkJCWt2ZGZbZF0gPSBpMTsKKwkJCWlmIChvZGQgJiYgYm1pbiA8PSBkICYmIGQgPD0gYm1heCAmJiBrdmRiW2RdIDw9IGkxKSB7CisJCQkJc3BsLT5pMSA9IGkxOworCQkJCXNwbC0+aTIgPSBpMjsKKwkJCQlzcGwtPm1pbl9sbyA9IHNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGV4dGVudCB0aGUgZGlhZ29uYWwgImRvbWFpbiIgYnkgb25lLiBJZiB0aGUgbmV4dAorCQkgKiB2YWx1ZXMgZXhpdHMgdGhlIGJveCBib3VuZGFyaWVzIHdlIG5lZWQgdG8gY2hhbmdlIGl0IGluIHRoZQorCQkgKiBvcHBvc2l0ZSBkaXJlY3Rpb24gYmVjYXVzZSAobWF4IC0gbWluKSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorCQkgKiBBbHNvIHdlIGluaXRpYWxpemUgdGhlIGV4dGVuYWwgSyB2YWx1ZSB0byAtMSBzbyB0aGF0IHdlIGNhbgorCQkgKiBhdm9pZCBleHRyYSBjb25kaXRpb25zIGNoZWNrIGluc2lkZSB0aGUgY29yZSBsb29wLgorCQkgKi8KKwkJaWYgKGJtaW4gPiBkbWluKQorCQkJa3ZkYlstLWJtaW4gLSAxXSA9IFhETF9MSU5FX01BWDsKKwkJZWxzZQorCQkJKytibWluOworCQlpZiAoYm1heCA8IGRtYXgpCisJCQlrdmRiWysrYm1heCArIDFdID0gWERMX0xJTkVfTUFYOworCQllbHNlCisJCQktLWJtYXg7CisKKwkJZm9yIChkID0gYm1heDsgZCA+PSBibWluOyBkIC09IDIpIHsKKwkJCWlmIChrdmRiW2QgLSAxXSA8IGt2ZGJbZCArIDFdKQorCQkJCWkxID0ga3ZkYltkIC0gMV07CisJCQllbHNlCisJCQkJaTEgPSBrdmRiW2QgKyAxXSAtIDE7CisJCQlwcmV2MSA9IGkxOworCQkJaTIgPSBpMSAtIGQ7CisJCQlmb3IgKDsgaTEgPiBvZmYxICYmIGkyID4gb2ZmMiAmJiBoYTFbaTEgLSAxXSA9PSBoYTJbaTIgLSAxXTsgaTEtLSwgaTItLSk7CisJCQlpZiAocHJldjEgLSBpMSA+IHhlbnYtPnNuYWtlX2NudCkKKwkJCQlnb3Rfc25ha2UgPSAxOworCQkJa3ZkYltkXSA9IGkxOworCQkJaWYgKCFvZGQgJiYgZm1pbiA8PSBkICYmIGQgPD0gZm1heCAmJiBpMSA8PSBrdmRmW2RdKSB7CisJCQkJc3BsLT5pMSA9IGkxOworCQkJCXNwbC0+aTIgPSBpMjsKKwkJCQlzcGwtPm1pbl9sbyA9IHNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQlpZiAobmVlZF9taW4pCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZiB0aGUgZWRpdCBjb3N0IGlzIGFib3ZlIHRoZSBoZXVyaXN0aWMgdHJpZ2dlciBhbmQgaWYKKwkJICogd2UgZ290IGEgZ29vZCBzbmFrZSwgd2Ugc2FtcGxlIGN1cnJlbnQgZGlhZ29uYWxzIHRvIHNlZQorCQkgKiBpZiBzb21lIG9mIHRoZSwgaGF2ZSByZWFjaGVkIGFuICJpbnRlcmVzdGluZyIgcGF0aC4gT3VyCisJCSAqIG1lYXN1cmUgaXMgYSBmdW5jdGlvbiBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZGlhZ29uYWwKKwkJICogY29ybmVyIChpMSArIGkyKSBwZW5hbGl6ZWQgd2l0aCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKKwkJICogbWlkIGRpYWdvbmFsIGl0c2VsZi4gSWYgdGhpcyB2YWx1ZSBpcyBhYm92ZSB0aGUgY3VycmVudAorCQkgKiBlZGl0IGNvc3QgdGltZXMgYSBtYWdpYyBmYWN0b3IgKFhETF9LX0hFVVIpIHdlIGNvbnNpZGVyCisJCSAqIGl0IGludGVyZXN0aW5nLgorCQkgKi8KKwkJaWYgKGdvdF9zbmFrZSAmJiBlYyA+IHhlbnYtPmhldXJfbWluKSB7CisJCQlmb3IgKGJlc3QgPSAwLCBkID0gZm1heDsgZCA+PSBmbWluOyBkIC09IDIpIHsKKwkJCQlkZCA9IGQgPiBmbWlkID8gZCAtIGZtaWQ6IGZtaWQgLSBkOworCQkJCWkxID0ga3ZkZltkXTsKKwkJCQlpMiA9IGkxIC0gZDsKKwkJCQl2ID0gKGkxIC0gb2ZmMSkgKyAoaTIgLSBvZmYyKSAtIGRkOworCisJCQkJaWYgKHYgPiBYRExfS19IRVVSICogZWMgJiYgdiA+IGJlc3QgJiYKKwkJCQkgICAgb2ZmMSArIHhlbnYtPnNuYWtlX2NudCA8PSBpMSAmJiBpMSA8IGxpbTEgJiYKKwkJCQkgICAgb2ZmMiArIHhlbnYtPnNuYWtlX2NudCA8PSBpMiAmJiBpMiA8IGxpbTIpIHsKKwkJCQkJZm9yIChrID0gMTsgaGExW2kxIC0ga10gPT0gaGEyW2kyIC0ga107IGsrKykKKwkJCQkJCWlmIChrID09IHhlbnYtPnNuYWtlX2NudCkgeworCQkJCQkJCWJlc3QgPSB2OworCQkJCQkJCXNwbC0+aTEgPSBpMTsKKwkJCQkJCQlzcGwtPmkyID0gaTI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGJlc3QgPiAwKSB7CisJCQkJc3BsLT5taW5fbG8gPSAxOworCQkJCXNwbC0+bWluX2hpID0gMDsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisKKwkJCWZvciAoYmVzdCA9IDAsIGQgPSBibWF4OyBkID49IGJtaW47IGQgLT0gMikgeworCQkJCWRkID0gZCA+IGJtaWQgPyBkIC0gYm1pZDogYm1pZCAtIGQ7CisJCQkJaTEgPSBrdmRiW2RdOworCQkJCWkyID0gaTEgLSBkOworCQkJCXYgPSAobGltMSAtIGkxKSArIChsaW0yIC0gaTIpIC0gZGQ7CisKKwkJCQlpZiAodiA+IFhETF9LX0hFVVIgKiBlYyAmJiB2ID4gYmVzdCAmJgorCQkJCSAgICBvZmYxIDwgaTEgJiYgaTEgPD0gbGltMSAtIHhlbnYtPnNuYWtlX2NudCAmJgorCQkJCSAgICBvZmYyIDwgaTIgJiYgaTIgPD0gbGltMiAtIHhlbnYtPnNuYWtlX2NudCkgeworCQkJCQlmb3IgKGsgPSAwOyBoYTFbaTEgKyBrXSA9PSBoYTJbaTIgKyBrXTsgaysrKQorCQkJCQkJaWYgKGsgPT0geGVudi0+c25ha2VfY250IC0gMSkgeworCQkJCQkJCWJlc3QgPSB2OworCQkJCQkJCXNwbC0+aTEgPSBpMTsKKwkJCQkJCQlzcGwtPmkyID0gaTI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGJlc3QgPiAwKSB7CisJCQkJc3BsLT5taW5fbG8gPSAwOworCQkJCXNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBFbm91Z2ggaXMgZW5vdWdoLiBXZSBzcGVudCB0b28gbXVjaCB0aW1lIGhlcmUgYW5kIG5vdyB3ZSBjb2xsZWN0CisJCSAqIHRoZSBmdXJ0aGVzdCByZWFjaGluZyBwYXRoIHVzaW5nIHRoZSAoaTEgKyBpMikgbWVhc3VyZS4KKwkJICovCisJCWlmIChlYyA+PSB4ZW52LT5teGNvc3QpIHsKKwkJCWxvbmcgZmJlc3QsIGZiZXN0MSwgYmJlc3QsIGJiZXN0MTsKKworCQkJZmJlc3QgPSBmYmVzdDEgPSAtMTsKKwkJCWZvciAoZCA9IGZtYXg7IGQgPj0gZm1pbjsgZCAtPSAyKSB7CisJCQkJaTEgPSBYRExfTUlOKGt2ZGZbZF0sIGxpbTEpOworCQkJCWkyID0gaTEgLSBkOworCQkJCWlmIChsaW0yIDwgaTIpCisJCQkJCWkxID0gbGltMiArIGQsIGkyID0gbGltMjsKKwkJCQlpZiAoZmJlc3QgPCBpMSArIGkyKSB7CisJCQkJCWZiZXN0ID0gaTEgKyBpMjsKKwkJCQkJZmJlc3QxID0gaTE7CisJCQkJfQorCQkJfQorCisJCQliYmVzdCA9IGJiZXN0MSA9IFhETF9MSU5FX01BWDsKKwkJCWZvciAoZCA9IGJtYXg7IGQgPj0gYm1pbjsgZCAtPSAyKSB7CisJCQkJaTEgPSBYRExfTUFYKG9mZjEsIGt2ZGJbZF0pOworCQkJCWkyID0gaTEgLSBkOworCQkJCWlmIChpMiA8IG9mZjIpCisJCQkJCWkxID0gb2ZmMiArIGQsIGkyID0gb2ZmMjsKKwkJCQlpZiAoaTEgKyBpMiA8IGJiZXN0KSB7CisJCQkJCWJiZXN0ID0gaTEgKyBpMjsKKwkJCQkJYmJlc3QxID0gaTE7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGxpbTEgKyBsaW0yKSAtIGJiZXN0IDwgZmJlc3QgLSAob2ZmMSArIG9mZjIpKSB7CisJCQkJc3BsLT5pMSA9IGZiZXN0MTsKKwkJCQlzcGwtPmkyID0gZmJlc3QgLSBmYmVzdDE7CisJCQkJc3BsLT5taW5fbG8gPSAxOworCQkJCXNwbC0+bWluX2hpID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJc3BsLT5pMSA9IGJiZXN0MTsKKwkJCQlzcGwtPmkyID0gYmJlc3QgLSBiYmVzdDE7CisJCQkJc3BsLT5taW5fbG8gPSAwOworCQkJCXNwbC0+bWluX2hpID0gMTsKKwkJCX0KKwkJCXJldHVybiBlYzsKKwkJfQorCX0KKworCXJldHVybiAtMTsKK30KKworCisvKgorICogUnVsZTogIkRpdmlkZSBldCBJbXBlcmEiLiBSZWN1cnNpdmVseSBzcGxpdCB0aGUgYm94IGluIHN1Yi1ib3hlcyBieSBjYWxsaW5nCisgKiB0aGUgYm94IHNwbGl0dGluZyBmdW5jdGlvbi4gTm90ZSB0aGF0IHRoZSByZWFsIGpvYiAobWFya2luZyBjaGFuZ2VkIGxpbmVzKQorICogaXMgZG9uZSBpbiB0aGUgdHdvIGJvdW5kYXJ5IHJlYWNoaW5nIGNoZWNrcy4KKyAqLworaW50IHhkbF9yZWNzX2NtcChkaWZmZGF0YV90ICpkZDEsIGxvbmcgb2ZmMSwgbG9uZyBsaW0xLAorCQkgZGlmZmRhdGFfdCAqZGQyLCBsb25nIG9mZjIsIGxvbmcgbGltMiwKKwkJIGxvbmcgKmt2ZGYsIGxvbmcgKmt2ZGIsIGludCBuZWVkX21pbiwgeGRhbGdvZW52X3QgKnhlbnYpIHsKKwl1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTEgPSBkZDEtPmhhLCAqaGEyID0gZGQyLT5oYTsKKworCS8qCisJICogU2hyaW5rIHRoZSBib3ggYnkgd2Fsa2luZyB0aHJvdWdoIGVhY2ggZGlhZ29uYWwgc25ha2UgKFNXIGFuZCBORSkuCisJICovCisJZm9yICg7IG9mZjEgPCBsaW0xICYmIG9mZjIgPCBsaW0yICYmIGhhMVtvZmYxXSA9PSBoYTJbb2ZmMl07IG9mZjErKywgb2ZmMisrKTsKKwlmb3IgKDsgb2ZmMSA8IGxpbTEgJiYgb2ZmMiA8IGxpbTIgJiYgaGExW2xpbTEgLSAxXSA9PSBoYTJbbGltMiAtIDFdOyBsaW0xLS0sIGxpbTItLSk7CisKKwkvKgorCSAqIElmIG9uZSBkaW1lbnNpb24gaXMgZW1wdHksIHRoZW4gYWxsIHJlY29yZHMgb24gdGhlIG90aGVyIG9uZSBtdXN0CisJICogYmUgb2J2aW91c2x5IGNoYW5nZWQuCisJICovCisJaWYgKG9mZjEgPT0gbGltMSkgeworCQljaGFyICpyY2hnMiA9IGRkMi0+cmNoZzsKKwkJbG9uZyAqcmluZGV4MiA9IGRkMi0+cmluZGV4OworCisJCWZvciAoOyBvZmYyIDwgbGltMjsgb2ZmMisrKQorCQkJcmNoZzJbcmluZGV4MltvZmYyXV0gPSAxOworCX0gZWxzZSBpZiAob2ZmMiA9PSBsaW0yKSB7CisJCWNoYXIgKnJjaGcxID0gZGQxLT5yY2hnOworCQlsb25nICpyaW5kZXgxID0gZGQxLT5yaW5kZXg7CisKKwkJZm9yICg7IG9mZjEgPCBsaW0xOyBvZmYxKyspCisJCQlyY2hnMVtyaW5kZXgxW29mZjFdXSA9IDE7CisJfSBlbHNlIHsKKwkJbG9uZyBlYzsKKwkJeGRwc3BsaXRfdCBzcGw7CisJCXNwbC5pMSA9IHNwbC5pMiA9IDA7CisKKwkJLyoKKwkJICogRGl2aWRlIC4uLgorCQkgKi8KKwkJaWYgKChlYyA9IHhkbF9zcGxpdChoYTEsIG9mZjEsIGxpbTEsIGhhMiwgb2ZmMiwgbGltMiwga3ZkZiwga3ZkYiwKKwkJCQkgICAgbmVlZF9taW4sICZzcGwsIHhlbnYpKSA8IDApIHsKKworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogLi4uIGV0IEltcGVyYS4KKwkJICovCisJCWlmICh4ZGxfcmVjc19jbXAoZGQxLCBvZmYxLCBzcGwuaTEsIGRkMiwgb2ZmMiwgc3BsLmkyLAorCQkJCSBrdmRmLCBrdmRiLCBzcGwubWluX2xvLCB4ZW52KSA8IDAgfHwKKwkJICAgIHhkbF9yZWNzX2NtcChkZDEsIHNwbC5pMSwgbGltMSwgZGQyLCBzcGwuaTIsIGxpbTIsCisJCQkJIGt2ZGYsIGt2ZGIsIHNwbC5taW5faGksIHhlbnYpIDwgMCkgeworCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgeGRsX2RvX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCXhkZmVudl90ICp4ZSkgeworCWxvbmcgbmRpYWdzOworCWxvbmcgKmt2ZCwgKmt2ZGYsICprdmRiOworCXhkYWxnb2Vudl90IHhlbnY7CisJZGlmZmRhdGFfdCBkZDEsIGRkMjsKKworCWlmICh4ZGxfcHJlcGFyZV9lbnYobWYxLCBtZjIsIHhwcCwgeGUpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBzZXR1cCBLIHZlY3RvcnMgdG8gYmUgdXNlZCBieSB0aGUgZGlmZmVyZW50aWFsIGFsZ29yaXRobS4KKwkgKiBPbmUgaXMgdG8gc3RvcmUgdGhlIGZvcndhcmQgcGF0aCBhbmQgb25lIHRvIHN0b3JlIHRoZSBiYWNrd2FyZCBwYXRoLgorCSAqLworCW5kaWFncyA9IHhlLT54ZGYxLm5yZWZmICsgeGUtPnhkZjIubnJlZmYgKyAzOworCWlmICghKGt2ZCA9IChsb25nICopIHhkbF9tYWxsb2MoKDIgKiBuZGlhZ3MgKyAyKSAqIHNpemVvZihsb25nKSkpKSB7CisKKwkJeGRsX2ZyZWVfZW52KHhlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlrdmRmID0ga3ZkOworCWt2ZGIgPSBrdmRmICsgbmRpYWdzOworCWt2ZGYgKz0geGUtPnhkZjIubnJlZmYgKyAxOworCWt2ZGIgKz0geGUtPnhkZjIubnJlZmYgKyAxOworCisJeGVudi5teGNvc3QgPSB4ZGxfYm9nb3NxcnQobmRpYWdzKTsKKwlpZiAoeGVudi5teGNvc3QgPCBYRExfTUFYX0NPU1RfTUlOKQorCQl4ZW52Lm14Y29zdCA9IFhETF9NQVhfQ09TVF9NSU47CisJeGVudi5zbmFrZV9jbnQgPSBYRExfU05BS0VfQ05UOworCXhlbnYuaGV1cl9taW4gPSBYRExfSEVVUl9NSU5fQ09TVDsKKworCWRkMS5ucmVjID0geGUtPnhkZjEubnJlZmY7CisJZGQxLmhhID0geGUtPnhkZjEuaGE7CisJZGQxLnJjaGcgPSB4ZS0+eGRmMS5yY2hnOworCWRkMS5yaW5kZXggPSB4ZS0+eGRmMS5yaW5kZXg7CisJZGQyLm5yZWMgPSB4ZS0+eGRmMi5ucmVmZjsKKwlkZDIuaGEgPSB4ZS0+eGRmMi5oYTsKKwlkZDIucmNoZyA9IHhlLT54ZGYyLnJjaGc7CisJZGQyLnJpbmRleCA9IHhlLT54ZGYyLnJpbmRleDsKKworCWlmICh4ZGxfcmVjc19jbXAoJmRkMSwgMCwgZGQxLm5yZWMsICZkZDIsIDAsIGRkMi5ucmVjLAorCQkJIGt2ZGYsIGt2ZGIsICh4cHAtPmZsYWdzICYgWERGX05FRURfTUlOSU1BTCkgIT0gMCwgJnhlbnYpIDwgMCkgeworCisJCXhkbF9mcmVlKGt2ZCk7CisJCXhkbF9mcmVlX2Vudih4ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl4ZGxfZnJlZShrdmQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHhkY2hhbmdlX3QgKnhkbF9hZGRfY2hhbmdlKHhkY2hhbmdlX3QgKnhzY3IsIGxvbmcgaTEsIGxvbmcgaTIsIGxvbmcgY2hnMSwgbG9uZyBjaGcyKSB7CisJeGRjaGFuZ2VfdCAqeGNoOworCisJaWYgKCEoeGNoID0gKHhkY2hhbmdlX3QgKikgeGRsX21hbGxvYyhzaXplb2YoeGRjaGFuZ2VfdCkpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwl4Y2gtPm5leHQgPSB4c2NyOworCXhjaC0+aTEgPSBpMTsKKwl4Y2gtPmkyID0gaTI7CisJeGNoLT5jaGcxID0gY2hnMTsKKwl4Y2gtPmNoZzIgPSBjaGcyOworCisJcmV0dXJuIHhjaDsKK30KKworCitzdGF0aWMgaW50IHhkbF9jaGFuZ2VfY29tcGFjdCh4ZGZpbGVfdCAqeGRmLCB4ZGZpbGVfdCAqeGRmbykgeworCWxvbmcgaXgsIGl4bywgaXhzLCBpeHJlZiwgZ3Jwc2l6LCBucmVjID0geGRmLT5ucmVjOworCWNoYXIgKnJjaGcgPSB4ZGYtPnJjaGcsICpyY2hnbyA9IHhkZm8tPnJjaGc7CisJeHJlY29yZF90ICoqcmVjcyA9IHhkZi0+cmVjczsKKworCS8qCisJICogVGhpcyBpcyB0aGUgc2FtZSBvZiB3aGF0IEdOVSBkaWZmIGRvZXMuIE1vdmUgYmFjayBhbmQgZm9yd2FyZAorCSAqIGNoYW5nZSBncm91cHMgZm9yIGEgY29uc2lzdGVudCBhbmQgcHJldHR5IGRpZmYgb3V0cHV0LiBUaGlzIGFsc28KKwkgKiBoZWxwcyBpbiBmaW5kaW5nIGpvaW5lYWJsZSBjaGFuZ2UgZ3JvdXBzIGFuZCByZWR1Y2UgdGhlIGRpZmYgc2l6ZS4KKwkgKi8KKwlmb3IgKGl4ID0gaXhvID0gMDs7KSB7CisJCS8qCisJCSAqIEZpbmQgdGhlIGZpcnN0IGNoYW5nZWQgbGluZSBpbiB0aGUgdG8tYmUtY29tcGFjdGVkIGZpbGUuCisJCSAqIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBib3RoIGluZGV4ZXMsIHNvIGlmIHdlIGZpbmQgYQorCQkgKiBjaGFuZ2VkIGxpbmVzIGdyb3VwIG9uIHRoZSBvdGhlciBmaWxlLCB3aGlsZSBzY2FubmluZyB0aGUKKwkJICogdG8tYmUtY29tcGFjdGVkIGZpbGUsIHdlIG5lZWQgdG8gc2tpcCBpdCBwcm9wZXJseS4gTm90ZQorCQkgKiB0aGF0IGxvb3BzIHRoYXQgYXJlIHRlc3RpbmcgZm9yIGNoYW5nZWQgbGluZXMgb24gcmNoZyogZG8KKwkJICogbm90IG5lZWQgaW5kZXggYm91bmRpbmcgc2luY2UgdGhlIGFycmF5IGlzIHByZXBhcmVkIHdpdGgKKwkJICogYSB6ZXJvIGF0IHBvc2l0aW9uIC0xIGFuZCBOLgorCQkgKi8KKwkJZm9yICg7IGl4IDwgbnJlYyAmJiAhcmNoZ1tpeF07IGl4KyspCisJCQl3aGlsZSAocmNoZ29baXhvKytdKTsKKwkJaWYgKGl4ID09IG5yZWMpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBSZWNvcmQgdGhlIHN0YXJ0IG9mIGEgY2hhbmdlZC1ncm91cCBpbiB0aGUgdG8tYmUtY29tcGFjdGVkIGZpbGUKKwkJICogYW5kIGZpbmQgdGhlIGVuZCBvZiBpdCwgb24gYm90aCB0by1iZS1jb21wYWN0ZWQgYW5kIG90aGVyIGZpbGUKKwkJICogaW5kZXhlcyAoaXggYW5kIGl4bykuCisJCSAqLworCQlpeHMgPSBpeDsKKwkJZm9yIChpeCsrOyByY2hnW2l4XTsgaXgrKyk7CisJCWZvciAoOyByY2hnb1tpeG9dOyBpeG8rKyk7CisKKwkJZG8geworCQkJZ3Jwc2l6ID0gaXggLSBpeHM7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgbGluZSBiZWZvcmUgdGhlIGN1cnJlbnQgY2hhbmdlIGdyb3VwLCBpcyBlcXVhbCB0bworCQkJICogdGhlIGxhc3QgbGluZSBvZiB0aGUgY3VycmVudCBjaGFuZ2UgZ3JvdXAsIHNoaWZ0IGJhY2t3YXJkCisJCQkgKiB0aGUgZ3JvdXAuCisJCQkgKi8KKwkJCXdoaWxlIChpeHMgPiAwICYmIHJlY3NbaXhzIC0gMV0tPmhhID09IHJlY3NbaXggLSAxXS0+aGEgJiYKKwkJCSAgICAgICBYRExfUkVDTUFUQ0gocmVjc1tpeHMgLSAxXSwgcmVjc1tpeCAtIDFdKSkgeworCQkJCXJjaGdbLS1peHNdID0gMTsKKwkJCQlyY2hnWy0taXhdID0gMDsKKworCQkJCS8qCisJCQkJICogVGhpcyBjaGFuZ2UgbWlnaHQgaGF2ZSBqb2luZWQgdHdvIGNoYW5nZSBncm91cHMsCisJCQkJICogc28gd2UgdHJ5IHRvIHRha2UgdGhpcyBzY2VuYXJpbyBpbiBhY2NvdW50IGJ5IG1vdmluZworCQkJCSAqIHRoZSBzdGFydCBpbmRleCBhY2NvcmRpbmdseSAoYW5kIHNvIHRoZSBvdGhlci1maWxlCisJCQkJICogZW5kLW9mLWdyb3VwIGluZGV4KS4KKwkJCQkgKi8KKwkJCQlmb3IgKDsgcmNoZ1tpeHMgLSAxXTsgaXhzLS0pOworCQkJCXdoaWxlIChyY2hnb1stLWl4b10pOworCQkJfQorCisJCQkvKgorCQkJICogUmVjb3JkIHRoZSBlbmQtb2YtZ3JvdXAgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgbWF0Y2hlZAorCQkJICogd2l0aCBhIGdyb3VwIG9mIGNoYW5nZXMgaW4gdGhlIG90aGVyIGZpbGUgKHRoYXQgaXMsIHRoZQorCQkJICogY2hhbmdlIHJlY29yZCBiZWZvcmUgdGhlIGVuZi1vZi1ncm91cCBpbmRleCBpbiB0aGUgb3RoZXIKKwkJCSAqIGZpbGUgaXMgc2V0KS4KKwkJCSAqLworCQkJaXhyZWYgPSByY2hnb1tpeG8gLSAxXSA/IGl4OiBucmVjOworCisJCQkvKgorCQkJICogSWYgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGN1cnJlbnQgY2hhbmdlIGdyb3VwLCBpcyBlcXVhbCB0bworCQkJICogdGhlIGxpbmUgbmV4dCBvZiB0aGUgY3VycmVudCBjaGFuZ2UgZ3JvdXAsIHNoaWZ0IGZvcndhcmQKKwkJCSAqIHRoZSBncm91cC4KKwkJCSAqLworCQkJd2hpbGUgKGl4IDwgbnJlYyAmJiByZWNzW2l4c10tPmhhID09IHJlY3NbaXhdLT5oYSAmJgorCQkJICAgICAgIFhETF9SRUNNQVRDSChyZWNzW2l4c10sIHJlY3NbaXhdKSkgeworCQkJCXJjaGdbaXhzKytdID0gMDsKKwkJCQlyY2hnW2l4KytdID0gMTsKKworCQkJCS8qCisJCQkJICogVGhpcyBjaGFuZ2UgbWlnaHQgaGF2ZSBqb2luZWQgdHdvIGNoYW5nZSBncm91cHMsCisJCQkJICogc28gd2UgdHJ5IHRvIHRha2UgdGhpcyBzY2VuYXJpbyBpbiBhY2NvdW50IGJ5IG1vdmluZworCQkJCSAqIHRoZSBzdGFydCBpbmRleCBhY2NvcmRpbmdseSAoYW5kIHNvIHRoZSBvdGhlci1maWxlCisJCQkJICogZW5kLW9mLWdyb3VwIGluZGV4KS4gS2VlcCB0cmFja2luZyB0aGUgcmVmZXJlbmNlCisJCQkJICogaW5kZXggaW4gY2FzZSB3ZSBhcmUgc2hpZnRpbmcgdG9nZXRoZXIgd2l0aCBhCisJCQkJICogY29ycmVzcG9uZGluZyBncm91cCBvZiBjaGFuZ2VzIGluIHRoZSBvdGhlciBmaWxlLgorCQkJCSAqLworCQkJCWZvciAoOyByY2hnW2l4XTsgaXgrKyk7CisJCQkJd2hpbGUgKHJjaGdvWysraXhvXSkKKwkJCQkJaXhyZWYgPSBpeDsKKwkJCX0KKwkJfSB3aGlsZSAoZ3Jwc2l6ICE9IGl4IC0gaXhzKTsKKworCQkvKgorCQkgKiBUcnkgdG8gbW92ZSBiYWNrIHRoZSBwb3NzaWJseSBtZXJnZWQgZ3JvdXAgb2YgY2hhbmdlcywgdG8gbWF0Y2gKKwkJICogdGhlIHJlY29yZGVkIHBvc3Rpb24gaW4gdGhlIG90aGVyIGZpbGUuCisJCSAqLworCQl3aGlsZSAoaXhyZWYgPCBpeCkgeworCQkJcmNoZ1stLWl4c10gPSAxOworCQkJcmNoZ1stLWl4XSA9IDA7CisJCQl3aGlsZSAocmNoZ29bLS1peG9dKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKK2ludCB4ZGxfYnVpbGRfc2NyaXB0KHhkZmVudl90ICp4ZSwgeGRjaGFuZ2VfdCAqKnhzY3IpIHsKKwl4ZGNoYW5nZV90ICpjc2NyID0gTlVMTCwgKnhjaDsKKwljaGFyICpyY2hnMSA9IHhlLT54ZGYxLnJjaGcsICpyY2hnMiA9IHhlLT54ZGYyLnJjaGc7CisJbG9uZyBpMSwgaTIsIGwxLCBsMjsKKworCS8qCisJICogVHJpdmlhbC4gQ29sbGVjdHMgImdyb3VwcyIgb2YgY2hhbmdlcyBhbmQgY3JlYXRlcyBhbiBlZGl0IHNjcmlwdC4KKwkgKi8KKwlmb3IgKGkxID0geGUtPnhkZjEubnJlYywgaTIgPSB4ZS0+eGRmMi5ucmVjOyBpMSA+PSAwIHx8IGkyID49IDA7IGkxLS0sIGkyLS0pCisJCWlmIChyY2hnMVtpMSAtIDFdIHx8IHJjaGcyW2kyIC0gMV0pIHsKKwkJCWZvciAobDEgPSBpMTsgcmNoZzFbaTEgLSAxXTsgaTEtLSk7CisJCQlmb3IgKGwyID0gaTI7IHJjaGcyW2kyIC0gMV07IGkyLS0pOworCisJCQlpZiAoISh4Y2ggPSB4ZGxfYWRkX2NoYW5nZShjc2NyLCBpMSwgaTIsIGwxIC0gaTEsIGwyIC0gaTIpKSkgeworCQkJCXhkbF9mcmVlX3NjcmlwdChjc2NyKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljc2NyID0geGNoOworCQl9CisKKwkqeHNjciA9IGNzY3I7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHhkbF9mcmVlX3NjcmlwdCh4ZGNoYW5nZV90ICp4c2NyKSB7CisJeGRjaGFuZ2VfdCAqeGNoOworCisJd2hpbGUgKCh4Y2ggPSB4c2NyKSAhPSBOVUxMKSB7CisJCXhzY3IgPSB4c2NyLT5uZXh0OworCQl4ZGxfZnJlZSh4Y2gpOworCX0KK30KKworCitpbnQgeGRsX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJICAgICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnLCB4ZGVtaXRjYl90ICplY2IpIHsKKwl4ZGNoYW5nZV90ICp4c2NyOworCXhkZmVudl90IHhlOworCisJaWYgKHhkbF9kb19kaWZmKG1mMSwgbWYyLCB4cHAsICZ4ZSkgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoeGRsX2NoYW5nZV9jb21wYWN0KCZ4ZS54ZGYxLCAmeGUueGRmMikgPCAwIHx8CisJICAgIHhkbF9jaGFuZ2VfY29tcGFjdCgmeGUueGRmMiwgJnhlLnhkZjEpIDwgMCB8fAorCSAgICB4ZGxfYnVpbGRfc2NyaXB0KCZ4ZSwgJnhzY3IpIDwgMCkgeworCisJCXhkbF9mcmVlX2VudigmeGUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICh4c2NyKSB7CisJCWlmICh4ZGxfZW1pdF9kaWZmKCZ4ZSwgeHNjciwgZWNiLCB4ZWNmZykgPCAwKSB7CisKKwkJCXhkbF9mcmVlX3NjcmlwdCh4c2NyKTsKKwkJCXhkbF9mcmVlX2VudigmeGUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXhkbF9mcmVlX3NjcmlwdCh4c2NyKTsKKwl9CisJeGRsX2ZyZWVfZW52KCZ4ZSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEveGRpZmYveGRpZmZpLmggYi94ZGlmZi94ZGlmZmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhmM2M5Ci0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveGRpZmZpLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZiAhZGVmaW5lZChYRElGRklfSCkKKyNkZWZpbmUgWERJRkZJX0gKKworCit0eXBlZGVmIHN0cnVjdCBzX2RpZmZkYXRhIHsKKwlsb25nIG5yZWM7CisJdW5zaWduZWQgbG9uZyBjb25zdCAqaGE7CisJbG9uZyAqcmluZGV4OworCWNoYXIgKnJjaGc7Cit9IGRpZmZkYXRhX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeGRhbGdvZW52IHsKKwlsb25nIG14Y29zdDsKKwlsb25nIHNuYWtlX2NudDsKKwlsb25nIGhldXJfbWluOworfSB4ZGFsZ29lbnZfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGNoYW5nZSB7CisJc3RydWN0IHNfeGRjaGFuZ2UgKm5leHQ7CisJbG9uZyBpMSwgaTI7CisJbG9uZyBjaGcxLCBjaGcyOworfSB4ZGNoYW5nZV90OworCisKKworaW50IHhkbF9yZWNzX2NtcChkaWZmZGF0YV90ICpkZDEsIGxvbmcgb2ZmMSwgbG9uZyBsaW0xLAorCQkgZGlmZmRhdGFfdCAqZGQyLCBsb25nIG9mZjIsIGxvbmcgbGltMiwKKwkJIGxvbmcgKmt2ZGYsIGxvbmcgKmt2ZGIsIGludCBuZWVkX21pbiwgeGRhbGdvZW52X3QgKnhlbnYpOworaW50IHhkbF9kb19kaWZmKG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQl4ZGZlbnZfdCAqeGUpOworaW50IHhkbF9idWlsZF9zY3JpcHQoeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICoqeHNjcik7Cit2b2lkIHhkbF9mcmVlX3NjcmlwdCh4ZGNoYW5nZV90ICp4c2NyKTsKK2ludCB4ZGxfZW1pdF9kaWZmKHhkZmVudl90ICp4ZSwgeGRjaGFuZ2VfdCAqeHNjciwgeGRlbWl0Y2JfdCAqZWNiLAorCQkgIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpOworCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWERJRkZJX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3hlbWl0LmMgYi94ZGlmZi94ZW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNWJmYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZW1pdC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzCURhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSAieGluY2x1ZGUuaCIKKworCisKKworc3RhdGljIGxvbmcgeGRsX2dldF9yZWMoeGRmaWxlX3QgKnhkZiwgbG9uZyByaSwgY2hhciBjb25zdCAqKnJlYyk7CitzdGF0aWMgaW50IHhkbF9lbWl0X3JlY29yZCh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICpwcmUsIHhkZW1pdGNiX3QgKmVjYik7CitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2dldF9odW5rKHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpOworCisKKworCitzdGF0aWMgbG9uZyB4ZGxfZ2V0X3JlYyh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICoqcmVjKSB7CisKKwkqcmVjID0geGRmLT5yZWNzW3JpXS0+cHRyOworCisJcmV0dXJuIHhkZi0+cmVjc1tyaV0tPnNpemU7Cit9CisKKworc3RhdGljIGludCB4ZGxfZW1pdF9yZWNvcmQoeGRmaWxlX3QgKnhkZiwgbG9uZyByaSwgY2hhciBjb25zdCAqcHJlLCB4ZGVtaXRjYl90ICplY2IpIHsKKwlsb25nIHNpemUsIHBzaXplID0gc3RybGVuKHByZSk7CisJY2hhciBjb25zdCAqcmVjOworCisJc2l6ZSA9IHhkbF9nZXRfcmVjKHhkZiwgcmksICZyZWMpOworCWlmICh4ZGxfZW1pdF9kaWZmcmVjKHJlYywgc2l6ZSwgcHJlLCBwc2l6ZSwgZWNiKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFN0YXJ0aW5nIGF0IHRoZSBwYXNzZWQgY2hhbmdlIGF0b20sIGZpbmQgdGhlIGxhdGVzdCBjaGFuZ2UgYXRvbSB0byBiZSBpbmNsdWRlZAorICogaW5zaWRlIHRoZSBkaWZmZXJlbnRpYWwgaHVuayBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2dldF9odW5rKHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpIHsKKwl4ZGNoYW5nZV90ICp4Y2gsICp4Y2hwOworCisJZm9yICh4Y2hwID0geHNjciwgeGNoID0geHNjci0+bmV4dDsgeGNoOyB4Y2hwID0geGNoLCB4Y2ggPSB4Y2gtPm5leHQpCisJCWlmICh4Y2gtPmkxIC0gKHhjaHAtPmkxICsgeGNocC0+Y2hnMSkgPiAyICogeGVjZmctPmN0eGxlbikKKwkJCWJyZWFrOworCisJcmV0dXJuIHhjaHA7Cit9CisKKworc3RhdGljIHZvaWQgeGRsX2ZpbmRfZnVuYyh4ZGZpbGVfdCAqeGYsIGxvbmcgaSwgY2hhciAqYnVmLCBsb25nIHN6LCBsb25nICpsbCkgeworCisJLyoKKwkgKiBCZSBxdWl0ZSBzdHVwaWQgYWJvdXQgdGhpcyBmb3Igbm93LiAgRmluZCBhIGxpbmUgaW4gdGhlIG9sZCBmaWxlCisJICogYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgaHVuayAoYW5kIGNvbnRleHQpIHdoaWNoIHN0YXJ0cyB3aXRoIGEKKwkgKiBwbGF1c2libGUgY2hhcmFjdGVyLgorCSAqLworCisJY29uc3QgY2hhciAqcmVjOworCWxvbmcgbGVuOworCisJKmxsID0gMDsKKwl3aGlsZSAoaS0tID4gMCkgeworCQlsZW4gPSB4ZGxfZ2V0X3JlYyh4ZiwgaSwgJnJlYyk7CisJCWlmIChsZW4gPiAwICYmCisJCSAgICAoaXNhbHBoYSgodW5zaWduZWQgY2hhcikqcmVjKSB8fCAvKiBpZGVudGlmaWVyPyAqLworCQkgICAgICpyZWMgPT0gJ18nIHx8CS8qIGFsc28gaWRlbnRpZmllcj8gKi8KKwkJICAgICAqcmVjID09ICcoJyB8fAkvKiBsaXNwIGRlZnVuPyAqLworCQkgICAgICpyZWMgPT0gJyMnKSkgewkvKiAjZGVmaW5lPyAqLworCQkJaWYgKGxlbiA+IHN6KQorCQkJCWxlbiA9IHN6OworCQkJaWYgKGxlbiAmJiByZWNbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCQlsZW4tLTsKKwkJCW1lbWNweShidWYsIHJlYywgbGVuKTsKKwkJCSpsbCA9IGxlbjsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworCitpbnQgeGRsX2VtaXRfZGlmZih4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNiX3QgKmVjYiwKKwkJICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnKSB7CisJbG9uZyBzMSwgczIsIGUxLCBlMiwgbGN0eDsKKwl4ZGNoYW5nZV90ICp4Y2gsICp4Y2hlOworCWNoYXIgZnVuY2J1Zls0MF07CisJbG9uZyBmdW5jbGVuID0gMDsKKworCWZvciAoeGNoID0geGNoZSA9IHhzY3I7IHhjaDsgeGNoID0geGNoZS0+bmV4dCkgeworCQl4Y2hlID0geGRsX2dldF9odW5rKHhjaCwgeGVjZmcpOworCisJCXMxID0gWERMX01BWCh4Y2gtPmkxIC0geGVjZmctPmN0eGxlbiwgMCk7CisJCXMyID0gWERMX01BWCh4Y2gtPmkyIC0geGVjZmctPmN0eGxlbiwgMCk7CisKKwkJbGN0eCA9IHhlY2ZnLT5jdHhsZW47CisJCWxjdHggPSBYRExfTUlOKGxjdHgsIHhlLT54ZGYxLm5yZWMgLSAoeGNoZS0+aTEgKyB4Y2hlLT5jaGcxKSk7CisJCWxjdHggPSBYRExfTUlOKGxjdHgsIHhlLT54ZGYyLm5yZWMgLSAoeGNoZS0+aTIgKyB4Y2hlLT5jaGcyKSk7CisKKwkJZTEgPSB4Y2hlLT5pMSArIHhjaGUtPmNoZzEgKyBsY3R4OworCQllMiA9IHhjaGUtPmkyICsgeGNoZS0+Y2hnMiArIGxjdHg7CisKKwkJLyoKKwkJICogRW1pdCBjdXJyZW50IGh1bmsgaGVhZGVyLgorCQkgKi8KKworCQlpZiAoeGVjZmctPmZsYWdzICYgWERMX0VNSVRfRlVOQ05BTUVTKSB7CisJCQl4ZGxfZmluZF9mdW5jKCZ4ZS0+eGRmMSwgczEsIGZ1bmNidWYsCisJCQkJICAgICAgc2l6ZW9mKGZ1bmNidWYpLCAmZnVuY2xlbik7CisJCX0KKwkJaWYgKHhkbF9lbWl0X2h1bmtfaGRyKHMxICsgMSwgZTEgLSBzMSwgczIgKyAxLCBlMiAtIHMyLAorCQkJCSAgICAgIGZ1bmNidWYsIGZ1bmNsZW4sIGVjYikgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCS8qCisJCSAqIEVtaXQgcHJlLWNvbnRleHQuCisJCSAqLworCQlmb3IgKDsgczEgPCB4Y2gtPmkxOyBzMSsrKQorCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjEsIHMxLCAiICIsIGVjYikgPCAwKQorCQkJCXJldHVybiAtMTsKKworCQlmb3IgKHMxID0geGNoLT5pMSwgczIgPSB4Y2gtPmkyOzsgeGNoID0geGNoLT5uZXh0KSB7CisJCQkvKgorCQkJICogTWVyZ2UgcHJldmlvdXMgd2l0aCBjdXJyZW50IGNoYW5nZSBhdG9tLgorCQkJICovCisJCQlmb3IgKDsgczEgPCB4Y2gtPmkxICYmIHMyIDwgeGNoLT5pMjsgczErKywgczIrKykKKwkJCQlpZiAoeGRsX2VtaXRfcmVjb3JkKCZ4ZS0+eGRmMSwgczEsICIgIiwgZWNiKSA8IDApCisJCQkJCXJldHVybiAtMTsKKworCQkJLyoKKwkJCSAqIFJlbW92ZXMgbGluZXMgZnJvbSB0aGUgZmlyc3QgZmlsZS4KKwkJCSAqLworCQkJZm9yIChzMSA9IHhjaC0+aTE7IHMxIDwgeGNoLT5pMSArIHhjaC0+Y2hnMTsgczErKykKKwkJCQlpZiAoeGRsX2VtaXRfcmVjb3JkKCZ4ZS0+eGRmMSwgczEsICItIiwgZWNiKSA8IDApCisJCQkJCXJldHVybiAtMTsKKworCQkJLyoKKwkJCSAqIEFkZHMgbGluZXMgZnJvbSB0aGUgc2Vjb25kIGZpbGUuCisJCQkgKi8KKwkJCWZvciAoczIgPSB4Y2gtPmkyOyBzMiA8IHhjaC0+aTIgKyB4Y2gtPmNoZzI7IHMyKyspCisJCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjIsIHMyLCAiKyIsIGVjYikgPCAwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCWlmICh4Y2ggPT0geGNoZSkKKwkJCQlicmVhazsKKwkJCXMxID0geGNoLT5pMSArIHhjaC0+Y2hnMTsKKwkJCXMyID0geGNoLT5pMiArIHhjaC0+Y2hnMjsKKwkJfQorCisJCS8qCisJCSAqIEVtaXQgcG9zdC1jb250ZXh0LgorCQkgKi8KKwkJZm9yIChzMSA9IHhjaGUtPmkxICsgeGNoZS0+Y2hnMTsgczEgPCBlMTsgczErKykKKwkJCWlmICh4ZGxfZW1pdF9yZWNvcmQoJnhlLT54ZGYxLCBzMSwgIiAiLCBlY2IpIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3hkaWZmL3hlbWl0LmggYi94ZGlmZi94ZW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Mjk0MTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZW1pdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWEVNSVRfSCkKKyNkZWZpbmUgWEVNSVRfSAorCisKKworaW50IHhkbF9lbWl0X2RpZmYoeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICp4c2NyLCB4ZGVtaXRjYl90ICplY2IsCisJCSAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZyk7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhFTUlUX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3hpbmNsdWRlLmggYi94ZGlmZi94aW5jbHVkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTlkYTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94aW5jbHVkZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWElOQ0xVREVfSCkKKyNkZWZpbmUgWElOQ0xVREVfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAieG1hY3Jvcy5oIgorI2luY2x1ZGUgInhkaWZmLmgiCisjaW5jbHVkZSAieHR5cGVzLmgiCisjaW5jbHVkZSAieHV0aWxzLmgiCisjaW5jbHVkZSAieHByZXBhcmUuaCIKKyNpbmNsdWRlICJ4ZGlmZmkuaCIKKyNpbmNsdWRlICJ4ZW1pdC5oIgorCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWElOQ0xVREVfSCkgKi8KKwpkaWZmIC0tZ2l0IGEveGRpZmYveG1hY3Jvcy5oIGIveGRpZmYveG1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjAyNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94bWFjcm9zLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZiAhZGVmaW5lZChYTUFDUk9TX0gpCisjZGVmaW5lIFhNQUNST1NfSAorCisKKyNkZWZpbmUgR1JfUFJJTUUgMHg5ZTM3MDAwMVVMCisKKworI2RlZmluZSBYRExfTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSk6IChiKSkKKyNkZWZpbmUgWERMX01BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpOiAoYikpCisjZGVmaW5lIFhETF9BQlModikgKCh2KSA+PSAwID8gKHYpOiAtKHYpKQorI2RlZmluZSBYRExfSVNESUdJVChjKSAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQorI2RlZmluZSBYRExfSEFTSExPTkcodiwgYikgKCgodW5zaWduZWQgbG9uZykodikgKiBHUl9QUklNRSkgPj4gKChDSEFSX0JJVCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkgLSAoYikpKQorI2RlZmluZSBYRExfUFRSRlJFRShwKSBkbyB7IGlmIChwKSB7IHhkbF9mcmVlKHApOyAocCkgPSBOVUxMOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIFhETF9SRUNNQVRDSChyMSwgcjIpICgocjEpLT5zaXplID09IChyMiktPnNpemUgJiYgbWVtY21wKChyMSktPnB0ciwgKHIyKS0+cHRyLCAocjEpLT5zaXplKSA9PSAwKQorI2RlZmluZSBYRExfTEUzMl9QVVQocCwgdikgXAorZG8geyBcCisJdW5zaWduZWQgY2hhciAqX19wID0gKHVuc2lnbmVkIGNoYXIgKikgKHApOyBcCisJKl9fcCsrID0gKHVuc2lnbmVkIGNoYXIpICh2KTsgXAorCSpfX3ArKyA9ICh1bnNpZ25lZCBjaGFyKSAoKHYpID4+IDgpOyBcCisJKl9fcCsrID0gKHVuc2lnbmVkIGNoYXIpICgodikgPj4gMTYpOyBcCisJKl9fcCA9ICh1bnNpZ25lZCBjaGFyKSAoKHYpID4+IDI0KTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgWERMX0xFMzJfR0VUKHAsIHYpIFwKK2RvIHsgXAorCXVuc2lnbmVkIGNoYXIgY29uc3QgKl9fcCA9ICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopIChwKTsgXAorCSh2KSA9ICh1bnNpZ25lZCBsb25nKSBfX3BbMF0gfCAoKHVuc2lnbmVkIGxvbmcpIF9fcFsxXSkgPDwgOCB8IFwKKwkJKCh1bnNpZ25lZCBsb25nKSBfX3BbMl0pIDw8IDE2IHwgKCh1bnNpZ25lZCBsb25nKSBfX3BbM10pIDw8IDI0OyBcCit9IHdoaWxlICgwKQorCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWE1BQ1JPU19IKSAqLworCmRpZmYgLS1naXQgYS94ZGlmZi94cHJlcGFyZS5jIGIveGRpZmYveHByZXBhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQ1YTc1Ci0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveHByZXBhcmUuYwpAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlICJ4aW5jbHVkZS5oIgorCisKKworI2RlZmluZSBYRExfS1BESVNfUlVOIDQKKyNkZWZpbmUgWERMX01BWF9FUUxJTUlUIDEwMjQKKworCisKK3R5cGVkZWYgc3RydWN0IHNfeGRsY2xhc3MgeworCXN0cnVjdCBzX3hkbGNsYXNzICpuZXh0OworCXVuc2lnbmVkIGxvbmcgaGE7CisJY2hhciBjb25zdCAqbGluZTsKKwlsb25nIHNpemU7CisJbG9uZyBpZHg7Cit9IHhkbGNsYXNzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeGRsY2xhc3NpZmllciB7CisJdW5zaWduZWQgaW50IGhiaXRzOworCWxvbmcgaHNpemU7CisJeGRsY2xhc3NfdCAqKnJjaGFzaDsKKwljaGFzdG9yZV90IG5jaGE7CisJbG9uZyBjb3VudDsKK30geGRsY2xhc3NpZmllcl90OworCisKKworCitzdGF0aWMgaW50IHhkbF9pbml0X2NsYXNzaWZpZXIoeGRsY2xhc3NpZmllcl90ICpjZiwgbG9uZyBzaXplKTsKK3N0YXRpYyB2b2lkIHhkbF9mcmVlX2NsYXNzaWZpZXIoeGRsY2xhc3NpZmllcl90ICpjZik7CitzdGF0aWMgaW50IHhkbF9jbGFzc2lmeV9yZWNvcmQoeGRsY2xhc3NpZmllcl90ICpjZiwgeHJlY29yZF90ICoqcmhhc2gsIHVuc2lnbmVkIGludCBoYml0cywKKwkJCSAgICAgICB4cmVjb3JkX3QgKnJlYyk7CitzdGF0aWMgaW50IHhkbF9wcmVwYXJlX2N0eChtbWZpbGVfdCAqbWYsIGxvbmcgbmFyZWMsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkJICAgeGRsY2xhc3NpZmllcl90ICpjZiwgeGRmaWxlX3QgKnhkZik7CitzdGF0aWMgdm9pZCB4ZGxfZnJlZV9jdHgoeGRmaWxlX3QgKnhkZik7CitzdGF0aWMgaW50IHhkbF9jbGVhbl9tbWF0Y2goY2hhciBjb25zdCAqZGlzLCBsb25nIGksIGxvbmcgcywgbG9uZyBlKTsKK3N0YXRpYyBpbnQgeGRsX2NsZWFudXBfcmVjb3Jkcyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpOworc3RhdGljIGludCB4ZGxfdHJpbV9lbmRzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMik7CitzdGF0aWMgaW50IHhkbF9vcHRpbWl6ZV9jdHhzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMik7CisKKworCisKK3N0YXRpYyBpbnQgeGRsX2luaXRfY2xhc3NpZmllcih4ZGxjbGFzc2lmaWVyX3QgKmNmLCBsb25nIHNpemUpIHsKKwlsb25nIGk7CisKKwljZi0+aGJpdHMgPSB4ZGxfaGFzaGJpdHMoKHVuc2lnbmVkIGludCkgc2l6ZSk7CisJY2YtPmhzaXplID0gMSA8PCBjZi0+aGJpdHM7CisKKwlpZiAoeGRsX2NoYV9pbml0KCZjZi0+bmNoYSwgc2l6ZW9mKHhkbGNsYXNzX3QpLCBzaXplIC8gNCArIDEpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisJaWYgKCEoY2YtPnJjaGFzaCA9ICh4ZGxjbGFzc190ICoqKSB4ZGxfbWFsbG9jKGNmLT5oc2l6ZSAqIHNpemVvZih4ZGxjbGFzc190ICopKSkpIHsKKworCQl4ZGxfY2hhX2ZyZWUoJmNmLT5uY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgY2YtPmhzaXplOyBpKyspCisJCWNmLT5yY2hhc2hbaV0gPSBOVUxMOworCisJY2YtPmNvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHhkbF9mcmVlX2NsYXNzaWZpZXIoeGRsY2xhc3NpZmllcl90ICpjZikgeworCisJeGRsX2ZyZWUoY2YtPnJjaGFzaCk7CisJeGRsX2NoYV9mcmVlKCZjZi0+bmNoYSk7Cit9CisKKworc3RhdGljIGludCB4ZGxfY2xhc3NpZnlfcmVjb3JkKHhkbGNsYXNzaWZpZXJfdCAqY2YsIHhyZWNvcmRfdCAqKnJoYXNoLCB1bnNpZ25lZCBpbnQgaGJpdHMsCisJCQkgICAgICAgeHJlY29yZF90ICpyZWMpIHsKKwlsb25nIGhpOworCWNoYXIgY29uc3QgKmxpbmU7CisJeGRsY2xhc3NfdCAqcmNyZWM7CisKKwlsaW5lID0gcmVjLT5wdHI7CisJaGkgPSAobG9uZykgWERMX0hBU0hMT05HKHJlYy0+aGEsIGNmLT5oYml0cyk7CisJZm9yIChyY3JlYyA9IGNmLT5yY2hhc2hbaGldOyByY3JlYzsgcmNyZWMgPSByY3JlYy0+bmV4dCkKKwkJaWYgKHJjcmVjLT5oYSA9PSByZWMtPmhhICYmIHJjcmVjLT5zaXplID09IHJlYy0+c2l6ZSAmJgorCQkgICAgIW1lbWNtcChsaW5lLCByY3JlYy0+bGluZSwgcmVjLT5zaXplKSkKKwkJCWJyZWFrOworCisJaWYgKCFyY3JlYykgeworCQlpZiAoIShyY3JlYyA9IHhkbF9jaGFfYWxsb2MoJmNmLT5uY2hhKSkpIHsKKworCQkJcmV0dXJuIC0xOworCQl9CisJCXJjcmVjLT5pZHggPSBjZi0+Y291bnQrKzsKKwkJcmNyZWMtPmxpbmUgPSBsaW5lOworCQlyY3JlYy0+c2l6ZSA9IHJlYy0+c2l6ZTsKKwkJcmNyZWMtPmhhID0gcmVjLT5oYTsKKwkJcmNyZWMtPm5leHQgPSBjZi0+cmNoYXNoW2hpXTsKKwkJY2YtPnJjaGFzaFtoaV0gPSByY3JlYzsKKwl9CisKKwlyZWMtPmhhID0gKHVuc2lnbmVkIGxvbmcpIHJjcmVjLT5pZHg7CisKKwloaSA9IChsb25nKSBYRExfSEFTSExPTkcocmVjLT5oYSwgaGJpdHMpOworCXJlYy0+bmV4dCA9IHJoYXNoW2hpXTsKKwlyaGFzaFtoaV0gPSByZWM7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHhkbF9wcmVwYXJlX2N0eChtbWZpbGVfdCAqbWYsIGxvbmcgbmFyZWMsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkJICAgeGRsY2xhc3NpZmllcl90ICpjZiwgeGRmaWxlX3QgKnhkZikgeworCXVuc2lnbmVkIGludCBoYml0czsKKwlsb25nIGksIG5yZWMsIGhzaXplLCBic2l6ZTsKKwl1bnNpZ25lZCBsb25nIGhhdjsKKwljaGFyIGNvbnN0ICpibGssICpjdXIsICp0b3AsICpwcmV2OworCXhyZWNvcmRfdCAqY3JlYzsKKwl4cmVjb3JkX3QgKipyZWNzLCAqKnJyZWNzOworCXhyZWNvcmRfdCAqKnJoYXNoOworCXVuc2lnbmVkIGxvbmcgKmhhOworCWNoYXIgKnJjaGc7CisJbG9uZyAqcmluZGV4OworCisJaWYgKHhkbF9jaGFfaW5pdCgmeGRmLT5yY2hhLCBzaXplb2YoeHJlY29yZF90KSwgbmFyZWMgLyA0ICsgMSkgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIShyZWNzID0gKHhyZWNvcmRfdCAqKikgeGRsX21hbGxvYyhuYXJlYyAqIHNpemVvZih4cmVjb3JkX3QgKikpKSkgeworCisJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWhiaXRzID0geGRsX2hhc2hiaXRzKCh1bnNpZ25lZCBpbnQpIG5hcmVjKTsKKwloc2l6ZSA9IDEgPDwgaGJpdHM7CisJaWYgKCEocmhhc2ggPSAoeHJlY29yZF90ICoqKSB4ZGxfbWFsbG9jKGhzaXplICogc2l6ZW9mKHhyZWNvcmRfdCAqKSkpKSB7CisKKwkJeGRsX2ZyZWUocmVjcyk7CisJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykKKwkJcmhhc2hbaV0gPSBOVUxMOworCisJbnJlYyA9IDA7CisJaWYgKChjdXIgPSBibGsgPSB4ZGxfbW1maWxlX2ZpcnN0KG1mLCAmYnNpemUpKSAhPSBOVUxMKSB7CisJCWZvciAodG9wID0gYmxrICsgYnNpemU7OykgeworCQkJaWYgKGN1ciA+PSB0b3ApIHsKKwkJCQlpZiAoIShjdXIgPSBibGsgPSB4ZGxfbW1maWxlX25leHQobWYsICZic2l6ZSkpKQorCQkJCQlicmVhazsKKwkJCQl0b3AgPSBibGsgKyBic2l6ZTsKKwkJCX0KKwkJCXByZXYgPSBjdXI7CisJCQloYXYgPSB4ZGxfaGFzaF9yZWNvcmQoJmN1ciwgdG9wKTsKKwkJCWlmIChucmVjID49IG5hcmVjKSB7CisJCQkJbmFyZWMgKj0gMjsKKwkJCQlpZiAoIShycmVjcyA9ICh4cmVjb3JkX3QgKiopIHhkbF9yZWFsbG9jKHJlY3MsIG5hcmVjICogc2l6ZW9mKHhyZWNvcmRfdCAqKSkpKSB7CisKKwkJCQkJeGRsX2ZyZWUocmhhc2gpOworCQkJCQl4ZGxfZnJlZShyZWNzKTsKKwkJCQkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXJlY3MgPSBycmVjczsKKwkJCX0KKwkJCWlmICghKGNyZWMgPSB4ZGxfY2hhX2FsbG9jKCZ4ZGYtPnJjaGEpKSkgeworCisJCQkJeGRsX2ZyZWUocmhhc2gpOworCQkJCXhkbF9mcmVlKHJlY3MpOworCQkJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljcmVjLT5wdHIgPSBwcmV2OworCQkJY3JlYy0+c2l6ZSA9IChsb25nKSAoY3VyIC0gcHJldik7CisJCQljcmVjLT5oYSA9IGhhdjsKKwkJCXJlY3NbbnJlYysrXSA9IGNyZWM7CisKKwkJCWlmICh4ZGxfY2xhc3NpZnlfcmVjb3JkKGNmLCByaGFzaCwgaGJpdHMsIGNyZWMpIDwgMCkgeworCisJCQkJeGRsX2ZyZWUocmhhc2gpOworCQkJCXhkbF9mcmVlKHJlY3MpOworCQkJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIShyY2hnID0gKGNoYXIgKikgeGRsX21hbGxvYygobnJlYyArIDIpICogc2l6ZW9mKGNoYXIpKSkpIHsKKworCQl4ZGxfZnJlZShyaGFzaCk7CisJCXhkbF9mcmVlKHJlY3MpOworCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KHJjaGcsIDAsIChucmVjICsgMikgKiBzaXplb2YoY2hhcikpOworCisJaWYgKCEocmluZGV4ID0gKGxvbmcgKikgeGRsX21hbGxvYygobnJlYyArIDEpICogc2l6ZW9mKGxvbmcpKSkpIHsKKworCQl4ZGxfZnJlZShyY2hnKTsKKwkJeGRsX2ZyZWUocmhhc2gpOworCQl4ZGxfZnJlZShyZWNzKTsKKwkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghKGhhID0gKHVuc2lnbmVkIGxvbmcgKikgeGRsX21hbGxvYygobnJlYyArIDEpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpIHsKKworCQl4ZGxfZnJlZShyaW5kZXgpOworCQl4ZGxfZnJlZShyY2hnKTsKKwkJeGRsX2ZyZWUocmhhc2gpOworCQl4ZGxfZnJlZShyZWNzKTsKKwkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQlyZXR1cm4gLTE7CisJfQorCisJeGRmLT5ucmVjID0gbnJlYzsKKwl4ZGYtPnJlY3MgPSByZWNzOworCXhkZi0+aGJpdHMgPSBoYml0czsKKwl4ZGYtPnJoYXNoID0gcmhhc2g7CisJeGRmLT5yY2hnID0gcmNoZyArIDE7CisJeGRmLT5yaW5kZXggPSByaW5kZXg7CisJeGRmLT5ucmVmZiA9IDA7CisJeGRmLT5oYSA9IGhhOworCXhkZi0+ZHN0YXJ0ID0gMDsKKwl4ZGYtPmRlbmQgPSBucmVjIC0gMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHhkbF9mcmVlX2N0eCh4ZGZpbGVfdCAqeGRmKSB7CisKKwl4ZGxfZnJlZSh4ZGYtPnJoYXNoKTsKKwl4ZGxfZnJlZSh4ZGYtPnJpbmRleCk7CisJeGRsX2ZyZWUoeGRmLT5yY2hnIC0gMSk7CisJeGRsX2ZyZWUoeGRmLT5oYSk7CisJeGRsX2ZyZWUoeGRmLT5yZWNzKTsKKwl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7Cit9CisKKworaW50IHhkbF9wcmVwYXJlX2VudihtbWZpbGVfdCAqbWYxLCBtbWZpbGVfdCAqbWYyLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwKKwkJICAgIHhkZmVudl90ICp4ZSkgeworCWxvbmcgZW5sMSwgZW5sMjsKKwl4ZGxjbGFzc2lmaWVyX3QgY2Y7CisKKwllbmwxID0geGRsX2d1ZXNzX2xpbmVzKG1mMSkgKyAxOworCWVubDIgPSB4ZGxfZ3Vlc3NfbGluZXMobWYyKSArIDE7CisKKwlpZiAoeGRsX2luaXRfY2xhc3NpZmllcigmY2YsIGVubDEgKyBlbmwyICsgMSkgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh4ZGxfcHJlcGFyZV9jdHgobWYxLCBlbmwxLCB4cHAsICZjZiwgJnhlLT54ZGYxKSA8IDApIHsKKworCQl4ZGxfZnJlZV9jbGFzc2lmaWVyKCZjZik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHhkbF9wcmVwYXJlX2N0eChtZjIsIGVubDIsIHhwcCwgJmNmLCAmeGUtPnhkZjIpIDwgMCkgeworCisJCXhkbF9mcmVlX2N0eCgmeGUtPnhkZjEpOworCQl4ZGxfZnJlZV9jbGFzc2lmaWVyKCZjZik7CisJCXJldHVybiAtMTsKKwl9CisKKwl4ZGxfZnJlZV9jbGFzc2lmaWVyKCZjZik7CisKKwlpZiAoeGRsX29wdGltaXplX2N0eHMoJnhlLT54ZGYxLCAmeGUtPnhkZjIpIDwgMCkgeworCisJCXhkbF9mcmVlX2N0eCgmeGUtPnhkZjIpOworCQl4ZGxfZnJlZV9jdHgoJnhlLT54ZGYxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgeGRsX2ZyZWVfZW52KHhkZmVudl90ICp4ZSkgeworCisJeGRsX2ZyZWVfY3R4KCZ4ZS0+eGRmMik7CisJeGRsX2ZyZWVfY3R4KCZ4ZS0+eGRmMSk7Cit9CisKKworc3RhdGljIGludCB4ZGxfY2xlYW5fbW1hdGNoKGNoYXIgY29uc3QgKmRpcywgbG9uZyBpLCBsb25nIHMsIGxvbmcgZSkgeworCWxvbmcgciwgcmRpczAsIHJwZGlzMCwgcmRpczEsIHJwZGlzMTsKKworCS8qCisJICogU2NhbnMgdGhlIGxpbmVzIGJlZm9yZSAnaScgdG8gZmluZCBhIHJ1biBvZiBsaW5lcyB0aGF0IGVpdGhlcgorCSAqIGhhdmUgbm8gbWF0Y2ggKGRpc1tqXSA9PSAwKSBvciBoYXZlIG11bHRpcGxlIG1hdGNoZXMgKGRpc1tqXSA+IDEpLgorCSAqIE5vdGUgdGhhdCB3ZSBhbHdheXMgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzW2ldID4gMSwgc28gdGhlCisJICogY3VycmVudCBsaW5lIChpKSBpcyBhbHJlYWR5IGEgbXVsdGltYXRjaCBsaW5lLgorCSAqLworCWZvciAociA9IDEsIHJkaXMwID0gMCwgcnBkaXMwID0gMTsgKGkgLSByKSA+PSBzOyByKyspIHsKKwkJaWYgKCFkaXNbaSAtIHJdKQorCQkJcmRpczArKzsKKwkJZWxzZSBpZiAoZGlzW2kgLSByXSA9PSAyKQorCQkJcnBkaXMwKys7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqIElmIHRoZSBydW4gYmVmb3JlIHRoZSBsaW5lICdpJyBmb3VuZCBvbmx5IG11bHRpbWF0Y2ggbGluZXMsIHdlCisJICogcmV0dXJuIDAgYW5kIGhlbmNlIHdlIGRvbid0IG1ha2UgdGhlIGN1cnJlbnQgbGluZSAoaSkgZGlzY2FyZGVkLgorCSAqIFdlIHdhbnQgdG8gZGlzY2FyZCBtdWx0aW1hdGNoIGxpbmVzIG9ubHkgd2hlbiB0aGV5IGFwcGVhciBpbiB0aGUKKwkgKiBtaWRkbGUgb2YgcnVucyB3aXRoIG5vbWF0Y2ggbGluZXMgKGRpc1tqXSA9PSAwKS4KKwkgKi8KKwlpZiAocmRpczAgPT0gMCkKKwkJcmV0dXJuIDA7CisJZm9yIChyID0gMSwgcmRpczEgPSAwLCBycGRpczEgPSAxOyAoaSArIHIpIDw9IGU7IHIrKykgeworCQlpZiAoIWRpc1tpICsgcl0pCisJCQlyZGlzMSsrOworCQllbHNlIGlmIChkaXNbaSArIHJdID09IDIpCisJCQlycGRpczErKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCS8qCisJICogSWYgdGhlIHJ1biBhZnRlciB0aGUgbGluZSAnaScgZm91bmQgb25seSBtdWx0aW1hdGNoIGxpbmVzLCB3ZQorCSAqIHJldHVybiAwIGFuZCBoZW5jZSB3ZSBkb24ndCBtYWtlIHRoZSBjdXJyZW50IGxpbmUgKGkpIGRpc2NhcmRlZC4KKwkgKi8KKwlpZiAocmRpczEgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmRpczEgKz0gcmRpczA7CisJcnBkaXMxICs9IHJwZGlzMDsKKworCXJldHVybiBycGRpczEgKiBYRExfS1BESVNfUlVOIDwgKHJwZGlzMSArIHJkaXMxKTsKK30KKworCisvKgorICogVHJ5IHRvIHJlZHVjZSB0aGUgcHJvYmxlbSBjb21wbGV4aXR5LCBkaXNjYXJkIHJlY29yZHMgdGhhdCBoYXZlIG5vCisgKiBtYXRjaGVzIG9uIHRoZSBvdGhlciBmaWxlLiBBbHNvLCBsaW5lcyB0aGF0IGhhdmUgbXVsdGlwbGUgbWF0Y2hlcworICogbWlnaHQgYmUgcG90ZW50aWFsbHkgZGlzY2FyZGVkIGlmIHRoZXkgaGFwcGVhciBpbiBhIHJ1biBvZiBkaXNjYXJkYWJsZS4KKyAqLworc3RhdGljIGludCB4ZGxfY2xlYW51cF9yZWNvcmRzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMikgeworCWxvbmcgaSwgbm0sIHJoaSwgbnJlZmYsIG1saW07CisJdW5zaWduZWQgbG9uZyBoYXY7CisJeHJlY29yZF90ICoqcmVjczsKKwl4cmVjb3JkX3QgKnJlYzsKKwljaGFyICpkaXMsICpkaXMxLCAqZGlzMjsKKworCWlmICghKGRpcyA9IChjaGFyICopIHhkbF9tYWxsb2MoeGRmMS0+bnJlYyArIHhkZjItPm5yZWMgKyAyKSkpIHsKKworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChkaXMsIDAsIHhkZjEtPm5yZWMgKyB4ZGYyLT5ucmVjICsgMik7CisJZGlzMSA9IGRpczsKKwlkaXMyID0gZGlzMSArIHhkZjEtPm5yZWMgKyAxOworCisJaWYgKChtbGltID0geGRsX2JvZ29zcXJ0KHhkZjEtPm5yZWMpKSA+IFhETF9NQVhfRVFMSU1JVCkKKwkJbWxpbSA9IFhETF9NQVhfRVFMSU1JVDsKKwlmb3IgKGkgPSB4ZGYxLT5kc3RhcnQsIHJlY3MgPSAmeGRmMS0+cmVjc1t4ZGYxLT5kc3RhcnRdOyBpIDw9IHhkZjEtPmRlbmQ7IGkrKywgcmVjcysrKSB7CisJCWhhdiA9ICgqcmVjcyktPmhhOworCQlyaGkgPSAobG9uZykgWERMX0hBU0hMT05HKGhhdiwgeGRmMi0+aGJpdHMpOworCQlmb3IgKG5tID0gMCwgcmVjID0geGRmMi0+cmhhc2hbcmhpXTsgcmVjOyByZWMgPSByZWMtPm5leHQpCisJCQlpZiAocmVjLT5oYSA9PSBoYXYgJiYgKytubSA9PSBtbGltKQorCQkJCWJyZWFrOworCQlkaXMxW2ldID0gKG5tID09IDApID8gMDogKG5tID49IG1saW0pID8gMjogMTsKKwl9CisKKwlpZiAoKG1saW0gPSB4ZGxfYm9nb3NxcnQoeGRmMi0+bnJlYykpID4gWERMX01BWF9FUUxJTUlUKQorCQltbGltID0gWERMX01BWF9FUUxJTUlUOworCWZvciAoaSA9IHhkZjItPmRzdGFydCwgcmVjcyA9ICZ4ZGYyLT5yZWNzW3hkZjItPmRzdGFydF07IGkgPD0geGRmMi0+ZGVuZDsgaSsrLCByZWNzKyspIHsKKwkJaGF2ID0gKCpyZWNzKS0+aGE7CisJCXJoaSA9IChsb25nKSBYRExfSEFTSExPTkcoaGF2LCB4ZGYxLT5oYml0cyk7CisJCWZvciAobm0gPSAwLCByZWMgPSB4ZGYxLT5yaGFzaFtyaGldOyByZWM7IHJlYyA9IHJlYy0+bmV4dCkKKwkJCWlmIChyZWMtPmhhID09IGhhdiAmJiArK25tID09IG1saW0pCisJCQkJYnJlYWs7CisJCWRpczJbaV0gPSAobm0gPT0gMCkgPyAwOiAobm0gPj0gbWxpbSkgPyAyOiAxOworCX0KKworCWZvciAobnJlZmYgPSAwLCBpID0geGRmMS0+ZHN0YXJ0LCByZWNzID0gJnhkZjEtPnJlY3NbeGRmMS0+ZHN0YXJ0XTsKKwkgICAgIGkgPD0geGRmMS0+ZGVuZDsgaSsrLCByZWNzKyspIHsKKwkJaWYgKGRpczFbaV0gPT0gMSB8fAorCQkgICAgKGRpczFbaV0gPT0gMiAmJiAheGRsX2NsZWFuX21tYXRjaChkaXMxLCBpLCB4ZGYxLT5kc3RhcnQsIHhkZjEtPmRlbmQpKSkgeworCQkJeGRmMS0+cmluZGV4W25yZWZmXSA9IGk7CisJCQl4ZGYxLT5oYVtucmVmZl0gPSAoKnJlY3MpLT5oYTsKKwkJCW5yZWZmKys7CisJCX0gZWxzZQorCQkJeGRmMS0+cmNoZ1tpXSA9IDE7CisJfQorCXhkZjEtPm5yZWZmID0gbnJlZmY7CisKKwlmb3IgKG5yZWZmID0gMCwgaSA9IHhkZjItPmRzdGFydCwgcmVjcyA9ICZ4ZGYyLT5yZWNzW3hkZjItPmRzdGFydF07CisJICAgICBpIDw9IHhkZjItPmRlbmQ7IGkrKywgcmVjcysrKSB7CisJCWlmIChkaXMyW2ldID09IDEgfHwKKwkJICAgIChkaXMyW2ldID09IDIgJiYgIXhkbF9jbGVhbl9tbWF0Y2goZGlzMiwgaSwgeGRmMi0+ZHN0YXJ0LCB4ZGYyLT5kZW5kKSkpIHsKKwkJCXhkZjItPnJpbmRleFtucmVmZl0gPSBpOworCQkJeGRmMi0+aGFbbnJlZmZdID0gKCpyZWNzKS0+aGE7CisJCQlucmVmZisrOworCQl9IGVsc2UKKwkJCXhkZjItPnJjaGdbaV0gPSAxOworCX0KKwl4ZGYyLT5ucmVmZiA9IG5yZWZmOworCisJeGRsX2ZyZWUoZGlzKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBFYXJseSB0cmltIGluaXRpYWwgYW5kIHRlcm1pbmFsIG1hdGNoaW5nIHJlY29yZHMuCisgKi8KK3N0YXRpYyBpbnQgeGRsX3RyaW1fZW5kcyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpIHsKKwlsb25nIGksIGxpbTsKKwl4cmVjb3JkX3QgKipyZWNzMSwgKipyZWNzMjsKKworCXJlY3MxID0geGRmMS0+cmVjczsKKwlyZWNzMiA9IHhkZjItPnJlY3M7CisJZm9yIChpID0gMCwgbGltID0gWERMX01JTih4ZGYxLT5ucmVjLCB4ZGYyLT5ucmVjKTsgaSA8IGxpbTsKKwkgICAgIGkrKywgcmVjczErKywgcmVjczIrKykKKwkJaWYgKCgqcmVjczEpLT5oYSAhPSAoKnJlY3MyKS0+aGEpCisJCQlicmVhazsKKworCXhkZjEtPmRzdGFydCA9IHhkZjItPmRzdGFydCA9IGk7CisKKwlyZWNzMSA9IHhkZjEtPnJlY3MgKyB4ZGYxLT5ucmVjIC0gMTsKKwlyZWNzMiA9IHhkZjItPnJlY3MgKyB4ZGYyLT5ucmVjIC0gMTsKKwlmb3IgKGxpbSAtPSBpLCBpID0gMDsgaSA8IGxpbTsgaSsrLCByZWNzMS0tLCByZWNzMi0tKQorCQlpZiAoKCpyZWNzMSktPmhhICE9ICgqcmVjczIpLT5oYSkKKwkJCWJyZWFrOworCisJeGRmMS0+ZGVuZCA9IHhkZjEtPm5yZWMgLSBpIC0gMTsKKwl4ZGYyLT5kZW5kID0geGRmMi0+bnJlYyAtIGkgLSAxOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB4ZGxfb3B0aW1pemVfY3R4cyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpIHsKKworCWlmICh4ZGxfdHJpbV9lbmRzKHhkZjEsIHhkZjIpIDwgMCB8fAorCSAgICB4ZGxfY2xlYW51cF9yZWNvcmRzKHhkZjEsIHhkZjIpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEveGRpZmYveHByZXBhcmUuaCBiL3hkaWZmL3hwcmVwYXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0YzU2OQotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3hwcmVwYXJlLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZiAhZGVmaW5lZChYUFJFUEFSRV9IKQorI2RlZmluZSBYUFJFUEFSRV9ICisKKworCitpbnQgeGRsX3ByZXBhcmVfZW52KG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkgICAgeGRmZW52X3QgKnhlKTsKK3ZvaWQgeGRsX2ZyZWVfZW52KHhkZmVudl90ICp4ZSk7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhQUkVQQVJFX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3h0eXBlcy5oIGIveGRpZmYveHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5M2E2NgotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3h0eXBlcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWFRZUEVTX0gpCisjZGVmaW5lIFhUWVBFU19ICisKKworCit0eXBlZGVmIHN0cnVjdCBzX2NoYW5vZGUgeworCXN0cnVjdCBzX2NoYW5vZGUgKm5leHQ7CisJbG9uZyBpY3VycjsKK30gY2hhbm9kZV90OworCit0eXBlZGVmIHN0cnVjdCBzX2NoYXN0b3JlIHsKKwljaGFub2RlX3QgKmhlYWQsICp0YWlsOworCWxvbmcgaXNpemUsIG5zaXplOworCWNoYW5vZGVfdCAqYW5jdXI7CisJY2hhbm9kZV90ICpzbmN1cjsKKwlsb25nIHNjdXJyOworfSBjaGFzdG9yZV90OworCit0eXBlZGVmIHN0cnVjdCBzX3hyZWNvcmQgeworCXN0cnVjdCBzX3hyZWNvcmQgKm5leHQ7CisJY2hhciBjb25zdCAqcHRyOworCWxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGhhOworfSB4cmVjb3JkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeGRmaWxlIHsKKwljaGFzdG9yZV90IHJjaGE7CisJbG9uZyBucmVjOworCXVuc2lnbmVkIGludCBoYml0czsKKwl4cmVjb3JkX3QgKipyaGFzaDsKKwlsb25nIGRzdGFydCwgZGVuZDsKKwl4cmVjb3JkX3QgKipyZWNzOworCWNoYXIgKnJjaGc7CisJbG9uZyAqcmluZGV4OworCWxvbmcgbnJlZmY7CisJdW5zaWduZWQgbG9uZyAqaGE7Cit9IHhkZmlsZV90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZmVudiB7CisJeGRmaWxlX3QgeGRmMSwgeGRmMjsKK30geGRmZW52X3Q7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhUWVBFU19IKSAqLworCmRpZmYgLS1naXQgYS94ZGlmZi94dXRpbHMuYyBiL3hkaWZmL3h1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWI4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94dXRpbHMuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMwlEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2luY2x1ZGUgInhpbmNsdWRlLmgiCisKKworCisjZGVmaW5lIFhETF9HVUVTU19OTElORVMgMjU2CisKKworCisKK2xvbmcgeGRsX2JvZ29zcXJ0KGxvbmcgbikgeworCWxvbmcgaTsKKworCS8qCisJICogQ2xhc3NpY2FsIGludGVnZXIgc3F1YXJlIHJvb3QgYXBwcm94aW1hdGlvbiB1c2luZyBzaGlmdHMuCisJICovCisJZm9yIChpID0gMTsgbiA+IDA7IG4gPj49IDIpCisJCWkgPDw9IDE7CisKKwlyZXR1cm4gaTsKK30KKworCitpbnQgeGRsX2VtaXRfZGlmZnJlYyhjaGFyIGNvbnN0ICpyZWMsIGxvbmcgc2l6ZSwgY2hhciBjb25zdCAqcHJlLCBsb25nIHBzaXplLAorCQkgICAgIHhkZW1pdGNiX3QgKmVjYikgeworCW1tYnVmZmVyX3QgbWJbM107CisJaW50IGk7CisKKwltYlswXS5wdHIgPSAoY2hhciAqKSBwcmU7CisJbWJbMF0uc2l6ZSA9IHBzaXplOworCW1iWzFdLnB0ciA9IChjaGFyICopIHJlYzsKKwltYlsxXS5zaXplID0gc2l6ZTsKKwlpID0gMjsKKworCWlmICghc2l6ZSB8fCByZWNbc2l6ZS0xXSAhPSAnXG4nKSB7CisJCW1iWzJdLnB0ciA9ICJcblxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcbiI7CisJCW1iWzJdLnNpemUgPSBzdHJsZW4obWJbMl0ucHRyKTsKKwkJaSA9IDM7CisJfQorCisJaWYgKGVjYi0+b3V0ZihlY2ItPnByaXYsIG1iLCBpKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKnhkbF9tbWZpbGVfZmlyc3QobW1maWxlX3QgKm1tZiwgbG9uZyAqc2l6ZSkKK3sKKwkqc2l6ZSA9IG1tZi0+c2l6ZTsKKwlyZXR1cm4gbW1mLT5wdHI7Cit9CisKKwordm9pZCAqeGRsX21tZmlsZV9uZXh0KG1tZmlsZV90ICptbWYsIGxvbmcgKnNpemUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKworbG9uZyB4ZGxfbW1maWxlX3NpemUobW1maWxlX3QgKm1tZikKK3sKKwlyZXR1cm4gbW1mLT5zaXplOworfQorCisKK2ludCB4ZGxfY2hhX2luaXQoY2hhc3RvcmVfdCAqY2hhLCBsb25nIGlzaXplLCBsb25nIGljb3VudCkgeworCisJY2hhLT5oZWFkID0gY2hhLT50YWlsID0gTlVMTDsKKwljaGEtPmlzaXplID0gaXNpemU7CisJY2hhLT5uc2l6ZSA9IGljb3VudCAqIGlzaXplOworCWNoYS0+YW5jdXIgPSBjaGEtPnNuY3VyID0gTlVMTDsKKwljaGEtPnNjdXJyID0gMDsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgeGRsX2NoYV9mcmVlKGNoYXN0b3JlX3QgKmNoYSkgeworCWNoYW5vZGVfdCAqY3VyLCAqdG1wOworCisJZm9yIChjdXIgPSBjaGEtPmhlYWQ7ICh0bXAgPSBjdXIpICE9IE5VTEw7KSB7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwkJeGRsX2ZyZWUodG1wKTsKKwl9Cit9CisKKwordm9pZCAqeGRsX2NoYV9hbGxvYyhjaGFzdG9yZV90ICpjaGEpIHsKKwljaGFub2RlX3QgKmFuY3VyOworCXZvaWQgKmRhdGE7CisKKwlpZiAoIShhbmN1ciA9IGNoYS0+YW5jdXIpIHx8IGFuY3VyLT5pY3VyciA9PSBjaGEtPm5zaXplKSB7CisJCWlmICghKGFuY3VyID0gKGNoYW5vZGVfdCAqKSB4ZGxfbWFsbG9jKHNpemVvZihjaGFub2RlX3QpICsgY2hhLT5uc2l6ZSkpKSB7CisKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWFuY3VyLT5pY3VyciA9IDA7CisJCWFuY3VyLT5uZXh0ID0gTlVMTDsKKwkJaWYgKGNoYS0+dGFpbCkKKwkJCWNoYS0+dGFpbC0+bmV4dCA9IGFuY3VyOworCQlpZiAoIWNoYS0+aGVhZCkKKwkJCWNoYS0+aGVhZCA9IGFuY3VyOworCQljaGEtPnRhaWwgPSBhbmN1cjsKKwkJY2hhLT5hbmN1ciA9IGFuY3VyOworCX0KKworCWRhdGEgPSAoY2hhciAqKSBhbmN1ciArIHNpemVvZihjaGFub2RlX3QpICsgYW5jdXItPmljdXJyOworCWFuY3VyLT5pY3VyciArPSBjaGEtPmlzaXplOworCisJcmV0dXJuIGRhdGE7Cit9CisKKwordm9pZCAqeGRsX2NoYV9maXJzdChjaGFzdG9yZV90ICpjaGEpIHsKKwljaGFub2RlX3QgKnNuY3VyOworCisJaWYgKCEoY2hhLT5zbmN1ciA9IHNuY3VyID0gY2hhLT5oZWFkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwljaGEtPnNjdXJyID0gMDsKKworCXJldHVybiAoY2hhciAqKSBzbmN1ciArIHNpemVvZihjaGFub2RlX3QpICsgY2hhLT5zY3VycjsKK30KKworCit2b2lkICp4ZGxfY2hhX25leHQoY2hhc3RvcmVfdCAqY2hhKSB7CisJY2hhbm9kZV90ICpzbmN1cjsKKworCWlmICghKHNuY3VyID0gY2hhLT5zbmN1cikpCisJCXJldHVybiBOVUxMOworCWNoYS0+c2N1cnIgKz0gY2hhLT5pc2l6ZTsKKwlpZiAoY2hhLT5zY3VyciA9PSBzbmN1ci0+aWN1cnIpIHsKKwkJaWYgKCEoc25jdXIgPSBjaGEtPnNuY3VyID0gc25jdXItPm5leHQpKQorCQkJcmV0dXJuIE5VTEw7CisJCWNoYS0+c2N1cnIgPSAwOworCX0KKworCXJldHVybiAoY2hhciAqKSBzbmN1ciArIHNpemVvZihjaGFub2RlX3QpICsgY2hhLT5zY3VycjsKK30KKworCitsb25nIHhkbF9ndWVzc19saW5lcyhtbWZpbGVfdCAqbWYpIHsKKwlsb25nIG5sID0gMCwgc2l6ZSwgdHNpemUgPSAwOworCWNoYXIgY29uc3QgKmRhdGEsICpjdXIsICp0b3A7CisKKwlpZiAoKGN1ciA9IGRhdGEgPSB4ZGxfbW1maWxlX2ZpcnN0KG1mLCAmc2l6ZSkpICE9IE5VTEwpIHsKKwkJZm9yICh0b3AgPSBkYXRhICsgc2l6ZTsgbmwgPCBYRExfR1VFU1NfTkxJTkVTOykgeworCQkJaWYgKGN1ciA+PSB0b3ApIHsKKwkJCQl0c2l6ZSArPSAobG9uZykgKGN1ciAtIGRhdGEpOworCQkJCWlmICghKGN1ciA9IGRhdGEgPSB4ZGxfbW1maWxlX25leHQobWYsICZzaXplKSkpCisJCQkJCWJyZWFrOworCQkJCXRvcCA9IGRhdGEgKyBzaXplOworCQkJfQorCQkJbmwrKzsKKwkJCWlmICghKGN1ciA9IG1lbWNocihjdXIsICdcbicsIHRvcCAtIGN1cikpKQorCQkJCWN1ciA9IHRvcDsKKwkJCWVsc2UKKwkJCQljdXIrKzsKKwkJfQorCQl0c2l6ZSArPSAobG9uZykgKGN1ciAtIGRhdGEpOworCX0KKworCWlmIChubCAmJiB0c2l6ZSkKKwkJbmwgPSB4ZGxfbW1maWxlX3NpemUobWYpIC8gKHRzaXplIC8gbmwpOworCisJcmV0dXJuIG5sICsgMTsKK30KKworCit1bnNpZ25lZCBsb25nIHhkbF9oYXNoX3JlY29yZChjaGFyIGNvbnN0ICoqZGF0YSwgY2hhciBjb25zdCAqdG9wKSB7CisJdW5zaWduZWQgbG9uZyBoYSA9IDUzODE7CisJY2hhciBjb25zdCAqcHRyID0gKmRhdGE7CisKKwlmb3IgKDsgcHRyIDwgdG9wICYmICpwdHIgIT0gJ1xuJzsgcHRyKyspIHsKKwkJaGEgKz0gKGhhIDw8IDUpOworCQloYSBePSAodW5zaWduZWQgbG9uZykgKnB0cjsKKwl9CisJKmRhdGEgPSBwdHIgPCB0b3AgPyBwdHIgKyAxOiBwdHI7CisKKwlyZXR1cm4gaGE7Cit9CisKKwordW5zaWduZWQgaW50IHhkbF9oYXNoYml0cyh1bnNpZ25lZCBpbnQgc2l6ZSkgeworCXVuc2lnbmVkIGludCB2YWwgPSAxLCBiaXRzID0gMDsKKworCWZvciAoOyB2YWwgPCBzaXplICYmIGJpdHMgPCBDSEFSX0JJVCAqIHNpemVvZih1bnNpZ25lZCBpbnQpOyB2YWwgPDw9IDEsIGJpdHMrKyk7CisJcmV0dXJuIGJpdHMgPyBiaXRzOiAxOworfQorCisKK2ludCB4ZGxfbnVtX291dChjaGFyICpvdXQsIGxvbmcgdmFsKSB7CisJY2hhciAqcHRyLCAqc3RyID0gb3V0OworCWNoYXIgYnVmWzMyXTsKKworCXB0ciA9IGJ1ZiArIHNpemVvZihidWYpIC0gMTsKKwkqcHRyID0gJ1wwJzsKKwlpZiAodmFsIDwgMCkgeworCQkqLS1wdHIgPSAnLSc7CisJCXZhbCA9IC12YWw7CisJfQorCWZvciAoOyB2YWwgJiYgcHRyID4gYnVmOyB2YWwgLz0gMTApCisJCSotLXB0ciA9ICIwMTIzNDU2Nzg5Ilt2YWwgJSAxMF07CisJaWYgKCpwdHIpCisJCWZvciAoOyAqcHRyOyBwdHIrKywgc3RyKyspCisJCQkqc3RyID0gKnB0cjsKKwllbHNlCisJCSpzdHIrKyA9ICcwJzsKKwkqc3RyID0gJ1wwJzsKKworCXJldHVybiBzdHIgLSBvdXQ7Cit9CisKKworbG9uZyB4ZGxfYXRvbChjaGFyIGNvbnN0ICpzdHIsIGNoYXIgY29uc3QgKipuZXh0KSB7CisJbG9uZyB2YWwsIGJhc2U7CisJY2hhciBjb25zdCAqdG9wOworCisJZm9yICh0b3AgPSBzdHI7IFhETF9JU0RJR0lUKCp0b3ApOyB0b3ArKyk7CisJaWYgKG5leHQpCisJCSpuZXh0ID0gdG9wOworCWZvciAodmFsID0gMCwgYmFzZSA9IDEsIHRvcC0tOyB0b3AgPj0gc3RyOyB0b3AtLSwgYmFzZSAqPSAxMCkKKwkJdmFsICs9IGJhc2UgKiAobG9uZykoKnRvcCAtICcwJyk7CisJcmV0dXJuIHZhbDsKK30KKworCitpbnQgeGRsX2VtaXRfaHVua19oZHIobG9uZyBzMSwgbG9uZyBjMSwgbG9uZyBzMiwgbG9uZyBjMiwKKwkJICAgICAgY29uc3QgY2hhciAqZnVuYywgbG9uZyBmdW5jbGVuLCB4ZGVtaXRjYl90ICplY2IpIHsKKwlpbnQgbmIgPSAwOworCW1tYnVmZmVyX3QgbWI7CisJY2hhciBidWZbMTI4XTsKKworCW1lbWNweShidWYsICJAQCAtIiwgNCk7CisJbmIgKz0gNDsKKworCW5iICs9IHhkbF9udW1fb3V0KGJ1ZiArIG5iLCBjMSA/IHMxOiBzMSAtIDEpOworCisJaWYgKGMxICE9IDEpIHsKKwkJbWVtY3B5KGJ1ZiArIG5iLCAiLCIsIDEpOworCQluYiArPSAxOworCisJCW5iICs9IHhkbF9udW1fb3V0KGJ1ZiArIG5iLCBjMSk7CisJfQorCisJbWVtY3B5KGJ1ZiArIG5iLCAiICsiLCAyKTsKKwluYiArPSAyOworCisJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMyID8gczI6IHMyIC0gMSk7CisKKwlpZiAoYzIgIT0gMSkgeworCQltZW1jcHkoYnVmICsgbmIsICIsIiwgMSk7CisJCW5iICs9IDE7CisKKwkJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMyKTsKKwl9CisKKwltZW1jcHkoYnVmICsgbmIsICIgQEAiLCAzKTsKKwluYiArPSAzOworCWlmIChmdW5jICYmIGZ1bmNsZW4pIHsKKwkJYnVmW25iKytdID0gJyAnOworCQlpZiAoZnVuY2xlbiA+IHNpemVvZihidWYpIC0gbmIgLSAxKQorCQkJZnVuY2xlbiA9IHNpemVvZihidWYpIC0gbmIgLSAxOworCQltZW1jcHkoYnVmICsgbmIsIGZ1bmMsIGZ1bmNsZW4pOworCQluYiArPSBmdW5jbGVuOworCX0KKwlidWZbbmIrK10gPSAnXG4nOworCisJbWIucHRyID0gYnVmOworCW1iLnNpemUgPSBuYjsKKwlpZiAoZWNiLT5vdXRmKGVjYi0+cHJpdiwgJm1iLCAxKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94ZGlmZi94dXRpbHMuaCBiL3hkaWZmL3h1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzhlZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94dXRpbHMuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhVVElMU19IKQorI2RlZmluZSBYVVRJTFNfSAorCisKK2xvbmcgeGRsX2JvZ29zcXJ0KGxvbmcgbik7CitpbnQgeGRsX2VtaXRfZGlmZnJlYyhjaGFyIGNvbnN0ICpyZWMsIGxvbmcgc2l6ZSwgY2hhciBjb25zdCAqcHJlLCBsb25nIHBzaXplLAorCQkgICAgIHhkZW1pdGNiX3QgKmVjYik7CitpbnQgeGRsX2NoYV9pbml0KGNoYXN0b3JlX3QgKmNoYSwgbG9uZyBpc2l6ZSwgbG9uZyBpY291bnQpOwordm9pZCB4ZGxfY2hhX2ZyZWUoY2hhc3RvcmVfdCAqY2hhKTsKK3ZvaWQgKnhkbF9jaGFfYWxsb2MoY2hhc3RvcmVfdCAqY2hhKTsKK3ZvaWQgKnhkbF9jaGFfZmlyc3QoY2hhc3RvcmVfdCAqY2hhKTsKK3ZvaWQgKnhkbF9jaGFfbmV4dChjaGFzdG9yZV90ICpjaGEpOworbG9uZyB4ZGxfZ3Vlc3NfbGluZXMobW1maWxlX3QgKm1mKTsKK3Vuc2lnbmVkIGxvbmcgeGRsX2hhc2hfcmVjb3JkKGNoYXIgY29uc3QgKipkYXRhLCBjaGFyIGNvbnN0ICp0b3ApOwordW5zaWduZWQgaW50IHhkbF9oYXNoYml0cyh1bnNpZ25lZCBpbnQgc2l6ZSk7CitpbnQgeGRsX251bV9vdXQoY2hhciAqb3V0LCBsb25nIHZhbCk7Citsb25nIHhkbF9hdG9sKGNoYXIgY29uc3QgKnN0ciwgY2hhciBjb25zdCAqKm5leHQpOworaW50IHhkbF9lbWl0X2h1bmtfaGRyKGxvbmcgczEsIGxvbmcgYzEsIGxvbmcgczIsIGxvbmcgYzIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsIGxvbmcgZnVuY2xlbiwgeGRlbWl0Y2JfdCAqZWNiKTsKKworCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWFVUSUxTX0gpICovCisK